@ashlr/hub 3.22.0 → 3.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +5 -5
- package/dist/authority-surface.json +16 -11
- package/dist/build-identity.json +2 -2
- package/dist/cli/verify-safety-sources.d.ts +4 -0
- package/dist/cli/verify-safety-sources.js +41 -0
- package/dist/cli/verify-safety-sources.js.map +1 -0
- package/dist/cli/verify-safety.js +16 -1
- package/dist/cli/verify-safety.js.map +1 -1
- package/dist/core/decide/needs-you.d.ts +3 -1
- package/dist/core/decide/needs-you.js +52 -28
- package/dist/core/decide/needs-you.js.map +1 -1
- package/dist/core/fleet/fleet-control-model.d.ts +2 -1
- package/dist/core/fleet/fleet-control-model.js +5 -0
- package/dist/core/fleet/fleet-control-model.js.map +1 -1
- package/dist/core/fleet/fleet-control-types.d.ts +11 -1
- package/dist/core/fleet/fleet-control.d.ts +4 -0
- package/dist/core/fleet/fleet-control.js +23 -1
- package/dist/core/fleet/fleet-control.js.map +1 -1
- package/dist/core/fleet/quota.js +1 -1
- package/dist/core/fleet/quota.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
- package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
- package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
- package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
- package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
- package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewMenu-B2A_YDPi.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/ReviewMenu.tsx"],"sourcesContent":["import { useLayoutEffect } from 'react';\nimport { ActionMenu, anchorBelow, type ActionMenuItem } from '../chat/ActionMenu.js';\nimport { getVerseUiState, setVerseSection, setVerseSidebarCollapsed } from '../verse-ui-store.js';\nimport { executeCatalogCommand } from './run-command.js';\nimport { workModeForSection, type WorkMode } from './work-mode.js';\n\n/** Shared tools retain the last visited job; choosing Review never activates it. */\nexport function currentReviewMode(): WorkMode {\n const ui = getVerseUiState();\n const current = workModeForSection(ui.section);\n if (current) return current;\n for (let i = ui.history.index; i >= 0; i--) {\n const section = ui.history.entries[i]?.section;\n const mode = section ? workModeForSection(section) : null;\n if (mode) return mode;\n }\n return 'with-me';\n}\n\nexport function ReviewMenu({ anchor, onClose }: { anchor: HTMLElement; onClose: () => void }) {\n // The floating chat list otherwise covers the menu at the sidebar's CSS\n // breakpoint. Collapse only that overlay before paint; keep desktop layout.\n useLayoutEffect(() => {\n if (window.matchMedia?.('(max-width: 760px)')?.matches === true) setVerseSidebarCollapsed(true);\n }, []);\n const mode = currentReviewMode();\n const chatOpen = getVerseUiState().activeSessionId !== null;\n const command = (id: string) => () => { executeCatalogCommand(id, { via: 'menu' }); };\n const items: ActionMenuItem[] = mode === 'with-me' ? [\n { id: 'changes', label: 'Chat changes', onSelect: command('dock.diff'), disabled: !chatOpen, reason: 'Open a chat to review its changes.' },\n { id: 'sources', label: 'Chat sources', onSelect: command('dock.sources'), disabled: !chatOpen, reason: 'Open a chat to review its sources.' },\n { id: 'usage', label: 'Usage', onSelect: command('section.usage') },\n ] : [\n { id: 'agents', label: 'Review agents', onSelect: command('surface.agents') },\n { id: 'needs-you', label: 'Needs you', onSelect: command('needs-you.open') },\n { id: 'decisions', label: 'Fleet decisions', description: 'Recorded decisions when available; otherwise view Fleet status.',\n onSelect: () => setVerseSection('fleet', 'shadow-decisions') },\n ];\n items.push({ id: 'wiki', label: 'Module map', separated: true, onSelect: command('section.wiki') });\n return <ActionMenu label=\"Review work\" items={items} anchor={anchorBelow(anchor)} returnFocus={anchor} onClose={onClose} />;\n}\n\n// Direct lazy loading avoids an eager named-export adapter in the shell.\nexport default ReviewMenu;\n"],"mappings":"yPAOA,SAAgB,GAA8B,CAC5C,IAAM,EAAK,EAAgB,EACrB,EAAU,EAAmB,EAAG,OAAO,EAC7C,GAAI,EAAS,OAAO,EACpB,IAAK,IAAI,EAAI,EAAG,QAAQ,MAAO,GAAK,EAAG,IAAK,CAC1C,IAAM,EAAU,EAAG,QAAQ,QAAQ,EAAE,EAAE,QACjC,EAAO,EAAU,EAAmB,CAAO,EAAI,KACrD,GAAI,EAAM,OAAO,CACnB,CACA,MAAO,SACT,CAEA,SAAgB,EAAW,CAAE,SAAQ,WAAyD,EAG5F,EAAA,EAAA,gBAAA,KAAsB,CAChB,OAAO,aAAa,oBAAoB,CAAC,EAAE,UAAY,IAAM,EAAyB,EAAI,CAChG,EAAG,CAAC,CAAC,EACL,IAAM,EAAO,EAAkB,EACzB,EAAW,EAAgB,CAAC,CAAC,kBAAoB,KACjD,EAAW,OAAqB,CAAE,EAAsB,EAAI,CAAE,IAAK,MAAO,CAAC,CAAG,EAC9E,EAA0B,IAAS,UAAY,CACnD,CAAE,GAAI,UAAW,MAAO,eAAgB,SAAU,EAAQ,WAAW,EAAG,SAAU,CAAC,EAAU,OAAQ,oCAAqC,EAC1I,CAAE,GAAI,UAAW,MAAO,eAAgB,SAAU,EAAQ,cAAc,EAAG,SAAU,CAAC,EAAU,OAAQ,oCAAqC,EAC7I,CAAE,GAAI,QAAS,MAAO,QAAS,SAAU,EAAQ,eAAe,CAAE,CACpE,EAAI,CACF,CAAE,GAAI,SAAU,MAAO,gBAAiB,SAAU,EAAQ,gBAAgB,CAAE,EAC5E,CAAE,GAAI,YAAa,MAAO,YAAa,SAAU,EAAQ,gBAAgB,CAAE,EAC3E,CAAE,GAAI,YAAa,MAAO,kBAAmB,YAAa,kEACxD,aAAgB,EAAgB,QAAS,kBAAkB,CAAE,CACjE,EAEA,OADA,EAAM,KAAK,CAAE,GAAI,OAAQ,MAAO,aAAc,UAAW,GAAM,SAAU,EAAQ,cAAc,CAAE,CAAC,GAC3F,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,MAAM,cAAqB,QAAO,OAAQ,EAAY,CAAM,EAAG,YAAa,EAAiB,SAAU,CAAA,CAC5H"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";var r=e(n(),1),i={region:`_region_1818x_1`,toast:`_toast_1818x_12`,"slide-in":`_slide-in_1818x_1`,success:`_success_1818x_27`,danger:`_danger_1818x_30`,dismiss:`_dismiss_1818x_34`},a=t(),o=(0,r.createContext)(null);function s(){let e=(0,r.useContext)(o);if(!e)throw Error(`useToast() called outside <ToastProvider>`);return e}var c=5e3;function l({children:e}){let[t,n]=(0,r.useState)([]),s=(0,r.useRef)(0),l=(0,r.useCallback)(e=>{n(t=>t.filter(t=>t.id!==e))},[]),u=(0,r.useCallback)((e,t=`neutral`)=>{let r=s.current++;n(n=>[...n,{id:r,message:e,tone:t}]),setTimeout(()=>l(r),c)},[l]),d=(0,r.useMemo)(()=>({show:u}),[u]);return(0,a.jsxs)(o.Provider,{value:d,children:[e,(0,a.jsx)(`div`,{className:i.region,role:`status`,"aria-live":`polite`,children:t.map(e=>(0,a.jsxs)(`div`,{className:`${i.toast} ${i[e.tone]}`,children:[(0,a.jsx)(`span`,{children:e.message}),(0,a.jsx)(`button`,{type:`button`,className:i.dismiss,onClick:()=>l(e.id),"aria-label":`Dismiss`,children:`×`})]},e.id))})]})}var u={wrap:`_wrap_1759l_1`,title:`_title_1759l_14`,detail:`_detail_1759l_21`,retry:`_retry_1759l_27`},d=class extends r.Component{state={error:null};static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error(`[ashlr] view crashed while rendering`,e,t.componentStack)}componentDidUpdate(e){this.state.error&&e.resetKey!==this.props.resetKey&&this.setState({error:null})}render(){return this.state.error?(0,a.jsxs)(`div`,{className:u.wrap,role:`alert`,children:[(0,a.jsx)(`p`,{className:u.title,children:`This view hit an error and couldn't render.`}),(0,a.jsxs)(`p`,{className:u.detail,children:[this.state.error.message||`Unknown error.`,` — the rest of ashlr is still working; pick another view from the sidebar, or retry this one.`]}),(0,a.jsx)(`button`,{type:`button`,className:u.retry,onClick:()=>this.setState({error:null}),children:`Retry this view`})]}):this.props.children}};export{l as n,s as r,d as t};
|
|
2
|
-
//# sourceMappingURL=RouteErrorBoundary-CVabFM97.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RouteErrorBoundary-CVabFM97.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Toast.module.css","../../../../../../src/web-ui/components/primitives/Toast.tsx","../../../../../../src/web-ui/components/primitives/RouteErrorBoundary.module.css","../../../../../../src/web-ui/components/primitives/RouteErrorBoundary.tsx"],"sourcesContent":[".region {\n position: fixed;\n bottom: var(--space-6);\n right: var(--space-6);\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n z-index: var(--z-toast);\n max-width: 360px;\n}\n\n.toast {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-3) var(--space-4);\n border-radius: var(--radius-md);\n box-shadow: var(--shadow-toast);\n font-size: var(--text-sm-size);\n animation: slide-in var(--duration-base) var(--ease-decelerate);\n border: 1px solid var(--border-default);\n background: var(--bg-surface-raised);\n color: var(--text-primary);\n}\n\n.success {\n border-color: var(--status-success-solid);\n}\n.danger {\n border-color: var(--status-danger-solid);\n}\n\n.dismiss {\n color: var(--text-tertiary);\n border-radius: var(--radius-xs);\n font-size: var(--text-lg-size);\n line-height: 1;\n padding: var(--space-1);\n}\n.dismiss {\n transition: color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);\n}\n.dismiss:hover {\n color: var(--text-primary);\n background: var(--bg-hover);\n}\n.dismiss:active {\n background: var(--bg-active);\n}\n\n@keyframes slide-in {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .toast {\n animation: none;\n }\n}\n\n:root[data-motion=\"reduce\"] .toast {\n animation: none;\n}\n","/**\n * components/primitives/Toast.tsx — app-wide notifications. A single\n * aria-live region so screen readers announce toasts once, not per-toast\n * duplicate regions.\n */\nimport { createContext, useCallback, useContext, useMemo, useRef, useState, type ReactNode } from 'react';\nimport styles from './Toast.module.css';\n\nexport type ToastTone = 'neutral' | 'success' | 'danger';\n\ninterface ToastItem {\n id: number;\n message: string;\n tone: ToastTone;\n}\n\ninterface ToastContextValue {\n show: (message: string, tone?: ToastTone) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nexport function useToast(): ToastContextValue {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error('useToast() called outside <ToastProvider>');\n return ctx;\n}\n\nconst AUTO_DISMISS_MS = 5000;\n\nexport function ToastProvider({ children }: { children: ReactNode }) {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const nextId = useRef(0);\n\n const dismiss = useCallback((id: number) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const show = useCallback(\n (message: string, tone: ToastTone = 'neutral') => {\n const id = nextId.current++;\n setToasts((prev) => [...prev, { id, message, tone }]);\n setTimeout(() => dismiss(id), AUTO_DISMISS_MS);\n },\n [dismiss],\n );\n\n const value = useMemo(() => ({ show }), [show]);\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <div className={styles.region} role=\"status\" aria-live=\"polite\">\n {toasts.map((t) => (\n <div key={t.id} className={`${styles.toast} ${styles[t.tone]}`}>\n <span>{t.message}</span>\n <button type=\"button\" className={styles.dismiss} onClick={() => dismiss(t.id)} aria-label=\"Dismiss\">\n ×\n </button>\n </div>\n ))}\n </div>\n </ToastContext.Provider>\n );\n}\n",".wrap {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-3);\n max-width: 640px;\n margin: var(--space-8) auto;\n padding: var(--space-6);\n border: 1px solid var(--status-danger-solid);\n border-radius: var(--radius-lg);\n background: var(--status-danger-bg);\n}\n\n.title {\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n font-weight: var(--font-weight-semibold);\n color: var(--status-danger-fg);\n}\n\n.detail {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n\n.retry {\n padding: var(--space-2) var(--space-4);\n border: 1px solid var(--status-danger-solid);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n color: var(--status-danger-fg);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n\n.retry:hover {\n background: var(--bg-hover);\n}\n","/**\n * components/primitives/RouteErrorBoundary.tsx — the last line of defense\n * against a view crashing on real-world data that doesn't match its\n * expected shape (see SwarmsView.tsx's `plan?.tasks` guard for a concrete\n * example: 2 of 80 real swarm records on this machine predate the `plan`\n * field entirely).\n *\n * React error boundaries can only be class components — there is no hook\n * equivalent. Wraps `<Outlet/>` in Shell.tsx, not the whole app: if one\n * routed view throws during render, the sidebar/topbar/command palette\n * survive and the operator can navigate to a working view instead of being\n * stuck on a permanently blank screen (DESIGN.md §11 point 4 — \"never a\n * full-page error, the shell stays usable\" — extended here to cover\n * uncaught render exceptions, not just query-status `'error'`).\n */\nimport { Component, type ErrorInfo, type ReactNode } from 'react';\nimport styles from './RouteErrorBoundary.module.css';\n\ninterface Props {\n children: ReactNode;\n /** Identity that, when changed, resets the boundary — pass the route pathname. */\n resetKey: string;\n}\n\ninterface State {\n error: Error | null;\n}\n\nexport class RouteErrorBoundary extends Component<Props, State> {\n override state: State = { error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { error };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo) {\n console.error('[ashlr] view crashed while rendering', error, info.componentStack);\n }\n\n override componentDidUpdate(prevProps: Props) {\n if (this.state.error && prevProps.resetKey !== this.props.resetKey) {\n this.setState({ error: null });\n }\n }\n\n override render() {\n if (this.state.error) {\n return (\n <div className={styles.wrap} role=\"alert\">\n <p className={styles.title}>This view hit an error and couldn't render.</p>\n <p className={styles.detail}>\n {this.state.error.message || 'Unknown error.'} — the rest of ashlr is still working; pick another view\n from the sidebar, or retry this one.\n </p>\n <button type=\"button\" className={styles.retry} onClick={() => this.setState({ error: null })}>\n Retry this view\n </button>\n </div>\n );\n }\n return this.props.children;\n }\n}\n"],"mappings":"6RCoBM,GAAA,EAAe,EAAA,cAAA,CAAwC,IAAI,EAEjE,SAAgB,GAA8B,CAC5C,IAAM,GAAA,EAAM,EAAA,WAAA,CAAW,CAAY,EACnC,GAAI,CAAC,EAAK,MAAU,MAAM,2CAA2C,EACrE,OAAO,CACT,CAEA,IAAM,EAAkB,IAExB,SAAgB,EAAc,CAAE,YAAqC,CACnE,GAAM,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAsB,CAAC,CAAC,EAC9C,GAAA,EAAS,EAAA,OAAA,CAAO,CAAC,EAEjB,GAAA,EAAU,EAAA,YAAA,CAAa,GAAe,CAC1C,EAAW,GAAS,EAAK,OAAQ,GAAM,EAAE,KAAO,CAAE,CAAC,CACrD,EAAG,CAAC,CAAC,EAEC,GAAA,EAAO,EAAA,YAAA,EACV,EAAiB,EAAkB,YAAc,CAChD,IAAM,EAAK,EAAO,UAClB,EAAW,GAAS,CAAC,GAAG,EAAM,CAAE,KAAI,UAAS,MAAK,CAAC,CAAC,EACpD,eAAiB,EAAQ,CAAE,EAAG,CAAe,CAC/C,EACA,CAAC,CAAO,CACV,EAEM,GAAA,EAAQ,EAAA,QAAA,MAAe,CAAE,MAAK,GAAI,CAAC,CAAI,CAAC,EAE9C,OACE,EAAA,EAAA,KAAA,CAAC,EAAa,SAAd,CAA8B,QAA9B,SAAA,CACG,GACD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAQ,KAAK,SAAS,YAAU,SACpD,SAAA,EAAO,IAAK,IACX,EAAA,EAAA,KAAA,CAAC,MAAD,CAAgB,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,EAAE,QAAvD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,OAAc,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,QAAS,YAAe,EAAQ,EAAE,EAAE,EAAG,aAAW,UAAU,SAAA,GAE5F,CAAA,CACL,CALK,EAAA,EAAE,EAKP,CACN,CACE,CAAA,CACgB,GAE3B,wGEpCa,EAAb,cAAwC,EAAA,SAAwB,CAC9D,MAAwB,CAAE,MAAO,IAAK,EAEtC,OAAO,yBAAyB,EAAqB,CACnD,MAAO,CAAE,OAAM,CACjB,CAEA,kBAA2B,EAAc,EAAiB,CACxD,QAAQ,MAAM,uCAAwC,EAAO,EAAK,cAAc,CAClF,CAEA,mBAA4B,EAAkB,CACxC,KAAK,MAAM,OAAS,EAAU,WAAa,KAAK,MAAM,UACxD,KAAK,SAAS,CAAE,MAAO,IAAK,CAAC,CAEjC,CAEA,QAAkB,CAehB,OAdI,KAAK,MAAM,OAEX,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,KAAK,QAAlC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,SAAA,6CAAmD,CAAA,GAC/E,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,OAArB,SAAA,CACG,KAAK,MAAM,MAAM,SAAW,iBAAiB,+FAE7C,KACH,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,MAAO,YAAe,KAAK,SAAS,CAAE,MAAO,IAAK,CAAC,EAAG,SAAA,iBAEtF,CAAA,CACL,IAGF,KAAK,MAAM,QACpB,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{l as r}from"./global-BJ_kVFpD.js";import{t as i}from"./MutationTokenDialog-Dnf_rcnc.js";import{r as a}from"./RouteErrorBoundary-CVabFM97.js";import{d as o,wt as s}from"./VerseConsoleApp-Cj6yPJo3.js";import{f as c,i as l}from"./verse-store-DAqqNIyD.js";import{t as u}from"./Button-DJY_Pu5B.js";import{l as d}from"./icons-MYfI6vZr.js";import{n as f,t as p}from"./use-token-gate-E-xzEAu6.js";import{_ as m,d as h,g}from"./cloud-model-CzKeuxfm.js";import{a as _,r as v}from"./cloud-queries-Bsqo7wye.js";import{r as y,t as b}from"./composer-draft-DB025_AW.js";import{t as x}from"./cloud.module-DOP-N4Ch.js";import{o as S}from"./ChatSection-DXpzV1NW.js";var C=e(n(),1),w=t(),T=()=>()=>{};function E(){try{return a()}catch{return null}}function D({root:e}={}){let{activeSessionId:t}=o(),n=(0,C.useSyncExternalStore)((0,C.useCallback)(e=>t?c(t,e):T(),[t]),()=>l(t),()=>l(t)),a=S(n.session),D=r(v,{freshMs:15e3}),O=f(),k=E(),[A,j]=(0,C.useState)(``);(0,C.useLayoutEffect)(()=>j(y(e)),[e]);let[M,N]=(0,C.useState)(!1),[P,F]=(0,C.useState)(null),[I,L]=(0,C.useState)(null),R=a.data?.roots.find(e=>e.primary)??a.data?.roots[0]??null,z=R?.git?.remote??null,B=R?.git?.branch??null,V=D.data?.value??null,H=g({overview:V,overviewReason:D.data?D.data.reason:`Reading the cloud lane…`,repo:z,rootsLoading:n.session!==null&&a.data===null&&a.error===null,prompt:A}),U=V?.budget.budget.estimatedCostPerSessionUsd??null,W=async()=>{let t=y(e).trim()||A.trim();if(z&&t){N(!0),F(null);try{let n=await O.run(`Run this message as a Claude Code cloud session on your Claude account.`,()=>_({repo:z,...B?{baseBranch:B}:{},prompt:t,origin:`chat`}));if(n===null)return;b(e),L(n.task);let r=m(n.task.sessionUrl,`claude.ai`);k?.show(`Cloud task started: ${n.task.title}.${r?` ${r}`:``}`,`success`)}catch(e){F(p(e))}finally{N(!1)}}},G=I?m(I.sessionUrl,`claude.ai`):null;return(0,w.jsxs)(`div`,{className:x.sheetAction,children:[I?(0,w.jsxs)(`p`,{className:x.notice,"data-tone":`success`,role:`status`,children:[`Started “`,I.title,`” in the cloud. The draft was cleared.`,` `,G?(0,w.jsxs)(`a`,{className:x.link,href:G,target:`_blank`,rel:`noreferrer noopener`,children:[`Open in Claude `,(0,w.jsx)(d,{width:12,height:12,"aria-hidden":`true`})]}):`Its session link appears on Command once the session is created.`]}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(s,{label:H??`Launch this message as a cloud session on ${z}${B?` from ${B}`:``}`,children:(0,w.jsx)(u,{block:!0,disabled:H!==null,busy:M,onClick:()=>void W(),children:`Run in cloud`})}),(0,w.jsx)(`p`,{className:x.muted,children:H??`Runs on ${z} from ${B??`its default branch`} as a Claude Code cloud session and delivers a draft PR.${U===null?``:` Estimated at ${h(U)}.`}`})]}),P?(0,w.jsx)(`p`,{className:x.notice,"data-tone":`danger`,role:`alert`,children:P}):null,(0,w.jsx)(i,{...O.dialog,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`})]})}export{D as RunInCloudAction};
|
|
2
|
-
//# sourceMappingURL=RunInCloudAction-BpNHE7m8.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RunInCloudAction-BpNHE7m8.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/cloud/RunInCloudAction.tsx"],"sourcesContent":["/**\n * routes/verse/cloud/RunInCloudAction.tsx — \"Run in cloud\" in the composer's\n * ⋯ sheet (3.11 unit C3; lazy-loaded by composer/ControlsSheet.tsx the first\n * time the sheet opens, so none of this is chat first-paint).\n *\n * It launches the message typed in the box as a cloud task on the chat\n * project's GitHub origin, from the branch the chat is on. Both come from the\n * chat's roots read (chat/use-session-roots — the read behind the header's\n * `repo › branch` and the Branch bar), which is already in the cache when the\n * chat is open. After a launch the draft is cleared, a toast confirms it, and\n * the sheet shows the session link in place of the button.\n *\n * Disabled — with the reason as its tooltip AND as a line under it (a\n * disabled button takes no focus, so a keyboard user would never see the\n * tooltip) — when the project has no GitHub origin, the Claude seat is not\n * ready, the budget gate is closed, or the box is empty.\n */\nimport { useCallback, useLayoutEffect, useState, useSyncExternalStore } from 'react';\nimport type { CloudTaskV1 } from '../../../../core/cloud/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconExternalLink } from '../../../components/primitives/icons.js';\nimport { useToast } from '../../../components/primitives/Toast.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { useSessionRoots } from '../chat/use-session-roots.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { getVerseSessionHead, subscribeVerseSession } from '../verse-store.js';\nimport { formatDollars, runInCloudBlock, safeHref } from './cloud-model.js';\nimport { cloudQuery, launchCloudTask } from './cloud-queries.js';\nimport { clearComposerDraft, readComposerDraft } from './composer-draft.js';\nimport styles from './cloud.module.css';\n\nconst NO_SUBSCRIPTION = () => () => {};\n\n/** The shell's toast when there is one; tests and bare mounts have none, and a launch must not throw for want of it. */\nfunction useOptionalToast(): ReturnType<typeof useToast> | null {\n try {\n return useToast();\n } catch {\n return null;\n }\n}\n\nexport function RunInCloudAction({ root }: { root?: ParentNode } = {}) {\n const { activeSessionId } = useVerseUi();\n const head = useSyncExternalStore(\n useCallback((listener: () => void) => (activeSessionId ? subscribeVerseSession(activeSessionId, listener) : NO_SUBSCRIPTION()), [activeSessionId]),\n () => getVerseSessionHead(activeSessionId),\n () => getVerseSessionHead(activeSessionId),\n );\n const roots = useSessionRoots(head.session);\n const read = useQuery(cloudQuery, { freshMs: 15_000 });\n const gate = useTokenGate();\n const toast = useOptionalToast();\n // The sheet is modal, so the box cannot change while it is open: one read\n // once mounted (after commit, never during render) is the draft this\n // button launches — and it is re-read on press anyway.\n const [prompt, setPrompt] = useState('');\n useLayoutEffect(() => setPrompt(readComposerDraft(root)), [root]);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [launched, setLaunched] = useState<CloudTaskV1 | null>(null);\n\n const primary = roots.data?.roots.find((r) => r.primary) ?? roots.data?.roots[0] ?? null;\n const repo = primary?.git?.remote ?? null;\n const branch = primary?.git?.branch ?? null;\n const overview = read.data?.value ?? null;\n const block = runInCloudBlock({\n overview,\n overviewReason: read.data ? read.data.reason : 'Reading the cloud lane…',\n repo,\n rootsLoading: head.session !== null && roots.data === null && roots.error === null,\n prompt,\n });\n const estimate = overview?.budget.budget.estimatedCostPerSessionUsd ?? null;\n\n const launch = async () => {\n const text = readComposerDraft(root).trim() || prompt.trim();\n if (!repo || !text) return;\n setBusy(true);\n setError(null);\n try {\n const response = await gate.run('Run this message as a Claude Code cloud session on your Claude account.', () =>\n launchCloudTask({ repo, ...(branch ? { baseBranch: branch } : {}), prompt: text, origin: 'chat' }),\n );\n if (response === null) return; // the unlock dialog was dismissed: nothing was sent\n clearComposerDraft(root);\n setLaunched(response.task);\n const link = safeHref(response.task.sessionUrl, 'claude.ai');\n toast?.show(`Cloud task started: ${response.task.title}.${link ? ` ${link}` : ''}`, 'success');\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(false);\n }\n };\n\n const session = launched ? safeHref(launched.sessionUrl, 'claude.ai') : null;\n return (\n <div className={styles.sheetAction}>\n {launched ? (\n <p className={styles.notice} data-tone=\"success\" role=\"status\">\n Started “{launched.title}” in the cloud. The draft was cleared.{' '}\n {session ? (\n <a className={styles.link} href={session} target=\"_blank\" rel=\"noreferrer noopener\">\n Open in Claude <IconExternalLink width={12} height={12} aria-hidden=\"true\" />\n </a>\n ) : (\n 'Its session link appears on Command once the session is created.'\n )}\n </p>\n ) : (\n <>\n <Tooltip label={block ?? `Launch this message as a cloud session on ${repo}${branch ? ` from ${branch}` : ''}`}>\n <Button block disabled={block !== null} busy={busy} onClick={() => void launch()}>\n Run in cloud\n </Button>\n </Tooltip>\n <p className={styles.muted}>\n {block ??\n `Runs on ${repo} from ${branch ?? 'its default branch'} as a Claude Code cloud session and delivers a draft PR.${estimate !== null ? ` Estimated at ${formatDollars(estimate)}.` : ''}`}\n </p>\n </>\n )}\n {error ? <p className={styles.notice} data-tone=\"danger\" role=\"alert\">{error}</p> : null}\n <MutationTokenDialog {...gate.dialog} tokenLabel=\"Mutation token\" tokenHelp=\"the mutation token ashlr verse printed\" />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{l as r}from"./global-BJ_kVFpD.js";import{t as i}from"./MutationTokenDialog-Dnf_rcnc.js";import{r as a}from"./RouteErrorBoundary-CVabFM97.js";import{d as o,wt as s}from"./VerseConsoleApp-Cj6yPJo3.js";import{f as c,i as l}from"./verse-store-DAqqNIyD.js";import{t as u}from"./Button-DJY_Pu5B.js";import{l as d}from"./icons-MYfI6vZr.js";import{n as f,t as p}from"./use-token-gate-E-xzEAu6.js";import{r as m,t as h}from"./composer-draft-DB025_AW.js";import{t as g}from"./cloud.module-DOP-N4Ch.js";import{d as _,f as v,n as y,r as b,u as x}from"./devin-queries-Cu_YYhw2.js";import{o as S}from"./ChatSection-DXpzV1NW.js";var C=e(n(),1),w=t(),T=()=>()=>{};function E(){try{return a()}catch{return null}}function D({root:e}={}){let{activeSessionId:t}=o(),n=(0,C.useSyncExternalStore)((0,C.useCallback)(e=>t?c(t,e):T(),[t]),()=>l(t),()=>l(t)),a=S(n.session),D=r(y,{freshMs:15e3}),O=f(),k=E(),[A,j]=(0,C.useState)(``);(0,C.useLayoutEffect)(()=>j(m(e)),[e]);let[M,N]=(0,C.useState)(!1),[P,F]=(0,C.useState)(null),[I,L]=(0,C.useState)(null),R=(a.data?.roots.find(e=>e.primary)??a.data?.roots[0]??null)?.git?.remote??null,z=D.data?.value??null;if(D.data&&!D.data.available)return null;let B=_({overview:z,overviewReason:D.data?D.data.reason:`Reading the Devin lane…`,repo:R,rootsLoading:n.session!==null&&a.data===null&&a.error===null,prompt:A}),V=z?.budget.budget.maxAcuPerSession??null,H=async()=>{let t=m(e).trim()||A.trim();if(R&&t){N(!0),F(null);try{let n=await O.run(`Run this message as a Devin session (spends Devin ACUs).`,()=>b({repo:R,prompt:t,origin:`chat`}));if(n===null)return;h(e),L(n.task);let r=v(n.task.sessionUrl,`app.devin.ai`);k?.show(`Devin task started: ${n.task.title}.${r?` ${r}`:``}`,`success`)}catch(e){F(p(e))}finally{N(!1)}}},U=I?v(I.sessionUrl,`app.devin.ai`):null;return(0,w.jsxs)(`div`,{className:g.sheetAction,"data-lane":`devin`,children:[I?(0,w.jsxs)(`p`,{className:g.notice,"data-tone":`success`,role:`status`,children:[`Started “`,I.title,`” in Devin. The draft was cleared.`,` `,U?(0,w.jsxs)(`a`,{className:g.link,href:U,target:`_blank`,rel:`noreferrer noopener`,children:[`Open in Devin `,(0,w.jsx)(d,{width:12,height:12,"aria-hidden":`true`})]}):null]}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(s,{label:B??`Launch this message as a Devin session on ${R}`,children:(0,w.jsx)(u,{block:!0,disabled:B!==null,busy:M,onClick:()=>void H(),children:`Run in Devin`})}),(0,w.jsx)(`p`,{className:g.muted,children:B??`Runs on ${R} as a Devin session; its PR against the default branch goes through the standing gates (never auto-merged).${V===null?``:` Capped at ${x(V)}.`}`})]}),P?(0,w.jsx)(`p`,{className:g.notice,"data-tone":`danger`,role:`alert`,children:P}):null,(0,w.jsx)(i,{...O.dialog,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`})]})}export{D as RunInDevinAction};
|
|
2
|
-
//# sourceMappingURL=RunInDevinAction-Bkf5Gb3a.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RunInDevinAction-Bkf5Gb3a.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/devin/RunInDevinAction.tsx"],"sourcesContent":["/**\n * routes/verse/devin/RunInDevinAction.tsx — \"Run in Devin\" in the composer's\n * ⋯ sheet, beside \"Run in cloud\" (3.15; lazy-loaded by\n * composer/ControlsSheet.tsx, never on the chat first-paint path).\n *\n * It launches the message in the box as a Devin session on the chat\n * project's GitHub origin. The session delivers a PR on `ashlr-devin/<id>`\n * against the repo's DEFAULT branch (the server resolves it), which then goes\n * through the standing gates — never merged by the fleet. After a launch the\n * draft is cleared and the session link replaces the button.\n *\n * Disabled — with the reason as tooltip AND as a line under it — when Devin\n * is not connected or turned off, the project has no GitHub origin, the ACU\n * budget refuses, or the box is empty.\n */\nimport { useCallback, useLayoutEffect, useState, useSyncExternalStore } from 'react';\nimport type { DevinTaskV1 } from '../../../../core/devin/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconExternalLink } from '../../../components/primitives/icons.js';\nimport { useToast } from '../../../components/primitives/Toast.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { useSessionRoots } from '../chat/use-session-roots.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { getVerseSessionHead, subscribeVerseSession } from '../verse-store.js';\nimport { clearComposerDraft, readComposerDraft } from '../cloud/composer-draft.js';\nimport styles from '../cloud/cloud.module.css';\nimport { formatAcu, runInDevinBlock, safeDevinHref } from './devin-model.js';\nimport { devinQuery, launchDevinTask } from './devin-queries.js';\n\nconst NO_SUBSCRIPTION = () => () => {};\n\nfunction useOptionalToast(): ReturnType<typeof useToast> | null {\n try {\n return useToast();\n } catch {\n return null;\n }\n}\n\nexport function RunInDevinAction({ root }: { root?: ParentNode } = {}) {\n const { activeSessionId } = useVerseUi();\n const head = useSyncExternalStore(\n useCallback((listener: () => void) => (activeSessionId ? subscribeVerseSession(activeSessionId, listener) : NO_SUBSCRIPTION()), [activeSessionId]),\n () => getVerseSessionHead(activeSessionId),\n () => getVerseSessionHead(activeSessionId),\n );\n const roots = useSessionRoots(head.session);\n const read = useQuery(devinQuery, { freshMs: 15_000 });\n const gate = useTokenGate();\n const toast = useOptionalToast();\n const [prompt, setPrompt] = useState('');\n useLayoutEffect(() => setPrompt(readComposerDraft(root)), [root]);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [launched, setLaunched] = useState<DevinTaskV1 | null>(null);\n\n const primary = roots.data?.roots.find((r) => r.primary) ?? roots.data?.roots[0] ?? null;\n const repo = primary?.git?.remote ?? null;\n const overview = read.data?.value ?? null;\n // A build without the lane renders nothing: \"Run in cloud\" is right above.\n if (read.data && !read.data.available) return null;\n const block = runInDevinBlock({\n overview,\n overviewReason: read.data ? read.data.reason : 'Reading the Devin lane…',\n repo,\n rootsLoading: head.session !== null && roots.data === null && roots.error === null,\n prompt,\n });\n const cap = overview?.budget.budget.maxAcuPerSession ?? null;\n\n const launch = async () => {\n const text = readComposerDraft(root).trim() || prompt.trim();\n if (!repo || !text) return;\n setBusy(true);\n setError(null);\n try {\n const response = await gate.run('Run this message as a Devin session (spends Devin ACUs).', () =>\n launchDevinTask({ repo, prompt: text, origin: 'chat' }),\n );\n if (response === null) return;\n clearComposerDraft(root);\n setLaunched(response.task);\n const link = safeDevinHref(response.task.sessionUrl, 'app.devin.ai');\n toast?.show(`Devin task started: ${response.task.title}.${link ? ` ${link}` : ''}`, 'success');\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(false);\n }\n };\n\n const session = launched ? safeDevinHref(launched.sessionUrl, 'app.devin.ai') : null;\n return (\n <div className={styles.sheetAction} data-lane=\"devin\">\n {launched ? (\n <p className={styles.notice} data-tone=\"success\" role=\"status\">\n Started “{launched.title}” in Devin. The draft was cleared.{' '}\n {session ? (\n <a className={styles.link} href={session} target=\"_blank\" rel=\"noreferrer noopener\">\n Open in Devin <IconExternalLink width={12} height={12} aria-hidden=\"true\" />\n </a>\n ) : null}\n </p>\n ) : (\n <>\n <Tooltip label={block ?? `Launch this message as a Devin session on ${repo}`}>\n <Button block disabled={block !== null} busy={busy} onClick={() => void launch()}>\n Run in Devin\n </Button>\n </Tooltip>\n <p className={styles.muted}>\n {block ??\n `Runs on ${repo} as a Devin session; its PR against the default branch goes through the standing gates (never auto-merged).${cap !== null ? ` Capped at ${formatAcu(cap)}.` : ''}`}\n </p>\n </>\n )}\n {error ? <p className={styles.notice} data-tone=\"danger\" role=\"alert\">{error}</p> : null}\n <MutationTokenDialog {...gate.dialog} tokenLabel=\"Mutation token\" tokenHelp=\"the mutation token ashlr verse printed\" />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./index-DOAOxiKl.js";import{_ as t,c as n}from"./format-V6IiIMAL.js";var r={"signed-metered-unavailable":`Current permissions do not allow a metered advice call.`,"metered-allowance-exhausted":`Metered allowance used up; no advice requested.`,"no-comparable-pairs":`No comparable eligible pairs; no advice requested.`,"stop-active":`Stop is active; no advice requested.`,"preparation-cancelled":`Scheduling preparation was cancelled; no advice requested.`,"no-eligible-choice":`No usable advice choice; deterministic routing kept.`,"eligible-choice-returned":`An eligible advice choice was returned; it may be cached.`};function i(e,t){let i=a(a(e,`scheduling`),`advisory`);if(i===void 0)return null;let s=o(a(i,`observedAt`)),c=a(i,`reason`),l=a(i,`state`);return s===null||s>t||!Number.isFinite(t)||typeof c!=`string`||!Object.hasOwn(r,c)||typeof l!=`string`||![`choice-returned`,`fallback`,`skipped`].includes(l)?`Last scheduling advice unavailable.`:`Last scheduling advice · ${n(t-s)} ago: ${r[c]} This is batch history, not a live connection or dispatch check.`}function a(e,t){if(e&&typeof e==`object`)try{return Object.getOwnPropertyDescriptor(e,t)?.value}catch{return}}function o(e){if(typeof e!=`string`||e.length>64||!/^\d{4}-\d\d-\d\dT/.test(e))return null;let t=Date.parse(e);return Number.isFinite(t)?t:null}function s(e){return typeof e==`string`&&e.length>0&&e.length<=128&&/^[\w.:+-]+$/.test(e)}function c(e){return!s(e)||/(?:secret|password|credential|api[-_]?key|bearer|^sk-)/i.test(e)||/^[a-z0-9]{24,}$/i.test(e)||/^[a-f0-9-]{24,}$/i.test(e)?null:e}function l(e){let t=a(e,`p25`),n=a(e,`p50`),r=a(e,`p75`),i=a(e,`samples`);return typeof t!=`number`||typeof n!=`number`||typeof r!=`number`||typeof i!=`number`||![t,n,r].every(e=>Number.isFinite(e)&&e>0&&e<=2**53-1)||t>n||n>r||!Number.isSafeInteger(i)||i<=0?null:{p25:t,p50:n,p75:r,samples:i}}function u(){return{state:`unavailable`,availability:`Work capacity unavailable.`,timing:`Reset behavior not reported.`,opportunity:null,freshness:`No scheduling reading for this account.`,forecast:[`Task completion estimate unavailable.`]}}function d(e,r,i){let d=a(e,`scheduling`),f=a(d,`accounts`);if(a(d,`sourceState`)!==`ready`||o(a(d,`observedAt`))===null||!Array.isArray(f))return u();let p;try{p=Object.keys(f)}catch{return u()}if(p.length!==f.length||p.some((e,t)=>e!==String(t)))return u();let m=null;for(let e of p){let t=a(f,e);if(a(t,`seatId`)===r.seatId){if(m!==null)return u();m=t}}if(m===null||!Number.isFinite(i))return u();let h=o(a(m,`observedAt`)),g=a(e,`readingMaxAgeMs`),_=h!==null&&h<=i&&typeof g==`number`&&Number.isFinite(g)&&g>0&&i-h<=g,v=a(m,`admission`),y=a(m,`headroomPercent`),b=r.engine===`local`&&v===`eligible`,x=_||b,S=typeof y==`number`&&Number.isFinite(y)&&y>=0&&y<=100,C=b?`Local throughput available under current runtime limits.`:_?v===`held`?`Held back by current account or reserve limits.`:v===`eligible`&&S?`${t(y)} available after your reserve.`:`Work capacity unknown.`:`Work capacity needs a fresh reading.`,w=a(m,`reset`),T=o(a(w,`at`)),E=o(a(w,`startsAt`)),D=a(w,`kind`),O=a(w,`plan`),k=D===`weekly-deadline`&&r.engine===`claude`&&T!==null&&a(w,`startsAt`)==null&&a(w,`source`)===`claude-native-usage-report`&&(O===`pro`||O===`max`),A=D===`weekly-deadline`&&!k||D===`fixed-period`&&(T===null||E===null||E>i||E>=T||!s(a(w,`source`)))?`unknown`:D,j=A===`fixed-period`||A===`weekly-deadline`,M=A===`weekly-deadline`?`deadline`:`reset`,N=T!==null&&T>i,P=`Reset behavior not reported.`;A===`fixed-period`?P=N?`Allowance resets in ${n(T-i)}.`:`Reported reset has passed; waiting for a fresh reading.`:A===`weekly-deadline`?P=N?`Reported weekly allowance deadline in ${n(T-i)}.`:`Reported weekly deadline has passed; waiting for a fresh reading.`:A===`rolling-release`?P=N?`Capacity returns gradually · next reported release in ${n(T-i)}.`:`Capacity returns gradually; next release time unknown.`:A===`balance`&&(P=`Balance-based resource · no expiring usage window reported.`),b&&(P=`Local work has no expiring subscription quota; runtime capacity still applies.`);let F=!b&&_&&v===`eligible`&&S&&y>0&&j&&N&&a(a(m,`opportunity`),`kind`)===`before-reset`?`Opportunity to use available allowance before this ${M}.`:null,I=[],L=null,R=a(m,`forecast`),z=a(R,`cohort`),B=c(a(z,`model`)),V=a(z,`engine`),H=V===r.engine||r.engine===`grok`&&V===`grok-cli`,U=a(z,`seatId`),W=s(a(R,`taskId`))&&(U===r.seatId||U===null)&&H&&B!==null&&s(a(z,`taskKind`));if(x&&W){let e=l(a(R,`durationMs`)),t=l(a(R,`tokens`)),r=o(a(R,`recordedAt`)),s=r!==null&&r<=i?`recorded ${n(i-r)} ago`:`recording time unknown`;if((e||t)&&(I.push(`Last selected task estimate · ${s} · recorded model ${B}. This is not the current task or model selection.`),L={recorded:`Last selected task · ${s}. Not the current task or model.`,duration:null,fit:null}),e){let t=`Middle half of observed durations ${n(e.p25)}–${n(e.p75)} · ${e.samples} samples.`;I.push(t),L.duration=t}t&&I.push(`Observed task tokens ${Math.round(t.p25).toLocaleString()}–${Math.round(t.p75).toLocaleString()} · ${t.samples} samples; not remaining account tokens.`),(e||t)&&I.push(U===null?`Historical engine/model/task-kind cohort pooled across accounts; account attribution unavailable. Estimates are not a completion guarantee.`:`Historical engine/model/account/task-kind cohort. Estimates are not a completion guarantee.`);let c=a(R,`fit`);if(!b&&e&&j&&N&&v===`eligible`){let e=c===`likely-before-reset`?`Recorded task is estimated to fit before this ${M}.`:c===`unlikely-before-reset`?`Recorded task may run past this ${M}.`:`Whether the recorded task fits before ${M} is uncertain.`;I.push(e),L.fit=e}}return I.length===0&&I.push(`Task completion estimate unavailable.`),{state:x?`ready`:`stale`,availability:C,timing:P,opportunity:F,freshness:b?`Local runtime admission reported; no subscription quota reading applies.`:h===null?`Provider reading time unknown.`:`${_?`Reading`:`Last reading`} ${n(Math.max(0,i-h))} ago.`,forecast:I,forecastSummary:L}}var f={disclosure:`_disclosure_uz7nk_1`,provenance:`_provenance_uz7nk_8`,body:`_body_uz7nk_21`,intro:`_intro_uz7nk_22`,grid:`_grid_uz7nk_23`,card:`_card_uz7nk_24`,evidence:`_evidence_uz7nk_32`,availability:`_availability_uz7nk_34`,freshness:`_freshness_uz7nk_35`,forecast:`_forecast_uz7nk_36`,forecastLabel:`_forecastLabel_uz7nk_37`,provenanceBody:`_provenanceBody_uz7nk_39`},p=e();function m({view:e}){let t=e.forecastSummary,n=t?e.forecast.filter(e=>e!==t.duration&&e!==t.fit):[];return(0,p.jsxs)(`div`,{className:f.evidence,"data-scheduling":e.state,children:[(0,p.jsx)(`p`,{className:f.availability,children:e.availability}),(0,p.jsx)(`p`,{children:e.timing}),e.opportunity?(0,p.jsx)(`p`,{children:e.opportunity}):null,(0,p.jsx)(`p`,{className:f.freshness,children:e.freshness}),(0,p.jsx)(`div`,{className:f.forecast,children:t?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:f.forecastLabel,children:t.recorded}),t.duration?(0,p.jsx)(`p`,{children:t.duration}):(0,p.jsx)(`p`,{children:`Task duration estimate unavailable.`}),t.fit?(0,p.jsx)(`p`,{children:t.fit}):null,(0,p.jsx)(`p`,{className:f.freshness,children:`Historical estimates, not a completion guarantee.`}),(0,p.jsxs)(`details`,{className:f.provenance,children:[(0,p.jsx)(`summary`,{tabIndex:0,children:`Model, tokens & evidence`}),(0,p.jsx)(`div`,{className:f.provenanceBody,children:n.map(e=>(0,p.jsx)(`p`,{children:e},e))})]})]}):e.forecast.map(e=>(0,p.jsx)(`p`,{children:e},e))})]})}function h({budget:e,now:t}){let n=i(e,t);return(0,p.jsxs)(`details`,{className:f.disclosure,children:[(0,p.jsx)(`summary`,{tabIndex:0,children:`Capacity for work`}),(0,p.jsxs)(`div`,{className:f.body,children:[(0,p.jsx)(`p`,{className:f.intro,children:`Advisory timing and recorded task estimates. Existing permissions and account limits still apply.`}),n?(0,p.jsx)(`p`,{className:f.intro,children:n}):null,!e||e.seatInfo.length===0?(0,p.jsx)(`p`,{children:`Account scheduling evidence unavailable.`}):(0,p.jsx)(`div`,{className:f.grid,children:e.seatInfo.map(n=>(0,p.jsxs)(`section`,{className:f.card,"aria-label":`Work capacity: ${n.label}`,children:[(0,p.jsx)(`h4`,{children:n.label}),(0,p.jsx)(m,{view:d(e,n,t)})]},n.seatId))})]})]})}export{m as n,d as r,h as t};
|
|
2
|
-
//# sourceMappingURL=SchedulingEvidence-B08-qhhm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SchedulingEvidence-B08-qhhm.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/resources/scheduling-model.ts","../../../../../../src/web-ui/routes/verse/resources/SchedulingEvidence.module.css","../../../../../../src/web-ui/routes/verse/resources/SchedulingEvidence.tsx"],"sourcesContent":["/** Display-only scheduling evidence. Never infer quota tokens or change admission. */\nimport type { ObservedPercentiles } from '../../../../core/routing/scheduling-types.js';\nimport { formatDuration, percentText } from '../autonomy/format.js';\n\nexport interface SchedulingEvidenceView {\n state: 'ready' | 'stale' | 'unavailable';\n availability: string;\n timing: string;\n opportunity: string | null;\n freshness: string;\n forecast: string[];\n /** Compact presentation only; full historical provenance remains in forecast. */\n forecastSummary?: { recorded: string; duration: string | null; fit: string | null } | null;\n}\n\nconst ADVICE_REASONS: Readonly<Record<string, string>> = {\n 'signed-metered-unavailable': 'Current permissions do not allow a metered advice call.',\n 'metered-allowance-exhausted': 'Metered allowance used up; no advice requested.',\n 'no-comparable-pairs': 'No comparable eligible pairs; no advice requested.',\n 'stop-active': 'Stop is active; no advice requested.',\n 'preparation-cancelled': 'Scheduling preparation was cancelled; no advice requested.',\n 'no-eligible-choice': 'No usable advice choice; deterministic routing kept.',\n 'eligible-choice-returned': 'An eligible advice choice was returned; it may be cached.',\n};\n/** Last selected-batch advice only, never a call, dispatch or provider-health claim. */\nexport function lastSchedulingAdvice(budget: unknown, now: number): string | null {\n const advisory = field(field(budget, 'scheduling'), 'advisory');\n if (advisory === undefined) return null;\n const at = instant(field(advisory, 'observedAt')), reason = field(advisory, 'reason'), state = field(advisory, 'state');\n if (at === null || at > now || !Number.isFinite(now) || typeof reason !== 'string' || !Object.hasOwn(ADVICE_REASONS, reason)\n || typeof state !== 'string' || !['choice-returned', 'fallback', 'skipped'].includes(state)) return 'Last scheduling advice unavailable.';\n return `Last scheduling advice · ${formatDuration(now - at)} ago: ${ADVICE_REASONS[reason]} This is batch history, not a live connection or dispatch check.`;\n}\nfunction field(value: unknown, key: string): unknown {\n if (!value || typeof value !== 'object') return undefined;\n try { return Object.getOwnPropertyDescriptor(value, key)?.value; } catch { return undefined; }\n}\nfunction instant(value: unknown): number | null {\n if (typeof value !== 'string' || value.length > 64 || !/^\\d{4}-\\d\\d-\\d\\dT/.test(value)) return null;\n const n = Date.parse(value);\n return Number.isFinite(n) ? n : null;\n}\nfunction identifier(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0 && value.length <= 128 && /^[\\w.:+-]+$/.test(value);\n}\nfunction modelLabel(value: unknown): string | null {\n if (!identifier(value) || /(?:secret|password|credential|api[-_]?key|bearer|^sk-)/i.test(value)\n || /^[a-z0-9]{24,}$/i.test(value) || /^[a-f0-9-]{24,}$/i.test(value)) return null;\n return value;\n}\nfunction percentiles(value: unknown): ObservedPercentiles | null {\n const p25 = field(value, 'p25'), p50 = field(value, 'p50'), p75 = field(value, 'p75'), samples = field(value, 'samples');\n if (typeof p25 !== 'number' || typeof p50 !== 'number' || typeof p75 !== 'number' || typeof samples !== 'number'\n || ![p25, p50, p75].every((n) => Number.isFinite(n) && n > 0 && n <= Number.MAX_SAFE_INTEGER)\n || p25 > p50 || p50 > p75 || !Number.isSafeInteger(samples) || samples <= 0) return null;\n return { p25, p50, p75, samples };\n}\nfunction unavailable(): SchedulingEvidenceView {\n return { state: 'unavailable', availability: 'Work capacity unavailable.', timing: 'Reset behavior not reported.', opportunity: null,\n freshness: 'No scheduling reading for this account.', forecast: ['Task completion estimate unavailable.'] };\n}\n/** Account binding precedes optional evidence; duplicate bindings fail closed.\n * Bounded metadata only: raw task IDs, reasons, paths, and limitations never leave this projection.\n */\nexport function schedulingEvidence(budget: unknown, seat: { seatId: string; engine: string }, now: number): SchedulingEvidenceView {\n const scheduling = field(budget, 'scheduling'), accounts = field(scheduling, 'accounts');\n if (field(scheduling, 'sourceState') !== 'ready' || instant(field(scheduling, 'observedAt')) === null\n || !Array.isArray(accounts)) return unavailable();\n // The transport owns byte bounds. Validate actual dense inventory without a\n // roster ceiling or iterating a malformed billion-element sparse length.\n let keys: string[];\n try { keys = Object.keys(accounts); } catch { return unavailable(); }\n if (keys.length !== accounts.length || keys.some((key, index) => key !== String(index))) return unavailable();\n let row: unknown = null;\n for (const key of keys) {\n const candidate = field(accounts, key);\n if (field(candidate, 'seatId') === seat.seatId) {\n if (row !== null) return unavailable();\n row = candidate;\n }\n }\n if (row === null || !Number.isFinite(now)) return unavailable();\n const sampled = instant(field(row, 'observedAt')), maxAge = field(budget, 'readingMaxAgeMs');\n const fresh = sampled !== null && sampled <= now && typeof maxAge === 'number' && Number.isFinite(maxAge) && maxAge > 0 && now - sampled <= maxAge;\n const admission = field(row, 'admission'), remaining = field(row, 'headroomPercent');\n // Local eligibility is the backend's runtime admission, not subscription\n // telemetry. A missing provider timestamp cannot make that quota stale.\n const localEligible = seat.engine === 'local' && admission === 'eligible';\n const evidenceAvailable = fresh || localEligible;\n const knownRemaining = typeof remaining === 'number' && Number.isFinite(remaining) && remaining >= 0 && remaining <= 100;\n const availability = localEligible ? 'Local throughput available under current runtime limits.'\n : !fresh ? 'Work capacity needs a fresh reading.' : admission === 'held' ? 'Held back by current account or reserve limits.'\n : admission === 'eligible' && knownRemaining ? `${percentText(remaining)} available after your reserve.` : 'Work capacity unknown.';\n const reset = field(row, 'reset'), resetAt = instant(field(reset, 'at')), startsAt = instant(field(reset, 'startsAt'));\n const reportedKind = field(reset, 'kind');\n const plan = field(reset, 'plan');\n const weeklyDeadline = reportedKind === 'weekly-deadline' && seat.engine === 'claude' && resetAt !== null\n && field(reset, 'startsAt') == null && field(reset, 'source') === 'claude-native-usage-report' && (plan === 'pro' || plan === 'max');\n const resetKind = reportedKind === 'weekly-deadline' && !weeklyDeadline ? 'unknown'\n : reportedKind === 'fixed-period' && (resetAt === null || startsAt === null || startsAt > now || startsAt >= resetAt || !identifier(field(reset, 'source')))\n ? 'unknown' : reportedKind;\n const hasDeadline = resetKind === 'fixed-period' || resetKind === 'weekly-deadline';\n const deadlineLabel = resetKind === 'weekly-deadline' ? 'deadline' : 'reset';\n const future = resetAt !== null && resetAt > now;\n let timing = 'Reset behavior not reported.';\n if (resetKind === 'fixed-period') timing = future ? `Allowance resets in ${formatDuration(resetAt - now)}.` : 'Reported reset has passed; waiting for a fresh reading.';\n else if (resetKind === 'weekly-deadline') timing = future ? `Reported weekly allowance deadline in ${formatDuration(resetAt - now)}.` : 'Reported weekly deadline has passed; waiting for a fresh reading.';\n else if (resetKind === 'rolling-release') timing = future ? `Capacity returns gradually · next reported release in ${formatDuration(resetAt - now)}.` : 'Capacity returns gradually; next release time unknown.';\n else if (resetKind === 'balance') timing = 'Balance-based resource · no expiring usage window reported.';\n if (localEligible) timing = 'Local work has no expiring subscription quota; runtime capacity still applies.';\n const opportunity = !localEligible && fresh && admission === 'eligible' && knownRemaining && remaining > 0 && hasDeadline && future\n && field(field(row, 'opportunity'), 'kind') === 'before-reset' ? `Opportunity to use available allowance before this ${deadlineLabel}.` : null;\n const forecast: string[] = [];\n let forecastSummary: SchedulingEvidenceView['forecastSummary'] = null;\n const rawForecast = field(row, 'forecast'), cohort = field(rawForecast, 'cohort'), model = modelLabel(field(cohort, 'model'));\n const engine = field(cohort, 'engine');\n // The resource roster names the provider; the native Grok executor has this\n // distinct registered ID. No generic/API/custom-engine alias is inferred.\n const engineMatches = engine === seat.engine || seat.engine === 'grok' && engine === 'grok-cli';\n const cohortSeat = field(cohort, 'seatId');\n const cohortMatches = identifier(field(rawForecast, 'taskId')) && (cohortSeat === seat.seatId || cohortSeat === null)\n && engineMatches && model !== null && identifier(field(cohort, 'taskKind'));\n if (evidenceAvailable && cohortMatches) {\n const duration = percentiles(field(rawForecast, 'durationMs')), tokens = percentiles(field(rawForecast, 'tokens'));\n const recordedAt = instant(field(rawForecast, 'recordedAt'));\n const recordingAge = recordedAt !== null && recordedAt <= now ? `recorded ${formatDuration(now - recordedAt)} ago` : 'recording time unknown';\n if (duration || tokens) {\n forecast.push(`Last selected task estimate · ${recordingAge} · recorded model ${model}. This is not the current task or model selection.`);\n forecastSummary = { recorded: `Last selected task · ${recordingAge}. Not the current task or model.`, duration: null, fit: null };\n }\n if (duration) {\n const line = `Middle half of observed durations ${formatDuration(duration.p25)}–${formatDuration(duration.p75)} · ${duration.samples} samples.`;\n forecast.push(line);\n forecastSummary!.duration = line;\n }\n if (tokens) forecast.push(`Observed task tokens ${Math.round(tokens.p25).toLocaleString()}–${Math.round(tokens.p75).toLocaleString()} · ${tokens.samples} samples; not remaining account tokens.`);\n if (duration || tokens) forecast.push(cohortSeat === null\n ? 'Historical engine/model/task-kind cohort pooled across accounts; account attribution unavailable. Estimates are not a completion guarantee.'\n : 'Historical engine/model/account/task-kind cohort. Estimates are not a completion guarantee.');\n const fit = field(rawForecast, 'fit');\n if (!localEligible && duration && hasDeadline && future && admission === 'eligible') {\n const line = fit === 'likely-before-reset' ? `Recorded task is estimated to fit before this ${deadlineLabel}.`\n : fit === 'unlikely-before-reset' ? `Recorded task may run past this ${deadlineLabel}.`\n : `Whether the recorded task fits before ${deadlineLabel} is uncertain.`;\n forecast.push(line);\n forecastSummary!.fit = line;\n }\n }\n if (forecast.length === 0) forecast.push('Task completion estimate unavailable.');\n return { state: evidenceAvailable ? 'ready' : 'stale', availability, timing, opportunity,\n freshness: localEligible ? 'Local runtime admission reported; no subscription quota reading applies.'\n : sampled === null ? 'Provider reading time unknown.' : `${fresh ? 'Reading' : 'Last reading'} ${formatDuration(Math.max(0, now - sampled))} ago.`, forecast, forecastSummary };\n}\n",".disclosure {\n min-width: 0;\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n}\n\n.disclosure > summary,\n.provenance > summary {\n width: fit-content;\n padding: var(--space-1) 0;\n cursor: pointer;\n}\n\n.disclosure > summary:focus-visible,\n.provenance > summary:focus-visible {\n outline: 2px solid var(--focus-ring, var(--accent-500));\n outline-offset: 2px;\n border-radius: var(--radius-xs);\n}\n\n.body { display: grid; gap: var(--space-3); padding: var(--space-2) 0; min-width: 0; }\n.intro { margin: 0; max-width: 72ch; overflow-wrap: anywhere; }\n.grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-3); min-width: 0; }\n.card {\n min-width: 0;\n padding: var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n}\n.card h4 { margin: 0 0 var(--space-2); color: var(--text-primary); font-size: var(--text-sm-size); font-weight: var(--font-weight-medium); overflow-wrap: anywhere; }\n.evidence { display: grid; gap: var(--space-1); min-width: 0; overflow-wrap: anywhere; line-height: 1.5; }\n.evidence p { margin: 0; }\n.availability { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.freshness { color: var(--text-tertiary); font-size: var(--text-2xs-size); }\n.forecast { display: grid; gap: var(--space-1); margin-top: var(--space-2); padding-top: var(--space-2); border-top: 1px solid var(--border-subtle); }\n.forecastLabel { color: var(--text-secondary); font-size: var(--text-2xs-size); }\n.provenance { min-width: 0; color: var(--text-tertiary); font-size: var(--text-2xs-size); }\n.provenanceBody { display: grid; gap: var(--space-2); padding-top: var(--space-1); }\n\n@media (max-width: 700px) {\n .grid { grid-template-columns: minmax(0, 1fr); }\n}\n","import type { BudgetView } from '../../../../core/routing/policy.js';\nimport { lastSchedulingAdvice, schedulingEvidence, type SchedulingEvidenceView } from './scheduling-model.js';\nimport styles from './SchedulingEvidence.module.css';\n\nexport function SchedulingEvidence({ view }: { view: SchedulingEvidenceView }) {\n const summary = view.forecastSummary;\n const provenance = summary ? view.forecast.filter((line) => line !== summary.duration && line !== summary.fit) : [];\n return <div className={styles.evidence} data-scheduling={view.state}>\n <p className={styles.availability}>{view.availability}</p><p>{view.timing}</p>\n {view.opportunity ? <p>{view.opportunity}</p> : null}\n <p className={styles.freshness}>{view.freshness}</p>\n <div className={styles.forecast}>\n {summary ? <>\n <p className={styles.forecastLabel}>{summary.recorded}</p>\n {summary.duration ? <p>{summary.duration}</p> : <p>Task duration estimate unavailable.</p>}\n {summary.fit ? <p>{summary.fit}</p> : null}\n <p className={styles.freshness}>Historical estimates, not a completion guarantee.</p>\n <details className={styles.provenance}>\n <summary tabIndex={0}>Model, tokens & evidence</summary>\n <div className={styles.provenanceBody}>{provenance.map((line) => <p key={line}>{line}</p>)}</div>\n </details>\n </> : view.forecast.map((line) => <p key={line}>{line}</p>)}\n </div>\n </div>;\n}\n/** Same shared budget snapshot as Resources; no additional query or provider probe. */\nexport function FleetScheduling({ budget, now }: { budget: BudgetView | null; now: number }) {\n const advice = lastSchedulingAdvice(budget, now);\n return <details className={styles.disclosure}>\n <summary tabIndex={0}>Capacity for work</summary>\n <div className={styles.body}>\n <p className={styles.intro}>Advisory timing and recorded task estimates. Existing permissions and account limits still apply.</p>\n {advice ? <p className={styles.intro}>{advice}</p> : null}\n {!budget || budget.seatInfo.length === 0 ? <p>Account scheduling evidence unavailable.</p>\n : <div className={styles.grid}>{budget.seatInfo.map((seat) => <section className={styles.card} key={seat.seatId} aria-label={`Work capacity: ${seat.label}`}>\n <h4>{seat.label}</h4><SchedulingEvidence view={schedulingEvidence(budget, seat, now)} />\n </section>)}</div>}\n </div>\n </details>;\n}\n"],"mappings":"wFAeA,IAAM,EAAmD,CACvD,6BAA8B,0DAC9B,8BAA+B,kDAC/B,sBAAuB,qDACvB,cAAe,uCACf,wBAAyB,6DACzB,qBAAsB,uDACtB,2BAA4B,2DAC9B,EAEA,SAAgB,EAAqB,EAAiB,EAA4B,CAChF,IAAM,EAAW,EAAM,EAAM,EAAQ,YAAY,EAAG,UAAU,EAC9D,GAAI,IAAa,IAAA,GAAW,OAAO,KACnC,IAAM,EAAK,EAAQ,EAAM,EAAU,YAAY,CAAC,EAAG,EAAS,EAAM,EAAU,QAAQ,EAAG,EAAQ,EAAM,EAAU,OAAO,EAGtH,OAFI,IAAO,MAAQ,EAAK,GAAO,CAAC,OAAO,SAAS,CAAG,GAAK,OAAO,GAAW,UAAY,CAAC,OAAO,OAAO,EAAgB,CAAM,GACtH,OAAO,GAAU,UAAY,CAAC,CAAC,kBAAmB,WAAY,SAAS,CAAC,CAAC,SAAS,CAAK,EAAU,sCAC/F,4BAA4B,EAAe,EAAM,CAAE,EAAE,QAAQ,EAAe,GAAQ,iEAC7F,CACA,SAAS,EAAM,EAAgB,EAAsB,CAC/C,GAAC,GAAS,OAAO,GAAU,SAC/B,GAAI,CAAE,OAAO,OAAO,yBAAyB,EAAO,CAAG,CAAC,EAAE,KAAO,MAAQ,CAAE,MAAkB,CAC/F,CACA,SAAS,EAAQ,EAA+B,CAC9C,GAAI,OAAO,GAAU,UAAY,EAAM,OAAS,IAAM,CAAC,oBAAoB,KAAK,CAAK,EAAG,OAAO,KAC/F,IAAM,EAAI,KAAK,MAAM,CAAK,EAC1B,OAAO,OAAO,SAAS,CAAC,EAAI,EAAI,IAClC,CACA,SAAS,EAAW,EAAiC,CACnD,OAAO,OAAO,GAAU,UAAY,EAAM,OAAS,GAAK,EAAM,QAAU,KAAO,cAAc,KAAK,CAAK,CACzG,CACA,SAAS,EAAW,EAA+B,CAGjD,MAFI,CAAC,EAAW,CAAK,GAAK,0DAA0D,KAAK,CAAK,GACzF,mBAAmB,KAAK,CAAK,GAAK,oBAAoB,KAAK,CAAK,EAAU,KACxE,CACT,CACA,SAAS,EAAY,EAA4C,CAC/D,IAAM,EAAM,EAAM,EAAO,KAAK,EAAG,EAAM,EAAM,EAAO,KAAK,EAAG,EAAM,EAAM,EAAO,KAAK,EAAG,EAAU,EAAM,EAAO,SAAS,EAIvH,OAHI,OAAO,GAAQ,UAAY,OAAO,GAAQ,UAAY,OAAO,GAAQ,UAAY,OAAO,GAAY,UACnG,CAAC,CAAC,EAAK,EAAK,CAAG,CAAC,CAAC,MAAO,GAAM,OAAO,SAAS,CAAC,GAAK,EAAI,GAAK,UAA4B,GACzF,EAAM,GAAO,EAAM,GAAO,CAAC,OAAO,cAAc,CAAO,GAAK,GAAW,EAAU,KAC/E,CAAE,MAAK,MAAK,MAAK,SAAQ,CAClC,CACA,SAAS,GAAsC,CAC7C,MAAO,CAAE,MAAO,cAAe,aAAc,6BAA8B,OAAQ,+BAAgC,YAAa,KAC9H,UAAW,0CAA2C,SAAU,CAAC,uCAAuC,CAAE,CAC9G,CAIA,SAAgB,EAAmB,EAAiB,EAA0C,EAAqC,CACjI,IAAM,EAAa,EAAM,EAAQ,YAAY,EAAG,EAAW,EAAM,EAAY,UAAU,EACvF,GAAI,EAAM,EAAY,aAAa,IAAM,SAAW,EAAQ,EAAM,EAAY,YAAY,CAAC,IAAM,MAC5F,CAAC,MAAM,QAAQ,CAAQ,EAAG,OAAO,EAAY,EAGlD,IAAI,EACJ,GAAI,CAAE,EAAO,OAAO,KAAK,CAAQ,CAAG,MAAQ,CAAE,OAAO,EAAY,CAAG,CACpE,GAAI,EAAK,SAAW,EAAS,QAAU,EAAK,MAAM,EAAK,IAAU,IAAQ,OAAO,CAAK,CAAC,EAAG,OAAO,EAAY,EAC5G,IAAI,EAAe,KACnB,IAAK,IAAM,KAAO,EAAM,CACtB,IAAM,EAAY,EAAM,EAAU,CAAG,EACrC,GAAI,EAAM,EAAW,QAAQ,IAAM,EAAK,OAAQ,CAC9C,GAAI,IAAQ,KAAM,OAAO,EAAY,EACrC,EAAM,CACR,CACF,CACA,GAAI,IAAQ,MAAQ,CAAC,OAAO,SAAS,CAAG,EAAG,OAAO,EAAY,EAC9D,IAAM,EAAU,EAAQ,EAAM,EAAK,YAAY,CAAC,EAAG,EAAS,EAAM,EAAQ,iBAAiB,EACrF,EAAQ,IAAY,MAAQ,GAAW,GAAO,OAAO,GAAW,UAAY,OAAO,SAAS,CAAM,GAAK,EAAS,GAAK,EAAM,GAAW,EACtI,EAAY,EAAM,EAAK,WAAW,EAAG,EAAY,EAAM,EAAK,iBAAiB,EAG7E,EAAgB,EAAK,SAAW,SAAW,IAAc,WACzD,EAAoB,GAAS,EAC7B,EAAiB,OAAO,GAAc,UAAY,OAAO,SAAS,CAAS,GAAK,GAAa,GAAK,GAAa,IAC/G,EAAe,EAAgB,2DAChC,EAAiD,IAAc,OAAS,kDACzE,IAAc,YAAc,EAAiB,GAAG,EAAY,CAAS,EAAE,gCAAkC,yBADhG,uCAEP,EAAQ,EAAM,EAAK,OAAO,EAAG,EAAU,EAAQ,EAAM,EAAO,IAAI,CAAC,EAAG,EAAW,EAAQ,EAAM,EAAO,UAAU,CAAC,EAC/G,EAAe,EAAM,EAAO,MAAM,EAClC,EAAO,EAAM,EAAO,MAAM,EAC1B,EAAiB,IAAiB,mBAAqB,EAAK,SAAW,UAAY,IAAY,MAChG,EAAM,EAAO,UAAU,GAAK,MAAQ,EAAM,EAAO,QAAQ,IAAM,+BAAiC,IAAS,OAAS,IAAS,OAC1H,EAAY,IAAiB,mBAAqB,CAAC,GACrD,IAAiB,iBAAmB,IAAY,MAAQ,IAAa,MAAQ,EAAW,GAAO,GAAY,GAAW,CAAC,EAAW,EAAM,EAAO,QAAQ,CAAC,GADlF,UAE1D,EACV,EAAc,IAAc,gBAAkB,IAAc,kBAC5D,EAAgB,IAAc,kBAAoB,WAAa,QAC/D,EAAS,IAAY,MAAQ,EAAU,EACzC,EAAS,+BACT,IAAc,eAAgB,EAAS,EAAS,uBAAuB,EAAe,EAAU,CAAG,EAAE,GAAK,0DACrG,IAAc,kBAAmB,EAAS,EAAS,yCAAyC,EAAe,EAAU,CAAG,EAAE,GAAK,oEAC/H,IAAc,kBAAmB,EAAS,EAAS,yDAAyD,EAAe,EAAU,CAAG,EAAE,GAAK,yDAC/I,IAAc,YAAW,EAAS,+DACvC,IAAe,EAAS,kFAC5B,IAAM,EAAc,CAAC,GAAiB,GAAS,IAAc,YAAc,GAAkB,EAAY,GAAK,GAAe,GACxH,EAAM,EAAM,EAAK,aAAa,EAAG,MAAM,IAAM,eAAiB,sDAAsD,EAAc,GAAK,KACtI,EAAqB,CAAC,EACxB,EAA6D,KAC3D,EAAc,EAAM,EAAK,UAAU,EAAG,EAAS,EAAM,EAAa,QAAQ,EAAG,EAAQ,EAAW,EAAM,EAAQ,OAAO,CAAC,EACtH,EAAS,EAAM,EAAQ,QAAQ,EAG/B,EAAgB,IAAW,EAAK,QAAU,EAAK,SAAW,QAAU,IAAW,WAC/E,EAAa,EAAM,EAAQ,QAAQ,EACnC,EAAgB,EAAW,EAAM,EAAa,QAAQ,CAAC,IAAM,IAAe,EAAK,QAAU,IAAe,OAC3G,GAAiB,IAAU,MAAQ,EAAW,EAAM,EAAQ,UAAU,CAAC,EAC5E,GAAI,GAAqB,EAAe,CACtC,IAAM,EAAW,EAAY,EAAM,EAAa,YAAY,CAAC,EAAG,EAAS,EAAY,EAAM,EAAa,QAAQ,CAAC,EAC3G,EAAa,EAAQ,EAAM,EAAa,YAAY,CAAC,EACrD,EAAe,IAAe,MAAQ,GAAc,EAAM,YAAY,EAAe,EAAM,CAAU,EAAE,MAAQ,yBAKrH,IAJI,GAAY,KACd,EAAS,KAAK,iCAAiC,EAAa,oBAAoB,EAAM,mDAAmD,EACzI,EAAkB,CAAE,SAAU,wBAAwB,EAAa,kCAAmC,SAAU,KAAM,IAAK,IAAK,GAE9H,EAAU,CACZ,IAAM,EAAO,qCAAqC,EAAe,EAAS,GAAG,EAAE,GAAG,EAAe,EAAS,GAAG,EAAE,KAAK,EAAS,QAAQ,WACrI,EAAS,KAAK,CAAI,EAClB,EAAiB,SAAW,CAC9B,CACI,GAAQ,EAAS,KAAK,wBAAwB,KAAK,MAAM,EAAO,GAAG,CAAC,CAAC,eAAe,EAAE,GAAG,KAAK,MAAM,EAAO,GAAG,CAAC,CAAC,eAAe,EAAE,KAAK,EAAO,QAAQ,wCAAwC,GAC7L,GAAY,IAAQ,EAAS,KAAK,IAAe,KACjD,8IACA,6FAA6F,EACjG,IAAM,EAAM,EAAM,EAAa,KAAK,EACpC,GAAI,CAAC,GAAiB,GAAY,GAAe,GAAU,IAAc,WAAY,CACnF,IAAM,EAAO,IAAQ,sBAAwB,iDAAiD,EAAc,GACxG,IAAQ,wBAA0B,mCAAmC,EAAc,GACnF,yCAAyC,EAAc,gBAC3D,EAAS,KAAK,CAAI,EAClB,EAAiB,IAAM,CACzB,CACF,CAEA,OADI,EAAS,SAAW,GAAG,EAAS,KAAK,uCAAuC,EACzE,CAAE,MAAO,EAAoB,QAAU,QAAS,eAAc,SAAQ,cAC3E,UAAW,EAAgB,2EACvB,IAAY,KAAO,iCAAmC,GAAG,EAAQ,UAAY,eAAe,GAAG,EAAe,KAAK,IAAI,EAAG,EAAM,CAAO,CAAC,EAAE,OAAQ,WAAU,iBAAgB,CACpL,+XEpJA,SAAgB,EAAmB,CAAE,QAA0C,CAC7E,IAAM,EAAU,EAAK,gBACf,EAAa,EAAU,EAAK,SAAS,OAAQ,GAAS,IAAS,EAAQ,UAAY,IAAS,EAAQ,GAAG,EAAI,CAAC,EAClH,OAAO,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAU,kBAAiB,EAAK,MAAvD,SAAA,EACL,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,aAAe,SAAA,EAAK,YAAgB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAK,MAAU,CAAA,EAC5E,EAAK,aAAc,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAK,WAAe,CAAA,EAAI,MAChD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAY,SAAA,EAAK,SAAa,CAAA,GACnD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SACpB,SAAA,GAAU,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACT,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,cAAgB,SAAA,EAAQ,QAAY,CAAA,EACxD,EAAQ,UAAW,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAQ,QAAY,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,qCAAsC,CAAA,EACxF,EAAQ,KAAM,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAQ,GAAO,CAAA,EAAI,MACtC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,SAAA,mDAAoD,CAAA,GACpF,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,WAA3B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,SAAU,EAAG,SAAA,0BAAqC,CAAA,GAC3D,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,eAAiB,SAAA,EAAW,IAAK,IAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAe,CAAQ,EAAf,CAAe,CAAC,CAAO,CAAA,CACzF,GACT,CAAA,CAAA,EAAI,EAAK,SAAS,IAAK,IAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAe,CAAQ,EAAf,CAAe,CAAC,CACvD,CAAA,CACF,GACP,CAEA,SAAgB,EAAgB,CAAE,SAAQ,OAAmD,CAC3F,IAAM,EAAS,EAAqB,EAAQ,CAAG,EAC/C,OAAO,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,WAA3B,SAAA,EACL,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,SAAU,EAAG,SAAA,mBAA0B,CAAA,GAChD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,SAAA,mGAAoG,CAAA,EAC/H,GAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAQ,SAAA,CAAU,CAAA,EAAI,KACpD,CAAC,GAAU,EAAO,SAAS,SAAW,GAAI,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,0CAA2C,CAAA,GACrF,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAO,SAAA,EAAO,SAAS,IAAK,IAAS,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,KAAwB,aAAY,kBAAkB,EAAK,QAAtF,SAAA,EAC5D,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAK,KAAU,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAoB,KAAM,EAAmB,EAAQ,EAAM,CAAG,CAAI,CAAA,CAChF,CAF2F,EAAA,EAAK,MAEhG,CAAC,CAAO,CAAA,CAChB,CACE,CAAA,CAAA,GACX"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentsScreen-zLj4gzPR.js","assets/global-BJ_kVFpD.js","assets/VerseShared-CH8mV5ew.js","assets/verse-bootstrap-query-D-fU89IT.js","assets/VerseMobileApp-BRayqF_2.js","assets/preloaded-TmpzuCEi.js","assets/verse-model-DAOz9LrY.js","assets/percent-text-CSk89zQF.js","assets/compaction-point-VL9oegWS.js","assets/sidebar-model-COzIPSiP.js","assets/use-chat-activity-BZjdPPNP.js","assets/ui-parts-DubQJIoq.js","assets/parts.module-CBkHcD6w.js","assets/agent-transcript-model-D-34Ll59.js","assets/global-1SED_aTT.css","assets/VerseMobileApp-CK62hnya.css","assets/parts-bRLxuRh-.css","assets/AgentsScreen--KH6h2q1.css","assets/AgentDetailScreen-DCVf81Vo.js","assets/composer-queries-DHGJlnFJ.js","assets/useVerseSession-BOyvOEDi.js","assets/verse-store-DAqqNIyD.js","assets/transient-events-nTLhMBND.js","assets/useVerseTranscript-BOhcfdp7.js","assets/verse-transcript-Dc-bk9l2.js","assets/checkpoint-queries-gP6Vh70H.js","assets/MobileComposer-CFeLWUCz.js","assets/MicButton-BbGB7y_9.js","assets/web-speech-q3gDv2ax.js","assets/mobile-actions-XqB_h7a8.js","assets/mobile-toast-eIrghd9o.js","assets/AgentDetailScreen-4DZdOFMf.css","assets/NewAgentScreen-BI849ZsG.js","assets/seat-readiness-a5B9iqP-.js","assets/NewAgentScreen-CGnCBo-x.css","assets/NeedsYouScreen-HSXybHgd.js","assets/thread-data-CSDZ514s.js","assets/control-queries-CUNa6TAx.js","assets/mutations-BlGALvmG.js","assets/surface-data-D_oFOgkh.js","assets/leader-thread-types-CDb-VPPO.js","assets/sheet-BlzGO1wo.js","assets/focus-trap-B1vuEhZX.js","assets/resolved-store-DwGn9hb_.js","assets/connectivity-BViMMNcD.js","assets/needs-you-actions-Dp5UxM3X.js","assets/Input-Bt6fp051.js","assets/needs-you-model-DYsqHMqy.js","assets/Input-BQ3PR065.css","assets/NeedsYouScreen-DEueJpH5.css","assets/LeaderScreen-B2UxRWUm.js","assets/leader-model-CYyfrzNf.js","assets/LeaderScreen-CZoMInr6.css","assets/FleetScreen-Cz9HQ-st.js","assets/budget-queries-DCZevH2S.js","assets/budget-model-BZyGzAr4.js","assets/format-V6IiIMAL.js","assets/format-D7nBg2bn.js","assets/policy-DS7wupkn.js","assets/ladder-queries-CBoG3heV.js","assets/fleet-state-EgNiSDxu.js","assets/FleetScreen-Drkst2Yl.css","assets/MoreScreen-BcHZhVrR.js","assets/remote-session-I4RXlsas.js","assets/pwa-CTGMm-wR.js","assets/app-version-B0FcXqqB.js","assets/MoreScreen-C7zlz8-V.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-DOAOxiKl.js";var i=e(n(),1),a=t(),o=()=>r(()=>import(`./AgentsScreen-zLj4gzPR.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17])),s=()=>r(()=>import(`./AgentDetailScreen-DCVf81Vo.js`),__vite__mapDeps([18,1,2,3,4,5,6,7,8,19,10,20,21,22,23,24,25,11,12,26,27,28,29,30,13,14,15,16,31])),c=()=>r(()=>import(`./NewAgentScreen-BI849ZsG.js`),__vite__mapDeps([32,1,2,3,4,5,6,7,8,33,11,12,30,27,28,29,14,15,16,34])),l=()=>r(()=>import(`./NeedsYouScreen-HSXybHgd.js`),__vite__mapDeps([35,1,4,3,5,36,2,37,38,39,40,41,42,12,11,43,44,30,27,28,29,45,46,47,6,7,8,14,15,16,48,49])),u=()=>r(()=>import(`./LeaderScreen-B2UxRWUm.js`),__vite__mapDeps([50,1,2,3,4,5,39,37,38,36,40,51,41,42,12,11,44,27,28,26,29,30,14,15,16,52])),d=()=>r(()=>import(`./FleetScreen-Cz9HQ-st.js`),__vite__mapDeps([53,1,2,3,4,5,54,55,56,57,7,6,8,33,58,37,38,59,39,11,12,29,30,60,14,15,16,61])),f=()=>r(()=>import(`./MoreScreen-BcHZhVrR.js`),__vite__mapDeps([62,1,2,3,4,5,63,41,42,12,11,30,64,65,14,15,16,66])),p=(0,i.lazy)(()=>o().then(e=>({default:e.AgentsScreen}))),m=(0,i.lazy)(()=>s().then(e=>({default:e.AgentDetailScreen}))),h=(0,i.lazy)(()=>c().then(e=>({default:e.NewAgentScreen}))),g=(0,i.lazy)(()=>l().then(e=>({default:e.NeedsYouScreen}))),_=(0,i.lazy)(()=>u().then(e=>({default:e.LeaderScreen}))),v=(0,i.lazy)(()=>d().then(e=>({default:e.FleetScreen}))),y=(0,i.lazy)(()=>f().then(e=>({default:e.MoreScreen}))),b=[l,o,s,u,c,d,f];function x(){for(let e of b)e().catch(()=>void 0)}function S({route:e}){switch(e.screen){case`agents`:return(0,a.jsx)(p,{});case`agent`:return(0,a.jsx)(m,{sessionId:e.id,pane:e.pane},e.id);case`new`:return(0,a.jsx)(h,{});case`needs`:return(0,a.jsx)(g,{});case`leader`:return(0,a.jsx)(_,{});case`fleet`:return(0,a.jsx)(v,{});case`more`:return(0,a.jsx)(y,{})}}export{S as ScreenHost,x as prefetchMobileScreens};
|
|
3
|
-
//# sourceMappingURL=ScreenHost-BGSxFyWK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":";8HASM,YAAqB,OAAO,8FAC5B,YAA0B,OAAO,sIACjC,YAAuB,OAAO,wGAC9B,YAAuB,OAAO,4IAC9B,YAAqB,OAAO,2HAC5B,YAAoB,OAAO,6HAC3B,YAAmB,OAAO,iGAE1B,KAAe,YAAW,EAAa,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,EAAE,YAAa,EAAE,CAAC,EACnF,KAAoB,YAAW,EAAkB,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,EAAE,iBAAkB,EAAE,CAAC,EAClG,KAAiB,YAAW,EAAe,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,EAAE,cAAe,EAAE,CAAC,EACzF,KAAiB,YAAW,EAAe,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,EAAE,cAAe,EAAE,CAAC,EACzF,KAAe,YAAW,EAAa,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,EAAE,YAAa,EAAE,CAAC,EACnF,KAAc,YAAW,EAAY,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,EAAE,WAAY,EAAE,CAAC,EAChF,KAAa,YAAW,EAAW,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,EAAE,UAAW,EAAE,CAAC,EAG7E,EAAiB,CAAC,EAAgB,EAAc,EAAmB,EAAc,EAAgB,EAAa,CAAU,EAG9H,SAAgB,GAA8B,CAC5C,IAAK,IAAM,KAAQ,EAAgB,EAAU,CAAC,CAAC,UAAY,MAAS,CACtE,CAEA,SAAgB,EAAW,CAAE,SAA8D,CACzF,OAAQ,EAAM,OAAd,CACE,IAAK,SACH,OAAO,SAAC,EAAD,CAAe,GACxB,IAAK,QACH,OAAO,SAAC,EAAD,CAAkC,UAAW,EAAM,GAAI,KAAM,EAAM,IAAO,EAAlD,EAAM,EAA4C,EACnF,IAAK,MACH,OAAO,SAAC,EAAD,CAAiB,GAC1B,IAAK,QACH,OAAO,SAAC,EAAD,CAAiB,GAC1B,IAAK,SACH,OAAO,SAAC,EAAD,CAAe,GACxB,IAAK,QACH,OAAO,SAAC,EAAD,CAAc,GACvB,IAAK,OACH,OAAO,SAAC,EAAD,CAAa,EACxB,CACF","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/ScreenHost.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/ScreenHost.tsx — every screen but Home, each its own\n * chunk. The host itself is off the first paint too (MobileShell preloads\n * it), so the first paint does not even carry these imports' preload lists.\n */\nimport { lazy } from 'react';\nimport type { MobileRoute } from './mobile-router.js';\n\n// Literal dynamic imports: each screen is its own chunk.\nconst importAgents = () => import('./screens/AgentsScreen.js');\nconst importAgentDetail = () => import('./screens/AgentDetailScreen.js');\nconst importNewAgent = () => import('./screens/NewAgentScreen.js');\nconst importNeedsYou = () => import('./screens/NeedsYouScreen.js');\nconst importLeader = () => import('./screens/LeaderScreen.js');\nconst importFleet = () => import('./screens/FleetScreen.js');\nconst importMore = () => import('./screens/MoreScreen.js');\n\nconst AgentsScreen = lazy(() => importAgents().then((m) => ({ default: m.AgentsScreen })));\nconst AgentDetailScreen = lazy(() => importAgentDetail().then((m) => ({ default: m.AgentDetailScreen })));\nconst NewAgentScreen = lazy(() => importNewAgent().then((m) => ({ default: m.NewAgentScreen })));\nconst NeedsYouScreen = lazy(() => importNeedsYou().then((m) => ({ default: m.NeedsYouScreen })));\nconst LeaderScreen = lazy(() => importLeader().then((m) => ({ default: m.LeaderScreen })));\nconst FleetScreen = lazy(() => importFleet().then((m) => ({ default: m.FleetScreen })));\nconst MoreScreen = lazy(() => importMore().then((m) => ({ default: m.MoreScreen })));\n\n/** Most-visited first: Needs you and Agents are what a phone is opened for. */\nconst SCREEN_IMPORTS = [importNeedsYou, importAgents, importAgentDetail, importLeader, importNewAgent, importFleet, importMore];\n\n/** Warm every screen chunk (the shell calls this once the phone is idle); failures are the mount's to report. */\nexport function prefetchMobileScreens(): void {\n for (const load of SCREEN_IMPORTS) void load().catch(() => undefined);\n}\n\nexport function ScreenHost({ route }: { route: Exclude<MobileRoute, { screen: 'home' }> }) {\n switch (route.screen) {\n case 'agents':\n return <AgentsScreen />;\n case 'agent':\n return <AgentDetailScreen key={route.id} sessionId={route.id} pane={route.pane} />;\n case 'new':\n return <NewAgentScreen />;\n case 'needs':\n return <NeedsYouScreen />;\n case 'leader':\n return <LeaderScreen />;\n case 'fleet':\n return <FleetScreen />;\n case 'more':\n return <MoreScreen />;\n }\n}\n"],"file":"ScreenHost-BGSxFyWK.js"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{T as r,d as i,n as a}from"./verse-model-DAOz9LrY.js";import{n as o,r as s}from"./seat-readiness-a5B9iqP-.js";import{n as c}from"./seat-subscription-BQOYfPCE.js";import{b as l,g as u,h as d,m as f,p,r as m,x as h}from"./context-model-CKXUZd0O.js";import{t as g}from"./Composer.module-BaUmqC4A.js";var _=e(n(),1),v=t(),y=`window unknown`;function b(e){return JSON.stringify([e.seatId,e.model])}function x(e){try{let t=JSON.parse(e);if(!Array.isArray(t)||t.length!==2)return null;let[n,r]=t;return typeof n!=`string`||typeof r!=`string`?null:{seatId:n,model:r}}catch{return null}}function S(e,t=null){for(let n of i(e))for(let e of n.seats){if(e.health.state===`unavailable`||s(e,C(t,e.id))!==null)continue;let n=e.models.find(t=>u(e,t)===null);if(n)return{seatId:e.id,model:n.id}}return null}function C(e,t){return e?.find(e=>e.seatId===t)??null}function w(e,t,n=null,r=Date.now()){let i=s(e,C(n,e.id),r);if(i===null)return null;let a=i.reason.replace(`${e.label} is `,``).replace(/ to use this seat\.$/,``).replace(/\.$/,``),c=o(e.id,t,n,r)[0],l=c===void 0?null:t.find(e=>e.id===c)?.label??null;return l===null?a:`${a} · try ${l}`}function T(e){let t=d(e.workingSetTokens,e.model,e.mode,e.seat.engine),n=t===null?``:` · ${m[t]}`,r=e.note===null?``:` (${e.note})`,i=typeof e.model.priceNote==`string`&&e.model.priceNote?e.model.priceNote:null,a=p(e.model,e.mode),o=[i,i!==null&&a===y?null:a].filter(e=>e!==null).join(` · `);return`${e.seat.label} — ${e.model.label} · ${o}${n}${r}`}function E(e,t){let n=[],r=null;for(let i of t){if(!i.models.some(e=>typeof e.group==`string`&&e.group)){r||(r={key:e,label:e,rows:[]},n.push(r));for(let e of i.models)r.rows.push({seat:i,model:e});continue}for(let e of i.models){let t=typeof e.group==`string`&&e.group?e.group:`Other`,r=`${i.id}\u0000${t}`,a=n.at(-1);a&&a.key===r?a.rows.push({seat:i,model:e}):n.push({key:r,label:`${i.label} · ${t}`,rows:[{seat:i,model:e}]})}}return n}function D(e,t,n){let r=[];n!==null&&r.push(n.charAt(0).toUpperCase()+n.slice(1)),r.push(f(t)),typeof t.priceNote==`string`&&t.priceNote&&r.push(`Price: ${t.priceNote}.`);let i=l(e);return i!==null&&r.push(`Runs ${i}.`),r.push(...h(e)),r.join(`
|
|
2
|
-
`)}function O({seats:e,value:t,onChange:n,disabled:o=!1,label:s=`Seat and model`,id:l,compact:d=!1,workingSetTokens:f=null,modeFor:p,healthReports:m=null}){let h=(0,_.useId)(),y=l??h,[S,C]=(0,_.useState)(``),O=!d&&e.reduce((e,t)=>e+t.models.length,0)>12,k=O?S.trim().toLocaleLowerCase().split(/\s+/).filter(Boolean):[],A=(e,t)=>{let n=`${e.label} ${e.id} ${a[e.engine]} ${t.label} ${t.id} ${t.group??``}`.toLocaleLowerCase();return k.every(e=>n.includes(e))},j=e.reduce((e,t)=>e+t.models.filter(e=>A(t,e)).length,0),M=i(e),N=t?b(t):``,P=t&&e.some(e=>e.id===t.seatId&&e.models.some(e=>e.id===t.model));return(0,v.jsxs)(`div`,{className:`${g.seatField} ${d?g.seatFieldCompact:``}`,children:[(0,v.jsx)(`label`,{className:d?`visually-hidden`:g.fieldLabel,htmlFor:y,children:s}),O?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`input`,{type:`search`,className:g.seatSelect,"aria-label":`Search ${s.toLocaleLowerCase()}`,placeholder:`Find an account or model…`,value:S,disabled:o,onChange:e=>C(e.target.value)}),k.length>0?(0,v.jsx)(`span`,{className:g.seatSearchStatus,role:`status`,children:j===0?`No matching accounts or models. Try another search.`:`${j} matching ${j===1?`choice`:`choices`}.`}):null]}):null,(0,v.jsxs)(`select`,{id:y,className:g.seatSelect,value:P?N:``,disabled:o||M.length===0,"aria-label":d?s:void 0,onChange:e=>{let t=x(e.target.value);t&&n(t)},children:[P?null:(0,v.jsx)(`option`,{value:``,disabled:!0,children:M.length===0?`No seats discovered`:`Choose a seat…`}),M.flatMap(n=>{let i=new Map;for(let t of n.seats){let n=r(t)??w(t,e,m),a=c(t),o=a.cls===`unread`||a.kind===`local`?null:`${a.plan===null?``:`${a.plan} · `}${a.word} · ${a.summary}`;i.set(t.id,{seatReason:n,capacityNote:o})}return E(a[n.engine],n.seats).map(e=>({...e,rows:e.rows.filter(({seat:e,model:n})=>A(e,n)||t?.seatId===e.id&&t.model===n.id)})).filter(e=>e.rows.length>0).map(e=>(0,v.jsx)(`optgroup`,{label:e.label,children:e.rows.map(({seat:e,model:t})=>{let{seatReason:n,capacityNote:r}=i.get(e.id),a=n??u(e,t),o=a===null?r:`unavailable: ${a}`,s=p?.(e,t)??`standard`,c=b({seatId:e.id,model:t.id});return(0,v.jsx)(`option`,{value:c,disabled:a!==null,title:D(e,t,o),children:T({seat:e,model:t,mode:s,workingSetTokens:f,note:o})},c)})},`${n.engine}:${e.key}`))})]})]})}export{S as n,O as t};
|
|
3
|
-
//# sourceMappingURL=SeatSelector-B4lRZl0K.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SeatSelector-B4lRZl0K.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/SeatSelector.tsx"],"sourcesContent":["/**\n * routes/verse/SeatSelector.tsx — grouped seat/model picker. A native\n * <select> with one <optgroup> per engine (Claude · Codex · Grok · Local)\n * and one option per seat×model; seats whose health is `unavailable` are\n * disabled with the reason in the label (and `title`), so the operator sees\n * why rather than just a greyed row. Value is `[seatId, modelId]` JSON so\n * ids containing ':' or '/' can never collide.\n *\n * Every option also carries its seat's CAPACITY (`seat-subscription.ts`).\n * Without it an exhausted seat was indistinguishable from a fresh one here:\n * the only annotation was `seatUnavailableReason`, which fires solely on\n * `health.state === 'unavailable'`, and Claude's health is `unknown` BY\n * CONSTRUCTION (docs/VERSE-TELEMETRY-V2.md). A Claude seat whose binding\n * weekly window read 100% used therefore appeared as an ordinary, enabled,\n * unannotated choice, and the exhaustion was discovered at turn time — the\n * exact failure the Usage section exists to prevent.\n *\n * The annotation reads `plan · word · binding phrase` — the plan tier only\n * when the provider published one, so nothing is invented for a seat whose\n * subscription was never read.\n *\n * A `blocked` seat is MARKED but stays selectable: a used-up window can\n * coexist with a spendable credit balance, so refusing the choice would be a\n * stronger claim than the data supports.\n *\n * V3.10 — EXCEPT when the server's verdict IS a refusal. The session engine now\n * refuses a turn on a seat whose `capacity.usability` is `exhausted` (every\n * read window spent, no credits) or `signed-out` — the same rule, from the same\n * function (core/verse/seat-readiness.ts `seatBlock`). Offering such a seat\n * here would only move the failure from the picker to the first send, so its\n * rows are disabled and say why, when it resets, and where to go instead\n * (\"unavailable: out of usage — resets Fri 2:25 PM · try Grok\"). A seat that is\n * merely `tight` (a spent window beside spendable credits, or a spent per-model\n * window beside healthy account-wide ones) stays selectable, as before.\n *\n * V3.9 — EVERY ROW SAYS WHAT CONTEXT IT BUYS. A row used to read \"Claude Max —\n * Opus 5\", and the only window anywhere near the picker was the seat's DEFAULT\n * model's (so \"200k\" for every 1M Claude model). Now each row carries its own\n * model's window and compaction point in the mode that row would run in\n * (\"1M ctx · compacts ≈367k\"), and — when the dialog has sized the chosen\n * folders — whether that code would fit. A model the seat's pinned CLI cannot\n * run (Opus 5.5 on a 2.1.257 seat) is LISTED, disabled, with its reason, so\n * the operator learns why it is missing instead of wondering. The option's\n * tooltip carries the long form: the window's provenance, the pinned CLI\n * version and the seat's own notes. The new-chat dialog repeats those for the\n * chosen seat in visible text, because WebKit's native menus never show an\n * option's title.\n */\nimport { useId, useState } from 'react';\nimport type { VerseModelOption, VerseSeat } from '../../data/api-types.js';\nimport type { VerseContextMode } from '../../../core/verse/types.js';\nimport type { SeatHealthReport } from '../../../core/verse/health-types.js';\nimport { rankSeatAlternatives, seatBlock } from '../../../core/verse/seat-readiness.js';\nimport { seatSubscription } from './seat-subscription.js';\nimport {\n FIT_SHORT,\n modelContextPhrase,\n modelContextSentence,\n modelFit,\n modelUnavailableReason,\n seatCliLine,\n seatContextNotes,\n} from './usage/context-model.js';\nimport { ENGINE_LABEL, groupSeats, seatUnavailableReason } from './verse-model.js';\nimport styles from './Composer.module.css';\n\n/** What `modelContextPhrase` says for a model with no known window. */\nconst WINDOW_UNKNOWN = 'window unknown';\n\nexport interface SeatChoice {\n seatId: string;\n model: string;\n}\n\nexport interface SeatSelectorProps {\n seats: readonly VerseSeat[];\n value: SeatChoice | null;\n onChange: (choice: SeatChoice) => void;\n disabled?: boolean;\n label?: string;\n id?: string;\n compact?: boolean;\n /**\n * Estimated tokens of the chosen folders' tracked code (GET /context-fit).\n * When present every row also says whether that code fits the model. Null\n * or absent: nothing is claimed.\n */\n workingSetTokens?: number | null;\n /**\n * The context mode each row would run in, so its compaction point is the\n * one the operator would actually get. Absent → standard for every row.\n */\n modeFor?: (seat: VerseSeat, model: VerseModelOption) => VerseContextMode;\n /**\n * V3.10. Live seat health (GET /api/verse/health). Optional: without it the\n * seat's own `capacity.usability` still decides which seats are blocked.\n */\n healthReports?: readonly SeatHealthReport[] | null;\n}\n\nexport function encodeSeatChoice(choice: SeatChoice): string {\n return JSON.stringify([choice.seatId, choice.model]);\n}\n\nexport function decodeSeatChoice(value: string): SeatChoice | null {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (!Array.isArray(parsed) || parsed.length !== 2) return null;\n const [seatId, model] = parsed as [unknown, unknown];\n if (typeof seatId !== 'string' || typeof model !== 'string') return null;\n return { seatId, model };\n } catch {\n return null;\n }\n}\n\n/**\n * First selectable seat (ready/degraded/unknown) with its first RUNNABLE\n * model. The seat catalog already puts a runnable model first; skipping an\n * unavailable one here as well means a stale or hand-built roster can never\n * make \"Start chat\" land on a model the pinned CLI would reject.\n */\nexport function defaultSeatChoice(\n seats: readonly VerseSeat[],\n healthReports: readonly SeatHealthReport[] | null = null,\n): SeatChoice | null {\n for (const group of groupSeats(seats)) {\n for (const seat of group.seats) {\n if (seat.health.state === 'unavailable') continue;\n // A seat the engine would refuse is never the default (V3.10).\n if (seatBlock(seat, reportFor(healthReports, seat.id)) !== null) continue;\n const model = seat.models.find((m) => modelUnavailableReason(seat, m) === null);\n if (model) return { seatId: seat.id, model: model.id };\n }\n }\n return null;\n}\n\nfunction reportFor(reports: readonly SeatHealthReport[] | null | undefined, seatId: string): SeatHealthReport | null {\n return reports?.find((report) => report.seatId === seatId) ?? null;\n}\n\n/**\n * Why a seat is refused, as an inline note — \"out of usage — resets Fri\n * 2:25 PM · try Grok\" / \"signed out — reconnect it · try Grok\" — or null when\n * the engine would accept it. The seat's label is dropped (the row already\n * leads with it) and the best alternative is named, so the row says where to\n * go instead.\n */\nexport function seatBlockedNote(\n seat: VerseSeat,\n seats: readonly VerseSeat[],\n healthReports: readonly SeatHealthReport[] | null = null,\n now: number = Date.now(),\n): string | null {\n const block = seatBlock(seat, reportFor(healthReports, seat.id), now);\n if (block === null) return null;\n const phrase = block.reason\n .replace(`${seat.label} is `, '')\n .replace(/ to use this seat\\.$/, '')\n .replace(/\\.$/, '');\n const best = rankSeatAlternatives(seat.id, seats, healthReports, now)[0];\n const bestLabel = best === undefined ? null : seats.find((candidate) => candidate.id === best)?.label ?? null;\n return bestLabel === null ? phrase : `${phrase} · try ${bestLabel}`;\n}\n\n/**\n * The option's text, which is also its accessible name:\n * \"Claude Max — Opus 5.5 · 1M ctx · compacts ≈367k · code fits (usable · …)\".\n * Seat and model lead so the CLOSED select still says what was chosen.\n */\nexport function seatOptionText(input: {\n seat: VerseSeat;\n model: VerseModelOption;\n mode: VerseContextMode;\n workingSetTokens?: number | null;\n note: string | null;\n}): string {\n // The seat's own engine: the fit adds THAT CLI's estimated fixed prompt.\n const verdict = modelFit(input.workingSetTokens, input.model, input.mode, input.seat.engine);\n const fit = verdict === null ? '' : ` · ${FIT_SHORT[verdict]}`;\n const note = input.note === null ? '' : ` (${input.note})`;\n // 3.15: a priced model says what it costs (\"Free\", \"$4 in · $20 out per 1M\");\n // one whose window the vendor manages (Devin) drops the bare \"window unknown\".\n const price = typeof input.model.priceNote === 'string' && input.model.priceNote ? input.model.priceNote : null;\n const context = modelContextPhrase(input.model, input.mode);\n const tail = [price, price !== null && context === WINDOW_UNKNOWN ? null : context].filter((part) => part !== null).join(' · ');\n return `${input.seat.label} — ${input.model.label} · ${tail}${fit}${note}`;\n}\n\n/**\n * The native <optgroup>s of one engine: normally one (\"Devin\"); a seat whose\n * models carry a family `group` (the Devin CLI catalog) gets one optgroup per\n * family instead (\"Devin (CLI) · SWE-2\"), since optgroups cannot nest. Pure.\n */\nexport function seatOptionGroups(engineLabel: string, seats: readonly VerseSeat[]): Array<{ key: string; label: string; rows: Array<{ seat: VerseSeat; model: VerseModelOption }> }> {\n const out: Array<{ key: string; label: string; rows: Array<{ seat: VerseSeat; model: VerseModelOption }> }> = [];\n let plain: (typeof out)[number] | null = null;\n for (const seat of seats) {\n const grouped = seat.models.some((m) => typeof m.group === 'string' && m.group);\n if (!grouped) {\n if (!plain) {\n plain = { key: engineLabel, label: engineLabel, rows: [] };\n out.push(plain);\n }\n for (const model of seat.models) plain.rows.push({ seat, model });\n continue;\n }\n for (const model of seat.models) {\n const family = typeof model.group === 'string' && model.group ? model.group : 'Other';\n const key = `${seat.id}\\u0000${family}`;\n const last = out.at(-1);\n if (last && last.key === key) last.rows.push({ seat, model });\n else out.push({ key, label: `${seat.label} · ${family}`, rows: [{ seat, model }] });\n }\n }\n return out;\n}\n\n/**\n * The option's tooltip: the note first (it is why the row is marked), then the\n * model's full context sentence, then the seat facts no row has room for.\n */\nexport function seatOptionTitle(seat: VerseSeat, model: VerseModelOption, note: string | null): string {\n const lines: string[] = [];\n if (note !== null) lines.push(note.charAt(0).toUpperCase() + note.slice(1));\n lines.push(modelContextSentence(model));\n if (typeof model.priceNote === 'string' && model.priceNote) lines.push(`Price: ${model.priceNote}.`);\n const cli = seatCliLine(seat);\n if (cli !== null) lines.push(`Runs ${cli}.`);\n lines.push(...seatContextNotes(seat));\n return lines.join('\\n');\n}\n\nexport function SeatSelector({\n seats,\n value,\n onChange,\n disabled = false,\n label = 'Seat and model',\n id,\n compact = false,\n workingSetTokens = null,\n modeFor,\n healthReports = null,\n}: SeatSelectorProps) {\n const generated = useId();\n const selectId = id ?? generated;\n const [search, setSearch] = useState('');\n const searchable = !compact && seats.reduce((count, seat) => count + seat.models.length, 0) > 12;\n const terms = searchable ? search.trim().toLocaleLowerCase().split(/\\s+/).filter(Boolean) : [];\n const matches = (seat: VerseSeat, model: VerseModelOption) => {\n const text = `${seat.label} ${seat.id} ${ENGINE_LABEL[seat.engine]} ${model.label} ${model.id} ${model.group ?? ''}`.toLocaleLowerCase();\n return terms.every((term) => text.includes(term));\n };\n const matchCount = seats.reduce((count, seat) => count + seat.models.filter((model) => matches(seat, model)).length, 0);\n const groups = groupSeats(seats);\n const current = value ? encodeSeatChoice(value) : '';\n const known = value && seats.some((s) => s.id === value.seatId && s.models.some((m) => m.id === value.model));\n return (\n <div className={`${styles.seatField} ${compact ? styles.seatFieldCompact : ''}`}>\n <label className={compact ? 'visually-hidden' : styles.fieldLabel} htmlFor={selectId}>{label}</label>\n {searchable ? (\n <>\n <input type=\"search\" className={styles.seatSelect} aria-label={`Search ${label.toLocaleLowerCase()}`}\n placeholder=\"Find an account or model…\" value={search} disabled={disabled}\n onChange={(event) => setSearch(event.target.value)} />\n {terms.length > 0 ? <span className={styles.seatSearchStatus} role=\"status\">\n {matchCount === 0 ? 'No matching accounts or models. Try another search.' : `${matchCount} matching ${matchCount === 1 ? 'choice' : 'choices'}.`}\n </span> : null}\n </>\n ) : null}\n <select id={selectId} className={styles.seatSelect} value={known ? current : ''} disabled={disabled || groups.length === 0}\n aria-label={compact ? label : undefined}\n onChange={(event) => {\n const choice = decodeSeatChoice(event.target.value);\n if (choice) onChange(choice);\n }}>\n {!known ? <option value=\"\" disabled>{groups.length === 0 ? 'No seats discovered' : 'Choose a seat…'}</option> : null}\n {groups.flatMap((group) => {\n // Per seat, computed once for all its rows.\n const seatNotes = new Map<string, { seatReason: string | null; capacityNote: string | null }>();\n for (const seat of group.seats) {\n // Reachability first, then the engine's own refusal (V3.10).\n const seatReason = seatUnavailableReason(seat) ?? seatBlockedNote(seat, seats, healthReports);\n const capacity = seatSubscription(seat);\n // `unread` is left unsaid: \"no reading\" on every Claude row\n // would be noise, and the absent figure already says it. A local\n // seat is left unsaid too — it has no subscription to report,\n // and its readiness is already carried by the disabled state.\n const capacityNote =\n capacity.cls === 'unread' || capacity.kind === 'local'\n ? null\n : `${capacity.plan === null ? '' : `${capacity.plan} · `}${capacity.word} · ${capacity.summary}`;\n seatNotes.set(seat.id, { seatReason, capacityNote });\n }\n return seatOptionGroups(ENGINE_LABEL[group.engine], group.seats).map((optgroup) => ({\n ...optgroup,\n // Keep the current selection even when the filter does not match;\n // searching must never silently switch the account that will run.\n rows: optgroup.rows.filter(({ seat, model }) => matches(seat, model) ||\n (value?.seatId === seat.id && value.model === model.id)),\n })).filter((optgroup) => optgroup.rows.length > 0).map((optgroup) => (\n <optgroup key={`${group.engine}:${optgroup.key}`} label={optgroup.label}>\n {optgroup.rows.map(({ seat, model }) => {\n const { seatReason, capacityNote } = seatNotes.get(seat.id)!;\n // The seat's outage outranks the model's own reason: nothing\n // on an unreachable seat runs, whatever its CLI version.\n const reason = seatReason ?? modelUnavailableReason(seat, model);\n // The label reads inline after the model name, so it stays\n // lowercase; the tooltip stands alone, so it is sentence case.\n const note = reason !== null ? `unavailable: ${reason}` : capacityNote;\n const mode = modeFor?.(seat, model) ?? 'standard';\n const optionValue = encodeSeatChoice({ seatId: seat.id, model: model.id });\n return (\n <option key={optionValue} value={optionValue} disabled={reason !== null}\n title={seatOptionTitle(seat, model, note)}>\n {seatOptionText({ seat, model, mode, workingSetTokens, note })}\n </option>\n );\n })}\n </optgroup>\n ));\n })}\n </select>\n </div>\n );\n}\n"],"mappings":"saAmEM,EAAiB,iBAiCvB,SAAgB,EAAiB,EAA4B,CAC3D,OAAO,KAAK,UAAU,CAAC,EAAO,OAAQ,EAAO,KAAK,CAAC,CACrD,CAEA,SAAgB,EAAiB,EAAkC,CACjE,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,CAAK,EAC/B,GAAI,CAAC,MAAM,QAAQ,CAAM,GAAK,EAAO,SAAW,EAAG,OAAO,KAC1D,GAAM,CAAC,EAAQ,GAAS,EAExB,OADI,OAAO,GAAW,UAAY,OAAO,GAAU,SAAiB,KAC7D,CAAE,SAAQ,OAAM,CACzB,MAAQ,CACN,OAAO,IACT,CACF,CAQA,SAAgB,EACd,EACA,EAAoD,KACjC,CACnB,IAAK,IAAM,KAAS,EAAW,CAAK,EAClC,IAAK,IAAM,KAAQ,EAAM,MAAO,CAG9B,GAFI,EAAK,OAAO,QAAU,eAEtB,EAAU,EAAM,EAAU,EAAe,EAAK,EAAE,CAAC,IAAM,KAAM,SACjE,IAAM,EAAQ,EAAK,OAAO,KAAM,GAAM,EAAuB,EAAM,CAAC,IAAM,IAAI,EAC9E,GAAI,EAAO,MAAO,CAAE,OAAQ,EAAK,GAAI,MAAO,EAAM,EAAG,CACvD,CAEF,OAAO,IACT,CAEA,SAAS,EAAU,EAAyD,EAAyC,CACnH,OAAO,GAAS,KAAM,GAAW,EAAO,SAAW,CAAM,GAAK,IAChE,CASA,SAAgB,EACd,EACA,EACA,EAAoD,KACpD,EAAc,KAAK,IAAI,EACR,CACf,IAAM,EAAQ,EAAU,EAAM,EAAU,EAAe,EAAK,EAAE,EAAG,CAAG,EACpE,GAAI,IAAU,KAAM,OAAO,KAC3B,IAAM,EAAS,EAAM,OAClB,QAAQ,GAAG,EAAK,MAAM,MAAO,EAAE,CAAC,CAChC,QAAQ,uBAAwB,EAAE,CAAC,CACnC,QAAQ,MAAO,EAAE,EACd,EAAO,EAAqB,EAAK,GAAI,EAAO,EAAe,CAAG,CAAC,CAAC,GAChE,EAAY,IAAS,IAAA,GAAY,KAAO,EAAM,KAAM,GAAc,EAAU,KAAO,CAAI,CAAC,EAAE,OAAS,KACzG,OAAO,IAAc,KAAO,EAAS,GAAG,EAAO,SAAS,GAC1D,CAOA,SAAgB,EAAe,EAMpB,CAET,IAAM,EAAU,EAAS,EAAM,iBAAkB,EAAM,MAAO,EAAM,KAAM,EAAM,KAAK,MAAM,EACrF,EAAM,IAAY,KAAO,GAAK,MAAM,EAAU,KAC9C,EAAO,EAAM,OAAS,KAAO,GAAK,KAAK,EAAM,KAAK,GAGlD,EAAQ,OAAO,EAAM,MAAM,WAAc,UAAY,EAAM,MAAM,UAAY,EAAM,MAAM,UAAY,KACrG,EAAU,EAAmB,EAAM,MAAO,EAAM,IAAI,EACpD,EAAO,CAAC,EAAO,IAAU,MAAQ,IAAY,EAAiB,KAAO,CAAO,CAAC,CAAC,OAAQ,GAAS,IAAS,IAAI,CAAC,CAAC,KAAK,KAAK,EAC9H,MAAO,GAAG,EAAM,KAAK,MAAM,KAAK,EAAM,MAAM,MAAM,KAAK,IAAO,IAAM,GACtE,CAOA,SAAgB,EAAiB,EAAqB,EAA+H,CACnL,IAAM,EAAwG,CAAC,EAC3G,EAAqC,KACzC,IAAK,IAAM,KAAQ,EAAO,CAExB,GAAI,CADY,EAAK,OAAO,KAAM,GAAM,OAAO,EAAE,OAAU,UAAY,EAAE,KACpE,EAAS,CACP,IACH,EAAQ,CAAE,IAAK,EAAa,MAAO,EAAa,KAAM,CAAC,CAAE,EACzD,EAAI,KAAK,CAAK,GAEhB,IAAK,IAAM,KAAS,EAAK,OAAQ,EAAM,KAAK,KAAK,CAAE,OAAM,OAAM,CAAC,EAChE,QACF,CACA,IAAK,IAAM,KAAS,EAAK,OAAQ,CAC/B,IAAM,EAAS,OAAO,EAAM,OAAU,UAAY,EAAM,MAAQ,EAAM,MAAQ,QACxE,EAAM,GAAG,EAAK,GAAG,QAAQ,IACzB,EAAO,EAAI,GAAG,EAAE,EAClB,GAAQ,EAAK,MAAQ,EAAK,EAAK,KAAK,KAAK,CAAE,OAAM,OAAM,CAAC,EACvD,EAAI,KAAK,CAAE,MAAK,MAAO,GAAG,EAAK,MAAM,KAAK,IAAU,KAAM,CAAC,CAAE,OAAM,OAAM,CAAC,CAAE,CAAC,CACpF,CACF,CACA,OAAO,CACT,CAMA,SAAgB,EAAgB,EAAiB,EAAyB,EAA6B,CACrG,IAAM,EAAkB,CAAC,EACrB,IAAS,MAAM,EAAM,KAAK,EAAK,OAAO,CAAC,CAAC,CAAC,YAAY,EAAI,EAAK,MAAM,CAAC,CAAC,EAC1E,EAAM,KAAK,EAAqB,CAAK,CAAC,EAClC,OAAO,EAAM,WAAc,UAAY,EAAM,WAAW,EAAM,KAAK,UAAU,EAAM,UAAU,EAAE,EACnG,IAAM,EAAM,EAAY,CAAI,EAG5B,OAFI,IAAQ,MAAM,EAAM,KAAK,QAAQ,EAAI,EAAE,EAC3C,EAAM,KAAK,GAAG,EAAiB,CAAI,CAAC,EAC7B,EAAM,KAAK;CAAI,CACxB,CAEA,SAAgB,EAAa,CAC3B,QACA,QACA,WACA,WAAW,GACX,QAAQ,iBACR,KACA,UAAU,GACV,mBAAmB,KACnB,UACA,gBAAgB,MACI,CACpB,IAAM,GAAA,EAAY,EAAA,MAAA,CAAM,EAClB,EAAW,GAAM,EACjB,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,EAAE,EACjC,EAAa,CAAC,GAAW,EAAM,QAAQ,EAAO,IAAS,EAAQ,EAAK,OAAO,OAAQ,CAAC,EAAI,GACxF,EAAQ,EAAa,EAAO,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO,EAAI,CAAC,EACvF,GAAW,EAAiB,IAA4B,CAC5D,IAAM,EAAO,GAAG,EAAK,MAAM,GAAG,EAAK,GAAG,GAAG,EAAa,EAAK,QAAQ,GAAG,EAAM,MAAM,GAAG,EAAM,GAAG,GAAG,EAAM,OAAS,KAAK,kBAAkB,EACvI,OAAO,EAAM,MAAO,GAAS,EAAK,SAAS,CAAI,CAAC,CAClD,EACM,EAAa,EAAM,QAAQ,EAAO,IAAS,EAAQ,EAAK,OAAO,OAAQ,GAAU,EAAQ,EAAM,CAAK,CAAC,CAAC,CAAC,OAAQ,CAAC,EAChH,EAAS,EAAW,CAAK,EACzB,EAAU,EAAQ,EAAiB,CAAK,EAAI,GAC5C,EAAQ,GAAS,EAAM,KAAM,GAAM,EAAE,KAAO,EAAM,QAAU,EAAE,OAAO,KAAM,GAAM,EAAE,KAAO,EAAM,KAAK,CAAC,EAC5G,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,UAAU,GAAG,EAAU,EAAO,iBAAmB,KAA3E,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAU,kBAAoB,EAAO,WAAY,QAAS,EAAW,SAAA,CAAa,CAAA,EACnG,GACC,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,SAAS,UAAW,EAAO,WAAY,aAAY,UAAU,EAAM,kBAAkB,IAC/F,YAAY,4BAA4B,MAAO,EAAkB,WACjE,SAAW,GAAU,EAAU,EAAM,OAAO,KAAK,CAAI,CAAA,EACtD,EAAM,OAAS,GAAI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,iBAAkB,KAAK,SAChE,SAAA,IAAe,EAAI,sDAAwD,GAAG,EAAW,YAAY,IAAe,EAAI,SAAW,UAAU,EAC1I,CAAA,EAAI,IACV,CAAA,CAAA,EACA,MACJ,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,GAAI,EAAU,UAAW,EAAO,WAAY,MAAO,EAAQ,EAAU,GAAI,SAAU,GAAY,EAAO,SAAW,EACvH,aAAY,EAAU,EAAQ,IAAA,GAC9B,SAAW,GAAU,CACnB,IAAM,EAAS,EAAiB,EAAM,OAAO,KAAK,EAC9C,GAAQ,EAAS,CAAM,CAC7B,EALF,SAAA,CAMI,EAA8G,MAAtG,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,GAAU,SAAA,EAAO,SAAW,EAAI,sBAAwB,gBAAyB,CAAA,EAC3G,EAAO,QAAS,GAAU,CAEzB,IAAM,EAAY,IAAI,IACtB,IAAK,IAAM,KAAQ,EAAM,MAAO,CAE9B,IAAM,EAAa,EAAsB,CAAI,GAAK,EAAgB,EAAM,EAAO,CAAa,EACtF,EAAW,EAAiB,CAAI,EAKhC,EACJ,EAAS,MAAQ,UAAY,EAAS,OAAS,QAC3C,KACA,GAAG,EAAS,OAAS,KAAO,GAAK,GAAG,EAAS,KAAK,OAAO,EAAS,KAAK,KAAK,EAAS,UAC3F,EAAU,IAAI,EAAK,GAAI,CAAE,aAAY,cAAa,CAAC,CACrD,CACA,OAAO,EAAiB,EAAa,EAAM,QAAS,EAAM,KAAK,CAAC,CAAC,IAAK,IAAc,CAClF,GAAG,EAGH,KAAM,EAAS,KAAK,QAAQ,CAAE,OAAM,WAAY,EAAQ,EAAM,CAAK,GAChE,GAAO,SAAW,EAAK,IAAM,EAAM,QAAU,EAAM,EAAG,CAC3D,EAAE,CAAC,CAAC,OAAQ,GAAa,EAAS,KAAK,OAAS,CAAC,CAAC,CAAC,IAAK,IACtD,EAAA,EAAA,IAAA,CAAC,WAAD,CAAkD,MAAO,EAAS,MAC/D,SAAA,EAAS,KAAK,KAAK,CAAE,OAAM,WAAY,CACtC,GAAM,CAAE,aAAY,gBAAiB,EAAU,IAAI,EAAK,EAAE,EAGpD,EAAS,GAAc,EAAuB,EAAM,CAAK,EAGzD,EAAO,IAAW,KAAkC,EAA3B,gBAAgB,IACzC,EAAO,IAAU,EAAM,CAAK,GAAK,WACjC,EAAc,EAAiB,CAAE,OAAQ,EAAK,GAAI,MAAO,EAAM,EAAG,CAAC,EACzE,OACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAA0B,MAAO,EAAa,SAAU,IAAW,KACjE,MAAO,EAAgB,EAAM,EAAO,CAAI,EACvC,SAAA,EAAe,CAAE,OAAM,QAAO,OAAM,mBAAkB,MAAK,CAAC,CACvD,EAHK,CAGL,CAEZ,CAAC,CACO,EAlBK,GAAG,EAAM,OAAO,GAAG,EAAS,KAkBjC,CACX,CACH,CAAC,CACK,GACL,GAET"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";var r=e(n(),1),i={group:`_group_15ia8_1`,block:`_block_15ia8_11`,option:`_option_15ia8_16`,sm:`_sm_15ia8_45`,glyph:`_glyph_15ia8_72`},a=t();function o({options:e,value:t,onChange:n,size:o=`md`,block:s=!1,className:c,...l}){let u=(0,r.useRef)(null);function d(r){let i=e.filter(e=>!e.disabled);if(i.length===0)return;let a=i[((i.findIndex(e=>e.value===t)+r)%i.length+i.length)%i.length];n(a.value),requestAnimationFrame(()=>{u.current?.querySelector(`[data-value="${a.value}"]`)?.focus()})}return(0,a.jsx)(`div`,{ref:u,role:`radiogroup`,className:`${i.group} ${i[o]} ${s?i.block:``} ${c??``}`,...l,children:e.map(e=>{let r=e.value===t;return(0,a.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":r,"aria-label":e.ariaLabel,"data-value":e.value,tabIndex:r?0:-1,disabled:e.disabled,className:i.option,onClick:()=>n(e.value),onKeyDown:e=>{e.key===`ArrowRight`||e.key===`ArrowDown`?(e.preventDefault(),d(1)):(e.key===`ArrowLeft`||e.key===`ArrowUp`)&&(e.preventDefault(),d(-1))},children:[e.icon?(0,a.jsx)(`span`,{className:i.glyph,children:e.icon}):null,e.label]},e.value)})})}export{o as t};
|
|
2
|
-
//# sourceMappingURL=Segmented-Dokzywy8.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Segmented-Dokzywy8.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Segmented.module.css","../../../../../../src/web-ui/components/primitives/Segmented.tsx"],"sourcesContent":[".group {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 2px;\n background: var(--bg-hover);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n}\n\n.block {\n display: flex;\n width: 100%;\n}\n\n.block .option {\n flex: 1;\n justify-content: center;\n}\n\n.option {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-1);\n height: calc(var(--density-row) - 6px);\n padding: 0 var(--space-3);\n /* Transparent rather than absent so the checked state can colour it without\n changing the option's box — everything is border-box, so the hairline\n costs no height and no horizontal drift when it appears. */\n border: 1px solid transparent;\n border-radius: calc(var(--radius-sm) - 1px);\n background: transparent;\n color: var(--text-secondary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n white-space: nowrap;\n cursor: pointer;\n transition:\n background-color var(--duration-fast) var(--ease-standard),\n color var(--duration-fast) var(--ease-standard);\n}\n\n.sm .option {\n height: calc(var(--density-row-sm) - 6px);\n padding: 0 var(--space-2);\n font-size: var(--text-2xs-size);\n}\n\n.option:hover:not(:disabled):not([aria-checked='true']) {\n color: var(--text-primary);\n}\n\n/* No shadow. DESIGN-V2 §1.2 allows drop shadows only on true overlays\n (dialog, menu, toast) and §2 retires every elevation token but those three;\n a segmented control is chrome. It was not carrying its weight either: in\n dark, --shadow-sm is rgba(0,0,0,0.4) on a near-black ground, i.e. invisible,\n so the selected thumb read as fill-only in dark and fill+shadow in light —\n two looks for one state. The hairline does the separating in both. */\n.option[aria-checked='true'] {\n background: var(--bg-surface);\n color: var(--text-primary);\n border-color: var(--border-default);\n}\n\n.option:disabled {\n color: var(--text-disabled);\n cursor: not-allowed;\n}\n\n.glyph {\n display: inline-flex;\n flex: none;\n}\n","/**\n * components/primitives/Segmented.tsx — pick one of 2-4 options where the\n * choice applies instantly (theme, density, a status filter). It replaces\n * both a <select> (too heavy for three options) and a row of toggle buttons\n * (no single-selection semantics for a screen reader).\n *\n * Implemented as a radiogroup with ROVING TABINDEX: one Tab stop for the\n * group, arrows move between options and select as they go — the WAI-ARIA\n * radio-group pattern. Every option is reachable by keyboard and announced\n * as \"N of M\".\n */\nimport { useRef, type ReactNode } from 'react';\nimport styles from './Segmented.module.css';\n\nexport interface SegmentedOption<T extends string> {\n value: T;\n label: ReactNode;\n /** Leading 16px glyph; the text label always stays visible. */\n icon?: ReactNode;\n /** Spoken name when `label` is a glyph or an abbreviation. */\n ariaLabel?: string;\n disabled?: boolean;\n}\n\nexport interface SegmentedProps<T extends string> {\n options: ReadonlyArray<SegmentedOption<T>>;\n value: T;\n onChange: (next: T) => void;\n /** Accessible name for the group — required when no visible label precedes it. */\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n size?: 'sm' | 'md';\n /** Stretch each option to an equal share of the width. */\n block?: boolean;\n className?: string;\n}\n\nexport function Segmented<T extends string>({\n options,\n value,\n onChange,\n size = 'md',\n block = false,\n className,\n ...aria\n}: SegmentedProps<T>) {\n const groupRef = useRef<HTMLDivElement>(null);\n\n function move(delta: number): void {\n const enabled = options.filter((o) => !o.disabled);\n if (enabled.length === 0) return;\n const current = enabled.findIndex((o) => o.value === value);\n const next = enabled[(((current + delta) % enabled.length) + enabled.length) % enabled.length]!;\n onChange(next.value);\n // Keep DOM focus on the newly selected option (roving tabindex).\n requestAnimationFrame(() => {\n groupRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${next.value}\"]`)?.focus();\n });\n }\n\n return (\n <div\n ref={groupRef}\n role=\"radiogroup\"\n className={`${styles.group} ${styles[size]} ${block ? styles.block : ''} ${className ?? ''}`}\n {...aria}\n >\n {options.map((option) => {\n const selected = option.value === value;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n aria-label={option.ariaLabel}\n data-value={option.value}\n tabIndex={selected ? 0 : -1}\n disabled={option.disabled}\n className={styles.option}\n onClick={() => onChange(option.value)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n e.preventDefault();\n move(1);\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n e.preventDefault();\n move(-1);\n }\n }}\n >\n {option.icon ? <span className={styles.glyph}>{option.icon}</span> : null}\n {option.label}\n </button>\n );\n })}\n </div>\n );\n}\n"],"mappings":"8OCqCA,SAAgB,EAA4B,CAC1C,UACA,QACA,WACA,OAAO,KACP,QAAQ,GACR,YACA,GAAG,GACiB,CACpB,IAAM,GAAA,EAAW,EAAA,OAAA,CAAuB,IAAI,EAE5C,SAAS,EAAK,EAAqB,CACjC,IAAM,EAAU,EAAQ,OAAQ,GAAM,CAAC,EAAE,QAAQ,EACjD,GAAI,EAAQ,SAAW,EAAG,OAE1B,IAAM,EAAO,IADG,EAAQ,UAAW,GAAM,EAAE,QAAU,CAC7B,EAAU,GAAS,EAAQ,OAAU,EAAQ,QAAU,EAAQ,QACvF,EAAS,EAAK,KAAK,EAEnB,0BAA4B,CAC1B,EAAS,SAAS,cAAiC,gBAAgB,EAAK,MAAM,GAAG,CAAC,EAAE,MAAM,CAC5F,CAAC,CACH,CAEA,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,IAAK,EACL,KAAK,aACL,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,GAAM,GAAG,EAAQ,EAAO,MAAQ,GAAG,GAAG,GAAa,KACxF,GAAI,EAEH,SAAA,EAAQ,IAAK,GAAW,CACvB,IAAM,EAAW,EAAO,QAAU,EAClC,OACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAEE,KAAK,SACL,KAAK,QACL,eAAc,EACd,aAAY,EAAO,UACnB,aAAY,EAAO,MACnB,SAAU,EAAW,EAAI,GACzB,SAAU,EAAO,SACjB,UAAW,EAAO,OAClB,YAAe,EAAS,EAAO,KAAK,EACpC,UAAY,GAAM,CACZ,EAAE,MAAQ,cAAgB,EAAE,MAAQ,aACtC,EAAE,eAAe,EACjB,EAAK,CAAC,IACG,EAAE,MAAQ,aAAe,EAAE,MAAQ,aAC5C,EAAE,eAAe,EACjB,EAAK,EAAE,EAEX,EAnBF,SAAA,CAqBG,EAAO,MAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,EAAO,IAAW,CAAA,EAAI,KACpE,EAAO,KACF,CAtBD,EAAA,EAAO,KAsBN,CAEZ,CAAC,CACE,CAAA,CAET"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{i as r}from"./icons-MYfI6vZr.js";var i=e(n(),1),a={field:`_field_1yhua_1`,label:`_label_1yhua_8`,shell:`_shell_1yhua_15`,sm:`_sm_1yhua_28`,select:`_select_1yhua_42`,chevron:`_chevron_1yhua_72`,hint:`_hint_1yhua_79`},o=t();function s({label:e,hint:t,size:n=`md`,className:s,id:c,children:l,...u}){let d=(0,i.useId)(),f=c??d,p=`${f}-hint`;return(0,o.jsxs)(`div`,{className:`${a.field} ${s??``}`,children:[e?(0,o.jsx)(`label`,{className:a.label,htmlFor:f,children:e}):null,(0,o.jsxs)(`div`,{className:`${a.shell} ${a[n]}`,children:[(0,o.jsx)(`select`,{...u,id:f,className:a.select,"aria-describedby":[u[`aria-describedby`],t?p:null].filter(Boolean).join(` `)||void 0,children:l}),(0,o.jsx)(r,{className:a.chevron,size:14})]}),t?(0,o.jsx)(`p`,{id:p,className:a.hint,children:t}):null]})}export{s as t};
|
|
2
|
-
//# sourceMappingURL=Select-tf4lNvWD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Select-tf4lNvWD.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Select.module.css","../../../../../../src/web-ui/components/primitives/Select.tsx"],"sourcesContent":[".field {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.label {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n}\n\n.shell {\n position: relative;\n display: flex;\n align-items: center;\n height: var(--density-row);\n background: var(--bg-input);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n transition:\n border-color var(--duration-fast) var(--ease-standard),\n box-shadow var(--duration-fast) var(--ease-standard);\n}\n\n.sm {\n height: var(--density-row-sm);\n}\n\n.shell:hover {\n border-color: var(--border-strong);\n}\n\n/* The system ring, not an --accent-100 wash: that token is pinned at 92%\n lightness in light and 22% in dark (tokens.css), so hue and saturation\n follow the operator's accent but LIGHTNESS never does — every preset and\n every slider position produced the same 1.34:1 / 1.15:1 near-invisible\n ring. --shadow-focus-ring is already the 2px-gap + 2px-accent shape\n DESIGN-V2 §6 asks for, and --border-focus is contrast-tested. */\n.shell:has(.select:focus-visible) {\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n\n.select {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 100%;\n padding: 0 var(--space-6) 0 var(--space-2);\n border: none;\n background: none;\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n cursor: pointer;\n}\n\n.select:focus,\n.select:focus-visible {\n outline: none;\n box-shadow: none;\n}\n\n.select:disabled {\n color: var(--text-disabled);\n cursor: not-allowed;\n}\n\n.chevron {\n position: absolute;\n right: var(--space-2);\n color: var(--text-tertiary);\n pointer-events: none;\n}\n\n.hint {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n","/**\n * components/primitives/Select.tsx — a native <select> that does not look\n * native: the browser's own control is stripped and the chevron is our own\n * 16px glyph, so the field matches Input at every density.\n *\n * Deliberately NOT a custom listbox. A native select gets the platform's\n * keyboard handling, type-ahead, and mobile picker for free — a hand-rolled\n * popup would be a worse control with more code (DESIGN.md §3).\n */\nimport { useId, type ReactNode, type SelectHTMLAttributes } from 'react';\nimport { IconChevronDown } from './icons.js';\nimport styles from './Select.module.css';\n\nexport interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size' | 'className'> {\n label?: ReactNode;\n hint?: ReactNode;\n size?: 'sm' | 'md';\n className?: string;\n children: ReactNode;\n}\n\nexport function Select({ label, hint, size = 'md', className, id, children, ...rest }: SelectProps) {\n const generatedId = useId();\n const selectId = id ?? generatedId;\n const hintId = `${selectId}-hint`;\n\n return (\n <div className={`${styles.field} ${className ?? ''}`}>\n {label ? (\n <label className={styles.label} htmlFor={selectId}>\n {label}\n </label>\n ) : null}\n <div className={`${styles.shell} ${styles[size]}`}>\n <select\n {...rest}\n id={selectId}\n className={styles.select}\n aria-describedby={[rest['aria-describedby'], hint ? hintId : null].filter(Boolean).join(' ') || undefined}\n >\n {children}\n </select>\n <IconChevronDown className={styles.chevron} size={14} />\n </div>\n {hint ? (\n <p id={hintId} className={styles.hint}>\n {hint}\n </p>\n ) : null}\n </div>\n );\n}\n"],"mappings":"uUCqBA,SAAgB,EAAO,CAAE,QAAO,OAAM,OAAO,KAAM,YAAW,KAAI,WAAU,GAAG,GAAqB,CAClG,IAAM,GAAA,EAAc,EAAA,MAAA,CAAM,EACpB,EAAW,GAAM,EACjB,EAAS,GAAG,EAAS,OAE3B,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,MAAM,GAAG,GAAa,KAAhD,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAO,MAAO,QAAS,EACtC,SAAA,CACI,CAAA,EACL,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,KAA1C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,GAAI,EACJ,GAAI,EACJ,UAAW,EAAO,OAClB,mBAAkB,CAAC,EAAK,oBAAqB,EAAO,EAAS,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,GAAK,IAAA,GAE/F,UACK,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,UAAW,EAAO,QAAS,KAAM,EAAK,CAAA,CACpD,IACJ,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,GAAI,EAAQ,UAAW,EAAO,KAC9B,SAAA,CACA,CAAA,EACD,IACD,GAET"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{_ as r,k as i,x as a}from"./global-BJ_kVFpD.js";var o=e(n(),1),s={wrap:`_wrap_14qw9_1`,card:`_card_14qw9_10`,badge:`_badge_14qw9_19`,heading:`_heading_14qw9_24`,body:`_body_14qw9_31`,code:`_code_14qw9_38`,example:`_example_14qw9_49`,form:`_form_14qw9_56`,label:`_label_14qw9_63`,input:`_input_14qw9_68`,error:`_error_14qw9_82`,submit:`_submit_14qw9_87`,optional:`_optional_14qw9_107`},c=t(),l=/^[a-f0-9]{64}$/;function u({onAuthenticated:e,heading:t=`Connect to ashlr serve`,command:n=`ashlr serve`,subject:u=`This dashboard`,mutationField:d=!1}){let[f,p]=(0,o.useState)(``),[m,h]=(0,o.useState)(``),[g,_]=(0,o.useState)(null),[v,y]=(0,o.useState)(!1),b=(0,o.useRef)(null),x=(0,o.useId)(),S=(0,o.useId)(),C=(0,o.useId)(),w=(0,o.useRef)(e);w.current=e,(0,o.useEffect)(()=>{let e=!1;return r().then(t=>{t&&!e&&w.current?.()}),()=>{e=!0}},[]);async function T(t){t.preventDefault(),_(null);let n=m.trim();if(d&&n&&!l.test(n)){_(`That does not look like a mutation token — expected 64 hex characters (leave it empty to unlock later).`);return}y(!0);try{await a(f),p(``),d&&n&&i(n),h(``),e?.()}catch(e){_(e instanceof Error?e.message:`Could not establish a session.`),b.current?.select()}finally{y(!1)}}return(0,c.jsx)(`div`,{className:s.wrap,children:(0,c.jsxs)(`div`,{className:s.card,children:[(0,c.jsx)(`div`,{className:s.badge,"aria-hidden":`true`,children:`⛺`}),(0,c.jsx)(`h1`,{className:s.heading,children:t}),(0,c.jsxs)(`p`,{className:s.body,children:[u,` only ever talks to the ashlr server running on this machine (`,(0,c.jsx)(`code`,{children:`127.0.0.1`}),`, never a remote host). To read data, paste the`,` `,(0,c.jsx)(`strong`,{children:`read token`}),` printed in the terminal where you ran:`]}),(0,c.jsx)(`pre`,{className:s.code,children:n}),(0,c.jsxs)(`p`,{className:s.body,children:[`It looks like a 64-character hex string, printed once at startup — something like`,` `,(0,c.jsx)(`code`,{className:s.example,children:`a1b2c3…`}),`. This dialog never stores it: it is exchanged once for a short-lived session cookie, then discarded.`]}),(0,c.jsxs)(`form`,{onSubmit:T,className:s.form,noValidate:!0,children:[(0,c.jsx)(`label`,{htmlFor:x,className:s.label,children:`Read token`}),(0,c.jsx)(`input`,{ref:b,id:x,name:`read-token`,type:`password`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,inputMode:`text`,className:s.input,value:f,onChange:e=>p(e.target.value),"aria-invalid":g?!0:void 0,"aria-describedby":g?C:void 0,placeholder:`64 hex characters`,autoFocus:!0}),d?(0,c.jsxs)(c.Fragment,{children:[(0,c.jsxs)(`label`,{htmlFor:S,className:s.label,children:[`Mutation token `,(0,c.jsx)(`span`,{className:s.optional,children:`optional — paste it now to enable sending`})]}),(0,c.jsx)(`input`,{id:S,name:`mutation-token`,type:`password`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,inputMode:`text`,className:s.input,value:m,onChange:e=>h(e.target.value),placeholder:`64 hex characters, printed under “Dispatch enabled”`})]}):null,g?(0,c.jsx)(`p`,{id:C,className:s.error,role:`alert`,children:g}):null,(0,c.jsx)(`button`,{type:`submit`,className:s.submit,disabled:v||f.trim().length===0,children:v?`Connecting…`:`Connect`})]})]})})}export{u as SessionGate};
|
|
2
|
-
//# sourceMappingURL=SessionGate-Bab2qO29.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SessionGate-Bab2qO29.js","names":[],"sources":["../../../../../../src/web-ui/components/auth/SessionGate.module.css","../../../../../../src/web-ui/components/auth/SessionGate.tsx"],"sourcesContent":[".wrap {\n min-height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--space-6);\n background: var(--bg-canvas);\n}\n\n.card {\n width: min(480px, 100%);\n background: var(--bg-surface);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-lg);\n padding: var(--space-8);\n}\n\n.badge {\n font-size: 28px;\n margin-bottom: var(--space-4);\n}\n\n.heading {\n font-size: var(--text-2xl-size);\n line-height: var(--text-2xl-line);\n font-weight: var(--font-weight-semibold);\n margin-bottom: var(--space-3);\n}\n\n.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-3);\n}\n\n.code {\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n background: var(--bg-code);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n padding: var(--space-3);\n margin-bottom: var(--space-3);\n overflow-x: auto;\n}\n\n.example {\n font-family: var(--font-mono);\n background: var(--bg-code);\n padding: 1px 4px;\n border-radius: var(--radius-xs);\n}\n\n.form {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n margin-top: var(--space-5);\n}\n\n.label {\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n}\n\n.input {\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}\n\n.input:focus-visible {\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n\n.error {\n color: var(--status-danger-fg);\n font-size: var(--text-sm-size);\n}\n\n.submit {\n margin-top: var(--space-2);\n padding: var(--space-3) var(--space-4);\n background: var(--accent-500);\n color: var(--text-on-accent);\n border-radius: var(--radius-md);\n font-weight: var(--font-weight-medium);\n text-align: center;\n transition: background var(--duration-fast) var(--ease-standard);\n}\n\n.submit:hover:not(:disabled) {\n background: var(--accent-600);\n}\n\n.submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.optional { font-weight: var(--font-weight-normal, 400); color: var(--text-tertiary); }\n","/**\n * components/auth/SessionGate.tsx — replaces the old bare \"⚠ HTTP 401 +\n * Retry\" first-run experience (foundation brief item 5). Shown whenever\n * auth-store's phase is 'unauthenticated': on first load before any read\n * token has been entered, AND any time a session expires mid-use (SSE\n * disconnects, the next GET reports 401).\n *\n * By default this screen owns nothing about the MUTATION token — that is a\n * separate, later step (MutationTokenDialog), because read authority and\n * dispatch authority are genuinely different capabilities on this server\n * (see server.ts). Surfaces where sending is the whole point (Verse) can opt\n * into an optional second field with `mutationField`; the authorities stay\n * separate (the mutation token only ever enters the memory-only hold), it\n * just spares the operator a second paste screen on the first Enter.\n */\nimport { useEffect, useId, useRef, useState, type FormEvent } from 'react';\nimport { adoptInjectedTokens, establishReadSession, setMutationToken } from '../../data/auth-store.js';\nimport styles from './SessionGate.module.css';\n\nconst TOKEN_RE = /^[a-f0-9]{64}$/;\n\nexport interface SessionGateProps {\n onAuthenticated?: () => void;\n heading?: string;\n command?: string;\n /** What the copy calls this surface (\"This dashboard\", \"Ashlr Verse\"). */\n subject?: string;\n /**\n * Also offer the mutation token on the same screen. The two authorities\n * stay separate (a pasted mutation token goes straight into the memory-only\n * hold, exactly as MutationTokenDialog would set it); this only collapses\n * two paste screens into one for surfaces where sending is the whole point.\n */\n mutationField?: boolean;\n}\n\nexport function SessionGate({ onAuthenticated, heading = 'Connect to ashlr serve', command = 'ashlr serve', subject = 'This dashboard', mutationField = false }: SessionGateProps) {\n const [token, setToken] = useState('');\n const [mutation, setMutation] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const inputId = useId();\n const mutationId = useId();\n const errorId = useId();\n const authenticatedRef = useRef(onAuthenticated);\n authenticatedRef.current = onAuthenticated;\n\n // Desktop wrapper: when the host injected tokens (window.__ASHLR_TOKENS__),\n // establish the session silently instead of asking for a paste.\n useEffect(() => {\n let cancelled = false;\n void adoptInjectedTokens().then((adopted) => {\n if (adopted && !cancelled) authenticatedRef.current?.();\n });\n return () => { cancelled = true; };\n }, []);\n\n async function onSubmit(e: FormEvent) {\n e.preventDefault();\n setError(null);\n const mutationTrimmed = mutation.trim();\n if (mutationField && mutationTrimmed && !TOKEN_RE.test(mutationTrimmed)) {\n setError('That does not look like a mutation token — expected 64 hex characters (leave it empty to unlock later).');\n return;\n }\n setBusy(true);\n try {\n await establishReadSession(token);\n setToken('');\n if (mutationField && mutationTrimmed) setMutationToken(mutationTrimmed);\n setMutation('');\n onAuthenticated?.();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not establish a session.');\n inputRef.current?.select();\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <div className={styles.wrap}>\n <div className={styles.card}>\n <div className={styles.badge} aria-hidden=\"true\">\n ⛺\n </div>\n <h1 className={styles.heading}>{heading}</h1>\n <p className={styles.body}>\n {subject} only ever talks to the ashlr server running on this machine\n (<code>127.0.0.1</code>, never a remote host). To read data, paste the{' '}\n <strong>read token</strong> printed in the terminal where you ran:\n </p>\n <pre className={styles.code}>{command}</pre>\n <p className={styles.body}>\n It looks like a 64-character hex string, printed once at startup — something like{' '}\n <code className={styles.example}>a1b2c3…</code>. This dialog never stores it: it is\n exchanged once for a short-lived session cookie, then discarded.\n </p>\n <form onSubmit={onSubmit} className={styles.form} noValidate>\n <label htmlFor={inputId} className={styles.label}>\n Read token\n </label>\n <input\n ref={inputRef}\n id={inputId}\n name=\"read-token\"\n type=\"password\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n inputMode=\"text\"\n className={styles.input}\n value={token}\n onChange={(e) => setToken(e.target.value)}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : undefined}\n placeholder=\"64 hex characters\"\n autoFocus\n />\n {mutationField ? (\n <>\n <label htmlFor={mutationId} className={styles.label}>\n Mutation token <span className={styles.optional}>optional — paste it now to enable sending</span>\n </label>\n <input\n id={mutationId}\n name=\"mutation-token\"\n type=\"password\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n inputMode=\"text\"\n className={styles.input}\n value={mutation}\n onChange={(e) => setMutation(e.target.value)}\n placeholder=\"64 hex characters, printed under “Dispatch enabled”\"\n />\n </>\n ) : null}\n {error ? (\n <p id={errorId} className={styles.error} role=\"alert\">\n {error}\n </p>\n ) : null}\n <button type=\"submit\" className={styles.submit} disabled={busy || token.trim().length === 0}>\n {busy ? 'Connecting…' : 'Connect'}\n </button>\n </form>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{l as r}from"./global-BJ_kVFpD.js";import{u as i}from"./format-V6IiIMAL.js";import{h as a}from"./surface-data-D_oFOgkh.js";import{n as o}from"./nav-ByibvQW1.js";import{n as s,o as c,t as l}from"./mind.module-rVKz51LB.js";var u=e(n(),1),d=t();function f({sessionId:e}){let t=r(a,{freshMs:6e4}),[n,f]=(0,u.useState)(!1),p=(0,u.useId)(),m=c(t.data?.value??null,e);if(m.length===0)return null;let h=m[0],g=`${s[h.kind]} · ${h.count}×`;function _(e){e.key===`Escape`&&n&&(e.stopPropagation(),f(!1))}return(0,d.jsxs)(`span`,{className:l.chipWrap,onKeyDown:_,children:[(0,d.jsxs)(`button`,{type:`button`,className:l.chip,"data-severity":h.severity,"aria-expanded":n,"aria-controls":p,"aria-label":`Reasoning insight for this chat: ${h.title}${m.length>1?` and ${m.length-1} more`:``}`,onClick:()=>f(e=>!e),children:[(0,d.jsx)(`span`,{className:l.chipDot,"data-severity":h.severity,"aria-hidden":`true`}),g,m.length>1?(0,d.jsxs)(`span`,{className:l.chipMore,children:[`+`,m.length-1]}):null]}),n?(0,d.jsxs)(`div`,{id:p,className:l.chipPanel,role:`region`,"aria-label":`Insights for this chat`,children:[(0,d.jsx)(`ul`,{className:l.chipList,children:m.map(e=>(0,d.jsxs)(`li`,{children:[(0,d.jsx)(`span`,{className:l.insightTitle,children:e.title}),(0,d.jsxs)(`span`,{className:l.insightMeta,children:[s[e.kind],` · `,e.count,`× · last seen `,i(e.lastAt)]})]},e.id))}),(0,d.jsx)(`button`,{type:`button`,className:l.link,onClick:()=>{f(!1),o(`mind`,`insight-${h.id}`)},children:`See it in Mind`})]}):null]})}export{f as SessionInsightChip};
|
|
2
|
-
//# sourceMappingURL=SessionInsightChip-C-fj8h4A.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInsightChip-C-fj8h4A.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mind/SessionInsightChip.tsx"],"sourcesContent":["/**\n * routes/verse/mind/SessionInsightChip.tsx — the chat-header chip (SPEC-310C\n * §5 \"`mind/SessionInsightChip`: Chat's header shows it when an A7 loop or\n * struggle insight cites that chat\"; unit C7). Mounted by C2 through C0's\n * `session-insight-chip` slot, which lazy-loads this file and this named\n * export with exactly SessionInsightChipProps.\n *\n * It renders NOTHING unless the reasoning digest cites this chat in a loop\n * or struggle insight — no placeholder, no spinner, no error text in a chat\n * header (a missing digest is simply no chip). When it shows, it is one\n * quiet chip (\"Loop · npm test ×6\"); pressing it opens a small panel with\n * the insight(s) and a way to Mind. Reads the digest the Mind surface\n * already caches (60 s freshness); it never polls from the chat.\n */\nimport { useId, useState, type KeyboardEvent } from 'react';\nimport { useQuery } from '../../../data/hooks.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport { goToSection } from '../command/nav.js';\nimport { reasoningDigestQuery } from '../command/surface-data.js';\nimport type { SessionInsightChipProps } from '../shell/slots.js';\nimport { KIND_LABEL, sessionInsights } from './mind-model.js';\nimport styles from './mind.module.css';\n\nexport function SessionInsightChip({ sessionId }: SessionInsightChipProps) {\n const digest = useQuery(reasoningDigestQuery, { freshMs: 60_000 });\n const [open, setOpen] = useState(false);\n const panelId = useId();\n const insights = sessionInsights(digest.data?.value ?? null, sessionId);\n if (insights.length === 0) return null;\n const first = insights[0]!;\n const label = `${KIND_LABEL[first.kind]} · ${first.count}×`;\n\n function onKey(e: KeyboardEvent<HTMLElement>): void {\n if (e.key === 'Escape' && open) {\n e.stopPropagation();\n setOpen(false);\n }\n }\n\n return (\n <span className={styles.chipWrap} onKeyDown={onKey}>\n <button\n type=\"button\"\n className={styles.chip}\n data-severity={first.severity}\n aria-expanded={open}\n aria-controls={panelId}\n aria-label={`Reasoning insight for this chat: ${first.title}${insights.length > 1 ? ` and ${insights.length - 1} more` : ''}`}\n onClick={() => setOpen((o) => !o)}\n >\n <span className={styles.chipDot} data-severity={first.severity} aria-hidden=\"true\" />\n {label}\n {insights.length > 1 ? <span className={styles.chipMore}>+{insights.length - 1}</span> : null}\n </button>\n {open ? (\n <div id={panelId} className={styles.chipPanel} role=\"region\" aria-label=\"Insights for this chat\">\n <ul className={styles.chipList}>\n {insights.map((i) => (\n <li key={i.id}>\n <span className={styles.insightTitle}>{i.title}</span>\n <span className={styles.insightMeta}>\n {KIND_LABEL[i.kind]} · {i.count}× · last seen {formatRelative(i.lastAt)}\n </span>\n </li>\n ))}\n </ul>\n <button\n type=\"button\"\n className={styles.link}\n onClick={() => {\n setOpen(false);\n goToSection('mind', `insight-${first.id}`);\n }}\n >\n See it in Mind\n </button>\n </div>\n ) : null}\n </span>\n );\n}\n"],"mappings":"0VAuBA,SAAgB,EAAmB,CAAE,aAAsC,CACzE,IAAM,EAAS,EAAS,EAAsB,CAAE,QAAS,GAAO,CAAC,EAC3D,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,EAAW,EAAgB,EAAO,MAAM,OAAS,KAAM,CAAS,EACtE,GAAI,EAAS,SAAW,EAAG,OAAO,KAClC,IAAM,EAAQ,EAAS,GACjB,EAAQ,GAAG,EAAW,EAAM,MAAM,KAAK,EAAM,MAAM,GAEzD,SAAS,EAAM,EAAqC,CAC9C,EAAE,MAAQ,UAAY,IACxB,EAAE,gBAAgB,EAClB,EAAQ,EAAK,EAEjB,CAEA,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,UAAW,EAA7C,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAO,KAClB,gBAAe,EAAM,SACrB,gBAAe,EACf,gBAAe,EACf,aAAY,oCAAoC,EAAM,QAAQ,EAAS,OAAS,EAAI,QAAQ,EAAS,OAAS,EAAE,OAAS,KACzH,YAAe,EAAS,GAAM,CAAC,CAAC,EAPlC,SAAA,EASE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,gBAAe,EAAM,SAAU,cAAY,MAAQ,CAAA,EACnF,EACA,EAAS,OAAS,GAAI,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAxB,SAAA,CAAkC,IAAE,EAAS,OAAS,CAAQ,CAAI,CAAA,EAAA,IACnF,CACP,CAAA,EAAA,GACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,GAAI,EAAS,UAAW,EAAO,UAAW,KAAK,SAAS,aAAW,yBAAxE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,SACnB,SAAA,EAAS,IAAK,IACb,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAe,SAAA,EAAE,KAAY,CAAA,GACrD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAxB,SAAA,CACG,EAAW,EAAE,MAAM,MAAI,EAAE,MAAM,iBAAe,EAAe,EAAE,MAAM,CAClE,CACJ,CAAA,CAAA,CAAA,EALK,EAAE,EAKP,CACL,CACC,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAO,KAClB,YAAe,CACb,EAAQ,EAAK,EACb,EAAY,OAAQ,WAAW,EAAM,IAAI,CAC3C,EACD,SAAA,gBAEO,CAAA,CACL,CACH,CAAA,EAAA,IACA,GAEV"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{t as r}from"./global-BJ_kVFpD.js";import{u as i}from"./verse-model-DAOz9LrY.js";import{o as a}from"./context-queries-Bsl-w0q-.js";import{b as o,p as s,u as c}from"./context-model-DYkDKK6C.js";import{t as l}from"./use-token-gate-E-xzEAu6.js";import{t as u}from"./context.module-BijAfoJw.js";var d=e(n(),1),f=t();function p({onOpenSession:e,query:t,selectedId:n=null}){let p=(0,d.useId)(),m=(0,d.useId)(),h=t===void 0,[g,_]=(0,d.useState)(``),v=(h?g:t).trim(),[y,b]=(0,d.useState)({status:`idle`}),[x,S]=(0,d.useState)(0),C=(0,d.useRef)(!1);(0,d.useEffect)(()=>{if(C.current)return;if(v.length<2){b({status:`idle`});return}let e=new AbortController;b(e=>({status:`loading`,previous:e.status===`ready`?e.response:e.status===`loading`?e.previous:null}));let t=setTimeout(()=>{a(v,30,e.signal).then(t=>{e.signal.aborted||b({status:`ready`,response:t})}).catch(t=>{e.signal.aborted||(t instanceof r&&t.status===404?(C.current=!0,b({status:`unsupported`})):b({status:`error`,message:l(t)}))})},250);return()=>{clearTimeout(t),e.abort()}},[v,x]);let w=h?(0,f.jsxs)(`label`,{className:u.searchBox,htmlFor:p,children:[(0,f.jsx)(`span`,{className:`visually-hidden`,children:`Search messages in every chat`}),(0,f.jsx)(`input`,{id:p,type:`search`,className:u.input,value:g,placeholder:`Search messages`,autoComplete:`off`,spellCheck:!1,onChange:e=>_(e.target.value)})]}):null;if(y.status===`unsupported`)return h?(0,f.jsxs)(`div`,{className:u.search,children:[w,(0,f.jsxs)(`p`,{className:`${u.hint} ${u.searchNote}`,children:[`This server cannot search messages yet — update Ashlr and restart `,(0,f.jsx)(`code`,{children:`ashlr verse`}),`.`]})]}):null;if(y.status===`idle`&&!h)return null;let T=y.status===`ready`?y.response:y.status===`loading`?y.previous:null,E=T?c(T.hits):[],D=o(T?.query??v),O=y.status===`loading`;return(0,f.jsxs)(`section`,{className:u.search,"aria-labelledby":m,"aria-busy":O?!0:void 0,children:[w,(0,f.jsxs)(`h2`,{id:m,className:u.searchHead,children:[(0,f.jsx)(`span`,{children:`In messages`}),T&&!O?(0,f.jsx)(`span`,{className:u.searchCount,"aria-hidden":`true`,children:E.length}):null]}),(0,f.jsx)(`p`,{className:`visually-hidden`,role:`status`,"aria-live":`polite`,children:y.status===`ready`?E.length===0?`No messages match ${v}.`:`${E.length} ${E.length===1?`chat has`:`chats have`} matching messages.`:``}),y.status===`idle`?(0,f.jsx)(`p`,{className:`${u.hint} ${u.searchNote}`,children:`Searches what was said in every chat on this machine. Nothing is sent to a model.`}):y.status===`error`?(0,f.jsxs)(`div`,{className:u.searchError,role:`alert`,children:[(0,f.jsxs)(`span`,{children:[`Could not search messages: `,y.message]}),(0,f.jsx)(`button`,{type:`button`,className:`${u.secondary} ${u.small}`,onClick:()=>S(e=>e+1),children:`Retry`})]}):O&&!T?(0,f.jsx)(`p`,{className:`${u.hint} ${u.searchNote}`,children:`Searching messages…`}):E.length===0?(0,f.jsxs)(`p`,{className:`${u.hint} ${u.searchNote}`,children:[`No messages match “`,v,`”. Try fewer or different words.`]}):(0,f.jsx)(`ul`,{className:u.hits,children:E.map(t=>{let r=s(t.top.snippet,D),a=t.top.kind===`user`?`You`:`Agent`,o=t.count>1?` · ${t.count} matches`:``;return(0,f.jsx)(`li`,{children:(0,f.jsxs)(`button`,{type:`button`,className:`${u.hit} ${u[`engine-${t.engine}`]??``}`,"aria-current":t.sessionId===n?`true`:void 0,"data-session":t.sessionId,"data-engine":t.engine,onClick:()=>e(t.sessionId),children:[(0,f.jsx)(`span`,{className:u.hitMarker,"aria-hidden":`true`}),(0,f.jsx)(`span`,{className:u.hitTitle,title:t.title||`Untitled chat`,children:t.title||`Untitled chat`}),(0,f.jsx)(`time`,{className:u.hitTime,dateTime:t.latestAt,children:i(t.latestAt)}),(0,f.jsxs)(`span`,{className:u.hitSnippet,children:[(0,f.jsxs)(`span`,{className:u.hitWho,children:[a,o,`: `]}),r.map((e,t)=>e.match?(0,f.jsx)(`mark`,{children:e.text},t):(0,f.jsx)(`span`,{children:e.text},t))]})]})},t.sessionId)})}),T&&y.status!==`error`?(0,f.jsxs)(`p`,{className:`${u.hint} ${u.searchNote}`,children:[`Searched `,T.scannedSessions.toLocaleString(),` `,T.scannedSessions===1?`chat`:`chats`,T.truncated?` — the most recent ones only; older chats were not searched.`:`.`]}):null]})}export{p as SessionSearch};
|
|
2
|
-
//# sourceMappingURL=SessionSearch-CqjjwOW2.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SessionSearch-CqjjwOW2.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/context/SessionSearch.tsx"],"sourcesContent":["/**\n * routes/verse/context/SessionSearch.tsx — find a past chat by what was SAID\n * in it, not only by its title.\n *\n * The sidebar's field has always filtered chat titles and project paths on\n * the client, instantly. Titles are the first line of the first message, so\n * \"where did we decide the retry policy?\" was unanswerable without opening\n * chats one by one. This component answers it: a keyword search over every\n * session's user and assistant messages (GET /api/verse/search — a bounded\n * scan of events.jsonl on this machine; nothing is sent to a model).\n *\n * TWO WAYS TO MOUNT, one behaviour:\n *\n * - Controlled (`query` given): the sidebar passes ITS field's value, so one\n * box drives both the instant title filter above and the message matches\n * below. No second box — two search fields stacked in a 240px sidebar\n * would make the operator guess which one to type in.\n * - Standalone (`query` absent): renders its own field, for any surface that\n * has no search box of its own.\n *\n * One row per CHAT (the server ranks messages; the list ranks chats), with the\n * best-matching snippet and its terms marked. A query under two characters\n * asks nothing: a one-letter scan of every transcript is noise, not recall.\n * An older server without the route answers 404; the section then stays\n * silent rather than printing a permanent error for a feature that server\n * does not have — the title filter above still works.\n */\nimport { useEffect, useId, useRef, useState } from 'react';\nimport type { VerseSearchResponse } from '../../../../core/verse/types.js';\nimport { ApiError } from '../../../data/client.js';\nimport { formatRelative } from '../verse-model.js';\nimport {\n groupSearchHits,\n highlightSegments,\n searchTerms,\n SEARCH_DEBOUNCE_MS,\n SEARCH_LIMIT,\n SEARCH_MIN_CHARS,\n} from './context-model.js';\nimport { searchSessions } from './context-queries.js';\nimport { describeContextError } from './use-token-gate.js';\nimport styles from './context.module.css';\n\nexport interface SessionSearchProps {\n onOpenSession: (id: string) => void;\n /**\n * The query, when a surrounding field owns it (the sidebar). Absent → this\n * component renders its own field.\n */\n query?: string;\n /** The chat that is open, marked with aria-current like the sidebar's rows. */\n selectedId?: string | null;\n}\n\ntype SearchState =\n | { status: 'idle' }\n | { status: 'loading'; previous: VerseSearchResponse | null }\n | { status: 'ready'; response: VerseSearchResponse }\n | { status: 'error'; message: string }\n | { status: 'unsupported' };\n\nexport function SessionSearch({ onOpenSession, query, selectedId = null }: SessionSearchProps) {\n const inputId = useId();\n const headingId = useId();\n const standalone = query === undefined;\n const [own, setOwn] = useState('');\n const q = (standalone ? own : query).trim();\n const [state, setState] = useState<SearchState>({ status: 'idle' });\n const [retry, setRetry] = useState(0);\n /** Once the server has said it has no search route, stop asking for this mount's lifetime. */\n const unsupported = useRef(false);\n\n useEffect(() => {\n if (unsupported.current) return undefined;\n if (q.length < SEARCH_MIN_CHARS) {\n setState({ status: 'idle' });\n return undefined;\n }\n const controller = new AbortController();\n // Keep the previous answer on screen while the next one is fetched: a list\n // that blanks on every keystroke is harder to read than a slightly stale one.\n setState((prev) => ({\n status: 'loading',\n previous: prev.status === 'ready' ? prev.response : prev.status === 'loading' ? prev.previous : null,\n }));\n const timer = setTimeout(() => {\n searchSessions(q, SEARCH_LIMIT, controller.signal)\n .then((response) => {\n if (!controller.signal.aborted) setState({ status: 'ready', response });\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n if (err instanceof ApiError && err.status === 404) {\n unsupported.current = true;\n setState({ status: 'unsupported' });\n }\n else setState({ status: 'error', message: describeContextError(err) });\n });\n }, SEARCH_DEBOUNCE_MS);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [q, retry]);\n\n const field = standalone ? (\n <label className={styles.searchBox} htmlFor={inputId}>\n <span className=\"visually-hidden\">Search messages in every chat</span>\n <input id={inputId} type=\"search\" className={styles.input} value={own} placeholder=\"Search messages\"\n autoComplete=\"off\" spellCheck={false} onChange={(event) => setOwn(event.target.value)} />\n </label>\n ) : null;\n\n // Controlled and idle (the sidebar's field is empty or too short), or a\n // server without the route: nothing to say — the title list above is the\n // whole answer. A standalone field has no title list, so it says why.\n if (state.status === 'unsupported') {\n return standalone ? (\n <div className={styles.search}>\n {field}\n <p className={`${styles.hint} ${styles.searchNote}`}>This server cannot search messages yet — update Ashlr and restart <code>ashlr verse</code>.</p>\n </div>\n ) : null;\n }\n if (state.status === 'idle' && !standalone) return null;\n\n const response = state.status === 'ready' ? state.response : state.status === 'loading' ? state.previous : null;\n const groups = response ? groupSearchHits(response.hits) : [];\n const terms = searchTerms(response?.query ?? q);\n const busy = state.status === 'loading';\n\n return (\n <section className={styles.search} aria-labelledby={headingId} aria-busy={busy ? true : undefined}>\n {field}\n <h2 id={headingId} className={styles.searchHead}>\n <span>In messages</span>\n {response && !busy ? (\n <span className={styles.searchCount} aria-hidden=\"true\">{groups.length}</span>\n ) : null}\n </h2>\n\n {/* Announced once per answer, not per keystroke. */}\n <p className=\"visually-hidden\" role=\"status\" aria-live=\"polite\">\n {state.status === 'ready'\n ? groups.length === 0 ? `No messages match ${q}.` : `${groups.length} ${groups.length === 1 ? 'chat has' : 'chats have'} matching messages.`\n : ''}\n </p>\n\n {state.status === 'idle' ? (\n <p className={`${styles.hint} ${styles.searchNote}`}>\n Searches what was said in every chat on this machine. Nothing is sent to a model.\n </p>\n ) : state.status === 'error' ? (\n <div className={styles.searchError} role=\"alert\">\n <span>Could not search messages: {state.message}</span>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} onClick={() => setRetry((n) => n + 1)}>\n Retry\n </button>\n </div>\n ) : busy && !response ? (\n <p className={`${styles.hint} ${styles.searchNote}`}>Searching messages…</p>\n ) : groups.length === 0 ? (\n <p className={`${styles.hint} ${styles.searchNote}`}>No messages match “{q}”. Try fewer or different words.</p>\n ) : (\n <ul className={styles.hits}>\n {groups.map((group) => {\n const segments = highlightSegments(group.top.snippet, terms);\n const who = group.top.kind === 'user' ? 'You' : 'Agent';\n const more = group.count > 1 ? ` · ${group.count} matches` : '';\n return (\n <li key={group.sessionId}>\n <button type=\"button\" className={`${styles.hit} ${styles[`engine-${group.engine}`] ?? ''}`}\n aria-current={group.sessionId === selectedId ? 'true' : undefined}\n data-session={group.sessionId} data-engine={group.engine}\n onClick={() => onOpenSession(group.sessionId)}>\n <span className={styles.hitMarker} aria-hidden=\"true\" />\n {/* The title truncates to one line, so it carries itself in full as a tooltip. */}\n <span className={styles.hitTitle} title={group.title || 'Untitled chat'}>{group.title || 'Untitled chat'}</span>\n <time className={styles.hitTime} dateTime={group.latestAt}>{formatRelative(group.latestAt)}</time>\n <span className={styles.hitSnippet}>\n <span className={styles.hitWho}>{who}{more}: </span>\n {segments.map((segment, index) => (segment.match\n ? <mark key={index}>{segment.text}</mark>\n : <span key={index}>{segment.text}</span>))}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n\n {response && state.status !== 'error' ? (\n <p className={`${styles.hint} ${styles.searchNote}`}>\n Searched {response.scannedSessions.toLocaleString()} {response.scannedSessions === 1 ? 'chat' : 'chats'}\n {response.truncated ? ' — the most recent ones only; older chats were not searched.' : '.'}\n </p>\n ) : null}\n </section>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{b as r,c as i,g as a,h as o,m as s,s as c,t as l,y as u}from"./global-BJ_kVFpD.js";import{t as d}from"./Dialog-r4j4R4b6.js";import{n as f}from"./StatusBadge-DrVbi5dF.js";import{t as p}from"./MutationTokenDialog-Dnf_rcnc.js";import{r as m}from"./RouteErrorBoundary-CVabFM97.js";import{Bt as h,Dt as ee,Et as te,Ht as ne,Tt as g}from"./VerseConsoleApp-Cj6yPJo3.js";import{t as _}from"./Segmented-Dokzywy8.js";import{n as v}from"./Tag-Ciht3C94.js";import{T as y,v as re}from"./context-model-DYkDKK6C.js";import{t as b}from"./Button-DJY_Pu5B.js";import{d as ie,h as ae,l as oe,m as se,n as ce,p as le,s as ue,t as de,w as fe}from"./icons-MYfI6vZr.js";import{a as pe}from"./command-catalog-Dnx-iMLX.js";import{l as me,r as he}from"./composer-queries-DHGJlnFJ.js";import{n as ge,t as _e}from"./use-token-gate-E-xzEAu6.js";import{i as ve,n as ye,r as be,t as xe}from"./reasoning-pref-CWGL9MD2.js";import{t as Se}from"./Meter-BfaE-BjY.js";import{t as x}from"./Switch-Z7RmRjWE.js";import{t as S}from"./Slider-C68TumXj.js";import{t as Ce}from"./Select-tf4lNvWD.js";import{n as we,t as Te}from"./app-version-B0FcXqqB.js";import{t as Ee}from"./Input-Bt6fp051.js";import"./primitives-CDKCUR2v.js";import{o as De,t as Oe}from"./useOnboarding-Csw_AXrj.js";import{n as ke}from"./ShortcutsOverlay-CDwQdpGV.js";var C=e(n(),1),w=`ashlr.verse.appearance.v1`,T=30,E=78,D={h:245,s:72,l:58};function Ae(){try{return typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}catch{return!1}}function O(){return{theme:`system`,accentH:D.h,accentS:D.s,accentL:D.l,density:`comfortable`,uiScale:`default`,displayFont:`grotesk`,radius:`default`,motion:`system`,reduceMotion:Ae()}}function k(e){return e===`system`||e===`reduce`||e===`full`}function je(e){return e===`reduce`||e!==`full`&&Ae()}var A=(e,t,n)=>Math.min(n,Math.max(t,e));function Me(e){return e===`comfortable`||e===`compact`}function Ne(e){return e==="default"||e===`large`||e===`xlarge`}function Pe(e){return e===`grotesk`||e===`ui`||e===`mono`}function Fe(e){return e===`sharp`||e==="default"||e===`soft`}function j(e,t){let n={...e,...t},r=t.reduceMotion,i=k(t.motion)?t.motion:typeof r==`boolean`?r?`reduce`:`full`:k(e.motion)?e.motion:`system`;return{theme:n.theme===`light`||n.theme===`dark`?n.theme:`system`,accentH:Number.isFinite(n.accentH)?(Math.round(n.accentH)%360+360)%360:D.h,accentS:Number.isFinite(n.accentS)?A(Math.round(n.accentS),0,100):D.s,accentL:Number.isFinite(n.accentL)?A(Math.round(n.accentL),T,E):D.l,density:Me(n.density)?n.density:`comfortable`,uiScale:Ne(n.uiScale)?n.uiScale:`default`,displayFont:Pe(n.displayFont)?n.displayFont:`grotesk`,radius:Fe(n.radius)?n.radius:`default`,motion:i,reduceMotion:je(i)}}function Ie(){let e=O(),t={};try{let e=localStorage.getItem(w);if(e){let n=JSON.parse(e);n&&typeof n==`object`&&(t=n)}}catch{}let{reduceMotion:n,...r}=t;return j(e,{...r,theme:s()})}function Le(e){try{let{theme:t,reduceMotion:n,...r}=e;localStorage.setItem(w,JSON.stringify(r))}catch{}}var Re={grotesk:null,ui:`var(--font-ui)`,mono:`var(--font-mono)`};function M(e){if(typeof document>`u`)return;let t=document.documentElement;t.style.setProperty(`--accent-h`,String(e.accentH)),t.style.setProperty(`--accent-s`,`${e.accentS}%`),t.style.setProperty(`--accent-l`,`${e.accentL}%`);let n=Re[e.displayFont];n===null?t.style.removeProperty(`--font-display`):t.style.setProperty(`--font-display`,n),t.setAttribute(`data-density`,e.density),t.setAttribute(`data-ui-scale`,e.uiScale),t.setAttribute(`data-radius`,e.radius),e.motion===`system`?t.removeAttribute(`data-motion`):t.setAttribute(`data-motion`,e.motion)}var N=Ie();M(N);var P=new Set;function F(){for(let e of P)e()}a(()=>{N.theme!==s()&&(N={...N,theme:s()},F())});function ze(e){return P.add(e),()=>P.delete(e)}function I(){return N}function Be(e){let t=j(N,e),n=t.theme!==N.theme;N=t,M(N),Le(N),n&&o(N.theme),F()}function Ve(){try{localStorage.removeItem(w)}catch{}N=O(),M(N),o(`system`),F()}var He={min:T,max:E};function Ue(){return{appearance:(0,C.useSyncExternalStore)(ze,I,I),set:Be,reset:Ve}}var L={section:`_section_1m00s_5`,strip:`_strip_1m00s_13`,stripTitle:`_stripTitle_1m00s_25`,scroll:`_scroll_1m00s_32`,column:`_column_1m00s_38`,panel:`_panel_1m00s_51`,panelHead:`_panelHead_1m00s_56`,panelTitle:`_panelTitle_1m00s_64`,panelBody:`_panelBody_1m00s_74`,row:`_row_1m00s_81`,rowStacked:`_rowStacked_1m00s_90`,rowText:`_rowText_1m00s_95`,rowLabel:`_rowLabel_1m00s_99`,rowDescription:`_rowDescription_1m00s_107`,rowControl:`_rowControl_1m00s_114`,swatches:`_swatches_1m00s_140`,swatch:`_swatch_1m00s_140`,swatchCheck:`_swatchCheck_1m00s_165`,sliderStack:`_sliderStack_1m00s_173`,contrastWarning:`_contrastWarning_1m00s_180`,preview:`_preview_1m00s_197`,previewRow:`_previewRow_1m00s_207`,previewHeading:`_previewHeading_1m00s_214`,previewBody:`_previewBody_1m00s_222`,previewNumerals:`_previewNumerals_1m00s_228`,origin:`_origin_1m00s_238`,note:`_note_1m00s_242`,noteIcon:`_noteIcon_1m00s_258`,code:`_code_1m00s_249`,panelNote:`_panelNote_1m00s_278`,about:`_about_1m00s_285`,aboutLine:`_aboutLine_1m00s_291`,aboutName:`_aboutName_1m00s_299`,link:`_link_1m00s_308`},R=t();function z({title:e,action:t,children:n}){return(0,R.jsxs)(`section`,{className:L.panel,children:[(0,R.jsxs)(`div`,{className:L.panelHead,children:[(0,R.jsx)(`h3`,{className:L.panelTitle,children:e}),t]}),(0,R.jsx)(`div`,{className:L.panelBody,children:n})]})}function B({label:e,description:t,htmlFor:n,labelId:r,stacked:i=!1,children:a}){let o=(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`span`,{className:L.rowLabel,id:r,children:e}),t?(0,R.jsx)(`span`,{className:L.rowDescription,children:t}):null]});return(0,R.jsxs)(`div`,{className:`${L.row} ${i?L.rowStacked:``}`,children:[(0,R.jsx)(`div`,{className:L.rowText,children:n?(0,R.jsx)(`label`,{htmlFor:n,className:L.rowText,children:o}):o}),(0,R.jsx)(`div`,{className:L.rowControl,children:a})]})}function We(e,t,n=Date.now()){if(e){let t=re(e,n);return t?`Last completed ${t}.`:`Completed.`}return t?`Skipped. Nothing was missed — it is all reachable from the sections themselves.`:`Not seen yet. Replay it to take the two-minute tour.`}function Ge(){let{completedAt:e,dismissedAt:t,open:n}=Oe();return(0,R.jsx)(z,{title:`Onboarding`,children:(0,R.jsx)(B,{label:`Replay the first-run tour`,description:`Your connected seats, whether a local runtime is available, how autonomy is turned on, and what each of the three stop controls really halts. ${We(e,t)}`,children:(0,R.jsx)(b,{variant:`subtle`,size:`sm`,onClick:De,disabled:n,children:n?`Showing`:`Replay`})})})}function Ke(){return(0,R.jsx)(z,{title:`About`,children:(0,R.jsx)(`div`,{className:`${L.row} ${L.rowStacked}`,children:(0,R.jsxs)(`div`,{className:L.about,children:[(0,R.jsx)(`p`,{className:L.aboutName,children:Te}),(0,R.jsxs)(`p`,{className:L.aboutLine,children:[(0,R.jsxs)(v,{mono:!0,children:[`v`,we]}),(0,R.jsx)(`span`,{children:`ashlr-hub — local-first command center for agentic engineers.`})]}),(0,R.jsx)(`p`,{className:L.aboutLine,children:`Every session, token and artifact stays on this machine. The console talks to one local server and no third-party service.`}),(0,R.jsx)(`p`,{className:L.aboutLine,children:(0,R.jsxs)(`a`,{className:L.link,href:`https://github.com/ashlrai/ashlr-hub`,target:`_blank`,rel:`noreferrer noopener`,children:[`Source and changelog`,(0,R.jsx)(oe,{size:12})]})})]})})})}var qe=/^#([0-9a-f]{3,8})$/i,Je=/^(rgba?|hsla?)\(([^)]*)\)$/i;function V(e,t,n){return Math.min(n,Math.max(t,e))}function H(e,t){let n=e.trim();return n.endsWith(`%`)?Number.parseFloat(n)/100*t:Number.parseFloat(n)}function U(e,t,n){let r=(e%360+360)%360,i=(1-Math.abs(2*n-1))*t,a=i*(1-Math.abs(r/60%2-1)),o=n-i/2,s;return s=r<60?[i,a,0]:r<120?[a,i,0]:r<180?[0,i,a]:r<240?[0,a,i]:r<300?[a,0,i]:[i,0,a],{r:Math.round((s[0]+o)*255),g:Math.round((s[1]+o)*255),b:Math.round((s[2]+o)*255)}}function Ye(e){let t=[],n=0,r=``;for(let i of e){if(i===`(`?n+=1:i===`)`&&--n,i===`,`&&n===0){t.push(r),r=``;continue}r+=i}return t.push(r),t.map(e=>e.trim()).filter(e=>e.length>0)}function W(e){let t=e.trim(),n=/\s(\d*\.?\d+)%$/.exec(t);if(n)return{color:t.slice(0,n.index).trim(),pct:Number.parseFloat(n[1])};let r=/^(\d*\.?\d+)%\s/.exec(t);return r?{color:t.slice(r[0].length).trim(),pct:Number.parseFloat(r[1])}:{color:t,pct:null}}function Xe(e){let t=/^color-mix\((.*)\)$/is.exec(e.trim());if(!t)return null;let n=Ye(t[1]);if(n.length!==3||n[0].replace(/\s+/g,` `).trim()!==`in srgb`)return null;let r=W(n[1]),i=W(n[2]);if(!r||!i)return null;let a=G(r.color),o=G(i.color);if(!a||!o)return null;let s=r.pct,c=i.pct;s===null&&c===null?(s=50,c=50):s===null?s=100-c:c===null&&(c=100-s);let l=s+c;if(l<=0)return null;let u=s/l,d=c/l,f=a.a*u+o.a*d;if(f<=0)return{r:0,g:0,b:0,a:0};let p=e=>V(Math.round((a[e]*a.a*u+o[e]*o.a*d)/f),0,255);return{r:p(`r`),g:p(`g`),b:p(`b`),a:V(f,0,1)}}function G(e){let t=e.trim().toLowerCase();if(t===`transparent`)return{r:0,g:0,b:0,a:0};if(t.startsWith(`color-mix(`))return Xe(t);let n=qe.exec(t);if(n){let e=n[1],t=e=>Number.parseInt(e.length===1?e+e:e,16);return e.length===3||e.length===4?{r:t(e[0]),g:t(e[1]),b:t(e[2]),a:e.length===4?t(e[3])/255:1}:e.length===6||e.length===8?{r:t(e.slice(0,2)),g:t(e.slice(2,4)),b:t(e.slice(4,6)),a:e.length===8?t(e.slice(6,8))/255:1}:null}let r=Je.exec(t);if(!r)return null;let i=r[1],a=r[2].replace(/\//g,` `).split(/[\s,]+/).filter(Boolean);if(a.length<3)return null;let o=a.length>=4?V(H(a[3],1),0,1):1;if(i.startsWith(`rgb`))return{r:V(Math.round(H(a[0],255)),0,255),g:V(Math.round(H(a[1],255)),0,255),b:V(Math.round(H(a[2],255)),0,255),a:o};let s=Number.parseFloat(a[0]),c=V(H(a[1],1),0,1),l=V(H(a[2],1),0,1);return Number.isFinite(s)?{...U(s,c,l),a:o}:null}function K(e,t){if(e.a>=1)return e;let n=e.a;return{r:Math.round(e.r*n+t.r*(1-n)),g:Math.round(e.g*n+t.g*(1-n)),b:Math.round(e.b*n+t.b*(1-n)),a:1}}function q(e){let t=e=>{let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4};return .2126*t(e.r)+.7152*t(e.g)+.0722*t(e.b)}function J(e,t,n=`#ffffff`){let r=G(t),i=G(e),a=G(n);if(!r||!i||!a)return null;let o=K(r,a),s=q(K(i,o)),c=q(o),[l,u]=s>=c?[s,c]:[c,s];return(l+.05)/(u+.05)}function Y(e,t,n,r=0){let i=U(e,V(t,0,100)/100,V(n+r,0,100)/100),a=e=>e.toString(16).padStart(2,`0`);return`#${a(i.r)}${a(i.g)}${a(i.b)}`}var X=[{id:`indigo`,label:`Indigo`,h:245,s:72,l:58},{id:`blue`,label:`Blue`,h:212,s:80,l:50},{id:`cyan`,label:`Cyan`,h:190,s:80,l:40},{id:`teal`,label:`Teal`,h:168,s:70,l:38},{id:`green`,label:`Green`,h:145,s:60,l:38},{id:`amber`,label:`Amber`,h:38,s:80,l:42},{id:`rose`,label:`Rose`,h:348,s:72,l:50},{id:`violet`,label:`Violet`,h:278,s:66,l:55}];function Ze(e=I()){let t=O();return e.theme===t.theme&&e.accentH===t.accentH&&e.accentS===t.accentS&&e.accentL===t.accentL&&e.density===t.density&&e.uiScale===t.uiScale&&e.displayFont===t.displayFont&&e.radius===t.radius&&e.motion===t.motion}function Qe(e=I()){return X.find(t=>t.h===e.accentH&&t.s===e.accentS&&t.l===e.accentL)??null}var $e=`#ffffff`,et=`#121214`,tt=[{value:`system`,label:`System`,icon:(0,R.jsx)(se,{})},{value:`light`,label:`Light`,icon:(0,R.jsx)(fe,{})},{value:`dark`,label:`Dark`,icon:(0,R.jsx)(ae,{})}],nt=[{value:`default`,label:`Default`},{value:`large`,label:`Large`},{value:`xlarge`,label:`Extra large`}],rt=[{value:`comfortable`,label:`Comfortable`},{value:`compact`,label:`Compact`}],it=[{value:`grotesk`,label:`Space Grotesk`},{value:`ui`,label:`UI sans`},{value:`mono`,label:`Mono`}],at=[{value:`sharp`,label:`Sharp`},{value:`default`,label:`Default`},{value:`soft`,label:`Soft`}];function ot(e,t){return`linear-gradient(to right, ${[0,60,120,180,240,300,360].map(n=>`${Y(n,e,t)} ${n/360*100}%`).join(`, `)})`}function st(e,t,n){let r=Y(e,t,n,-8),i=Y(e,t,n,14),a=J(r,$e),o=J(i,et),s=[];return a!==null&&a<4.5&&s.push(`light`),o!==null&&o<4.5&&s.push(`dark`),{lightRatio:a,darkRatio:o,failing:s}}function ct({appearance:e,onChange:t,onReset:n}){let r=(0,C.useId)(),i=(0,C.useId)(),a=(0,C.useId)(),o=(0,C.useId)(),s=(0,C.useId)(),c=Qe(e),l=st(e.accentH,e.accentS,e.accentL);return(0,R.jsxs)(z,{title:`Appearance`,action:(0,R.jsx)(b,{variant:`ghost`,size:`sm`,onClick:n,disabled:Ze(e),title:`Restore the shipped theme, accent, display size, density, font, radius and motion`,children:`Reset to defaults`}),children:[(0,R.jsx)(B,{label:`Theme`,description:`System follows your OS appearance setting.`,children:(0,R.jsx)(_,{"aria-label":`Theme`,options:tt,value:e.theme,onChange:e=>t({theme:e})})}),(0,R.jsx)(B,{label:`Accent`,labelId:r,description:c?`${c.label} — used for links, focus rings and the one primary action per surface.`:`Custom hue — used for links, focus rings and the one primary action per surface.`,children:(0,R.jsx)(`div`,{className:L.swatches,role:`radiogroup`,"aria-labelledby":r,children:X.map(e=>{let n=c?.id===e.id;return(0,R.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":n,"aria-label":e.label,tabIndex:n||!c&&e.id===X[0].id?0:-1,className:L.swatch,style:{background:Y(e.h,e.s,e.l)},onClick:()=>t({accentH:e.h,accentS:e.s,accentL:e.l}),children:n?(0,R.jsx)(`span`,{className:L.swatchCheck,children:(0,R.jsx)(ce,{size:12})}):null},e.id)})})}),(0,R.jsx)(B,{label:`Accent channels`,description:`Hue, saturation and lightness are written straight onto the root element — the whole app follows as you drag.`,stacked:!0,children:(0,R.jsxs)(`div`,{className:L.sliderStack,children:[(0,R.jsx)(S,{id:i,label:`Hue`,min:0,max:359,value:e.accentH,valueLabel:`${e.accentH}°`,valueText:`${e.accentH} degrees`,trackImage:ot(e.accentS,e.accentL),onChange:e=>t({accentH:Number(e.currentTarget.value)})}),(0,R.jsx)(S,{id:a,label:`Saturation`,min:0,max:100,value:e.accentS,valueLabel:`${e.accentS}%`,valueText:`${e.accentS} percent`,onChange:e=>t({accentS:Number(e.currentTarget.value)})}),(0,R.jsx)(S,{id:o,label:`Lightness`,min:He.min,max:He.max,value:e.accentL,valueLabel:`${e.accentL}%`,valueText:`${e.accentL} percent`,onChange:e=>t({accentL:Number(e.currentTarget.value)})}),l.failing.length>0?(0,R.jsxs)(`p`,{className:L.contrastWarning,role:`status`,children:[(0,R.jsx)(de,{size:14}),(0,R.jsxs)(`span`,{children:[`This accent falls below 4.5:1 as link text in`,` `,l.failing.length===2?`both themes`:`${l.failing[0]} mode`,`. Raise or lower the lightness to keep it readable.`]})]}):null]})}),(0,R.jsx)(B,{label:`Display size`,description:`Scales text AND spacing together across the whole app, for a large display or a long session. Applies as you pick it.`,children:(0,R.jsx)(_,{"aria-label":`Display size`,options:nt,value:e.uiScale,onChange:e=>t({uiScale:e})})}),(0,R.jsx)(B,{label:`Density`,description:`Row height and control padding across every view. Independent of display size — a large, tightly packed interface is a valid choice.`,children:(0,R.jsx)(_,{"aria-label":`Density`,options:rt,value:e.density,onChange:e=>t({density:e})})}),(0,R.jsx)(B,{label:`Display font`,description:`Titles, seat names, metrics and numerals. Body copy stays in the UI sans.`,children:(0,R.jsx)(_,{"aria-label":`Display font`,options:it,value:e.displayFont,onChange:e=>t({displayFont:e})})}),(0,R.jsx)(B,{label:`Corner radius`,description:`Sharp reads like a terminal; soft reads like a consumer app.`,children:(0,R.jsx)(_,{"aria-label":`Corner radius`,options:at,value:e.radius,onChange:e=>t({radius:e})})}),(0,R.jsx)(B,{label:`Reduce motion`,htmlFor:s,description:`Collapses every transition to 1ms. Defaults to your system preference; turning it off here overrides that.`,children:(0,R.jsx)(x,{id:s,checked:e.reduceMotion,onChange:e=>t({reduceMotion:e}),"aria-label":`Reduce motion`})}),(0,R.jsx)(B,{label:`Preview`,description:`Live, using the real components.`,stacked:!0,children:(0,R.jsxs)(`div`,{className:L.preview,children:[(0,R.jsx)(`p`,{className:L.previewHeading,children:`Ashlr Verse`}),(0,R.jsxs)(`p`,{className:L.previewBody,children:[`Body copy stays in the UI sans at the reading measure; numerals like`,` `,(0,R.jsx)(`span`,{className:L.previewNumerals,children:`18,420 / 66,000`}),` use the display face.`]}),(0,R.jsxs)(`div`,{className:L.previewRow,children:[(0,R.jsx)(b,{variant:`primary`,size:`sm`,children:`Primary`}),(0,R.jsx)(b,{variant:`subtle`,size:`sm`,children:`Subtle`}),(0,R.jsx)(b,{variant:`ghost`,size:`sm`,children:`Ghost`}),(0,R.jsx)(b,{variant:`danger`,size:`sm`,children:`Destructive`})]}),(0,R.jsxs)(`div`,{className:L.previewRow,children:[(0,R.jsx)(f,{status:`running`}),(0,R.jsx)(v,{engine:`claude`,children:`Claude Max`}),(0,R.jsx)(v,{engine:`local`,mono:!0,children:`qwen3-coder`})]}),(0,R.jsx)(Se,{value:18420,max:66e3,label:`Context`}),(0,R.jsx)(Ee,{"aria-label":`Preview field`,placeholder:`A field at the current density`,size:`sm`})]})})]})}var lt={collapsed:`Streams three lines while the model thinks, then folds to “Thought 12s · ~1.8k tok”.`,expanded:`Streams, and stays open when the thinking is done.`,hidden:`No reasoning in the transcript. The live status still says it is thinking, so a long think never looks like a hang.`},Z=[`plan`,`accept-edits`,`auto`],ut={plan:`Plan`,"accept-edits":`Accept edits`,auto:`Auto`},dt={plan:`New chats plan and edit nothing until you switch them.`,"accept-edits":`New chats apply edits without asking — the default.`,auto:`New chats run in the CLI’s own auto mode.`},ft={minimal:`Minimal`,low:`Low`,medium:`Medium`,high:`High`,xhigh:`Extra high`,max:`Max`},Q=``,pt=new Set(Z),mt=new Set(y);function $(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ht(e){if(!$(e)||!$(e.global))return null;let t=e=>{let t={};return $(e)?(typeof e.permissionMode==`string`&&pt.has(e.permissionMode)&&(t.permissionMode=e.permissionMode),typeof e.effort==`string`&&mt.has(e.effort)&&(t.effort=e.effort),t):t},n={};if($(e.seats))for(let[r,i]of Object.entries(e.seats))n[r]=t(i);return{global:t(e.global),seats:n}}function gt(e){return e instanceof l&&(e.status===404||e.status===501)?"This server can’t set new-chat defaults yet — update Ashlr and restart `ashlr verse`.":`Couldn’t read the new-chat defaults. Reopen Settings to try again.`}function _t(){let[e,t]=(0,C.useState)({state:`loading`}),[n,r]=(0,C.useState)(!1),[i,a]=(0,C.useState)(null),o=ge(),s=(0,C.useId)(),c=(0,C.useId)();(0,C.useEffect)(()=>{let e=new AbortController;return he(e.signal).then(e=>{let n=ht(e);t(n?{state:`ready`,defaults:n}:{state:`unavailable`,message:gt(null)})},n=>{e.signal.aborted||t({state:`unavailable`,message:gt(n)})}),()=>e.abort()},[]);let l=(0,C.useCallback)(async(e,n)=>{a(null),r(!0);try{let r=await o.run(n,()=>me(e));if(r){let e=ht(r);e&&t({state:`ready`,defaults:e})}}catch(e){a(_e(e))}finally{r(!1)}},[o]);if(e.state===`loading`)return(0,R.jsx)(`p`,{className:L.panelNote,"aria-busy":`true`,children:`Reading new-chat defaults…`});if(e.state===`unavailable`)return(0,R.jsx)(`p`,{className:L.panelNote,children:e.message});let u=e.defaults.global,d=u.permissionMode&&u.permissionMode!==`bypass`?u.permissionMode:`accept-edits`,f=u.effort??null,m=Object.keys(e.defaults.seats).length;return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(B,{label:`New chats start in`,description:dt[d],labelId:s,children:(0,R.jsx)(_,{"aria-labelledby":s,size:`sm`,value:d,onChange:e=>{e!==d&&l({permissionMode:e},`Start new chats in ${ut[e]}.`)},options:Z.map(e=>({value:e,label:ut[e],disabled:n}))})}),(0,R.jsx)(B,{label:`Reasoning effort for new chats`,description:m>0?`A seat that can’t use this level starts at its model’s own default. ${m===1?`One seat has its`:`${m} seats have their`} own default, which wins.`:`A seat that can’t use this level starts at its model’s own default.`,htmlFor:c,children:(0,R.jsxs)(Ce,{id:c,size:`sm`,value:f??Q,disabled:n,onChange:e=>{let t=e.target.value,n=t===Q?null:t;n!==f&&l({effort:n},n?`Start new chats at ${ft[n]} effort.`:`Start new chats at the model’s default effort.`)},children:[(0,R.jsx)(`option`,{value:Q,children:`Model default`}),y.map(e=>(0,R.jsx)(`option`,{value:e,children:ft[e]},e))]})}),i?(0,R.jsx)(`p`,{className:L.panelNote,role:`alert`,children:i}):null,(0,R.jsx)(p,{...o.dialog})]})}function vt(){let e=ve(),t=(0,C.useId)();return(0,R.jsxs)(z,{title:`Chat`,children:[(0,R.jsx)(B,{label:`Reasoning`,description:lt[e],labelId:t,children:(0,R.jsx)(_,{"aria-labelledby":t,size:`sm`,value:e,onChange:be,options:xe.map(e=>({value:e,label:ye[e]}))})}),(0,R.jsx)(_t,{})]})}function yt(e){if(e===null)return`locked`;let t=Math.max(0,Math.round((e-Date.now())/6e4));return t<=0?`expiring now`:`unlocked for ${t} more minute${t===1?``:`s`}`}function bt(){let e=c(),t=i(),n=m(),[a,o]=(0,C.useState)(!1),s=(0,C.useRef)(null),l=typeof window>`u`?``:window.location.origin;async function p(){try{await navigator.clipboard.writeText(l),n.show(`Server address copied.`)}catch{n.show(`Could not reach the clipboard — select the field and copy manually.`,`danger`)}}async function h(){o(!1),await r(),n.show(`Disconnected. Paste the read token to reconnect.`)}return(0,R.jsxs)(z,{title:`Connection`,children:[(0,R.jsxs)(B,{label:`Server`,description:`This window talks to one local hub. Nothing leaves your machine.`,children:[(0,R.jsx)(`div`,{className:L.origin,children:(0,R.jsx)(Ee,{value:l,readOnly:!0,mono:!0,size:`sm`,"aria-label":`Server address`})}),(0,R.jsx)(b,{variant:`ghost`,size:`sm`,icon:(0,R.jsx)(ue,{}),onClick:()=>void p(),children:`Copy`})]}),(0,R.jsx)(B,{label:`Read session`,description:`A 15-minute signed cookie, renewed silently while this tab stays open.`,children:(0,R.jsx)(f,{status:e===`authenticated`?`connected`:e===`checking`?`checking`:`disconnected`,tone:e===`authenticated`?`success`:e===`checking`?`running`:`danger`})}),(0,R.jsxs)(B,{label:`Mutation hold`,description:`Every action that changes something needs the mutation token. It is held in memory only, never stored, and clears when this tab closes.`,children:[(0,R.jsx)(f,{status:t.hasHold?yt(t.heldUntil):`locked`,tone:t.hasHold?`success`:`neutral`}),(0,R.jsx)(b,{variant:`subtle`,size:`sm`,icon:(0,R.jsx)(le,{}),onClick:()=>{u(),n.show(`Mutation hold cleared.`)},disabled:!t.hasHold,children:`Lock now`})]}),(0,R.jsx)(B,{label:`Disconnect`,description:`Ends the read session in this browser and clears the mutation hold. Chats on the server are untouched.`,children:(0,R.jsx)(b,{variant:`danger`,size:`sm`,onClick:()=>o(!0),children:`Disconnect`})}),(0,R.jsx)(`div`,{className:L.row,children:(0,R.jsxs)(`p`,{className:L.note,children:[(0,R.jsx)(`span`,{className:L.noteIcon,children:(0,R.jsx)(ie,{size:14})}),(0,R.jsxs)(`span`,{children:[(0,R.jsx)(`strong`,{children:`Where the tokens come from.`}),` Start the console with`,` `,(0,R.jsx)(`code`,{className:L.code,children:`ashlr verse`}),` — it prints a read token and a mutation token in that terminal, and opens this page. The desktop app injects both for you. Tokens are never displayed here, and the hub never writes them into a page, a log line or an API response. Lost them? Stop the server and start it again; it mints a fresh pair.`]})]})}),(0,R.jsx)(d,{open:a,onClose:()=>o(!1),titleId:`verse-settings-disconnect`,title:`Disconnect from this server?`,description:`You will need the read token again to get back in. Running sessions keep running on the server.`,initialFocusRef:s,children:(0,R.jsxs)(`div`,{className:L.previewRow,style:{justifyContent:`flex-end`},children:[(0,R.jsx)(b,{ref:s,variant:`subtle`,onClick:()=>o(!1),children:`Cancel`}),(0,R.jsx)(b,{variant:`danger`,onClick:()=>void h(),children:`Disconnect`})]})})]})}var xt=4e3;function St(e){let{enabled:t,registered:n,accelerator:r,error:i}=e.hotkey;return t?n?`Press ${r} in any app to bring Verse forward with the composer focused.`:`${r} is not active: ${i??`another app already uses it`}. Free the shortcut in that app, or turn this off.`:`Off. Turning it on takes ${r} away from every other app on this Mac.`}function Ct(e){let t=e.notifications.enabled?`Finished and failed chats, and new items that need you — only while Verse is in the background.`:`Off. The tray and the Dock badge still show what needs you.`;return e.notifications.delivery===`script`?`${t} On this unsigned build banners appear as Script Editor, and clicking one opens Script Editor rather than Verse.`:t}function wt(){let e=ee(),[t,n]=(0,C.useState)(null),[r,i]=(0,C.useState)(null),a=(0,C.useRef)(null);if((0,C.useEffect)(()=>{n(null),i(null),a.current!==null&&window.clearTimeout(a.current),a.current=null},[e]),(0,C.useEffect)(()=>()=>{a.current!==null&&window.clearTimeout(a.current)},[]),e===null)return(0,R.jsx)(z,{title:`Desktop`,children:(0,R.jsx)(`p`,{className:L.panelNote,"aria-busy":g()||void 0,children:g()?`Reading the desktop app’s settings…`:`The system-wide shortcut and notifications are available in the Verse desktop app.`})});function o(e,t){if(i(null),!te(e,t)){i(`The desktop app did not take the change. Nothing was changed.`);return}n(e),a.current!==null&&window.clearTimeout(a.current),a.current=window.setTimeout(()=>{a.current=null,n(null),i(`The desktop app did not answer. The switches show what it last reported.`)},xt)}let s=e.hotkey.enabled&&!e.hotkey.registered;return(0,R.jsxs)(z,{title:`Desktop`,children:[(0,R.jsx)(B,{label:`System-wide shortcut (${e.hotkey.accelerator})`,description:(0,R.jsx)(`span`,{"data-tone":s?`warning`:void 0,role:s?`status`:void 0,children:St(e)}),children:(0,R.jsx)(x,{"aria-label":`System-wide shortcut`,checked:e.hotkey.enabled,disabled:t!==null,onChange:e=>o(`globalHotkey`,e)})}),(0,R.jsx)(B,{label:`Notifications`,description:Ct(e),children:(0,R.jsx)(x,{"aria-label":`Notifications`,checked:e.notifications.enabled,disabled:t!==null,onChange:e=>o(`notifications`,e)})}),t?(0,R.jsx)(`p`,{className:L.panelNote,role:`status`,children:`Waiting for the desktop app…`}):null,r?(0,R.jsx)(`p`,{className:L.panelNote,role:`alert`,children:r}):null]})}function Tt(){let e=(0,C.useMemo)(()=>h(),[]),t=pe(`shortcuts.open`)?.keys[0];return(0,R.jsxs)(z,{title:`Keyboard`,children:[(0,R.jsx)(`p`,{className:L.panelNote,children:t?`${ne(t,e)} shows this list from anywhere.`:null}),(0,R.jsx)(ke,{platform:e})]})}function Et(){let{appearance:e,set:t,reset:n}=Ue();return(0,R.jsxs)(`div`,{className:L.section,children:[(0,R.jsx)(`header`,{className:L.strip,"data-app-region":`drag`,children:(0,R.jsx)(`h2`,{className:L.stripTitle,children:`Settings`})}),(0,R.jsx)(`div`,{className:L.scroll,children:(0,R.jsxs)(`div`,{className:L.column,children:[(0,R.jsx)(ct,{appearance:e,onChange:t,onReset:n}),(0,R.jsx)(vt,{}),(0,R.jsx)(wt,{}),(0,R.jsx)(bt,{}),(0,R.jsx)(Tt,{}),(0,R.jsx)(Ge,{}),(0,R.jsx)(Ke,{})]})})]})}export{Et as SettingsSection};
|
|
2
|
-
//# sourceMappingURL=SettingsSection-DfOsHzl6.js.map
|