@ashlr/hub 3.16.0 → 3.16.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 +28 -0
- package/README.md +2 -2
- package/dist/authority-surface.json +5 -5
- package/dist/build-identity.json +2 -2
- package/dist/core/daemon/loop.js +1 -0
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/tick-hooks.d.ts +2 -0
- package/dist/core/daemon/tick-hooks.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +2 -1
- package/dist/core/fleet/tick-hooks-live.js +49 -7
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js +2 -0
- package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js.map +1 -0
- package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js +2 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js +2 -0
- package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js +3 -0
- package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js.map +1 -0
- package/dist/core/web/public/next/assets/App-Uy6lDpKw.js +8 -0
- package/dist/core/web/public/next/assets/App-Uy6lDpKw.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js.map +1 -0
- package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js +2 -0
- package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js.map +1 -0
- package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js.map +1 -0
- package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js +7 -0
- package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js.map +1 -0
- package/dist/core/web/public/next/assets/Button-CMR_Op-0.js +2 -0
- package/dist/core/web/public/next/assets/Button-CMR_Op-0.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js.map +1 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js +16 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js +2 -0
- package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js.map +1 -0
- package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js +5 -0
- package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js +3 -0
- package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js +9 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js +3 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js.map +1 -0
- package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js +4 -0
- package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js.map +1 -0
- package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js +2 -0
- package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js.map +1 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js.map +1 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js +2 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js +2 -0
- package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js.map +1 -0
- package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js.map +1 -0
- package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js +2 -0
- package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js.map +1 -0
- package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js +2 -0
- package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js.map +1 -0
- package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js +2 -0
- package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js +2 -0
- package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js +5 -0
- package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js.map +1 -0
- package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js +2 -0
- package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js +3 -0
- package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js +3 -0
- package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js +2 -0
- package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js.map +1 -0
- package/dist/core/web/public/next/assets/Input-CsSZI8QC.js +2 -0
- package/dist/core/web/public/next/assets/Input-CsSZI8QC.js.map +1 -0
- package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js +9 -0
- package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js +3 -0
- package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js +2 -0
- package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js.map +1 -0
- package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js +2 -0
- package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js.map +1 -0
- package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js +2 -0
- package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js.map +1 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js +2 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js +3 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js +72 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js +2 -0
- package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js.map +1 -0
- package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js +2 -0
- package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js.map +1 -0
- package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js +2 -0
- package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js +2 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js +3 -0
- package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js.map +1 -0
- package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js +2 -0
- package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js.map +1 -0
- package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js +7 -0
- package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js.map +1 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js +2 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js.map +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js +4 -0
- package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js.map +1 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js +9 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js.map +1 -0
- package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js.map +1 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js +2 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js.map +1 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js +2 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js +2 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js.map +1 -0
- package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js +3 -0
- package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js +3 -0
- package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js.map +1 -0
- package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js +2 -0
- package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js.map +1 -0
- package/dist/core/web/public/next/assets/Select-DjQDkPJU.js +2 -0
- package/dist/core/web/public/next/assets/Select-DjQDkPJU.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js +2 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js +2 -0
- package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js.map +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js +2 -0
- package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js.map +1 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js +2 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js.map +1 -0
- package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js.map +1 -0
- package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js +2 -0
- package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js +2 -0
- package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js.map +1 -0
- package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js +2 -0
- package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js.map +1 -0
- package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-BEToBKC3.js +2 -0
- package/dist/core/web/public/next/assets/Surface-BEToBKC3.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js.map +1 -0
- package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js +2 -0
- package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js.map +1 -0
- package/dist/core/web/public/next/assets/Tag-Chqolzxz.js +2 -0
- package/dist/core/web/public/next/assets/Tag-Chqolzxz.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js +3 -0
- package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js +26 -0
- package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js.map +1 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js +2 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js.map +1 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js +2 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js +3 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js +2 -0
- package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js +2 -0
- package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js +2 -0
- package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js.map +1 -0
- package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js +2 -0
- package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js +6 -0
- package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-BPyW8QC-.js +2 -0
- package/dist/core/web/public/next/assets/actions-BPyW8QC-.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js +2 -0
- package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js +7 -0
- package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js.map +1 -0
- package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js +2 -0
- package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js.map +1 -0
- package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js +2 -0
- package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js.map +1 -0
- package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js +2 -0
- package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js.map +1 -0
- package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js +2 -0
- package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js +2 -0
- package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js +2 -0
- package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-Di0_Q980.js +2 -0
- package/dist/core/web/public/next/assets/charts-Di0_Q980.js.map +1 -0
- package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js +2 -0
- package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js.map +1 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js +2 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js +2 -0
- package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js +2 -0
- package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js +2 -0
- package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js.map +1 -0
- package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js +2 -0
- package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js.map +1 -0
- package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js +2 -0
- package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js.map +1 -0
- package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js +3 -0
- package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js.map +1 -0
- package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js +2 -0
- package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js.map +1 -0
- package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js.map +1 -0
- package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js +2 -0
- package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js.map +1 -0
- package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js +2 -0
- package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js.map +1 -0
- package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js +2 -0
- package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js +2 -0
- package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js +2 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js +2 -0
- package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js +3 -0
- package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js.map +1 -0
- package/dist/core/web/public/next/assets/format-V6IiIMAL.js +2 -0
- package/dist/core/web/public/next/assets/format-V6IiIMAL.js.map +1 -0
- package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js +5 -0
- package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js.map +1 -0
- package/dist/core/web/public/next/assets/global-CYfRwH6t.js +3 -0
- package/dist/core/web/public/next/assets/global-CYfRwH6t.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js.map +1 -0
- package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js +2 -0
- package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js.map +1 -0
- package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js +2 -0
- package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-BBm_Cy62.js +2 -0
- package/dist/core/web/public/next/assets/icons-BBm_Cy62.js.map +1 -0
- package/dist/core/web/public/next/assets/index-_izD07R9.js +11 -0
- package/dist/core/web/public/next/assets/index-_izD07R9.js.map +1 -0
- package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js +2 -0
- package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js.map +1 -0
- package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js +2 -0
- package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js.map +1 -0
- package/dist/core/web/public/next/assets/live-model-D97AfBFz.js +2 -0
- package/dist/core/web/public/next/assets/live-model-D97AfBFz.js.map +1 -0
- package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js +2 -0
- package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js +2 -0
- package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js +2 -0
- package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js +7 -0
- package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js +2 -0
- package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js +2 -0
- package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js.map +1 -0
- package/dist/core/web/public/next/assets/nav-DC0ynjdb.js +2 -0
- package/dist/core/web/public/next/assets/nav-DC0ynjdb.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js +2 -0
- package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js.map +1 -0
- package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js +2 -0
- package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js.map +1 -0
- package/dist/core/web/public/next/assets/panes-DOXM13lF.js +3 -0
- package/dist/core/web/public/next/assets/panes-DOXM13lF.js.map +1 -0
- package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js +2 -0
- package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js.map +1 -0
- package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js +2 -0
- package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js +2 -0
- package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js +2 -0
- package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js.map +1 -0
- package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js +2 -0
- package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js.map +1 -0
- package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-Bynv7bPl.js +1 -0
- package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js +2 -0
- package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js +2 -0
- package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js.map +1 -0
- package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js +2 -0
- package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js.map +1 -0
- package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js +3 -0
- package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js.map +1 -0
- package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js +2 -0
- package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js.map +1 -0
- package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js +2 -0
- package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js.map +1 -0
- package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js.map +1 -0
- package/dist/core/web/public/next/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js +2 -0
- package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js.map +1 -0
- package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js +2 -0
- package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js.map +1 -0
- package/dist/core/web/public/next/assets/sheet-BxZSmdad.js +2 -0
- package/dist/core/web/public/next/assets/sheet-BxZSmdad.js.map +1 -0
- package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js +2 -0
- package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js.map +1 -0
- package/dist/core/web/public/next/assets/slots-BJc3RJkV.js +3 -0
- package/dist/core/web/public/next/assets/slots-BJc3RJkV.js.map +1 -0
- package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js +4 -0
- package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js.map +1 -0
- package/dist/core/web/public/next/assets/sse-It4xa040.js +2 -0
- package/dist/core/web/public/next/assets/sse-It4xa040.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js.map +1 -0
- package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js +2 -0
- package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js +2 -0
- package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js +2 -0
- package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js +6 -0
- package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js.map +1 -0
- package/dist/core/web/public/next/assets/thread-data-C8z55msn.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-C8z55msn.js.map +1 -0
- package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js +2 -0
- package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js.map +1 -0
- package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js +2 -0
- package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js.map +1 -0
- package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js +2 -0
- package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js.map +1 -0
- package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js +2 -0
- package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js.map +1 -0
- package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js.map +1 -0
- package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js +2 -0
- package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js.map +1 -0
- package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js +2 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js +2 -0
- package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js +2 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js +3 -0
- package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js.map +1 -0
- package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js +2 -0
- package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js.map +1 -0
- package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js +2 -0
- package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js.map +1 -0
- package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js +2 -0
- package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js.map +1 -0
- package/dist/core/web/public/next/index.html +2 -1
- package/dist/core/web/remote-gateway-policy.js +5 -0
- package/dist/core/web/remote-gateway-policy.js.map +1 -1
- package/dist/core/web/static.d.ts +4 -3
- package/dist/core/web/static.js +8 -5
- package/dist/core/web/static.js.map +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/node_modules/fast-uri/index.js +20 -5
- package/node_modules/fast-uri/lib/utils.js +8 -1
- package/node_modules/fast-uri/package.json +1 -1
- package/node_modules/fast-uri/test/component-safe-serialization.test.js +58 -0
- package/node_modules/fast-uri/test/ipv6-validation.test.js +34 -0
- package/node_modules/ip-address/README.md +134 -134
- package/node_modules/ip-address/dist/address-error.d.ts +11 -0
- package/node_modules/ip-address/dist/address-error.js.map +1 -1
- package/node_modules/ip-address/dist/ipv4.d.ts +22 -6
- package/node_modules/ip-address/dist/ipv4.js +22 -6
- package/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/ip-address/dist/ipv6.d.ts +26 -8
- package/node_modules/ip-address/dist/ipv6.js +46 -29
- package/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/ip-address/dist/v6/constants.js +1 -0
- package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/ip-address/package.json +1 -1
- package/package.json +5 -4
- package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js +0 -2
- package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js +0 -2
- package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js +0 -2
- package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js +0 -3
- package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js.map +0 -1
- package/dist/core/web/public/next/assets/App-DebYuj1v.js +0 -8
- package/dist/core/web/public/next/assets/App-DebYuj1v.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js.map +0 -1
- package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js +0 -2
- package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js +0 -3
- package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js.map +0 -1
- package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js +0 -7
- package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js.map +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js.map +0 -1
- package/dist/core/web/public/next/assets/Button-DP2ImS5n.js +0 -2
- package/dist/core/web/public/next/assets/Button-DP2ImS5n.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js.map +0 -1
- package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js +0 -16
- package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js +0 -2
- package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js.map +0 -1
- package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js +0 -5
- package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js +0 -9
- package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js +0 -3
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js.map +0 -1
- package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js +0 -4
- package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js.map +0 -1
- package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js +0 -2
- package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js.map +0 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js +0 -2
- package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js.map +0 -1
- package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js +0 -2
- package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js.map +0 -1
- package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js +0 -2
- package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js.map +0 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js +0 -2
- package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js.map +0 -1
- package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js +0 -2
- package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js +0 -2
- package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js +0 -5
- package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-Cc14h572.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-Cc14h572.js.map +0 -1
- package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js +0 -2
- package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js +0 -3
- package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js +0 -3
- package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js +0 -2
- package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js.map +0 -1
- package/dist/core/web/public/next/assets/Input-BEF-ScuG.js +0 -2
- package/dist/core/web/public/next/assets/Input-BEF-ScuG.js.map +0 -1
- package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js +0 -9
- package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js +0 -3
- package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js +0 -2
- package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js.map +0 -1
- package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js +0 -2
- package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js.map +0 -1
- package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js +0 -2
- package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js.map +0 -1
- package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js +0 -2
- package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js +0 -72
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js +0 -2
- package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js.map +0 -1
- package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js +0 -2
- package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js.map +0 -1
- package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js +0 -2
- package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js +0 -2
- package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js +0 -3
- package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js.map +0 -1
- package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js +0 -2
- package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js.map +0 -1
- package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js +0 -7
- package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js.map +0 -1
- package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js +0 -2
- package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js +0 -4
- package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js.map +0 -1
- package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js +0 -9
- package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js.map +0 -1
- package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js +0 -2
- package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js.map +0 -1
- package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js.map +0 -1
- package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js +0 -2
- package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js +0 -2
- package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js.map +0 -1
- package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js +0 -3
- package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js +0 -3
- package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js.map +0 -1
- package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js +0 -2
- package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js.map +0 -1
- package/dist/core/web/public/next/assets/Select-zXMdgblm.js +0 -2
- package/dist/core/web/public/next/assets/Select-zXMdgblm.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js.map +0 -1
- package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js +0 -2
- package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js.map +0 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js +0 -3
- package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js +0 -2
- package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js.map +0 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js.map +0 -1
- package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js +0 -2
- package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js +0 -2
- package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js +0 -2
- package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js.map +0 -1
- package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js +0 -2
- package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js.map +0 -1
- package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js +0 -2
- package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js +0 -26
- package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js.map +0 -1
- package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js +0 -2
- package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js.map +0 -1
- package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js +0 -2
- package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js +0 -3
- package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js +0 -2
- package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js +0 -2
- package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js +0 -2
- package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js +0 -2
- package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js +0 -6
- package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-CyO4R-IO.js +0 -2
- package/dist/core/web/public/next/assets/actions-CyO4R-IO.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js +0 -2
- package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js +0 -7
- package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js.map +0 -1
- package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js +0 -2
- package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js.map +0 -1
- package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js +0 -2
- package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js.map +0 -1
- package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js +0 -2
- package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js.map +0 -1
- package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js +0 -2
- package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js.map +0 -1
- package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js +0 -2
- package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js +0 -2
- package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-D3I0q4hG.js +0 -2
- package/dist/core/web/public/next/assets/charts-D3I0q4hG.js.map +0 -1
- package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js +0 -2
- package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js.map +0 -1
- package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js +0 -2
- package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js +0 -2
- package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js +0 -2
- package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js +0 -2
- package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js.map +0 -1
- package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js +0 -2
- package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js +0 -2
- package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js +0 -3
- package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js.map +0 -1
- package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js.map +0 -1
- package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js.map +0 -1
- package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js +0 -2
- package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js.map +0 -1
- package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js +0 -2
- package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js.map +0 -1
- package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js +0 -2
- package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js +0 -2
- package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js +0 -2
- package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js +0 -3
- package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js.map +0 -1
- package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js +0 -2
- package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js.map +0 -1
- package/dist/core/web/public/next/assets/format-CcEKjUou.js +0 -2
- package/dist/core/web/public/next/assets/format-CcEKjUou.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-DL3MwN93.js +0 -5
- package/dist/core/web/public/next/assets/git-model-DL3MwN93.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BWc2NPzv.js +0 -3
- package/dist/core/web/public/next/assets/global-BWc2NPzv.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js.map +0 -1
- package/dist/core/web/public/next/assets/headroom-CP99UxyV.js +0 -2
- package/dist/core/web/public/next/assets/headroom-CP99UxyV.js.map +0 -1
- package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js +0 -2
- package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-U34oiN9M.js +0 -2
- package/dist/core/web/public/next/assets/icons-U34oiN9M.js.map +0 -1
- package/dist/core/web/public/next/assets/index-BbDqdepe.js +0 -11
- package/dist/core/web/public/next/assets/index-BbDqdepe.js.map +0 -1
- package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js +0 -2
- package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js.map +0 -1
- package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js +0 -2
- package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js.map +0 -1
- package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js +0 -2
- package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js +0 -2
- package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js.map +0 -1
- package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js +0 -2
- package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js +0 -2
- package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js +0 -2
- package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js +0 -7
- package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js +0 -2
- package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js +0 -2
- package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js.map +0 -1
- package/dist/core/web/public/next/assets/nav-CM-mJcSq.js +0 -2
- package/dist/core/web/public/next/assets/nav-CM-mJcSq.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js.map +0 -1
- package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js.map +0 -1
- package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js +0 -2
- package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js.map +0 -1
- package/dist/core/web/public/next/assets/panes-BjUzIDw6.js +0 -3
- package/dist/core/web/public/next/assets/panes-BjUzIDw6.js.map +0 -1
- package/dist/core/web/public/next/assets/path-display-HyxETV-f.js +0 -2
- package/dist/core/web/public/next/assets/path-display-HyxETV-f.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js +0 -2
- package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js +0 -2
- package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js.map +0 -1
- package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js +0 -2
- package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js.map +0 -1
- package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-BEXDE-HP.js +0 -1
- package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js +0 -2
- package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js.map +0 -1
- package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js +0 -2
- package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js.map +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js +0 -2
- package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js.map +0 -1
- package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js +0 -3
- package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js.map +0 -1
- package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js +0 -2
- package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js.map +0 -1
- package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js +0 -2
- package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js.map +0 -1
- package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js +0 -2
- package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js.map +0 -1
- package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js +0 -2
- package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js.map +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js +0 -2
- package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js.map +0 -1
- package/dist/core/web/public/next/assets/sheet-D0ciShoy.js +0 -2
- package/dist/core/web/public/next/assets/sheet-D0ciShoy.js.map +0 -1
- package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js +0 -2
- package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-m3L6Ints.js +0 -3
- package/dist/core/web/public/next/assets/slots-m3L6Ints.js.map +0 -1
- package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js +0 -4
- package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js.map +0 -1
- package/dist/core/web/public/next/assets/sse-CK65-Cun.js +0 -2
- package/dist/core/web/public/next/assets/sse-CK65-Cun.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js.map +0 -1
- package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js +0 -2
- package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js +0 -2
- package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js +0 -2
- package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js +0 -6
- package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js.map +0 -1
- package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js +0 -2
- package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js.map +0 -1
- package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js +0 -2
- package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js.map +0 -1
- package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js +0 -2
- package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js.map +0 -1
- package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js +0 -2
- package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js.map +0 -1
- package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js +0 -2
- package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js.map +0 -1
- package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js +0 -2
- package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js.map +0 -1
- package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js +0 -2
- package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js +0 -2
- package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js +0 -2
- package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js +0 -2
- package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js +0 -2
- package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js +0 -3
- package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js.map +0 -1
- package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js +0 -2
- package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js.map +0 -1
- package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js +0 -2
- package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js.map +0 -1
- package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js +0 -2
- package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as e}from"./surface-data-NFl_uS--.js";function t(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var n=e=>typeof e==`number`&&Number.isFinite(e),r=e=>e===null||n(e);function i(e){return t(e)&&typeof e.kind==`string`&&n(e.decisions)&&n(e.jev)&&n(e.fallback)&&n(e.calls)&&r(e.avgConfidence)&&n(e.fallbackRate)&&n(e.estCostUsd)&&r(e.avgLatencyMs)&&Array.isArray(e.topFallbackReasons)}function a(e){return t(e)&&typeof e.enabled==`boolean`&&typeof e.keyed==`boolean`&&typeof e.day==`string`&&n(e.decisionsToday)&&n(e.callsToday)&&n(e.dailyCallBudget)&&n(e.estCostUsdToday)&&n(e.fallbackRateToday)&&r(e.avgConfidenceToday)&&r(e.avgLatencyMsToday)&&Array.isArray(e.byKind)&&e.byKind.every(i)}function o(e){return!t(e)||typeof e.generatedAt!=`string`||!a(e.status)||!Array.isArray(e.kinds)?null:e}function s(e){return e.enabled?e.keyed?e.callsToday>=e.dailyCallBudget?{word:`Budget spent`,tone:`warning`,detail:`Today's call budget is used up; decisions fall back until tomorrow.`}:{word:`On`,tone:`success`,detail:`Typed decisions with calibrated confidence; below each gate the deterministic rule decides.`}:{word:`Not set up`,tone:`neutral`,detail:`No TypeSafe key. Every decision uses its deterministic rule. Add TYPESAFE_API_KEY to ~/.ashlr/secrets/typesafe.env (mode 0600) in a terminal.`}:{word:`Off`,tone:`neutral`,detail:`Switched off (${e.disabledBy??`kill switch`}). Every decision uses its deterministic rule.`}}function c(e){return e===null||!Number.isFinite(e)?`—`:`${Math.round(e*100)}%`}function l(e){return e===null||!Number.isFinite(e)?`—`:e.toFixed(2)}function u(e){return!Number.isFinite(e)||e<=0?`$0`:e<.01?`<$0.01`:`$${e.toFixed(2)}`}function d(e){return e===null||!Number.isFinite(e)?`—`:e<1e3?`${Math.round(e)} ms`:`${(e/1e3).toFixed(1)} s`}function f(e){let t=e.decisionsToday;return t===0?`No decisions yet today.`:`${t} decision${t===1?``:`s`} · ${e.callsToday} call${e.callsToday===1?``:`s`} · ${c(e.fallbackRateToday)} fell back`}var p=`Cost is an estimate from token counts at placeholder rates (set real rates in ~/.ashlr/jev/config.json).`,m=`/api/verse/jev`,h=`verse-jev`,g=6e4,_=e(h,m,`Jev`,o);export{d as a,s as c,l as i,f as l,_ as n,c as o,p as r,u as s,g as t};
|
|
2
|
+
//# sourceMappingURL=jev-queries-D-AMM0sw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev-queries-D-AMM0sw.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/jev/jev-model.ts","../../../../../../src/core/decide/jev-types.ts","../../../../../../src/web-ui/routes/verse/jev/jev-queries.ts"],"sourcesContent":["/**\n * routes/verse/jev/jev-model.ts — pure helpers behind the Jev card\n * (Resources ⌘.) and the Jev panel (Usage). Server: core/decide/jev-api.ts.\n *\n * Narrowing is strict on the fields the views read: an unknown shape renders\n * \"Unrecognized response\" rather than a guessed number. Dollar figures are an\n * ESTIMATE (placeholder per-token rates until TypeSafe publishes pricing) and\n * every view says so.\n */\nimport type { JevResponse } from '../../../../core/decide/jev-types.js';\nimport type { JevKindStats, JevStatus } from '../../../../core/decide/types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst num = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\nconst numOrNull = (v: unknown): v is number | null => v === null || num(v);\n\nfunction isKindStats(v: unknown): v is JevKindStats {\n return isRecord(v) && typeof v['kind'] === 'string' && num(v['decisions']) && num(v['jev']) && num(v['fallback'])\n && num(v['calls']) && numOrNull(v['avgConfidence']) && num(v['fallbackRate']) && num(v['estCostUsd'])\n && numOrNull(v['avgLatencyMs']) && Array.isArray(v['topFallbackReasons']);\n}\n\nfunction isStatus(v: unknown): v is JevStatus {\n return isRecord(v) && typeof v['enabled'] === 'boolean' && typeof v['keyed'] === 'boolean' && typeof v['day'] === 'string'\n && num(v['decisionsToday']) && num(v['callsToday']) && num(v['dailyCallBudget']) && num(v['estCostUsdToday'])\n && num(v['fallbackRateToday']) && numOrNull(v['avgConfidenceToday']) && numOrNull(v['avgLatencyMsToday'])\n && Array.isArray(v['byKind']) && v['byKind'].every(isKindStats);\n}\n\nexport function narrowJevResponse(raw: unknown): JevResponse | null {\n if (!isRecord(raw) || typeof raw['generatedAt'] !== 'string' || !isStatus(raw['status']) || !Array.isArray(raw['kinds'])) return null;\n return raw as unknown as JevResponse;\n}\n\nexport type JevTone = 'success' | 'warning' | 'neutral';\n\nexport function jevHeadline(status: JevStatus): { word: string; tone: JevTone; detail: string } {\n if (!status.enabled) return { word: 'Off', tone: 'neutral', detail: `Switched off (${status.disabledBy ?? 'kill switch'}). Every decision uses its deterministic rule.` };\n if (!status.keyed) {\n return {\n word: 'Not set up',\n tone: 'neutral',\n detail: 'No TypeSafe key. Every decision uses its deterministic rule. Add TYPESAFE_API_KEY to ~/.ashlr/secrets/typesafe.env (mode 0600) in a terminal.',\n };\n }\n if (status.callsToday >= status.dailyCallBudget) return { word: 'Budget spent', tone: 'warning', detail: 'Today\\'s call budget is used up; decisions fall back until tomorrow.' };\n return { word: 'On', tone: 'success', detail: 'Typed decisions with calibrated confidence; below each gate the deterministic rule decides.' };\n}\n\nexport function formatPercent(fraction: number | null): string {\n if (fraction === null || !Number.isFinite(fraction)) return '—';\n return `${Math.round(fraction * 100)}%`;\n}\n\nexport function formatConfidence(value: number | null): string {\n return value === null || !Number.isFinite(value) ? '—' : value.toFixed(2);\n}\n\nexport function formatUsd(value: number): string {\n if (!Number.isFinite(value) || value <= 0) return '$0';\n if (value < 0.01) return '<$0.01';\n return `$${value.toFixed(2)}`;\n}\n\nexport function formatLatency(ms: number | null): string {\n if (ms === null || !Number.isFinite(ms)) return '—';\n return ms < 1000 ? `${Math.round(ms)} ms` : `${(ms / 1000).toFixed(1)} s`;\n}\n\n/** \"12 decisions · 5 calls · 42% fell back\" */\nexport function jevTodayLine(status: JevStatus): string {\n const d = status.decisionsToday;\n if (d === 0) return 'No decisions yet today.';\n return `${d} decision${d === 1 ? '' : 's'} · ${status.callsToday} call${status.callsToday === 1 ? '' : 's'} · ${formatPercent(status.fallbackRateToday)} fell back`;\n}\n\nexport const JEV_ESTIMATE_NOTE = 'Cost is an estimate from token counts at placeholder rates (set real rates in ~/.ashlr/jev/config.json).';\n","/**\n * decide/jev-types.ts — the wire shape of GET /api/verse/jev.\n *\n * BROWSER-SAFE: the Resources \"Jev\" card and the Usage panel import this —\n * type-only imports and plain consts, nothing that touches node.\n */\n\nimport type { DecisionKind, JevStatus } from './types.js';\n\nexport const VERSE_JEV_PATH = '/api/verse/jev';\n\nexport interface JevKindInfo {\n readonly kind: DecisionKind;\n readonly description: string;\n readonly threshold: number;\n readonly safetyAdjacent: boolean;\n readonly labels: readonly string[];\n}\n\nexport interface JevResponse {\n readonly generatedAt: string;\n readonly status: JevStatus;\n readonly kinds: readonly JevKindInfo[];\n}\n","/**\n * routes/verse/jev/jev-queries.ts — GET /api/verse/jev (core/decide/jev-api.ts).\n *\n * OPTIONAL: a server without the route answers 404 and the views render\n * nothing. Read-only: there is no write, and the page never takes a key.\n */\nimport { VERSE_JEV_PATH } from '../../../../core/decide/jev-types.js';\nimport { optionalQuery } from '../command/surface-data.js';\nimport { narrowJevResponse } from './jev-model.js';\n\nexport const JEV_KEY = 'verse-jev';\nexport const JEV_POLL_MS = 60_000;\n\nexport const jevQuery = optionalQuery(JEV_KEY, VERSE_JEV_PATH, 'Jev', narrowJevResponse);\n"],"mappings":"+CAYA,SAAS,EAAS,EAAkD,CAClE,OAAyB,OAAO,GAAU,YAAnC,GAA+C,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAEA,IAAM,EAAO,GAA4B,OAAO,GAAM,UAAY,OAAO,SAAS,CAAC,EAC7E,EAAa,GAAmC,IAAM,MAAQ,EAAI,CAAC,EAEzE,SAAS,EAAY,EAA+B,CAClD,OAAO,EAAS,CAAC,GAAK,OAAO,EAAE,MAAY,UAAY,EAAI,EAAE,SAAY,GAAK,EAAI,EAAE,GAAM,GAAK,EAAI,EAAE,QAAW,GAC3G,EAAI,EAAE,KAAQ,GAAK,EAAU,EAAE,aAAgB,GAAK,EAAI,EAAE,YAAe,GAAK,EAAI,EAAE,UAAa,GACjG,EAAU,EAAE,YAAe,GAAK,MAAM,QAAQ,EAAE,kBAAqB,CAC5E,CAEA,SAAS,EAAS,EAA4B,CAC5C,OAAO,EAAS,CAAC,GAAK,OAAO,EAAE,SAAe,WAAa,OAAO,EAAE,OAAa,WAAa,OAAO,EAAE,KAAW,UAC7G,EAAI,EAAE,cAAiB,GAAK,EAAI,EAAE,UAAa,GAAK,EAAI,EAAE,eAAkB,GAAK,EAAI,EAAE,eAAkB,GACzG,EAAI,EAAE,iBAAoB,GAAK,EAAU,EAAE,kBAAqB,GAAK,EAAU,EAAE,iBAAoB,GACrG,MAAM,QAAQ,EAAE,MAAS,GAAK,EAAE,OAAU,MAAM,CAAW,CAClE,CAEA,SAAgB,EAAkB,EAAkC,CAElE,MADI,CAAC,EAAS,CAAG,GAAK,OAAO,EAAI,aAAmB,UAAY,CAAC,EAAS,EAAI,MAAS,GAAK,CAAC,MAAM,QAAQ,EAAI,KAAQ,EAAU,KAC1H,CACT,CAIA,SAAgB,EAAY,EAAoE,CAU9F,OATK,EAAO,QACP,EAAO,MAOR,EAAO,YAAc,EAAO,gBAAwB,CAAE,KAAM,eAAgB,KAAM,UAAW,OAAQ,qEAAuE,EACzK,CAAE,KAAM,KAAM,KAAM,UAAW,OAAQ,6FAA8F,EAPnI,CACL,KAAM,aACN,KAAM,UACN,OAAQ,+IACV,EAN0B,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,iBAAiB,EAAO,YAAc,cAAc,+CAAgD,CAU1K,CAEA,SAAgB,EAAc,EAAiC,CAE7D,OADI,IAAa,MAAQ,CAAC,OAAO,SAAS,CAAQ,EAAU,IACrD,GAAG,KAAK,MAAM,EAAW,GAAG,EAAE,EACvC,CAEA,SAAgB,EAAiB,EAA8B,CAC7D,OAAO,IAAU,MAAQ,CAAC,OAAO,SAAS,CAAK,EAAI,IAAM,EAAM,QAAQ,CAAC,CAC1E,CAEA,SAAgB,EAAU,EAAuB,CAG/C,MAFI,CAAC,OAAO,SAAS,CAAK,GAAK,GAAS,EAAU,KAC9C,EAAQ,IAAa,SAClB,IAAI,EAAM,QAAQ,CAAC,GAC5B,CAEA,SAAgB,EAAc,EAA2B,CAEvD,OADI,IAAO,MAAQ,CAAC,OAAO,SAAS,CAAE,EAAU,IACzC,EAAK,IAAO,GAAG,KAAK,MAAM,CAAE,EAAE,KAAO,IAAI,EAAK,IAAA,CAAM,QAAQ,CAAC,EAAE,GACxE,CAGA,SAAgB,EAAa,EAA2B,CACtD,IAAM,EAAI,EAAO,eAEjB,OADI,IAAM,EAAU,0BACb,GAAG,EAAE,WAAW,IAAM,EAAI,GAAK,IAAI,KAAK,EAAO,WAAW,OAAO,EAAO,aAAe,EAAI,GAAK,IAAI,KAAK,EAAc,EAAO,iBAAiB,EAAE,WAC1J,CAEA,IAAa,EAAoB,2GCtEpB,EAAiB,iBCCjB,EAAU,YACV,EAAc,IAEd,EAAW,EAAc,EAAS,EAAgB,MAAO,CAAiB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as e}from"./surface-data-NFl_uS--.js";var t=6e4,n=60*t,r=24*n,i=7*r;function a(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var o=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`);function s(e){return a(e)&&typeof e.id==`string`&&typeof e.index==`number`&&o(e.merging)&&o(e.proposing)&&a(e.criteria)&&(e.counts===`merges`||e.counts===`would-merge digests`)}function c(e){let t=e?e.ladder:null;return!a(t)||t.v!==1||!Array.isArray(t.stages)||!t.stages.every(s)?null:t}function l(e){return a(e)&&typeof e.proposalId==`string`&&typeof e.repo==`string`&&typeof e.outcome==`string`&&Array.isArray(e.gates)&&typeof e.why==`string`&&typeof e.at==`string`}function u(e){return!a(e)||e.v!==1||!Array.isArray(e.decisions)||!Array.isArray(e.moves)?null:{...e,decisions:e.decisions.filter(l),moves:e.moves.filter(e=>a(e)&&typeof e.toStageId==`string`&&typeof e.at==`string`)}}function d(e){return e===`elite-direct`?`Elite direct`:/^[a-z]/.test(e)?e[0].toUpperCase()+e.slice(1):e}function f(e){let t=e.indexOf(`/`);return t>=0?e.slice(t+1):e}function p(e){return e.map(f).join(`, `)}function m(e,i){let a=Date.parse(e);if(!Number.isFinite(a))return`at an unknown time`;let o=Math.max(0,i-a);return o<t?`just now`:o<n?`${Math.floor(o/t)} m ago`:o<r?`${Math.floor(o/n)} h ago`:`${Math.floor(o/r)} d ago`}function h(e){return Number.isInteger(e)?String(e):e.toFixed(1)}function g(e,t){let n=e.index<t?`done`:e.index===t?`current`:e.index===t+1?`next`:`later`,r=e.merging.length>0?`Merging: ${p(e.merging)}`:`Nothing merges — propose only`,i=e.proposing.length>0?`Proposing: ${p(e.proposing)}`:null,a=`${e.maxRisk} risk · ≤ ${e.maxFiles} files / ${e.maxLines} lines${e.maxMergesPerRepoPerDay>0?` · ≤ ${e.maxMergesPerRepoPerDay} merges/repo/day`:``}`,o=e.criteria,s=[`${o.minMerges} ${o.minMerges===1?e.counts.replace(/s$/,``):e.counts}`,`${o.minHours} h`];o.minPostMergeGreenPct>0&&s.push(`≥ ${o.minPostMergeGreenPct}% green`);let c=`Leaves after ${s.join(`, `)}`,l=d(e.id),u=n===`current`?` (current)`:n===`done`?` (passed)`:``;return{id:e.id,label:l,index:e.index,state:n,merging:e.merging,proposing:e.proposing,mergeLine:r,proposeLine:i,capLine:a,exitLine:c,aria:[`Stage ${e.index+1}, ${l}${u}`,r,i,a,c].filter(Boolean).join(`. `)+`.`}}var _=/^\d+ of \d+ (merges|would-merge digests)$|^\d+ h of \d+ h$/;function v(e){if(!e||e.grant.state!==`active`)return null;let t=c(e),n=e.rollout;if(!t||!n||t.stages.length===0)return null;let r=t.stages[n.stageIndex];if(!r||r.id!==n.stageId)return null;let i=n.criteria,a=[{key:`evidence`,label:r.counts===`merges`?`Merges`:`Would-merge digests`,value:n.merges,max:i.minMerges,text:`${n.merges} / ${i.minMerges}`,met:n.merges>=i.minMerges},{key:`hours`,label:`Hours in stage`,value:Math.min(n.hoursInStage,i.minHours),max:i.minHours,text:`${h(Math.floor(n.hoursInStage*10)/10)} h / ${i.minHours} h`,met:n.hoursInStage>=i.minHours}],o=t.stages[n.stageIndex+1]??null,s=o?o.merging.filter(e=>!r.merging.includes(e)):[],l=o?s.length>0?`${d(o.id)} lets ${p(s)} merge`:`${d(o.id)}: ${o.maxRisk} risk, ≤ ${o.maxFiles} files / ${o.maxLines} lines`:null;return{stageId:n.stageId,stageName:d(n.stageId),position:`${n.stageIndex+1} of ${n.stageCount}`,rungs:t.stages.map(e=>g(e,n.stageIndex)),bars:a,nextStageName:n.nextStageId?d(n.nextStageId):null,met:n.met,otherUnmet:n.unmet.filter(e=>!_.test(e)),nextLine:l}}function y(e,a){if(!e||e.grant.state!==`active`||!e.grant.expiresAt)return null;let o=Date.parse(e.grant.expiresAt);if(!Number.isFinite(o))return null;let s=o-a,c=Math.floor(s/r),l=Math.floor((s-c*r)/n);return{text:s<=0?`expired`:s>=3*r?`${c} d left`:s>=r?`${c} d ${l} h left`:s>=n?`${Math.floor(s/n)} h left`:`${Math.max(1,Math.floor(s/t))} m left`,tone:s<r?`danger`:s<6048e5?`warning`:`success`,warn:s<i,until:new Date(o).toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`})}}function b(e){if(e.move===`regressed`){let t=e.breach?`: ${e.breach.replace(/[.]$/,``)}`:``;return{text:`Dropped back to ${d(e.toStageId)}${e.fromStageId?` from ${d(e.fromStageId)}`:``}${t}.`,tone:`danger`,at:e.at}}return{text:`Advanced to ${d(e.toStageId)}${e.fromStageId?` from ${d(e.fromStageId)}`:``}.`,tone:`success`,at:e.at}}var x={"would-merge":`Would merge`,merged:`Merged`,refused:`Refused`,"owner-lane":`Owner lane`,waiting:`Waiting`,"in-progress":`In the gates`},S={"would-merge":`success`,merged:`success`,refused:`danger`,"owner-lane":`warning`,waiting:`neutral`,"in-progress":`neutral`};function C(e){let t=e.prNumber===null?f(e.repo):`${f(e.repo)} #${e.prNumber}`,n=S[e.outcome];switch(e.outcome){case`would-merge`:return{text:`Would merge ${t} — every gate passed.`,tone:n,at:e.at};case`merged`:return e.eliteModel?{text:`Landed directly · elite model ${e.eliteModel} · tests green — ${t}.`,tone:n,at:e.at}:{text:`Merged ${t}.`,tone:n,at:e.at};default:return{text:`${t}: ${e.why}`,tone:n,at:e.at}}}function w(e,t){let n=[];e?.lastMove&&n.push(b(e.lastMove)),t?.moves[0]&&n.push(b(t.moves[0])),t?.decisions[0]&&n.push(C(t.decisions[0]));let r=n.filter(e=>e.at!==null&&Number.isFinite(Date.parse(e.at)));return r.sort((e,t)=>Date.parse(t.at)-Date.parse(e.at)),r[0]?r[0]:t?{text:`Nothing has reached the merge gates yet under this grant.`,tone:`neutral`,at:null}:t===null?{text:`The latest decision could not be read.`,tone:`unknown`,at:null}:{text:`Reading the latest decision…`,tone:`unknown`,at:null}}function T(e,t=3){return(e?.moves??[]).filter(e=>e.move===`regressed`).slice(0,t)}function E(e){if(e.files===null&&e.linesAdded===null)return null;let t=[];return(e.linesAdded!==null||e.linesDeleted!==null)&&t.push(`+${e.linesAdded??0} −${e.linesDeleted??0}`),e.files!==null&&t.push(`${e.files} file${e.files===1?``:`s`}`),e.risk&&t.push(`${e.risk} risk`),t.join(` · `)}function D(e){return e.prNumber===null||!/^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/.test(e.repo)?null:`https://github.com/${e.repo}/pull/${e.prNumber}`}function O(e,t){let n=(t??[]).find(t=>t.intake?.proposalId===e.proposalId&&t.repo.toLowerCase()===e.repo.toLowerCase());return n?{id:n.id,title:n.title}:null}function k(e){return e===`pass`?`success`:e===`refuse`?`danger`:e===`owner-lane`?`warning`:`neutral`}var A=`/api/verse/authority/ledger?view=decisions&limit=40`,j=`verse-authority-decisions`,M=3e4,N=e(j,A,`Merge decisions`,u);export{m as a,y as c,c as d,D as f,d as g,E as h,x as i,v as l,f as m,N as n,O as o,T as p,S as r,k as s,M as t,w as u};
|
|
2
|
+
//# sourceMappingURL=ladder-queries-BIpJVqxu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ladder-queries-BIpJVqxu.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/ladder-model.ts","../../../../../../src/web-ui/routes/verse/command/ladder-queries.ts"],"sourcesContent":["/**\n * routes/verse/command/ladder-model.ts — the pure decisions behind the\n * active fleet's rollout: Command's Autonomy status and Fleet's Shadow\n * decisions (3.14).\n *\n * Sources (both additive on the existing authority routes,\n * core/verse/autonomy-ladder.ts):\n * GET /api/verse/authority `ladder` + `rollout`\n * GET /api/verse/authority/ledger?view=decisions ShadowDecisionsV1\n *\n * Every number here is the SERVER's (rollout.ts evaluates the criteria); the\n * page only draws them. A value the server did not send is unknown, never 0.\n * Framework-free; tested directly.\n */\nimport type { AuthorityStatusV1 } from '../../../../core/authority/types.js';\nimport type { CloudTaskV1 } from '../../../../core/cloud/types.js';\nimport type {\n AutonomyLadderMoveV1,\n AutonomyLadderStageV1,\n AutonomyLadderV1,\n ShadowDecisionOutcome,\n ShadowDecisionV1,\n ShadowDecisionsV1,\n} from '../../../../core/verse/autonomy-ladder.js';\nimport type { ChipTone } from './authority-model.js';\n\nconst MINUTE = 60_000;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\n\n/** Re-approve is offered once the grant has less than this left (the chip warns at 3 days; this card earlier). */\nexport const GRANT_WARN_MS = 7 * DAY;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst strings = (v: unknown): v is string[] => Array.isArray(v) && v.every((s) => typeof s === 'string');\n\nfunction isStage(v: unknown): v is AutonomyLadderStageV1 {\n return isRecord(v) && typeof v['id'] === 'string' && typeof v['index'] === 'number' && strings(v['merging']) && strings(v['proposing'])\n && isRecord(v['criteria']) && (v['counts'] === 'merges' || v['counts'] === 'would-merge digests');\n}\n\n/** The status's `ladder`, when this server sends one this client can read. */\nexport function narrowLadder(status: AuthorityStatusV1 | null): AutonomyLadderV1 | null {\n const raw = status ? (status as AuthorityStatusV1 & { ladder?: unknown }).ladder : null;\n if (!isRecord(raw) || raw['v'] !== 1 || !Array.isArray(raw['stages']) || !raw['stages'].every(isStage)) return null;\n return raw as unknown as AutonomyLadderV1;\n}\n\nfunction isDecision(v: unknown): v is ShadowDecisionV1 {\n return isRecord(v) && typeof v['proposalId'] === 'string' && typeof v['repo'] === 'string' && typeof v['outcome'] === 'string'\n && Array.isArray(v['gates']) && typeof v['why'] === 'string' && typeof v['at'] === 'string';\n}\n\n/** GET …/ledger?view=decisions, narrowed (a row this client cannot read is dropped, never guessed). */\nexport function narrowDecisions(raw: unknown): ShadowDecisionsV1 | null {\n if (!isRecord(raw) || raw['v'] !== 1 || !Array.isArray(raw['decisions']) || !Array.isArray(raw['moves'])) return null;\n return {\n ...(raw as unknown as ShadowDecisionsV1),\n decisions: raw['decisions'].filter(isDecision),\n moves: (raw['moves'] as unknown[]).filter((m): m is AutonomyLadderMoveV1 => isRecord(m) && typeof m['toStageId'] === 'string' && typeof m['at'] === 'string'),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Words\n// ---------------------------------------------------------------------------\n\n/** \"shadow\" → \"Shadow\"; \"2a\" stays \"2a\". */\nexport function stageLabel(id: string): string {\n // 3.15: the elite self-land rung reads as words, not an id.\n if (id === 'elite-direct') return 'Elite direct';\n return /^[a-z]/.test(id) ? id[0]!.toUpperCase() + id.slice(1) : id;\n}\n\n/** \"ashlrai/ashlrcode\" → \"ashlrcode\" (the owner is the same everywhere in a fleet). */\nexport function repoShort(repo: string): string {\n const i = repo.indexOf('/');\n return i >= 0 ? repo.slice(i + 1) : repo;\n}\n\nfunction list(repos: readonly string[]): string {\n return repos.map(repoShort).join(', ');\n}\n\n/** \"just now\", \"12 m ago\", \"3 h ago\", \"2 d ago\" — `now` injected so it tests without a clock. */\nexport function ago(iso: string, now: number): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return 'at an unknown time';\n const ms = Math.max(0, now - t);\n if (ms < MINUTE) return 'just now';\n if (ms < HOUR) return `${Math.floor(ms / MINUTE)} m ago`;\n if (ms < DAY) return `${Math.floor(ms / HOUR)} h ago`;\n return `${Math.floor(ms / DAY)} d ago`;\n}\n\n/** Hours as the rollout reports them (one decimal), without a trailing \".0\". */\nfunction hours(n: number): string {\n return Number.isInteger(n) ? String(n) : n.toFixed(1);\n}\n\n// ---------------------------------------------------------------------------\n// The ladder\n// ---------------------------------------------------------------------------\n\nexport type RungState = 'done' | 'current' | 'next' | 'later';\n\nexport interface RungView {\n id: string;\n label: string;\n index: number;\n state: RungState;\n merging: string[];\n proposing: string[];\n /** \"Merging: ashlrcode, fleet-canary\" / \"Nothing merges — propose only\". */\n mergeLine: string;\n /** \"Proposing: binshield\"; null when every repo at the stage merges. */\n proposeLine: string | null;\n /** \"low risk · ≤ 4 files / 150 lines · ≤ 6 merges/repo/day\". */\n capLine: string;\n /** \"Leaves after 5 would-merge digests and 12 h\". */\n exitLine: string;\n /** The accessible name: everything the hover card says, in one sentence. */\n aria: string;\n}\n\nexport interface ProgressBar {\n key: 'evidence' | 'hours';\n label: string;\n value: number;\n max: number;\n /** \"2 / 5\" or \"3.5 h / 12 h\". */\n text: string;\n met: boolean;\n}\n\nexport interface LadderView {\n stageId: string;\n /** \"Shadow\". */\n stageName: string;\n /** \"1 of 8\". */\n position: string;\n rungs: RungView[];\n /** The two criteria every stage has; the rest (green %, watches) are in `otherUnmet`. */\n bars: ProgressBar[];\n nextStageName: string | null;\n /** Every criterion met: the daemon advances on its next tick. */\n met: boolean;\n /** Unmet criteria other than the two bars (\"1 post-merge watch still running\"). */\n otherUnmet: string[];\n /** One line on what the NEXT stage changes (\"2a lets ashlrcode, fleet-canary merge\"). */\n nextLine: string | null;\n}\n\nfunction rung(stage: AutonomyLadderStageV1, current: number): RungView {\n const state: RungState = stage.index < current ? 'done' : stage.index === current ? 'current' : stage.index === current + 1 ? 'next' : 'later';\n const mergeLine = stage.merging.length > 0 ? `Merging: ${list(stage.merging)}` : 'Nothing merges — propose only';\n const proposeLine = stage.proposing.length > 0 ? `Proposing: ${list(stage.proposing)}` : null;\n const capLine = `${stage.maxRisk} risk · ≤ ${stage.maxFiles} files / ${stage.maxLines} lines${stage.maxMergesPerRepoPerDay > 0 ? ` · ≤ ${stage.maxMergesPerRepoPerDay} merges/repo/day` : ''}`;\n const c = stage.criteria;\n const exit = [`${c.minMerges} ${c.minMerges === 1 ? stage.counts.replace(/s$/, '') : stage.counts}`, `${c.minHours} h`];\n if (c.minPostMergeGreenPct > 0) exit.push(`≥ ${c.minPostMergeGreenPct}% green`);\n const exitLine = `Leaves after ${exit.join(', ')}`;\n const label = stageLabel(stage.id);\n const where = state === 'current' ? ' (current)' : state === 'done' ? ' (passed)' : '';\n return {\n id: stage.id,\n label,\n index: stage.index,\n state,\n merging: stage.merging,\n proposing: stage.proposing,\n mergeLine,\n proposeLine,\n capLine,\n exitLine,\n aria: [`Stage ${stage.index + 1}, ${label}${where}`, mergeLine, proposeLine, capLine, exitLine].filter(Boolean).join('. ') + '.',\n };\n}\n\n/** Criteria the bars already show (rollout.ts words them \"3 of 5 …\" and \"6 h of 12 h\"). */\nconst BAR_UNMET = /^\\d+ of \\d+ (merges|would-merge digests)$|^\\d+ h of \\d+ h$/;\n\n/**\n * The ladder as Command draws it; null unless a grant is ACTIVE and the\n * server sent both its ladder and its rollout position (anything else is the\n * off-state's job, never a half-drawn ladder).\n */\nexport function ladderView(status: AuthorityStatusV1 | null): LadderView | null {\n if (!status || status.grant.state !== 'active') return null;\n const ladder = narrowLadder(status);\n const rollout = status.rollout;\n if (!ladder || !rollout || ladder.stages.length === 0) return null;\n const current = ladder.stages[rollout.stageIndex];\n if (!current || current.id !== rollout.stageId) return null;\n const c = rollout.criteria;\n const bars: ProgressBar[] = [\n {\n key: 'evidence',\n label: current.counts === 'merges' ? 'Merges' : 'Would-merge digests',\n value: rollout.merges,\n max: c.minMerges,\n text: `${rollout.merges} / ${c.minMerges}`,\n met: rollout.merges >= c.minMerges,\n },\n {\n key: 'hours',\n label: 'Hours in stage',\n value: Math.min(rollout.hoursInStage, c.minHours),\n max: c.minHours,\n text: `${hours(Math.floor(rollout.hoursInStage * 10) / 10)} h / ${c.minHours} h`,\n met: rollout.hoursInStage >= c.minHours,\n },\n ];\n const next = ladder.stages[rollout.stageIndex + 1] ?? null;\n const newlyMerging = next ? next.merging.filter((r) => !current.merging.includes(r)) : [];\n const nextLine = next\n ? newlyMerging.length > 0\n ? `${stageLabel(next.id)} lets ${list(newlyMerging)} merge`\n : `${stageLabel(next.id)}: ${next.maxRisk} risk, ≤ ${next.maxFiles} files / ${next.maxLines} lines`\n : null;\n return {\n stageId: rollout.stageId,\n stageName: stageLabel(rollout.stageId),\n position: `${rollout.stageIndex + 1} of ${rollout.stageCount}`,\n rungs: ladder.stages.map((s) => rung(s, rollout.stageIndex)),\n bars,\n nextStageName: rollout.nextStageId ? stageLabel(rollout.nextStageId) : null,\n met: rollout.met,\n otherUnmet: rollout.unmet.filter((u) => !BAR_UNMET.test(u)),\n nextLine,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Grant expiry\n// ---------------------------------------------------------------------------\n\nexport interface GrantExpiry {\n /** \"23 d left\" / \"4 d 6 h left\" / \"5 h left\". */\n text: string;\n tone: ChipTone;\n /** Under GRANT_WARN_MS: the card offers Re-approve. */\n warn: boolean;\n /** Absolute time, for the tooltip. */\n until: string;\n}\n\nexport function grantExpiry(status: AuthorityStatusV1 | null, now: number): GrantExpiry | null {\n if (!status || status.grant.state !== 'active' || !status.grant.expiresAt) return null;\n const at = Date.parse(status.grant.expiresAt);\n if (!Number.isFinite(at)) return null;\n const left = at - now;\n const d = Math.floor(left / DAY);\n const h = Math.floor((left - d * DAY) / HOUR);\n const text = left <= 0\n ? 'expired'\n : left >= 3 * DAY\n ? `${d} d left`\n : left >= DAY\n ? `${d} d ${h} h left`\n : left >= HOUR\n ? `${Math.floor(left / HOUR)} h left`\n : `${Math.max(1, Math.floor(left / MINUTE))} m left`;\n const tone: ChipTone = left < DAY ? 'danger' : left < GRANT_WARN_MS ? 'warning' : 'success';\n return {\n text,\n tone,\n warn: left < GRANT_WARN_MS,\n until: new Date(at).toLocaleString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' }),\n };\n}\n\n// ---------------------------------------------------------------------------\n// What happened last\n// ---------------------------------------------------------------------------\n\nexport interface LastEvent {\n text: string;\n tone: ChipTone;\n at: string | null;\n}\n\nfunction moveText(m: AutonomyLadderMoveV1): LastEvent {\n if (m.move === 'regressed') {\n const why = m.breach ? `: ${m.breach.replace(/[.]$/, '')}` : '';\n return { text: `Dropped back to ${stageLabel(m.toStageId)}${m.fromStageId ? ` from ${stageLabel(m.fromStageId)}` : ''}${why}.`, tone: 'danger', at: m.at };\n }\n return { text: `Advanced to ${stageLabel(m.toStageId)}${m.fromStageId ? ` from ${stageLabel(m.fromStageId)}` : ''}.`, tone: 'success', at: m.at };\n}\n\nexport const OUTCOME_WORD: Readonly<Record<ShadowDecisionOutcome, string>> = {\n 'would-merge': 'Would merge',\n merged: 'Merged',\n refused: 'Refused',\n 'owner-lane': 'Owner lane',\n waiting: 'Waiting',\n 'in-progress': 'In the gates',\n};\n\nexport const OUTCOME_TONE: Readonly<Record<ShadowDecisionOutcome, ChipTone>> = {\n 'would-merge': 'success',\n merged: 'success',\n refused: 'danger',\n 'owner-lane': 'warning',\n waiting: 'neutral',\n 'in-progress': 'neutral',\n};\n\nfunction decisionText(d: ShadowDecisionV1): LastEvent {\n const what = d.prNumber !== null ? `${repoShort(d.repo)} #${d.prNumber}` : repoShort(d.repo);\n const tone = OUTCOME_TONE[d.outcome];\n switch (d.outcome) {\n case 'would-merge':\n return { text: `Would merge ${what} — every gate passed.`, tone, at: d.at };\n case 'merged':\n // 3.15 elite self-land: tests, not a judge, carried it.\n return d.eliteModel\n ? { text: `Landed directly · elite model ${d.eliteModel} · tests green — ${what}.`, tone, at: d.at }\n : { text: `Merged ${what}.`, tone, at: d.at };\n default:\n return { text: `${what}: ${d.why}`, tone, at: d.at };\n }\n}\n\n/**\n * The one line \"what happened last\": the newest of the ladder's last move\n * (from the status — always there when a move happened) and the decisions\n * view's newest decision / move. `decisions`: undefined while the first read\n * is in flight, null when it answered without a readable view.\n */\nexport function lastEvent(ladder: AutonomyLadderV1 | null, decisions: ShadowDecisionsV1 | null | undefined): LastEvent {\n const candidates: LastEvent[] = [];\n if (ladder?.lastMove) candidates.push(moveText(ladder.lastMove));\n if (decisions?.moves[0]) candidates.push(moveText(decisions.moves[0]));\n if (decisions?.decisions[0]) candidates.push(decisionText(decisions.decisions[0]));\n const dated = candidates.filter((c) => c.at !== null && Number.isFinite(Date.parse(c.at)));\n dated.sort((a, b) => Date.parse(b.at!) - Date.parse(a.at!));\n if (dated[0]) return dated[0];\n if (decisions) return { text: 'Nothing has reached the merge gates yet under this grant.', tone: 'neutral', at: null };\n if (decisions === null) return { text: 'The latest decision could not be read.', tone: 'unknown', at: null };\n return { text: 'Reading the latest decision…', tone: 'unknown', at: null };\n}\n\n// ---------------------------------------------------------------------------\n// Fleet: the decisions list\n// ---------------------------------------------------------------------------\n\n/** Regressions shown prominently above the list: the newest few, newest first. */\nexport function recentRegressions(decisions: ShadowDecisionsV1 | null, limit = 3): AutonomyLadderMoveV1[] {\n return (decisions?.moves ?? []).filter((m) => m.move === 'regressed').slice(0, limit);\n}\n\n/** \"+30 −4 · 2 files · low\" for a would-merge digest; null without one. */\nexport function sizeLine(d: ShadowDecisionV1): string | null {\n if (d.files === null && d.linesAdded === null) return null;\n const parts: string[] = [];\n if (d.linesAdded !== null || d.linesDeleted !== null) parts.push(`+${d.linesAdded ?? 0} −${d.linesDeleted ?? 0}`);\n if (d.files !== null) parts.push(`${d.files} file${d.files === 1 ? '' : 's'}`);\n if (d.risk) parts.push(`${d.risk} risk`);\n return parts.join(' · ');\n}\n\n/** GitHub URL of the fleet PR, when the repo is an owner/name slug and a PR exists. */\nexport function prUrl(d: Pick<ShadowDecisionV1, 'repo' | 'prNumber'>): string | null {\n if (d.prNumber === null || !/^[A-Za-z0-9-]+\\/[A-Za-z0-9._-]+$/.test(d.repo)) return null;\n return `https://github.com/${d.repo}/pull/${d.prNumber}`;\n}\n\n/**\n * The cloud task whose intake filed this proposal (3.13 cloud intake), so the\n * row can open that task's evidence timeline. Null when no task names it —\n * a proposal the fleet produced itself has no cloud timeline.\n */\nexport function cloudTaskFor(\n d: Pick<ShadowDecisionV1, 'proposalId' | 'repo'>,\n tasks: readonly Pick<CloudTaskV1, 'id' | 'title' | 'repo' | 'intake'>[] | null | undefined,\n): { id: string; title: string } | null {\n const hit = (tasks ?? []).find((t) => t.intake?.proposalId === d.proposalId && t.repo.toLowerCase() === d.repo.toLowerCase());\n return hit ? { id: hit.id, title: hit.title } : null;\n}\n\n/** Tone of a gate verdict chip. */\nexport function gateTone(verdict: string): ChipTone {\n if (verdict === 'pass') return 'success';\n if (verdict === 'refuse') return 'danger';\n if (verdict === 'owner-lane') return 'warning';\n return 'neutral';\n}\n","/**\n * routes/verse/command/ladder-queries.ts — the shadow-decisions read (3.14).\n *\n * GET /api/verse/authority/ledger?view=decisions&limit=40 ShadowDecisionsV1\n *\n * Optional like every surface read (surface-data.ts): a server without the\n * view answers 400/404, which is \"no decisions in this build\", one card's\n * designed state. The server caches the fold by ledger head, so Command's and\n * Fleet's polls (one shared cache key) cost a read only when the fleet wrote.\n *\n * LAZY ONLY: imported by AutonomyStatus and ShadowDecisions, both behind\n * React.lazy — never on the chat first-paint path.\n */\nimport { optionalQuery } from './surface-data.js';\nimport { narrowDecisions } from './ladder-model.js';\n\nexport const AUTHORITY_DECISIONS_PATH = '/api/verse/authority/ledger?view=decisions&limit=40';\n\nexport const DECISIONS_KEY = 'verse-authority-decisions';\n\n/** Decisions change once per fleet tick at most; half a minute keeps both surfaces current. */\nexport const DECISIONS_POLL_MS = 30_000;\n\nexport const decisionsQuery = optionalQuery(DECISIONS_KEY, AUTHORITY_DECISIONS_PATH, 'Merge decisions', narrowDecisions);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-hePW80VL.js";import{I as t}from"./VerseConsoleApp-DO84Xscn.js";var n=e({REQUEST_TTL_MS:()=>r,getLeaderFocus:()=>l,isLeaderFocusLive:()=>u,requestLeaderFocus:()=>c,subscribeLeaderFocus:()=>f,takeLeaderFocus:()=>d}),r=2e4,i=null,a=0,o=new Set;function s(){for(let e of[...o])e()}function c(e){a+=1,i={...e,seq:a,at:Date.now()},t(`mind`),s()}function l(){return i}function u(e,t=Date.now()){return t-e.at<=r}function d(e){i?.seq===e&&(i=null,s())}function f(e){return o.add(e),()=>o.delete(e)}export{f as a,c as i,u as n,d as o,n as r,l as t};
|
|
2
|
+
//# sourceMappingURL=leader-focus-Dh4gXTSi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leader-focus-Dh4gXTSi.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/leader/leader-focus.ts"],"sourcesContent":["/**\n * routes/verse/leader/leader-focus.ts — \"take me to the Leader, ready to\n * type\": the one hand-off from anywhere (⌘K, Command's Leader card, a\n * Needs-you question) to Mind's conversation panel.\n *\n * requestLeaderFocus({ kind: 'composer' }) Mind, composer focused\n * requestLeaderFocus({ kind: 'directive' }) Mind, \"+ Add directive\" open\n * requestLeaderFocus({ kind: 'question', … }) Mind, that question's answer box open\n *\n * WHY A STORE, NOT A PARKED COMMAND: Mind and its panel are two lazy chunks;\n * a parked bus command expires in 4 s, a request here waits (up to\n * REQUEST_TTL_MS) until the panel mounts and takes it. Taking it clears it,\n * so a later visit to Mind never re-focuses on a stale ask.\n *\n * Framework-free, tiny: the palette handler, the drawer and Command import it.\n */\nimport { setVerseSection } from '../verse-ui-store.js';\n\nexport type LeaderFocusTarget =\n | { kind: 'composer' }\n | { kind: 'directive' }\n | {\n kind: 'question';\n /** The thread's questionId, `<memoId>:<index>`. */\n questionId: string | null;\n /** The question's words (a fallback when the thread has no question message for it). */\n text: string | null;\n };\n\nexport type LeaderFocusRequest = LeaderFocusTarget & { seq: number; at: number };\n\nexport const REQUEST_TTL_MS = 20_000;\n\nlet current: LeaderFocusRequest | null = null;\nlet seq = 0;\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\n/** Go to Mind and ask its Leader panel to focus `target`. */\nexport function requestLeaderFocus(target: LeaderFocusTarget): void {\n seq += 1;\n current = { ...target, seq, at: Date.now() };\n setVerseSection('mind');\n emit();\n}\n\n/**\n * The request as stored (useSyncExternalStore's snapshot: it changes only\n * when the store emits). Whether it is still live is `isLeaderFocusLive`.\n */\nexport function getLeaderFocus(): LeaderFocusRequest | null {\n return current;\n}\n\nexport function isLeaderFocusLive(request: LeaderFocusRequest, now: number = Date.now()): boolean {\n return now - request.at <= REQUEST_TTL_MS;\n}\n\n/** Clear the request `seq` (and only that one — a newer ask survives). */\nexport function takeLeaderFocus(requestSeq: number): void {\n if (current?.seq !== requestSeq) return;\n current = null;\n emit();\n}\n\nexport function subscribeLeaderFocus(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Test hygiene. */\nexport function resetLeaderFocus(): void {\n current = null;\n emit();\n}\n"],"mappings":"4PA+Ba,EAAiB,IAE1B,EAAqC,KACrC,EAAM,EACJ,EAAY,IAAI,IAEtB,SAAS,GAAa,CACpB,IAAK,IAAM,IAAK,CAAC,GAAG,CAAS,EAAG,EAAE,CACpC,CAGA,SAAgB,EAAmB,EAAiC,CAClE,GAAO,EACP,EAAU,CAAE,GAAG,EAAQ,MAAK,GAAI,KAAK,IAAI,CAAE,EAC3C,EAAgB,MAAM,EACtB,EAAK,CACP,CAMA,SAAgB,GAA4C,CAC1D,OAAO,CACT,CAEA,SAAgB,EAAkB,EAA6B,EAAc,KAAK,IAAI,EAAY,CAChG,OAAO,EAAM,EAAQ,IAAM,CAC7B,CAGA,SAAgB,EAAgB,EAA0B,CACpD,GAAS,MAAQ,IACrB,EAAU,KACV,EAAK,EACP,CAEA,SAAgB,EAAqB,EAAkC,CAErE,OADA,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-_izD07R9.js";import{C as r,M as i,a,l as o}from"./global-CYfRwH6t.js";import{o as s,v as c}from"./colors-DvK0wMHH.js";import{f as l,h as u}from"./VerseConsoleApp-DO84Xscn.js";import{t as d}from"./Segmented-BECZDbsg.js";import{i as f}from"./budget-queries-t-Bdoly3.js";import{o as p}from"./budget-model-Bwv4MZSa.js";import{t as m}from"./Button-CMR_Op-0.js";import{C as h,_ as g,i as _,p as v}from"./icons-BBm_Cy62.js";import{a as y}from"./command-catalog-COH2G2xv.js";import{t as b}from"./Sheet-Czuz3h6A.js";import{n as x}from"./control-queries-C5uQTzJi.js";import{t as S}from"./BudgetControl-A4TEONtT.js";import{a as C,c as w,i as T,n as E,r as D,s as O,t as k}from"./authority-model-DVMxkDV4.js";import{d as A,i as j,r as M,t as N}from"./surface-data-NFl_uS--.js";import{i as P,n as F}from"./Surface-BEToBKC3.js";import{r as I}from"./actions-BPyW8QC-.js";import{a as ee,o as te}from"./why-seat-model-Bn6O26JJ.js";var L=e(n(),1),R=t();async function ne(e,t,n){let o=r();if(!o)throw new x;let s=await a(N,{kind:e,scope:t,...n===void 0?{}:{eliteDirect:n}},o);return i(),s}var re={"claude-cli":`Claude Code (claude-cli)`,codex:`Codex`,"grok-cli":`Grok (grok-cli)`,devin:`Devin`,"devin-cli":`Devin CLI`,local:`Local models`},ie={reserve:`Reserve`,balanced:`Balanced`,"all-in":`All-in`};function z(e,t,n){return n?e.includes(t)?[...e]:[...e,t]:e.filter(e=>e!==t)}function ae(e){let t=Math.round((Date.parse(e.payload.expiresAt)-Date.parse(e.payload.issuedAt))/864e5);return Number.isFinite(t)&&t>0?t:30}function oe({draft:e,busy:t,onPreview:n,onReset:r,edited:i}){let a=e.editable,o=e.payload,[s,c]=(0,L.useState)(()=>o.repos.map(e=>e.nameWithOwner)),[l,u]=(0,L.useState)(()=>[...o.engines]),[d,f]=(0,L.useState)(()=>[...o.leader.classes]),[p,h]=(0,L.useState)(o.spend.maxMode),[g,_]=(0,L.useState)(String(o.spend.meteredUsdPerDay)),[v,y]=(0,L.useState)(String(ae(e))),b={metered:(0,L.useId)(),days:(0,L.useId)(),mode:(0,L.useId)()};if(!a)return(0,R.jsx)(`p`,{className:I.scopeMeta,children:`This server cannot edit a draft yet — update Ashlr to choose repos and engines here.`});let x=Number(g),S=Number(v),C=s.length>0&&l.length>0&&Number.isInteger(x)&&x>=0&&Number.isInteger(S)&&S>=1&&S<=a.maxDays;function w(){n({repos:s,engines:l,leaderClasses:d,maxMode:p,meteredUsdPerDay:x,days:S})}return(0,R.jsxs)(`div`,{className:I.scopeEditor,"aria-label":`Edit the grant scope`,children:[(0,R.jsxs)(`fieldset`,{className:I.scopeFieldset,children:[(0,R.jsx)(`legend`,{children:(0,R.jsxs)(P,{children:[`Repositories (`,s.length,`/`,a.repos.length,`)`]})}),a.repos.map(e=>(0,R.jsxs)(`label`,{className:I.scopeCheck,children:[(0,R.jsx)(`input`,{type:`checkbox`,checked:s.includes(e),onChange:t=>c(z(s,e,t.target.checked))}),(0,R.jsx)(`span`,{className:I.mono,children:e})]},e)),(0,R.jsx)(`p`,{className:I.scopeMeta,children:`Only enrolled repos can be granted. Enroll another checkout to add it here.`})]}),(0,R.jsxs)(`fieldset`,{className:I.scopeFieldset,children:[(0,R.jsx)(`legend`,{children:(0,R.jsx)(P,{children:`Engines`})}),a.engines.map(e=>(0,R.jsxs)(`label`,{className:I.scopeCheck,children:[(0,R.jsx)(`input`,{type:`checkbox`,checked:l.includes(e),onChange:t=>u(z(l,e,t.target.checked))}),(0,R.jsx)(`span`,{children:re[e]??e})]},e))]}),(0,R.jsxs)(`fieldset`,{className:I.scopeFieldset,children:[(0,R.jsx)(`legend`,{children:(0,R.jsx)(P,{children:`Leader may act`})}),a.leaderClasses.map(e=>(0,R.jsxs)(`label`,{className:I.scopeCheck,children:[(0,R.jsx)(`input`,{type:`checkbox`,checked:d.includes(e),onChange:t=>f(z(d,e,t.target.checked))}),(0,R.jsxs)(`span`,{children:[`Class `,e,e===`A`?` — reversible housekeeping`:` — larger changes, with a veto window`]})]},e))]}),(0,R.jsxs)(`fieldset`,{className:I.scopeFieldset,children:[(0,R.jsx)(`legend`,{children:(0,R.jsx)(P,{children:`Budget caps`})}),(0,R.jsxs)(`label`,{className:I.scopeField,htmlFor:b.mode,children:[(0,R.jsx)(`span`,{children:`Budget mode up to`}),(0,R.jsx)(`select`,{id:b.mode,value:p,onChange:e=>h(e.target.value),children:[`reserve`,`balanced`,`all-in`].map(e=>(0,R.jsx)(`option`,{value:e,children:ie[e]},e))})]}),(0,R.jsxs)(`label`,{className:I.scopeField,htmlFor:b.metered,children:[(0,R.jsx)(`span`,{children:`Metered APIs, $ per day`}),(0,R.jsx)(`input`,{id:b.metered,type:`number`,min:0,step:1,inputMode:`numeric`,value:g,onChange:e=>_(e.target.value)})]}),(0,R.jsxs)(`label`,{className:I.scopeField,htmlFor:b.days,children:[(0,R.jsxs)(`span`,{children:[`Valid for (days, at most `,a.maxDays,`)`]}),(0,R.jsx)(`input`,{id:b.days,type:`number`,min:1,max:a.maxDays,step:1,inputMode:`numeric`,value:v,onChange:e=>y(e.target.value)})]})]}),(0,R.jsxs)(`span`,{className:I.sheetButtons,children:[i?(0,R.jsx)(m,{variant:`ghost`,size:`sm`,onClick:r,children:`Back to the default draft`}):null,(0,R.jsx)(m,{variant:`subtle`,size:`sm`,onClick:w,disabled:!C,busy:t,children:`Preview the changes`})]}),C?null:(0,R.jsxs)(`p`,{className:I.scopeMeta,children:[`Keep at least one repo and one engine, whole dollars, and 1–`,a.maxDays,` days.`]})]})}var se={wider:`wider`,narrower:`narrower`,changed:`changed`};function ce({lines:e}){return e?e.length===0?(0,R.jsxs)(`section`,{className:I.scopeBlock,"aria-label":`Changes`,children:[(0,R.jsx)(P,{children:`Changes vs the grant in force`}),(0,R.jsx)(`p`,{className:I.scopeMeta,children:`Same scope as the grant in force.`})]}):(0,R.jsxs)(`section`,{className:I.scopeBlock,"aria-label":`Changes`,children:[(0,R.jsx)(P,{children:`Changes vs the grant in force`}),(0,R.jsxs)(`table`,{className:I.scopeTable,children:[(0,R.jsx)(`thead`,{children:(0,R.jsxs)(`tr`,{children:[(0,R.jsx)(`th`,{scope:`col`,children:`What`}),(0,R.jsx)(`th`,{scope:`col`,children:`Now`}),(0,R.jsx)(`th`,{scope:`col`,children:`After signing`}),(0,R.jsx)(`th`,{scope:`col`,children:`Authority`})]})}),(0,R.jsx)(`tbody`,{children:e.map((e,t)=>(0,R.jsxs)(`tr`,{"data-direction":e.direction,children:[(0,R.jsx)(`td`,{children:e.label}),(0,R.jsx)(`td`,{className:I.mono,children:e.before}),(0,R.jsx)(`td`,{className:I.mono,children:e.after}),(0,R.jsx)(`td`,{className:I.diffDirection,"data-direction":e.direction,children:se[e.direction]})]},`${e.field}-${t}`))})]})]}):null}var le=864e5;function ue(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}):`—`}function de(e){let t=Date.parse(e.issuedAt),n=Date.parse(e.expiresAt);return Number.isFinite(t)&&Number.isFinite(n)?Math.round((n-t)/le):null}var B=`elite-direct`,V=`Elite models (Opus 5.5/5, Fable 5.1/5, Sonnet 5, GPT-6 Astra/Sol/Luna, Grok 4.7/4.6, SWE-2, Qwen 3.8 27B) land directly on green tests — no judge. Other models still need an independent judge; changes to authority code still come to you.`;function fe(e){let t=e.criteria;if(e.id===B)return`${e.repos.filter(e=>e.stage===`merge`).length} of ${e.repos.length} repos merge · ${e.maxRisk} risk · ≤ ${e.maxFiles} files / ${e.maxLines} lines — one rung, no ramp; elite models land on green tests, no judge`;let n=[`${e.repos.length} repo${e.repos.length===1?``:`s`}`,`${e.maxRisk} risk`,`≤ ${e.maxFiles} files / ${e.maxLines} lines`,`≤ ${e.maxMergesPerRepoPerDay} merges/repo/day`],r=[`${t.minMerges} merges`,`${t.minHours} h`,t.minPostMergeGreenPct?`≥ ${t.minPostMergeGreenPct}% green`:null,`≤ ${t.maxRevertRatePct}% reverts`].filter(Boolean);return`${n.join(` · `)} — advances after ${r.join(`, `)}`}function pe({draft:e}){let t=e.payload,n=de(t);return(0,R.jsxs)(`div`,{className:I.scope,children:[(0,R.jsxs)(`section`,{className:I.scopeBlock,"aria-label":`Expiry`,children:[(0,R.jsx)(P,{children:`Expiry`}),(0,R.jsxs)(`p`,{className:I.scopeLead,children:[n===null?`—`:`${n} days`,`, until `,ue(t.expiresAt)]}),(0,R.jsxs)(`p`,{className:I.scopeMeta,children:[`Signed by key `,(0,R.jsx)(`span`,{className:I.mono,children:t.keyId}),` · sequence `,t.grantSeq,` · bound to this Mac`]})]}),(0,R.jsxs)(`section`,{className:I.scopeBlock,"aria-label":`Repositories`,children:[(0,R.jsxs)(P,{children:[`Repositories (`,t.repos.length,`)`]}),(0,R.jsxs)(`table`,{className:I.scopeTable,children:[(0,R.jsx)(`thead`,{children:(0,R.jsxs)(`tr`,{children:[(0,R.jsx)(`th`,{scope:`col`,children:`Repo`}),(0,R.jsx)(`th`,{scope:`col`,children:`Up to`}),(0,R.jsx)(`th`,{scope:`col`,children:`Checks`}),(0,R.jsx)(`th`,{scope:`col`,children:`Risk`}),(0,R.jsx)(`th`,{scope:`col`,className:I.num,children:`Merges/day`})]})}),(0,R.jsx)(`tbody`,{children:t.repos.map(e=>(0,R.jsxs)(`tr`,{children:[(0,R.jsx)(`td`,{className:I.mono,children:e.nameWithOwner}),(0,R.jsx)(`td`,{children:e.stage===`merge`?`Merge`:`Propose`}),(0,R.jsx)(`td`,{children:e.enforcement===`server`?`GitHub`:`Local only`}),(0,R.jsx)(`td`,{children:e.maxRisk}),(0,R.jsx)(`td`,{className:I.num,children:e.maxMergesPerDay})]},e.nameWithOwner))})]}),(0,R.jsxs)(`p`,{className:I.scopeMeta,children:[`Every merge ≤ `,t.merge.maxFiles,` files / `,t.merge.maxLines,` lines · ashlr-hub itself: `,t.merge.selfRepo===`propose-only`?`propose only`:`merge outside authority code`]})]}),(0,R.jsxs)(`section`,{className:I.scopeBlock,"aria-label":`Spend`,children:[(0,R.jsx)(P,{children:`Spend`}),(0,R.jsxs)(`p`,{className:I.scopeLead,children:[`Up to `,t.spend.maxMode===`all-in`?`All-in`:t.spend.maxMode===`balanced`?`Balanced`:`Reserve`,` · metered APIs $`,t.spend.meteredUsdPerDay,`/day`]}),(0,R.jsx)(`ul`,{className:I.scopeList,children:Object.entries(t.spend.seats).map(([e,t])=>(0,R.jsxs)(`li`,{children:[(0,R.jsx)(`span`,{className:I.mono,children:e}),t.enabled?`: keeps ${t.reserveFloorPercent}% for you`:`: not used by autonomy`,t.enabled&&t.maxSessionWindowPercent!==void 0?`, never above ${t.maxSessionWindowPercent}% of its 5-hour window`:``,t.enabled?` · ${t.roles.join(`, `)}`:``]},e))})]}),(0,R.jsxs)(`section`,{className:I.scopeBlock,"aria-label":`Engines and Leader`,children:[(0,R.jsx)(P,{children:`Engines and Leader`}),(0,R.jsx)(`p`,{className:I.scopeLead,children:t.engines.join(`, `)||`none`}),(0,R.jsxs)(`p`,{className:I.scopeMeta,children:[`Leader classes `,t.leader.classes.length?t.leader.classes.join(` + `):`none (proposes only)`,` · class-B veto window `,t.leader.vetoMinutes,` min · goal conductor `,t.conductorGoals?`on`:`off`]})]}),(0,R.jsxs)(`section`,{className:I.scopeBlock,"aria-label":`Rollout ladder`,children:[t.rollout.stages.some(e=>e.id===B)?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(P,{children:`Elite direct`}),(0,R.jsx)(`p`,{className:I.scopeLead,children:V})]}):(0,R.jsxs)(P,{children:[`Rollout ladder (`,t.rollout.stages.length,` stages, advances by itself)`]}),(0,R.jsx)(`ol`,{className:I.ladder,children:t.rollout.stages.map(e=>(0,R.jsxs)(`li`,{children:[(0,R.jsx)(`span`,{className:I.ladderId,children:e.id}),(0,R.jsx)(`span`,{children:fe(e)})]},e.id))}),(0,R.jsx)(`p`,{className:I.scopeMeta,children:t.rollout.stages.length===1&&t.rollout.stages[0]?.id===B?`A sandbox violation, reserve breach, or reverts above 10% restart this rung’s evidence window. Elite direct remains the signed merge ceiling until you stop, revoke, or replace the grant.`:`Any sandbox violation or reserve breach drops it back one stage. It can never climb past the last stage.`})]}),(0,R.jsxs)(`p`,{className:I.scopeMeta,children:[`Draft digest `,(0,R.jsxs)(`span`,{className:I.mono,children:[e.digest.slice(0,16),`…`]})]})]})}function me({open:e,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o,act:s,startEditing:c}){let l=(0,L.useId)();return e?(0,R.jsx)(he,{titleId:l,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o,...s?{act:s}:{},startEditing:c===!0}):null}function he({titleId:e,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:s,act:c,startEditing:l}){let[u,d]=(0,L.useState)(!1),f=(0,L.useId)(),p=o(u?j:M,{freshMs:0}),h=p.data?.value??null,[g,_]=(0,L.useState)(null),[y,x]=(0,L.useState)(l===!0),[S,C]=(0,L.useState)(null),[w,T]=(0,L.useState)(!1),E=g&&g.eliteDirect===h?.eliteDirect?g:h,D=p.data?.reason??null,O=c!==void 0&&h?.editable!==void 0,A=h?.kind===`reapprove`&&h.eliteDirect===!0;function N(e){if(!c||!h)return;let t=h.kind??`auto`;C(null),T(!0),c(async()=>{try{return await ne(t,e,h.eliteDirect===!0)}catch(e){return C(e instanceof Error?e.message:String(e)),null}finally{T(!1)}},`Preview the edited grant`,{onDone:e=>{e&&typeof e==`object`&&typeof e.digest==`string`&&e.eliteDirect===h.eliteDirect&&_(e)}})}return(0,R.jsxs)(b,{open:!0,onClose:s,titleId:e,width:600,title:t===`re-approve`?`Re-approve the standing grant`:`Approve a standing grant`,description:i,footer:(0,R.jsxs)(`div`,{className:I.sheetFooter,children:[(0,R.jsxs)(`p`,{className:I.sheetFootnote,children:[`Touch ID appears on this Mac. Lowering authority — Off, Stop, Revoke — never needs it.`,n?` After approval the switch moves to ${k[n]}.`:``]}),(0,R.jsxs)(`span`,{className:I.sheetButtons,children:[(0,R.jsx)(m,{variant:`ghost`,onClick:s,children:`Cancel`}),(0,R.jsx)(m,{variant:`primary`,icon:(0,R.jsx)(v,{}),disabled:!E,busy:r,onClick:()=>E&&a(E),children:`Approve with Touch ID`})]})]}),children:[(0,R.jsxs)(`label`,{className:I.eliteToggle,children:[(0,R.jsx)(`input`,{type:`checkbox`,checked:u||A,disabled:w||r||A,onChange:e=>{d(e.target.checked),_(null),C(null)},"aria-describedby":f}),`Elite direct`]}),(0,R.jsx)(`p`,{id:f,className:I.scopeMeta,children:V}),p.status===`loading`&&!p.data?(0,R.jsx)(`p`,{className:I.muted,"aria-busy":`true`,children:`Preparing the grant draft…`}):E?(0,R.jsxs)(R.Fragment,{children:[O?(0,R.jsxs)(`div`,{className:I.scopeEditToggle,children:[(0,R.jsx)(m,{variant:`ghost`,size:`sm`,"aria-expanded":y,onClick:()=>x(e=>!e),children:y?`Hide the scope editor`:`Edit scope`}),g?(0,R.jsx)(`span`,{className:I.scopeMeta,children:`Showing your edited draft.`}):null]}):null,O&&y&&h?(0,R.jsx)(oe,{draft:h,busy:w,edited:g!==null,onPreview:N,onReset:()=>{_(null),C(null)}}):null,S?(0,R.jsx)(F,{tone:`danger`,children:S}):null,(0,R.jsx)(ce,{lines:E.diff}),(0,R.jsx)(pe,{draft:E})]}):(0,R.jsx)(F,{tone:`unknown`,children:D??`Grant draft unreadable — nothing to approve.`})]})}var H={"all-in":`All-in`,balanced:`Balanced`,reserve:`Reserve`};function U(){let e=y(`fleet.stop`)?.guard?.confirm;return{title:e?.title??`Stop the fleet?`,body:e?.body??`Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.`,confirmLabel:e?.confirmLabel??`Stop fleet`,destructive:!0}}var ge={title:`Resume the fleet?`,body:`Autonomy picks up at the switch position on its next tick. Stopping again is one click.`,confirmLabel:`Resume fleet`,destructive:!1};function W({tone:e}){return(0,R.jsx)(`span`,{className:I.dot,"data-tone":e,"aria-hidden":`true`})}function G(e){let[t,n]=(0,L.useState)(null);function r(r){if(!t)return;let{then:i}=t,a=D(r,t.intent);e.act(()=>A({action:a,draftDigest:r.digest}),a===`re-approve`?`Re-approve the standing grant`:`Sign a new standing grant`,{onDone:t=>{n(null),i&&t&&E[i]<=E[t.maxSwitchWithoutGrant]&&i!==t.switch&&e.act(()=>A({action:`switch`,to:i}),`Switch autonomy to ${k[i]}`)}})}return{open:(e,t,r=null,i={})=>n({intent:e,then:r,why:t,edit:i.edit===!0}),sheet:(0,R.jsx)(me,{open:t!==null,intent:t?.intent??`grant`,then:t?.then??null,why:t?.why??``,busy:e.busy,onApprove:r,onClose:()=>n(null),act:e.act,startEditing:t?.edit===!0})}}function _e({read:e,loading:t,budgetMode:n,actions:r,compact:i,now:a,grantFlow:o}){let s=e?.value??null,c=G(r),l=o??c,[u,f]=(0,L.useState)(null),[p,_]=(0,L.useState)(!1),y=!s,b=C(s,a);function x(e){if(!s)return;let t=T(s,e);if(t!==`same`){if(t===`raise-needs-grant`){let t=s.grant.state===`paused`;l.open(t?`re-approve`:`grant`,t?`${s.grant.reason??`The grant is paused.`} ${k[e]} needs it re-approved.`:`${k[e]} is beyond what the installed grant allows, so it needs a new grant.`,e);return}r.act(()=>A({action:`switch`,to:e}),`Switch autonomy to ${k[e]}`)}}ve({read:e,status:s,budgetMode:n,actions:r,chip:b,onSwitch:x,openGrant:l.open});let S=w(s||{switch:`off`,maxSwitchWithoutGrant:`off`}),E=s?.kill??!1,D=y||r.busy||r.readOnly,j=(0,R.jsxs)(`div`,{className:I.switchWrap,title:y?e?.reason??`Reading autonomy state…`:void 0,children:[i?null:(0,R.jsx)(`span`,{className:I.barLabel,"aria-hidden":`true`,children:`Autonomy`}),(0,R.jsx)(d,{size:`sm`,"aria-label":`Autonomy`,value:s?.switch??`off`,onChange:x,options:S.map(e=>({value:e.value,label:(0,R.jsxs)(`span`,{className:I.switchOption,children:[i?e.short:e.label,e.needsGrant?(0,R.jsx)(v,{className:I.touchMark,width:12,height:12,"aria-hidden":`true`}):null]}),ariaLabel:e.ariaLabel,disabled:D}))})]}),M=()=>r.act(()=>A({action:`stop`}),`Stop the fleet`,{confirm:U(),onDone:e=>f(O(e))}),N=()=>r.act(()=>A({action:`clear-stop`}),`Resume the fleet`,{confirm:ge,onDone:()=>f(null)}),P=E?i?(0,R.jsx)(m,{variant:`subtle`,size:`sm`,icon:(0,R.jsx)(g,{}),iconOnly:!0,"aria-label":`Resume the fleet`,disabled:D,onClick:N}):(0,R.jsx)(m,{variant:`subtle`,size:`sm`,icon:(0,R.jsx)(g,{}),disabled:D,onClick:N,children:`Resume`}):i?(0,R.jsx)(m,{variant:`danger`,size:`sm`,icon:(0,R.jsx)(h,{}),iconOnly:!0,"aria-label":`Stop the fleet`,disabled:D,onClick:M}):(0,R.jsx)(m,{variant:`danger`,size:`sm`,icon:(0,R.jsx)(h,{}),disabled:D,onClick:M,children:`Stop`});return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`div`,{className:I.bar,role:`toolbar`,"aria-label":`Autonomy controls`,"data-loading":t||void 0,children:[j,i?null:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(q,{mode:n,onOpen:()=>_(!0)}),(0,R.jsx)(J,{chip:b,onOpen:e=>l.open(e,b.detail)})]}),(0,R.jsx)(`span`,{className:I.barSpacer}),P]}),E&&u?(0,R.jsx)(`p`,{className:I.muted,role:`status`,children:u}):null,i?(0,R.jsxs)(`div`,{className:I.barSecondary,children:[(0,R.jsx)(q,{mode:n,onOpen:()=>_(!0)}),(0,R.jsx)(J,{chip:b,onOpen:e=>l.open(e,b.detail)})]}):null,o?null:c.sheet,(0,R.jsx)(ye,{open:p,onClose:()=>_(!1),status:s})]})}function K(e){return e.readOnly?`Read-only session: this server was started without dispatch, so autonomy cannot be changed from here.`:e.status?e.busy?`Another autonomy action is still running. Try again when it finishes.`:null:e.reason??`The autonomy state has not been read yet, so nothing was changed.`}function ve({read:e,status:t,budgetMode:n,actions:r,chip:i,onSwitch:a,openGrant:o}){let s=e!==void 0,c=()=>K({status:t,reason:e?.reason??null,readOnly:r.readOnly,busy:r.busy}),d=e=>()=>{let n=c();if(n||!t){l(n??`The autonomy state is unknown, so nothing was changed.`,`neutral`);return}if(t.switch===e){l(`Autonomy is already ${k[e]}.`,`neutral`);return}a(e)};u(`autonomy.off`,d(`off`),s),u(`autonomy.propose`,d(`propose`),s),u(`autonomy.autonomous`,d(`autonomous`),s),u(`autonomy.grant`,()=>{let e=c();if(e){l(e,`neutral`);return}if(!i.action){l(i.detail,`neutral`);return}o(i.action,i.detail)},s),u(`autonomy.reapprove`,()=>{let e=c();if(e||!t){l(e??`The autonomy state is unknown, so nothing was changed.`,`neutral`);return}let n=t.grant.state;if(n!==`active`&&n!==`paused`&&n!==`expired`){l(`There is no grant to re-approve. Use "Approve grant…" to sign a new one.`,`neutral`);return}o(`re-approve`,n===`active`?`${i.detail} Re-approving signs a fresh 30 days and continues the rollout from its current stage.`:i.detail)},s);let m=e=>()=>{if(r.readOnly||r.busy){l(c()??`Budget cannot be changed right now.`,`neutral`);return}if(n===e){l(`Budget is already ${H[e]}.`,`neutral`);return}let i=t?.grant.state===`active`?t.grant.maxMode:null;if(i&&p(e,i)){l(`Your grant allows up to ${H[i]}, so ${H[e]} is unavailable. A new grant can raise the ceiling.`,`neutral`);return}r.act(()=>f({mode:e}),`Switch the budget to ${H[e]}`,{onDone:()=>l(`Budget set to ${H[e]}.`,`success`)})};u(`budget.all-in`,m(`all-in`),s),u(`budget.balanced`,m(`balanced`),s),u(`budget.reserve`,m(`reserve`),s)}function q({mode:e,onOpen:t}){return(0,R.jsxs)(`button`,{type:`button`,className:I.pill,"aria-haspopup":`dialog`,onClick:t,children:[(0,R.jsx)(`span`,{className:I.pillLabel,children:`Budget`}),(0,R.jsx)(`span`,{children:e?H[e]:`—`}),(0,R.jsx)(_,{width:14,height:14,"aria-hidden":`true`})]})}function J({chip:e,onOpen:t}){let n=(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(W,{tone:e.tone}),(0,R.jsx)(`span`,{className:I.pillLabel,children:`Grant`}),(0,R.jsx)(`span`,{children:e.label})]});if(!e.action)return(0,R.jsx)(`span`,{className:I.chip,"data-tone":e.tone,title:e.detail,"aria-label":`Grant: ${e.label}. ${e.detail}`,role:`status`,children:n});let r=e.action;return(0,R.jsx)(`button`,{type:`button`,className:I.chip,"data-tone":e.tone,title:e.detail,"aria-haspopup":`dialog`,onClick:()=>t(r),"aria-label":`Grant: ${e.label}. ${e.detail}`,children:n})}function ye({open:e,onClose:t,status:n}){let r=n?.grant.state===`active`?n.grant.maxMode:null;return(0,R.jsx)(b,{open:e,onClose:t,titleId:`command-budget-sheet`,width:560,title:`Budget`,description:r?`Your grant allows up to ${H[r]}. Autonomy never spends past it, whatever is selected here — moving toward Reserve is always instant.`:`No active grant: autonomy only proposes. The budget still decides which seats it would use.`,children:e?(0,R.jsx)(S,{maxMode:r}):null})}var be={control:`_control_16l3r_6`,head:`_head_16l3r_21`,headline:`_headline_16l3r_29`,stateWord:`_stateWord_16l3r_43`,dot:`_dot_16l3r_47`,buttons:`_buttons_16l3r_71`,inlineButtons:`_inlineButtons_16l3r_72`,kbd:`_kbd_16l3r_78`,blocker:`_blocker_16l3r_86`,blockerReason:`_blockerReason_16l3r_97`,blockerCommand:`_blockerCommand_16l3r_103`,did:`_did_16l3r_110`,muted:`_muted_16l3r_117`,link:`_link_16l3r_124`,progress:`_progress_16l3r_153`,progressLine:`_progressLine_16l3r_171`,command:`_command_16l3r_178`,output:`_output_16l3r_190`,facts:`_facts_16l3r_210`,fact:`_fact_16l3r_210`,factValue:`_factValue_16l3r_229`,factSub:`_factSub_16l3r_239`,list:`_list_16l3r_251`,row:`_row_16l3r_259`,rowHead:`_rowHead_16l3r_271`,rowTitle:`_rowTitle_16l3r_279`,rowMeta:`_rowMeta_16l3r_288`,rowControls:`_rowControls_16l3r_294`,log:`_log_16l3r_301`,interject:`_interject_16l3r_315`,textarea:`_textarea_16l3r_321`,directive:`_directive_16l3r_339`,sectionLabel:`_sectionLabel_16l3r_350`,statusLink:`_statusLink_16l3r_364`,statusLinkLine:`_statusLinkLine_16l3r_381`},Y={local:`local`,"grok-cli":`grok`,"claude-cli":`claude`,codex:`codex`,"devin-cli":`devin`},X={local:`Local`,"grok-cli":`Grok`,"claude-cli":`Claude`,codex:`Codex`,"devin-cli":`Devin CLI`};function xe(e){return{name:X[e.lane],slots:e.slots===0?`off`:`${e.busy}/${e.slots}`}}function Z(e){let t=e.capReason?.trim();return t?ee(t):null}function Se(e){let t=new Map;for(let n of e){let e=Z(n);if(!e)continue;let r=t.get(e)??[];r.push(n.lane),t.set(e,r)}return[...t.entries()].map(([t,n])=>({lanes:n,all:n.length===e.length&&e.length>1,reason:t}))}function Ce(e){return e.phase===`queued`||e.phase===`parked`?e.phase:e.phase===`reverting`?`reverting`:e.outcome??e.phase}var we={producing:`running`,verifying:`running`,judging:`running`,landing:`running`,watching:`info`,reverting:`danger`,merged:`success`,proposed:`info`,"owner-lane":`warning`,refused:`warning`,failed:`danger`,reverted:`danger`,cancelled:`neutral`,queued:`neutral`,parked:`neutral`};function Te(e){return we[e]??`unknown`}function Q(e){let t=Date.parse(e.startedAt??e.phaseStartedAt??``);return Number.isFinite(t)?t:null}function $(e){if(!e.endedAt)return null;let t=Date.parse(e.endedAt);return Number.isFinite(t)?t:null}function Ee(e){return[e.repo.includes(`/`)?e.repo.split(`/`)[1]:e.repo,e.title,e.model,e.prNumber?`PR #${e.prNumber}`:null].filter(Boolean).join(` · `)}var De=[`local`,`grok-cli`,`claude-cli`,`codex`,`devin-cli`,`none`];function Oe(e,t,n,r={}){let i=r.includeParked??!0,a=new Map;for(let r of e){if(!i&&r.phase===`parked`)continue;let e=Q(r);if(e===null||($(r)??n)<t||e>n)continue;let o=r.lane??`none`;a.has(o)||a.set(o,[]),a.get(o).push(r)}let o=[];for(let e of De){let t=a.get(e);if(!t?.length)continue;t.sort((e,t)=>Q(e)-Q(t));let r=[],i=[];for(let e of t){let t=Q(e),a=$(e)??n,o=r.findIndex(e=>e<=t);o===-1?(o=r.length,r.push(a),i.push([])):r[o]=a,i[o].push(e)}let s=e===`none`?`Unassigned`:X[e];i.forEach((t,n)=>{o.push({id:`${e}:${n}`,label:i.length>1?`${s} · ${n+1}`:s,...e===`none`?{}:{engine:Y[e]},items:t.map(e=>({id:e.id,start:Q(e),end:$(e),status:Ce(e),detail:Ee(e)}))})})}return o}function ke(e,t){let n=e.filter(e=>e.phase===`parked`||e.hold!==null),r=n.map(e=>e.hold?.nextEligibleAt?Date.parse(e.hold.nextEligibleAt):NaN).filter(Number.isFinite),i=n.map(e=>Q(e)??t),a=Math.min(t-36e5,...i),o=Math.min(t+1728e5,Math.max(t+72e5,...r)),s=0;return{lanes:n.map(e=>{let n=e.hold?.nextEligibleAt?Date.parse(e.hold.nextEligibleAt):NaN;Number.isFinite(n)||s++;let r=e.repo.includes(`/`)?e.repo.split(`/`)[1]:e.repo;return{id:e.id,label:`${r}: ${e.title}`,...e.lane?{engine:Y[e.lane]}:{},items:[{id:e.id,start:Q(e)??t,end:Number.isFinite(n)?n:null,status:e.hold?.kind===`split`?`split`:`parked`,outline:!0,detail:`${te(e.hold?.reason??`parked`,t)}${Number.isFinite(n)?``:` · release time unknown`}`}]}}),from:a,to:o,unknownRelease:s}}var Ae={G0:`Authority`,G1:`Protected paths`,G1b:`Tamper`,G2:`Scope`,G3:`Verify`,G4:`Claims`,G5:`Blast radius`,G6:`Judge or elite`,G7:`GitHub checks`};function je(e){return!e||e.stages.length===0?[]:[{id:`entered`,label:`Proposals`,value:e.stages[0].entered},...e.stages.map(e=>({id:e.gate,label:`${e.gate} ${Ae[e.gate]??``}`.trim(),value:e.passed}))]}function Me(e,t=5){if(!e)return{categories:[],segments:[],values:[],total:0};let n=new Map;for(let t of e.stages)for(let e of t.refusals){let t=n.get(e.code);n.set(e.code,{reason:t?.reason??e.reason,count:(t?.count??0)+e.count})}let r=[...n.entries()].sort((e,t)=>t[1].count-e[1].count||e[0].localeCompare(t[0])),i=r.slice(0,t).map(([e])=>e),a=r.length>t,o=[...i.map((e,t)=>({id:e,label:n.get(e).reason,color:c(t)})),...a?[{id:`__other`,label:`Other reasons`,color:s}]:[]],l=e.stages.filter(e=>e.refusals.length>0||e.entered!==e.passed);return{categories:l.map(e=>e.gate),segments:o,values:l.map(e=>{let t=i.map(t=>e.refusals.find(e=>e.code===t)?.count??0);return a&&t.push(e.refusals.filter(e=>!i.includes(e.code)).reduce((e,t)=>e+t.count,0)),t}),total:r.reduce((e,[,t])=>e+t.count,0)}}function Ne(e){return e.runs.length===0&&je(e.funnel).length===0&&Me(e.funnel).total===0}function Pe(e){if(!e)return null;let t=e.runs.filter(e=>e.seatDecision!==null);if(!t.length)return null;t.sort((e,t)=>(Q(t)??0)-(Q(e)??0));let n=t[0];return{decision:n.seatDecision,run:n}}export{U as _,Se as a,Pe as c,Me as d,Te as f,K as g,W as h,xe as i,Ne as l,_e as m,X as n,Z as o,be as p,je as r,Oe as s,Y as t,ke as u,G as v};
|
|
2
|
+
//# sourceMappingURL=live-model-D97AfBFz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-model-D97AfBFz.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/GrantScopeEditor.tsx","../../../../../../src/web-ui/routes/verse/command/GrantSheet.tsx","../../../../../../src/web-ui/routes/verse/command/AutonomyBar.tsx","../../../../../../src/web-ui/routes/verse/fleet/fleet-control.module.css","../../../../../../src/web-ui/routes/verse/fleet/live-model.ts"],"sourcesContent":["/**\n * routes/verse/command/GrantScopeEditor.tsx — edit a grant draft's scope\n * before signing it (3.15), inside the Touch ID sheet.\n *\n * The editor only CHOOSES within the server's draft: repos from the draft\n * (the enrolled repos + the canary), engines the draft offers (the four fleet\n * lanes, plus Devin when the custody helper can sign it), Leader classes A/B,\n * the budget ceiling, metered dollars and the days. \"Preview\" sends the choice\n * to POST /api/verse/authority/draft, which applies it to its OWN draft\n * (authority/grant-scope.ts), re-validates it and answers the new draft with a\n * diff against the grant in force. What gets signed is exactly that returned\n * draft (its digest) — the helper then shows the scope again in its own Touch\n * ID prompt. Nothing here can sign, and nothing here holds a secret.\n */\nimport { useId, useState } from 'react';\nimport type { AuthorityGrantDraft, LeaderGrantClass } from '../../../../core/authority/types.js';\nimport type { GrantDiffLine, GrantDraftEditable, GrantScopeEdit } from '../../../../core/authority/grant-scope-types.js';\nimport type { GrantEngine } from '../../../../core/fleet/fleet-types.js';\nimport type { BudgetMode } from '../../../../core/routing/types.js';\nimport { apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { AUTHORITY_DRAFT_PATH } from './surface-data.js';\nimport { MicroLabel } from './Surface.js';\nimport styles from './command.module.css';\n\n/** The draft with the 3.15 additions the editor reads (absent from an older server). */\nexport interface EditableGrantDraft extends AuthorityGrantDraft {\n kind?: 'new' | 'reapprove';\n summary?: string[];\n startStageId?: string;\n diff?: GrantDiffLine[];\n editable?: GrantDraftEditable;\n eliteDirect?: boolean;\n}\n\n/** A draft with Mason's scope edits applied server-side, within its own draft. */\nexport async function postGrantDraft(kind: 'new' | 'reapprove' | 'auto', scope: GrantScopeEdit, eliteDirect?: boolean): Promise<EditableGrantDraft> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<EditableGrantDraft>(AUTHORITY_DRAFT_PATH, { kind, scope, ...(eliteDirect === undefined ? {} : { eliteDirect }) }, token);\n touchMutationHold();\n return result;\n}\n\nconst ENGINE_LABEL: Record<string, string> = {\n 'claude-cli': 'Claude Code (claude-cli)',\n codex: 'Codex',\n 'grok-cli': 'Grok (grok-cli)',\n devin: 'Devin',\n 'devin-cli': 'Devin CLI',\n local: 'Local models',\n};\n\nconst MODE_LABEL: Record<BudgetMode, string> = { reserve: 'Reserve', balanced: 'Balanced', 'all-in': 'All-in' };\n\nfunction toggle<T>(list: readonly T[], value: T, on: boolean): T[] {\n return on ? (list.includes(value) ? [...list] : [...list, value]) : list.filter((v) => v !== value);\n}\n\nfunction daysOf(draft: AuthorityGrantDraft): number {\n const d = Math.round((Date.parse(draft.payload.expiresAt) - Date.parse(draft.payload.issuedAt)) / 86_400_000);\n return Number.isFinite(d) && d > 0 ? d : 30;\n}\n\nexport interface GrantScopeEditorProps {\n draft: EditableGrantDraft;\n busy: boolean;\n /** Ask the server for the edited draft (the sheet runs it through the token guard). */\n onPreview: (scope: GrantScopeEdit) => void;\n onReset: () => void;\n edited: boolean;\n}\n\nexport function GrantScopeEditor({ draft, busy, onPreview, onReset, edited }: GrantScopeEditorProps) {\n const base = draft.editable;\n const g = draft.payload;\n const [repos, setRepos] = useState<string[]>(() => g.repos.map((r) => r.nameWithOwner));\n const [engines, setEngines] = useState<string[]>(() => [...g.engines]);\n const [classes, setClasses] = useState<string[]>(() => [...g.leader.classes]);\n const [mode, setMode] = useState<BudgetMode>(g.spend.maxMode);\n const [metered, setMetered] = useState<string>(String(g.spend.meteredUsdPerDay));\n const [days, setDays] = useState<string>(String(daysOf(draft)));\n const ids = { metered: useId(), days: useId(), mode: useId() };\n if (!base) {\n return <p className={styles.scopeMeta}>This server cannot edit a draft yet — update Ashlr to choose repos and engines here.</p>;\n }\n const meteredN = Number(metered);\n const daysN = Number(days);\n const valid = repos.length > 0 && engines.length > 0 && Number.isInteger(meteredN) && meteredN >= 0 && Number.isInteger(daysN) && daysN >= 1 && daysN <= base.maxDays;\n\n function preview(): void {\n onPreview({\n repos,\n engines: engines as GrantEngine[],\n leaderClasses: classes as LeaderGrantClass[],\n maxMode: mode,\n meteredUsdPerDay: meteredN,\n days: daysN,\n });\n }\n\n return (\n <div className={styles.scopeEditor} aria-label=\"Edit the grant scope\">\n <fieldset className={styles.scopeFieldset}>\n <legend><MicroLabel>Repositories ({repos.length}/{base.repos.length})</MicroLabel></legend>\n {base.repos.map((repo) => (\n <label key={repo} className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={repos.includes(repo)} onChange={(e) => setRepos(toggle(repos, repo, e.target.checked))} />\n <span className={styles.mono}>{repo}</span>\n </label>\n ))}\n <p className={styles.scopeMeta}>Only enrolled repos can be granted. Enroll another checkout to add it here.</p>\n </fieldset>\n <fieldset className={styles.scopeFieldset}>\n <legend><MicroLabel>Engines</MicroLabel></legend>\n {base.engines.map((engine) => (\n <label key={engine} className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={engines.includes(engine)} onChange={(e) => setEngines(toggle(engines, engine, e.target.checked))} />\n <span>{ENGINE_LABEL[engine] ?? engine}</span>\n </label>\n ))}\n </fieldset>\n <fieldset className={styles.scopeFieldset}>\n <legend><MicroLabel>Leader may act</MicroLabel></legend>\n {base.leaderClasses.map((c) => (\n <label key={c} className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={classes.includes(c)} onChange={(e) => setClasses(toggle(classes, c, e.target.checked))} />\n <span>Class {c}{c === 'A' ? ' — reversible housekeeping' : ' — larger changes, with a veto window'}</span>\n </label>\n ))}\n </fieldset>\n <fieldset className={styles.scopeFieldset}>\n <legend><MicroLabel>Budget caps</MicroLabel></legend>\n <label className={styles.scopeField} htmlFor={ids.mode}>\n <span>Budget mode up to</span>\n <select id={ids.mode} value={mode} onChange={(e) => setMode(e.target.value as BudgetMode)}>\n {(['reserve', 'balanced', 'all-in'] as const).map((m) => (\n <option key={m} value={m}>{MODE_LABEL[m]}</option>\n ))}\n </select>\n </label>\n <label className={styles.scopeField} htmlFor={ids.metered}>\n <span>Metered APIs, $ per day</span>\n <input id={ids.metered} type=\"number\" min={0} step={1} inputMode=\"numeric\" value={metered} onChange={(e) => setMetered(e.target.value)} />\n </label>\n <label className={styles.scopeField} htmlFor={ids.days}>\n <span>Valid for (days, at most {base.maxDays})</span>\n <input id={ids.days} type=\"number\" min={1} max={base.maxDays} step={1} inputMode=\"numeric\" value={days} onChange={(e) => setDays(e.target.value)} />\n </label>\n </fieldset>\n <span className={styles.sheetButtons}>\n {edited ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={onReset}>\n Back to the default draft\n </Button>\n ) : null}\n <Button variant=\"subtle\" size=\"sm\" onClick={preview} disabled={!valid} busy={busy}>\n Preview the changes\n </Button>\n </span>\n {!valid ? <p className={styles.scopeMeta}>Keep at least one repo and one engine, whole dollars, and 1–{base.maxDays} days.</p> : null}\n </div>\n );\n}\n\nconst DIRECTION_WORD: Record<GrantDiffLine['direction'], string> = { wider: 'wider', narrower: 'narrower', changed: 'changed' };\n\n/** What signing this draft changes vs the grant in force. */\nexport function GrantDiff({ lines }: { lines: GrantDiffLine[] | undefined }) {\n if (!lines) return null;\n if (lines.length === 0) {\n return (\n <section className={styles.scopeBlock} aria-label=\"Changes\">\n <MicroLabel>Changes vs the grant in force</MicroLabel>\n <p className={styles.scopeMeta}>Same scope as the grant in force.</p>\n </section>\n );\n }\n return (\n <section className={styles.scopeBlock} aria-label=\"Changes\">\n <MicroLabel>Changes vs the grant in force</MicroLabel>\n <table className={styles.scopeTable}>\n <thead>\n <tr>\n <th scope=\"col\">What</th>\n <th scope=\"col\">Now</th>\n <th scope=\"col\">After signing</th>\n <th scope=\"col\">Authority</th>\n </tr>\n </thead>\n <tbody>\n {lines.map((line, i) => (\n <tr key={`${line.field}-${i}`} data-direction={line.direction}>\n <td>{line.label}</td>\n <td className={styles.mono}>{line.before}</td>\n <td className={styles.mono}>{line.after}</td>\n <td className={styles.diffDirection} data-direction={line.direction}>{DIRECTION_WORD[line.direction]}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </section>\n );\n}\n","/**\n * routes/verse/command/GrantSheet.tsx — the Touch ID sheet (SPEC-310B §6:\n * \"Raising it past the grant opens the Touch ID sheet, which shows scope and\n * expiry\"; unit C7).\n *\n * It shows EXACTLY what the custody helper will sign — the server's draft\n * StandingGrantV1 and its digest — before anything is sent: repos and how\n * far each may go, merge caps, spend (mode ceiling, metered dollars, every\n * seat's reserve floor), engines, the Leader's classes and veto window, the\n * rollout ladder with each rung's exit criteria, and the expiry. Approving\n * echoes the draft's digest back, so the server signs what Mason read, not\n * whatever it would draft a second later. The Touch ID prompt itself is the\n * helper's, on this Mac; this page never sees a key.\n *\n * All copy is plain text; the draft is server data but rendered as text only.\n */\nimport { useId, useState } from 'react';\nimport type { AuthorityGrantDraft, RolloutStage, StandingGrantV1 } from '../../../../core/authority/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { IconLock } from '../../../components/primitives/icons.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { authorityDraftQuery, authorityEliteDraftQuery, type OptionalRead } from './surface-data.js';\nimport { SWITCH_LABEL } from './authority-model.js';\nimport { CardNote, MicroLabel } from './Surface.js';\nimport type { AutonomySwitch } from '../../../../core/authority/types.js';\nimport type { SurfaceActions } from './actions.js';\nimport { GrantDiff, GrantScopeEditor, postGrantDraft, type EditableGrantDraft } from './GrantScopeEditor.js';\nimport styles from './command.module.css';\n\nexport type GrantIntent = 'grant' | 're-approve';\n\nexport interface GrantSheetProps {\n open: boolean;\n intent: GrantIntent;\n /** The switch position the operator asked for (applied after the grant, if it allows it). */\n then: AutonomySwitch | null;\n busy: boolean;\n /** Why the sheet opened, in one sentence (\"Autonomous needs a new grant.\"). */\n why: string;\n onApprove: (draft: AuthorityGrantDraft) => void;\n onClose: () => void;\n /**\n * 3.15: the surface's guarded action. With it the sheet can EDIT the draft's\n * scope (repos, engines, Leader classes, caps, days) before signing — the\n * token prompt comes first, like every write. Without it, view-only.\n */\n act?: SurfaceActions['act'];\n /** 3.15: open straight into the scope editor (Fleet's \"Edit scope\"). */\n startEditing?: boolean;\n}\n\nconst DAY = 86_400_000;\n\nfunction fmtDate(iso: string): string {\n const t = Date.parse(iso);\n return Number.isFinite(t) ? new Date(t).toLocaleString('en-US', { weekday: 'short', month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' }) : '—';\n}\n\nexport function grantDays(g: Pick<StandingGrantV1, 'issuedAt' | 'expiresAt'>): number | null {\n const a = Date.parse(g.issuedAt);\n const b = Date.parse(g.expiresAt);\n return Number.isFinite(a) && Number.isFinite(b) ? Math.round((b - a) / DAY) : null;\n}\n\n/** The reserved rung id (authority/elite-models.ts ELITE_DIRECT_STAGE_ID; the web bundle keeps its own copy). */\nconst ELITE_DIRECT_STAGE_ID = 'elite-direct';\n\n/** One line the sheet shows for an elite-direct grant — what Mason is signing. */\nexport const ELITE_DIRECT_SHEET_LINE =\n 'Elite models (Opus 5.5/5, Fable 5.1/5, Sonnet 5, GPT-6 Astra/Sol/Luna, Grok 4.7/4.6, SWE-2, Qwen 3.8 27B) land directly on green tests — no judge. '\n + 'Other models still need an independent judge; changes to authority code still come to you.';\n\nfunction stageLine(s: RolloutStage): string {\n const c = s.criteria;\n if (s.id === ELITE_DIRECT_STAGE_ID) {\n return `${s.repos.filter((r) => r.stage === 'merge').length} of ${s.repos.length} repos merge · ${s.maxRisk} risk · ≤ ${s.maxFiles} files / ${s.maxLines} lines — one rung, no ramp; elite models land on green tests, no judge`;\n }\n const parts = [\n `${s.repos.length} repo${s.repos.length === 1 ? '' : 's'}`,\n `${s.maxRisk} risk`,\n `≤ ${s.maxFiles} files / ${s.maxLines} lines`,\n `≤ ${s.maxMergesPerRepoPerDay} merges/repo/day`,\n ];\n const exit = [`${c.minMerges} merges`, `${c.minHours} h`, c.minPostMergeGreenPct ? `≥ ${c.minPostMergeGreenPct}% green` : null, `≤ ${c.maxRevertRatePct}% reverts`].filter(Boolean);\n return `${parts.join(' · ')} — advances after ${exit.join(', ')}`;\n}\n\nexport function DraftScope({ draft }: { draft: AuthorityGrantDraft }) {\n const g = draft.payload;\n const days = grantDays(g);\n return (\n <div className={styles.scope}>\n <section className={styles.scopeBlock} aria-label=\"Expiry\">\n <MicroLabel>Expiry</MicroLabel>\n <p className={styles.scopeLead}>\n {days !== null ? `${days} days` : '—'}, until {fmtDate(g.expiresAt)}\n </p>\n <p className={styles.scopeMeta}>\n Signed by key <span className={styles.mono}>{g.keyId}</span> · sequence {g.grantSeq} · bound to this Mac\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Repositories\">\n <MicroLabel>Repositories ({g.repos.length})</MicroLabel>\n <table className={styles.scopeTable}>\n <thead>\n <tr>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Up to</th>\n <th scope=\"col\">Checks</th>\n <th scope=\"col\">Risk</th>\n <th scope=\"col\" className={styles.num}>Merges/day</th>\n </tr>\n </thead>\n <tbody>\n {g.repos.map((r) => (\n <tr key={r.nameWithOwner}>\n <td className={styles.mono}>{r.nameWithOwner}</td>\n <td>{r.stage === 'merge' ? 'Merge' : 'Propose'}</td>\n <td>{r.enforcement === 'server' ? 'GitHub' : 'Local only'}</td>\n <td>{r.maxRisk}</td>\n <td className={styles.num}>{r.maxMergesPerDay}</td>\n </tr>\n ))}\n </tbody>\n </table>\n <p className={styles.scopeMeta}>\n Every merge ≤ {g.merge.maxFiles} files / {g.merge.maxLines} lines · ashlr-hub itself: {g.merge.selfRepo === 'propose-only' ? 'propose only' : 'merge outside authority code'}\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Spend\">\n <MicroLabel>Spend</MicroLabel>\n <p className={styles.scopeLead}>\n Up to {g.spend.maxMode === 'all-in' ? 'All-in' : g.spend.maxMode === 'balanced' ? 'Balanced' : 'Reserve'} · metered APIs ${g.spend.meteredUsdPerDay}/day\n </p>\n <ul className={styles.scopeList}>\n {Object.entries(g.spend.seats).map(([seatId, seat]) => (\n <li key={seatId}>\n <span className={styles.mono}>{seatId}</span>\n {seat.enabled ? `: keeps ${seat.reserveFloorPercent}% for you` : ': not used by autonomy'}\n {seat.enabled && seat.maxSessionWindowPercent !== undefined ? `, never above ${seat.maxSessionWindowPercent}% of its 5-hour window` : ''}\n {seat.enabled ? ` · ${seat.roles.join(', ')}` : ''}\n </li>\n ))}\n </ul>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Engines and Leader\">\n <MicroLabel>Engines and Leader</MicroLabel>\n <p className={styles.scopeLead}>{g.engines.join(', ') || 'none'}</p>\n <p className={styles.scopeMeta}>\n Leader classes {g.leader.classes.length ? g.leader.classes.join(' + ') : 'none (proposes only)'} · class-B veto window {g.leader.vetoMinutes} min ·\n goal conductor {g.conductorGoals ? 'on' : 'off'}\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Rollout ladder\">\n {g.rollout.stages.some((s) => s.id === ELITE_DIRECT_STAGE_ID) ? (\n <>\n <MicroLabel>Elite direct</MicroLabel>\n <p className={styles.scopeLead}>{ELITE_DIRECT_SHEET_LINE}</p>\n </>\n ) : (\n <MicroLabel>Rollout ladder ({g.rollout.stages.length} stages, advances by itself)</MicroLabel>\n )}\n <ol className={styles.ladder}>\n {g.rollout.stages.map((s) => (\n <li key={s.id}>\n <span className={styles.ladderId}>{s.id}</span>\n <span>{stageLine(s)}</span>\n </li>\n ))}\n </ol>\n <p className={styles.scopeMeta}>\n {g.rollout.stages.length === 1 && g.rollout.stages[0]?.id === ELITE_DIRECT_STAGE_ID\n ? 'A sandbox violation, reserve breach, or reverts above 10% restart this rung’s evidence window. Elite direct remains the signed merge ceiling until you stop, revoke, or replace the grant.'\n : 'Any sandbox violation or reserve breach drops it back one stage. It can never climb past the last stage.'}\n </p>\n </section>\n\n <p className={styles.scopeMeta}>\n Draft digest <span className={styles.mono}>{draft.digest.slice(0, 16)}…</span>\n </p>\n </div>\n );\n}\n\nexport function GrantSheet({ open, intent, then, busy, why, onApprove, onClose, act, startEditing }: GrantSheetProps) {\n const titleId = useId();\n // Only read the draft while the sheet is open: drafting is cheap on the\n // server, but a draft read while the sheet is closed would be stale by the\n // time anyone approved it.\n return open ? <GrantSheetBody titleId={titleId} intent={intent} then={then} busy={busy} why={why} onApprove={onApprove} onClose={onClose} {...(act ? { act } : {})} startEditing={startEditing === true} /> : null;\n}\n\nfunction GrantSheetBody({ titleId, intent, then, busy, why, onApprove, onClose, act, startEditing }: Omit<GrantSheetProps, 'open'> & { titleId: string }) {\n const [elite, setElite] = useState(false);\n const eliteHintId = useId();\n const read = useQuery(elite ? authorityEliteDraftQuery : authorityDraftQuery, { freshMs: 0 });\n const served = (read.data as OptionalRead<EditableGrantDraft> | undefined)?.value ?? null;\n // 3.15: Mason's edited draft (the server's answer to the editor) replaces\n // the served one; approving signs exactly the draft on screen (its digest).\n const [edited, setEdited] = useState<EditableGrantDraft | null>(null);\n const [editing, setEditing] = useState(startEditing === true);\n const [editError, setEditError] = useState<string | null>(null);\n const [previewing, setPreviewing] = useState(false);\n // A late preview from the previous ladder must never replace the new one.\n const draft: EditableGrantDraft | null = edited && edited.eliteDirect === served?.eliteDirect ? edited : served;\n const reason = read.data?.reason ?? null;\n const canEdit = act !== undefined && served?.editable !== undefined;\n const fixedElite = served?.kind === 'reapprove' && served.eliteDirect === true;\n\n function preview(scope: Parameters<typeof postGrantDraft>[1]): void {\n if (!act || !served) return;\n const kind = served.kind ?? 'auto';\n setEditError(null);\n setPreviewing(true);\n act(\n async () => {\n try {\n return await postGrantDraft(kind, scope, served.eliteDirect === true);\n } catch (error) {\n setEditError(error instanceof Error ? error.message : String(error));\n return null;\n } finally {\n setPreviewing(false);\n }\n },\n 'Preview the edited grant',\n {\n onDone: (next) => {\n if (next && typeof next === 'object' && typeof next.digest === 'string' && next.eliteDirect === served.eliteDirect) setEdited(next);\n },\n },\n );\n }\n return (\n <Sheet\n open\n onClose={onClose}\n titleId={titleId}\n width={600}\n title={intent === 're-approve' ? 'Re-approve the standing grant' : 'Approve a standing grant'}\n description={why}\n footer={\n <div className={styles.sheetFooter}>\n <p className={styles.sheetFootnote}>\n Touch ID appears on this Mac. Lowering authority — Off, Stop, Revoke — never needs it.\n {then ? ` After approval the switch moves to ${SWITCH_LABEL[then]}.` : ''}\n </p>\n <span className={styles.sheetButtons}>\n <Button variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button variant=\"primary\" icon={<IconLock />} disabled={!draft} busy={busy} onClick={() => draft && onApprove(draft)}>\n Approve with Touch ID\n </Button>\n </span>\n </div>\n }\n >\n <label className={styles.eliteToggle}>\n <input type=\"checkbox\" checked={elite || fixedElite} disabled={previewing || busy || fixedElite} onChange={(e) => { setElite(e.target.checked); setEdited(null); setEditError(null); }} aria-describedby={eliteHintId} />\n Elite direct\n </label>\n <p id={eliteHintId} className={styles.scopeMeta}>\n {ELITE_DIRECT_SHEET_LINE}\n </p>\n {read.status === 'loading' && !read.data ? (\n <p className={styles.muted} aria-busy=\"true\">Preparing the grant draft…</p>\n ) : draft ? (\n <>\n {canEdit ? (\n <div className={styles.scopeEditToggle}>\n <Button variant=\"ghost\" size=\"sm\" aria-expanded={editing} onClick={() => setEditing((e) => !e)}>\n {editing ? 'Hide the scope editor' : 'Edit scope'}\n </Button>\n {edited ? <span className={styles.scopeMeta}>Showing your edited draft.</span> : null}\n </div>\n ) : null}\n {canEdit && editing && served ? (\n <GrantScopeEditor\n draft={served as EditableGrantDraft}\n busy={previewing}\n edited={edited !== null}\n onPreview={preview}\n onReset={() => {\n setEdited(null);\n setEditError(null);\n }}\n />\n ) : null}\n {editError ? <CardNote tone=\"danger\">{editError}</CardNote> : null}\n <GrantDiff lines={draft.diff} />\n <DraftScope draft={draft} />\n </>\n ) : (\n <CardNote tone=\"unknown\">{reason ?? 'Grant draft unreadable — nothing to approve.'}</CardNote>\n )}\n </Sheet>\n );\n}\n","/**\n * routes/verse/command/AutonomyBar.tsx — Command's top bar (SPEC-310B §6,\n * SPEC-310C §5; unit C7):\n *\n * Autonomy [Off | Propose | Autonomous] Budget · Balanced ▾ Grant 23d ■ Stop\n *\n * - Lowering the switch is instant (no confirm, no Touch ID — I1).\n * - Raising within what the installed grant allows is instant too.\n * - Raising PAST the grant opens the Touch ID sheet with the draft's full\n * scope and expiry; the switch then moves once the grant is signed.\n * - The Budget pill opens A9's BudgetControl, with the grant's mode\n * ceiling stated above it (autonomy never spends past it whatever the\n * control shows — the server clamps; see CROSS-UNIT REQUEST to C6).\n * - The grant chip reads \"23d\", or \"Paused, re-approve\" and opens the sheet.\n * - Stop asks for confirmation (the catalog's `fleet.stop` guard copy),\n * then writes KILL; while stopped it becomes Resume.\n *\n * At 375 px the bar is just [Autonomy][■] (SPEC-310C §5); the budget pill\n * and grant chip move under the verdict line (rendered by CommandSection).\n *\n * ⌘K reaches the same paths (usePaletteCommands below): \"Autonomy: …\",\n * \"Approve grant…\", \"Re-approve grant…\" and \"Budget mode: …\" run THROUGH this bar — the switch's\n * lower/raise/needs-grant classification, the grant chip's own intent, the\n * budget's grant ceiling, the token prompt, the read-only session — so the\n * palette can never be a shortcut around any of them. When the bar would\n * have been disabled, the palette says why instead of doing nothing.\n */\nimport { useState, type ReactNode } from 'react';\nimport type { AuthorityGrantDraft, AuthorityStatusV1, AutonomySwitch } from '../../../../core/authority/types.js';\nimport type { BudgetMode } from '../../../../core/routing/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { IconChevronDown, IconLock, IconPlay, IconStop } from '../../../components/primitives/icons.js';\nimport { BudgetControl } from '../budget/BudgetControl.js';\nimport { modeAboveCeiling } from '../budget/budget-model.js';\nimport { updateBudget } from '../budget/budget-queries.js';\nimport { useCommandHandler } from '../shell/command-bus.js';\nimport { findCommand } from '../shell/command-catalog.js';\nimport { shellNotify } from '../shell/run-command.js';\nimport { actionForDraft, SWITCH_LABEL, SWITCH_RANK, classifySwitch, grantChip, stopOutcomeSentence, switchOptions, type ChipTone } from './authority-model.js';\nimport { GrantSheet, type GrantIntent } from './GrantSheet.js';\nimport { postAuthority, type OptionalRead } from './surface-data.js';\nimport type { ConfirmSpec, SurfaceActions } from './actions.js';\nimport styles from './command.module.css';\n\nconst MODE_WORD: Record<BudgetMode, string> = { 'all-in': 'All-in', balanced: 'Balanced', reserve: 'Reserve' };\n\n/** The catalog's Stop copy, so ⌘K \"Stop the fleet…\" and this button confirm with the same words. */\nexport function stopConfirm(): ConfirmSpec {\n const guard = findCommand('fleet.stop')?.guard?.confirm;\n return {\n title: guard?.title ?? 'Stop the fleet?',\n body: guard?.body ?? 'Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.',\n confirmLabel: guard?.confirmLabel ?? 'Stop fleet',\n destructive: true,\n };\n}\n\nconst RESUME_CONFIRM: ConfirmSpec = {\n title: 'Resume the fleet?',\n body: 'Autonomy picks up at the switch position on its next tick. Stopping again is one click.',\n confirmLabel: 'Resume fleet',\n destructive: false,\n};\n\nexport function ChipDot({ tone }: { tone: ChipTone }) {\n return <span className={styles.dot} data-tone={tone} aria-hidden=\"true\" />;\n}\n\n/**\n * The Touch ID sheet and what approving it does, as one piece: the bar's\n * switch and grant chip open it, and so does Command's \"Autonomy is off\"\n * banner (autonomy/AutonomyOffState) — one sheet, one approve path.\n */\nexport interface GrantFlow {\n /**\n * `then`: the switch position to apply after signing, if the new grant allows it.\n * `edit` (3.15): open straight into the scope editor.\n */\n open: (intent: GrantIntent, why: string, then?: AutonomySwitch | null, opts?: { edit?: boolean }) => void;\n /** Render once (the bar does unless its owner passes the flow in). */\n sheet: ReactNode;\n}\n\nexport function useGrantFlow(actions: SurfaceActions): GrantFlow {\n const [sheet, setSheet] = useState<{ intent: GrantIntent; then: AutonomySwitch | null; why: string; edit: boolean } | null>(null);\n\n function approve(draft: AuthorityGrantDraft): void {\n if (!sheet) return;\n const { then } = sheet;\n // The DRAFT decides grant vs re-approve (B-U1: GET …/draft answers with\n // `kind`, and POST refuses a digest whose kind does not match the action).\n // The sheet's intent is only what the operator clicked; a grant that is no\n // longer continuable is drafted as a new one, and signing it must say so.\n const intent = actionForDraft(draft, sheet.intent);\n actions.act(\n () => postAuthority({ action: intent, draftDigest: draft.digest }),\n intent === 're-approve' ? 'Re-approve the standing grant' : 'Sign a new standing grant',\n {\n onDone: (next) => {\n setSheet(null);\n // Apply the requested position only if the NEW grant allows it.\n if (then && next && SWITCH_RANK[then] <= SWITCH_RANK[next.maxSwitchWithoutGrant] && then !== next.switch) {\n actions.act(() => postAuthority({ action: 'switch', to: then }), `Switch autonomy to ${SWITCH_LABEL[then]}`);\n }\n },\n },\n );\n }\n\n return {\n open: (intent, why, then = null, opts = {}) => setSheet({ intent, then, why, edit: opts.edit === true }),\n sheet: (\n <GrantSheet\n open={sheet !== null}\n intent={sheet?.intent ?? 'grant'}\n then={sheet?.then ?? null}\n why={sheet?.why ?? ''}\n busy={actions.busy}\n onApprove={approve}\n onClose={() => setSheet(null)}\n act={actions.act}\n startEditing={sheet?.edit === true}\n />\n ),\n };\n}\n\nexport interface AutonomyBarProps {\n read: OptionalRead<AuthorityStatusV1> | undefined;\n loading: boolean;\n budgetMode: BudgetMode | null;\n actions: SurfaceActions;\n compact: boolean;\n now: number;\n /** A flow shared with the rest of the surface; its owner renders `sheet`. Omitted = the bar's own. */\n grantFlow?: GrantFlow;\n}\n\nexport function AutonomyBar({ read, loading, budgetMode, actions, compact, now, grantFlow }: AutonomyBarProps) {\n const status = read?.value ?? null;\n const ownFlow = useGrantFlow(actions);\n const flow = grantFlow ?? ownFlow;\n /** What the last Stop did (drain count, merges revoked) — shown while stopped. */\n const [stopNote, setStopNote] = useState<string | null>(null);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const unavailable = !status;\n const chip = grantChip(status, now);\n\n function onSwitch(to: AutonomySwitch): void {\n if (!status) return;\n const change = classifySwitch(status, to);\n if (change === 'same') return;\n if (change === 'raise-needs-grant') {\n const paused = status.grant.state === 'paused';\n flow.open(\n paused ? 're-approve' : 'grant',\n paused\n ? `${status.grant.reason ?? 'The grant is paused.'} ${SWITCH_LABEL[to]} needs it re-approved.`\n : `${SWITCH_LABEL[to]} is beyond what the installed grant allows, so it needs a new grant.`,\n to,\n );\n return;\n }\n // Lower, or raise within the grant: straight to the server, no dialog.\n actions.act(() => postAuthority({ action: 'switch', to }), `Switch autonomy to ${SWITCH_LABEL[to]}`);\n }\n\n // ⌘K \"Approve grant…\" opens the SAME flow the chip and the off-state banner do.\n usePaletteCommands({ read, status, budgetMode, actions, chip, onSwitch, openGrant: flow.open });\n\n const options = status ? switchOptions(status) : switchOptions({ switch: 'off', maxSwitchWithoutGrant: 'off' });\n const stopped = status?.kill ?? false;\n const disabled = unavailable || actions.busy || actions.readOnly;\n\n const switchControl = (\n <div className={styles.switchWrap} title={unavailable ? (read?.reason ?? 'Reading autonomy state…') : undefined}>\n {!compact ? <span className={styles.barLabel} aria-hidden=\"true\">Autonomy</span> : null}\n <Segmented<AutonomySwitch>\n size=\"sm\"\n aria-label=\"Autonomy\"\n value={status?.switch ?? 'off'}\n onChange={onSwitch}\n options={options.map((o) => ({\n value: o.value,\n label: (\n <span className={styles.switchOption}>\n {compact ? o.short : o.label}\n {o.needsGrant ? <IconLock className={styles.touchMark} width={12} height={12} aria-hidden=\"true\" /> : null}\n </span>\n ),\n ariaLabel: o.ariaLabel,\n disabled,\n }))}\n />\n </div>\n );\n\n const onStop = () => actions.act(() => postAuthority({ action: 'stop' }), 'Stop the fleet', {\n confirm: stopConfirm(),\n onDone: (next) => setStopNote(stopOutcomeSentence(next)),\n });\n const onResume = () => actions.act(() => postAuthority({ action: 'clear-stop' }), 'Resume the fleet', {\n confirm: RESUME_CONFIRM,\n onDone: () => setStopNote(null),\n });\n const stopButton = stopped\n ? compact\n ? <Button variant=\"subtle\" size=\"sm\" icon={<IconPlay />} iconOnly aria-label=\"Resume the fleet\" disabled={disabled} onClick={onResume} />\n : <Button variant=\"subtle\" size=\"sm\" icon={<IconPlay />} disabled={disabled} onClick={onResume}>Resume</Button>\n : compact\n ? <Button variant=\"danger\" size=\"sm\" icon={<IconStop />} iconOnly aria-label=\"Stop the fleet\" disabled={disabled} onClick={onStop} />\n : <Button variant=\"danger\" size=\"sm\" icon={<IconStop />} disabled={disabled} onClick={onStop}>Stop</Button>;\n\n return (\n <>\n <div className={styles.bar} role=\"toolbar\" aria-label=\"Autonomy controls\" data-loading={loading || undefined}>\n {switchControl}\n {!compact ? (\n <>\n <BudgetPill mode={budgetMode} onOpen={() => setBudgetOpen(true)} />\n <GrantChip chip={chip} onOpen={(intent) => flow.open(intent, chip.detail)} />\n </>\n ) : null}\n <span className={styles.barSpacer} />\n {stopButton}\n </div>\n {stopped && stopNote ? <p className={styles.muted} role=\"status\">{stopNote}</p> : null}\n {compact ? (\n <div className={styles.barSecondary}>\n <BudgetPill mode={budgetMode} onOpen={() => setBudgetOpen(true)} />\n <GrantChip chip={chip} onOpen={(intent) => flow.open(intent, chip.detail)} />\n </div>\n ) : null}\n {grantFlow ? null : ownFlow.sheet}\n <BudgetSheet open={budgetOpen} onClose={() => setBudgetOpen(false)} status={status} />\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ⌘K — the palette's autonomy, grant and budget entries\n// ---------------------------------------------------------------------------\n\ninterface PaletteWiring {\n read: OptionalRead<AuthorityStatusV1> | undefined;\n status: AuthorityStatusV1 | null;\n budgetMode: BudgetMode | null;\n actions: SurfaceActions;\n chip: ReturnType<typeof grantChip>;\n onSwitch: (to: AutonomySwitch) => void;\n openGrant: GrantFlow['open'];\n}\n\n/**\n * Why the bar's controls are disabled right now, in the words the operator\n * needs — or null when they are live. Mirrors `disabled` in AutonomyBar.\n */\nexport function paletteBlock(p: { status: AuthorityStatusV1 | null; reason: string | null; readOnly: boolean; busy: boolean }): string | null {\n if (p.readOnly) return 'Read-only session: this server was started without dispatch, so autonomy cannot be changed from here.';\n if (!p.status) return p.reason ?? 'The autonomy state has not been read yet, so nothing was changed.';\n if (p.busy) return 'Another autonomy action is still running. Try again when it finishes.';\n return null;\n}\n\nfunction usePaletteCommands({ read, status, budgetMode, actions, chip, onSwitch, openGrant }: PaletteWiring): void {\n // Registered only once the authority read has answered (value OR a reason):\n // a command parked while Command mounts must be judged against a real\n // status, never the empty one of the first render.\n const ready = read !== undefined;\n const block = () => paletteBlock({ status, reason: read?.reason ?? null, readOnly: actions.readOnly, busy: actions.busy });\n\n const toSwitch = (to: AutonomySwitch) => () => {\n const why = block();\n if (why || !status) {\n shellNotify(why ?? 'The autonomy state is unknown, so nothing was changed.', 'neutral');\n return;\n }\n if (status.switch === to) {\n shellNotify(`Autonomy is already ${SWITCH_LABEL[to]}.`, 'neutral');\n return;\n }\n // The bar's own click path: lower / raise within the grant → POST;\n // past the grant → the Touch ID sheet, which says why it opened.\n onSwitch(to);\n };\n useCommandHandler('autonomy.off', toSwitch('off'), ready);\n useCommandHandler('autonomy.propose', toSwitch('propose'), ready);\n useCommandHandler('autonomy.autonomous', toSwitch('autonomous'), ready);\n\n useCommandHandler(\n 'autonomy.grant',\n () => {\n const why = block();\n if (why) {\n shellNotify(why, 'neutral');\n return;\n }\n // The chip decides, exactly as a click on it would: nothing to approve\n // while an active grant has days left — say so rather than draft a\n // replacement nobody asked for.\n if (!chip.action) {\n shellNotify(chip.detail, 'neutral');\n return;\n }\n openGrant(chip.action, chip.detail);\n },\n ready,\n );\n\n // 3.14 \"Re-approve grant…\": renew a grant that is still continuable (active,\n // paused, expired) through the SAME sheet — the server drafts it as a\n // re-approval that continues the ladder. Nothing to continue → say so.\n useCommandHandler(\n 'autonomy.reapprove',\n () => {\n const why = block();\n if (why || !status) {\n shellNotify(why ?? 'The autonomy state is unknown, so nothing was changed.', 'neutral');\n return;\n }\n const state = status.grant.state;\n if (state !== 'active' && state !== 'paused' && state !== 'expired') {\n shellNotify('There is no grant to re-approve. Use \"Approve grant…\" to sign a new one.', 'neutral');\n return;\n }\n openGrant(\n 're-approve',\n state === 'active'\n ? `${chip.detail} Re-approving signs a fresh 30 days and continues the rollout from its current stage.`\n : chip.detail,\n );\n },\n ready,\n );\n\n const toBudget = (mode: BudgetMode) => () => {\n // Budget does not need the authority read to be present — only to know\n // the ceiling — but a read-only or busy surface refuses it like the pill.\n if (actions.readOnly || actions.busy) {\n shellNotify(block() ?? 'Budget cannot be changed right now.', 'neutral');\n return;\n }\n if (budgetMode === mode) {\n shellNotify(`Budget is already ${MODE_WORD[mode]}.`, 'neutral');\n return;\n }\n // BudgetSheet's rule: an active grant's mode ceiling disables the modes above it.\n const ceiling = status?.grant.state === 'active' ? status.grant.maxMode : null;\n if (ceiling && modeAboveCeiling(mode, ceiling)) {\n shellNotify(`Your grant allows up to ${MODE_WORD[ceiling]}, so ${MODE_WORD[mode]} is unavailable. A new grant can raise the ceiling.`, 'neutral');\n return;\n }\n actions.act(() => updateBudget({ mode }), `Switch the budget to ${MODE_WORD[mode]}`, {\n onDone: () => shellNotify(`Budget set to ${MODE_WORD[mode]}.`, 'success'),\n });\n };\n useCommandHandler('budget.all-in', toBudget('all-in'), ready);\n useCommandHandler('budget.balanced', toBudget('balanced'), ready);\n useCommandHandler('budget.reserve', toBudget('reserve'), ready);\n}\n\nexport function BudgetPill({ mode, onOpen }: { mode: BudgetMode | null; onOpen: () => void }) {\n return (\n <button type=\"button\" className={styles.pill} aria-haspopup=\"dialog\" onClick={onOpen}>\n <span className={styles.pillLabel}>Budget</span>\n <span>{mode ? MODE_WORD[mode] : '—'}</span>\n <IconChevronDown width={14} height={14} aria-hidden=\"true\" />\n </button>\n );\n}\n\nexport function GrantChip({ chip, onOpen }: { chip: ReturnType<typeof grantChip>; onOpen: (intent: GrantIntent) => void }) {\n const body: ReactNode = (\n <>\n <ChipDot tone={chip.tone} />\n <span className={styles.pillLabel}>Grant</span>\n <span>{chip.label}</span>\n </>\n );\n if (!chip.action) {\n return (\n <span className={styles.chip} data-tone={chip.tone} title={chip.detail} aria-label={`Grant: ${chip.label}. ${chip.detail}`} role=\"status\">\n {body}\n </span>\n );\n }\n const intent = chip.action;\n return (\n <button type=\"button\" className={styles.chip} data-tone={chip.tone} title={chip.detail} aria-haspopup=\"dialog\" onClick={() => onOpen(intent)} aria-label={`Grant: ${chip.label}. ${chip.detail}`}>\n {body}\n </button>\n );\n}\n\nfunction BudgetSheet({ open, onClose, status }: { open: boolean; onClose: () => void; status: AuthorityStatusV1 | null }) {\n const max = status?.grant.state === 'active' ? status.grant.maxMode : null;\n return (\n <Sheet\n open={open}\n onClose={onClose}\n titleId=\"command-budget-sheet\"\n width={560}\n title=\"Budget\"\n description={\n max\n ? `Your grant allows up to ${MODE_WORD[max]}. Autonomy never spends past it, whatever is selected here — moving toward Reserve is always instant.`\n : 'No active grant: autonomy only proposes. The budget still decides which seats it would use.'\n }\n >\n {/* The grant's ceiling disables the modes above it (A9 control, C7 request). */}\n {open ? <BudgetControl maxMode={max} /> : null}\n </Sheet>\n );\n}\n","/*\n * routes/verse/fleet/fleet-control.module.css — the Fleet tab's control\n * surface (3.15): the header, the blocker, the facts row, the runs and queue.\n * Tokens only (style-scan-310).\n */\n.control {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n padding: var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n}\n\n.control[data-state='blocked'],\n.control[data-state='stopped'] {\n border-color: var(--status-danger-solid);\n}\n\n.head {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n}\n\n.headline {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n margin: 0;\n min-width: 0;\n font-size: var(--text-lg-size);\n line-height: var(--text-lg-line);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.stateWord {\n font-weight: var(--font-weight-semibold);\n}\n\n.dot {\n width: 10px;\n height: 10px;\n flex: none;\n border-radius: var(--radius-full);\n background: var(--status-neutral-solid);\n}\n\n.dot[data-tone='running'] {\n background: var(--status-running-solid);\n}\n.dot[data-tone='ok'] {\n background: var(--status-success-solid);\n}\n.dot[data-tone='warning'] {\n background: var(--status-warning-solid);\n}\n.dot[data-tone='danger'] {\n background: var(--status-danger-solid);\n}\n.dot[data-tone='muted'] {\n background: var(--status-unknown-solid);\n}\n\n.buttons,\n.inlineButtons {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--space-2);\n}\n\n.kbd {\n margin-left: var(--space-2);\n color: var(--text-tertiary);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n}\n\n.blocker {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-3);\n padding: var(--space-3);\n border-radius: var(--radius-md);\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n.blockerReason {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.blockerCommand {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n}\n\n.did {\n margin: 0;\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n margin-left: var(--space-2);\n padding: 0;\n border: 0;\n background: none;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n\n.link:hover {\n text-decoration: underline;\n}\n\n.link:disabled {\n color: var(--text-disabled);\n cursor: default;\n text-decoration: none;\n}\n\n.link:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}\n\n.progress {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface-raised);\n}\n\n.progress[data-phase='failed'] {\n border-color: var(--status-danger-solid);\n}\n\n.progress[data-phase='done'] {\n border-color: var(--status-success-solid);\n}\n\n.progressLine {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n\n.command {\n display: block;\n overflow-x: auto;\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-code);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n white-space: pre;\n}\n\n.output pre {\n max-height: 240px;\n overflow: auto;\n margin: var(--space-2) 0 0;\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-code);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.output summary {\n cursor: pointer;\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n}\n\n.facts {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: var(--space-3);\n margin: 0;\n}\n\n.fact {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.fact dt,\n.fact dd {\n margin: 0;\n}\n\n.factValue {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-variant-numeric: tabular-nums;\n}\n\n.factSub {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.factValue .link {\n margin-left: 0;\n align-self: flex-start;\n}\n\n/* ---- runs, queue, goals ------------------------------------------------ */\n.list {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.row {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) 0;\n border-top: 1px solid var(--border-subtle);\n}\n\n.row:first-child {\n border-top: 0;\n}\n\n.rowHead {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.rowTitle {\n margin: 0;\n min-width: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n overflow-wrap: anywhere;\n}\n\n.rowMeta {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.rowControls {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n}\n\n.log {\n max-height: 280px;\n overflow: auto;\n margin: 0;\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-code);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.interject {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.textarea {\n width: 100%;\n min-height: 64px;\n padding: var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n resize: vertical;\n}\n\n.textarea:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 1px;\n}\n\n.directive {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n gap: var(--space-2);\n}\n\n.directive > :first-child {\n flex: 1 1 240px;\n}\n\n.sectionLabel {\n margin: var(--space-3) 0 0;\n}\n\n@media (max-width: 480px) {\n .control {\n padding: var(--space-3);\n }\n .buttons {\n width: 100%;\n }\n}\n\n/* ---- Command's one line about the fleet (FleetStatusLink.tsx) ---------- */\n.statusLink {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n}\n\n.statusLink[data-state='blocked'],\n.statusLink[data-state='stopped'] {\n border-color: var(--status-danger-solid);\n}\n\n.statusLinkLine {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n margin: 0;\n min-width: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n","/**\n * routes/verse/fleet/live-model.ts — FleetLiveSnapshotV1 → chart props\n * (unit C7; SPEC-310B §6 Fleet, SPEC-310C §5). Shared by Command's 12 h\n * swimlane and every Fleet card, so both make the same decisions:\n *\n * - rows are LANES × SLOTS: runs overlapping in one lane stack into\n * numbered slot rows (\"Grok · 2\"), so a bar never hides behind another;\n * - bar colour is STATUS (running amber, merged green, reverted red …);\n * the lane's ENGINE is the tick + monogram beside its label;\n * - queued and parked work draws as an outline (it holds a place; nothing\n * runs) — the Parked Gantt runs from \"parked since\" to `nextEligibleAt`,\n * and an unknown `nextEligibleAt` stays open-ended with \"unknown\" in words.\n *\n * Framework-free; tested directly.\n */\nimport type { FleetEngine, FleetGateFunnel, FleetLaneState, FleetLiveRun, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { SeatDecision } from '../../../../core/routing/types.js';\nimport type { ChartEngine, ChartTone } from '../../../components/charts/colors.js';\nimport { CHART_NEUTRAL, seriesColor } from '../../../components/charts/colors.js';\nimport type { SwimlaneLane } from '../../../components/charts/Swimlane.js';\nimport type { FunnelStage } from '../../../components/charts/Funnel.js';\nimport type { BarStackSegment } from '../../../components/charts/BarStack.js';\nimport { laneReasonText, localTimes } from './why-seat-model.js';\n\nexport const LANE_ENGINE: Readonly<Record<FleetEngine, ChartEngine>> = {\n local: 'local',\n 'grok-cli': 'grok',\n 'claude-cli': 'claude',\n codex: 'codex',\n 'devin-cli': 'devin',\n};\n\nexport const LANE_LABEL: Readonly<Record<FleetEngine, string>> = {\n local: 'Local',\n 'grok-cli': 'Grok',\n 'claude-cli': 'Claude',\n codex: 'Codex',\n 'devin-cli': 'Devin CLI',\n};\n\n/** A lane chip's words: \"Local · off\", \"Grok · 1/2\". The why is a separate line (`laneNotes`). */\nexport function laneChipText(lane: FleetLaneState): { name: string; slots: string } {\n return { name: LANE_LABEL[lane.lane], slots: lane.slots === 0 ? 'off' : `${lane.busy}/${lane.slots}` };\n}\n\nexport interface LaneNote {\n /** The lanes this reason applies to, in strip order. */\n lanes: FleetEngine[];\n /** True when every lane shares it — then it is said once, without names. */\n all: boolean;\n reason: string;\n}\n\n/** A lane's cap reason as the operator reads it (`laneReasonText`); null when it has none. */\nexport function laneReason(lane: FleetLaneState): string | null {\n const reason = lane.capReason?.trim();\n return reason ? laneReasonText(reason) : null;\n}\n\n/**\n * Each distinct lane cap reason ONCE, with the lanes it covers, in the plain\n * words the server already wrote. A dark fleet gives every lane the same sentence; 3.10.0\n * repeated it inside every chip and truncated it there.\n */\nexport function laneNotes(lanes: readonly FleetLaneState[]): LaneNote[] {\n const byReason = new Map<string, FleetEngine[]>();\n for (const lane of lanes) {\n const reason = laneReason(lane);\n if (!reason) continue;\n const list = byReason.get(reason) ?? [];\n list.push(lane.lane);\n byReason.set(reason, list);\n }\n return [...byReason.entries()].map(([reason, covered]) => ({\n lanes: covered,\n all: covered.length === lanes.length && lanes.length > 1,\n reason,\n }));\n}\n\n/** The word a bar is labelled with: the outcome once it ended, else the phase. */\nexport function runStatus(run: FleetLiveRun): string {\n if (run.phase === 'queued' || run.phase === 'parked') return run.phase;\n if (run.phase === 'reverting') return 'reverting';\n return run.outcome ?? run.phase;\n}\n\nconst TONES: Readonly<Record<string, ChartTone>> = {\n producing: 'running',\n verifying: 'running',\n judging: 'running',\n landing: 'running',\n watching: 'info',\n reverting: 'danger',\n merged: 'success',\n proposed: 'info',\n 'owner-lane': 'warning',\n refused: 'warning',\n failed: 'danger',\n reverted: 'danger',\n cancelled: 'neutral',\n queued: 'neutral',\n parked: 'neutral',\n};\n\nexport function runTone(status: string): ChartTone {\n return TONES[status] ?? 'unknown';\n}\n\nfunction startOf(run: FleetLiveRun): number | null {\n const t = Date.parse(run.startedAt ?? run.phaseStartedAt ?? '');\n return Number.isFinite(t) ? t : null;\n}\n\nfunction endOf(run: FleetLiveRun): number | null {\n if (!run.endedAt) return null;\n const t = Date.parse(run.endedAt);\n return Number.isFinite(t) ? t : null;\n}\n\nfunction runDetail(run: FleetLiveRun): string {\n const where = run.repo.includes('/') ? run.repo.split('/')[1] : run.repo;\n return [where, run.title, run.model, run.prNumber ? `PR #${run.prNumber}` : null].filter(Boolean).join(' · ');\n}\n\nconst LANE_ORDER: readonly (FleetEngine | 'none')[] = ['local', 'grok-cli', 'claude-cli', 'codex', 'devin-cli', 'none'];\n\n/**\n * Runs within [from, now] packed into lane × slot rows. `parkedAsGantt`\n * leaves parked runs out (the Fleet surface draws them in their own Gantt);\n * Command keeps them in, as outlines.\n */\nexport function laneRows(runs: readonly FleetLiveRun[], from: number, now: number, opts: { includeParked?: boolean } = {}): SwimlaneLane[] {\n const includeParked = opts.includeParked ?? true;\n const byLane = new Map<FleetEngine | 'none', FleetLiveRun[]>();\n for (const run of runs) {\n if (!includeParked && run.phase === 'parked') continue;\n const s = startOf(run);\n if (s === null) continue;\n const e = endOf(run) ?? now;\n if (e < from || s > now) continue;\n const key = run.lane ?? 'none';\n if (!byLane.has(key)) byLane.set(key, []);\n byLane.get(key)!.push(run);\n }\n const lanes: SwimlaneLane[] = [];\n for (const key of LANE_ORDER) {\n const list = byLane.get(key);\n if (!list?.length) continue;\n list.sort((a, b) => startOf(a)! - startOf(b)!);\n const slotEnds: number[] = [];\n const slotItems: FleetLiveRun[][] = [];\n for (const run of list) {\n const s = startOf(run)!;\n const e = endOf(run) ?? now;\n let slot = slotEnds.findIndex((end) => end <= s);\n if (slot === -1) {\n slot = slotEnds.length;\n slotEnds.push(e);\n slotItems.push([]);\n } else {\n slotEnds[slot] = e;\n }\n slotItems[slot]!.push(run);\n }\n const name = key === 'none' ? 'Unassigned' : LANE_LABEL[key];\n slotItems.forEach((items, i) => {\n lanes.push({\n id: `${key}:${i}`,\n label: slotItems.length > 1 ? `${name} · ${i + 1}` : name,\n ...(key === 'none' ? {} : { engine: LANE_ENGINE[key] }),\n items: items.map((run) => ({\n id: run.id,\n start: startOf(run)!,\n end: endOf(run),\n status: runStatus(run),\n detail: runDetail(run),\n })),\n });\n });\n }\n return lanes;\n}\n\nexport interface GanttRow {\n lanes: SwimlaneLane[];\n from: number;\n to: number;\n /** Rows whose release time is unknown (drawn open-ended). */\n unknownRelease: number;\n}\n\n/**\n * The Parked Gantt: one row per parked item, from when it parked to when its\n * seat should free up. The window always shows \"now\" plus the furthest known\n * release (capped at 48 h — a week-long wait still reads, it just runs off\n * the right edge and the table carries the exact time).\n */\nexport function parkedGantt(runs: readonly FleetLiveRun[], now: number): GanttRow {\n const parked = runs.filter((r) => r.phase === 'parked' || r.hold !== null);\n const releases = parked.map((r) => (r.hold?.nextEligibleAt ? Date.parse(r.hold.nextEligibleAt) : NaN)).filter(Number.isFinite);\n const starts = parked.map((r) => startOf(r) ?? now);\n const from = Math.min(now - 60 * 60_000, ...starts);\n const to = Math.min(now + 48 * 3_600_000, Math.max(now + 2 * 3_600_000, ...releases));\n let unknownRelease = 0;\n const lanes: SwimlaneLane[] = parked.map((r) => {\n const release = r.hold?.nextEligibleAt ? Date.parse(r.hold.nextEligibleAt) : NaN;\n if (!Number.isFinite(release)) unknownRelease++;\n const where = r.repo.includes('/') ? r.repo.split('/')[1] : r.repo;\n return {\n id: r.id,\n label: `${where}: ${r.title}`,\n ...(r.lane ? { engine: LANE_ENGINE[r.lane] } : {}),\n items: [{\n id: r.id,\n start: startOf(r) ?? now,\n end: Number.isFinite(release) ? release : null,\n status: r.hold?.kind === 'split' ? 'split' : 'parked',\n outline: true,\n detail: `${localTimes(r.hold?.reason ?? 'parked', now)}${Number.isFinite(release) ? '' : ' · release time unknown'}`,\n }],\n };\n });\n return { lanes, from, to, unknownRelease };\n}\n\n// ---------------------------------------------------------------------------\n// Gate funnel + refusal reasons\n// ---------------------------------------------------------------------------\n\n/** Gate names in operator words (the funnel's stage labels). */\nexport const GATE_LABEL: Readonly<Record<string, string>> = {\n G0: 'Authority',\n G1: 'Protected paths',\n G1b: 'Tamper',\n G2: 'Scope',\n G3: 'Verify',\n G4: 'Claims',\n G5: 'Blast radius',\n G6: 'Judge or elite',\n G7: 'GitHub checks',\n};\n\n/** Entered G0, then how many passed each gate — a strictly narrowing pipeline. */\nexport function funnelStages(funnel: FleetGateFunnel | null): FunnelStage[] {\n if (!funnel || funnel.stages.length === 0) return [];\n return [\n { id: 'entered', label: 'Proposals', value: funnel.stages[0]!.entered },\n ...funnel.stages.map((s) => ({ id: s.gate, label: `${s.gate} ${GATE_LABEL[s.gate] ?? ''}`.trim(), value: s.passed })),\n ];\n}\n\nexport interface RefusalStack {\n categories: string[];\n segments: BarStackSegment[];\n values: (number | null)[][];\n total: number;\n}\n\n/**\n * Refusals per gate, stacked by reason. The top five reasons (by count over\n * the window) keep FIXED identity slots — a reason's colour never changes\n * when another is filtered out — and the rest fold into a neutral \"Other\".\n */\nexport function refusalStack(funnel: FleetGateFunnel | null, topN = 5): RefusalStack {\n if (!funnel) return { categories: [], segments: [], values: [], total: 0 };\n const totals = new Map<string, { reason: string; count: number }>();\n for (const s of funnel.stages) for (const r of s.refusals) {\n const prev = totals.get(r.code);\n totals.set(r.code, { reason: prev?.reason ?? r.reason, count: (prev?.count ?? 0) + r.count });\n }\n const ranked = [...totals.entries()].sort((a, b) => b[1].count - a[1].count || a[0].localeCompare(b[0]));\n const top = ranked.slice(0, topN).map(([code]) => code);\n const hasOther = ranked.length > topN;\n const segments: BarStackSegment[] = [\n ...top.map((code, i) => ({ id: code, label: totals.get(code)!.reason, color: seriesColor(i) })),\n ...(hasOther ? [{ id: '__other', label: 'Other reasons', color: CHART_NEUTRAL }] : []),\n ];\n const stages = funnel.stages.filter((s) => s.refusals.length > 0 || s.entered !== s.passed);\n return {\n categories: stages.map((s) => s.gate),\n segments,\n values: stages.map((s) => {\n const row = top.map((code) => s.refusals.find((r) => r.code === code)?.count ?? 0);\n if (hasOther) row.push(s.refusals.filter((r) => !top.includes(r.code)).reduce((n, r) => n + r.count, 0));\n return row;\n }),\n total: ranked.reduce((n, [, v]) => n + v.count, 0),\n };\n}\n\n/**\n * No run of any kind and no proposal at the gates: every chart card on Fleet\n * (live swimlane, gate funnel, refusals, parked) would be an empty state.\n */\nexport function nothingToDraw(fleet: FleetLiveSnapshotV1): boolean {\n return fleet.runs.length === 0 && funnelStages(fleet.funnel).length === 0 && refusalStack(fleet.funnel).total === 0;\n}\n\n/** The newest seat decision behind a live dispatch (\"why this seat\"). */\nexport function latestDecision(fleet: FleetLiveSnapshotV1 | null): { decision: SeatDecision; run: FleetLiveRun } | null {\n if (!fleet) return null;\n const withDecision = fleet.runs.filter((r) => r.seatDecision !== null);\n if (!withDecision.length) return null;\n withDecision.sort((a, b) => (startOf(b) ?? 0) - (startOf(a) ?? 0));\n const run = withDecision[0]!;\n return { decision: run.seatDecision!, run };\n}\n"],"mappings":"4/BAsCA,eAAsB,GAAe,EAAoC,EAAuB,EAAoD,CAClJ,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAA4B,EAAsB,CAAE,OAAM,QAAO,GAAI,IAAgB,IAAA,GAAY,CAAC,EAAI,CAAE,aAAY,CAAG,EAAG,CAAK,EAEpJ,OADA,EAAkB,EACX,CACT,CAEA,IAAM,GAAuC,CAC3C,aAAc,2BACd,MAAO,QACP,WAAY,kBACZ,MAAO,QACP,YAAa,YACb,MAAO,cACT,EAEM,GAAyC,CAAE,QAAS,UAAW,SAAU,WAAY,SAAU,QAAS,EAE9G,SAAS,EAAU,EAAoB,EAAU,EAAkB,CACjE,OAAO,EAAM,EAAK,SAAS,CAAK,EAAI,CAAC,GAAG,CAAI,EAAI,CAAC,GAAG,EAAM,CAAK,EAAK,EAAK,OAAQ,GAAM,IAAM,CAAK,CACpG,CAEA,SAAS,GAAO,EAAoC,CAClD,IAAM,EAAI,KAAK,OAAO,KAAK,MAAM,EAAM,QAAQ,SAAS,EAAI,KAAK,MAAM,EAAM,QAAQ,QAAQ,GAAK,KAAU,EAC5G,OAAO,OAAO,SAAS,CAAC,GAAK,EAAI,EAAI,EAAI,EAC3C,CAWA,SAAgB,GAAiB,CAAE,QAAO,OAAM,YAAW,UAAS,UAAiC,CACnG,IAAM,EAAO,EAAM,SACb,EAAI,EAAM,QACV,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,KAAyB,EAAE,MAAM,IAAK,GAAM,EAAE,aAAa,CAAC,EAChF,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,KAAyB,CAAC,GAAG,EAAE,OAAO,CAAC,EAC/D,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,KAAyB,CAAC,GAAG,EAAE,OAAO,OAAO,CAAC,EACtE,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAqB,EAAE,MAAM,OAAO,EACtD,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAiB,OAAO,EAAE,MAAM,gBAAgB,CAAC,EACzE,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAiB,OAAO,GAAO,CAAK,CAAC,CAAC,EACxD,EAAM,CAAE,SAAA,EAAS,EAAA,MAAA,CAAM,EAAG,MAAA,EAAM,EAAA,MAAA,CAAM,EAAG,MAAA,EAAM,EAAA,MAAA,CAAM,CAAE,EAC7D,GAAI,CAAC,EACH,OAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,SAAA,sFAAuF,CAAA,EAEhI,IAAM,EAAW,OAAO,CAAO,EACzB,EAAQ,OAAO,CAAI,EACnB,EAAQ,EAAM,OAAS,GAAK,EAAQ,OAAS,GAAK,OAAO,UAAU,CAAQ,GAAK,GAAY,GAAK,OAAO,UAAU,CAAK,GAAK,GAAS,GAAK,GAAS,EAAK,QAE9J,SAAS,GAAgB,CACvB,EAAU,CACR,QACS,UACT,cAAe,EACf,QAAS,EACT,iBAAkB,EAClB,KAAM,CACR,CAAC,CACH,CAEA,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAa,aAAW,uBAA/C,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,WAAD,CAAU,UAAW,EAAO,cAA5B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,UAAQ,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,CAAY,iBAAe,EAAM,OAAO,IAAE,EAAK,MAAM,OAAO,GAAa,CAAA,CAAA,CAAS,CAAA,EACzF,EAAK,MAAM,IAAK,IACf,EAAA,EAAA,KAAA,CAAC,QAAD,CAAkB,UAAW,EAAO,WAApC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,EAAM,SAAS,CAAI,EAAG,SAAW,GAAM,EAAS,EAAO,EAAO,EAAM,EAAE,OAAO,OAAO,CAAC,CAAI,CAAA,GACzH,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAO,SAAA,CAAW,CAAA,CACrC,CAHK,EAAA,CAGL,CACR,GACD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,SAAA,6EAA8E,CAAA,CACtG,KACV,EAAA,EAAA,KAAA,CAAC,WAAD,CAAU,UAAW,EAAO,cAA5B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,UAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAY,SAAmB,CAAA,CAAS,CAAA,EAC/C,EAAK,QAAQ,IAAK,IACjB,EAAA,EAAA,KAAA,CAAC,QAAD,CAAoB,UAAW,EAAO,WAAtC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,EAAQ,SAAS,CAAM,EAAG,SAAW,GAAM,EAAW,EAAO,EAAS,EAAQ,EAAE,OAAO,OAAO,CAAC,CAAI,CAAA,GACnI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAa,IAAW,CAAa,CAAA,CACvC,CAHK,EAAA,CAGL,CACR,CACO,KACV,EAAA,EAAA,KAAA,CAAC,WAAD,CAAU,UAAW,EAAO,cAA5B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,UAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAY,gBAA0B,CAAA,CAAS,CAAA,EACtD,EAAK,cAAc,IAAK,IACvB,EAAA,EAAA,KAAA,CAAC,QAAD,CAAe,UAAW,EAAO,WAAjC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,EAAQ,SAAS,CAAC,EAAG,SAAW,GAAM,EAAW,EAAO,EAAS,EAAG,EAAE,OAAO,OAAO,CAAC,CAAI,CAAA,GACzH,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,SAAO,EAAG,IAAM,IAAM,6BAA+B,uCAA8C,CAAA,CAAA,CACpG,CAHK,EAAA,CAGL,CACR,CACO,KACV,EAAA,EAAA,KAAA,CAAC,WAAD,CAAU,UAAW,EAAO,cAA5B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,UAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAY,aAAuB,CAAA,CAAS,CAAA,GACpD,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,WAAY,QAAS,EAAI,KAAlD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,mBAAuB,CAAA,GAC7B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAI,EAAI,KAAM,MAAO,EAAM,SAAW,GAAM,EAAQ,EAAE,OAAO,KAAmB,EACpF,SAAA,CAAC,UAAW,WAAY,QAAQ,CAAC,CAAW,IAAK,IACjD,EAAA,EAAA,IAAA,CAAC,SAAD,CAAgB,MAAO,EAAI,SAAA,GAAW,EAAW,EAApC,CAAoC,CAClD,CACK,CAAA,CACH,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,WAAY,QAAS,EAAI,QAAlD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,yBAA6B,CAAA,GACnC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,GAAI,EAAI,QAAS,KAAK,SAAS,IAAK,EAAG,KAAM,EAAG,UAAU,UAAU,MAAO,EAAS,SAAW,GAAM,EAAW,EAAE,OAAO,KAAK,CAAI,CAAA,CACpI,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,WAAY,QAAS,EAAI,KAAlD,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,4BAA0B,EAAK,QAAQ,GAAO,CAAA,CAAA,GACpD,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,GAAI,EAAI,KAAM,KAAK,SAAS,IAAK,EAAG,IAAK,EAAK,QAAS,KAAM,EAAG,UAAU,UAAU,MAAO,EAAM,SAAW,GAAM,EAAQ,EAAE,OAAO,KAAK,CAAI,CAAA,CAC9I,GACC,KACV,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAxB,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,QAAS,EAAS,SAAA,2BAE5C,CAAA,EACN,MACJ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,QAAS,EAAS,SAAU,CAAC,EAAa,OAAM,SAAA,qBAE3E,CAAA,CACJ,IACJ,EAA+H,MAAvH,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CAAgC,+DAA6D,EAAK,QAAQ,QAAS,CAAI,CAAA,CAC9H,GAET,CAEA,IAAM,GAA6D,CAAE,MAAO,QAAS,SAAU,WAAY,QAAS,SAAU,EAG9H,SAAgB,GAAU,CAAE,SAAiD,CAU3E,OATK,EACD,EAAM,SAAW,GAEjB,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,WAAY,aAAW,UAAlD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAY,+BAAyC,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,SAAA,mCAAoC,CAAA,CAC7D,KAIX,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,WAAY,aAAW,UAAlD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAY,+BAAyC,CAAA,GACrD,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,WAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,UACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,MAAM,MAAM,SAAA,MAAQ,CAAA,GACxB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,MAAM,MAAM,SAAA,KAAO,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,MAAM,MAAM,SAAA,eAAiB,CAAA,GACjC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,MAAM,MAAM,SAAA,WAAa,CAAA,CAC3B,CAAA,CAAA,CACC,CAAA,GACP,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SACG,EAAM,KAAK,EAAM,KAChB,EAAA,EAAA,KAAA,CAAC,KAAD,CAA+B,iBAAgB,EAAK,UAApD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAK,KAAU,CAAA,GACpB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KAAO,SAAA,EAAK,MAAW,CAAA,GAC7C,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KAAO,SAAA,EAAK,KAAU,CAAA,GAC5C,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,cAAe,iBAAgB,EAAK,UAAY,SAAA,GAAe,EAAK,UAAe,CAAA,CACvG,CALK,EAAA,GAAG,EAAK,MAAM,GAAG,GAKtB,CACL,CACI,CAAA,CACF,CACA,CAAA,CAAA,IAhCQ,IAkCrB,CCzJA,IAAM,GAAM,MAEZ,SAAS,GAAQ,EAAqB,CACpC,IAAM,EAAI,KAAK,MAAM,CAAG,EACxB,OAAO,OAAO,SAAS,CAAC,EAAI,IAAI,KAAK,CAAC,CAAC,CAAC,eAAe,QAAS,CAAE,QAAS,QAAS,MAAO,QAAS,IAAK,UAAW,KAAM,UAAW,OAAQ,SAAU,CAAC,EAAI,GAC9J,CAEA,SAAgB,GAAU,EAAmE,CAC3F,IAAM,EAAI,KAAK,MAAM,EAAE,QAAQ,EACzB,EAAI,KAAK,MAAM,EAAE,SAAS,EAChC,OAAO,OAAO,SAAS,CAAC,GAAK,OAAO,SAAS,CAAC,EAAI,KAAK,OAAO,EAAI,GAAK,EAAG,EAAI,IAChF,CAGA,IAAM,EAAwB,eAGjB,EACX,gPAGF,SAAS,GAAU,EAAyB,CAC1C,IAAM,EAAI,EAAE,SACZ,GAAI,EAAE,KAAO,EACX,MAAO,GAAG,EAAE,MAAM,OAAQ,GAAM,EAAE,QAAU,OAAO,CAAC,CAAC,OAAO,MAAM,EAAE,MAAM,OAAO,iBAAiB,EAAE,QAAQ,YAAY,EAAE,SAAS,WAAW,EAAE,SAAS,wEAE3J,IAAM,EAAQ,CACZ,GAAG,EAAE,MAAM,OAAO,OAAO,EAAE,MAAM,SAAW,EAAI,GAAK,MACrD,GAAG,EAAE,QAAQ,OACb,KAAK,EAAE,SAAS,WAAW,EAAE,SAAS,QACtC,KAAK,EAAE,uBAAuB,iBAChC,EACM,EAAO,CAAC,GAAG,EAAE,UAAU,SAAU,GAAG,EAAE,SAAS,IAAK,EAAE,qBAAuB,KAAK,EAAE,qBAAqB,SAAW,KAAM,KAAK,EAAE,iBAAiB,UAAU,CAAC,CAAC,OAAO,OAAO,EAClL,MAAO,GAAG,EAAM,KAAK,KAAK,EAAE,oBAAoB,EAAK,KAAK,IAAI,GAChE,CAEA,SAAgB,GAAW,CAAE,SAAyC,CACpE,IAAM,EAAI,EAAM,QACV,EAAO,GAAU,CAAC,EACxB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,WAAY,aAAW,SAAlD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAY,QAAkB,CAAA,GAC9B,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CACG,IAAS,KAAwB,IAAjB,GAAG,EAAK,OAAa,WAAS,GAAQ,EAAE,SAAS,CACjE,KACH,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CAAgC,kBAChB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAO,SAAA,EAAE,KAAY,CAAA,EAAC,eAAa,EAAE,SAAS,sBACnF,GACI,KAET,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,WAAY,aAAW,eAAlD,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,CAAY,iBAAe,EAAE,MAAM,OAAO,GAAa,CAAA,CAAA,GACvD,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,WAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,UACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,MAAM,MAAM,SAAA,MAAQ,CAAA,GACxB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,MAAM,MAAM,SAAA,OAAS,CAAA,GACzB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,MAAM,MAAM,SAAA,QAAU,CAAA,GAC1B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,MAAM,MAAM,SAAA,MAAQ,CAAA,GACxB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,MAAM,MAAM,UAAW,EAAO,IAAK,SAAA,YAAc,CAAA,CACnD,CAAA,CAAA,CACC,CAAA,GACP,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SACG,EAAE,MAAM,IAAK,IACZ,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KAAO,SAAA,EAAE,aAAkB,CAAA,GACjD,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,QAAU,QAAU,QAAU,SAAc,CAAA,GACnD,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,cAAgB,SAAW,SAAW,YAAiB,CAAA,GAC9D,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,OAAY,CAAA,GACnB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,IAAM,SAAA,EAAE,eAAoB,CAAA,CAChD,CAAA,EANK,EAAE,aAMP,CACL,CACI,CAAA,CACF,KACP,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CAAgC,iBACf,EAAE,MAAM,SAAS,YAAU,EAAE,MAAM,SAAS,8BAA4B,EAAE,MAAM,WAAa,eAAiB,eAAiB,8BAC7I,GACI,KAET,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,WAAY,aAAW,QAAlD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAY,OAAiB,CAAA,GAC7B,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CAAgC,SACvB,EAAE,MAAM,UAAY,SAAW,SAAW,EAAE,MAAM,UAAY,WAAa,WAAa,UAAU,oBAAkB,EAAE,MAAM,iBAAiB,MACnJ,KACH,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,UACnB,SAAA,OAAO,QAAQ,EAAE,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,EAAQ,MAC3C,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAO,SAAA,CAAa,CAAA,EAC3C,EAAK,QAAU,WAAW,EAAK,oBAAoB,WAAa,yBAChE,EAAK,SAAW,EAAK,0BAA4B,IAAA,GAAY,iBAAiB,EAAK,wBAAwB,wBAA0B,GACrI,EAAK,QAAU,MAAM,EAAK,MAAM,KAAK,IAAI,IAAM,EAC9C,CAAA,EALK,CAKL,CACL,CACC,CAAA,CACG,KAET,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,WAAY,aAAW,qBAAlD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAY,oBAA8B,CAAA,GAC1C,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAY,SAAA,EAAE,QAAQ,KAAK,IAAI,GAAK,MAAU,CAAA,GACnE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CAAgC,kBACd,EAAE,OAAO,QAAQ,OAAS,EAAE,OAAO,QAAQ,KAAK,KAAK,EAAI,uBAAuB,0BAAwB,EAAE,OAAO,YAAY,yBAC7H,EAAE,eAAiB,KAAO,KACzC,GACI,KAET,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,WAAY,aAAW,iBAAlD,SAAA,CACG,EAAE,QAAQ,OAAO,KAAM,GAAM,EAAE,KAAO,CAAqB,GAC1D,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAY,cAAwB,CAAA,GACpC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAY,SAAA,CAA2B,CAAA,CAC5D,CAAA,CAAA,GAEF,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,CAAY,mBAAiB,EAAE,QAAQ,OAAO,OAAO,8BAAwC,CAAA,CAAA,GAE/F,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,OACnB,SAAA,EAAE,QAAQ,OAAO,IAAK,IACrB,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAW,SAAA,EAAE,EAAS,CAAA,GAC9C,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAU,CAAC,CAAQ,CAAA,CACxB,CAAA,EAHK,EAAE,EAGP,CACL,CACC,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAClB,SAAA,EAAE,QAAQ,OAAO,SAAW,GAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAO,EAC1D,6LACA,0GACH,CAAA,CACI,KAET,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CAAgC,iBACjB,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,SAAA,CAA+B,EAAM,OAAO,MAAM,EAAG,EAAE,EAAE,GAAO,CAC5E,CAAA,CAAA,GACA,GAET,CAEA,SAAgB,GAAW,CAAE,OAAM,SAAQ,OAAM,OAAM,MAAK,YAAW,UAAS,MAAK,gBAAiC,CACpH,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAItB,OAAO,GAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAyB,UAAiB,SAAc,OAAY,OAAW,MAAgB,YAAoB,UAAS,GAAK,EAAM,CAAE,KAAI,EAAI,CAAC,EAAI,aAAc,IAAiB,EAAO,CAAA,EAAI,IAChN,CAEA,SAAS,GAAe,CAAE,UAAS,SAAQ,OAAM,OAAM,MAAK,YAAW,UAAS,MAAK,gBAAqE,CACxJ,GAAM,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAS,EAAK,EAClC,GAAA,EAAc,EAAA,MAAA,CAAM,EACpB,EAAO,EAAS,EAAQ,EAA2B,EAAqB,CAAE,QAAS,CAAE,CAAC,EACtF,EAAU,EAAK,MAAuD,OAAS,KAG/E,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAoC,IAAI,EAC9D,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAS,IAAiB,EAAI,EACtD,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAAwB,IAAI,EACxD,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAK,EAE5C,EAAmC,GAAU,EAAO,cAAgB,GAAQ,YAAc,EAAS,EACnG,EAAS,EAAK,MAAM,QAAU,KAC9B,EAAU,IAAQ,IAAA,IAAa,GAAQ,WAAa,IAAA,GACpD,EAAa,GAAQ,OAAS,aAAe,EAAO,cAAgB,GAE1E,SAAS,EAAQ,EAAmD,CAClE,GAAI,CAAC,GAAO,CAAC,EAAQ,OACrB,IAAM,EAAO,EAAO,MAAQ,OAC5B,EAAa,IAAI,EACjB,EAAc,EAAI,EAClB,EACE,SAAY,CACV,GAAI,CACF,OAAO,MAAM,GAAe,EAAM,EAAO,EAAO,cAAgB,EAAI,CACtE,OAAS,EAAO,CAEd,OADA,EAAa,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAAC,EAC5D,IACT,QAAU,CACR,EAAc,EAAK,CACrB,CACF,EACA,2BACA,CACE,OAAS,GAAS,CACZ,GAAQ,OAAO,GAAS,UAAY,OAAO,EAAK,QAAW,UAAY,EAAK,cAAgB,EAAO,aAAa,EAAU,CAAI,CACpI,CACF,CACF,CACF,CACA,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,KAAA,GACS,UACA,UACT,MAAO,IACP,MAAO,IAAW,aAAe,gCAAkC,2BACnE,YAAa,EACb,QACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,cAArB,SAAA,CAAoC,yFAEjC,EAAO,uCAAuC,EAAa,GAAM,GAAK,EACtE,CACH,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,QAAS,EAAS,SAAA,QAElC,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,UAAU,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,CAAA,EAAG,SAAU,CAAC,EAAa,OAAM,YAAe,GAAS,EAAU,CAAK,EAAG,SAAA,uBAE9G,CAAA,CACJ,CACH,CAAA,CAAA,IArBT,SAAA,EAwBE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,YAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,GAAS,EAAY,SAAU,GAAc,GAAQ,EAAY,SAAW,GAAM,CAAE,EAAS,EAAE,OAAO,OAAO,EAAG,EAAU,IAAI,EAAG,EAAa,IAAI,CAAG,EAAG,mBAAkB,CAAc,CAAA,EAAC,cAEpN,KACP,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,GAAI,EAAa,UAAW,EAAO,UACnC,SAAA,CACA,CAAA,EACF,EAAK,SAAW,WAAa,CAAC,EAAK,MAClC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,YAAU,OAAO,SAAA,4BAA6B,CAAA,EACxE,GACF,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,GACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,gBAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,gBAAe,EAAS,YAAe,EAAY,GAAM,CAAC,CAAC,EAC1F,SAAA,EAAU,wBAA0B,YAC/B,CAAA,EACP,GAAS,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAW,SAAA,4BAAgC,CAAA,EAAI,IAC9E,CACH,CAAA,EAAA,KACH,GAAW,GAAW,GACrB,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,MAAO,EACP,KAAM,EACN,OAAQ,IAAW,KACnB,UAAW,EACX,YAAe,CACb,EAAU,IAAI,EACd,EAAa,IAAI,CACnB,CACD,CAAA,EACC,KACH,GAAY,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAK,SAAU,SAAA,CAAoB,CAAA,EAAI,MAC9D,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,MAAO,EAAM,IAAO,CAAA,GAC/B,EAAA,EAAA,IAAA,CAAC,GAAD,CAAmB,OAAQ,CAAA,CAC3B,CAAA,CAAA,GAEF,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAK,UAAW,SAAA,GAAU,8CAAyD,CAAA,CAE1F,GAEX,CCjQA,IAAM,EAAwC,CAAE,SAAU,SAAU,SAAU,WAAY,QAAS,SAAU,EAG7G,SAAgB,GAA2B,CACzC,IAAM,EAAQ,EAAY,YAAY,CAAC,EAAE,OAAO,QAChD,MAAO,CACL,MAAO,GAAO,OAAS,kBACvB,KAAM,GAAO,MAAQ,mGACrB,aAAc,GAAO,cAAgB,aACrC,YAAa,EACf,CACF,CAEA,IAAM,GAA8B,CAClC,MAAO,oBACP,KAAM,0FACN,aAAc,eACd,YAAa,EACf,EAEA,SAAgB,EAAQ,CAAE,QAA4B,CACpD,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,YAAW,EAAM,cAAY,MAAQ,CAAA,CAC3E,CAiBA,SAAgB,EAAa,EAAoC,CAC/D,GAAM,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAkG,IAAI,EAEhI,SAAS,EAAQ,EAAkC,CACjD,GAAI,CAAC,EAAO,OACZ,GAAM,CAAE,QAAS,EAKX,EAAS,EAAe,EAAO,EAAM,MAAM,EACjD,EAAQ,QACA,EAAc,CAAE,OAAQ,EAAQ,YAAa,EAAM,MAAO,CAAC,EACjE,IAAW,aAAe,gCAAkC,4BAC5D,CACE,OAAS,GAAS,CAChB,EAAS,IAAI,EAET,GAAQ,GAAQ,EAAY,IAAS,EAAY,EAAK,wBAA0B,IAAS,EAAK,QAChG,EAAQ,QAAU,EAAc,CAAE,OAAQ,SAAU,GAAI,CAAK,CAAC,EAAG,sBAAsB,EAAa,IAAO,CAE/G,CACF,CACF,CACF,CAEA,MAAO,CACL,MAAO,EAAQ,EAAK,EAAO,KAAM,EAAO,CAAC,IAAM,EAAS,CAAE,SAAQ,OAAM,MAAK,KAAM,EAAK,OAAS,EAAK,CAAC,EACvG,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,KAAM,IAAU,KAChB,OAAQ,GAAO,QAAU,QACzB,KAAM,GAAO,MAAQ,KACrB,IAAK,GAAO,KAAO,GACnB,KAAM,EAAQ,KACd,UAAW,EACX,YAAe,EAAS,IAAI,EAC5B,IAAK,EAAQ,IACb,aAAc,GAAO,OAAS,EAC/B,CAAA,CAEL,CACF,CAaA,SAAgB,GAAY,CAAE,OAAM,UAAS,aAAY,UAAS,UAAS,MAAK,aAA+B,CAC7G,IAAM,EAAS,GAAM,OAAS,KACxB,EAAU,EAAa,CAAO,EAC9B,EAAO,GAAa,EAEpB,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAwB,IAAI,EACtD,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAK,EAC5C,EAAc,CAAC,EACf,EAAO,EAAU,EAAQ,CAAG,EAElC,SAAS,EAAS,EAA0B,CAC1C,GAAI,CAAC,EAAQ,OACb,IAAM,EAAS,EAAe,EAAQ,CAAE,EACpC,OAAW,OACf,IAAI,IAAW,oBAAqB,CAClC,IAAM,EAAS,EAAO,MAAM,QAAU,SACtC,EAAK,KACH,EAAS,aAAe,QACxB,EACI,GAAG,EAAO,MAAM,QAAU,uBAAuB,GAAG,EAAa,GAAI,wBACrE,GAAG,EAAa,GAAI,sEACxB,CACF,EACA,MACF,CAEA,EAAQ,QAAU,EAAc,CAAE,OAAQ,SAAU,IAAG,CAAC,EAAG,sBAAsB,EAAa,IAAK,CAFnG,CAGF,CAGA,GAAmB,CAAE,OAAM,SAAQ,aAAY,UAAS,OAAM,WAAU,UAAW,EAAK,IAAK,CAAC,EAE9F,IAAM,EAAmB,EAAT,GAA+C,CAAE,OAAQ,MAAO,sBAAuB,KAAM,CAAC,EACxG,EAAU,GAAQ,MAAQ,GAC1B,EAAW,GAAe,EAAQ,MAAQ,EAAQ,SAElD,GACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAY,MAAO,EAAe,GAAM,QAAU,0BAA6B,IAAA,GAAtG,SAAA,CACI,EAAiF,MAAvE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,cAAY,OAAO,SAAA,UAAc,CAAA,GAC/E,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAK,KACL,aAAW,WACX,MAAO,GAAQ,QAAU,MACzB,SAAU,EACV,QAAS,EAAQ,IAAK,IAAO,CAC3B,MAAO,EAAE,MACT,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAxB,SAAA,CACG,EAAU,EAAE,MAAQ,EAAE,MACtB,EAAE,YAAa,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,UAAW,EAAO,UAAW,MAAO,GAAI,OAAQ,GAAI,cAAY,MAAQ,CAAA,EAAI,IAClG,IAER,UAAW,EAAE,UACb,UACF,EAAE,CACH,CAAA,CACE,IAGD,MAAe,EAAQ,QAAU,EAAc,CAAE,OAAQ,MAAO,CAAC,EAAG,iBAAkB,CAC1F,QAAS,EAAY,EACrB,OAAS,GAAS,EAAY,EAAoB,CAAI,CAAC,CACzD,CAAC,EACK,MAAiB,EAAQ,QAAU,EAAc,CAAE,OAAQ,YAAa,CAAC,EAAG,mBAAoB,CACpG,QAAS,GACT,WAAc,EAAY,IAAI,CAChC,CAAC,EACK,EAAa,EACf,GACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,CAAA,EAAG,SAAA,GAAS,aAAW,mBAA6B,WAAU,QAAS,CAAW,CAAA,GACtI,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,CAAA,EAAa,WAAU,QAAS,EAAU,SAAA,QAAc,CAAA,EAC9G,GACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,CAAA,EAAG,SAAA,GAAS,aAAW,iBAA2B,WAAU,QAAS,CAAS,CAAA,GAClI,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,CAAA,EAAa,WAAU,QAAS,EAAQ,SAAA,MAAY,CAAA,EAE9G,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,KAAK,UAAU,aAAW,oBAAoB,eAAc,GAAW,IAAA,GAAnG,SAAA,CACG,EACC,EAKE,MAJF,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,KAAM,EAAY,WAAc,EAAc,EAAI,CAAI,CAAA,GAClE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,OAAM,OAAS,GAAW,EAAK,KAAK,EAAQ,EAAK,MAAM,CAAI,CAAA,CAC5E,CAAA,CAAA,GAEJ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAY,CAAA,EACnC,CACE,IACJ,GAAW,GAAW,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,SAAU,SAAA,CAAY,CAAA,EAAI,KACjF,GACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,KAAM,EAAY,WAAc,EAAc,EAAI,CAAI,CAAA,GAClE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,OAAM,OAAS,GAAW,EAAK,KAAK,EAAQ,EAAK,MAAM,CAAI,CAAA,CACzE,CACH,CAAA,EAAA,KACH,EAAY,KAAO,EAAQ,OAC5B,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAY,YAAe,EAAc,EAAK,EAAW,QAAS,CAAA,CACrF,CAAA,CAAA,CAEN,CAoBA,SAAgB,EAAa,EAAiH,CAI5I,OAHI,EAAE,SAAiB,wGAClB,EAAE,OACH,EAAE,KAAa,wEACZ,KAFe,EAAE,QAAU,mEAGpC,CAEA,SAAS,GAAmB,CAAE,OAAM,SAAQ,aAAY,UAAS,OAAM,WAAU,aAAkC,CAIjH,IAAM,EAAQ,IAAS,IAAA,GACjB,MAAc,EAAa,CAAE,SAAQ,OAAQ,GAAM,QAAU,KAAM,SAAU,EAAQ,SAAU,KAAM,EAAQ,IAAK,CAAC,EAEnH,EAAY,OAA6B,CAC7C,IAAM,EAAM,EAAM,EAClB,GAAI,GAAO,CAAC,EAAQ,CAClB,EAAY,GAAO,yDAA0D,SAAS,EACtF,MACF,CACA,GAAI,EAAO,SAAW,EAAI,CACxB,EAAY,uBAAuB,EAAa,GAAI,GAAI,SAAS,EACjE,MACF,CAGA,EAAS,CAAE,CACb,EACA,EAAkB,eAAgB,EAAS,KAAK,EAAG,CAAK,EACxD,EAAkB,mBAAoB,EAAS,SAAS,EAAG,CAAK,EAChE,EAAkB,sBAAuB,EAAS,YAAY,EAAG,CAAK,EAEtE,EACE,qBACM,CACJ,IAAM,EAAM,EAAM,EAClB,GAAI,EAAK,CACP,EAAY,EAAK,SAAS,EAC1B,MACF,CAIA,GAAI,CAAC,EAAK,OAAQ,CAChB,EAAY,EAAK,OAAQ,SAAS,EAClC,MACF,CACA,EAAU,EAAK,OAAQ,EAAK,MAAM,CACpC,EACA,CACF,EAKA,EACE,yBACM,CACJ,IAAM,EAAM,EAAM,EAClB,GAAI,GAAO,CAAC,EAAQ,CAClB,EAAY,GAAO,yDAA0D,SAAS,EACtF,MACF,CACA,IAAM,EAAQ,EAAO,MAAM,MAC3B,GAAI,IAAU,UAAY,IAAU,UAAY,IAAU,UAAW,CACnE,EAAY,2EAA4E,SAAS,EACjG,MACF,CACA,EACE,aACA,IAAU,SACN,GAAG,EAAK,OAAO,uFACf,EAAK,MACX,CACF,EACA,CACF,EAEA,IAAM,EAAY,OAA2B,CAG3C,GAAI,EAAQ,UAAY,EAAQ,KAAM,CACpC,EAAY,EAAM,GAAK,sCAAuC,SAAS,EACvE,MACF,CACA,GAAI,IAAe,EAAM,CACvB,EAAY,qBAAqB,EAAU,GAAM,GAAI,SAAS,EAC9D,MACF,CAEA,IAAM,EAAU,GAAQ,MAAM,QAAU,SAAW,EAAO,MAAM,QAAU,KAC1E,GAAI,GAAW,EAAiB,EAAM,CAAO,EAAG,CAC9C,EAAY,2BAA2B,EAAU,GAAS,OAAO,EAAU,GAAM,qDAAsD,SAAS,EAChJ,MACF,CACA,EAAQ,QAAU,EAAa,CAAE,MAAK,CAAC,EAAG,wBAAwB,EAAU,KAAS,CACnF,WAAc,EAAY,iBAAiB,EAAU,GAAM,GAAI,SAAS,CAC1E,CAAC,CACH,EACA,EAAkB,gBAAiB,EAAS,QAAQ,EAAG,CAAK,EAC5D,EAAkB,kBAAmB,EAAS,UAAU,EAAG,CAAK,EAChE,EAAkB,iBAAkB,EAAS,SAAS,EAAG,CAAK,CAChE,CAEA,SAAgB,EAAW,CAAE,OAAM,UAA2D,CAC5F,OACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,KAAM,gBAAc,SAAS,QAAS,EAA9E,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAW,SAAA,QAAY,CAAA,GAC/C,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAO,EAAU,GAAQ,GAAU,CAAA,GAC1C,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,MAAO,GAAI,OAAQ,GAAI,cAAY,MAAQ,CAAA,CACtD,GAEZ,CAEA,SAAgB,EAAU,CAAE,OAAM,UAAyF,CACzH,IAAM,GACJ,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,KAAM,EAAK,IAAO,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAW,SAAA,OAAW,CAAA,GAC9C,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAK,KAAY,CAAA,CACxB,CAAA,CAAA,EAEJ,GAAI,CAAC,EAAK,OACR,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,YAAW,EAAK,KAAM,MAAO,EAAK,OAAQ,aAAY,UAAU,EAAK,MAAM,IAAI,EAAK,SAAU,KAAK,SAC9H,SAAA,CACG,CAAA,EAGV,IAAM,EAAS,EAAK,OACpB,OACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,KAAM,YAAW,EAAK,KAAM,MAAO,EAAK,OAAQ,gBAAc,SAAS,YAAe,EAAO,CAAM,EAAG,aAAY,UAAU,EAAK,MAAM,IAAI,EAAK,SACrL,SAAA,CACK,CAAA,CAEZ,CAEA,SAAS,GAAY,CAAE,OAAM,UAAS,UAAoF,CACxH,IAAM,EAAM,GAAQ,MAAM,QAAU,SAAW,EAAO,MAAM,QAAU,KACtE,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACQ,OACG,UACT,QAAQ,uBACR,MAAO,IACP,MAAM,SACN,YACE,EACI,2BAA2B,EAAU,GAAK,uGAC1C,8FAIL,SAAA,GAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,QAAS,CAAM,CAAA,EAAI,IACrC,CAAA,CAEX,0hCEvYa,EAA0D,CACrE,MAAO,QACP,WAAY,OACZ,aAAc,SACd,MAAO,QACP,YAAa,OACf,EAEa,EAAoD,CAC/D,MAAO,QACP,WAAY,OACZ,aAAc,SACd,MAAO,QACP,YAAa,WACf,EAGA,SAAgB,GAAa,EAAuD,CAClF,MAAO,CAAE,KAAM,EAAW,EAAK,MAAO,MAAO,EAAK,QAAU,EAAI,MAAQ,GAAG,EAAK,KAAK,GAAG,EAAK,OAAQ,CACvG,CAWA,SAAgB,EAAW,EAAqC,CAC9D,IAAM,EAAS,EAAK,WAAW,KAAK,EACpC,OAAO,EAAS,GAAe,CAAM,EAAI,IAC3C,CAOA,SAAgB,GAAU,EAA8C,CACtE,IAAM,EAAW,IAAI,IACrB,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAS,EAAW,CAAI,EAC9B,GAAI,CAAC,EAAQ,SACb,IAAM,EAAO,EAAS,IAAI,CAAM,GAAK,CAAC,EACtC,EAAK,KAAK,EAAK,IAAI,EACnB,EAAS,IAAI,EAAQ,CAAI,CAC3B,CACA,MAAO,CAAC,GAAG,EAAS,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAQ,MAAc,CACzD,MAAO,EACP,IAAK,EAAQ,SAAW,EAAM,QAAU,EAAM,OAAS,EACvD,QACF,EAAE,CACJ,CAGA,SAAgB,GAAU,EAA2B,CAGnD,OAFI,EAAI,QAAU,UAAY,EAAI,QAAU,SAAiB,EAAI,MAC7D,EAAI,QAAU,YAAoB,YAC/B,EAAI,SAAW,EAAI,KAC5B,CAEA,IAAM,GAA6C,CACjD,UAAW,UACX,UAAW,UACX,QAAS,UACT,QAAS,UACT,SAAU,OACV,UAAW,SACX,OAAQ,UACR,SAAU,OACV,aAAc,UACd,QAAS,UACT,OAAQ,SACR,SAAU,SACV,UAAW,UACX,OAAQ,UACR,OAAQ,SACV,EAEA,SAAgB,GAAQ,EAA2B,CACjD,OAAO,GAAM,IAAW,SAC1B,CAEA,SAAS,EAAQ,EAAkC,CACjD,IAAM,EAAI,KAAK,MAAM,EAAI,WAAa,EAAI,gBAAkB,EAAE,EAC9D,OAAO,OAAO,SAAS,CAAC,EAAI,EAAI,IAClC,CAEA,SAAS,EAAM,EAAkC,CAC/C,GAAI,CAAC,EAAI,QAAS,OAAO,KACzB,IAAM,EAAI,KAAK,MAAM,EAAI,OAAO,EAChC,OAAO,OAAO,SAAS,CAAC,EAAI,EAAI,IAClC,CAEA,SAAS,GAAU,EAA2B,CAE5C,MAAO,CADO,EAAI,KAAK,SAAS,GAAG,EAAI,EAAI,KAAK,MAAM,GAAG,CAAC,CAAC,GAAK,EAAI,KACrD,EAAI,MAAO,EAAI,MAAO,EAAI,SAAW,OAAO,EAAI,WAAa,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,CAC9G,CAEA,IAAM,GAAgD,CAAC,QAAS,WAAY,aAAc,QAAS,YAAa,MAAM,EAOtH,SAAgB,GAAS,EAA+B,EAAc,EAAa,EAAoC,CAAC,EAAmB,CACzI,IAAM,EAAgB,EAAK,eAAiB,GACtC,EAAS,IAAI,IACnB,IAAK,IAAM,KAAO,EAAM,CACtB,GAAI,CAAC,GAAiB,EAAI,QAAU,SAAU,SAC9C,IAAM,EAAI,EAAQ,CAAG,EAGrB,GAFI,IAAM,OACA,EAAM,CAAG,GAAK,GAChB,GAAQ,EAAI,EAAK,SACzB,IAAM,EAAM,EAAI,MAAQ,OACnB,EAAO,IAAI,CAAG,GAAG,EAAO,IAAI,EAAK,CAAC,CAAC,EACxC,EAAO,IAAI,CAAG,CAAC,CAAE,KAAK,CAAG,CAC3B,CACA,IAAM,EAAwB,CAAC,EAC/B,IAAK,IAAM,KAAO,GAAY,CAC5B,IAAM,EAAO,EAAO,IAAI,CAAG,EAC3B,GAAI,CAAC,GAAM,OAAQ,SACnB,EAAK,MAAM,EAAG,IAAM,EAAQ,CAAC,EAAK,EAAQ,CAAC,CAAE,EAC7C,IAAM,EAAqB,CAAC,EACtB,EAA8B,CAAC,EACrC,IAAK,IAAM,KAAO,EAAM,CACtB,IAAM,EAAI,EAAQ,CAAG,EACf,EAAI,EAAM,CAAG,GAAK,EACpB,EAAO,EAAS,UAAW,GAAQ,GAAO,CAAC,EAC3C,IAAS,IACX,EAAO,EAAS,OAChB,EAAS,KAAK,CAAC,EACf,EAAU,KAAK,CAAC,CAAC,GAEjB,EAAS,GAAQ,EAEnB,EAAU,EAAK,CAAE,KAAK,CAAG,CAC3B,CACA,IAAM,EAAO,IAAQ,OAAS,aAAe,EAAW,GACxD,EAAU,SAAS,EAAO,IAAM,CAC9B,EAAM,KAAK,CACT,GAAI,GAAG,EAAI,GAAG,IACd,MAAO,EAAU,OAAS,EAAI,GAAG,EAAK,KAAK,EAAI,IAAM,EACrD,GAAI,IAAQ,OAAS,CAAC,EAAI,CAAE,OAAQ,EAAY,EAAK,EACrD,MAAO,EAAM,IAAK,IAAS,CACzB,GAAI,EAAI,GACR,MAAO,EAAQ,CAAG,EAClB,IAAK,EAAM,CAAG,EACd,OAAQ,GAAU,CAAG,EACrB,OAAQ,GAAU,CAAG,CACvB,EAAE,CACJ,CAAC,CACH,CAAC,CACH,CACA,OAAO,CACT,CAgBA,SAAgB,GAAY,EAA+B,EAAuB,CAChF,IAAM,EAAS,EAAK,OAAQ,GAAM,EAAE,QAAU,UAAY,EAAE,OAAS,IAAI,EACnE,EAAW,EAAO,IAAK,GAAO,EAAE,MAAM,eAAiB,KAAK,MAAM,EAAE,KAAK,cAAc,EAAI,GAAI,CAAC,CAAC,OAAO,OAAO,QAAQ,EACvH,EAAS,EAAO,IAAK,GAAM,EAAQ,CAAC,GAAK,CAAG,EAC5C,EAAO,KAAK,IAAI,EAAM,KAAa,GAAG,CAAM,EAC5C,EAAK,KAAK,IAAI,EAAM,OAAgB,KAAK,IAAI,EAAM,KAAe,GAAG,CAAQ,CAAC,EAChF,EAAiB,EAmBrB,MAAO,CAAE,MAlBqB,EAAO,IAAK,GAAM,CAC9C,IAAM,EAAU,EAAE,MAAM,eAAiB,KAAK,MAAM,EAAE,KAAK,cAAc,EAAI,IACxE,OAAO,SAAS,CAAO,GAAG,IAC/B,IAAM,EAAQ,EAAE,KAAK,SAAS,GAAG,EAAI,EAAE,KAAK,MAAM,GAAG,CAAC,CAAC,GAAK,EAAE,KAC9D,MAAO,CACL,GAAI,EAAE,GACN,MAAO,GAAG,EAAM,IAAI,EAAE,QACtB,GAAI,EAAE,KAAO,CAAE,OAAQ,EAAY,EAAE,KAAM,EAAI,CAAC,EAChD,MAAO,CAAC,CACN,GAAI,EAAE,GACN,MAAO,EAAQ,CAAC,GAAK,EACrB,IAAK,OAAO,SAAS,CAAO,EAAI,EAAU,KAC1C,OAAQ,EAAE,MAAM,OAAS,QAAU,QAAU,SAC7C,QAAS,GACT,OAAQ,GAAG,GAAW,EAAE,MAAM,QAAU,SAAU,CAAG,IAAI,OAAO,SAAS,CAAO,EAAI,GAAK,2BAC3F,CAAC,CACH,CACF,CACS,EAAO,OAAM,KAAI,gBAAe,CAC3C,CAOA,IAAa,GAA+C,CAC1D,GAAI,YACJ,GAAI,kBACJ,IAAK,SACL,GAAI,QACJ,GAAI,SACJ,GAAI,SACJ,GAAI,eACJ,GAAI,iBACJ,GAAI,eACN,EAGA,SAAgB,GAAa,EAA+C,CAE1E,MADI,CAAC,GAAU,EAAO,OAAO,SAAW,EAAU,CAAC,EAC5C,CACL,CAAE,GAAI,UAAW,MAAO,YAAa,MAAO,EAAO,OAAO,EAAE,CAAE,OAAQ,EACtE,GAAG,EAAO,OAAO,IAAK,IAAO,CAAE,GAAI,EAAE,KAAM,MAAO,GAAG,EAAE,KAAK,GAAG,GAAW,EAAE,OAAS,KAAK,KAAK,EAAG,MAAO,EAAE,MAAO,EAAE,CACtH,CACF,CAcA,SAAgB,GAAa,EAAgC,EAAO,EAAiB,CACnF,GAAI,CAAC,EAAQ,MAAO,CAAE,WAAY,CAAC,EAAG,SAAU,CAAC,EAAG,OAAQ,CAAC,EAAG,MAAO,CAAE,EACzE,IAAM,EAAS,IAAI,IACnB,IAAK,IAAM,KAAK,EAAO,OAAQ,IAAK,IAAM,KAAK,EAAE,SAAU,CACzD,IAAM,EAAO,EAAO,IAAI,EAAE,IAAI,EAC9B,EAAO,IAAI,EAAE,KAAM,CAAE,OAAQ,GAAM,QAAU,EAAE,OAAQ,OAAQ,GAAM,OAAS,GAAK,EAAE,KAAM,CAAC,CAC9F,CACA,IAAM,EAAS,CAAC,GAAG,EAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAG,IAAM,EAAE,EAAE,CAAC,MAAQ,EAAE,EAAE,CAAC,OAAS,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,EACjG,EAAM,EAAO,MAAM,EAAG,CAAI,CAAC,CAAC,KAAK,CAAC,KAAU,CAAI,EAChD,EAAW,EAAO,OAAS,EAC3B,EAA8B,CAClC,GAAG,EAAI,KAAK,EAAM,KAAO,CAAE,GAAI,EAAM,MAAO,EAAO,IAAI,CAAI,CAAC,CAAE,OAAQ,MAAO,EAAY,CAAC,CAAE,EAAE,EAC9F,GAAI,EAAW,CAAC,CAAE,GAAI,UAAW,MAAO,gBAAiB,MAAO,CAAc,CAAC,EAAI,CAAC,CACtF,EACM,EAAS,EAAO,OAAO,OAAQ,GAAM,EAAE,SAAS,OAAS,GAAK,EAAE,UAAY,EAAE,MAAM,EAC1F,MAAO,CACL,WAAY,EAAO,IAAK,GAAM,EAAE,IAAI,EACpC,WACA,OAAQ,EAAO,IAAK,GAAM,CACxB,IAAM,EAAM,EAAI,IAAK,GAAS,EAAE,SAAS,KAAM,GAAM,EAAE,OAAS,CAAI,CAAC,EAAE,OAAS,CAAC,EAEjF,OADI,GAAU,EAAI,KAAK,EAAE,SAAS,OAAQ,GAAM,CAAC,EAAI,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAG,IAAM,EAAI,EAAE,MAAO,CAAC,CAAC,EAChG,CACT,CAAC,EACD,MAAO,EAAO,QAAQ,EAAG,EAAG,KAAO,EAAI,EAAE,MAAO,CAAC,CACnD,CACF,CAMA,SAAgB,GAAc,EAAqC,CACjE,OAAO,EAAM,KAAK,SAAW,GAAK,GAAa,EAAM,MAAM,CAAC,CAAC,SAAW,GAAK,GAAa,EAAM,MAAM,CAAC,CAAC,QAAU,CACpH,CAGA,SAAgB,GAAe,EAAyF,CACtH,GAAI,CAAC,EAAO,OAAO,KACnB,IAAM,EAAe,EAAM,KAAK,OAAQ,GAAM,EAAE,eAAiB,IAAI,EACrE,GAAI,CAAC,EAAa,OAAQ,OAAO,KACjC,EAAa,MAAM,EAAG,KAAO,EAAQ,CAAC,GAAK,IAAM,EAAQ,CAAC,GAAK,EAAE,EACjE,IAAM,EAAM,EAAa,GACzB,MAAO,CAAE,SAAU,EAAI,aAAe,KAAI,CAC5C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{y as e}from"./colors-DvK0wMHH.js";import{t}from"./calendar-day-BxBYHfX1.js";import{a as n}from"./workspace-model-C-q_I8xN.js";function r(e){let t=e.trim().replace(/\\/g,`/`).replace(/\/+$/,``);return t=t.replace(/^\/private(?=\/(?:tmp|var)(?:\/|$))/,``),t=t.replace(/^(?:\/Users\/[^/]+|\/home\/[^/]+|[A-Za-z]:\/Users\/[^/]+)(?=\/|$)/,`~`),t||`/`}var i=[/^\/tmp(?:\/|$)/,/^\/var\/tmp(?:\/|$)/,/^\/var\/folders\/[^/]+\/[^/]+\/T(?:\/|$)/,/^[A-Za-z]:\/Windows\/Temp(?:\/|$)/i,/\/AppData\/Local\/Temp(?:\/|$)/i];function a(e){let t=r(e);return i.some(e=>e.test(t))}function o(e,t){let n=new Map,i=(e,t)=>{let i=r(e),a=t.trim();i!==`/`&&i!==`~`&&a&&!n.has(i)&&n.set(i,a)};for(let t of e??[])for(let e of t.roots)i(e.path,t.name);for(let e of t??[])i(e.path,e.name);return n}function s(e,t){let n=r(e),i=t.get(n);if(i!==void 0)return i;let a=null;for(let[e,r]of t)n.startsWith(`${e}/`)&&(!a||e.length>a.root.length)&&(a={root:e,name:r});return a?.name??null}function c(e,t=new Map){return{label:s(e,t)??n(e),full:e,scratch:a(e)}}var l=e=>e.length>14?`${e.slice(0,13)}…`:e;function u(e,t){let n=new Map(e.map(e=>[e,e.split(`/`).filter(Boolean).reverse()])),r=new Map;for(let i of e){let a=n.get(i),o=null,s=null;for(let r=0;r<a.length&&s===null;r++){let c=a[r];c!==t&&c!==`~`&&(o??=c,e.every(e=>e===i||n.get(e)[r]!==c)&&(s=c))}r.set(i,s??o)}return r}function d(e,t=new Map){let n=new Map;for(let t of[...new Set(e)].sort()){let e=r(t);n.set(e,[...n.get(e)??[],t])}let i=new Map;for(let[e,r]of n){let n=c(r[0],t).label;i.set(n,[...i.get(n)??[],e])}let o=new Map,s=new Map;for(let[e,t]of i){let n=t.length>1?u(t,e):null;for(let r of t){let t=n?.get(r)??null;o.set(r,t?`${e} (${l(t)})`:e),t&&l(t)!==t&&s.set(r,`${e} (${t})`)}}let d=new Map;for(let e of o.values())d.set(e,(d.get(e)??0)+1);let f=new Set,p=new Map;for(let e of[...o.keys()].sort()){let t=o.get(e),n=d.get(t)>1?s.get(e)??t:t,r=n;for(let e=2;f.has(r);e++)r=`${n} #${e}`;f.add(r),p.set(e,r)}let m=new Map;for(let[e,t]of n)for(let n of t)m.set(n,{label:p.get(e),full:n,scratch:a(n)});return m}var f=[`loop`,`struggle`,`verification-gap`,`uncertainty`,`backtrack`,`win`],p={loop:`Loops`,struggle:`Repeated failures`,"verification-gap":`Edits without tests`,uncertainty:`Uncertainty`,backtrack:`Backtracking`,win:`Wins`},m={claude:`Claude`,codex:`Codex`,grok:`Grok`,local:`Local`},h=[`claude`,`codex`,`grok`,`local`];function g(e){return h.includes(e)?e:null}function _(e){if(!e)return[];let t=new Map;for(let n of e.insights){if(!n.repo)continue;let e=r(n.repo),i=t.get(e)??{total:0,spellings:new Map};i.total+=n.count,i.spellings.set(n.repo,(i.spellings.get(n.repo)??0)+n.count),t.set(e,i)}let n=(e,t)=>t[1]-e[1]||e[0].localeCompare(t[0]);return[...t.values()].map(e=>[[...e.spellings.entries()].sort(n)[0][0],e.total]).sort(n).map(([e])=>e)}function v(e,t){return!!e&&(e===t||r(e)===r(t))}function y(e,t){let n=f.map(e=>({id:e,label:p[e]}));if(!e)return{rows:n,columns:[],values:[]};let r=[...new Set([...Object.keys(e.totals.byEngine),...e.insights.map(e=>e.engine).filter(e=>!!e)])].sort((e,t)=>{let n=h.indexOf(e),r=h.indexOf(t);return(n===-1?99:n)-(r===-1?99:r)||e.localeCompare(t)}),i=r.map(e=>{let t=g(e);return{id:e,label:m[e]??e,...t?{engine:t}:{}}}),a=e.insights.filter(e=>t===null||v(e.repo,t));return{rows:n,columns:i,values:f.map(t=>r.map(n=>{let r=(e.totals.byEngine[n]??0)>0,i=a.filter(e=>e.kind===t&&e.engine===n).reduce((e,t)=>e+t.count,0);return r||i>0?i:null}))}}function b(e,t=3){if(!e)return[];let n={high:0,warn:1,info:2};return e.insights.filter(e=>e.kind!==`win`).sort((e,t)=>n[e.severity]-n[t.severity]||Date.parse(t.lastAt)-Date.parse(e.lastAt)).slice(0,t)}function x(n){if(!n)return[];let r=e=>n.trends.map(n=>({x:t(n.day),y:n.steps===0?null:e(n)}));return[{id:`struggles`,label:`Struggles`,color:e(`warning`),points:r(e=>e.struggles)},{id:`wins`,label:`Wins`,color:e(`success`),points:r(e=>e.wins)}]}var S=new Set([`loop`,`struggle`]);function C(e,t){return e.evidence.some(e=>e.ref.startsWith(`session:${t}#`)||e.ref.startsWith(`verse:${t}:`))}function w(e,t){return!e||!t?[]:e.insights.filter(e=>S.has(e.kind)&&C(e,t)).sort((e,t)=>Date.parse(t.lastAt)-Date.parse(e.lastAt))}var T={stack:`_stack_1bdwr_5`,muted:`_muted_1bdwr_11`,link:`_link_1bdwr_17`,veto:`_veto_1bdwr_33`,chip:`_chip_1bdwr_34`,timeline:`_timeline_1bdwr_40`,memo:`_memo_1bdwr_48`,memoDay:`_memoDay_1bdwr_62`,mark:`_mark_1bdwr_69`,memoBody:`_memoBody_1bdwr_92`,memoMove:`_memoMove_1bdwr_99`,memoWhy:`_memoWhy_1bdwr_106`,memoMeta:`_memoMeta_1bdwr_113`,standards:`_standards_1bdwr_157`,standardRule:`_standardRule_1bdwr_172`,standardMeta:`_standardMeta_1bdwr_178`,insights:`_insights_1bdwr_184`,insight:`_insight_1bdwr_184`,insightKind:`_insightKind_1bdwr_213`,insightSeverity:`_insightSeverity_1bdwr_220`,insightTitle:`_insightTitle_1bdwr_233`,insightMeta:`_insightMeta_1bdwr_240`,insightPlace:`_insightPlace_1bdwr_248`,scratchTag:`_scratchTag_1bdwr_254`,log:`_log_1bdwr_266`,facet:`_facet_1bdwr_274`,chipWrap:`_chipWrap_1bdwr_294`,chipDot:`_chipDot_1bdwr_321`,chipMore:`_chipMore_1bdwr_332`,chipPanel:`_chipPanel_1bdwr_336`,chipList:`_chipList_1bdwr_352`};export{x as a,c,_ as i,d as l,p as n,w as o,y as r,b as s,T as t,o as u};
|
|
2
|
+
//# sourceMappingURL=mind.module-rVKz51LB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mind.module-rVKz51LB.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mind/project-label.ts","../../../../../../src/web-ui/routes/verse/mind/mind-model.ts","../../../../../../src/web-ui/routes/verse/mind/mind.module.css"],"sourcesContent":["/**\n * routes/verse/mind/project-label.ts — how Mind names the place a reasoning\n * insight happened.\n *\n * A7 keys insights by the workspace path the engine ran in, verbatim, so the\n * cards used to read \"/private/tmp/claude-501/-Users-…/9d28bdb1-…/scratchpad/\n * grokpad · grok · 1×\". The card now shows a human label:\n *\n * 1. the REGISTERED name — a saved project (Chat → Projects) whose root is\n * that folder or contains it, else a project Verse knows from bootstrap;\n * 2. otherwise the folder's own name (`grokpad`), the same rule a saved\n * project uses when the operator names nothing (defaultWorkspaceName).\n *\n * The full path is never dropped: it rides in the tooltip. A folder under the\n * OS temp directory (an agent's scratchpad, a test fixture) is tagged\n * `scratch` rather than hidden — the insight is real, the place is throwaway.\n * The browser cannot ask the OS for its temp dir, so the well-known locations\n * are matched instead (macOS /tmp, /private/tmp and the per-user\n * /var/folders/…/T; Linux /tmp and /var/tmp; Windows …\\AppData\\Local\\Temp).\n *\n * Two different folders that would read the same (two agents' `scratchpad`s)\n * get a short distinguisher appended, so the Repo facet never offers two\n * identical choices; two spellings of ONE folder share one label.\n *\n * Framework-free; tested directly.\n */\nimport type { VerseProject, VerseWorkspace } from '../../../data/api-types.js';\nimport { defaultWorkspaceName } from '../workspace-model.js';\n\nexport interface ProjectLabel {\n /** What the card draws: the registered name, else the folder's own name. */\n label: string;\n /** The path (or slug) exactly as recorded — the tooltip. */\n full: string;\n /** Lives under the OS temp directory: a scratch folder, not a project. */\n scratch: boolean;\n}\n\n/** Registered names keyed by `pathKey(root)`. */\nexport type ProjectNames = ReadonlyMap<string, string>;\n\n/**\n * A comparable form of a path: `/` separators, no trailing separator, the\n * macOS `/private` alias folded (`/tmp` and `/var` are symlinks into it, and\n * the same folder is recorded either way), a home directory as `~` (a project\n * saved as `~/dev/hub` still runs in `/Users/me/dev/hub`).\n */\nexport function pathKey(path: string): string {\n let p = path.trim().replace(/\\\\/g, '/').replace(/\\/+$/, '');\n p = p.replace(/^\\/private(?=\\/(?:tmp|var)(?:\\/|$))/, '');\n p = p.replace(/^(?:\\/Users\\/[^/]+|\\/home\\/[^/]+|[A-Za-z]:\\/Users\\/[^/]+)(?=\\/|$)/, '~');\n return p || '/';\n}\n\nconst SCRATCH_ROOTS: readonly RegExp[] = [\n /^\\/tmp(?:\\/|$)/, // also /private/tmp, folded by pathKey\n /^\\/var\\/tmp(?:\\/|$)/,\n /^\\/var\\/folders\\/[^/]+\\/[^/]+\\/T(?:\\/|$)/, // macOS per-user $TMPDIR\n /^[A-Za-z]:\\/Windows\\/Temp(?:\\/|$)/i,\n /\\/AppData\\/Local\\/Temp(?:\\/|$)/i,\n];\n\n/** Is this folder under the OS temp directory? */\nexport function isScratchPath(path: string): boolean {\n const key = pathKey(path);\n return SCRATCH_ROOTS.some((re) => re.test(key));\n}\n\n/**\n * Registered names by root. Saved projects win (the operator named them),\n * then Verse's known projects; every root of a multi-folder project maps to\n * that project's name.\n */\nexport function projectNames(\n workspaces: readonly { name: VerseWorkspace['name']; roots: readonly { path: string }[] }[] | null | undefined,\n projects: readonly Pick<VerseProject, 'name' | 'path'>[] | null | undefined,\n): Map<string, string> {\n const names = new Map<string, string>();\n const add = (path: string, name: string) => {\n const key = pathKey(path);\n const label = name.trim();\n if (key !== '/' && key !== '~' && label && !names.has(key)) names.set(key, label);\n };\n for (const w of workspaces ?? []) for (const r of w.roots) add(r.path, w.name);\n for (const p of projects ?? []) add(p.path, p.name);\n return names;\n}\n\n/** The registered name for `path`: its own root, else the longest registered root containing it. */\nfunction registeredName(path: string, names: ProjectNames): string | null {\n const key = pathKey(path);\n const exact = names.get(key);\n if (exact !== undefined) return exact;\n let best: { root: string; name: string } | null = null;\n for (const [root, name] of names) {\n if (key.startsWith(`${root}/`) && (!best || root.length > best.root.length)) best = { root, name };\n }\n return best?.name ?? null;\n}\n\n/** One insight's place, as the card draws it. */\nexport function projectLabel(repo: string, names: ProjectNames = new Map()): ProjectLabel {\n return { label: registeredName(repo, names) ?? defaultWorkspaceName(repo), full: repo, scratch: isScratchPath(repo) };\n}\n\nconst short = (name: string) => (name.length > 14 ? `${name.slice(0, 13)}…` : name);\n\n/**\n * What tells same-label folders apart, per folder (keyed by `pathKey`):\n * walking up from the folder itself, the NEAREST path segment that no other\n * folder in the group has at that same depth — `grokpad (9d28bdb1-4c1e…)` for\n * two agents' `…/<uuid>/scratchpad/grokpad` (their parents are both\n * `scratchpad`), `Hub (a)` for two folders under one registered project. A\n * segment that only repeats the label (or is the home `~`) says nothing and\n * is skipped. When no single segment is unique, the nearest informative one\n * is returned and `projectLabels` settles whatever still collides.\n */\nfunction distinguishers(keys: readonly string[], label: string): Map<string, string | null> {\n const parts = new Map(keys.map((k) => [k, k.split('/').filter(Boolean).reverse()]));\n const out = new Map<string, string | null>();\n for (const key of keys) {\n const mine = parts.get(key)!;\n let nearest: string | null = null;\n let unique: string | null = null;\n for (let depth = 0; depth < mine.length && unique === null; depth++) {\n const seg = mine[depth]!;\n if (seg === label || seg === '~') continue;\n nearest ??= seg;\n if (keys.every((other) => other === key || parts.get(other)![depth] !== seg)) unique = seg;\n }\n out.set(key, unique ?? nearest);\n }\n return out;\n}\n\n/**\n * Labels for every repo on a surface at once, so the cards and the Repo facet\n * agree — and two different folders NEVER read the same:\n *\n * 1. spellings of one folder (`/tmp/x` and `/private/tmp/x`: one `pathKey`)\n * share one label; each keeps its own `full` path for the tooltip;\n * 2. different folders that would read the same get their nearest\n * distinguishing ancestor appended, shortened (`distinguishers`);\n * 3. whatever still collides — two ancestors that shorten alike, a folder\n * with nothing left to tell it apart — is settled by construction: the\n * whole segment instead of the shortened one, then an ordinal (\"#2\").\n */\nexport function projectLabels(repos: readonly string[], names: ProjectNames = new Map()): Map<string, ProjectLabel> {\n // One entry per folder, in a stable order: the labels never depend on the\n // order the insights arrived in.\n const spellings = new Map<string, string[]>();\n for (const repo of [...new Set(repos)].sort()) {\n const key = pathKey(repo);\n spellings.set(key, [...(spellings.get(key) ?? []), repo]);\n }\n const byLabel = new Map<string, string[]>();\n for (const [key, list] of spellings) {\n const label = projectLabel(list[0]!, names).label;\n byLabel.set(label, [...(byLabel.get(label) ?? []), key]);\n }\n\n const wanted = new Map<string, string>();\n const whole = new Map<string, string>();\n for (const [label, keys] of byLabel) {\n const extra = keys.length > 1 ? distinguishers(keys, label) : null;\n for (const key of keys) {\n const seg = extra?.get(key) ?? null;\n wanted.set(key, seg ? `${label} (${short(seg)})` : label);\n if (seg && short(seg) !== seg) whole.set(key, `${label} (${seg})`);\n }\n }\n\n const shared = new Map<string, number>();\n for (const l of wanted.values()) shared.set(l, (shared.get(l) ?? 0) + 1);\n const taken = new Set<string>();\n const labelOf = new Map<string, string>();\n for (const key of [...wanted.keys()].sort()) {\n const first = wanted.get(key)!;\n const pick = shared.get(first)! > 1 ? (whole.get(key) ?? first) : first;\n let label = pick;\n for (let n = 2; taken.has(label); n++) label = `${pick} #${n}`;\n taken.add(label);\n labelOf.set(key, label);\n }\n\n const out = new Map<string, ProjectLabel>();\n for (const [key, list] of spellings) {\n for (const repo of list) out.set(repo, { label: labelOf.get(key)!, full: repo, scratch: isScratchPath(repo) });\n }\n return out;\n}\n","/**\n * routes/verse/mind/mind-model.ts — the reasoning digest (A7) as Mind's\n * charts and cards, plus the chat-header chip's matching rule (unit C7;\n * SPEC-310B §6 Mind, SPEC-310C §5).\n *\n * The matrix is insight KIND × ENGINE, faceted by repo. A cell is:\n * - a count of insight occurrences when that engine produced reasoning in\n * the window (0 is a real zero: it reasoned and nothing was flagged);\n * - UNKNOWN (null) when that engine recorded no reasoning at all — nothing\n * was measured, so nothing can be said (hatched, never a pale zero).\n *\n * Framework-free; tested directly.\n */\nimport type { ReasoningDigest, ReasoningInsight, ReasoningInsightKind } from '../../../../core/reasoning/types.js';\nimport type { ChartEngine } from '../../../components/charts/colors.js';\nimport type { MatrixAxisItem } from '../../../components/charts/MatrixHeatmap.js';\nimport type { AreaTrendSeries } from '../../../components/charts/AreaTrend.js';\nimport { toneColor } from '../../../components/charts/colors.js';\nimport { calendarDayStart } from '../growth/calendar-day.js';\nimport { pathKey } from './project-label.js';\n\nexport const INSIGHT_KINDS: readonly ReasoningInsightKind[] = ['loop', 'struggle', 'verification-gap', 'uncertainty', 'backtrack', 'win'];\n\nexport const KIND_LABEL: Readonly<Record<ReasoningInsightKind, string>> = {\n loop: 'Loops',\n struggle: 'Repeated failures',\n 'verification-gap': 'Edits without tests',\n uncertainty: 'Uncertainty',\n backtrack: 'Backtracking',\n win: 'Wins',\n};\n\nconst ENGINE_LABEL: Readonly<Record<string, string>> = { claude: 'Claude', codex: 'Codex', grok: 'Grok', local: 'Local' };\nconst KNOWN_ENGINES: readonly ChartEngine[] = ['claude', 'codex', 'grok', 'local'];\n\nfunction asEngine(name: string): ChartEngine | null {\n return (KNOWN_ENGINES as readonly string[]).includes(name) ? (name as ChartEngine) : null;\n}\n\n/**\n * Repos that appear in the digest's insights, most insight occurrences first\n * — ONE per folder: two spellings of the same folder (`/tmp/x` and\n * `/private/tmp/x`, which `pathKey` treats as one) are one Repo facet entry,\n * named by the spelling recorded most often.\n */\nexport function insightRepos(digest: ReasoningDigest | null): string[] {\n if (!digest) return [];\n const folders = new Map<string, { total: number; spellings: Map<string, number> }>();\n for (const i of digest.insights) {\n if (!i.repo) continue;\n const key = pathKey(i.repo);\n const f = folders.get(key) ?? { total: 0, spellings: new Map<string, number>() };\n f.total += i.count;\n f.spellings.set(i.repo, (f.spellings.get(i.repo) ?? 0) + i.count);\n folders.set(key, f);\n }\n const byCount = (a: [string, number], b: [string, number]) => b[1] - a[1] || a[0].localeCompare(b[0]);\n return [...folders.values()]\n .map((f) => [[...f.spellings.entries()].sort(byCount)[0]![0], f.total] as [string, number])\n .sort(byCount)\n .map(([r]) => r);\n}\n\n/** Does insight `repo` name the same folder as facet `facet` (any spelling)? */\nfunction sameFolder(repo: string | null | undefined, facet: string): boolean {\n return !!repo && (repo === facet || pathKey(repo) === pathKey(facet));\n}\n\nexport interface InsightMatrix {\n rows: MatrixAxisItem[];\n columns: MatrixAxisItem[];\n values: (number | null)[][];\n}\n\n/** `repo` null = every repo. */\nexport function insightMatrix(digest: ReasoningDigest | null, repo: string | null): InsightMatrix {\n const rows = INSIGHT_KINDS.map((k) => ({ id: k, label: KIND_LABEL[k] }));\n if (!digest) return { rows, columns: [], values: [] };\n // Columns: every engine that reasoned in the window, plus any engine an\n // insight names (so a count is never dropped), known engines first.\n const names = new Set<string>([...Object.keys(digest.totals.byEngine), ...digest.insights.map((i) => i.engine).filter((e): e is string => !!e)]);\n const ordered = [...names].sort((a, b) => {\n const ia = KNOWN_ENGINES.indexOf(a as ChartEngine);\n const ib = KNOWN_ENGINES.indexOf(b as ChartEngine);\n return (ia === -1 ? 99 : ia) - (ib === -1 ? 99 : ib) || a.localeCompare(b);\n });\n const columns: MatrixAxisItem[] = ordered.map((name) => {\n const engine = asEngine(name);\n return { id: name, label: ENGINE_LABEL[name] ?? name, ...(engine ? { engine } : {}) };\n });\n const insights = digest.insights.filter((i) => repo === null || sameFolder(i.repo, repo));\n const values = INSIGHT_KINDS.map((kind) =>\n ordered.map((engine) => {\n const measured = (digest.totals.byEngine[engine] ?? 0) > 0;\n const count = insights.filter((i) => i.kind === kind && i.engine === engine).reduce((n, i) => n + i.count, 0);\n return measured || count > 0 ? count : null;\n }),\n );\n return { rows, columns, values };\n}\n\n/** The three cards: most severe first, then most recent — wins are not problems. */\nexport function topInsights(digest: ReasoningDigest | null, n = 3): ReasoningInsight[] {\n if (!digest) return [];\n const rank = { high: 0, warn: 1, info: 2 } as const;\n return digest.insights\n .filter((i) => i.kind !== 'win')\n .sort((a, b) => rank[a.severity] - rank[b.severity] || Date.parse(b.lastAt) - Date.parse(a.lastAt))\n .slice(0, n);\n}\n\n/**\n * Struggles vs wins per day, for the trends card. Each day is stamped at the\n * viewer's LOCAL midnight (`calendarDayStart`), because the chart labels its\n * x values in the local zone: a UTC-midnight stamp read one day early west of\n * UTC (\"2026-09-24\" as \"Sep 23\").\n */\nexport function reasoningTrendSeries(digest: ReasoningDigest | null): AreaTrendSeries[] {\n if (!digest) return [];\n const pts = (pick: (d: ReasoningDigest['trends'][number]) => number) =>\n digest.trends.map((d) => ({ x: calendarDayStart(d.day), y: d.steps === 0 ? null : pick(d) }));\n return [\n { id: 'struggles', label: 'Struggles', color: toneColor('warning'), points: pts((d) => d.struggles) },\n { id: 'wins', label: 'Wins', color: toneColor('success'), points: pts((d) => d.wins) },\n ];\n}\n\n// ---------------------------------------------------------------------------\n// SessionInsightChip\n// ---------------------------------------------------------------------------\n\n/** The chip shows only the insight kinds that mean \"this chat is stuck\". */\nexport const CHIP_KINDS: ReadonlySet<ReasoningInsightKind> = new Set(['loop', 'struggle']);\n\n/**\n * Does `insight` cite chat `sessionId`? Verse evidence refs are\n * `session:<id>#<seq>` (tool / message events) or `verse:<id>:<turn|seq>`\n * (thinking steps) — A7's ingest-verse.ts. The id is matched exactly up to\n * its delimiter, so chat `s1` never matches `s12`.\n */\nexport function citesSession(insight: Pick<ReasoningInsight, 'evidence'>, sessionId: string): boolean {\n return insight.evidence.some((e) => e.ref.startsWith(`session:${sessionId}#`) || e.ref.startsWith(`verse:${sessionId}:`));\n}\n\nexport function sessionInsights(digest: ReasoningDigest | null, sessionId: string): ReasoningInsight[] {\n if (!digest || !sessionId) return [];\n return digest.insights\n .filter((i) => CHIP_KINDS.has(i.kind) && citesSession(i, sessionId))\n .sort((a, b) => Date.parse(b.lastAt) - Date.parse(a.lastAt));\n}\n","/*\n * routes/verse/mind/mind.module.css — Mind cards and the chat-header chip\n * (unit C7). Tokens only (style-scan-310).\n */\n.stack {\n display: flex;\n flex-direction: column;\n gap: var(--surface-gap);\n}\n\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n}\n\n.link {\n align-self: flex-start;\n padding: 0;\n border: 0;\n background: none;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n\n.link:hover {\n text-decoration: underline;\n}\n\n.link:focus-visible,\n.veto:focus-visible,\n.chip:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}\n\n/* ---- memo timeline ---------------------------------------------------- */\n.timeline {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.memo {\n display: grid;\n grid-template-columns: 88px 20px minmax(0, 1fr) auto;\n gap: var(--space-3);\n align-items: start;\n padding: var(--space-3) 0;\n border-top: 1px solid var(--border-subtle);\n}\n\n.memo:first-child {\n border-top: 0;\n padding-top: 0;\n}\n\n.memoDay {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-sm-line);\n font-variant-numeric: tabular-nums;\n}\n\n.mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: var(--radius-full);\n background: var(--status-neutral-bg);\n color: var(--status-neutral-fg);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-semibold);\n}\n\n.mark[data-outcome='hit'] {\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n\n.mark[data-outcome='miss'] {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n.memoBody {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.memoMove {\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n overflow-wrap: anywhere;\n}\n\n.memoWhy {\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n overflow-wrap: anywhere;\n}\n\n.memoMeta {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.memoMeta [data-outcome='hit'] {\n color: var(--status-success-fg);\n}\n\n.memoMeta [data-outcome='miss'] {\n color: var(--status-danger-fg);\n}\n\n.veto {\n min-height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n\n.veto:hover {\n background: var(--bg-hover);\n}\n\n.veto:disabled {\n color: var(--text-disabled);\n cursor: default;\n}\n\n[data-viewport='compact'] .memo {\n grid-template-columns: 20px minmax(0, 1fr) auto;\n}\n\n[data-viewport='compact'] .memoDay {\n grid-column: 1 / -1;\n}\n\n/* ---- standards -------------------------------------------------------- */\n.standards {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.standards li {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.standardRule {\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n}\n\n.standardMeta {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n}\n\n/* ---- insight cards ---------------------------------------------------- */\n.insights {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--surface-gap);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n[data-viewport='compact'] .insights,\n[data-viewport='medium'] .insights {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.insight {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--card-pad);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.insight[data-severity='high'] {\n border-color: var(--status-danger-solid);\n}\n\n.insightKind {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.insightSeverity {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n}\n\n.insightSeverity[data-severity='high'] {\n color: var(--status-danger-fg);\n}\n\n.insightSeverity[data-severity='warn'] {\n color: var(--status-warning-fg);\n}\n\n.insightTitle {\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n overflow-wrap: anywhere;\n}\n\n.insightMeta {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n/* The project's name reads a step stronger than the rest of the meta line;\n the full path is its tooltip. */\n.insightPlace {\n color: var(--text-secondary);\n overflow-wrap: anywhere;\n}\n\n/* A folder under the OS temp dir: tagged, quietly — never hidden. */\n.scratchTag {\n display: inline-block;\n margin-left: var(--space-1);\n padding: 0 var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n vertical-align: 1px;\n}\n\n.log {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.facet {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n}\n\n.facet select {\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-xs-size);\n}\n\n/* ---- chat-header chip ------------------------------------------------- */\n.chipWrap {\n position: relative;\n display: inline-flex;\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n background: var(--bg-surface);\n color: var(--text-secondary);\n font: inherit;\n font-size: var(--text-xs-size);\n white-space: nowrap;\n cursor: pointer;\n}\n\n.chip:hover,\n.chip[aria-expanded='true'] {\n background: var(--bg-hover);\n color: var(--text-primary);\n}\n\n.chipDot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-warning-solid);\n}\n\n.chipDot[data-severity='high'] {\n background: var(--status-danger-solid);\n}\n\n.chipMore {\n color: var(--text-tertiary);\n}\n\n.chipPanel {\n position: absolute;\n top: calc(100% + var(--space-1));\n right: 0;\n z-index: var(--z-dropdown);\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n width: min(320px, calc(100vw - var(--space-8)));\n padding: var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n background: var(--bg-surface-raised);\n box-shadow: var(--shadow-menu);\n}\n\n.chipList {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.chipList li {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{z as e}from"./VerseShared-CFE5B-IY.js";import{n as t}from"./mobile-toast-9-WQbWQu.js";function n(n){let r=n.confirm!==!1;return e({title:n.title,body:n.consequences,confirmLabel:n.confirmLabel,destructive:n.destructive===!0,token:!0,tokenReason:`${n.confirmLabel} changes state on your Mac and needs the mutation token \`ashlr verse\` printed.`,skipConfirm:!r,run:async()=>{await n.run()},onDone:()=>{n.success&&t(n.success,`success`),n.onDone?.()},onError:r?void 0:e=>t(e,`danger`)})}export{n as t};
|
|
2
|
+
//# sourceMappingURL=mobile-actions-V26-lGbH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobile-actions-V26-lGbH.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/mobile-actions.ts"],"sourcesContent":["/**\n * routes/verse/mobile/mobile-actions.ts — every write the phone makes goes\n * through here: confirmation (unless the action is trivially undoable), then\n * the mutation token if it is not held, then the call — the one order\n * shell/guard-store.ts enforces for the desktop too. MobileGuardSheet draws\n * it; this module only describes the action.\n */\nimport { requestGuarded } from '../shell/guard-store.js';\nimport { showMobileToast } from './mobile-toast.js';\n\nexport interface MobileAction {\n /** Sheet title: the question (\"Stop the fleet?\"). */\n title: string;\n /** What will happen, in operator language — the sheet's body. */\n consequences: string;\n /** The confirm button (\"Stop fleet\"). */\n confirmLabel: string;\n destructive?: boolean;\n /**\n * false = no confirmation sheet (Pause, Send): the token prompt still\n * appears if the hold has lapsed, and a failure becomes a toast.\n */\n confirm?: boolean;\n run: () => Promise<unknown>;\n /** Toast after success; omit for none. */\n success?: string;\n onDone?: () => void;\n}\n\n/** Start `action`. False when another guarded action is already open. */\nexport function runMobileAction(action: MobileAction): boolean {\n const confirm = action.confirm !== false;\n return requestGuarded({\n title: action.title,\n body: action.consequences,\n confirmLabel: action.confirmLabel,\n destructive: action.destructive === true,\n token: true,\n tokenReason: `${action.confirmLabel} changes state on your Mac and needs the mutation token \\`ashlr verse\\` printed.`,\n skipConfirm: !confirm,\n run: async () => {\n await action.run();\n },\n onDone: () => {\n if (action.success) showMobileToast(action.success, 'success');\n action.onDone?.();\n },\n onError: confirm ? undefined : (message) => showMobileToast(message, 'danger'),\n });\n}\n"],"mappings":"6FA8BA,SAAgB,EAAgB,EAA+B,CAC7D,IAAM,EAAU,EAAO,UAAY,GACnC,OAAO,EAAe,CACpB,MAAO,EAAO,MACd,KAAM,EAAO,aACb,aAAc,EAAO,aACrB,YAAa,EAAO,cAAgB,GACpC,MAAO,GACP,YAAa,GAAG,EAAO,aAAa,kFACpC,YAAa,CAAC,EACd,IAAK,SAAY,CACf,MAAM,EAAO,IAAI,CACnB,EACA,WAAc,CACR,EAAO,SAAS,EAAgB,EAAO,QAAS,SAAS,EAC7D,EAAO,SAAS,CAClB,EACA,QAAS,EAAU,IAAA,GAAa,GAAY,EAAgB,EAAS,QAAQ,CAC/E,CAAC,CACH"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-_izD07R9.js";import{s as r}from"./VerseMobileApp-CrCDQcw5.js";import{t as i}from"./parts.module-CBkHcD6w.js";var a=e(n(),1),o=t(),s={...r,...i},c=4e3,l=[],u=1,d=new Set;function f(e){l=e;for(let e of[...d])e()}function p(e){f(l.filter(t=>t.id!==e))}function m(e,t=`neutral`){let n=u++;f([...l.slice(-2),{id:n,message:e,tone:t}]),setTimeout(()=>p(n),c)}function h(e){return d.add(e),()=>d.delete(e)}function g(){let e=(0,a.useSyncExternalStore)(h,()=>l,()=>l);return(0,o.jsx)(`div`,{className:s.toasts,role:`status`,"aria-live":`polite`,children:e.map(e=>(0,o.jsxs)(`div`,{className:s.toast,"data-tone":e.tone,children:[(0,o.jsx)(`span`,{children:e.message}),(0,o.jsx)(`button`,{type:`button`,className:`${s.btn} ${s.iconBtn}`,onClick:()=>p(e.id),"aria-label":`Dismiss`,children:`×`})]},e.id))})}export{m as n,g as t};
|
|
2
|
+
//# sourceMappingURL=mobile-toast-9-WQbWQu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobile-toast-9-WQbWQu.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/mobile-toast.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/mobile-toast.tsx — one-line confirmations under the\n * status bar (\"Approved: fix the flaky test\"). A module store rather than a\n * context so a helper outside React (an action's onDone) can post one; one\n * aria-live region announces each once.\n */\nimport { useSyncExternalStore } from 'react';\nimport partStyles from './parts.module.css';\nimport coreStyles from './ui.module.css';\n\nconst styles = { ...coreStyles, ...partStyles };\n\nexport type MobileToastTone = 'neutral' | 'success' | 'danger';\n\ninterface ToastItem {\n id: number;\n message: string;\n tone: MobileToastTone;\n}\n\nconst AUTO_DISMISS_MS = 4000;\nlet items: ToastItem[] = [];\nlet nextId = 1;\nconst listeners = new Set<() => void>();\n\nfunction emit(next: ToastItem[]): void {\n items = next;\n for (const l of [...listeners]) l();\n}\n\nfunction dismiss(id: number): void {\n emit(items.filter((t) => t.id !== id));\n}\n\nexport function showMobileToast(message: string, tone: MobileToastTone = 'neutral'): void {\n const id = nextId++;\n // At most three: a burst of actions must not bury the screen.\n emit([...items.slice(-2), { id, message, tone }]);\n setTimeout(() => dismiss(id), AUTO_DISMISS_MS);\n}\n\nexport function resetMobileToastsForTest(): void {\n emit([]);\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function MobileToasts() {\n const current = useSyncExternalStore(subscribe, () => items, () => items);\n return (\n <div className={styles.toasts} role=\"status\" aria-live=\"polite\">\n {current.map((t) => (\n <div key={t.id} className={styles.toast} data-tone={t.tone}>\n <span>{t.message}</span>\n <button type=\"button\" className={`${styles.btn} ${styles.iconBtn}`} onClick={() => dismiss(t.id)} aria-label=\"Dismiss\">\n ×\n </button>\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"uNAUM,EAAS,CAAE,GAAG,EAAY,GAAG,CAAW,EAUxC,EAAkB,IACpB,EAAqB,CAAC,EACtB,EAAS,EACP,EAAY,IAAI,IAEtB,SAAS,EAAK,EAAyB,CACrC,EAAQ,EACR,IAAK,IAAM,IAAK,CAAC,GAAG,CAAS,EAAG,EAAE,CACpC,CAEA,SAAS,EAAQ,EAAkB,CACjC,EAAK,EAAM,OAAQ,GAAM,EAAE,KAAO,CAAE,CAAC,CACvC,CAEA,SAAgB,EAAgB,EAAiB,EAAwB,UAAiB,CACxF,IAAM,EAAK,IAEX,EAAK,CAAC,GAAG,EAAM,MAAM,EAAE,EAAG,CAAE,KAAI,UAAS,MAAK,CAAC,CAAC,EAChD,eAAiB,EAAQ,CAAE,EAAG,CAAe,CAC/C,CAMA,SAAS,EAAU,EAAkC,CAEnD,OADA,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC,CAEA,SAAgB,GAAe,CAC7B,IAAM,GAAA,EAAU,EAAA,qBAAA,CAAqB,MAAiB,MAAa,CAAK,EACxE,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAQ,KAAK,SAAS,YAAU,SACpD,SAAA,EAAQ,IAAK,IACZ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAgB,UAAW,EAAO,MAAO,YAAW,EAAE,KAAtD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,OAAc,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,GAAG,EAAO,IAAI,GAAG,EAAO,UAAW,YAAe,EAAQ,EAAE,EAAE,EAAG,aAAW,UAAU,SAAA,GAE/G,CAAA,CACL,CALK,EAAA,EAAE,EAKP,CACN,CACE,CAAA,CAET"}
|