@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":"Meter-VXI75VNe.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Meter.module.css","../../../../../../src/web-ui/components/primitives/Meter.tsx"],"sourcesContent":[".wrap {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.lineWrap {\n width: 100%;\n}\n\n.head {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.label {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.value {\n flex: none;\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-xs-size);\n letter-spacing: var(--tracking-display);\n color: var(--text-secondary);\n}\n\n.unknown {\n font-family: var(--font-ui);\n font-style: italic;\n color: var(--status-unknown-fg);\n}\n\n.track {\n width: 100%;\n overflow: hidden;\n background: var(--bg-active);\n}\n\n.bar {\n height: 4px;\n border-radius: var(--radius-full);\n}\n\n/* The 2px rule that sits under a header strip — square, full-bleed. */\n.line {\n height: 2px;\n border-radius: 0;\n background: var(--border-subtle);\n}\n\n.fill {\n height: 100%;\n transition: width var(--duration-base) var(--ease-standard);\n}\n\n.accent {\n background: var(--accent-500);\n}\n.neutral {\n background: var(--status-neutral-solid);\n}\n.running {\n background: var(--status-running-solid);\n}\n.warning {\n background: var(--status-warning-solid);\n}\n.danger {\n background: var(--status-danger-solid);\n}\n.engine {\n background: var(--status-neutral-solid);\n}\n","/**\n * components/primitives/Meter.tsx — occupancy against a limit: context\n * window, daily spend against the cap, a plan's usage window.\n *\n * Two forms, one component:\n * variant=\"line\" the 2px full-width rule the design language puts\n * directly under a header strip. No text of its own —\n * wrap it in <Tooltip> and put the numbers beside it.\n * variant=\"labelled\" a 4px bar with a label and a right-aligned\n * \"18k / 66k\" in the display face.\n *\n * Tone thresholds match the V1 context meter (amber >= 70%, danger >= 90%)\n * and are ALWAYS paired with the readable value, never color alone.\n * An unknown limit renders an honest empty track and the text \"unknown\" —\n * never a full bar, never zero (DESIGN.md §7).\n */\nimport type { ReactNode } from 'react';\nimport { usedPercentText } from '../../routes/verse/percent-text.js';\nimport styles from './Meter.module.css';\n\nexport type MeterTone = 'accent' | 'neutral' | 'running' | 'warning' | 'danger' | 'engine';\n\nexport interface MeterProps {\n /** Current value. null = genuinely unknown. */\n value: number | null;\n /** Limit. null/0 = unknown limit; the meter says so instead of guessing. */\n max: number | null;\n variant?: 'line' | 'labelled';\n label?: ReactNode;\n /** Right-aligned readout. Defaults to `value / max` formatted compactly. */\n valueText?: ReactNode;\n /** Force a tone; by default it is derived from the percentage. */\n tone?: MeterTone;\n /** For tone=\"engine\": the CSS color to paint the fill (an --engine-* var). */\n engineColor?: string;\n /** Accessible name when no visible label is rendered (the line variant). */\n 'aria-label'?: string;\n className?: string;\n}\n\nfunction compact(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(n >= 10_000_000 ? 0 : 1)}m`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(n >= 10_000 ? 0 : 1)}k`;\n return String(Math.round(n));\n}\n\nexport function toneForPercent(percent: number): MeterTone {\n if (percent >= 90) return 'danger';\n if (percent >= 70) return 'warning';\n return 'accent';\n}\n\nexport function Meter({\n value,\n max,\n variant = 'labelled',\n label,\n valueText,\n tone,\n engineColor,\n className,\n ...aria\n}: MeterProps) {\n const known = value !== null && Number.isFinite(value) && max !== null && Number.isFinite(max) && max > 0;\n const percent = known ? Math.min(100, Math.max(0, (value! / max!) * 100)) : 0;\n const resolvedTone = tone ?? (known ? toneForPercent(percent) : 'neutral');\n const readout = known ? (valueText ?? `${compact(value!)} / ${compact(max!)}`) : (valueText ?? 'unknown');\n\n const track = (\n <div\n className={`${styles.track} ${variant === 'line' ? styles.line : styles.bar}`}\n role=\"meter\"\n aria-valuenow={known ? Math.round(percent) : undefined}\n aria-valuemin={0}\n aria-valuemax={100}\n // The spoken value follows the one percent rule: a 99.6% meter must not\n // announce \"100%\" (spent) nor a 0.3% one \"0%\" (untouched). aria-valuenow\n // stays the plain numeric reading, as ARIA requires a number there.\n aria-valuetext={known ? usedPercentText(percent) : 'unknown'}\n {...aria}\n >\n <div\n className={`${styles.fill} ${styles[resolvedTone]}`}\n style={{\n width: `${percent}%`,\n ...(resolvedTone === 'engine' && engineColor ? { background: engineColor } : {}),\n }}\n />\n </div>\n );\n\n if (variant === 'line') return <div className={`${styles.lineWrap} ${className ?? ''}`}>{track}</div>;\n\n return (\n <div className={`${styles.wrap} ${className ?? ''}`}>\n {label || readout ? (\n <div className={styles.head}>\n {label ? <span className={styles.label}>{label}</span> : <span />}\n <span className={`${styles.value} ${known ? '' : styles.unknown}`}>{readout}</span>\n </div>\n ) : null}\n {track}\n </div>\n );\n}\n"],"mappings":"6eCwCA,SAAS,EAAQ,EAAmB,CAGlC,OAFI,GAAK,IAAkB,IAAI,EAAI,IAAA,CAAW,QAAQ,GAAK,IAAa,EAAI,CAAC,EAAE,GAC3E,GAAK,IAAc,IAAI,EAAI,IAAA,CAAO,QAAQ,GAAK,IAAS,EAAI,CAAC,EAAE,GAC5D,OAAO,KAAK,MAAM,CAAC,CAAC,CAC7B,CAEA,SAAgB,EAAe,EAA4B,CAGzD,OAFI,GAAW,GAAW,SACtB,GAAW,GAAW,UACnB,QACT,CAEA,SAAgB,EAAM,CACpB,QACA,MACA,UAAU,WACV,QACA,YACA,OACA,cACA,YACA,GAAG,GACU,CACb,IAAM,EAAQ,IAAU,MAAQ,OAAO,SAAS,CAAK,GAAK,IAAQ,MAAQ,OAAO,SAAS,CAAG,GAAK,EAAM,EAClG,EAAU,EAAQ,KAAK,IAAI,IAAK,KAAK,IAAI,EAAI,EAAS,EAAQ,GAAG,CAAC,EAAI,EACtE,EAAe,IAAS,EAAQ,EAAe,CAAO,EAAI,WAC1D,EAAU,EAAS,GAAa,GAAG,EAAQ,CAAM,EAAE,KAAK,EAAQ,CAAI,IAAQ,GAAa,UAEzF,GACJ,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,UAAW,GAAG,EAAO,MAAM,GAAG,IAAY,OAAS,EAAO,KAAO,EAAO,MACxE,KAAK,QACL,gBAAe,EAAQ,KAAK,MAAM,CAAO,EAAI,IAAA,GAC7C,gBAAe,EACf,gBAAe,IAIf,iBAAgB,EAAQ,EAAgB,CAAO,EAAI,UACnD,GAAI,EAEJ,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,UAAW,GAAG,EAAO,KAAK,GAAG,EAAO,KACpC,MAAO,CACL,MAAO,GAAG,EAAQ,GAClB,GAAI,IAAiB,UAAY,EAAc,CAAE,WAAY,CAAY,EAAI,CAAC,CAChF,CACD,CAAA,CACE,CAAA,EAKP,OAFI,IAAY,QAAe,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,SAAS,GAAG,GAAa,KAAO,SAAA,CAAW,CAAA,GAGlG,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,KAAK,GAAG,GAAa,KAA/C,SAAA,CACG,GAAS,GACR,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAO,CAAA,GAChE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,EAAQ,GAAK,EAAO,UAAY,SAAA,CAAc,CAAA,CAC/E,CACH,CAAA,EAAA,KACH,CACE,GAET"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{l as r,s as i}from"./VerseMobileApp-ePNuVERe.js";import{n as a,t as o}from"./web-speech-q3gDv2ax.js";import{t as s}from"./parts.module-CBkHcD6w.js";var c=e(n(),1),l=t(),u=`Tap the microphone on your keyboard to dictate into this box.`,d=`Browser dictation may send audio to your browser’s speech service. Tap again to start.`;function f({onInterim:e,onFinal:t,disabled:n=!1,size:f=`inline`}){let p=o()!==null,[m,h]=(0,c.useState)(!1),[g,_]=(0,c.useState)(!1),[v,y]=(0,c.useState)(!1),[b,x]=(0,c.useState)(p?null:u),S=(0,c.useRef)(null),C=(0,c.useRef)({onInterim:e,onFinal:t});C.current={onInterim:e,onFinal:t};let w=()=>{if(!p||S.current)return;let e=a({onPartial:e=>C.current.onInterim(e),onFinal:e=>C.current.onFinal(e),onError:(e,t)=>{e!==`no-speech`&&x(`${t} ${u}`)},onEnd:()=>{S.current=null,h(!1),_(!1),C.current.onInterim(``)}});e&&(S.current=e,x(null),h(!0))},T=()=>{S.current&&!g&&(_(!0),S.current.stop())};return(0,c.useEffect)(()=>()=>{let e=S.current;S.current=null,e?.cancel()},[]),(0,l.jsxs)(`span`,{className:s.micWrap,"data-size":f,children:[(0,l.jsxs)(`button`,{type:`button`,className:`${i.btn} ${s.mic}`,"data-size":f,"data-live":m?``:void 0,disabled:!p||g||n&&!m,"aria-pressed":p?m:void 0,"aria-label":p?m?`Stop dictation`:v?`Dictate`:`Review browser dictation`:`Dictation unavailable in this browser`,onClick:()=>{if(m)return T();if(!v){y(!0),x(d);return}w()},children:[(0,l.jsx)(r,{size:f===`large`?30:20}),f===`large`?(0,l.jsx)(`span`,{children:g?`Finishing…`:m?`Listening… tap to stop`:v?`Tap to talk`:`Browser dictation`}):null]}),m&&f===`inline`?(0,l.jsx)(`span`,{className:s.micNote,"data-size":f,role:`status`,children:g?`Finishing…`:`Listening… tap to stop`}):null,!m&&b?(0,l.jsx)(`span`,{className:s.micNote,"data-size":f,role:`status`,children:b}):null]})}export{f as t};
|
|
2
|
+
//# sourceMappingURL=MicButton-DORAXsUU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MicButton-DORAXsUU.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/MicButton.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/MicButton.tsx — the phone's big dictation button.\n *\n * Web Speech API (`SpeechRecognition` / Safari's `webkitSpeechRecognition`)\n * where the browser has one: tap to talk, interim words stream into the box,\n * tap again (or finish speaking) to stop. Where it has none — or refuses the\n * microphone — the button says so and points at the keyboard's own dictation\n * key, which types straight into the same box, so nothing is lost.\n *\n * Use the workbench's Web Speech engine: it keeps the final result until the\n * recognizer ends, including when a tap to stop produces the last phrase.\n * The phone's small status bubble is its VoiceHud; the desktop VoiceHud is\n * tied to native capture and workbench targets and is not mounted here.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { getSpeechRecognition, startWebSpeech, type WebSpeechSession } from '../voice/web-speech.js';\nimport { MicGlyph } from './mobile-icons.js';\nimport styles from './parts.module.css';\nimport core from './ui.module.css';\n\nexport const KEYBOARD_DICTATION_HINT = 'Tap the microphone on your keyboard to dictate into this box.';\nexport const BROWSER_SPEECH_DISCLOSURE = 'Browser dictation may send audio to your browser’s speech service. Tap again to start.';\n\nexport interface MicButtonProps {\n /** Words still being heard (replace, don't append). '' when none. */\n onInterim: (text: string) => void;\n /** A finished phrase: append it. */\n onFinal: (text: string) => void;\n disabled?: boolean;\n /** 'large' for New agent's prompt, 'inline' beside a composer. */\n size?: 'large' | 'inline';\n}\n\nexport function MicButton({ onInterim, onFinal, disabled = false, size = 'inline' }: MicButtonProps) {\n const available = getSpeechRecognition() !== null;\n const [listening, setListening] = useState(false);\n const [stopping, setStopping] = useState(false);\n const [acknowledged, setAcknowledged] = useState(false);\n const [note, setNote] = useState<string | null>(available ? null : KEYBOARD_DICTATION_HINT);\n const active = useRef<WebSpeechSession | null>(null);\n const cb = useRef({ onInterim, onFinal });\n cb.current = { onInterim, onFinal };\n\n const start = () => {\n if (!available || active.current) return;\n const session = startWebSpeech({\n onPartial: (text) => cb.current.onInterim(text),\n onFinal: (text) => cb.current.onFinal(text),\n onError: (code, message) => {\n if (code !== 'no-speech') setNote(`${message} ${KEYBOARD_DICTATION_HINT}`);\n },\n onEnd: () => {\n active.current = null;\n setListening(false);\n setStopping(false);\n cb.current.onInterim('');\n },\n });\n if (!session) return;\n active.current = session;\n setNote(null);\n setListening(true);\n };\n\n const stop = () => {\n if (!active.current || stopping) return;\n setStopping(true);\n // Keep callbacks attached: some browsers deliver the last final only\n // between stop() and onend.\n active.current.stop();\n };\n\n const toggle = () => {\n if (listening) return stop();\n // The Web Speech API's audio processing is browser-dependent. Show the\n // disclosure before the first capture, while the mic is still off.\n if (!acknowledged) {\n setAcknowledged(true);\n setNote(BROWSER_SPEECH_DISCLOSURE);\n return;\n }\n start();\n };\n\n useEffect(() => () => {\n const session = active.current;\n active.current = null;\n session?.cancel();\n }, []);\n\n return (\n <span className={styles.micWrap} data-size={size}>\n <button\n type=\"button\"\n className={`${core.btn} ${styles.mic}`}\n data-size={size}\n data-live={listening ? '' : undefined}\n disabled={!available || stopping || (disabled && !listening)}\n aria-pressed={available ? listening : undefined}\n aria-label={!available ? 'Dictation unavailable in this browser' : listening ? 'Stop dictation' : acknowledged ? 'Dictate' : 'Review browser dictation'}\n onClick={toggle}\n >\n <MicGlyph size={size === 'large' ? 30 : 20} />\n {size === 'large' ? <span>{stopping ? 'Finishing…' : listening ? 'Listening… tap to stop' : acknowledged ? 'Tap to talk' : 'Browser dictation'}</span> : null}\n </button>\n {listening && size === 'inline' ? <span className={styles.micNote} data-size={size} role=\"status\">{stopping ? 'Finishing…' : 'Listening… tap to stop'}</span> : null}\n {!listening && note ? <span className={styles.micNote} data-size={size} role=\"status\">{note}</span> : null}\n </span>\n );\n}\n"],"mappings":"kRAoBa,EAA0B,gEAC1B,EAA4B,yFAYzC,SAAgB,EAAU,CAAE,YAAW,UAAS,WAAW,GAAO,OAAO,UAA4B,CACnG,IAAM,EAAY,EAAqB,IAAM,KACvC,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAAS,EAAK,EAC1C,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAS,EAAK,EACxC,CAAC,EAAc,IAAA,EAAmB,EAAA,SAAA,CAAS,EAAK,EAChD,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAwB,EAAY,KAAO,CAAuB,EACpF,GAAA,EAAS,EAAA,OAAA,CAAgC,IAAI,EAC7C,GAAA,EAAK,EAAA,OAAA,CAAO,CAAE,YAAW,SAAQ,CAAC,EACxC,EAAG,QAAU,CAAE,YAAW,SAAQ,EAElC,IAAM,MAAc,CAClB,GAAI,CAAC,GAAa,EAAO,QAAS,OAClC,IAAM,EAAU,EAAe,CAC7B,UAAY,GAAS,EAAG,QAAQ,UAAU,CAAI,EAC9C,QAAU,GAAS,EAAG,QAAQ,QAAQ,CAAI,EAC1C,SAAU,EAAM,IAAY,CACtB,IAAS,aAAa,EAAQ,GAAG,EAAQ,GAAG,GAAyB,CAC3E,EACA,UAAa,CACX,EAAO,QAAU,KACjB,EAAa,EAAK,EAClB,EAAY,EAAK,EACjB,EAAG,QAAQ,UAAU,EAAE,CACzB,CACF,CAAC,EACI,IACL,EAAO,QAAU,EACjB,EAAQ,IAAI,EACZ,EAAa,EAAI,EACnB,EAEM,MAAa,CACZ,EAAO,SAAW,KACvB,EAAY,EAAI,EAGhB,EAAO,QAAQ,KAAK,EACtB,EAoBA,OANA,EAAA,EAAA,UAAA,SAAsB,CACpB,IAAM,EAAU,EAAO,QACvB,EAAO,QAAU,KACjB,GAAS,OAAO,CAClB,EAAG,CAAC,CAAC,GAGH,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,YAAW,EAA5C,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAW,GAAG,EAAK,IAAI,GAAG,EAAO,MACjC,YAAW,EACX,YAAW,EAAY,GAAK,IAAA,GAC5B,SAAU,CAAC,GAAa,GAAa,GAAY,CAAC,EAClD,eAAc,EAAY,EAAY,IAAA,GACtC,aAAa,EAAsD,EAAY,iBAAmB,EAAe,UAAY,2BAApG,wCACzB,YA5Be,CACnB,GAAI,EAAW,OAAO,EAAK,EAG3B,GAAI,CAAC,EAAc,CACjB,EAAgB,EAAI,EACpB,EAAQ,CAAyB,EACjC,MACF,CACA,EAAM,CACR,EAUI,SAAA,EAUE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,IAAS,QAAU,GAAK,EAAK,CAAA,EAC5C,IAAS,SAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAW,aAAe,EAAY,yBAA2B,EAAe,cAAgB,mBAA0B,CAAA,EAAI,IACnJ,IACP,GAAa,IAAS,UAAW,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,YAAW,EAAM,KAAK,SAAU,SAAA,EAAW,aAAe,wBAA+B,CAAA,EAAI,KAC/J,CAAC,GAAa,GAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,YAAW,EAAM,KAAK,SAAU,SAAA,CAAW,CAAA,EAAI,IAClG,GAEV"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LeaderConversation-CiWqhsoa.js","assets/insert-text-BnF_Gm4r.js","assets/MessageMarkdown-CS0mAtSs.js","assets/Transcript.module-DD0MFIIy.js","assets/global-1SED_aTT.css","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/Transcript-DZ96MnR7.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/SkipToContent-c02H5dmz.css","assets/VerseConsoleApp-BmckthwC.css","assets/Button-DrnKsvnQ.css","assets/actions-BbbnyQzG.css","assets/Surface-e1z6GdZt.css","assets/LeaderCard-DNsbLwY3.css","assets/LeaderConversation-DsvkL0lA.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n,t as r}from"./index-BC5Uslm5.js";import{l as i,u as a}from"./global-w7KDTTi0.js";import{t as o}from"./RefreshIndicator-D96C9qiH.js";import{t as s}from"./AreaTrend-LVgaB49b.js";import{n as c,t as l}from"./MatrixHeatmap-BlFI5oao.js";import{gt as u}from"./VerseConsoleApp-DjPpZLo1.js";import{T as ee,j as te}from"./VerseShared-Bf-XTHCh.js";import{n as d}from"./verse-bootstrap-query-B3vFD9XK.js";import{n as f,u as p}from"./format-V6IiIMAL.js";import{r as m,t as h}from"./AutonomyOffState-nO9lIcCv.js";import{c as g,h as _,p as v}from"./surface-data-hufdOfpz.js";import{t as y}from"./nav-CUXtg-Iw.js";import{a as ne,i as b,n as x,r as S,t as C}from"./Surface-DVOAKl2g.js";import{n as w,t as T}from"./actions-Dg6UJTLn.js";import{i as E,l as D,o as O,s as re,t as k}from"./leader-model-CYyfrzNf.js";import{t as A}from"./LeaderCard-Dhq-w_Mf.js";import{a as ie,c as j,i as ae,l as M,n as N,r as P,s as F,t as I,u as L}from"./mind.module-rVKz51LB.js";var R=e(n(),1),z=t(),B={hit:`✓`,miss:`✗`,pending:`…`,ungraded:`—`};function V(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleDateString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`}):`—`}function H({read:e,actions:t}){let n=e?.value??null,r=n?.timeline??[],i=n?.latest?.id??null,a=n?.latest?.actions.some(e=>O(n.actions.find(t=>t.id===e.id)??e))??!1;return(0,z.jsx)(C,{title:`Memos`,caption:n?`${r.length} in view · each move graded 7 days later`:void 0,children:e?n?r.length===0?(0,z.jsx)(x,{children:f(`No memos yet${n.lastRun?` — last run: ${n.lastRun.reason??n.lastRun.outcome}`:``}`)}):(0,z.jsx)(`ol`,{className:I.timeline,children:r.map(e=>{let n=D(e),r=E(e.expectedDelta);return(0,z.jsxs)(`li`,{className:I.memo,"data-outcome":n,id:y(`memo-${e.id}`),children:[(0,z.jsx)(`span`,{className:I.memoDay,children:V(e.at)}),(0,z.jsx)(`span`,{className:I.mark,"data-outcome":n,"aria-hidden":`true`,children:B[n]}),(0,z.jsxs)(`div`,{className:I.memoBody,children:[(0,z.jsx)(`span`,{className:I.memoMove,children:e.move??(e.status===`ok`?`No move`:`No memo (${e.status.replace(/-/g,` `)})`)}),e.bottleneck?(0,z.jsxs)(`span`,{className:I.memoWhy,children:[`Bottleneck: `,e.bottleneck]}):null,(0,z.jsxs)(`span`,{className:I.memoMeta,children:[r?`Expected ${r}`:`No expected delta`,` · `,(0,z.jsx)(`span`,{"data-outcome":n,children:n===`hit`||n===`miss`?`${k[n]} (actual ${e.outcome?.actualDelta===null||e.outcome?.actualDelta===void 0?`—`:`${e.outcome.actualDelta>=0?`+`:``}${e.outcome.actualDelta}`})`:k[n]}),` · ${e.actionCount} action${e.actionCount===1?``:`s`}`]})]}),e.id===i&&a?(0,z.jsx)(`button`,{type:`button`,className:I.veto,"aria-label":`Veto the memo of ${V(e.at)}`,disabled:t.busy||t.readOnly,onClick:()=>t.act(()=>v({action:`veto-memo`,memoId:e.id}),`Veto the whole memo`,{confirm:{title:`Veto this memo?`,body:`Every applied action is undone exactly and every scheduled one is cancelled. The Leader records the veto.`,confirmLabel:`Veto memo`,destructive:!0}}),children:`Veto`}):null]},e.id)})}):(0,z.jsx)(x,{tone:`unknown`,children:e.reason??`The Leader did not answer.`}):(0,z.jsx)(`p`,{className:I.muted,"aria-busy":`true`,children:`Reading the Leader…`})})}function U({read:e}){let t=e?.value??null,n=t?.hitRate??null,r=(t?.standards??[]).filter(e=>e.retiredAt===null);return(0,z.jsxs)(`div`,{className:I.stack,children:[(0,z.jsx)(c,{title:`Leader hit rate`,description:n?`${n.hits} of ${n.graded} graded moves · ${n.windowDays} days`:void 0,status:e?t?void 0:{kind:`unknown`,reason:e.reason??`the Leader did not answer.`}:{kind:`loading`},value:n?.rate??null,showState:!1,caption:n&&n.rate===null?`nothing graded yet — moves are graded after 7 days`:void 0,size:180}),(0,z.jsx)(C,{title:`Standards`,caption:t?`${r.length} in force`:void 0,children:t?r.length===0?(0,z.jsx)(x,{children:`No standards yet.`}):(0,z.jsx)(`ul`,{className:I.standards,children:r.map(e=>(0,z.jsxs)(`li`,{children:[(0,z.jsx)(`span`,{className:I.standardRule,children:e.rule}),(0,z.jsxs)(`span`,{className:I.standardMeta,children:[e.appliesTo,` · `,e.source===`mason`?`yours`:`Leader`,` · `,p(e.addedAt)]})]},e.id))}):(0,z.jsx)(x,{tone:`unknown`,children:e?.reason??`The Leader did not answer.`})})]})}var W={high:`High`,warn:`Worth a look`,info:`FYI`};function G({place:e}){return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`span`,{className:I.insightPlace,title:e.full,children:e.label}),e.scratch?(0,z.jsx)(`span`,{className:I.scratchTag,title:`A scratch folder under the system temp directory`,children:`scratch`}):null]})}function K({insights:e,reason:t,loading:n=!1,places:r,empty:i}){return n?(0,z.jsx)(`p`,{className:I.muted,"aria-busy":`true`,children:`Reading the reasoning digest…`}):t===null?e.length===0?(0,z.jsx)(x,{children:i??`No loops, repeated failures or verification gaps in the last 30 days.`}):(0,z.jsx)(`ul`,{className:I.insights,"aria-label":`Reasoning insights`,children:e.map(e=>{let t=e.repo?r?.get(e.repo)??j(e.repo):null,n=p(e.lastAt),i=[e.engine,`${e.count}×`,n===`—`?null:`last seen ${n}`].filter(Boolean).join(` · `);return(0,z.jsxs)(`li`,{className:I.insight,"data-severity":e.severity,children:[(0,z.jsxs)(`span`,{className:I.insightKind,children:[(0,z.jsx)(b,{children:N[e.kind]}),(0,z.jsx)(`span`,{className:I.insightSeverity,"data-severity":e.severity,children:W[e.severity]})]}),(0,z.jsx)(`span`,{className:I.insightTitle,children:e.title}),(0,z.jsxs)(`span`,{className:I.insightMeta,children:[t?(0,z.jsx)(G,{place:t}):null,t&&i?` · `:null,i]})]},e.id)})}):(0,z.jsx)(x,{tone:`unknown`,children:t})}function q({read:e,actions:t}){let n=e?.value??null,r=n?.actions??[];return(0,z.jsx)(C,{title:`Action log`,caption:n?`Newest first · Veto runs the recorded inverse`:void 0,children:e?n?r.length===0?(0,z.jsx)(x,{children:`The Leader has not acted yet.`}):(0,z.jsx)(`ul`,{className:I.log,"aria-label":`Leader actions`,children:r.map(e=>(0,z.jsx)(A,{action:e,actions:t},e.id))}):(0,z.jsx)(x,{tone:`unknown`,children:e.reason??`The Leader did not answer.`}):(0,z.jsx)(`p`,{className:I.muted,"aria-busy":`true`,children:`Reading the action log…`})})}var oe=(0,R.lazy)(()=>r(()=>import(`./LeaderConversation-CiWqhsoa.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]))),J=6e4;function se(e,t){return t?e?`${e} ${t.title}.`:`${t.title}. ${t.why}`:e}var Y=3e5;function X(){let{compact:e}=u(),t=i(g),n=i(_,{freshMs:6e4}),r=a(g),c=a(_);te(()=>{r(),c()},J);let f=w(),p=(0,R.useId)(),v=i(d,{freshMs:Y}),b=i(ee,{freshMs:Y}),x=n.data?.value??null,E=(0,R.useMemo)(()=>ae(x),[x]),D=(0,R.useMemo)(()=>L(b.data?.workspaces,v.data?.projects),[b.data,v.data]),O=(0,R.useMemo)(()=>M(x?x.insights.flatMap(e=>e.repo?[e.repo]:[]):[],D),[x,D]),k=e=>{let t=O.get(e);return t?`${t.label}${t.scratch?` · scratch`:``}`:e},[A,j]=(0,R.useState)(null),N=A!==null&&E.includes(A)?A:null,B=(0,R.useMemo)(()=>P(x,N),[x,N]),V=F(x),W=ie(x),G=(e,t)=>n.data?x?e?{kind:`ready`}:{kind:`empty`,message:t}:{kind:`unknown`,reason:n.data.reason??`the reasoning digest did not answer.`}:{kind:`loading`},X=x?x.totals.steps>0:!1,Z=m(),Q=re(t.data?.value??null),$=x!==null&&!X&&V.length===0;return(0,z.jsxs)(ne,{title:`Mind`,actions:[t,n].some(e=>e.status===`refreshing`)?(0,z.jsx)(o,{}):null,lead:(0,z.jsx)(T,{actions:f}),children:[(0,z.jsx)(S,{span:12,children:(0,z.jsx)(`div`,{id:y(`leader-conversation`),children:(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(`p`,{className:I.muted,"aria-busy":`true`,children:`Opening the conversation…`}),children:(0,z.jsx)(oe,{leader:t.data,actions:f,dormant:!!Z})})})}),Q?(0,z.jsx)(S,{span:12,children:(0,z.jsx)(h,{state:Z??null,here:`mind`,title:Q.title,why:se(Q.why,Z??null)})}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(S,{span:8,children:(0,z.jsx)(H,{read:t.data,actions:f})}),(0,z.jsx)(S,{span:4,children:(0,z.jsx)(U,{read:t.data})})]}),Q&&$?null:(0,z.jsx)(S,{span:12,children:(0,z.jsx)(C,{title:`What the reasoning shows`,caption:x?`Last 30 days · ${x.totals.steps.toLocaleString(`en-US`)} reasoning steps across ${x.totals.sessions} sessions`:void 0,children:(0,z.jsx)(`div`,{id:y(`insights`),children:(0,z.jsx)(K,{insights:V,places:O,loading:!n.data,reason:!n.data||x?null:n.data.reason??`The reasoning digest did not answer.`,empty:$?`No reasoning recorded in the last 30 days.`:void 0})})})}),$?null:(0,z.jsx)(S,{span:8,children:(0,z.jsx)(l,{title:`Insights by kind and engine`,description:N?`In ${k(N)}`:`All repos · 30 days`,status:G(X&&B.columns.length>0,`No reasoning was recorded in the last 30 days.`),rows:B.rows,columns:B.columns,values:B.values,unit:`insights`,defaultView:e?`table`:`chart`,actions:E.length>1?(0,z.jsxs)(`label`,{className:I.facet,htmlFor:p,children:[`Repo`,(0,z.jsxs)(`select`,{id:p,value:N??``,onChange:e=>j(e.target.value||null),children:[(0,z.jsx)(`option`,{value:``,children:`All`}),E.map(e=>(0,z.jsx)(`option`,{value:e,title:e,children:k(e)},e))]})]}):null})}),$?null:(0,z.jsx)(S,{span:4,children:(0,z.jsx)(s,{title:`Struggles and wins`,description:`Per day · days with no reasoning are gaps`,status:G(X,`No reasoning was recorded in the last 30 days.`),series:W,height:200})}),Q?null:(0,z.jsx)(S,{span:12,children:(0,z.jsx)(q,{read:t.data,actions:f})}),f.dialogs]})}export{J as MIND_POLL_MS,X as MindSection};
|
|
3
|
+
//# sourceMappingURL=MindSection-DZLHz29Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/mind/MindCards.tsx","../../../../../../src/web-ui/routes/verse/sections/MindSection.tsx"],"sourcesContent":["/**\n * routes/verse/mind/MindCards.tsx — Mind's cards (SPEC-310B §6, SPEC-310C §5;\n * unit C7): the memo timeline with each move's 7-day outcome ✓/✗ and Veto,\n * the hit-rate gauge with the standards, three A7 insight cards and the\n * action log. Everything the Leader or A7 wrote is untrusted text: rendered\n * as plain text, never as markdown or a link.\n */\nimport type { ReasoningInsight } from '../../../../core/reasoning/types.js';\nimport type { LeaderAction, LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport { Gauge } from '../../../components/charts/Gauge.js';\nimport { UNKNOWN, asSentence, formatRelative } from '../autonomy/format.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { ActionRow } from '../command/LeaderCard.js';\nimport { anchorId } from '../command/nav.js';\nimport { Card, CardNote, MicroLabel } from '../command/Surface.js';\nimport { postLeader, type OptionalRead } from '../command/surface-data.js';\nimport { KIND_LABEL } from './mind-model.js';\nimport { OUTCOME_WORD, expectedDeltaText, isVetoable, outcomeMark } from './leader-model.js';\nimport { projectLabel, type ProjectLabel } from './project-label.js';\nimport styles from './mind.module.css';\n\nconst MARK: Record<ReturnType<typeof outcomeMark>, string> = { hit: '✓', miss: '✗', pending: '…', ungraded: '—' };\n\nfunction dayHeading(iso: string): string {\n const t = Date.parse(iso);\n return Number.isFinite(t) ? new Date(t).toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' }) : '—';\n}\n\nexport function MemoTimeline({ read, actions }: { read: OptionalRead<LeaderStateV1> | undefined; actions: SurfaceActions }) {\n const state = read?.value ?? null;\n const memos = state?.timeline ?? [];\n const latestId = state?.latest?.id ?? null;\n const latestVetoable = state?.latest?.actions.some((a) => isVetoable(state.actions.find((x) => x.id === a.id) ?? a)) ?? false;\n return (\n <Card title=\"Memos\" caption={state ? `${memos.length} in view · each move graded 7 days later` : undefined}>\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the Leader…</p>\n ) : !state ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The Leader did not answer.'}</CardNote>\n ) : memos.length === 0 ? (\n <CardNote>{asSentence(`No memos yet${state.lastRun ? ` — last run: ${state.lastRun.reason ?? state.lastRun.outcome}` : ''}`)}</CardNote>\n ) : (\n <ol className={styles.timeline}>\n {memos.map((m) => {\n const mark = outcomeMark(m);\n const delta = expectedDeltaText(m.expectedDelta);\n return (\n <li key={m.id} className={styles.memo} data-outcome={mark} id={anchorId(`memo-${m.id}`)}>\n <span className={styles.memoDay}>{dayHeading(m.at)}</span>\n <span className={styles.mark} data-outcome={mark} aria-hidden=\"true\">{MARK[mark]}</span>\n <div className={styles.memoBody}>\n <span className={styles.memoMove}>{m.move ?? (m.status === 'ok' ? 'No move' : `No memo (${m.status.replace(/-/g, ' ')})`)}</span>\n {m.bottleneck ? <span className={styles.memoWhy}>Bottleneck: {m.bottleneck}</span> : null}\n <span className={styles.memoMeta}>\n {delta ? `Expected ${delta}` : 'No expected delta'}\n {' · '}\n <span data-outcome={mark}>\n {mark === 'hit' || mark === 'miss'\n ? `${OUTCOME_WORD[mark]} (actual ${m.outcome?.actualDelta === null || m.outcome?.actualDelta === undefined ? '—' : `${m.outcome.actualDelta >= 0 ? '+' : ''}${m.outcome.actualDelta}`})`\n : OUTCOME_WORD[mark]}\n </span>\n {` · ${m.actionCount} action${m.actionCount === 1 ? '' : 's'}`}\n </span>\n </div>\n {m.id === latestId && latestVetoable ? (\n <button\n type=\"button\"\n className={styles.veto}\n aria-label={`Veto the memo of ${dayHeading(m.at)}`}\n disabled={actions.busy || actions.readOnly}\n onClick={() =>\n actions.act(() => postLeader({ action: 'veto-memo', memoId: m.id }), 'Veto the whole memo', {\n confirm: {\n title: 'Veto this memo?',\n body: 'Every applied action is undone exactly and every scheduled one is cancelled. The Leader records the veto.',\n confirmLabel: 'Veto memo',\n destructive: true,\n },\n })\n }\n >\n Veto\n </button>\n ) : null}\n </li>\n );\n })}\n </ol>\n )}\n </Card>\n );\n}\n\nexport function HitRateCard({ read }: { read: OptionalRead<LeaderStateV1> | undefined }) {\n const state = read?.value ?? null;\n const hr = state?.hitRate ?? null;\n const standards = (state?.standards ?? []).filter((s) => s.retiredAt === null);\n return (\n <div className={styles.stack}>\n <Gauge\n title=\"Leader hit rate\"\n description={hr ? `${hr.hits} of ${hr.graded} graded moves · ${hr.windowDays} days` : undefined}\n status={!read ? { kind: 'loading' } : !state ? { kind: 'unknown', reason: read.reason ?? 'the Leader did not answer.' } : undefined}\n value={hr?.rate ?? null}\n showState={false}\n caption={hr && hr.rate === null ? 'nothing graded yet — moves are graded after 7 days' : undefined}\n size={180}\n />\n <Card title=\"Standards\" caption={state ? `${standards.length} in force` : undefined}>\n {!state ? (\n <CardNote tone=\"unknown\">{read?.reason ?? 'The Leader did not answer.'}</CardNote>\n ) : standards.length === 0 ? (\n <CardNote>No standards yet.</CardNote>\n ) : (\n <ul className={styles.standards}>\n {standards.map((s) => (\n <li key={s.id}>\n <span className={styles.standardRule}>{s.rule}</span>\n <span className={styles.standardMeta}>\n {s.appliesTo} · {s.source === 'mason' ? 'yours' : 'Leader'} · {formatRelative(s.addedAt)}\n </span>\n </li>\n ))}\n </ul>\n )}\n </Card>\n </div>\n );\n}\n\nconst SEVERITY_WORD = { high: 'High', warn: 'Worth a look', info: 'FYI' } as const;\n\n/**\n * Where the insight happened: the project's name, the full path only in the\n * tooltip, and a quiet `scratch` tag for a folder under the OS temp dir\n * (project-label.ts). Plain text, never a link.\n */\nfunction InsightPlace({ place }: { place: ProjectLabel }) {\n return (\n <>\n <span className={styles.insightPlace} title={place.full}>{place.label}</span>\n {place.scratch ? (\n <span className={styles.scratchTag} title=\"A scratch folder under the system temp directory\">scratch</span>\n ) : null}\n </>\n );\n}\n\nexport function InsightCards({\n insights,\n reason,\n loading = false,\n places,\n empty,\n}: {\n insights: ReasoningInsight[];\n reason: string | null;\n loading?: boolean;\n /** The no-insights line; Mind passes \"No reasoning recorded…\" when there was no reasoning at all. */\n empty?: string;\n /** Labels for the insights' repos (MindSection builds them once for the cards and the facet). */\n places?: ReadonlyMap<string, ProjectLabel>;\n}) {\n if (loading) return <p className={styles.muted} aria-busy=\"true\">Reading the reasoning digest…</p>;\n if (reason !== null) return <CardNote tone=\"unknown\">{reason}</CardNote>;\n if (insights.length === 0) {\n return <CardNote>{empty ?? 'No loops, repeated failures or verification gaps in the last 30 days.'}</CardNote>;\n }\n return (\n <ul className={styles.insights} aria-label=\"Reasoning insights\">\n {insights.map((i) => {\n const place = i.repo ? (places?.get(i.repo) ?? projectLabel(i.repo)) : null;\n const seen = formatRelative(i.lastAt);\n const rest = [i.engine, `${i.count}×`, seen === UNKNOWN ? null : `last seen ${seen}`].filter(Boolean).join(' · ');\n return (\n <li key={i.id} className={styles.insight} data-severity={i.severity}>\n <span className={styles.insightKind}>\n <MicroLabel>{KIND_LABEL[i.kind]}</MicroLabel>\n <span className={styles.insightSeverity} data-severity={i.severity}>{SEVERITY_WORD[i.severity]}</span>\n </span>\n <span className={styles.insightTitle}>{i.title}</span>\n <span className={styles.insightMeta}>\n {place ? <InsightPlace place={place} /> : null}\n {place && rest ? ' · ' : null}\n {rest}\n </span>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport function ActionLog({ read, actions }: { read: OptionalRead<LeaderStateV1> | undefined; actions: SurfaceActions }) {\n const state = read?.value ?? null;\n const list: LeaderAction[] = state?.actions ?? [];\n return (\n <Card title=\"Action log\" caption={state ? 'Newest first · Veto runs the recorded inverse' : undefined}>\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the action log…</p>\n ) : !state ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The Leader did not answer.'}</CardNote>\n ) : list.length === 0 ? (\n <CardNote>The Leader has not acted yet.</CardNote>\n ) : (\n <ul className={styles.log} aria-label=\"Leader actions\">\n {list.map((a) => (\n <ActionRow key={a.id} action={a} actions={actions} />\n ))}\n </ul>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/sections/MindSection.tsx — ⌘4 Mind: talk to the Leader, and\n * see what it decided and whether it was right (SPEC-310B §6, SPEC-310C §5;\n * unit C7).\n *\n * The Leader conversation: directives, the thread, the composer (12)\n * (leader/LeaderConversation.tsx — lazy; it talks even with autonomy off)\n * Memo timeline with 7-day outcomes ✓/✗ and Veto (8) | Hit-rate gauge + standards (4)\n * Three A7 insight cards (12)\n * Insight matrix kind × engine, per repo (8) | Reasoning trends (4)\n * Action log with Veto (12)\n *\n * At 375 px one column in that order, and the matrix starts on its table\n * (a 6 × 4 grid of 22 px cells says less than its table on a phone).\n *\n * Nothing yet: a Leader with no memo, no action and nothing graded is ONE\n * card (\"The Leader hasn't run yet.\" + its last run's reason, and the\n * autonomy action when autonomy is off) in place of Memos, Hit rate and the\n * Action log; a digest with no reasoning drops the matrix and the trend\n * (the insights card says it once). Both empty: that one card is Mind.\n */\nimport { lazy, Suspense, useId, useMemo, useState } from 'react';\nimport { AreaTrend } from '../../../components/charts/AreaTrend.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { MatrixHeatmap } from '../../../components/charts/MatrixHeatmap.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { AutonomyOffState, useAutonomyOff } from '../autonomy/AutonomyOffState.js';\nimport type { AutonomyOffState as AutonomyOffStateModel } from '../autonomy/autonomy-off-model.js';\nimport { ActionStatus, useSurfaceActions } from '../command/actions.js';\nimport { anchorId } from '../command/nav.js';\nimport { Card, Cell, Surface } from '../command/Surface.js';\nimport { leaderQuery, reasoningDigestQuery } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { verseBootstrapQuery, verseWorkspacesQuery } from '../verse-queries.js';\nimport { ActionLog, HitRateCard, InsightCards, MemoTimeline } from '../mind/MindCards.js';\nimport { insightMatrix, insightRepos, reasoningTrendSeries, topInsights } from '../mind/mind-model.js';\nimport { leaderSilence } from '../mind/leader-model.js';\nimport { projectLabels, projectNames } from '../mind/project-label.js';\nimport styles from '../mind/mind.module.css';\n\n// The conversation is Mind's heart but its own chunk (thread model, composer,\n// memo cards): Mind's cards paint first, and the chat first paint never pays for it.\nconst LeaderConversation = lazy(() => import('../leader/LeaderConversation.js'));\n\nexport const MIND_POLL_MS = 60_000;\n\n/** The Leader's own reason first; with autonomy off, the one fact its action button answers. */\nfunction silenceLine(reason: string | null, off: AutonomyOffStateModel | null): string | null {\n if (!off) return reason;\n return reason ? `${reason} ${off.title}.` : `${off.title}. ${off.why}`;\n}\nconst NAMES_FRESH_MS = 5 * 60_000;\n\nexport function MindSection() {\n const { compact } = useViewport();\n const leader = useQuery(leaderQuery);\n const digest = useQuery(reasoningDigestQuery, { freshMs: 60_000 });\n const refetchLeader = useRefetch(leaderQuery);\n const refetchDigest = useRefetch(reasoningDigestQuery);\n usePollWhileVisible(() => {\n refetchLeader();\n refetchDigest();\n }, MIND_POLL_MS);\n const actions = useSurfaceActions();\n const facetId = useId();\n\n // Registered project names for the insight cards and the Repo facet. Both\n // reads are normally already cached by Chat (bootstrap on first paint, saved\n // projects in its sidebar) and names rarely change, so a cached answer up\n // to 5 minutes old is used as-is; either missing just means folder names.\n const bootstrap = useQuery(verseBootstrapQuery, { freshMs: NAMES_FRESH_MS });\n const saved = useQuery(verseWorkspacesQuery, { freshMs: NAMES_FRESH_MS });\n\n const d = digest.data?.value ?? null;\n // The facet offers one entry per folder; the labels cover every spelling an\n // insight recorded (`/tmp/x` and `/private/tmp/x` read the same), so a card\n // and the facet always agree.\n const repos = useMemo(() => insightRepos(d), [d]);\n const names = useMemo(() => projectNames(saved.data?.workspaces, bootstrap.data?.projects), [saved.data, bootstrap.data]);\n const places = useMemo(() => projectLabels(d ? d.insights.flatMap((i) => (i.repo ? [i.repo] : [])) : [], names), [d, names]);\n const placeText = (r: string) => {\n const p = places.get(r);\n return p ? `${p.label}${p.scratch ? ' · scratch' : ''}` : r;\n };\n const [repo, setRepo] = useState<string | null>(null);\n const facet = repo !== null && repos.includes(repo) ? repo : null;\n const matrix = useMemo(() => insightMatrix(d, facet), [d, facet]);\n const top = topInsights(d);\n const trends = reasoningTrendSeries(d);\n\n const digestStatus = (hasData: boolean, empty: string): ChartStatus =>\n !digest.data ? { kind: 'loading' } : !d ? { kind: 'unknown', reason: digest.data.reason ?? 'the reasoning digest did not answer.' } : hasData ? { kind: 'ready' } : { kind: 'empty', message: empty };\n const reasoned = d ? d.totals.steps > 0 : false;\n const off = useAutonomyOff();\n // Settled reads only: a loading Leader or digest keeps its own card.\n const silence = leaderSilence(leader.data?.value ?? null);\n const noReasoning = d !== null && !reasoned && top.length === 0;\n\n return (\n <Surface title=\"Mind\" actions={[leader, digest].some((q) => q.status === 'refreshing') ? <RefreshIndicator /> : null} lead={<ActionStatus actions={actions} />}>\n <Cell span={12}>\n <div id={anchorId('leader-conversation')}>\n <Suspense fallback={<p className={styles.muted} aria-busy=\"true\">Opening the conversation…</p>}>\n {/* The Leader talks whether or not autonomy is on; with it off, its memos are dry runs. */}\n <LeaderConversation leader={leader.data} actions={actions} dormant={Boolean(off)} />\n </Suspense>\n </div>\n </Cell>\n {silence ? (\n <Cell span={12}>\n <AutonomyOffState state={off ?? null} here=\"mind\" title={silence.title} why={silenceLine(silence.why, off ?? null)} />\n </Cell>\n ) : (\n <>\n <Cell span={8}>\n <MemoTimeline read={leader.data} actions={actions} />\n </Cell>\n <Cell span={4}>\n <HitRateCard read={leader.data} />\n </Cell>\n </>\n )}\n {silence && noReasoning ? null : (\n <Cell span={12}>\n <Card title=\"What the reasoning shows\" caption={d ? `Last 30 days · ${d.totals.steps.toLocaleString('en-US')} reasoning steps across ${d.totals.sessions} sessions` : undefined}>\n <div id={anchorId('insights')}>\n <InsightCards\n insights={top}\n places={places}\n loading={!digest.data}\n reason={!digest.data || d ? null : (digest.data.reason ?? 'The reasoning digest did not answer.')}\n empty={noReasoning ? 'No reasoning recorded in the last 30 days.' : undefined}\n />\n </div>\n </Card>\n </Cell>\n )}\n {noReasoning ? null : (\n <Cell span={8}>\n <MatrixHeatmap\n title=\"Insights by kind and engine\"\n description={facet ? `In ${placeText(facet)}` : 'All repos · 30 days'}\n status={digestStatus(reasoned && matrix.columns.length > 0, 'No reasoning was recorded in the last 30 days.')}\n rows={matrix.rows}\n columns={matrix.columns}\n values={matrix.values}\n unit=\"insights\"\n defaultView={compact ? 'table' : 'chart'}\n actions={\n repos.length > 1 ? (\n <label className={styles.facet} htmlFor={facetId}>\n Repo\n <select id={facetId} value={facet ?? ''} onChange={(e) => setRepo(e.target.value || null)}>\n <option value=\"\">All</option>\n {repos.map((r) => (\n <option key={r} value={r} title={r}>\n {placeText(r)}\n </option>\n ))}\n </select>\n </label>\n ) : null\n }\n />\n </Cell>\n )}\n {noReasoning ? null : (\n <Cell span={4}>\n <AreaTrend\n title=\"Struggles and wins\"\n description=\"Per day · days with no reasoning are gaps\"\n status={digestStatus(reasoned, 'No reasoning was recorded in the last 30 days.')}\n series={trends}\n height={200}\n />\n </Cell>\n )}\n {silence ? null : (\n <Cell span={12}>\n <ActionLog read={leader.data} actions={actions} />\n </Cell>\n )}\n {actions.dialogs}\n </Surface>\n );\n}\n"],"file":"MindSection-DZLHz29Q.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{r}from"./VerseMobileApp-ePNuVERe.js";import{t as i}from"./parts.module-CBkHcD6w.js";import{t as a}from"./MicButton-DORAXsUU.js";var o=e(n(),1),s=t();function c({value:e,onChange:t,onSubmit:n,placeholder:c,submitLabel:l=`Send`,disabled:u=!1,hint:d,above:f,label:p}){let m=(0,o.useId)(),[h,g]=(0,o.useState)(``),[_,v]=(0,o.useState)(!1),y=(0,o.useRef)(null),b=h?`${e}${e&&!e.endsWith(` `)?` `:``}${h}`:e,x=!u&&!_&&e.trim().length>0,S=async()=>{if(x){v(!0);try{await n(e.trim())}catch{}finally{v(!1)}}};return(0,s.jsxs)(`div`,{className:i.composer,children:[f,(0,s.jsxs)(`div`,{className:i.composerRow,children:[(0,s.jsx)(`label`,{htmlFor:m,className:`visually-hidden`,children:p}),(0,s.jsx)(`textarea`,{id:m,ref:y,className:i.composerInput,rows:1,value:b,placeholder:c,disabled:u,"aria-describedby":d?`${m}-hint`:void 0,onChange:e=>{g(``),t(e.target.value),e.target.style.height=`auto`,e.target.style.height=`${e.target.scrollHeight}px`}}),(0,s.jsx)(a,{disabled:u,onInterim:g,onFinal:n=>t(`${e}${e&&!e.endsWith(` `)?` `:``}${n}`)}),(0,s.jsx)(r,{variant:`primary`,disabled:!x,onClick:()=>void S(),"aria-busy":_||void 0,children:_?`…`:l})]}),d?(0,s.jsx)(`p`,{id:`${m}-hint`,className:i.composerHint,children:d}):null]})}export{c as t};
|
|
2
|
+
//# sourceMappingURL=MobileComposer-B8nWsIJO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileComposer-B8nWsIJO.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/MobileComposer.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/MobileComposer.tsx — the bottom bar a phone screen\n * types into (an agent's chat, the Leader): a growing text box, the mic, and\n * one send button — plus optional quick replies above it.\n *\n * Return inserts a newline (a phone keyboard's Return is not \"send\"); the\n * button sends. What is typed survives a failed send: the caller clears it\n * only when the send resolved.\n */\nimport { useId, useRef, useState, type ReactNode } from 'react';\nimport { MicButton } from './MicButton.js';\nimport styles from './parts.module.css';\nimport { Button } from './ui.js';\n\nexport interface MobileComposerProps {\n value: string;\n onChange: (value: string) => void;\n /** Resolve when sent (the caller clears the box); reject to keep the words. */\n onSubmit: (text: string) => Promise<unknown> | void;\n placeholder: string;\n submitLabel?: string;\n disabled?: boolean;\n /** One line under the box: why it is disabled, what Send will do. */\n hint?: ReactNode;\n /** Quick replies / secondary actions above the box. */\n above?: ReactNode;\n /** Accessible name for the text box. */\n label: string;\n}\n\nexport function MobileComposer({ value, onChange, onSubmit, placeholder, submitLabel = 'Send', disabled = false, hint, above, label }: MobileComposerProps) {\n const id = useId();\n const [interim, setInterim] = useState('');\n const [busy, setBusy] = useState(false);\n const box = useRef<HTMLTextAreaElement>(null);\n const text = interim ? `${value}${value && !value.endsWith(' ') ? ' ' : ''}${interim}` : value;\n const canSend = !disabled && !busy && value.trim().length > 0;\n\n const submit = async () => {\n if (!canSend) return;\n setBusy(true);\n try {\n await onSubmit(value.trim());\n } catch {\n /* the caller reported it; the words stay */\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <div className={styles.composer}>\n {above}\n <div className={styles.composerRow}>\n <label htmlFor={id} className=\"visually-hidden\">{label}</label>\n <textarea\n id={id}\n ref={box}\n className={styles.composerInput}\n rows={1}\n value={text}\n placeholder={placeholder}\n disabled={disabled}\n aria-describedby={hint ? `${id}-hint` : undefined}\n onChange={(e) => {\n setInterim('');\n onChange(e.target.value);\n // Grow with the text, up to the CSS max-height.\n e.target.style.height = 'auto';\n e.target.style.height = `${e.target.scrollHeight}px`;\n }}\n />\n <MicButton\n disabled={disabled}\n onInterim={setInterim}\n onFinal={(phrase) => onChange(`${value}${value && !value.endsWith(' ') ? ' ' : ''}${phrase}`)}\n />\n <Button variant=\"primary\" disabled={!canSend} onClick={() => void submit()} aria-busy={busy || undefined}>\n {busy ? '…' : submitLabel}\n </Button>\n </div>\n {hint ? <p id={`${id}-hint`} className={styles.composerHint}>{hint}</p> : null}\n </div>\n );\n}\n"],"mappings":"8PA8BA,SAAgB,EAAe,CAAE,QAAO,WAAU,WAAU,cAAa,cAAc,OAAQ,WAAW,GAAO,OAAM,QAAO,SAA8B,CAC1J,IAAM,GAAA,EAAK,EAAA,MAAA,CAAM,EACX,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAS,EAAE,EACnC,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,GAAA,EAAM,EAAA,OAAA,CAA4B,IAAI,EACtC,EAAO,EAAU,GAAG,IAAQ,GAAS,CAAC,EAAM,SAAS,GAAG,EAAI,IAAM,KAAK,IAAY,EACnF,EAAU,CAAC,GAAY,CAAC,GAAQ,EAAM,KAAK,CAAC,CAAC,OAAS,EAEtD,EAAS,SAAY,CACpB,KACL,GAAQ,EAAI,EACZ,GAAI,CACF,MAAM,EAAS,EAAM,KAAK,CAAC,CAC7B,MAAQ,CAER,QAAU,CACR,EAAQ,EAAK,CACf,CAPY,CAQd,EAEA,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAvB,SAAA,CACG,GACD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,QAAS,EAAI,UAAU,kBAAmB,SAAA,CAAa,CAAA,GAC9D,EAAA,EAAA,IAAA,CAAC,WAAD,CACM,KACJ,IAAK,EACL,UAAW,EAAO,cAClB,KAAM,EACN,MAAO,EACM,cACH,WACV,mBAAkB,EAAO,GAAG,EAAG,OAAS,IAAA,GACxC,SAAW,GAAM,CACf,EAAW,EAAE,EACb,EAAS,EAAE,OAAO,KAAK,EAEvB,EAAE,OAAO,MAAM,OAAS,OACxB,EAAE,OAAO,MAAM,OAAS,GAAG,EAAE,OAAO,aAAa,GACnD,CACD,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACY,WACV,UAAW,EACX,QAAU,GAAW,EAAS,GAAG,IAAQ,GAAS,CAAC,EAAM,SAAS,GAAG,EAAI,IAAM,KAAK,GAAQ,CAC7F,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,UAAU,SAAU,CAAC,EAAS,YAAe,KAAK,EAAO,EAAG,YAAW,GAAQ,IAAA,GAC5F,SAAA,EAAO,IAAM,CACR,CAAA,CACL,IACJ,GAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,GAAI,GAAG,EAAG,OAAQ,UAAW,EAAO,aAAe,SAAA,CAAQ,CAAA,EAAI,IACvE,GAET"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{k as r}from"./global-w7KDTTi0.js";import{B as i,I as a,L as o,N as s,P as c}from"./VerseShared-Bf-XTHCh.js";import{r as l}from"./VerseMobileApp-ePNuVERe.js";import{n as u}from"./device-permissions-DpsJJcUW.js";import{t as d}from"./sheet-DP8ByDWU.js";import{c as f}from"./ui-parts-wvov2ktB.js";var p=e(n(),1),m=t(),h=/^[a-f0-9]{64}$/;function g(){let{request:e,phase:t,error:n}=i(),[g,_]=(0,p.useState)(``),[v,y]=(0,p.useState)(null),[b,x]=(0,p.useState)(null),[S,C]=(0,p.useState)(!1),w=(0,p.useId)();if((0,p.useEffect)(()=>{_(``),y(null),x(null),C(!1)},[e]),!e)return null;if(t===`token`){let t=()=>{let e=g.trim();if(!h.test(e)){y("Expected 64 hex characters — the mutation token `ashlr verse` printed on your Mac.");return}r(e),_(``),a()};return(0,m.jsxs)(d,{open:!0,onClose:()=>a(),title:`Unlock actions`,footer:(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(l,{variant:`primary`,block:!0,onClick:t,children:[`Unlock and `,e.confirmLabel.toLowerCase()]}),(0,m.jsx)(l,{variant:`plain`,block:!0,onClick:()=>a(),children:`Cancel`})]}),children:[(0,m.jsx)(`p`,{className:f.consequence,children:e.tokenReason??`This action changes state on your Mac and needs the mutation token.`}),(0,m.jsxs)(`div`,{className:f.field,children:[(0,m.jsx)(`label`,{className:f.label,htmlFor:w,children:`Mutation token`}),(0,m.jsx)(`input`,{id:w,className:`${f.input} ${f.mono}`,type:`password`,autoComplete:`off`,autoCapitalize:`off`,autoCorrect:`off`,spellCheck:!1,inputMode:`text`,placeholder:`64 hex characters`,value:g,onChange:e=>{_(e.target.value),y(null)},onKeyDown:e=>{e.key===`Enter`&&t()},"aria-invalid":v?!0:void 0,"aria-describedby":v?`${w}-error`:void 0}),v?(0,m.jsx)(`p`,{id:`${w}-error`,className:f.error,children:v}):null]}),(0,m.jsx)(`p`,{className:f.faint,children:`Held in memory for 20 idle minutes, then forgotten. Never saved on this phone.`})]})}if(e.skipConfirm)return null;let T=t===`running`||S,E=async()=>{x(null),C(!0);let t=await u({action:e.confirmLabel,irreversible:!0});if(o(e)){if(C(!1),!t){x(`The extra device check did not complete, so nothing was sent.`);return}c(e)}},D=b??n;return(0,m.jsxs)(d,{open:!0,onClose:s,busy:T,role:`alertdialog`,title:e.title,footer:(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(l,{variant:e.destructive?`destructive`:`primary`,block:!0,disabled:T,onClick:()=>void E(),children:T?`Working…`:D?`Try again`:e.confirmLabel}),(0,m.jsx)(l,{variant:`plain`,block:!0,disabled:T,onClick:s,children:`Cancel`})]}),children:[(0,m.jsx)(`div`,{className:f.consequence,children:e.body}),D?(0,m.jsx)(`p`,{className:f.error,role:`alert`,children:D}):null]})}export{g as MobileGuardSheet};
|
|
2
|
+
//# sourceMappingURL=MobileGuardSheet-BRwOfD9o.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileGuardSheet-BRwOfD9o.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/MobileGuardSheet.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/MobileGuardSheet.tsx — the phone's confirmation and\n * unlock sheet, drawn over the SAME state machine as the desktop GuardHost\n * (shell/guard-store.ts): confirm first, then the mutation token if it is\n * not held, then the POST. An action that fails comes back to the sheet with\n * the server's sentence and a Try again.\n *\n * What the phone adds, and only adds:\n * - the consequences are the sheet's body, in a block of their own, so the\n * question is never \"Are you sure?\" but what will happen;\n * - before a confirmed action runs, the transport's step-up provider (if\n * one is registered — device-permissions.ts) is asked; a refusal leaves\n * the sheet open with the reason and nothing sent.\n *\n * The token field accepts exactly what MutationTokenDialog accepts (64 hex),\n * and the token goes into the same memory-only hold. Nothing is stored.\n */\nimport { useEffect, useId, useState } from 'react';\nimport { setMutationToken } from '../../../data/auth-store.js';\nimport { cancelGuard, confirmGuard, guardTokenClosed, isCurrentGuardRequest, useGuardState } from '../shell/guard-store.js';\nimport { requestStepUp } from './device-permissions.js';\nimport { BottomSheet } from './sheet.js';\nimport { Button } from './ui.js';\nimport { ui } from './ui-parts.js';\n\nconst TOKEN_RE = /^[a-f0-9]{64}$/;\n\nexport function MobileGuardSheet() {\n const { request, phase, error } = useGuardState();\n const [token, setToken] = useState('');\n const [tokenError, setTokenError] = useState<string | null>(null);\n const [stepUpError, setStepUpError] = useState<string | null>(null);\n const [checking, setChecking] = useState(false);\n const tokenId = useId();\n\n // A new request starts clean.\n useEffect(() => {\n setToken('');\n setTokenError(null);\n setStepUpError(null);\n setChecking(false);\n }, [request]);\n\n if (!request) return null;\n\n if (phase === 'token') {\n const unlock = () => {\n const trimmed = token.trim();\n if (!TOKEN_RE.test(trimmed)) {\n setTokenError('Expected 64 hex characters — the mutation token `ashlr verse` printed on your Mac.');\n return;\n }\n setMutationToken(trimmed);\n setToken('');\n guardTokenClosed();\n };\n return (\n <BottomSheet\n open\n onClose={() => guardTokenClosed()}\n title=\"Unlock actions\"\n footer={(\n <>\n <Button variant=\"primary\" block onClick={unlock}>Unlock and {request.confirmLabel.toLowerCase()}</Button>\n <Button variant=\"plain\" block onClick={() => guardTokenClosed()}>Cancel</Button>\n </>\n )}\n >\n <p className={ui.consequence}>{request.tokenReason ?? 'This action changes state on your Mac and needs the mutation token.'}</p>\n <div className={ui.field}>\n <label className={ui.label} htmlFor={tokenId}>Mutation token</label>\n <input\n id={tokenId}\n className={`${ui.input} ${ui.mono}`}\n type=\"password\"\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n inputMode=\"text\"\n placeholder=\"64 hex characters\"\n value={token}\n onChange={(e) => {\n setToken(e.target.value);\n setTokenError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') unlock();\n }}\n aria-invalid={tokenError ? true : undefined}\n aria-describedby={tokenError ? `${tokenId}-error` : undefined}\n />\n {tokenError ? <p id={`${tokenId}-error`} className={ui.error}>{tokenError}</p> : null}\n </div>\n <p className={ui.faint}>Held in memory for 20 idle minutes, then forgotten. Never saved on this phone.</p>\n </BottomSheet>\n );\n }\n\n if (request.skipConfirm) return null;\n\n const running = phase === 'running' || checking;\n const onConfirm = async () => {\n setStepUpError(null);\n setChecking(true);\n const ok = await requestStepUp({ action: request.confirmLabel, irreversible: true });\n if (!isCurrentGuardRequest(request)) return;\n setChecking(false);\n if (!ok) {\n setStepUpError('The extra device check did not complete, so nothing was sent.');\n return;\n }\n confirmGuard(request);\n };\n const message = stepUpError ?? error;\n return (\n <BottomSheet\n open\n onClose={cancelGuard}\n busy={running}\n role=\"alertdialog\"\n title={request.title}\n footer={(\n <>\n <Button variant={request.destructive ? 'destructive' : 'primary'} block disabled={running} onClick={() => void onConfirm()}>\n {running ? 'Working…' : message ? 'Try again' : request.confirmLabel}\n </Button>\n <Button variant=\"plain\" block disabled={running} onClick={cancelGuard}>Cancel</Button>\n </>\n )}\n >\n <div className={ui.consequence}>{request.body}</div>\n {message ? <p className={ui.error} role=\"alert\">{message}</p> : null}\n </BottomSheet>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MobileGuardSheet-BRwOfD9o.js","assets/sheet-DP8ByDWU.js","assets/focus-trap-BZeH0rVB.js","assets/ui-parts-wvov2ktB.js","assets/global-1SED_aTT.css","assets/VerseMobileApp-CK62hnya.css","assets/parts-bRLxuRh-.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n,t as r}from"./index-BC5Uslm5.js";import{l as i}from"./global-w7KDTTi0.js";import{B as a,O as o,k as s}from"./VerseShared-Bf-XTHCh.js";import{n as c}from"./verse-bootstrap-query-B3vFD9XK.js";import{t as l}from"./preloaded-6hKNGuRp.js";import{d as u,t as d}from"./VerseMobileApp-ePNuVERe.js";import{r as f}from"./device-permissions-DpsJJcUW.js";import{r as p}from"./resolved-store-UYN2k9My.js";import{n as m,r as h,t as g}from"./connectivity-xQ0Nh0j3.js";import{t as _}from"./mobile-toast-BqSzGmw1.js";var v=e(n(),1),y=t(),b=l(()=>r(()=>import(`./MobileGuardSheet-BRwOfD9o.js`).then(e=>e.MobileGuardSheet),__vite__mapDeps([0,1,2,3,4,5,6]))).Slot;function x({state:e,updatedAt:t}){if(e===`live`||e===`connecting`)return null;let n=e===`offline`?t===null?`This phone is offline. No update yet.`:`This phone is offline — showing the last update.`:`Can’t reach your Mac. ${m(t)}.`;return(0,y.jsx)(`div`,{className:d.reach,"data-state":e,role:`status`,children:n})}function S({navigate:e,children:t}){let n=s(),r=h(),l=i(c),d=f(l.data?.dispatchEnabled??null),m=p(),S=g(r,n),C=a().request!==null,w=(0,v.useMemo)(()=>{let e=n.data?.needsYou;return e?e.filter(e=>!m.has(e.id)).length:null},[n.data,m]),T=n.data?.counts.running??null,E=(0,v.useMemo)(()=>({ready:!0,permissions:d,reachability:S,activity:n,navigate:e,needsCount:w,workingCount:T,refreshActivity:o}),[d,S,n,e,w,T]),D=(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(x,{state:S,updatedAt:n.updatedAt}),C?(0,y.jsx)(v.Suspense,{fallback:null,children:(0,y.jsx)(b,{})}):null,(0,y.jsx)(_,{})]});return(0,y.jsx)(u.Provider,{value:E,children:t(E,D)})}export{S as MobileRuntime};
|
|
3
|
+
//# sourceMappingURL=MobileRuntime-kMob_MjB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":";ilBA8BM,EAAa,YAA4B,OAAO,iCAAwB,CAAC,KAAM,GAAM,EAAE,gBAAgB,mCAAC,CAAC,CAAC,KAEhH,SAAgB,EAAW,CAAE,QAAO,aAAgE,CAClG,GAAI,IAAU,QAAU,IAAU,aAAc,OAAO,KACvD,IAAM,EAAO,IAAU,UACnB,IAAc,KACZ,wCACA,mDACF,yBAAyB,EAAU,CAAS,EAAE,GAClD,OACE,SAAC,MAAD,CAAK,UAAW,EAAO,MAAO,aAAY,EAAO,KAAK,SACnD,UACE,EAET,CAQA,SAAgB,EAAc,CAAE,WAAU,YAAgC,CACxE,IAAM,EAAW,EAAY,EACvB,EAAS,EAAU,EACnB,EAAY,EAAS,CAAmB,EACxC,EAAc,EAAqB,EAAU,MAAM,iBAAmB,IAAI,EAC1E,EAAW,EAAe,EAC1B,EAAe,EAAe,EAAQ,CAAQ,EAC9C,EAAY,EAAc,CAAC,CAAC,UAAY,KAExC,KAAa,eAAc,CAC/B,IAAM,EAAQ,EAAS,MAAM,SAC7B,OAAO,EAAQ,EAAM,OAAQ,GAAM,CAAC,EAAS,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAS,IACnE,EAAG,CAAC,EAAS,KAAM,CAAQ,CAAC,EACtB,EAAe,EAAS,MAAM,OAAO,SAAW,KAEhD,KAAU,gBACP,CAAE,MAAO,GAAM,cAAa,eAAc,WAAU,WAAU,aAAY,eAAc,iBAAgB,GAC/G,CAAC,EAAa,EAAc,EAAU,EAAU,EAAY,CAAY,CAC1E,EAEM,GACJ,iCACE,SAAC,EAAD,CAAY,MAAO,EAAc,UAAW,EAAS,SAAY,GAChE,GAAY,SAAC,WAAD,CAAU,SAAU,KAAM,mBAAC,EAAD,CAAa,EAAW,GAAI,MACnE,SAAC,EAAD,CAAe,EACf,IAEJ,OAAO,SAAC,EAAc,SAAf,CAAwB,MAAO,EAAU,WAAS,EAAS,CAAQ,CAA0B,EACtG","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/MobileRuntime.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/MobileRuntime.tsx — the live half of the phone shell:\n * the activity loop (shell/useActivity.ts, the workbench rail's own cursor\n * loop), this device's permissions, reachability, the Needs-you count with\n * acted-on items hidden at once, the confirmation sheet and the toasts.\n *\n * WHY A CHUNK OF ITS OWN: none of it can show anything before the session\n * probe answers — the activity poll needs the session, permissions need the\n * bootstrap. So its download runs in parallel with that probe (MobileShell\n * preloads it) and costs no time, while the first paint stays a frame of\n * skeletons inside the 250 KB phone budget.\n */\nimport { Suspense, useMemo, type ReactNode } from 'react';\nimport { useQuery } from '../../../data/hooks.js';\nimport { preloadedLazy } from '../shell/preloaded.js';\nimport { useGuardState } from '../shell/guard-store.js';\nimport { useResolvedIds } from '../shell/resolved-store.js';\nimport { refreshActivity, useActivity } from '../shell/useActivity.js';\nimport { verseBootstrapQuery } from '../verse-bootstrap-query.js';\nimport { reachabilityOf, sinceText, useOnline, type Reachability } from './connectivity.js';\nimport { useDevicePermissions } from './device-permissions.js';\nimport { MobileContext, type MobileContextValue } from './mobile-context.js';\nimport type { MobileRoute, NavigateOptions } from './mobile-router.js';\nimport { MobileToasts } from './mobile-toast.js';\nimport styles from './MobileShell.module.css';\n\n/**\n * The confirmation / unlock sheet draws nothing until an action starts; its\n * chunk (with the focus trap) is in long before the first tap.\n */\nconst GuardSheet = preloadedLazy<object>(() => import('./MobileGuardSheet.js').then((m) => m.MobileGuardSheet)).Slot;\n\nexport function ReachStrip({ state, updatedAt }: { state: Reachability; updatedAt: number | null }) {\n if (state === 'live' || state === 'connecting') return null;\n const text = state === 'offline'\n ? updatedAt === null\n ? 'This phone is offline. No update yet.'\n : 'This phone is offline — showing the last update.'\n : `Can’t reach your Mac. ${sinceText(updatedAt)}.`;\n return (\n <div className={styles.reach} data-state={state} role=\"status\">\n {text}\n </div>\n );\n}\n\nexport interface MobileRuntimeProps {\n navigate: (route: MobileRoute, options?: NavigateOptions) => void;\n /** Renders the frame with the live context (and where the reach strip goes). */\n children: (context: MobileContextValue, overlays: ReactNode) => ReactNode;\n}\n\nexport function MobileRuntime({ navigate, children }: MobileRuntimeProps) {\n const activity = useActivity();\n const online = useOnline();\n const bootstrap = useQuery(verseBootstrapQuery);\n const permissions = useDevicePermissions(bootstrap.data?.dispatchEnabled ?? null);\n const resolved = useResolvedIds();\n const reachability = reachabilityOf(online, activity);\n const guardOpen = useGuardState().request !== null;\n\n const needsCount = useMemo(() => {\n const items = activity.data?.needsYou;\n return items ? items.filter((i) => !resolved.has(i.id)).length : null;\n }, [activity.data, resolved]);\n const workingCount = activity.data?.counts.running ?? null;\n\n const context = useMemo<MobileContextValue>(\n () => ({ ready: true, permissions, reachability, activity, navigate, needsCount, workingCount, refreshActivity }),\n [permissions, reachability, activity, navigate, needsCount, workingCount],\n );\n\n const overlays = (\n <>\n <ReachStrip state={reachability} updatedAt={activity.updatedAt} />\n {guardOpen ? <Suspense fallback={null}><GuardSheet /></Suspense> : null}\n <MobileToasts />\n </>\n );\n return <MobileContext.Provider value={context}>{children(context, overlays)}</MobileContext.Provider>;\n}\n"],"file":"MobileRuntime-kMob_MjB.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{a as t,n,s as r,t as i}from"./index-BC5Uslm5.js";import{N as a,b as ee,c as te,f as o,y as s}from"./global-w7KDTTi0.js";import{z as c}from"./VerseShared-Bf-XTHCh.js";import{f as l,i as u,p as d,r as f}from"./VerseMobileApp-ePNuVERe.js";import{currentRemoteSession as p,remotePushPublicKey as m,subscribeRemotePush as h}from"./remote-session-Bu-dtRcS.js";import{t as g}from"./sheet-DP8ByDWU.js";import{c as _,o as v,s as y,t as b}from"./ui-parts-wvov2ktB.js";import{n as x}from"./mobile-toast-BqSzGmw1.js";import{enableRemotePush as S,supportsIphoneHomeScreenPush as C}from"./pwa-BzXJXtDt.js";import{n as w,t as T}from"./app-version-Cb1z8iCO.js";var E=e(r(),1),D={actions:`_actions_5qbm5_3`,lead:`_lead_5qbm5_7`,steps:`_steps_5qbm5_11`},O=n(),k=[{value:`system`,label:`System`},{value:`light`,label:`Light`},{value:`dark`,label:`Dark`}],A={live:{word:`Connected`,tone:`success`,detail:`Your Mac answered the last check.`},connecting:{word:`Connecting`,tone:`neutral`,detail:`Waiting for your Mac to answer.`},offline:{word:`Offline`,tone:`warning`,detail:`This phone has no network. The last update stays on screen.`},unreachable:{word:`Can’t reach your Mac`,tone:`danger`,detail:`It may be asleep, or the connection to it is down.`}};function j(e){return new Date(e).toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`})}function M(){let[e,t]=(0,E.useState)(null);return(0,E.useEffect)(()=>{let e=!0;return i(()=>import(`./pwa-BzXJXtDt.js`).then(n=>{e&&t(n.isStandalone())}),[]).catch(()=>{e&&t(!1)}),()=>{e=!1}},[]),e}function N(){let{permissions:e,reachability:n,activity:r,navigate:i}=d(),N=te(),P=o(),F=M(),[I,L]=(0,E.useState)(!1),[R,z]=(0,E.useState)(!1),[B,V]=(0,E.useState)(null),[H,U]=(0,E.useState)(!1),[W,G]=(0,E.useState)(null),[K,q]=(0,E.useState)(null),J=a(),Y=J&&p()?.capabilities.push===!0,X=Y&&C();(0,E.useEffect)(()=>{if(!X)return;let e=!0;return m().then(t=>{e&&G(t)}).catch(()=>{e&&q(`The gateway notification key is unavailable.`)}),()=>{e=!1}},[X]);let Z=l(e),ne=e.act===`unavailable`?`Not on this device`:J?`Passkey required`:e.act===`unlocked`?`Unlocked`:`Locked`,re=e.act===`unlocked`?`success`:e.act===`locked`?`warning`:`neutral`,Q=J&&e.act!==`unavailable`?`Higher-risk actions ask for a fresh passkey on this phone. Authority changes stay on your Mac.`:e.act===`unlocked`?N.heldUntil===null?`Actions are unlocked.`:`Actions stay unlocked until ${j(N.heldUntil)} if nothing is done — each action extends it.`:e.act===`locked`?`Needs the mutation token. Actions ask for it when you use one, or unlock now.`:e.actReason??`This device can read but not act.`,ie=()=>{c({title:`Unlock actions`,body:`Unlocks approving, starting and stopping from this phone.`,confirmLabel:`Continue`,destructive:!1,token:!0,tokenReason:"Paste the mutation token `ashlr verse` printed on your Mac. It stays in this tab’s memory for 20 idle minutes and is never saved.",skipConfirm:!0,run:async()=>{},onDone:()=>x(`Actions unlocked`,`success`)})},ae=()=>{s(),x(`Actions locked`,`neutral`)},oe=()=>{t(`desktop`),window.location.assign(`/verse/`)},se=async()=>{z(!0),V(null);try{await ee(),L(!1)}catch{V(`This phone could not sign out. Check the connection and try again.`)}finally{z(!1)}},ce=async()=>{if(X&&W&&!H){U(!0),q(null);try{await h(await S(W)),q(`Notifications are on. They only say that Verse has an update.`)}catch(e){q(e instanceof Error?e.message:`Notifications could not be enabled.`)}finally{U(!1)}}},$=A[n],le=n===`offline`&&r.updatedAt===null?`This phone has no network. No update yet.`:$.detail;return(0,O.jsxs)(u,{title:`More`,large:!0,label:`More`,children:[(0,O.jsxs)(y,{title:`This device`,children:[(0,O.jsx)(v,{title:`Read`,trailing:e.read?`Yes`:`No`,subtitle:e.read?void 0:`Not signed in to your Mac.`}),(0,O.jsx)(v,{title:`Act`,subtitle:Q,trailing:(0,O.jsx)(b,{tone:re,children:ne})}),(0,O.jsx)(v,{title:`Signed in as`,trailing:e.source===`device`?e.deviceLabel??`A paired device`:`This browser session`})]}),!J&&e.act===`unlocked`?(0,O.jsx)(`div`,{className:D.actions,children:(0,O.jsx)(f,{variant:`secondary`,block:!0,onClick:ae,children:`Lock now`})}):!J&&e.act===`locked`?(0,O.jsx)(`div`,{className:D.actions,children:(0,O.jsx)(f,{variant:`tinted`,block:!0,onClick:ie,children:`Unlock`})}):null,(0,O.jsxs)(y,{title:`Go to`,children:[(0,O.jsx)(v,{title:`Fleet`,subtitle:J?`Status, budget and actions allowed by this gateway`:`Start, pause or stop; budget mode; the grant`,onClick:()=>i({screen:`fleet`})}),Z?(0,O.jsx)(v,{title:`New agent`,subtitle:`Start an agent on one of your repos`,onClick:()=>i({screen:`new`})}):null,(0,O.jsx)(v,{title:`Needs you`,subtitle:`Approvals and questions waiting on you`,onClick:()=>i({screen:`needs`})}),J?null:(0,O.jsx)(v,{title:`Use the desktop layout`,subtitle:`Open the full workbench in this browser`,onClick:oe})]}),Y?(0,O.jsxs)(y,{title:`Notifications`,flat:!0,children:[(0,O.jsx)(`p`,{className:_.card,children:`Verse can send a generic alert when something needs you or a run completes. The alert contains no agent or repository details.`}),X?(0,O.jsx)(f,{variant:`tinted`,block:!0,disabled:H||!W,onClick:()=>void ce(),children:H?`Enabling…`:W?`Enable notifications`:`Preparing notifications…`}):(0,O.jsx)(`p`,{className:_.card,children:`Notifications require Verse installed on an iPhone Home Screen with Web Push support. You can still use Verse in this browser.`}),K?(0,O.jsx)(`p`,{role:`status`,children:K}):null]}):null,(0,O.jsx)(y,{title:`Appearance`,flat:!0,children:(0,O.jsx)(`div`,{className:_.chips,role:`group`,"aria-label":`Theme`,children:k.map(e=>(0,O.jsx)(`button`,{type:`button`,className:_.chip,"aria-pressed":P.theme===e.value,onClick:()=>P.set(e.value),children:e.label},e.value))})}),(0,O.jsx)(y,{title:`Install on your Home Screen`,flat:!0,children:F?(0,O.jsx)(`p`,{className:_.card,children:`Installed — Verse is running from your Home Screen.`}):(0,O.jsxs)(`div`,{className:_.card,children:[(0,O.jsx)(`p`,{className:D.lead,children:`Add Verse to your Home Screen and it opens full screen, like an app.`}),(0,O.jsxs)(`ol`,{className:D.steps,children:[(0,O.jsxs)(`li`,{children:[(0,O.jsx)(`strong`,{children:`iPhone (Safari):`}),` tap Share, then Add to Home Screen.`]}),(0,O.jsxs)(`li`,{children:[(0,O.jsx)(`strong`,{children:`Android (Chrome):`}),` open the menu button, then Install app.`]})]})]})}),(0,O.jsx)(y,{title:`Connection`,children:(0,O.jsx)(v,{title:`Your Mac`,subtitle:le,trailing:(0,O.jsx)(b,{tone:$.tone,children:$.word})})}),(0,O.jsx)(`div`,{className:D.actions,children:(0,O.jsx)(f,{variant:`destructiveTinted`,block:!0,onClick:()=>L(!0),children:`Sign out of this device`})}),(0,O.jsx)(y,{title:`About`,children:(0,O.jsx)(v,{title:T,trailing:`Version ${w}`})}),(0,O.jsxs)(g,{open:I,onClose:()=>L(!1),busy:R,role:`alertdialog`,title:`Sign out of this device?`,footer:(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(f,{variant:`destructive`,block:!0,disabled:R,onClick:()=>void se(),children:R?`Signing out…`:`Sign out`}),(0,O.jsx)(f,{variant:`plain`,block:!0,disabled:R,onClick:()=>L(!1),children:`Cancel`})]}),children:[(0,O.jsx)(`p`,{className:_.consequence,children:J?`Signs this phone out. Use its approved passkey to sign in again. Nothing on your Mac changes.`:`Signs this phone out. You’ll need the read token again. Nothing on your Mac changes.`}),B?(0,O.jsx)(`p`,{role:`alert`,children:B}):null]})]})}export{N as MoreScreen,j as clockText};
|
|
2
|
+
//# sourceMappingURL=MoreScreen-92dC6Bj7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/screens/MoreScreen.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/screens/MoreScreen.tsx — the More tab: what this\n * device may do (and locking / unlocking it), the other places to go, the\n * theme, the desktop layout, installing to the Home Screen, the connection\n * to the Mac with sign-out, and the version.\n *\n * Nothing here is a server write except through the existing guards:\n * - Unlock opens the SAME token sheet every action uses (guard-store's\n * `requestGuarded` with the confirmation skipped), so the token goes into\n * the one memory-only hold and nowhere else;\n * - Lock now drops that hold (data/auth-store.ts clearMutationToken);\n * - Sign out ends the read session (clearReadSession) after a sheet that\n * says what it means — it is not a change on the Mac, so it is not a\n * guarded action.\n * The theme is the workbench's own store (useTheme), so the phone and the Mac\n * browser share one choice.\n */\nimport { useEffect, useState } from 'react';\nimport { clearMutationToken, clearReadSession } from '../../../../data/auth-store.js';\nimport { isRemoteMobileMode } from '../../../../data/remote-mode.js';\nimport { currentRemoteSession, remotePushPublicKey, subscribeRemotePush } from '../../../../data/remote-session.js';\nimport { useMutationHold, useTheme } from '../../../../data/hooks.js';\nimport type { ThemePreference } from '../../../../data/theme-store.js';\nimport { writeVerseLayoutPreference } from '../../../../app/console-mode.js';\nimport { requestGuarded } from '../../shell/guard-store.js';\nimport { APP_NAME, APP_VERSION } from '../../sections/app-version.js';\nimport type { Reachability } from '../connectivity.js';\nimport { canShowActions, useMobile } from '../mobile-context.js';\nimport { showMobileToast } from '../mobile-toast.js';\nimport { enableRemotePush, supportsIphoneHomeScreenPush } from '../pwa.js';\nimport { BottomSheet } from '../sheet.js';\nimport { Button, Screen } from '../ui.js';\nimport { Badge, Row, Section, ui, type Tone } from '../ui-parts.js';\nimport styles from './MoreScreen.module.css';\n\nconst THEMES: ReadonlyArray<{ value: ThemePreference; label: string }> = [\n { value: 'system', label: 'System' },\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n];\n\nconst REACH: Readonly<Record<Reachability, { word: string; tone: Tone; detail: string }>> = {\n live: { word: 'Connected', tone: 'success', detail: 'Your Mac answered the last check.' },\n connecting: { word: 'Connecting', tone: 'neutral', detail: 'Waiting for your Mac to answer.' },\n offline: { word: 'Offline', tone: 'warning', detail: 'This phone has no network. The last update stays on screen.' },\n unreachable: { word: 'Can’t reach your Mac', tone: 'danger', detail: 'It may be asleep, or the connection to it is down.' },\n};\n\n/** \"3:42 PM\" — when the unlock lapses if nothing is done. */\nexport function clockText(ms: number): string {\n return new Date(ms).toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n}\n\nfunction useStandalone(): boolean | null {\n const [standalone, setStandalone] = useState<boolean | null>(null);\n useEffect(() => {\n let live = true;\n void import('../pwa.js')\n .then((m) => {\n if (live) setStandalone(m.isStandalone());\n })\n .catch(() => {\n if (live) setStandalone(false);\n });\n return () => {\n live = false;\n };\n }, []);\n return standalone;\n}\n\nexport function MoreScreen() {\n const { permissions, reachability, activity, navigate } = useMobile();\n const hold = useMutationHold();\n const theme = useTheme();\n const standalone = useStandalone();\n const [signOutOpen, setSignOutOpen] = useState(false);\n const [signingOut, setSigningOut] = useState(false);\n const [signOutError, setSignOutError] = useState<string | null>(null);\n const [pushBusy, setPushBusy] = useState(false);\n const [pushKey, setPushKey] = useState<string | null>(null);\n const [pushMessage, setPushMessage] = useState<string | null>(null);\n const remote = isRemoteMobileMode();\n const pushAvailable = remote && currentRemoteSession()?.capabilities.push === true;\n const pushEligible = pushAvailable && supportsIphoneHomeScreenPush();\n useEffect(() => {\n if (!pushEligible) return;\n let live = true;\n void remotePushPublicKey().then((key) => { if (live) setPushKey(key); })\n .catch(() => { if (live) setPushMessage('The gateway notification key is unavailable.'); });\n return () => { live = false; };\n }, [pushEligible]);\n const canAct = canShowActions(permissions);\n\n const actWord = permissions.act === 'unavailable' ? 'Not on this device' : remote ? 'Passkey required' : permissions.act === 'unlocked' ? 'Unlocked' : 'Locked';\n const actTone: Tone = permissions.act === 'unlocked' ? 'success' : permissions.act === 'locked' ? 'warning' : 'neutral';\n const actDetail = remote && permissions.act !== 'unavailable'\n ? 'Higher-risk actions ask for a fresh passkey on this phone. Authority changes stay on your Mac.'\n : permissions.act === 'unlocked'\n ? hold.heldUntil !== null\n ? `Actions stay unlocked until ${clockText(hold.heldUntil)} if nothing is done — each action extends it.`\n : 'Actions are unlocked.'\n : permissions.act === 'locked'\n ? 'Needs the mutation token. Actions ask for it when you use one, or unlock now.'\n : permissions.actReason ?? 'This device can read but not act.';\n\n const unlock = () => {\n requestGuarded({\n title: 'Unlock actions',\n body: 'Unlocks approving, starting and stopping from this phone.',\n // The token sheet's button reads \"Unlock and <label>\": \"Unlock and continue\", not \"Unlock and unlock\".\n confirmLabel: 'Continue',\n destructive: false,\n token: true,\n tokenReason: 'Paste the mutation token `ashlr verse` printed on your Mac. It stays in this tab’s memory for 20 idle minutes and is never saved.',\n skipConfirm: true,\n run: async () => {},\n onDone: () => showMobileToast('Actions unlocked', 'success'),\n });\n };\n\n const lock = () => {\n clearMutationToken();\n showMobileToast('Actions locked', 'neutral');\n };\n\n const openDesktop = () => {\n writeVerseLayoutPreference('desktop');\n window.location.assign('/verse/');\n };\n\n const signOut = async () => {\n setSigningOut(true);\n setSignOutError(null);\n try {\n await clearReadSession();\n setSignOutOpen(false);\n } catch {\n setSignOutError('This phone could not sign out. Check the connection and try again.');\n } finally {\n setSigningOut(false);\n }\n };\n\n const enablePush = async () => {\n if (!pushEligible || !pushKey || pushBusy) return;\n setPushBusy(true);\n setPushMessage(null);\n try {\n await subscribeRemotePush(await enableRemotePush(pushKey));\n setPushMessage('Notifications are on. They only say that Verse has an update.');\n } catch (error) {\n setPushMessage(error instanceof Error ? error.message : 'Notifications could not be enabled.');\n } finally { setPushBusy(false); }\n };\n\n const reach = REACH[reachability];\n const reachDetail = reachability === 'offline' && activity.updatedAt === null\n ? 'This phone has no network. No update yet.'\n : reach.detail;\n\n return (\n <Screen title=\"More\" large label=\"More\">\n <Section title=\"This device\">\n <Row title=\"Read\" trailing={permissions.read ? 'Yes' : 'No'} subtitle={permissions.read ? undefined : 'Not signed in to your Mac.'} />\n <Row title=\"Act\" subtitle={actDetail} trailing={<Badge tone={actTone}>{actWord}</Badge>} />\n <Row\n title=\"Signed in as\"\n trailing={permissions.source === 'device' ? permissions.deviceLabel ?? 'A paired device' : 'This browser session'}\n />\n </Section>\n {!remote && permissions.act === 'unlocked' ? (\n <div className={styles.actions}><Button variant=\"secondary\" block onClick={lock}>Lock now</Button></div>\n ) : !remote && permissions.act === 'locked' ? (\n <div className={styles.actions}><Button variant=\"tinted\" block onClick={unlock}>Unlock</Button></div>\n ) : null}\n\n <Section title=\"Go to\">\n <Row title=\"Fleet\" subtitle={remote ? 'Status, budget and actions allowed by this gateway' : 'Start, pause or stop; budget mode; the grant'} onClick={() => navigate({ screen: 'fleet' })} />\n {canAct ? <Row title=\"New agent\" subtitle=\"Start an agent on one of your repos\" onClick={() => navigate({ screen: 'new' })} /> : null}\n <Row title=\"Needs you\" subtitle=\"Approvals and questions waiting on you\" onClick={() => navigate({ screen: 'needs' })} />\n {!remote ? <Row title=\"Use the desktop layout\" subtitle=\"Open the full workbench in this browser\" onClick={openDesktop} /> : null}\n </Section>\n\n {pushAvailable ? <Section title=\"Notifications\" flat>\n <p className={ui.card}>Verse can send a generic alert when something needs you or a run completes. The alert contains no agent or repository details.</p>\n {pushEligible ? <Button variant=\"tinted\" block disabled={pushBusy || !pushKey} onClick={() => void enablePush()}>{pushBusy ? 'Enabling…' : pushKey ? 'Enable notifications' : 'Preparing notifications…'}</Button>\n : <p className={ui.card}>Notifications require Verse installed on an iPhone Home Screen with Web Push support. You can still use Verse in this browser.</p>}\n {pushMessage ? <p role=\"status\">{pushMessage}</p> : null}\n </Section> : null}\n\n <Section title=\"Appearance\" flat>\n <div className={ui.chips} role=\"group\" aria-label=\"Theme\">\n {THEMES.map((t) => (\n <button key={t.value} type=\"button\" className={ui.chip} aria-pressed={theme.theme === t.value} onClick={() => theme.set(t.value)}>\n {t.label}\n </button>\n ))}\n </div>\n </Section>\n\n <Section title=\"Install on your Home Screen\" flat>\n {standalone ? (\n <p className={ui.card}>Installed — Verse is running from your Home Screen.</p>\n ) : (\n <div className={ui.card}>\n <p className={styles.lead}>Add Verse to your Home Screen and it opens full screen, like an app.</p>\n <ol className={styles.steps}>\n <li><strong>iPhone (Safari):</strong> tap Share, then Add to Home Screen.</li>\n <li><strong>Android (Chrome):</strong> open the menu button, then Install app.</li>\n </ol>\n </div>\n )}\n </Section>\n\n <Section title=\"Connection\">\n <Row title=\"Your Mac\" subtitle={reachDetail} trailing={<Badge tone={reach.tone}>{reach.word}</Badge>} />\n </Section>\n <div className={styles.actions}>\n <Button variant=\"destructiveTinted\" block onClick={() => setSignOutOpen(true)}>Sign out of this device</Button>\n </div>\n\n <Section title=\"About\">\n <Row title={APP_NAME} trailing={`Version ${APP_VERSION}`} />\n </Section>\n\n <BottomSheet\n open={signOutOpen}\n onClose={() => setSignOutOpen(false)}\n busy={signingOut}\n role=\"alertdialog\"\n title=\"Sign out of this device?\"\n footer={(\n <>\n <Button variant=\"destructive\" block disabled={signingOut} onClick={() => void signOut()}>{signingOut ? 'Signing out…' : 'Sign out'}</Button>\n <Button variant=\"plain\" block disabled={signingOut} onClick={() => setSignOutOpen(false)}>Cancel</Button>\n </>\n )}\n >\n <p className={ui.consequence}>{remote ? 'Signs this phone out. Use its approved passkey to sign in again. Nothing on your Mac changes.' : 'Signs this phone out. You’ll need the read token again. Nothing on your Mac changes.'}</p>\n {signOutError ? <p role=\"alert\">{signOutError}</p> : null}\n </BottomSheet>\n </Screen>\n );\n}\n"],"file":"MoreScreen-92dC6Bj7.js"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/CompareDialog-PVqv0Tx9.js","assets/Dialog-DDHg9cuT.js","assets/focus-trap-BZeH0rVB.js","assets/MessageMarkdown-CS0mAtSs.js","assets/Transcript.module-DD0MFIIy.js","assets/Dialog-tQ8kFulD.css","assets/Transcript-DZ96MnR7.css","assets/global-1SED_aTT.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/SkipToContent-c02H5dmz.css","assets/VerseConsoleApp-BmckthwC.css","assets/multimodel-CqUj4iU0.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n,t as r}from"./index-BC5Uslm5.js";import{l as i}from"./global-w7KDTTi0.js";import{j as a}from"./verse-model-DAOz9LrY.js";import{t as o}from"./useVerseTranscript-BN_fMz6x.js";import{a as s,d as ee,f as te,n as ne,t as c,u as l}from"./multimodel-flows-DOHsEKUG.js";import{n as re,o as u,r as ie,s as ae,t as oe}from"./multimodel-queries-xmBBUT6n.js";import{t as d}from"./multimodel.module-ZpbCvfp1.js";import{a as f,n as p,r as m,t as se}from"./useAutoSeat-Dpbn0XUv.js";var h=e(n(),1),g=t(),ce=(0,h.lazy)(async()=>({default:(await r(async()=>{let{CompareDialog:e}=await import(`./CompareDialog-PVqv0Tx9.js`);return{CompareDialog:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))).CompareDialog})),le={off:`Auto off`,auto:`Auto`,"cheap-first":`Cheap-first`},_=new Map;function v({down:e=!1}){return(0,g.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,style:e?{transform:`rotate(180deg)`}:void 0,children:(0,g.jsx)(`path`,{d:`M5 7v7H2.5V7H5Zm0 0 3-5c1 0 1.8.8 1.6 1.8L9.2 6.5h3.6c.9 0 1.5.8 1.3 1.6l-1.1 4.6c-.2.8-.9 1.3-1.7 1.3H5`})})}function y(e){return{seatId:e.seatId,model:e.model,label:e.label,engine:e.engine}}function b(e){return e>=10?`$${e.toFixed(0)}`:e>=.1?`$${e.toFixed(2)}`:e>0?`<$0.10`:`$0`}function x({sessionId:e,seats:t,text:n,running:r,registerInterceptor:x,onConsumeDraft:S}){let[C,w]=(0,h.useState)(()=>p(e)),[T,E]=(0,h.useState)(null),[D,O]=(0,h.useState)(null),[k,A]=(0,h.useState)(!1),[j,M]=(0,h.useState)(null),[N,P]=(0,h.useState)(null),F=f({sessionId:e,seats:t,text:n,pref:C,pinnedSeatId:null}),{session:I,advice:L,context:R}=F,z=o(e),B=i(oe(e)).data??null;(0,h.useEffect)(()=>{n.trim()||E(null)},[n]);let V=(0,h.useMemo)(()=>{let e=z.items,t=-1;for(let n=e.length-1;n>=0;--n)if(e[n].kind===`user`){t=n;break}if(t===-1)return null;let n=e.slice(t+1),r=n.flatMap(e=>e.kind===`assistant`?[e.text]:[]).join(`
|
|
3
|
+
|
|
4
|
+
`),i=n.find(e=>e.kind===`turn-done`),a=e[t];return{turnId:a.kind===`user`?a.turnId:``,question:a.kind===`user`?a.text:``,answer:r,done:i?.kind===`turn-done`?i:null,toolUses:n.filter(e=>e.kind===`tool`).length}},[z.items]),fe=(0,h.useMemo)(()=>z.items.filter(e=>e.kind===`turn-done`).length,[z.items]);(0,h.useEffect)(()=>{re(e),M(null)},[e,fe]);let H=t.find(e=>e.id===I?.seatId)??null,pe=(0,h.useMemo)(()=>V?.question?l(V.question).kind:`code`,[V?.question]),U=(0,h.useMemo)(()=>{if(!V?.question||!I)return null;let e=F.adviseWith({...l(`review: ${V.question}`),kind:`review`,task:`review`},null);return e?te(I.engine,[...e.choice?[e.choice]:[],...e.alternatives]):null},[F,V?.question,I]),W=(0,h.useRef)(!1);(0,h.useEffect)(()=>{let t=_.get(e);if(!t||r||!V?.done||!I||W.current||V.question.trim()!==t.text.trim())return;_.delete(e);let n=ee({text:V.answer,ok:V.done.ok,classification:t.cls,toolUses:V.toolUses});if(!n.escalate){u({seatId:I.seatId,kind:t.cls.kind,signal:`draft-accepted`,sessionId:e}),O({text:`Answered on ${t.localLabel} — ${n.reasons[0]?.replace(/\.$/,``).toLowerCase()??`the draft reads complete`}; no paid seat was used.`,error:!1});return}let i=F.adviseWith({...t.cls,difficulty:`high`},null),a=[...i?.choice?[i.choice]:[],...i?.alternatives??[]].find(e=>!e.local)??null;if(!a){O({text:`The local draft looks weak (${n.reasons.join(` `).replace(/\.$/,``)}), and no frontier seat can take it right now.`,error:!0});return}W.current=!0,O({text:`Escalating to ${a.label}: ${n.reasons.join(` `)}`,error:!1}),ne(c,{source:I,target:y(a),question:t.text,draft:V.answer,verdict:n,draftLabel:t.localLabel,kind:t.cls.kind}).catch(e=>{O({text:`Escalation failed: ${e instanceof Error?e.message:`request failed`}`,error:!0})}).finally(()=>{W.current=!1})},[V,r,I,e,F]);let G=L?.choice?.seatId??null,K=(0,h.useCallback)(async e=>{if(C===`off`||!I)return`send-here`;let t=l(e,{contextTokens:I.usage?.contextTokens??0});try{t=(await ie({text:e,sessionId:I.id,contextTokens:I.usage?.contextTokens??0})).classification}catch{}let n=F.adviseWith(t,null),r=T?F.adviseWith(t,T):n,i=r?.choice??null;if(!i)return r&&O({text:r.why,error:!1}),`send-here`;if(!T&&i.seatId!==G&&i.seatId===I.seatId)return G!==null&&O({text:`Read as ${t.label}${t.decidedBy===`jev`?` (Jev)`:``}, so it stays on ${i.label}.`,error:!1}),C===`cheap-first`&&i.local&&_.set(I.id,{text:e,cls:t,localLabel:i.label}),`send-here`;if(!T&&i.seatId!==G)return E(i.seatId),O({text:`${r.why} Press Send again to go there, or pick another seat.`,error:!1}),`held`;let a=T&&n?.choice&&n.choice.seatId!==T?{seatId:n.choice.seatId}:null;if(i.seatId===I.seatId)return a&&u({seatId:a.seatId,kind:t.kind,signal:`auto-overridden`}),C===`cheap-first`&&i.local&&_.set(I.id,{text:e,cls:t,localLabel:i.label}),`send-here`;O({text:`Continuing on ${i.label} with a handoff note…`,error:!1});try{let n=await s(c,{source:I,target:y(i),text:e,kind:t.kind,overridden:a});return C===`cheap-first`&&i.local&&_.set(n.id,{text:e,cls:t,localLabel:i.label}),m(n.id,C),`handled`}catch(e){return O({text:`Could not move this to ${i.label}: ${e instanceof Error?e.message:`request failed`}. Your message is still here.`,error:!0}),`held`}},[C,I,F,T,G]);(0,h.useEffect)(()=>(x(K),()=>x(null)),[K,x]);function me(t){w(t),m(e,t),O(null)}function q(t){I&&!j&&(M(t),u({seatId:I.seatId,kind:pe,signal:t,sessionId:e,model:I.model}))}async function J(e){A(!0);try{let t=await ae(e);O(t.ok?{text:`Warm and resident${t.tokPerSec?` — ${t.tokPerSec} tok/s`:``}${t.loadMs?` (loaded in ${(t.loadMs/1e3).toFixed(1)} s)`:``}.`,error:!1}:{text:t.error??`Could not warm the model.`,error:!0})}catch(e){O({text:e instanceof Error?e.message:`Could not warm the model.`,error:!0})}finally{A(!1)}}let Y=n.trim()||V?.question||``,X=H?.engine===`local`?H.id:L?.choice?.local?L.choice.seatId:null,Z=X?R?.local.find(e=>e.seatId===X)??null:null,Q=n.trim().length>0,$=!Q&&!r&&V?.done?.ok===!0&&V.answer.length>0,he=L?[...L.choice?[L.choice]:[],...L.alternatives]:[];return(0,g.jsxs)(`div`,{className:d.bar,role:`group`,"aria-label":`Models`,children:[(0,g.jsx)(`select`,{className:d.select,"aria-label":`Auto seat`,value:C,onChange:e=>me(e.target.value),title:`Auto picks the seat per message; Cheap-first lets local models draft and escalates only when needed`,children:se.map(e=>(0,g.jsx)(`option`,{value:e,children:le[e]},e))}),Q&&C!==`off`?(0,g.jsx)(ue,{advice:L,pinned:T,options:he,held:L?.held??[],waiting:R===null,onPin:e=>E(e===`auto`?null:e)}):null,$&&I?(0,g.jsxs)(`span`,{className:`${d.group} ${d.grow}`,children:[(0,g.jsxs)(`span`,{className:d.why,children:[H?.label??I.seatId,` answered.`]}),(0,g.jsx)(`button`,{type:`button`,className:d.iconButton,"aria-label":`Good answer`,"aria-pressed":j===`up`,disabled:j!==null,onClick:()=>q(`up`),children:(0,g.jsx)(v,{})}),(0,g.jsx)(`button`,{type:`button`,className:d.iconButton,"aria-label":`Bad answer`,"aria-pressed":j===`down`,disabled:j!==null,onClick:()=>q(`down`),children:(0,g.jsx)(v,{down:!0})}),U?(0,g.jsxs)(`button`,{type:`button`,className:d.chip,onClick:()=>P({mode:`review`,reviewer:U}),title:`Ask ${U.label} (a different model family) to review this answer — one turn on ${U.label}`,children:[`Review with `,U.label]}):null]}):null,!Q&&!$?(0,g.jsx)(`span`,{className:d.grow}):null,(0,g.jsx)(`button`,{type:`button`,className:d.chip,disabled:!Y||r||!I||R===null,onClick:()=>P({mode:`compare`,prompt:Y}),title:Q?`Send this message to 2–3 seats side by side`:`Ask other seats the last question, side by side`,children:`Compare`}),R?.localOnly.on?(0,g.jsx)(`span`,{className:`${d.chip} ${d.chipWarn}`,title:R.localOnly.reason??void 0,children:`Local-only repo`}):null,Z?(0,g.jsxs)(`span`,{className:`${d.group}`,children:[(0,g.jsxs)(`span`,{className:`${d.chip} ${Z.private?d.chipPrivate:``}`,title:Z.tokPerSecSource===`turn`?`Speed measured end to end on the last local turn (a floor)`:`Speed measured by the warm-up (generation only)`,children:[Z.private?`On this Mac · private`:`Local runtime`,Z.contextWindow?` · ${a(Z.contextWindow)} ctx`:``,Z.tokPerSec?` · ${Z.tokPerSec} tok/s`:``]}),(0,g.jsx)(`button`,{type:`button`,className:d.chip,disabled:k,onClick:()=>{J(Z.seatId)},title:`Load the model now and keep it resident, so the next turn starts at once`,children:k?`Warming…`:`Warm up`})]}):null,B&&B.sessions.length>0?(0,g.jsxs)(`span`,{className:d.meter,title:de(B),children:[B.sessions.length>1?`${new Set(B.sessions.map(e=>e.seatId)).size} seats · `:``,a(B.totals.inputTokens+B.totals.outputTokens),` tok`,B.totals.listUsd>0?` · ≈${b(B.totals.listUsd)}`:``,B.totals.savedUsd>0?` · saved ≈${b(B.totals.savedUsd)}`:``]}):null,D?(0,g.jsx)(`span`,{className:`${d.notice} ${D.error?d.noticeError:``}`,role:D.error?`alert`:`status`,children:D.text}):null,N&&I?(0,g.jsx)(h.Suspense,{fallback:null,children:(0,g.jsx)(ce,{source:I,seats:t,advisorSeats:F.advisorSeats,advice:N.mode===`compare`&&N.prompt===n.trim()?L:F.adviseWith(l(N.mode===`compare`?N.prompt:V?.question??``),null),...N.mode===`compare`?{mode:`compare`,prompt:N.prompt}:{mode:`review`,reviewer:N.reviewer,question:V?.question??null,answer:V?.answer??``,authorLabel:H?.label??I.seatId},onStarted:()=>{N.mode===`compare`&&N.prompt===n.trim()&&S(n)},onClose:()=>P(null)})}):null]})}function ue({advice:e,pinned:t,options:n,held:r,waiting:i,onPin:a}){if(i)return(0,g.jsx)(`span`,{className:`${d.why} ${d.grow}`,children:`Checking whether this repo may leave this Mac…`});if(!e)return(0,g.jsx)(`span`,{className:`${d.why} ${d.grow}`,children:`Reading your message…`});let o=t?n.find(e=>e.seatId===t)??null:null;return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`span`,{className:`${d.why} ${e.stay&&!o?d.whyStay:``} ${d.grow}`,title:e.factors.join(`
|
|
5
|
+
`),children:o?`${o.label} — you picked it for this message; ${o.note}.`:e.why}),n.length>1||r.length>0?(0,g.jsxs)(`select`,{className:d.select,"aria-label":`Send this message to`,value:t??`auto`,onChange:e=>a(e.target.value),children:[(0,g.jsx)(`option`,{value:`auto`,children:e.choice?`Auto: ${e.choice.label}`:`Auto`}),n.map(e=>(0,g.jsxs)(`option`,{value:e.seatId,children:[e.label,` — `,e.note]},e.seatId)),r.map(e=>(0,g.jsxs)(`option`,{value:e.seatId,disabled:!0,children:[e.label,` — `,e.reason.replace(/\.$/,``).toLowerCase()]},e.seatId))]}):null]})}function de(e){let t=e.sessions.map(e=>`${e.relation===`root`?`This chat`:e.relation}: ${e.title} — ${a(e.inputTokens+e.outputTokens)} tok${e.local?` (local, free)`:e.listUsd===null?``:` ≈${b(e.listUsd)}`}`),n=e.seats.map(e=>`${e.label}: ${e.window??`no reading`}${e.fleetShare?` — ${e.fleetShare}`:``}`);return[...t,``,...n,``,`Budget mode: ${e.budgetMode}.`,e.note].join(`
|
|
6
|
+
`)}function S(){_.clear()}export{x as MultiModelBar,x as default,S as resetPendingDraftsForTest};
|
|
7
|
+
//# sourceMappingURL=MultiModelBar-BhAUUQOq.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/multimodel/MultiModelBar.tsx"],"sourcesContent":["/**\n * routes/verse/multimodel/MultiModelBar.tsx — one line above the composer box\n * that makes every seat work together (3.16):\n *\n * [Auto ▾] Codex — review; 62% of its 5-hour window left. [Send to: Auto ▾] Compare ≈$1.24 · saved $0.30\n * [Auto ▾] Codex answered. [up] [down] Review with Claude Max Compare On this Mac · private · 42 tok/s\n *\n * - AUTO: while Mason types, the pure advisor (core/verse/multimodel) names the\n * seat for THIS message and the one reason, over the seat list the app\n * already polls. \"Send to\" overrides it for this message. On Enter the\n * decision layer labels the message once (rules if it cannot), and a message\n * bound for another seat continues the conversation there with the\n * zero-spend handoff note. A label that changes the seat is shown first,\n * never sent silently.\n * - CHEAP-FIRST: local models draft; when the draft is weak (escalation.ts)\n * the conversation escalates to the best frontier seat on its own, with the\n * draft quoted. Savings show in the meter.\n * - COMPARE / REVIEW: the same prompt to 2–3 seats side by side, or one\n * cross-family reviewer on the last answer (CompareDialog, lazy).\n * - LEARNING: thumbs, overrides, switches, Compare picks and escalations are\n * recorded as outcomes the advisor learns from.\n * - LOCAL: when the chat or the Auto choice is a local model, its badge says\n * what it is — on this Mac, private, context, measured speed — with Warm up.\n * - METER: what this chat has used across every seat it touched.\n *\n * Lazy-loaded by the Composer (never on the first-paint path). Every turn it\n * causes goes through the ordinary session routes (multimodel-flows.ts).\n */\nimport { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { VerseSeat } from '../../../data/api-types.js';\nimport { classifyPrompt } from '../../../../core/verse/multimodel/classify.js';\nimport { crossFamilyReviewer } from '../../../../core/verse/multimodel/compare.js';\nimport { assessDraft } from '../../../../core/verse/multimodel/escalation.js';\nimport type { ChatMeter, PromptClassification, SeatAdvice, SeatAdviceOption } from '../../../../core/verse/multimodel/types.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { useVerseTranscript } from '../useVerseTranscript.js';\nimport { formatTokens } from '../verse-readouts.js';\nimport { DEFAULT_FLOW_API, escalate, routeMessage, type FlowTarget } from './multimodel-flows.js';\nimport { chatMeterQuery, invalidateChatMeter, labelPromptRemote, recordOutcome, warmLocalSeat } from './multimodel-queries.js';\nimport { AUTO_PREFS, loadAutoPref, saveAutoPref, useAutoSeat, type AutoPref } from './useAutoSeat.js';\nimport styles from './multimodel.module.css';\n\nconst CompareDialog = lazy(async () => ({ default: (await import('./CompareDialog.js')).CompareDialog }));\n\n/** What the Composer does with a message: send it itself, or the bar already did (or held it). */\nexport type SendRoute = 'send-here' | 'handled' | 'held';\nexport type SendInterceptor = (text: string) => Promise<SendRoute>;\n\nexport interface MultiModelBarProps {\n sessionId: string;\n seats: readonly VerseSeat[];\n text: string;\n running: boolean;\n /** The Composer asks this before every send (null = unregister). */\n registerInterceptor(fn: SendInterceptor | null): void;\n /** A flow used the draft (Compare): clear the box as if it had been sent. */\n onConsumeDraft(text: string): void;\n}\n\nconst PREF_LABEL: Record<AutoPref, string> = { off: 'Auto off', auto: 'Auto', 'cheap-first': 'Cheap-first' };\n\ninterface PendingDraft {\n text: string;\n cls: PromptClassification;\n localLabel: string;\n}\n/**\n * Cheap-first drafts waiting for their turn to end, by chat id. Module scope\n * on purpose: an Auto re-route opens a NEW chat, whose composer (and bar) is\n * a new instance — the pending draft must survive that remount.\n */\nconst pendingDrafts = new Map<string, PendingDraft>();\n\nfunction Thumb({ down = false }: { down?: boolean }) {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"\n style={down ? { transform: 'rotate(180deg)' } : undefined}>\n <path d=\"M5 7v7H2.5V7H5Zm0 0 3-5c1 0 1.8.8 1.6 1.8L9.2 6.5h3.6c.9 0 1.5.8 1.3 1.6l-1.1 4.6c-.2.8-.9 1.3-1.7 1.3H5\" />\n </svg>\n );\n}\n\nfunction target(o: SeatAdviceOption): FlowTarget {\n return { seatId: o.seatId, model: o.model, label: o.label, engine: o.engine };\n}\n\nfunction money(usd: number): string {\n return usd >= 10 ? `$${usd.toFixed(0)}` : usd >= 0.1 ? `$${usd.toFixed(2)}` : usd > 0 ? '<$0.10' : '$0';\n}\n\nexport function MultiModelBar({ sessionId, seats, text, running, registerInterceptor, onConsumeDraft }: MultiModelBarProps) {\n const [pref, setPref] = useState<AutoPref>(() => loadAutoPref(sessionId));\n const [pinned, setPinned] = useState<string | null>(null);\n const [notice, setNotice] = useState<{ text: string; error: boolean } | null>(null);\n const [warming, setWarming] = useState(false);\n const [rated, setRated] = useState<'up' | 'down' | null>(null);\n const [dialog, setDialog] = useState<null | { mode: 'compare'; prompt: string } | { mode: 'review'; reviewer: SeatAdviceOption }>(null);\n const auto = useAutoSeat({ sessionId, seats, text, pref, pinnedSeatId: null });\n const { session, advice, context } = auto;\n const transcript = useVerseTranscript(sessionId);\n const meter = useQuery(chatMeterQuery(sessionId)).data ?? null;\n\n // A pin is for one message: cleared when the box empties.\n useEffect(() => { if (!text.trim()) setPinned(null); }, [text]);\n\n // ---- the last exchange (for feedback, review, cheap-first) --------------\n const last = useMemo(() => {\n const items = transcript.items;\n let userIndex = -1;\n for (let i = items.length - 1; i >= 0; i -= 1) if (items[i]!.kind === 'user') { userIndex = i; break; }\n if (userIndex === -1) return null;\n const after = items.slice(userIndex + 1);\n const answer = after.flatMap((it) => (it.kind === 'assistant' ? [it.text] : [])).join('\\n\\n');\n const done = after.find((it) => it.kind === 'turn-done');\n const user = items[userIndex]!;\n return {\n turnId: user.kind === 'user' ? user.turnId : '',\n question: user.kind === 'user' ? user.text : '',\n answer,\n done: done?.kind === 'turn-done' ? done : null,\n toolUses: after.filter((it) => it.kind === 'tool').length,\n };\n }, [transcript.items]);\n const doneCount = useMemo(() => transcript.items.filter((it) => it.kind === 'turn-done').length, [transcript.items]);\n useEffect(() => { invalidateChatMeter(sessionId); setRated(null); }, [sessionId, doneCount]);\n\n const currentSeat = seats.find((s) => s.id === session?.seatId) ?? null;\n const lastKind = useMemo(() => (last?.question ? classifyPrompt(last.question).kind : 'code'), [last?.question]);\n\n // Rank reviewers for the last answer with the advisor itself (review work).\n const reviewer = useMemo(() => {\n if (!last?.question || !session) return null;\n const ranked = auto.adviseWith({ ...classifyPrompt(`review: ${last.question}`), kind: 'review', task: 'review' }, null);\n if (!ranked) return null;\n return crossFamilyReviewer(session.engine, [...(ranked.choice ? [ranked.choice] : []), ...ranked.alternatives]);\n }, [auto, last?.question, session]);\n\n // ---- cheap-first: assess the local draft when its turn ends --------------\n const escalating = useRef(false);\n useEffect(() => {\n const pending = pendingDrafts.get(sessionId);\n if (!pending || running || !last?.done || !session || escalating.current) return;\n if (last.question.trim() !== pending.text.trim()) return;\n pendingDrafts.delete(sessionId);\n const verdict = assessDraft({ text: last.answer, ok: last.done.ok, classification: pending.cls, toolUses: last.toolUses });\n if (!verdict.escalate) {\n void recordOutcome({ seatId: session.seatId, kind: pending.cls.kind, signal: 'draft-accepted', sessionId });\n setNotice({ text: `Answered on ${pending.localLabel} — ${verdict.reasons[0]?.replace(/\\.$/, '').toLowerCase() ?? 'the draft reads complete'}; no paid seat was used.`, error: false });\n return;\n }\n // The best frontier seat for this message, as if it had been hard.\n const frontier = auto.adviseWith({ ...pending.cls, difficulty: 'high' }, null);\n const pick = [...(frontier?.choice ? [frontier.choice] : []), ...(frontier?.alternatives ?? [])].find((o) => !o.local) ?? null;\n if (!pick) {\n setNotice({ text: `The local draft looks weak (${verdict.reasons.join(' ').replace(/\\.$/, '')}), and no frontier seat can take it right now.`, error: true });\n return;\n }\n escalating.current = true;\n setNotice({ text: `Escalating to ${pick.label}: ${verdict.reasons.join(' ')}`, error: false });\n void escalate(DEFAULT_FLOW_API, {\n source: session, target: target(pick), question: pending.text, draft: last.answer, verdict, draftLabel: pending.localLabel, kind: pending.cls.kind,\n }).catch((err: unknown) => {\n setNotice({ text: `Escalation failed: ${err instanceof Error ? err.message : 'request failed'}`, error: true });\n }).finally(() => { escalating.current = false; });\n }, [last, running, session, sessionId, auto]);\n\n // ---- the send interceptor ------------------------------------------------\n const shownChoice = advice?.choice?.seatId ?? null;\n const intercept = useCallback<SendInterceptor>(async (message) => {\n if (pref === 'off' || !session) return 'send-here';\n const rules = classifyPrompt(message, { contextTokens: session.usage?.contextTokens ?? 0 });\n let cls: PromptClassification = rules;\n try {\n cls = (await labelPromptRemote({ text: message, sessionId: session.id, contextTokens: session.usage?.contextTokens ?? 0 })).classification;\n } catch { /* rules it is — labelling never blocks a send */ }\n const unpinned = auto.adviseWith(cls, null);\n const final = pinned ? auto.adviseWith(cls, pinned) : unpinned;\n const choice = final?.choice ?? null;\n if (!choice) {\n if (final) setNotice({ text: final.why, error: false });\n return 'send-here';\n }\n if (!pinned && choice.seatId !== shownChoice && choice.seatId === session.seatId) {\n // Read differently, but the answer is \"stay\": the safe direction — no move, no handoff. Said, then sent.\n if (shownChoice !== null) setNotice({ text: `Read as ${cls.label}${cls.decidedBy === 'jev' ? ' (Jev)' : ''}, so it stays on ${choice.label}.`, error: false });\n if (pref === 'cheap-first' && choice.local) pendingDrafts.set(session.id, { text: message, cls, localLabel: choice.label });\n return 'send-here';\n }\n if (!pinned && choice.seatId !== shownChoice) {\n // The decision layer read it differently from the line on screen (or\n // Enter beat the line) and would MOVE it somewhere not shown: show,\n // never surprise.\n setPinned(choice.seatId);\n setNotice({ text: `${final!.why} Press Send again to go there, or pick another seat.`, error: false });\n return 'held';\n }\n const overridden = pinned && unpinned?.choice && unpinned.choice.seatId !== pinned ? { seatId: unpinned.choice.seatId } : null;\n if (choice.seatId === session.seatId) {\n if (overridden) void recordOutcome({ seatId: overridden.seatId, kind: cls.kind, signal: 'auto-overridden' });\n if (pref === 'cheap-first' && choice.local) pendingDrafts.set(session.id, { text: message, cls, localLabel: choice.label });\n return 'send-here';\n }\n setNotice({ text: `Continuing on ${choice.label} with a handoff note…`, error: false });\n try {\n const created = await routeMessage(DEFAULT_FLOW_API, { source: session, target: target(choice), text: message, kind: cls.kind, overridden });\n if (pref === 'cheap-first' && choice.local) pendingDrafts.set(created.id, { text: message, cls, localLabel: choice.label });\n saveAutoPref(created.id, pref);\n return 'handled';\n } catch (err) {\n setNotice({ text: `Could not move this to ${choice.label}: ${err instanceof Error ? err.message : 'request failed'}. Your message is still here.`, error: true });\n return 'held';\n }\n }, [pref, session, auto, pinned, shownChoice]);\n\n useEffect(() => {\n registerInterceptor(intercept);\n return () => registerInterceptor(null);\n }, [intercept, registerInterceptor]);\n\n // ---- actions -------------------------------------------------------------\n function changePref(next: AutoPref) {\n setPref(next);\n saveAutoPref(sessionId, next);\n setNotice(null);\n }\n\n function rate(signal: 'up' | 'down') {\n if (!session || rated) return;\n setRated(signal);\n void recordOutcome({ seatId: session.seatId, kind: lastKind, signal, sessionId, model: session.model });\n }\n\n async function warm(seatId: string) {\n setWarming(true);\n try {\n const r = await warmLocalSeat(seatId);\n setNotice(r.ok\n ? { text: `Warm and resident${r.tokPerSec ? ` — ${r.tokPerSec} tok/s` : ''}${r.loadMs ? ` (loaded in ${(r.loadMs / 1000).toFixed(1)} s)` : ''}.`, error: false }\n : { text: r.error ?? 'Could not warm the model.', error: true });\n } catch (err) {\n setNotice({ text: err instanceof Error ? err.message : 'Could not warm the model.', error: true });\n } finally {\n setWarming(false);\n }\n }\n\n const comparePrompt = text.trim() || last?.question || '';\n const localSeatId = currentSeat?.engine === 'local' ? currentSeat.id : advice?.choice?.local ? advice.choice.seatId : null;\n const badge = localSeatId ? context?.local.find((b) => b.seatId === localSeatId) ?? null : null;\n const typing = text.trim().length > 0;\n const showFeedback = !typing && !running && last?.done?.ok === true && last.answer.length > 0;\n const options: SeatAdviceOption[] = advice ? [...(advice.choice ? [advice.choice] : []), ...advice.alternatives] : [];\n\n return (\n <div className={styles.bar} role=\"group\" aria-label=\"Models\">\n <select className={styles.select} aria-label=\"Auto seat\" value={pref} onChange={(e) => changePref(e.target.value as AutoPref)}\n title=\"Auto picks the seat per message; Cheap-first lets local models draft and escalates only when needed\">\n {AUTO_PREFS.map((p) => <option key={p} value={p}>{PREF_LABEL[p]}</option>)}\n </select>\n\n {typing && pref !== 'off' ? (\n <AdviceLine advice={advice} pinned={pinned} options={options} held={advice?.held ?? []}\n waiting={context === null} onPin={(id) => setPinned(id === 'auto' ? null : id)} />\n ) : null}\n\n {showFeedback && session ? (\n <span className={`${styles.group} ${styles.grow}`}>\n <span className={styles.why}>{currentSeat?.label ?? session.seatId} answered.</span>\n <button type=\"button\" className={styles.iconButton} aria-label=\"Good answer\" aria-pressed={rated === 'up'} disabled={rated !== null} onClick={() => rate('up')}><Thumb /></button>\n <button type=\"button\" className={styles.iconButton} aria-label=\"Bad answer\" aria-pressed={rated === 'down'} disabled={rated !== null} onClick={() => rate('down')}><Thumb down /></button>\n {reviewer ? (\n <button type=\"button\" className={styles.chip} onClick={() => setDialog({ mode: 'review', reviewer })}\n title={`Ask ${reviewer.label} (a different model family) to review this answer — one turn on ${reviewer.label}`}>\n Review with {reviewer.label}\n </button>\n ) : null}\n </span>\n ) : null}\n\n {!typing && !showFeedback ? <span className={styles.grow} /> : null}\n\n <button type=\"button\" className={styles.chip} disabled={!comparePrompt || running || !session || context === null}\n onClick={() => setDialog({ mode: 'compare', prompt: comparePrompt })}\n title={typing ? 'Send this message to 2–3 seats side by side' : 'Ask other seats the last question, side by side'}>\n Compare\n </button>\n\n {context?.localOnly.on ? (\n <span className={`${styles.chip} ${styles.chipWarn}`} title={context.localOnly.reason ?? undefined}>Local-only repo</span>\n ) : null}\n\n {badge ? (\n <span className={`${styles.group}`}>\n <span className={`${styles.chip} ${badge.private ? styles.chipPrivate : ''}`}\n title={badge.tokPerSecSource === 'turn' ? 'Speed measured end to end on the last local turn (a floor)' : 'Speed measured by the warm-up (generation only)'}>\n {badge.private ? 'On this Mac · private' : 'Local runtime'}\n {badge.contextWindow ? ` · ${formatTokens(badge.contextWindow)} ctx` : ''}\n {badge.tokPerSec ? ` · ${badge.tokPerSec} tok/s` : ''}\n </span>\n <button type=\"button\" className={styles.chip} disabled={warming} onClick={() => { void warm(badge.seatId); }}\n title=\"Load the model now and keep it resident, so the next turn starts at once\">\n {warming ? 'Warming…' : 'Warm up'}\n </button>\n </span>\n ) : null}\n\n {meter && meter.sessions.length > 0 ? (\n <span className={styles.meter} title={meterTitle(meter)}>\n {meter.sessions.length > 1 ? `${new Set(meter.sessions.map((s) => s.seatId)).size} seats · ` : ''}\n {formatTokens(meter.totals.inputTokens + meter.totals.outputTokens)} tok\n {meter.totals.listUsd > 0 ? ` · ≈${money(meter.totals.listUsd)}` : ''}\n {meter.totals.savedUsd > 0 ? ` · saved ≈${money(meter.totals.savedUsd)}` : ''}\n </span>\n ) : null}\n\n {notice ? <span className={`${styles.notice} ${notice.error ? styles.noticeError : ''}`} role={notice.error ? 'alert' : 'status'}>{notice.text}</span> : null}\n\n {dialog && session ? (\n <Suspense fallback={null}>\n <CompareDialog\n source={session}\n seats={seats}\n advisorSeats={auto.advisorSeats}\n advice={dialog.mode === 'compare' && dialog.prompt === text.trim() ? advice : auto.adviseWith(classifyPrompt(dialog.mode === 'compare' ? dialog.prompt : last?.question ?? ''), null)}\n {...(dialog.mode === 'compare'\n ? { mode: 'compare' as const, prompt: dialog.prompt }\n : { mode: 'review' as const, reviewer: dialog.reviewer, question: last?.question ?? null, answer: last?.answer ?? '', authorLabel: currentSeat?.label ?? session.seatId })}\n onStarted={() => { if (dialog.mode === 'compare' && dialog.prompt === text.trim()) onConsumeDraft(text); }}\n onClose={() => setDialog(null)} />\n </Suspense>\n ) : null}\n </div>\n );\n}\n\nfunction AdviceLine({ advice, pinned, options, held, waiting, onPin }: {\n advice: SeatAdvice | null;\n pinned: string | null;\n options: readonly SeatAdviceOption[];\n held: ReadonlyArray<{ seatId: string; label: string; reason: string }>;\n waiting: boolean;\n onPin(id: string): void;\n}) {\n if (waiting) return <span className={`${styles.why} ${styles.grow}`}>Checking whether this repo may leave this Mac…</span>;\n if (!advice) return <span className={`${styles.why} ${styles.grow}`}>Reading your message…</span>;\n const pinnedOption = pinned ? options.find((o) => o.seatId === pinned) ?? null : null;\n return (\n <>\n <span className={`${styles.why} ${advice.stay && !pinnedOption ? styles.whyStay : ''} ${styles.grow}`} title={advice.factors.join('\\n')}>\n {pinnedOption ? `${pinnedOption.label} — you picked it for this message; ${pinnedOption.note}.` : advice.why}\n </span>\n {options.length > 1 || held.length > 0 ? (\n <select className={styles.select} aria-label=\"Send this message to\" value={pinned ?? 'auto'} onChange={(e) => onPin(e.target.value)}>\n <option value=\"auto\">{advice.choice ? `Auto: ${advice.choice.label}` : 'Auto'}</option>\n {options.map((o) => <option key={o.seatId} value={o.seatId}>{o.label} — {o.note}</option>)}\n {held.map((h) => <option key={h.seatId} value={h.seatId} disabled>{h.label} — {h.reason.replace(/\\.$/, '').toLowerCase()}</option>)}\n </select>\n ) : null}\n </>\n );\n}\n\nfunction meterTitle(meter: ChatMeter): string {\n const lines = meter.sessions.map((s) => `${s.relation === 'root' ? 'This chat' : s.relation}: ${s.title} — ${formatTokens(s.inputTokens + s.outputTokens)} tok${s.local ? ' (local, free)' : s.listUsd !== null ? ` ≈${money(s.listUsd)}` : ''}`);\n const seats = meter.seats.map((s) => `${s.label}: ${s.window ?? 'no reading'}${s.fleetShare ? ` — ${s.fleetShare}` : ''}`);\n return [...lines, '', ...seats, '', `Budget mode: ${meter.budgetMode}.`, meter.note].join('\\n');\n}\n\nexport default MultiModelBar;\n\n/** Test seam: forget pending cheap-first drafts. */\nexport function resetPendingDraftsForTest(): void {\n pendingDrafts.clear();\n}\n\n"],"file":"MultiModelBar-BhAUUQOq.js"}
|
|
@@ -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{c as i}from"./global-w7KDTTi0.js";import{t as a}from"./Dialog-DDHg9cuT.js";var o=t(r(),1),s={body:`_body_1kukj_1`,form:`_form_1kukj_8`,label:`_label_1kukj_14`,inputRow:`_inputRow_1kukj_19`,input:`_input_1kukj_19`,reveal:`_reveal_1kukj_40`,error:`_error_1kukj_51`,actions:`_actions_1kukj_56`,cancel:`_cancel_1kukj_63`,submit:`_submit_1kukj_72`},c=e({MutationTokenDialog:()=>d}),l=n(),u=/^[a-f0-9]{64}$/;function d({open:e,onClose:t,onUnlocked:n,reason:r,tokenLabel:c=`Mutation token`,tokenHelp:d=`the mutation token ashlr serve printed`}){let{setToken:f}=i(),[p,m]=(0,o.useState)(``),[h,g]=(0,o.useState)(!1),[_,v]=(0,o.useState)(null),y=(0,o.useRef)(null),b=(0,o.useId)(),x=(0,o.useId)();function S(e){e.preventDefault();let r=p.trim();if(!u.test(r)){v(`Expected 64 hex characters — ${d}.`);return}f(r),m(``),v(null),t(),n?.()}return(0,l.jsxs)(a,{open:e,onClose:t,titleId:b,title:`Unlock actions`,initialFocusRef:y,children:[(0,l.jsxs)(`p`,{className:s.body,children:[r??`This action mutates the fleet and requires the dispatch token.`,` It is held in memory only, for this browser tab, and is cleared automatically after 20 minutes idle.`]}),(0,l.jsxs)(`form`,{onSubmit:S,className:s.form,noValidate:!0,children:[(0,l.jsx)(`label`,{htmlFor:x,className:s.label,children:c}),(0,l.jsxs)(`div`,{className:s.inputRow,children:[(0,l.jsx)(`input`,{ref:y,id:x,type:h?`text`:`password`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,className:s.input,value:p,onChange:e=>m(e.target.value),"aria-invalid":_?!0:void 0,placeholder:`64 hex characters`}),(0,l.jsx)(`button`,{type:`button`,className:s.reveal,onClick:()=>g(e=>!e),"aria-pressed":h,children:h?`Hide`:`Show`})]}),_?(0,l.jsx)(`p`,{className:s.error,role:`alert`,children:_}):null,(0,l.jsxs)(`div`,{className:s.actions,children:[(0,l.jsx)(`button`,{type:`button`,className:s.cancel,onClick:t,children:`Cancel`}),(0,l.jsx)(`button`,{type:`submit`,className:s.submit,disabled:p.trim().length===0,children:`Unlock`})]})]})]})}export{c as n,d as t};
|
|
2
|
+
//# sourceMappingURL=MutationTokenDialog-DlY2VLVh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MutationTokenDialog-DlY2VLVh.js","names":[],"sources":["../../../../../../src/web-ui/components/auth/MutationTokenDialog.module.css","../../../../../../src/web-ui/components/auth/MutationTokenDialog.tsx"],"sourcesContent":[".body {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n margin-bottom: var(--space-4);\n}\n\n.form {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.label {\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n}\n\n.inputRow {\n display: flex;\n gap: var(--space-2);\n}\n\n.input {\n flex: 1;\n padding: var(--space-3);\n border-radius: var(--radius-md);\n border: 1px solid var(--border-default);\n background: var(--bg-input);\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n min-width: 0;\n}\n\n.input:focus-visible {\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n\n.reveal {\n padding: 0 var(--space-3);\n border-radius: var(--radius-md);\n border: 1px solid var(--border-default);\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n.reveal:hover {\n background: var(--bg-hover);\n}\n\n.error {\n color: var(--status-danger-fg);\n font-size: var(--text-sm-size);\n}\n\n.actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--space-2);\n margin-top: var(--space-3);\n}\n\n.cancel {\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-md);\n color: var(--text-secondary);\n}\n.cancel:hover {\n background: var(--bg-hover);\n}\n\n.submit {\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-md);\n background: var(--accent-500);\n color: var(--text-on-accent);\n font-weight: var(--font-weight-medium);\n}\n.submit:hover:not(:disabled) {\n background: var(--accent-600);\n}\n.submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n","/**\n * components/auth/MutationTokenDialog.tsx — replaces window.prompt() for\n * the mutation token (foundation brief item 5, the \"biggest reason\n * operators abandon the UI for the CLI\" finding). A focus-managed dialog\n * instead of a blocking native prompt, and a session-scoped hold (see\n * auth-store.ts) so approving 12 proposals is one paste, not twelve.\n *\n * The token is NEVER written to localStorage/sessionStorage/cookies — only\n * held in an in-memory module variable in auth-store.ts, cleared on tab\n * close, idle timeout, or the explicit \"Lock\" action here.\n */\nimport { useId, useRef, useState, type FormEvent } from 'react';\nimport { Dialog } from '../primitives/Dialog.js';\nimport { useMutationHold } from '../../data/hooks.js';\nimport styles from './MutationTokenDialog.module.css';\n\nconst TOKEN_RE = /^[a-f0-9]{64}$/;\n\nexport interface MutationTokenDialogProps {\n open: boolean;\n onClose: () => void;\n onUnlocked?: () => void;\n /** Human context for why the token is being requested right now. */\n reason?: string;\n /** Scoped consoles can name their own startup token without changing the hold. */\n tokenLabel?: string;\n tokenHelp?: string;\n}\n\nexport function MutationTokenDialog({ open, onClose, onUnlocked, reason, tokenLabel = 'Mutation token',\n tokenHelp = 'the mutation token ashlr serve printed' }: MutationTokenDialogProps) {\n const { setToken } = useMutationHold();\n const [value, setValue] = useState('');\n const [reveal, setReveal] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const titleId = useId();\n const inputId = useId();\n\n function submit(e: FormEvent) {\n e.preventDefault();\n const trimmed = value.trim();\n if (!TOKEN_RE.test(trimmed)) {\n setError(`Expected 64 hex characters — ${tokenHelp}.`);\n return;\n }\n setToken(trimmed);\n setValue('');\n setError(null);\n onClose();\n onUnlocked?.();\n }\n\n return (\n <Dialog open={open} onClose={onClose} titleId={titleId} title=\"Unlock actions\" initialFocusRef={inputRef}>\n <p className={styles.body}>\n {reason ?? 'This action mutates the fleet and requires the dispatch token.'} It is held in\n memory only, for this browser tab, and is cleared automatically after 20 minutes idle.\n </p>\n <form onSubmit={submit} className={styles.form} noValidate>\n <label htmlFor={inputId} className={styles.label}>\n {tokenLabel}\n </label>\n <div className={styles.inputRow}>\n <input\n ref={inputRef}\n id={inputId}\n type={reveal ? 'text' : 'password'}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n className={styles.input}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n aria-invalid={error ? true : undefined}\n placeholder=\"64 hex characters\"\n />\n <button\n type=\"button\"\n className={styles.reveal}\n onClick={() => setReveal((r) => !r)}\n aria-pressed={reveal}\n >\n {reveal ? 'Hide' : 'Show'}\n </button>\n </div>\n {error ? (\n <p className={styles.error} role=\"alert\">\n {error}\n </p>\n ) : null}\n <div className={styles.actions}>\n <button type=\"button\" className={styles.cancel} onClick={onClose}>\n Cancel\n </button>\n <button type=\"submit\" className={styles.submit} disabled={value.trim().length === 0}>\n Unlock\n </button>\n </div>\n </form>\n </Dialog>\n );\n}\n"],"mappings":"0eCgBM,EAAW,iBAajB,SAAgB,EAAoB,CAAE,OAAM,UAAS,aAAY,SAAQ,aAAa,iBACpF,YAAY,0CAAsE,CAClF,GAAM,CAAE,YAAa,EAAgB,EAC/B,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAS,EAAE,EAC/B,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,EAAK,EACpC,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAwB,IAAI,EAChD,GAAA,EAAW,EAAA,OAAA,CAAyB,IAAI,EACxC,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAU,EAAA,MAAA,CAAM,EAEtB,SAAS,EAAO,EAAc,CAC5B,EAAE,eAAe,EACjB,IAAM,EAAU,EAAM,KAAK,EAC3B,GAAI,CAAC,EAAS,KAAK,CAAO,EAAG,CAC3B,EAAS,gCAAgC,EAAU,EAAE,EACrD,MACF,CACA,EAAS,CAAO,EAChB,EAAS,EAAE,EACX,EAAS,IAAI,EACb,EAAQ,EACR,IAAa,CACf,CAEA,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAc,OAAe,UAAkB,UAAS,MAAM,iBAAiB,gBAAiB,EAAhG,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAArB,SAAA,CACG,GAAU,iEAAiE,uGAE3E,CACH,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,SAAU,EAAQ,UAAW,EAAO,KAAM,WAAA,GAAhD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,QAAS,EAAS,UAAW,EAAO,MACxC,SAAA,CACI,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,IAAK,EACL,GAAI,EACJ,KAAM,EAAS,OAAS,WACxB,aAAa,MACb,YAAY,MACZ,WAAY,GACZ,UAAW,EAAO,MACX,QACP,SAAW,GAAM,EAAS,EAAE,OAAO,KAAK,EACxC,eAAc,EAAQ,GAAO,IAAA,GAC7B,YAAY,mBACb,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAO,OAClB,YAAe,EAAW,GAAM,CAAC,CAAC,EAClC,eAAc,EAEb,SAAA,EAAS,OAAS,MACb,CAAA,CACL,IACJ,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAC9B,SAAA,CACA,CAAA,EACD,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,OAAQ,QAAS,EAAS,SAAA,QAE1D,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,OAAQ,SAAU,EAAM,KAAK,CAAC,CAAC,SAAW,EAAG,SAAA,QAE7E,CAAA,CACL,GACD,CACA,CAAA,CAAA,GAEZ"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EvidenceTimeline-YmKIoxNx.js","assets/context-model-DYkDKK6C.js","assets/transient-events-nTLhMBND.js","assets/Sheet-Bk64-Hlt.js","assets/cloud-model-CzKeuxfm.js","assets/global-1SED_aTT.css","assets/StatusBadge-BVi0IBb9.css","assets/Button-DrnKsvnQ.css","assets/Sheet-ChxlNivX.css","assets/EvidenceTimeline-PBDAiSuG.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,o as n,s as r,t as i}from"./index-BC5Uslm5.js";import{C as a,M as o,T as s,a as c,i as l,l as u,n as d,t as f,u as p}from"./global-w7KDTTi0.js";import{t as m}from"./focus-trap-BZeH0rVB.js";import{t as h}from"./Epistemic-tp0ZNAKZ.js";import{n as g}from"./StatusBadge-Yz7S3kZ2.js";import{h as ee}from"./queries-PgZlvFqO.js";import{r as te,t as ne}from"./mutations-CdLi0erM.js";import{t as re}from"./MutationTokenDialog-DlY2VLVh.js";import{t as _}from"./ConfirmDialog-CdCzzk0I.js";import{r as v}from"./RouteErrorBoundary-BaJ1ZePy.js";import{t as y}from"./RefreshIndicator-D96C9qiH.js";import{a as b,i as x}from"./SkipToContent-BynsXs9i.js";import{t as S}from"./DiffViewer-hJK75qko.js";import{I as C,P as w,R as ie,S as T,b as E,d as D,gt as ae,j as O,w as k}from"./VerseConsoleApp-DjPpZLo1.js";import{F as A,H as j,O as M,R as oe,dt as N,k as P,z as F}from"./VerseShared-Bf-XTHCh.js";import{n as se}from"./verse-bootstrap-query-B3vFD9XK.js";import{n as ce}from"./open-terminal-request-BT1UE0fz.js";import{y as I}from"./format-V6IiIMAL.js";import{n as le,t as L}from"./Button-CstSJwha.js";import{T as ue,l as de}from"./icons-C3G-y5j2.js";import{c as fe}from"./verse-icons-vSkflmRB.js";import{o as pe}from"./command-catalog-B0ApAGD0.js";import{l as me,r as R}from"./types-IYKrYLku.js";import{a as z,n as he}from"./types-BGCo0sbt.js";import{i as ge}from"./leader-focus-C6LVWgYI.js";import{n as _e,r as ve,t as ye}from"./resolved-store-UYN2k9My.js";import{n as be,r as B,t as xe}from"./needs-you-actions-B2tjWO-0.js";import{C as V,S as H,_ as Se,a as Ce,b as U,c as W,d as we,f as Te,g as G,h as Ee,l as De,m as Oe,n as K,o as ke,p as Ae,r as q,s as J,u as je,v as Me,w as Ne,x as Pe,y as Fe}from"./needs-you-model-DL9EEd2L.js";import"./guarded-action-J9umcJgI.js";import{i as Y,n as Ie,r as Le,t as Re}from"./NeedsYouList-CI_Dy-hi.js";var X=e(r(),1),ze=e(n(),1),Z={layout:`_layout_141uy_8`,listPane:`_listPane_141uy_9`,detailPane:`_detailPane_141uy_10`,filters:`_filters_141uy_12`,filterField:`_filterField_141uy_13`,filterLabel:`_filterLabel_141uy_14`,filterSelect:`_filterSelect_141uy_31`,count:`_count_141uy_46`,rows:`_rows_141uy_48`,row:`_row_141uy_48`,rowActive:`_rowActive_141uy_63`,riskRule:`_riskRule_141uy_68`,rowTitle:`_rowTitle_141uy_72`,rowMeta:`_rowMeta_141uy_73`,rowMetaMono:`_rowMetaMono_141uy_82`,rowAge:`_rowAge_141uy_83`,riskWord:`_riskWord_141uy_84`,detail:`_detail_141uy_10`,detailHead:`_detailHead_141uy_91`,eyebrow:`_eyebrow_141uy_92`,detailTitle:`_detailTitle_141uy_95`,project:`_project_141uy_109`,runFacts:`_runFacts_141uy_110`,diffStats:`_diffStats_141uy_112`,runSource:`_runSource_141uy_113`,hint:`_hint_141uy_114`,detailMeta:`_detailMeta_141uy_115`,summary:`_summary_141uy_117`,block:`_block_141uy_119`,blockTitle:`_blockTitle_141uy_120`,defs:`_defs_141uy_129`,muted:`_muted_141uy_133`,failedChecks:`_failedChecks_141uy_134`,actions:`_actions_141uy_136`,actionNote:`_actionNote_141uy_137`,reject:`_reject_141uy_138`,approve:`_approve_141uy_139`,decided:`_decided_141uy_155`,empty:`_empty_141uy_157`,emptyStrong:`_emptyStrong_141uy_158`,error:`_error_141uy_159`,skeletons:`_skeletons_141uy_160`},Q=t(),Be={"judge-ship-would-merge":{label:`Ship (would merge)`,tone:`success`},"judge-ship-review-required":{label:`Ship (review required)`,tone:`success`},"judge-review":{label:`Review`,tone:`warning`},"judge-noise":{label:`Noise`,tone:`neutral`},"judge-harmful":{label:`Harmful`,tone:`danger`},"judge-verdict-unrecognized":{label:`Unrecognized verdict`,tone:`unknown`},"judge-parse-failure":{label:`Judge parse failure — not a review`,tone:`unknown`},"judge-network-failure":{label:`Judge network failure — not a review`,tone:`unknown`}};function Ve(e){let t=e.filter(e=>e.action===`judged`&&e.judgeReasonCode);return t.length===0?null:t.reduce((e,t)=>Date.parse(t.ts)>Date.parse(e.ts)?t:e)}function He({id:e,dispatchEnabled:t,onDispatchDisabled:n,onDecided:r}){let i=u(ee(e)),[a,o]=(0,X.useState)(null),[c,l]=(0,X.useState)(!1),[f,p]=(0,X.useState)(!1),[m,v]=(0,X.useState)(!1),[b,C]=(0,X.useState)(null);function w(e){C(null),o(e),p(!0)}function ie(){l(!1),s()?(p(!0),E()):o(null)}function T(){if(a){if(!s()){p(!1),l(!0);return}E()}}async function E(){if(a){v(!0),C(null);try{a===`approve`?await ne(e):await te(e),p(!1),o(null),r()}catch(e){e instanceof d?(p(!1),o(null),n()):C(A(e))}finally{v(!1)}}}if(i.status===`loading`)return(0,Q.jsxs)(`div`,{className:Z.detail,children:[(0,Q.jsx)(x,{width:`55%`}),(0,Q.jsx)(x,{width:`30%`}),(0,Q.jsx)(x,{width:`88%`})]});if(i.status===`error`||!i.data)return(0,Q.jsx)(`p`,{className:Z.error,role:`alert`,children:i.error?.message??`Could not load this proposal.`});let D=i.data,ae=D.decisionEvidence,O=Ve(ae?.decisions??[]),k=O?.judgeReasonCode?Be[O.judgeReasonCode]:null,j=D.status===`pending`&&t,M=G(D),oe=Oe(D.kind,D.repo),N=V(D.title),P=Ne(D.repo),F=Pe(D.summary),se=F?F.rest:D.summary?I(D.summary):null;return(0,Q.jsxs)(`div`,{className:Z.detail,children:[(0,Q.jsxs)(`header`,{className:Z.detailHead,children:[(0,Q.jsxs)(`p`,{className:Z.eyebrow,children:[Me(D.kind),N.eyebrow?` \u00b7 ${N.eyebrow}`:``]}),(0,Q.jsx)(`h3`,{className:Z.detailTitle,title:D.title,children:N.text}),(0,Q.jsxs)(`div`,{className:Z.detailMeta,children:[(0,Q.jsx)(g,{status:D.status}),P?(0,Q.jsx)(`span`,{className:Z.project,title:D.repo??void 0,children:P}):(0,Q.jsx)(`span`,{children:`no repository`}),(0,Q.jsx)(`span`,{children:D.riskClass?`${D.riskClass} risk`:`risk unstated`}),M?(0,Q.jsx)(`code`,{title:`The model that produced this change`,children:M}):null,(0,Q.jsxs)(`span`,{title:Fe(D.createdAt),children:[`created `,U(D.createdAt)]}),D.decidedAt?(0,Q.jsxs)(`span`,{title:Fe(D.decidedAt),children:[`decided `,U(D.decidedAt)]}):null,i.status===`refreshing`?(0,Q.jsx)(y,{}):null]}),F?(0,Q.jsxs)(`p`,{className:Z.runFacts,children:[(0,Q.jsx)(`span`,{className:Z.diffStats,"aria-hidden":`true`,children:Se(F)}),(0,Q.jsx)(`span`,{className:`visually-hidden`,children:Ee(F)}),(0,Q.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,Q.jsxs)(`span`,{className:Z.runSource,title:F.sourceHint??void 0,children:[F.partial?`Partial · `:``,F.sourceLabel]}),M===null?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,Q.jsx)(`code`,{title:`The model that produced this change`,children:F.model})]}):null]}):null,se?(0,Q.jsx)(`p`,{className:Z.summary,children:se}):null]}),(0,Q.jsxs)(`section`,{className:Z.block,"aria-label":`Evidence`,children:[(0,Q.jsx)(`h4`,{className:Z.blockTitle,children:`Evidence`}),(0,Q.jsxs)(`dl`,{className:Z.defs,children:[(0,Q.jsx)(`dt`,{children:`Judge verdict`}),(0,Q.jsx)(`dd`,{children:(0,Q.jsx)(h,{quality:ae?.sourceQuality,label:`judge verdict`,children:k&&O?.judgeReasonCode?(0,Q.jsx)(g,{status:O.judgeReasonCode,tone:k.tone,children:k.label}):(0,Q.jsx)(`span`,{className:Z.muted,children:`not yet judged`})})}),(0,Q.jsx)(`dt`,{children:`Verification`}),(0,Q.jsx)(`dd`,{children:D.verifyResult?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(g,{status:D.verifyResult.passed?`success`:`failed`,children:D.verifyResult.passed?`passed`:`failed`}),D.verifyResult.ran&&D.verifyResult.ran.length>0?(0,Q.jsxs)(`span`,{className:Z.muted,children:[` · ran `,D.verifyResult.ran.map(e=>e.kind).join(`, `)]}):null,!D.verifyResult.passed&&D.verifyResult.failureCategory&&D.verifyResult.failureCategory!==`code`?(0,Q.jsxs)(`span`,{className:Z.muted,children:[` · `,D.verifyResult.failureCategory,` failure — the verifier itself, not the diff`]}):null,D.verifyResult.failed&&D.verifyResult.failed.length>0?(0,Q.jsxs)(`p`,{className:Z.failedChecks,children:[`failed: `,D.verifyResult.failed.join(`, `)]}):null]}):(0,Q.jsx)(`span`,{className:Z.muted,children:`not verified`})}),D.decisionReason?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Decision reason`}),(0,Q.jsx)(`dd`,{children:I(D.decisionReason)})]}):null,D.evidenceOutcome?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Gates`}),(0,Q.jsxs)(`dd`,{className:Z.muted,children:[D.evidenceOutcome.gateCount??0,` gate`,D.evidenceOutcome.gateCount===1?``:`s`,D.evidenceOutcome.policyAction?` · policy ${D.evidenceOutcome.policyAction}`:``,D.evidenceOutcome.trustBasis?` · trust ${D.evidenceOutcome.trustBasis}`:``]})]}):null,D.result?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Result`}),(0,Q.jsx)(`dd`,{children:I(D.result)})]}):null]})]}),(0,Q.jsxs)(`section`,{className:Z.block,"aria-label":`Provenance`,children:[(0,Q.jsx)(`h4`,{className:Z.blockTitle,children:`Provenance`}),(0,Q.jsxs)(`dl`,{className:Z.defs,children:[(0,Q.jsx)(`dt`,{children:`Produced by`}),(0,Q.jsx)(`dd`,{children:M?(0,Q.jsx)(`code`,{children:M}):(0,Q.jsx)(`span`,{className:Z.muted,children:`unknown engine`})}),(0,Q.jsx)(`dt`,{children:`Origin`}),(0,Q.jsx)(`dd`,{children:D.origin}),F?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`How it was made`}),(0,Q.jsxs)(`dd`,{children:[(0,Q.jsx)(`span`,{title:F.sourceHint??void 0,children:F.sourceLabel}),F.sourceHint?(0,Q.jsx)(`p`,{className:Z.hint,children:F.sourceHint}):null]})]}):null,D.repo?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Repository`}),(0,Q.jsx)(`dd`,{children:(0,Q.jsx)(`code`,{children:D.repo})})]}):null,D.workItemId?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Work item`}),(0,Q.jsx)(`dd`,{children:(0,Q.jsx)(`code`,{children:D.workItemId})})]}):null,D.runId?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Run`}),(0,Q.jsx)(`dd`,{children:(0,Q.jsx)(`code`,{children:D.runId})})]}):null,(0,Q.jsx)(`dt`,{children:`Attestation`}),(0,Q.jsxs)(`dd`,{className:Z.muted,children:[D.producerProvenanceSig?`signed by the sandboxed producer (v${D.producerProvenanceVersion??2})`:D.provenanceSig?`legacy signature present`:`unsigned — earns no positive routing credit`,D.diffHash?` · diff hashed at signing time`:``]})]})]}),(0,Q.jsxs)(`section`,{className:Z.block,"aria-label":`Diff`,children:[(0,Q.jsx)(`h4`,{className:Z.blockTitle,children:`Diff`}),(0,Q.jsx)(S,{diff:D.diff,proposalKind:D.kind})]}),D.status===`pending`?(0,Q.jsxs)(`footer`,{className:Z.actions,children:[(0,Q.jsx)(`p`,{className:Z.actionNote,children:t?oe:`Read-only session — approve and reject are unavailable without dispatch.`}),b&&!f?(0,Q.jsx)(`p`,{className:Z.error,role:`alert`,children:b}):null,(0,Q.jsx)(`button`,{type:`button`,className:Z.reject,disabled:!j||m,onClick:()=>w(`reject`),children:`Reject`}),(0,Q.jsx)(`button`,{type:`button`,className:Z.approve,disabled:!j||m,onClick:()=>w(`approve`),children:`Approve…`})]}):(0,Q.jsxs)(`footer`,{className:Z.decided,children:[`This proposal is already `,(0,Q.jsx)(`strong`,{children:D.status}),` — no further action is available.`]}),(0,Q.jsx)(re,{open:c,onClose:ie,reason:a===`approve`?`Approving a proposal writes to a real repository and requires the dispatch token.`:`Rejecting a proposal requires the dispatch token.`,tokenHelp:`the mutation token ashlr verse printed`}),(0,Q.jsx)(_,{open:f,onClose:()=>{p(!1),o(null),C(null)},title:a===`approve`?`Approve this ${D.kind} against ${P??`the repository`}?`:`Reject this proposal?`,body:a===`approve`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`strong`,{children:N.text}),(0,Q.jsx)(`br`,{}),Me(D.kind),` · `,(0,Q.jsx)(`strong`,{children:P??`unknown repository`}),D.repo?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`br`,{}),(0,Q.jsx)(`code`,{children:D.repo})]}):null,(0,Q.jsx)(`br`,{}),(0,Q.jsx)(`br`,{}),oe,H(D.kind)?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`br`,{}),(0,Q.jsx)(`br`,{}),`This one leaves your machine.`]}):null]}):(0,Q.jsxs)(Q.Fragment,{children:[`This rejects `,(0,Q.jsx)(`strong`,{children:N.text}),` and discards it. It stays in history as rejected and is never applied.`]}),confirmLabel:a===`approve`?`Approve and ${H(D.kind)?`open the pull request`:`apply`}`:`Reject`,destructive:a===`approve`,busy:m,error:b,onConfirm:T})]})}var Ue=`verse-cloud-previews`,We=`${me}/previews`,Ge=`${z}/previews`,$={cloud:`fleet:owner-lane-pr:cloud-`,devin:`fleet:owner-lane-pr:devin-`};function Ke(e){return e.startsWith($.cloud)||e.startsWith($.devin)}var qe=/^(?:fleet:owner-lane-pr|chats:chat-failed):(cloud|devin)-([^:]+)$/;function Je(e){let t=qe.exec(e);if(!t)return null;let n=t[1],r=t[2];return(n===`cloud`?R:he).test(r)?{lane:n,taskId:r}:null}var Ye=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function Xe(e){return Ye(e)&&typeof e.id==`string`&&typeof e.ok==`boolean`&&typeof e.text==`string`}function Ze(e){return Ye(e)&&typeof e.itemId==`string`&&typeof e.headSha==`string`&&typeof e.wouldAutoLand==`boolean`&&typeof e.reason==`string`&&Array.isArray(e.checks)&&e.checks.every(Xe)}function Qe(e,t){let n=new Map,r=Ye(e)?e.previews:void 0;if(!Array.isArray(r))return n;for(let e of r)Ze(e)&&(!t||e.itemId.startsWith($[t]))&&n.set(e.itemId,e);return n}var $e=new Map;async function et(e,t,n){try{return Qe(await l(e,n),t)}catch(e){if(e instanceof f&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return $e}}var tt={key:Ue,fetch:async e=>{let[t,n]=await Promise.all([et(We,`cloud`,e),et(Ge,`devin`,e)]);return n.size===0?t:t.size===0?n:new Map([...t,...n])}};function nt(e,t){return!t||!rt(e,t)?null:t.wouldAutoLand?{tone:`clean`,label:`Clean`,why:null,title:t.reason}:{tone:`held`,label:`Held`,why:t.checks.find(e=>!e.ok)?.text??null,title:t.reason}}function rt(e,t){let n=e.actions.find(e=>e.request!==null&&typeof e.request.body.headSha==`string`);return n?n.request.body.headSha===t.headSha:!1}function it(e,t){return e.filter(e=>{let n=t.get(e.id);return n!==void 0&&n.wouldAutoLand&&rt(e,n)&&q(e,`approve`)!==null})}function at(e,t){let n=q(t[0],e)?.label??e,r=t.length;return{title:`${n} ${r} ${t.every(e=>e.subject.pr!==null)?r===1?`pull request`:`pull requests`:r===1?`item`:`items`}?`,confirmLabel:`${n} ${r}`,verb:n}}function ot(e,t,n){let r=e.filter(e=>{let n=q(e,t);return n?.request!=null&&N(n.request.path)});if(r.length===0)return n.toast(`None of the selected items can do that.`,`neutral`),!1;let i=at(t,r),s=r.slice(0,3).map(e=>e.subject.pr?`#${e.subject.pr}`:`“${W(e).text}”`),l=r.length>3?`${s.join(`, `)} and ${r.length-3} more`:s.join(`, `),u=r.some(e=>q(e,t)?.destructive===!0),d=new Set,p=[];return F({title:i.title,body:`${l}. Each runs on the exact commit it was checked on; one that moved since is refused, not changed.`,confirmLabel:i.confirmLabel,destructive:u,token:!0,tokenReason:`${i.verb} changes pull requests on GitHub and requires the dispatch token.`,run:async()=>{let e=a();if(!e)throw new f(`Mutation token was rejected.`,401,We);p=[];for(let n of r){if(d.has(n.id))continue;let r=q(n,t).request;try{await c(r.path,r.body,e),d.add(n.id),ye(n.id)}catch(e){if(e instanceof f&&e.status===401)throw e;p.push(`${n.subject.pr?`#${n.subject.pr}`:W(n).text}: ${A(e)}`)}}if(o(),d.size===0)throw Error(p.length===1?p[0]:`None went through. ${p[0]}`)},onDone:()=>{M(),n.onSettled?.([...d]);let e=`${i.verb}: ${d.size} of ${r.length} done.`;n.toast(p.length===0?e:`${e} ${p[0]}${p.length>1?` (+${p.length-1} more)`:``}`,p.length===0?`success`:`neutral`)}})}var st=(0,X.lazy)(()=>i(()=>import(`./EvidenceTimeline-YmKIoxNx.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))),ct={"drawer.approve":`approve`,"drawer.reject":`reject`,"drawer.veto":`veto`,"drawer.done":`done`};function lt(e){return e instanceof HTMLElement?e.isContentEditable||/^(INPUT|TEXTAREA|SELECT)$/.test(e.tagName):!1}function ut(){let e=D(),t=P(),n=v(),r=u(se),{compact:i}=ae(),a=ve(),o=(0,X.useId)(),s=(0,X.useRef)(null),c=(0,X.useRef)(null),l=(0,X.useRef)(null),[d,f]=(0,X.useState)(null),[h,g]=(0,X.useState)(null),[ee,te]=(0,X.useState)(!1),[ne,re]=(0,X.useState)(()=>Date.now()),[_,y]=(0,X.useState)(()=>new Set);(0,X.useEffect)(()=>{let e=setInterval(()=>re(Date.now()),15e3);return()=>clearInterval(e)},[]);let x=t.data,S=x?.needsYou;(0,X.useEffect)(()=>{S&&_e(new Set(S.map(e=>e.id)))},[S]);let w=(0,X.useMemo)(()=>(S??[]).filter(e=>!a.has(e.id)),[S,a]),T=e.needsYouSplit,A=(0,X.useMemo)(()=>ke(w,T),[w,T]),j=(0,X.useMemo)(()=>we(w),[w]),N=Te(x?.sources??null,T),F=(r.data?.dispatchEnabled??!0)&&!ee,I=u(tt,{freshMs:15e3}),L=p(tt),de=(0,X.useMemo)(()=>w.filter(e=>Ke(e.id)).map(e=>`${e.id}\u0000${e.detail??``}`).join(``),[w]),me=(0,X.useRef)(!0);(0,X.useEffect)(()=>{if(me.current){me.current=!1;return}de&&L()},[de,L]);let R=I.data??gt,z=(0,X.useMemo)(()=>{let e=new Map;for(let t of w){let n=nt(t,R.get(t.id));n&&e.set(t.id,n)}return e},[w,R]),he=(0,X.useMemo)(()=>it(A,R),[A,R]);(0,X.useEffect)(()=>{y(e=>{if(e.size===0)return e;let t=new Set([...e].filter(e=>A.some(t=>t.id===e)));return t.size===e.size?e:t})},[A]);let ge=(0,X.useCallback)(e=>{y(t=>{let n=new Set(t);return n.delete(e)||n.add(e),n})},[]),be=(0,X.useCallback)(()=>y(new Set),[]),B=e.needsYouFocus;(0,X.useEffect)(()=>{if(!B)return;let e=w.find(e=>e.id===B);e&&(f(e.id),g(e.id))},[B,w]),(0,X.useEffect)(()=>{if(A.length===0){d!==null&&f(null);return}(!d||!A.some(e=>e.id===d))&&f(A[0].id)},[A,d]);let V=h?w.find(e=>e.id===h)??null:null;(0,X.useEffect)(()=>{h&&!V&&g(null)},[h,V]);let H=(0,X.useCallback)(()=>g(null),[]),Se=(0,X.useCallback)(()=>{oe()||document.querySelector(`[aria-modal="true"]:not([data-verse-overlay])`)||(h?H():k())},[h,H]);m({open:!0,containerRef:s,onClose:Se,initialFocusRef:c});let U=(0,X.useRef)(!1);(0,X.useEffect)(()=>{h?(U.current=!0,l.current?.focus({preventScroll:!0})):U.current&&(U.current=!1,c.current?.focus({preventScroll:!0}))},[h]);let W=A.length>0;(0,X.useEffect)(()=>{if(!W||h)return;let e=document.activeElement;(e===null||e===document.body||e===s.current)&&c.current?.focus({preventScroll:!0})},[W,h]);let G=(0,X.useCallback)(e=>{let t=e.target;switch(t.kind){case`approval`:f(e.id),g(e.id);return;case`session`:k(),O(t.sessionId);return;case`section`:k(),ie(t.section,t.anchor);return;case`seat`:k(),ie(`apps`,`seat:${t.seatId}`);return;case`terminal`:k(),ce({tabId:t.tabId,blockId:null,sessionId:t.sessionId});return;case`url`:window.open(t.url,`_blank`,`noopener,noreferrer`);return;default:return}},[]),Ee=(0,X.useCallback)(e=>{e.target.kind===`terminal`?G(e):g(e.id)},[G]),De=(0,X.useCallback)((e,t)=>{let r=q(e,t);if(!r){n.show(`Nothing to ${t} on this item.`,`neutral`);return}if(pt(e,r)){mt(e);return}if(!F&&r.request){n.show("This server was started without dispatch — run `ashlr verse` to act.",`neutral`);return}xe(e,r,{openTarget:G,toast:n.show})},[F,G,n]),Oe=(0,X.useCallback)((e,t)=>{if(!F){n.show("This server was started without dispatch — run `ashlr verse` to act.",`neutral`);return}ot(e,t,{toast:n.show,onSettled:e=>y(t=>new Set([...t].filter(t=>!e.includes(t))))})},[F,n]);function Ae(e){if(A.length===0)return;let t=Math.max(0,A.findIndex(e=>e.id===d)),n=A[(t+e+A.length)%A.length];f(n.id),h&&g(n.id)}function J(e){let t=E.indexOf(T),n=E[(t+e+E.length)%E.length];C(n),g(null),be()}function je(e){if(e.defaultPrevented||lt(e.target)||!(e.target instanceof Node)||!s.current?.contains(e.target))return;let t=pe(e.nativeEvent,[`drawer`]);if(!t||t.id===`drawer.open`&&e.target instanceof HTMLButtonElement)return;e.preventDefault(),e.stopPropagation();let n=A.find(e=>e.id===(h??d))??null;switch(t.id){case`drawer.next`:Ae(1);return;case`drawer.prev`:Ae(-1);return;case`drawer.split-next`:J(1);return;case`drawer.split-prev`:J(-1);return;case`drawer.open`:n&&Ee(n);return;case`drawer.select`:n&&!h&&ge(n.id);return;default:{let e=ct[t.id];if(!e)return;let r=!h&&_.size>0?A.filter(e=>_.has(e.id)):[];r.length>0?Oe(r,e):n&&De(n,e)}}}let Me=!x&&(t.status===`loading`||t.status===`idle`),Ne=!x&&t.status===`unavailable`;return(0,ze.createPortal)((0,Q.jsx)(`div`,{className:Y.backdrop,onMouseDown:e=>e.target===e.currentTarget&&k(),children:(0,Q.jsxs)(`div`,{ref:s,role:`dialog`,"aria-modal":`true`,"aria-labelledby":o,className:Y.panel,"data-presentation":i?`full`:`side`,"data-verse-overlay":`needs-you`,"data-scope":`drawer`,tabIndex:-1,onKeyDown:je,children:[(0,Q.jsxs)(`header`,{className:Y.head,children:[(0,Q.jsxs)(`h2`,{id:o,className:Y.title,children:[`Needs you`,x?(0,Q.jsx)(`span`,{className:Y.titleCount,children:j.all}):null]}),(0,Q.jsx)(le,{variant:`ghost`,size:`sm`,icon:(0,Q.jsx)(ue,{}),"aria-label":`Close Needs you`,onClick:k})]}),(0,Q.jsx)(`div`,{role:`tablist`,"aria-label":`Splits`,className:Y.splits,onKeyDown:e=>{(e.key===`ArrowRight`||e.key===`ArrowLeft`)&&(e.preventDefault(),J(e.key===`ArrowRight`?1:-1))},children:E.map(e=>(0,Q.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":e===T,tabIndex:e===T?0:-1,className:Y.split,onClick:()=>{C(e),g(null)},children:[K[e],(0,Q.jsx)(`span`,{className:Y.splitCount,"aria-label":`${j[e]} items`,children:j[e]})]},e))}),!V&&(_.size>0||he.length>0)?(0,Q.jsx)(vt,{pickedItems:A.filter(e=>_.has(e.id)),landAll:he,dispatchEnabled:F,onRun:Oe,onClear:be}):null,(0,Q.jsxs)(`div`,{className:Y.body,children:[V?(0,Q.jsxs)(`div`,{ref:l,className:Y.detail,tabIndex:-1,"aria-label":`Item detail`,children:[(0,Q.jsxs)(`button`,{type:`button`,className:Y.back,onClick:H,children:[`‹ All `,K[T].toLowerCase()]}),V.target.kind===`approval`?(0,Q.jsx)(`div`,{className:Y.approval,children:(0,Q.jsx)(He,{id:V.target.proposalId,dispatchEnabled:F,onDispatchDisabled:()=>te(!0),onDecided:()=>{ye(V.id),M(),H()}},V.target.proposalId)}):(0,Q.jsx)(yt,{item:V,now:ne,seats:r.data?.seats??ht,onAct:De,onOpenTarget:G,dispatchEnabled:F,chip:z.get(V.id)??null,preview:z.has(V.id)?R.get(V.id)??null:null})]}):Me?(0,Q.jsxs)(`div`,{className:Y.loading,role:`status`,"aria-label":`Loading`,children:[(0,Q.jsx)(b,{}),(0,Q.jsx)(b,{}),(0,Q.jsx)(b,{})]}):Ne?(0,Q.jsxs)(`div`,{className:Y.empty,children:[(0,Q.jsx)(`p`,{className:Y.emptyTitle,children:`Needs you isn't available on this server`}),(0,Q.jsx)(`p`,{className:Y.emptyBody,children:`This build does not report activity yet, so nothing here can be vouched for. Approvals still work from the inbox.`})]}):A.length===0?(0,Q.jsx)(dt,{coverageText:Ce(N),vouched:N.vouched,autonomyLabel:x?.autonomy?.label??null,split:T}):(0,Q.jsx)(Re,{ref:c,items:A,selectedId:d,onSelect:f,onOpen:e=>{f(e);let t=A.find(t=>t.id===e);t&&Ee(t)},now:ne,label:`${K[T]} needing you`,picked:_,onTogglePick:ge,chips:z}),A.length===0&&!V?(0,Q.jsx)(`div`,{ref:c,tabIndex:-1,className:Y.focusSink,"aria-hidden":`true`}):null]}),i?null:(0,Q.jsxs)(`footer`,{className:Y.foot,"aria-hidden":`true`,children:[(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`kbd`,{className:Y.key,children:`J`}),(0,Q.jsx)(`kbd`,{className:Y.key,children:`K`}),` move`]}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`kbd`,{className:Y.key,children:(0,Q.jsx)(fe,{})}),` open`]}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`kbd`,{className:Y.key,children:`A`}),` approve`]}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`kbd`,{className:Y.key,children:`R`}),` reject`]}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`kbd`,{className:Y.key,children:`V`}),` veto`]}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`kbd`,{className:Y.key,children:`E`}),` done`]}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`kbd`,{className:Y.key,children:`X`}),` pick`]}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`kbd`,{className:Y.key,children:`H`}),(0,Q.jsx)(`kbd`,{className:Y.key,children:`L`}),` splits`]})]}),!N.vouched&&A.length>0?(0,Q.jsxs)(`p`,{className:Y.caveat,role:`note`,children:[Ce(N),` — this list may be incomplete.`]}):null]})}),document.body)}function dt({vouched:e,coverageText:t,autonomyLabel:n,split:r}){return e?(0,Q.jsxs)(`div`,{className:Y.empty,"data-state":`clear`,children:[(0,Q.jsx)(`span`,{className:Y.clearMark,"aria-hidden":`true`}),(0,Q.jsx)(`p`,{className:Y.emptyTitle,children:`All clear`}),(0,Q.jsx)(`p`,{className:Y.emptyBody,children:n?`Fleet: ${n}.`:`Nothing is waiting on you.`})]}):(0,Q.jsxs)(`div`,{className:Y.empty,"data-state":`unknown`,children:[(0,Q.jsxs)(`p`,{className:Y.emptyTitle,children:[`Nothing to show`,r===`all`?``:` in ${K[r]}`,` — but it isn't an all-clear`]}),(0,Q.jsxs)(`p`,{className:Y.emptyBody,children:[t,`.`]})]})}var ft=e=>{switch(e.target.kind){case`session`:return`Open chat`;case`section`:return`Open ${w(e.target.section).label}`;case`seat`:return`Open Apps & Accounts`;case`terminal`:return`Open terminal`;case`url`:return`Open on GitHub`;default:return null}};function pt(e,t){return e.kind===`leader-question`&&t.kind===`fix`&&t.request===null}function mt(e){k(),ge({kind:`question`,questionId:B(e.id),text:be(e)})}var ht=[],gt=new Map;function _t(e){let t=new Map;for(let n of e)for(let e of n.actions){if(!e.request)continue;let n=t.get(e.kind);n?n.count+=1:t.set(e.kind,{label:e.label,destructive:e.destructive,count:1})}return[`approve`,`fix`,`reject`,`veto`,`resume`,`renew`,`done`].flatMap(e=>{let n=t.get(e);return n?[{kind:e,...n}]:[]})}function vt({pickedItems:e,landAll:t,dispatchEnabled:n,onRun:r,onClear:i}){if(e.length===0){let e=new Set(t.map(e=>e.id.startsWith($.devin)?`Devin`:`cloud`)),i=e.size===1?[...e][0]:null;return(0,Q.jsxs)(`div`,{className:Y.batch,role:`toolbar`,"aria-label":i?`${i===`cloud`?`Cloud`:`Devin`} pull requests`:`Pull requests`,children:[(0,Q.jsxs)(`span`,{className:Y.batchCount,children:[t.length,` clean `,i?`${i} `:``,t.length===1?`PR`:`PRs`]}),(0,Q.jsx)(L,{size:`sm`,variant:`primary`,disabled:!n,onClick:()=>r(t,`approve`),children:`Land all clean`})]})}let a=_t(e);return(0,Q.jsxs)(`div`,{className:Y.batch,role:`toolbar`,"aria-label":`Picked items`,children:[(0,Q.jsxs)(`span`,{className:Y.batchCount,children:[e.length,` picked`]}),a.map(t=>{let i=j[t.kind],a=t.count<e.length;return(0,Q.jsxs)(L,{size:`sm`,variant:t.destructive?`danger`:t.kind===`approve`?`primary`:`subtle`,disabled:!n,onClick:()=>r(e,t.kind),"aria-keyshortcuts":i,title:a?`${t.count} of ${e.length} picked can do this`:void 0,children:[t.label,a?` ${t.count}`:``,i?(0,Q.jsx)(`kbd`,{className:Y.inlineKey,"aria-hidden":`true`,children:i}):null]},t.kind)}),(0,Q.jsx)(L,{size:`sm`,variant:`ghost`,onClick:i,children:`Clear`})]})}function yt({item:e,now:t,seats:n,onAct:r,onOpenTarget:i,dispatchEnabled:a,chip:o,preview:s}){let c=ft(e),l=Je(e.id)?.taskId??null,[u,d]=(0,X.useState)(!1),f=J(e,t),p=e.subject.seatId?je(n,e.subject.seatId):null,m=f.run?De(n,f.run.model,e.subject.seatId):null;return(0,Q.jsxs)(`article`,{className:Y.item,children:[(0,Q.jsxs)(`header`,{className:Y.itemHead,children:[f.kindLabel?(0,Q.jsx)(`p`,{className:Y.rowKind,children:f.kindLabel}):null,(0,Q.jsx)(`h3`,{className:Y.itemTitle,title:f.fullTitle,children:f.title}),f.run?(0,Q.jsx)(Ie,{run:f.run}):null]}),f.detail?(0,Q.jsx)(`p`,{className:Y.itemDetail,children:f.detail}):null,o&&s?(0,Q.jsxs)(`section`,{className:Y.verdict,"aria-label":`Gate preview`,children:[(0,Q.jsxs)(`p`,{className:Y.verdictHead,children:[(0,Q.jsx)(Le,{chip:{...o,why:null}}),(0,Q.jsx)(`span`,{className:Y.mono,title:s.headSha,children:s.headSha.slice(0,7)})]}),(0,Q.jsx)(`ul`,{className:Y.checks,children:s.checks.map(e=>(0,Q.jsxs)(`li`,{"data-ok":e.ok?`true`:`false`,children:[(0,Q.jsx)(`span`,{className:Y.checkMark,"aria-hidden":`true`,children:e.ok?`✓`:`×`}),(0,Q.jsx)(`span`,{className:`visually-hidden`,children:e.ok?`Passes: `:`Fails: `}),e.text]},e.id))})]}):null,(0,Q.jsxs)(`dl`,{className:Y.defs,children:[f.repo?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Repo`}),(0,Q.jsx)(`dd`,{className:Y.repo,title:f.repoFull,children:f.repo})]}):null,e.subject.pr?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Pull request`}),(0,Q.jsxs)(`dd`,{children:[`#`,e.subject.pr]})]}):null,p?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Seat`}),(0,Q.jsx)(`dd`,{className:p.raw?void 0:Y.mono,title:p.raw,children:p.text})]}):null,m?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Model`}),(0,Q.jsx)(`dd`,{className:m.raw?void 0:Y.mono,title:m.raw,children:m.text})]}):null,(0,Q.jsx)(`dt`,{children:`Raised`}),(0,Q.jsx)(`dd`,{title:f.ageStamp,children:f.age}),e.expiresAt?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`dt`,{children:`Closes`}),(0,Q.jsx)(`dd`,{className:Y.deadline,children:Ae(e.expiresAt,t)})]}):null]}),(0,Q.jsxs)(`div`,{className:Y.itemActions,children:[e.kind===`leader-question`&&!e.actions.some(t=>pt(e,t))?(0,Q.jsx)(L,{variant:`primary`,size:`sm`,onClick:()=>mt(e),children:`Answer`}):null,c?(0,Q.jsx)(L,{variant:`subtle`,size:`sm`,onClick:()=>i(e),trailingIcon:e.target.kind===`url`?(0,Q.jsx)(de,{}):void 0,children:c}):null,l?(0,Q.jsx)(L,{variant:`subtle`,size:`sm`,"aria-haspopup":`dialog`,onClick:()=>d(!0),children:`Evidence`}):null,e.actions.map(t=>{let n=j[t.kind],i=t.request!==null,o=t.kind===`approve`||pt(e,t);return(0,Q.jsxs)(L,{size:`sm`,variant:t.destructive?`danger`:o?`primary`:`subtle`,disabled:i&&!a,onClick:()=>r(e,t.kind),"aria-keyshortcuts":n,children:[t.label,n?(0,Q.jsx)(`kbd`,{className:Y.inlineKey,"aria-hidden":`true`,children:n}):null]},t.kind)})]}),a?null:(0,Q.jsx)(`p`,{className:Y.caveat,children:"Read-only session — actions need `ashlr verse`."}),u&&l?(0,Q.jsx)(X.Suspense,{fallback:null,children:(0,Q.jsx)(st,{taskId:l,title:f.title,open:!0,onClose:()=>d(!1),now:t})}):null]})}export{ut as NeedsYouDrawer,T as VERSE_ANCHOR_EVENT};
|
|
3
|
+
//# sourceMappingURL=NeedsYouDrawer-BH0ffbht.js.map
|