@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 @@
|
|
|
1
|
+
{"version":3,"file":"SetupChecklist-YUMOJNbk.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/autonomy/setup-checklist.module.css","../../../../../../src/web-ui/routes/verse/autonomy/SetupChecklist.tsx"],"sourcesContent":["/*\n * routes/verse/autonomy/setup-checklist.module.css — the live setup checklist\n * (SetupChecklist.tsx). Quiet by default: one highlighted next step, the\n * rest folded under a count. Colour only on marks and the next step's edge.\n * Tokens only (style-scan-310).\n */\n.checklist {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-3);\n width: 100%;\n min-width: 0;\n}\n\n/* The next step: a hairline accent edge, never a filled banner. */\n.next {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n max-width: 64ch;\n padding-left: var(--space-3);\n border-left: 2px solid var(--accent-500);\n}\n.next[data-mark='failed'] {\n border-left-color: var(--status-danger-solid);\n}\n.next[data-mark='blocked'] {\n border-left-color: var(--border-strong);\n}\n\n.nextHead {\n display: flex;\n align-items: baseline;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-2);\n}\n\n.nextLabel {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.nextTitle {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n}\n\n.nextDetail {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n overflow-wrap: anywhere;\n}\n\n.inlineCode {\n font-family: var(--font-mono);\n font-size: 0.95em;\n color: var(--text-primary);\n}\n\n.needs {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--space-1);\n}\n\n.need {\n padding: 0 var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-full);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n white-space: nowrap;\n}\n\n.link {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-link);\n text-decoration: none;\n}\n.link:hover {\n text-decoration: underline;\n}\n.link:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n border-radius: var(--radius-xs);\n}\n\n.all {\n width: 100%;\n padding-top: var(--space-3);\n border-top: 1px solid var(--border-subtle);\n}\n\n.summary {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--space-2) var(--space-3);\n cursor: pointer;\n list-style: none;\n border-radius: var(--radius-xs);\n}\n.summary::-webkit-details-marker {\n display: none;\n}\n.summary::before {\n content: '';\n width: 6px;\n height: 6px;\n flex: none;\n border-right: 1.5px solid var(--text-tertiary);\n border-bottom: 1.5px solid var(--text-tertiary);\n transform: rotate(-45deg);\n transition: transform 120ms ease;\n}\n.all[open] > .summary::before {\n transform: rotate(45deg);\n}\n.summary:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}\n\n.count {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n color: var(--text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n/* One pip per step: the whole checklist at a glance while it is folded. */\n.pips {\n display: inline-flex;\n gap: 3px;\n}\n.pip {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n.pip[data-mark='done'] {\n background: var(--status-success-solid);\n}\n.pip[data-mark='next'] {\n background: var(--accent-500);\n}\n.pip[data-mark='failed'] {\n background: var(--status-danger-solid);\n}\n.pip[data-mark='blocked'] {\n background: transparent;\n box-shadow: inset 0 0 0 1px var(--border-strong);\n}\n\n/* Column-major, so the steps read in setup's order down each column. */\n.steps {\n columns: 200px 3;\n column-gap: var(--space-6);\n margin: var(--space-3) 0 0;\n padding: 0;\n list-style: none;\n}\n\n.step {\n break-inside: avoid;\n padding: 2px 0;\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-2);\n min-width: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n.step[data-mark='done'] {\n color: var(--text-secondary);\n}\n.step[data-mark='next'] {\n color: var(--text-primary);\n font-weight: var(--font-weight-medium);\n}\n.step[data-mark='failed'] {\n color: var(--status-danger-fg);\n}\n\n.stepLabel {\n min-width: 0;\n}\n\n.stepNote {\n color: var(--text-tertiary);\n}\n\n.mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n flex: none;\n border: 1.5px solid var(--border-strong);\n border-radius: var(--radius-full);\n}\n.mark[data-mark='done'] {\n border-color: var(--status-success-solid);\n background: var(--status-success-solid);\n color: var(--text-on-accent);\n}\n.mark[data-mark='next'] {\n border-color: var(--accent-500);\n box-shadow: inset 0 0 0 3px var(--bg-surface), inset 0 0 0 7px var(--accent-500);\n}\n.mark[data-mark='failed'] {\n border-color: var(--status-danger-solid);\n color: var(--status-danger-solid);\n}\n.mark[data-mark='blocked'] {\n border-style: dashed;\n color: var(--text-tertiary);\n}\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .summary::before {\n transition: none;\n }\n}\n","/**\n * routes/verse/autonomy/SetupChecklist.tsx — the live `ashlr authority setup`\n * checklist inside the \"Autonomy is off\" state and onboarding step 4.\n *\n * NEXT GitHub App Browser · GitHub\n * The ashlr-fleet key is in custody, but the App is not installed on …\n * [ $ ashlr authority setup ⧉ Copy ]\n * Open the install page ↗\n * ▸ 6 of 15 ready ✓✓✓✓✓✓●○○○○○○○×\n * ✓ Custody helper\n * ● GitHub App Browser · GitHub\n * ○ Claude token Terminal\n * × Resident runtime blocked Terminal\n *\n * The next step leads, with what it needs from you and the one action (the\n * caller's: a copyable command, or Approve grant). The full list folds away\n * under its count so the state stays one calm card. Loaded lazily — it is\n * never on the chat first-paint path. Decisions live in\n * setup-checklist-model.ts.\n */\nimport type { ReactNode } from 'react';\nimport type { AuthoritySetupReportV1 } from '../../../../core/authority/types.js';\nimport { IconCheck, IconX } from '../../../components/primitives/icons.js';\nimport { detailParts, nextRow, safeSetupLink, setupProgress, setupRows, type SetupRow, type SetupRowMark } from './setup-checklist-model.js';\nimport styles from './setup-checklist.module.css';\n\nconst MARK_WORD: Readonly<Record<SetupRowMark, string>> = Object.freeze({\n done: 'done',\n next: 'next',\n todo: 'to do',\n blocked: 'blocked',\n failed: 'failed',\n});\n\nfunction Needs({ needs }: { needs: SetupRow['needs'] }) {\n if (needs.length === 0) return null;\n return (\n <span className={styles.needs} aria-label={`Needs ${needs.map((n) => n.label).join(', ')}`}>\n {needs.map((n) => (\n <span key={n.id} className={styles.need} data-need={n.id}>\n {n.label}\n </span>\n ))}\n </span>\n );\n}\n\nfunction Mark({ mark }: { mark: SetupRowMark }) {\n return (\n <span className={styles.mark} data-mark={mark} aria-hidden=\"true\">\n {mark === 'done' ? <IconCheck size={10} strokeWidth={2.5} /> : mark === 'blocked' || mark === 'failed' ? <IconX size={10} strokeWidth={2.5} /> : null}\n </span>\n );\n}\n\nfunction linkLabel(row: SetupRow): string {\n if (row.id === 'github-app') return 'Open the install page';\n if (row.id === 'trust-root') return 'Open the pull request';\n return 'Open on GitHub';\n}\n\nexport interface SetupChecklistProps {\n report: AuthoritySetupReportV1;\n /** The one action for the next step (a copyable command, Approve grant…), rendered right under it. */\n action?: ReactNode;\n /** Show every step unfolded (onboarding); the \"off\" state keeps them folded under the count. */\n open?: boolean;\n}\n\nexport function SetupChecklist({ report, action = null, open = false }: SetupChecklistProps) {\n const rows = setupRows(report);\n const next = nextRow(report);\n const { ready, total } = setupProgress(report);\n const link = next ? safeSetupLink(next.link) : null;\n return (\n <div className={styles.checklist} data-testid=\"setup-checklist\">\n {next ? (\n <div className={styles.next} data-mark={next.mark}>\n <div className={styles.nextHead}>\n <span className={styles.nextLabel}>{next.mark === 'failed' ? 'Failed' : next.mark === 'blocked' ? 'Blocked' : 'Next'}</span>\n <span className={styles.nextTitle}>{next.label}</span>\n <Needs needs={next.needs} />\n </div>\n <p className={styles.nextDetail}>\n {detailParts(next.detail).map((part, i) => (part.code ? <code key={i} className={styles.inlineCode}>{part.text}</code> : <span key={i}>{part.text}</span>))}\n </p>\n </div>\n ) : null}\n {action}\n {next && link ? (\n <a className={styles.link} href={link} target=\"_blank\" rel=\"noreferrer noopener\">\n {linkLabel(next)} ↗\n </a>\n ) : null}\n <details className={styles.all} open={open || undefined}>\n <summary className={styles.summary}>\n <span className={styles.count}>\n {ready} of {total} ready\n </span>\n <span className={styles.pips} aria-hidden=\"true\">\n {rows.map((row) => (\n <span key={row.id} className={styles.pip} data-mark={row.mark} />\n ))}\n </span>\n </summary>\n <ol className={styles.steps} aria-label={`Setup: ${ready} of ${total} ready`}>\n {rows.map((row) => (\n <li key={row.id} className={styles.step} data-mark={row.mark} aria-current={row.mark === 'next' ? 'step' : undefined}>\n <Mark mark={row.mark} />\n <span className={styles.stepLabel}>{row.label}</span>\n {row.mark === 'blocked' ? <span className={styles.stepNote}>blocked</span> : null}\n {row.mark !== 'done' ? <Needs needs={row.needs} /> : null}\n {row.mark === 'blocked' ? null : <span className={styles.visuallyHidden}>{` — ${MARK_WORD[row.mark]}`}</span>}\n </li>\n ))}\n </ol>\n </details>\n </div>\n );\n}\n\nexport default SetupChecklist;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EvidenceTimeline-D1GB9F-f.js","assets/StatusBadge-zR7YgIa8.js","assets/context-model-DYkDKK6C.js","assets/verse-model-DAOz9LrY.js","assets/compaction-point-VL9oegWS.js","assets/transient-events-nTLhMBND.js","assets/format-V6IiIMAL.js","assets/format-D7nBg2bn.js","assets/seat-readiness-a5B9iqP-.js","assets/Button-CMR_Op-0.js","assets/Sheet-Czuz3h6A.js","assets/focus-trap-C2rynI8q.js","assets/types-BGCo0sbt.js","assets/cloud-model-CzKeuxfm.js","assets/global-1SED_aTT.css","assets/StatusBadge-BVi0IBb9.css","assets/Button-DrnKsvnQ.css","assets/Sheet-ChxlNivX.css","assets/EvidenceTimeline-PBDAiSuG.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n,t as r}from"./index-_izD07R9.js";import{l as i,u as a}from"./global-CYfRwH6t.js";import{j as o}from"./VerseShared-CFE5B-IY.js";import{l as s}from"./icons-BBm_Cy62.js";import{r as c}from"./cloud-queries-DrR_QeUK.js";import{a as l,f as u,g as d,h as f,i as p,m,n as h,o as g,p as _,r as v,s as y,t as b}from"./ladder-queries-BIpJVqxu.js";import{t as x}from"./nav-DC0ynjdb.js";import{n as S,t as C}from"./Surface-BEToBKC3.js";import{t as w}from"./autonomy-ladder.module-DDhzYLrs.js";var T=e(n(),1),E=t(),D=(0,T.lazy)(()=>r(()=>import(`./EvidenceTimeline-D1GB9F-f.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]))),O=[`G0`,`G1`,`G1b`,`G2`,`G3`,`G4`,`G5`,`G6`,`G7`],k={pass:`passed`,refuse:`refused`,"owner-lane":`sent to the owner lane`,wait:`waiting`};function A({decision:e}){let t=new Map(e.gates.map(e=>[e.gate,e]));return(0,E.jsx)(`ul`,{className:w.gates,"aria-label":`Gate verdicts`,children:O.map(e=>{let n=t.get(e),r=n?`${e} ${k[n.verdict]??n.verdict}${n.verdict===`pass`?``:`: ${n.reason}`}`:`${e} has not reported`;return(0,E.jsx)(`li`,{className:w.gate,"data-tone":n?y(n.verdict):`absent`,title:r,"aria-label":r,children:e},e)})})}function j({d:e,now:t,onEvidence:n,evidence:r}){let i=f(e),a=u(e);return(0,E.jsxs)(`li`,{className:w.decision,"data-outcome":e.outcome,children:[(0,E.jsxs)(`div`,{className:w.decisionHead,children:[(0,E.jsx)(`span`,{className:w.repo,title:e.repo,children:m(e.repo)}),e.prNumber===null?null:(0,E.jsxs)(`span`,{className:w.meta,children:[`#`,e.prNumber]}),(0,E.jsx)(`span`,{className:w.outcome,"data-tone":v[e.outcome],children:p[e.outcome]}),(0,E.jsxs)(`span`,{className:w.meta,children:[[i,e.stageId?d(e.stageId):null,l(e.at,t)].filter(Boolean).join(` · `),e.headShort?(0,E.jsxs)(E.Fragment,{children:[` · `,(0,E.jsx)(`span`,{className:w.mono,title:`proposal ${e.proposalId}`,children:e.headShort})]}):null]})]}),(0,E.jsxs)(`span`,{className:w.links,children:[r?(0,E.jsx)(`button`,{type:`button`,className:w.decisionLink,onClick:()=>n(r),children:`Evidence`}):null,a?(0,E.jsxs)(`a`,{className:w.decisionLink,href:a,target:`_blank`,rel:`noreferrer noopener`,children:[`PR `,(0,E.jsx)(s,{width:11,height:11,"aria-hidden":`true`})]}):null]}),(0,E.jsx)(`p`,{className:w.why,children:e.why}),(0,E.jsx)(A,{decision:e})]})}function M({now:e}){let t=i(h,{freshMs:15e3}),n=a(h);o(n,b);let r=i(c,{freshMs:6e4}).data?.value?.tasks??null,[s,u]=(0,T.useState)(null),f=t.data?.value??null,p=(0,T.useMemo)(()=>_(f),[f]),m=(0,T.useMemo)(()=>{let e=new Map;for(let t of f?.decisions??[])e.set(t.outcome,(e.get(t.outcome)??0)+1);return e},[f]),v=f?f.decisions.length===0?`Nothing has reached the gates yet`:[`${m.get(`would-merge`)??0} would merge`,`${m.get(`merged`)??0} merged`,`${m.get(`refused`)??0} refused`].join(` · `):null;return(0,E.jsxs)(`div`,{id:x(`shadow-decisions`),className:w.stackGap,children:[p.length>0?(0,E.jsx)(`ul`,{className:w.regressions,"aria-label":`Ladder regressions`,children:p.map(t=>(0,E.jsxs)(`li`,{className:w.regression,role:`alert`,children:[(0,E.jsxs)(`span`,{className:w.regressionTitle,children:[`▲ Dropped back to `,d(t.toStageId),t.fromStageId?` from ${d(t.fromStageId)}`:``]}),(0,E.jsx)(`span`,{children:t.breach??`A breach of the stage’s limits.`}),(0,E.jsx)(`span`,{className:w.when,children:l(t.at,e)})]},`${t.at}-${t.toStageId}`))}):null,(0,E.jsx)(C,{title:`Merge decisions`,caption:v,children:t.data?f?f.decisions.length===0?(0,E.jsx)(S,{children:`No proposal has been through the merge gates under this grant yet. Each one will show here with its G0–G7 verdicts.`}):(0,E.jsxs)(E.Fragment,{children:[f.chain===`broken`?(0,E.jsx)(S,{tone:`danger`,children:f.reason??`The authority ledger is broken; these rows are the verified part.`}):null,(0,E.jsx)(`ol`,{className:w.decisions,"aria-label":`Decisions, newest first`,children:f.decisions.map(t=>(0,E.jsx)(j,{d:t,now:e,evidence:g(t,r),onEvidence:u},t.proposalId))}),f.truncated?(0,E.jsx)(`p`,{className:w.muted,children:"Older decisions are in the authority ledger (`ashlr authority status`)."}):null]}):(0,E.jsx)(S,{tone:`unknown`,children:t.data.reason??`The decisions did not answer.`}):(0,E.jsx)(`p`,{className:w.muted,"aria-busy":`true`,children:`Reading the gate decisions…`})}),s?(0,E.jsx)(T.Suspense,{fallback:null,children:(0,E.jsx)(D,{taskId:s.id,title:s.title,open:!0,onClose:()=>u(null),now:e})}):null]})}export{M as ShadowDecisions,M as default};
|
|
3
|
+
//# sourceMappingURL=ShadowDecisions-BP2WgGMi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/fleet/ShadowDecisions.tsx"],"sourcesContent":["/**\n * routes/verse/fleet/ShadowDecisions.tsx — every decision the merge gates\n * made under the standing grant, on Fleet (⌘2; 3.14).\n *\n * ▲ Dropped back to Shadow from 2a — 1 sandbox violation in stage 2a · 3 h ago\n * Shadow decisions Shadow · 2 would-merge\n * ashlrcode #12 Would merge +30 −4 · 2 files · low · Shadow · 2 h ago\n * Every gate passed; held because the ladder is in shadow, so it only proposes.\n * [G0][G1][G1b][G2][G3][G4][G5][G6][G7] Evidence · PR ↗\n *\n * One row per proposal (newest first) from GET …/authority/ledger?view=decisions\n * (core/verse/autonomy-ladder.ts): the last verdict of each gate as a chip,\n * the outcome and WHY in one sentence. Ladder regressions sit above the list,\n * loud, with their breach. \"Evidence\" opens the 3.13 cloud timeline when a\n * cloud task's intake filed the proposal; \"PR\" opens the fleet PR on GitHub.\n *\n * LAZY: FleetSection loads this with React.lazy; the timeline is lazier still.\n */\nimport { lazy, Suspense, useMemo, useState } from 'react';\nimport type { GateId } from '../../../../core/fleet/fleet-types.js';\nimport type { ShadowDecisionV1 } from '../../../../core/verse/autonomy-ladder.js';\nimport { IconExternalLink } from '../../../components/primitives/icons.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { cloudQuery } from '../cloud/cloud-queries.js';\nimport { Card, CardNote } from '../command/Surface.js';\nimport { anchorId } from '../command/nav.js';\nimport {\n ago,\n cloudTaskFor,\n gateTone,\n OUTCOME_TONE,\n OUTCOME_WORD,\n prUrl,\n recentRegressions,\n repoShort,\n sizeLine,\n stageLabel,\n} from '../command/ladder-model.js';\nimport { DECISIONS_POLL_MS, decisionsQuery } from '../command/ladder-queries.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport styles from '../command/autonomy-ladder.module.css';\n\nconst EvidenceTimeline = lazy(() => import('../cloud/EvidenceTimeline.js'));\n\nconst GATES: readonly GateId[] = ['G0', 'G1', 'G1b', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7'];\n\nconst VERDICT_WORD: Record<string, string> = { pass: 'passed', refuse: 'refused', 'owner-lane': 'sent to the owner lane', wait: 'waiting' };\n\nfunction GateChips({ decision }: { decision: ShadowDecisionV1 }) {\n const byGate = new Map(decision.gates.map((g) => [g.gate, g]));\n return (\n <ul className={styles.gates} aria-label=\"Gate verdicts\">\n {GATES.map((gate) => {\n const v = byGate.get(gate);\n const text = v ? `${gate} ${VERDICT_WORD[v.verdict] ?? v.verdict}${v.verdict === 'pass' ? '' : `: ${v.reason}`}` : `${gate} has not reported`;\n return (\n <li key={gate} className={styles.gate} data-tone={v ? gateTone(v.verdict) : 'absent'} title={text} aria-label={text}>\n {gate}\n </li>\n );\n })}\n </ul>\n );\n}\n\nfunction DecisionRow({ d, now, onEvidence, evidence }: { d: ShadowDecisionV1; now: number; evidence: { id: string; title: string } | null; onEvidence: (task: { id: string; title: string }) => void }) {\n const size = sizeLine(d);\n const pr = prUrl(d);\n return (\n <li className={styles.decision} data-outcome={d.outcome}>\n <div className={styles.decisionHead}>\n <span className={styles.repo} title={d.repo}>{repoShort(d.repo)}</span>\n {d.prNumber !== null ? <span className={styles.meta}>#{d.prNumber}</span> : null}\n <span className={styles.outcome} data-tone={OUTCOME_TONE[d.outcome]}>{OUTCOME_WORD[d.outcome]}</span>\n <span className={styles.meta}>\n {[size, d.stageId ? stageLabel(d.stageId) : null, ago(d.at, now)].filter(Boolean).join(' · ')}\n {d.headShort ? <> · <span className={styles.mono} title={`proposal ${d.proposalId}`}>{d.headShort}</span></> : null}\n </span>\n </div>\n <span className={styles.links}>\n {evidence ? (\n <button type=\"button\" className={styles.decisionLink} onClick={() => onEvidence(evidence)}>\n Evidence\n </button>\n ) : null}\n {pr ? (\n <a className={styles.decisionLink} href={pr} target=\"_blank\" rel=\"noreferrer noopener\">\n PR <IconExternalLink width={11} height={11} aria-hidden=\"true\" />\n </a>\n ) : null}\n </span>\n <p className={styles.why}>{d.why}</p>\n <GateChips decision={d} />\n </li>\n );\n}\n\nexport function ShadowDecisions({ now }: { now: number }) {\n const read = useQuery(decisionsQuery, { freshMs: 15_000 });\n const refetch = useRefetch(decisionsQuery);\n usePollWhileVisible(refetch, DECISIONS_POLL_MS);\n // Only to link a proposal to its cloud task's timeline; its absence just drops the link.\n const cloud = useQuery(cloudQuery, { freshMs: 60_000 });\n const tasks = cloud.data?.value?.tasks ?? null;\n const [open, setOpen] = useState<{ id: string; title: string } | null>(null);\n\n const value = read.data?.value ?? null;\n const regressions = useMemo(() => recentRegressions(value), [value]);\n const counts = useMemo(() => {\n const byOutcome = new Map<string, number>();\n for (const d of value?.decisions ?? []) byOutcome.set(d.outcome, (byOutcome.get(d.outcome) ?? 0) + 1);\n return byOutcome;\n }, [value]);\n const caption = value\n ? value.decisions.length === 0\n ? 'Nothing has reached the gates yet'\n : [`${counts.get('would-merge') ?? 0} would merge`, `${counts.get('merged') ?? 0} merged`, `${counts.get('refused') ?? 0} refused`].join(' · ')\n : null;\n\n return (\n <div id={anchorId('shadow-decisions')} className={styles.stackGap}>\n {regressions.length > 0 ? (\n <ul className={styles.regressions} aria-label=\"Ladder regressions\">\n {regressions.map((m) => (\n <li key={`${m.at}-${m.toStageId}`} className={styles.regression} role=\"alert\">\n <span className={styles.regressionTitle}>\n ▲ Dropped back to {stageLabel(m.toStageId)}{m.fromStageId ? ` from ${stageLabel(m.fromStageId)}` : ''}\n </span>\n <span>{m.breach ?? 'A breach of the stage’s limits.'}</span>\n <span className={styles.when}>{ago(m.at, now)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n <Card title=\"Merge decisions\" caption={caption}>\n {!read.data ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the gate decisions…</p>\n ) : !value ? (\n <CardNote tone=\"unknown\">{read.data.reason ?? 'The decisions did not answer.'}</CardNote>\n ) : value.decisions.length === 0 ? (\n <CardNote>No proposal has been through the merge gates under this grant yet. Each one will show here with its G0–G7 verdicts.</CardNote>\n ) : (\n <>\n {value.chain === 'broken' ? <CardNote tone=\"danger\">{value.reason ?? 'The authority ledger is broken; these rows are the verified part.'}</CardNote> : null}\n <ol className={styles.decisions} aria-label=\"Decisions, newest first\">\n {value.decisions.map((d) => (\n <DecisionRow key={d.proposalId} d={d} now={now} evidence={cloudTaskFor(d, tasks)} onEvidence={setOpen} />\n ))}\n </ol>\n {value.truncated ? <p className={styles.muted}>Older decisions are in the authority ledger (`ashlr authority status`).</p> : null}\n </>\n )}\n </Card>\n {open ? (\n <Suspense fallback={null}>\n <EvidenceTimeline taskId={open.id} title={open.title} open onClose={() => setOpen(null)} now={now} />\n </Suspense>\n ) : null}\n </div>\n );\n}\n\nexport default ShadowDecisions;\n"],"file":"ShadowDecisions-BP2WgGMi.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,o as n,s as r}from"./index-_izD07R9.js";import{t as i}from"./focus-trap-C2rynI8q.js";import{n as a}from"./Button-CMR_Op-0.js";import{T as o}from"./icons-BBm_Cy62.js";var s=e(r(),1),c=e(n(),1),l={backdrop:`_backdrop_1sjha_1`,fade:`_fade_1sjha_1`,panel:`_panel_1sjha_10`,right:`_right_1sjha_18`,"slide-right":`_slide-right_1sjha_1`,left:`_left_1sjha_24`,"slide-left":`_slide-left_1sjha_1`,header:`_header_1sjha_30`,heading:`_heading_1sjha_40`,title:`_title_1sjha_44`,description:`_description_1sjha_52`,body:`_body_1sjha_59`,footer:`_footer_1sjha_66`},u=t();function d({open:e,onClose:t,titleId:n,title:r,description:d,footer:f,side:p=`right`,width:m=460,initialFocusRef:h,children:g}){let _=(0,s.useRef)(null);return i({open:e,containerRef:_,onClose:t,initialFocusRef:h}),e?(0,c.createPortal)((0,u.jsx)(`div`,{className:l.backdrop,onMouseDown:e=>e.target===e.currentTarget&&t(),children:(0,u.jsxs)(`div`,{ref:_,role:`dialog`,"aria-modal":`true`,"aria-labelledby":n,tabIndex:-1,className:`${l.panel} ${l[p]}`,style:{width:`min(${m}px, calc(100vw - var(--space-8)))`},children:[(0,u.jsxs)(`header`,{className:l.header,children:[(0,u.jsxs)(`div`,{className:l.heading,children:[(0,u.jsx)(`h2`,{id:n,className:l.title,children:r}),d?(0,u.jsx)(`p`,{className:l.description,children:d}):null]}),(0,u.jsx)(a,{variant:`ghost`,size:`sm`,icon:(0,u.jsx)(o,{}),"aria-label":`Close`,onClick:t})]}),(0,u.jsx)(`div`,{className:l.body,children:g}),f?(0,u.jsx)(`footer`,{className:l.footer,children:f}):null]})}),document.body):null}export{d as t};
|
|
2
|
+
//# sourceMappingURL=Sheet-Czuz3h6A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sheet-Czuz3h6A.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Sheet.module.css","../../../../../../src/web-ui/components/primitives/Sheet.tsx"],"sourcesContent":[".backdrop {\n position: fixed;\n inset: 0;\n background: var(--bg-overlay);\n z-index: var(--z-dialog);\n display: flex;\n animation: fade var(--duration-fast) var(--ease-standard);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--bg-surface);\n box-shadow: var(--shadow-dialog);\n}\n\n.right {\n margin-left: auto;\n border-left: 1px solid var(--border-default);\n animation: slide-right var(--duration-base) var(--ease-decelerate);\n}\n\n.left {\n margin-right: auto;\n border-right: 1px solid var(--border-default);\n animation: slide-left var(--duration-base) var(--ease-decelerate);\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-3);\n min-height: var(--strip-height);\n padding: var(--space-3) var(--space-4);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.heading {\n min-width: 0;\n}\n\n.title {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n}\n\n.description {\n margin-top: 2px;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n.body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n padding: var(--space-4);\n}\n\n.footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--space-2);\n padding: var(--space-3) var(--space-4);\n border-top: 1px solid var(--border-subtle);\n}\n\n@keyframes fade {\n from {\n opacity: 0;\n }\n}\n\n@keyframes slide-right {\n from {\n transform: translateX(4px);\n opacity: 0;\n }\n}\n\n@keyframes slide-left {\n from {\n transform: translateX(-4px);\n opacity: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .backdrop,\n :root:not([data-motion=\"full\"]) .panel {\n animation: none;\n }\n}\n\n:root[data-motion=\"reduce\"] .backdrop,\n:root[data-motion=\"reduce\"] .panel {\n animation: none;\n}\n","/**\n * components/primitives/Sheet.tsx — a side overlay for detail that would\n * bury the main column: a proposal's diff, an audit entry, a seat's full\n * usage. Same focus contract as Dialog (shared ./focus-trap.ts), different\n * geometry: it enters from an edge and keeps the underlying view visible.\n *\n * Below 900px the shell collapses its panels (design doc §6); a sheet is the\n * right target for that overflow, which is why the width is capped in `vw`\n * as well as px.\n */\nimport { useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useFocusTrap } from './focus-trap.js';\nimport { IconButton } from './Button.js';\nimport { IconX } from './icons.js';\nimport styles from './Sheet.module.css';\n\nexport interface SheetProps {\n open: boolean;\n onClose: () => void;\n titleId: string;\n title: ReactNode;\n /** One quiet line under the title. */\n description?: ReactNode;\n /** Pinned to the bottom edge — actions, never scrolled out of reach. */\n footer?: ReactNode;\n side?: 'right' | 'left';\n width?: number;\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n children: ReactNode;\n}\n\nexport function Sheet({\n open,\n onClose,\n titleId,\n title,\n description,\n footer,\n side = 'right',\n width = 460,\n initialFocusRef,\n children,\n}: SheetProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n useFocusTrap({ open, containerRef: panelRef, onClose, initialFocusRef });\n\n if (!open) return null;\n\n return createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n className={`${styles.panel} ${styles[side]}`}\n style={{ width: `min(${width}px, calc(100vw - var(--space-8)))` }}\n >\n <header className={styles.header}>\n <div className={styles.heading}>\n <h2 id={titleId} className={styles.title}>\n {title}\n </h2>\n {description ? <p className={styles.description}>{description}</p> : null}\n </div>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconX />} aria-label=\"Close\" onClick={onClose} />\n </header>\n <div className={styles.body}>{children}</div>\n {footer ? <footer className={styles.footer}>{footer}</footer> : null}\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":"6mBCgCA,SAAgB,EAAM,CACpB,OACA,UACA,UACA,QACA,cACA,SACA,OAAO,QACP,QAAQ,IACR,kBACA,YACa,CACb,IAAM,GAAA,EAAW,EAAA,OAAA,CAAuB,IAAI,EAK5C,OAJA,EAAa,CAAE,OAAM,aAAc,EAAU,UAAS,iBAAgB,CAAC,EAElE,GAEL,EAAO,EAAA,aAAA,EACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAU,YAAc,GAAM,EAAE,SAAW,EAAE,eAAiB,EAAQ,EAC3F,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,IAAK,EACL,KAAK,SACL,aAAW,OACX,kBAAiB,EACjB,SAAU,GACV,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,KACrC,MAAO,CAAE,MAAO,OAAO,EAAM,kCAAmC,EAPlE,SAAA,EASE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,OAA1B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,MAChC,SAAA,CACC,CAAA,EACH,GAAc,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAc,SAAA,CAAe,CAAA,EAAI,IAClE,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,CAAA,EAAG,aAAW,QAAQ,QAAS,CAAU,CAAA,CACvF,KACR,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAO,UAAc,CAAA,EAC3C,GAAS,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,OAAS,SAAA,CAAe,CAAA,EAAI,IAC7D,GACF,CAAA,EACL,SAAS,IACX,EA3BkB,IA4BpB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-hePW80VL.js";import{n,s as r}from"./index-_izD07R9.js";import{t as i}from"./Dialog-DI5D6Is2.js";import{Bt as a,C as o,Rt as s}from"./VerseConsoleApp-DO84Xscn.js";import{c}from"./command-catalog-COH2G2xv.js";var l=t(r(),1),u={dialog:`_dialog_1qd4e_3`,scroll:`_scroll_1qd4e_5`,grid:`_grid_1qd4e_7`,section:`_section_1qd4e_14`,sectionTitle:`_sectionTitle_1qd4e_16`,list:`_list_1qd4e_26`,row:`_row_1qd4e_28`,action:`_action_1qd4e_37`,note:`_note_1qd4e_46`,keys:`_keys_1qd4e_52`,key:`_key_1qd4e_52`},d=e({ShortcutsOverlay:()=>m,ShortcutsTable:()=>p}),f=n();function p({platform:e}){let t=(0,l.useMemo)(()=>e??s(),[e]),n=(0,l.useMemo)(()=>c(),[]);return(0,f.jsx)(`div`,{className:u.grid,children:n.map(({section:e,commands:n})=>(0,f.jsxs)(`section`,{className:u.section,"aria-label":e,children:[(0,f.jsx)(`h3`,{className:u.sectionTitle,children:e}),(0,f.jsx)(`dl`,{className:u.list,children:n.map(e=>(0,f.jsxs)(`div`,{className:u.row,children:[(0,f.jsxs)(`dt`,{className:u.action,children:[e.title,e.note?(0,f.jsx)(`span`,{className:u.note,children:e.note}):null]}),(0,f.jsx)(`dd`,{className:u.keys,children:e.keys.map(e=>(0,f.jsx)(`kbd`,{className:u.key,children:a(e,t)},a(e,t)))})]},e.id))})]},e))})}function m({onClose:e=o}){let t=(0,l.useId)();return(0,f.jsx)(i,{open:!0,onClose:e,titleId:t,title:`Keyboard shortcuts`,widthClassName:u.dialog,description:`Letters in Needs you work while its list has focus. ⌘ is Ctrl off a Mac.`,children:(0,f.jsx)(`div`,{"data-verse-overlay":`shortcuts`,className:u.scroll,children:(0,f.jsx)(p,{})})})}export{p as n,d as t};
|
|
2
|
+
//# sourceMappingURL=ShortcutsOverlay-D_ICte5N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShortcutsOverlay-D_ICte5N.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/ShortcutsOverlay.module.css","../../../../../../src/web-ui/routes/verse/shell/ShortcutsOverlay.tsx"],"sourcesContent":["/* ⌘/ — the key reference, in columns. */\n\n.dialog { width: min(880px, calc(100vw - var(--space-8))); }\n\n.scroll { max-height: 64vh; overflow-y: auto; margin: 0 calc(var(--space-5) * -1); padding: 0 var(--space-5); }\n\n.grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: var(--space-5) var(--space-6);\n align-items: start;\n}\n\n.section { min-width: 0; }\n\n.sectionTitle {\n margin-bottom: var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.list { margin: 0; }\n\n.row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-1) 0;\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.action {\n display: flex;\n flex-direction: column;\n min-width: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n\n.note {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.keys { display: flex; gap: var(--space-1); margin: 0; flex: none; }\n\n.key {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding: 0 var(--space-1);\n border: 1px solid var(--border-default);\n border-bottom-width: 2px;\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n}\n","/**\n * routes/verse/shell/ShortcutsOverlay.tsx — ⌘/ (unit C1). Every key the\n * workbench answers, read straight from C0's command catalog: the overlay\n * cannot list a key that does not exist, or miss one that does, because it\n * is the same table the key handlers match against.\n *\n * Also rendered inline by Settings ▸ Keyboard (`ShortcutsTable`).\n */\nimport { useId, useMemo } from 'react';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { closeVerseOverlay } from '../verse-ui-store.js';\nimport { detectKeyPlatform, formatChord, shortcutSections, type KeyPlatform } from './command-catalog.js';\nimport styles from './ShortcutsOverlay.module.css';\n\nexport function ShortcutsTable({ platform }: { platform?: KeyPlatform }) {\n const resolved = useMemo(() => platform ?? detectKeyPlatform(), [platform]);\n const sections = useMemo(() => shortcutSections(), []);\n return (\n <div className={styles.grid}>\n {sections.map(({ section, commands }) => (\n <section key={section} className={styles.section} aria-label={section}>\n <h3 className={styles.sectionTitle}>{section}</h3>\n <dl className={styles.list}>\n {commands.map((command) => (\n <div key={command.id} className={styles.row}>\n <dt className={styles.action}>\n {command.title}\n {command.note ? <span className={styles.note}>{command.note}</span> : null}\n </dt>\n <dd className={styles.keys}>\n {command.keys.map((chord) => (\n <kbd key={formatChord(chord, resolved)} className={styles.key}>\n {formatChord(chord, resolved)}\n </kbd>\n ))}\n </dd>\n </div>\n ))}\n </dl>\n </section>\n ))}\n </div>\n );\n}\n\nexport function ShortcutsOverlay({ onClose = closeVerseOverlay }: { onClose?: () => void }) {\n const titleId = useId();\n return (\n <Dialog open onClose={onClose} titleId={titleId} title=\"Keyboard shortcuts\" widthClassName={styles.dialog}\n description=\"Letters in Needs you work while its list has focus. ⌘ is Ctrl off a Mac.\">\n <div data-verse-overlay=\"shortcuts\" className={styles.scroll}>\n <ShortcutsTable />\n </div>\n </Dialog>\n );\n}\n"],"mappings":"qlBCcA,SAAgB,EAAe,CAAE,YAAwC,CACvE,IAAM,GAAA,EAAW,EAAA,QAAA,KAAc,GAAY,EAAkB,EAAG,CAAC,CAAQ,CAAC,EACpE,GAAA,EAAW,EAAA,QAAA,KAAc,EAAiB,EAAG,CAAC,CAAC,EACrD,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KACpB,SAAA,EAAS,KAAK,CAAE,UAAS,eACxB,EAAA,EAAA,KAAA,CAAC,UAAD,CAAuB,UAAW,EAAO,QAAS,aAAY,EAA9D,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,aAAe,SAAA,CAAY,CAAA,GACjD,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAS,IAAK,IACb,EAAA,EAAA,KAAA,CAAC,MAAD,CAAsB,UAAW,EAAO,IAAxC,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,OAAtB,SAAA,CACG,EAAQ,MACR,EAAQ,MAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAO,SAAA,EAAQ,IAAW,CAAA,EAAI,IACpE,CACJ,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAQ,KAAK,IAAK,IACjB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAwC,UAAW,EAAO,IACvD,SAAA,EAAY,EAAO,CAAQ,CACzB,EAFK,EAAY,EAAO,CAAQ,CAEhC,CACN,CACC,CAAA,CACD,CAZK,EAAA,EAAQ,EAYb,CACN,CACC,CAAA,CACG,CAnBK,EAAA,CAmBL,CACV,CACE,CAAA,CAET,CAEA,SAAgB,EAAiB,CAAE,UAAU,GAA+C,CAC1F,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EACtB,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAA,GAAc,UAAkB,UAAS,MAAM,qBAAqB,eAAgB,EAAO,OACjG,YAAY,2EACZ,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,qBAAmB,YAAY,UAAW,EAAO,OACpD,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,CAAA,CACd,CAAA,CACC,CAAA,CAEZ"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SessionSearch-Bya3EXJl.js","assets/context-queries-D0Aydl5L.js","assets/verse-store-DAqqNIyD.js","assets/transient-events-nTLhMBND.js","assets/context-model-DYkDKK6C.js","assets/use-token-gate-DgnO9fbv.js","assets/context.module-BijAfoJw.js","assets/global-1SED_aTT.css","assets/context-DiToyj6s.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n,t as r}from"./index-_izD07R9.js";import{l as i}from"./global-CYfRwH6t.js";import{t as a}from"./Dialog-DI5D6Is2.js";import{t as o}from"./RefreshIndicator-BJoefKSa.js";import{i as s}from"./SkipToContent-B0GAKhYQ.js";import{Bt as c,St as l}from"./VerseConsoleApp-DO84Xscn.js";import{T as u,c as d,g as f,h as p,o as m,y as h}from"./VerseShared-CFE5B-IY.js";import{b as g,u as _,w as v,x as y}from"./verse-model-DAOz9LrY.js";import{n as b}from"./seat-subscription-Cut6eC-8.js";import{_ as ee,c as x,f as S,g as C,h as w,i as T,l as E,n as D,r as O,t as k,v as A}from"./workspace-model-C-q_I8xN.js";import{n as te,t as j}from"./folder-picker-C8zo3A56.js";import{t as M}from"./Button-CMR_Op-0.js";import{t as N}from"./ActionMenu-Bv-kQxD4.js";import{t as P}from"./LiveTimer-DUgUBr49.js";import{n as F,r as I,t as L}from"./sidebar-model-COzIPSiP.js";import{b as R,c as z,d as B,m as V,s as H,t as U}from"./dock-icons-DPXFt10d.js";import{f as W,s as G,u as ne}from"./verse-icons-C92Qt7rh.js";import{a as K}from"./command-catalog-COH2G2xv.js";var q=e(n(),1),J={width:`_width_ifku5_4`,form:`_form_ifku5_6`,field:`_field_ifku5_7`,label:`_label_ifku5_8`,select:`_select_ifku5_17`,input:`_input_ifku5_18`,hint:`_hint_ifku5_38`,error:`_error_ifku5_39`,rootRow:`_rootRow_ifku5_49`,rowButton:`_rowButton_ifku5_58`,addRoot:`_addRoot_ifku5_59`,checkbox:`_checkbox_ifku5_76`,priorityRow:`_priorityRow_ifku5_84`,priorityPath:`_priorityPath_ifku5_90`,actions:`_actions_ifku5_101`,spacer:`_spacer_ifku5_102`,confirm:`_confirm_ifku5_103`,cancel:`_cancel_ifku5_105`,save:`_save_ifku5_106`,remove:`_remove_ifku5_107`,danger:`_danger_ifku5_108`},Y=t();function X(e){let{open:t,workspace:n,initialRoots:r,priorities:i,focusSectionId:o=null,onClose:s,onSaved:c,onDeleted:l}=e,u=(0,q.useId)(),_=(0,q.useId)(),[v,y]=(0,q.useState)(``),[b,C]=(0,q.useState)([``]),[A,M]=(0,q.useState)(!1),[N,P]=(0,q.useState)(!1),[F,I]=(0,q.useState)({}),[L,R]=(0,q.useState)(!1),[z,B]=(0,q.useState)(!1),[V,H]=(0,q.useState)(null);(0,q.useEffect)(()=>{if(!t)return;let e=n;y(e?.name??``),C(e?ee(e):[...r??[]].filter(e=>e.length>0)),M(e?.section??!1),P(e!==null&&o===e.id),I({}),R(!1),B(!1),H(null)},[t]);let U=b.length===0?[``]:b,W=j();function G(e,t){C(U.map((n,r)=>r===e?t:n))}async function ne(e){let t=await te();t!==null&&t.length>0&&G(e,t)}function K(e){return F[e]??E(e,i)}async function X(e){e.preventDefault();let t=w(v,U);if(!t.ok){H(t.error);return}B(!0),H(null);try{let e=n===null?await m({name:t.name,roots:t.roots,section:A}):await h(n.id,{name:t.name,roots:t.roots,section:A});for(let e of t.roots){let t=F[e];t!==void 0&&t!==E(e,i)&&await f(e,t)}let r=n!==null&&o===n.id;A&&N!==r&&await p(N?e.id:null),c?.(e),s()}catch(e){H(e instanceof Error?e.message:String(e))}finally{B(!1)}}async function Z(){if(n!==null){B(!0),H(null);try{await d(n.id),l?.(n.id),s()}catch(e){H(e instanceof Error?e.message:String(e)),B(!1)}}}return(0,Y.jsx)(a,{open:t,onClose:s,titleId:u,title:n===null?`Save a project`:`Edit project`,description:`Saved projects stay in the picker — they do not need a chat on them first.`,widthClassName:J.width,children:(0,Y.jsxs)(`form`,{className:J.form,onSubmit:e=>void X(e),noValidate:!0,children:[(0,Y.jsxs)(`label`,{className:J.field,htmlFor:_,children:[(0,Y.jsx)(`span`,{className:J.label,children:`Name`}),(0,Y.jsx)(`input`,{id:_,className:J.input,value:v,onChange:e=>y(e.target.value),placeholder:`Defaults to the folder’s own name`,maxLength:120,autoComplete:`off`})]}),(0,Y.jsxs)(`div`,{className:J.field,children:[(0,Y.jsx)(`span`,{className:J.label,children:`Folders`}),(0,Y.jsx)(`p`,{className:J.hint,children:`The first folder is the primary: it is the chat’s working directory. Move a folder to the top to make it the primary.`}),U.map((e,t)=>(0,Y.jsxs)(`div`,{className:J.rootRow,children:[(0,Y.jsx)(`input`,{className:J.input,value:e,title:e||void 0,onChange:e=>G(t,e.target.value),placeholder:`/absolute/path/to/folder`,"aria-label":S(t),autoComplete:`off`,spellCheck:!1}),W?(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,onClick:()=>void ne(t),"aria-label":`Choose ${S(t).toLowerCase()}`,children:`Choose folder…`}):null,(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,disabled:t===0,onClick:()=>C(x(U,t,`up`)),"aria-label":`Move ${S(t).toLowerCase()} up`,title:`Move ${S(t).toLowerCase()} up`,children:(0,Y.jsx)(`span`,{"aria-hidden":`true`,children:`↑`})}),(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,disabled:t===U.length-1,onClick:()=>C(x(U,t,`down`)),"aria-label":`Move ${S(t).toLowerCase()} down`,title:`Move ${S(t).toLowerCase()} down`,children:(0,Y.jsx)(`span`,{"aria-hidden":`true`,children:`↓`})}),(0,Y.jsx)(`button`,{type:`button`,className:J.rowButton,disabled:U.length===1,onClick:()=>C(U.filter((e,n)=>n!==t)),"aria-label":`Remove ${S(t).toLowerCase()}`,children:`Remove`})]},t)),U.length<8?(0,Y.jsx)(`button`,{type:`button`,className:J.addRoot,onClick:()=>C([...U,``]),children:`Add a folder`}):null,U.length>1?(0,Y.jsx)(`p`,{className:J.hint,children:k}):null]}),(0,Y.jsxs)(`div`,{className:J.field,children:[(0,Y.jsxs)(`label`,{className:J.checkbox,children:[(0,Y.jsx)(`input`,{type:`checkbox`,checked:A,onChange:e=>M(e.target.checked)}),(0,Y.jsx)(`span`,{children:`Offer this project to the autonomous lane as a section`})]}),A?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`label`,{className:J.checkbox,children:[(0,Y.jsx)(`input`,{type:`checkbox`,checked:N,onChange:e=>P(e.target.checked)}),(0,Y.jsx)(`span`,{children:`Focus the fleet on this section`})]}),(0,Y.jsx)(`p`,{className:J.hint,children:O}),U.filter(e=>e.trim().length>0).map((e,t)=>(0,Y.jsxs)(`div`,{className:J.priorityRow,children:[(0,Y.jsx)(`span`,{className:J.priorityPath,title:e,children:g(e.trim())}),(0,Y.jsx)(`select`,{className:J.select,"aria-label":`Priority for ${e}`,value:K(e.trim()),onChange:t=>I({...F,[e.trim()]:t.target.value}),children:T.map(e=>(0,Y.jsx)(`option`,{value:e,children:D[e]},e))})]},`${e}-${t}`))]}):null]}),V?(0,Y.jsx)(`p`,{role:`alert`,className:J.error,children:V}):null,(0,Y.jsxs)(`div`,{className:J.actions,children:[n===null?null:L?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`span`,{className:J.confirm,children:`Forget this project? Chats already on it are untouched.`}),(0,Y.jsx)(`button`,{type:`button`,className:J.danger,onClick:()=>void Z(),disabled:z,children:`Forget`}),(0,Y.jsx)(`button`,{type:`button`,className:J.cancel,onClick:()=>R(!1),children:`Keep`})]}):(0,Y.jsx)(`button`,{type:`button`,className:J.remove,onClick:()=>R(!0),disabled:z,children:`Forget project`}),(0,Y.jsx)(`span`,{className:J.spacer}),(0,Y.jsx)(`button`,{type:`button`,className:J.cancel,onClick:s,children:`Cancel`}),(0,Y.jsx)(`button`,{type:`submit`,className:J.save,disabled:z,children:z?`Saving…`:`Save project`})]})]})})}var Z={projects:`_projects_izay2_4`,head:`_head_izay2_10`,headText:`_headText_izay2_23`,add:`_add_izay2_25`,list:`_list_izay2_39`,project:`_project_izay2_4`,name:`_name_izay2_55`,summary:`_summary_izay2_64`,empty:`_empty_izay2_72`};function re(){let e=i(u),t=e.data?.workspaces??[],[n,r]=(0,q.useState)({open:!1,workspace:null});return(0,Y.jsxs)(`section`,{className:Z.projects,"aria-label":`Saved projects`,children:[(0,Y.jsxs)(`h2`,{className:Z.head,children:[(0,Y.jsx)(`span`,{className:Z.headText,children:`Projects`}),(0,Y.jsx)(`button`,{type:`button`,className:Z.add,title:`Save a project`,"aria-label":`Save a project`,onClick:()=>r({open:!0,workspace:null}),children:(0,Y.jsx)(G,{})})]}),t.length>0?(0,Y.jsx)(`ul`,{className:Z.list,children:t.map(e=>{let t=C(e)??``;return(0,Y.jsx)(`li`,{children:(0,Y.jsxs)(`button`,{type:`button`,className:Z.project,title:t?`${e.name}\n${t}`:e.name,"aria-label":`Edit project ${e.name}`,onClick:()=>r({open:!0,workspace:e}),children:[(0,Y.jsx)(`span`,{className:Z.name,children:e.name}),(0,Y.jsx)(`span`,{className:Z.summary,children:A(e)})]})},e.id)})}):e.status===`error`?null:(0,Y.jsx)(`p`,{className:Z.empty,children:`No saved projects yet. Press + to keep a folder you work in.`}),(0,Y.jsx)(X,{open:n.open,workspace:n.workspace,priorities:e.data?.priorities,focusSectionId:e.data?.focusSectionId??null,onClose:()=>r({open:!1,workspace:null})})]})}var Q={sidebar:`_sidebar_1hsd6_1`,head:`_head_1hsd6_9`,headDragStrip:`_headDragStrip_1hsd6_40`,search:`_search_1hsd6_51`,searchIcon:`_searchIcon_1hsd6_58`,iconButton:`_iconButton_1hsd6_80`,scroll:`_scroll_1hsd6_98`,skeleton:`_skeleton_1hsd6_105`,error:`_error_1hsd6_106`,empty:`_empty_1hsd6_125`,emptyTitle:`_emptyTitle_1hsd6_131`,emptyCompact:`_emptyCompact_1hsd6_135`,emptyAction:`_emptyAction_1hsd6_138`,emptyKey:`_emptyKey_1hsd6_153`,group:`_group_1hsd6_163`,groupTitle:`_groupTitle_1hsd6_167`,groupName:`_groupName_1hsd6_177`,enrolled:`_enrolled_1hsd6_178`,groupCount:`_groupCount_1hsd6_182`,list:`_list_1hsd6_192`,session:`_session_1hsd6_195`,marker:`_marker_1hsd6_247`,"engine-claude":`_engine-claude_1hsd6_253`,"engine-codex":`_engine-codex_1hsd6_254`,"engine-grok":`_engine-grok_1hsd6_255`,"engine-local":`_engine-local_1hsd6_256`,sessionText:`_sessionText_1hsd6_195`,running:`_running_1hsd6_267`,"verse-pulse":`_verse-pulse_1hsd6_1`,errored:`_errored_1hsd6_274`,seatSpent:`_seatSpent_1hsd6_291`,time:`_time_1hsd6_304`,footer:`_footer_1hsd6_325`,footerButton:`_footerButton_1hsd6_332`,confirmActions:`_confirmActions_1hsd6_345`,filters:`_filters_1hsd6_362`,filter:`_filter_1hsd6_362`,filterCount:`_filterCount_1hsd6_391`,groupToggle:`_groupToggle_1hsd6_400`,twist:`_twist_1hsd6_416`,row:`_row_1hsd6_428`,sessionBody:`_sessionBody_1hsd6_431`,liveLine:`_liveLine_1hsd6_437`,statusRunning:`_statusRunning_1hsd6_449`,elapsed:`_elapsed_1hsd6_454`,unread:`_unread_1hsd6_460`,waiting:`_waiting_1hsd6_469`,rowMore:`_rowMore_1hsd6_479`,renameRow:`_renameRow_1hsd6_505`,renameInput:`_renameInput_1hsd6_506`},ie=new Map,ae=(0,q.lazy)(()=>r(()=>import(`./SessionSearch-Bya3EXJl.js`).then(e=>({default:e.SessionSearch})),__vite__mapDeps([0,1,2,3,4,5,6,7,8])));function oe(e){let{sessions:t,sessionsStatus:n,sessionsError:r,projects:i,seats:u,selectedId:d,query:f,onQuery:p,onSelect:m,onNew:h,onRetry:g,onCollapse:_,onDisconnect:v,activity:y=null,meta:b=null,metaError:ee=null,localSeen:x=ie,actions:S}=e,C=(0,q.useId)(),w=K(`chat.new`)?.keys[0],T=K(`chat.sidebar`)?.keys[0],E=w?c(w):null,D=T?c(T):null,[O,k]=(0,q.useState)(`all`),[A,te]=(0,q.useState)(!1),[j,P]=(0,q.useState)(null),[F,L]=(0,q.useState)(null),[R,z]=(0,q.useState)(!1),B=(0,q.useId)(),V=(0,q.useRef)(null),H=(0,q.useMemo)(()=>I({sessions:t,projects:i,query:f,filter:O,activity:y,meta:b,localSeen:x,selectedId:d}),[t,i,f,O,y,b,x,d]),U=n===`loading`||n===`idle`&&t.length===0,J=f.trim().length>0,X=(0,q.useRef)(null);function Z(e){if(e.key!==`ArrowDown`)return;let t=X.current?.querySelector($);t&&(e.preventDefault(),t.focus())}function oe(e,t,n){S&&L({row:e,anchor:t,from:n})}return(0,Y.jsxs)(`nav`,{className:Q.sidebar,"aria-label":`Chats`,children:[(0,Y.jsxs)(`div`,{className:Q.head,children:[(0,Y.jsx)(`div`,{className:Q.headDragStrip,"aria-hidden":`true`}),(0,Y.jsxs)(`label`,{className:Q.search,htmlFor:C,children:[(0,Y.jsx)(`span`,{className:Q.searchIcon,"aria-hidden":`true`,children:(0,Y.jsx)(ne,{})}),(0,Y.jsx)(`span`,{className:`visually-hidden`,children:`Search chats and messages`}),(0,Y.jsx)(`input`,{id:C,type:`search`,value:f,placeholder:`Search chats`,autoComplete:`off`,onChange:e=>p(e.target.value),onKeyDown:Z})]}),(0,Y.jsx)(l,{label:`New chat`,shortcut:E??void 0,placement:`bottom`,children:(0,Y.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:h,"aria-label":`New chat`,children:(0,Y.jsx)(G,{})})}),(0,Y.jsx)(l,{label:`Hide chat list`,shortcut:D??void 0,placement:`bottom`,children:(0,Y.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:_,"aria-label":`Hide chat list`,children:(0,Y.jsx)(W,{})})}),n===`refreshing`?(0,Y.jsx)(o,{label:`Refreshing chats`}):null]}),(0,Y.jsx)(ue,{value:O,counts:H.counts,onChange:k}),(0,Y.jsxs)(`div`,{ref:X,className:Q.scroll,onKeyDown:se,children:[(0,Y.jsx)(re,{}),U?(0,Y.jsxs)(`div`,{className:Q.skeleton,"aria-busy":`true`,children:[(0,Y.jsx)(s,{width:`48%`}),(0,Y.jsx)(s,{width:`86%`}),(0,Y.jsx)(s,{width:`74%`}),(0,Y.jsx)(s,{width:`40%`}),(0,Y.jsx)(s,{width:`80%`})]}):n===`error`&&t.length===0?(0,Y.jsxs)(`div`,{role:`alert`,className:Q.error,children:[(0,Y.jsx)(`p`,{children:r??`Could not load chats.`}),(0,Y.jsx)(`button`,{type:`button`,onClick:g,children:`Retry`})]}):H.groups.length===0?(0,Y.jsx)(de,{query:f,filter:O,hasSessions:t.length>0,newChatHint:E,onClearQuery:()=>p(``),onClearFilter:()=>k(`all`),onNew:h}):H.groups.map(e=>(0,Y.jsx)(fe,{group:e,seats:u,selectedId:d,renaming:j,open:e.kind!==`archived`||A||J||O!==`all`,onToggle:e.kind===`archived`?()=>te(e=>!e):void 0,onSelect:m,onMenu:S?oe:void 0,onRenameDone:async(e,t)=>{P(null),S&&t&&t!==e.session.title&&await S.rename(e.session.id,t)}},e.id)),J?(0,Y.jsx)(q.Suspense,{fallback:null,children:(0,Y.jsx)(ae,{query:f,onOpenSession:m,selectedId:d})}):null]}),(0,Y.jsx)(`footer`,{className:Q.footer,children:(0,Y.jsx)(l,{label:`Signs this window out: clears cached chats and unsent drafts here. Chats stay on the hub.`,placement:`top`,children:(0,Y.jsx)(`button`,{type:`button`,onClick:()=>z(!0),className:Q.footerButton,"aria-haspopup":`dialog`,children:`Disconnect from hub`})})}),(0,Y.jsx)(a,{open:R,onClose:()=>z(!1),titleId:B,title:`Disconnect from this hub?`,initialFocusRef:V,description:`Unsent drafts in open chats will be cleared. Your chats stay on the hub; you will need the read token to reconnect.`,children:(0,Y.jsxs)(`div`,{className:Q.confirmActions,children:[(0,Y.jsx)(M,{ref:V,variant:`subtle`,onClick:()=>z(!1),children:`Cancel`}),(0,Y.jsx)(M,{variant:`danger`,onClick:()=>{z(!1),v()},children:`Disconnect`})]})}),F&&S?(0,Y.jsx)(N,{label:`Actions for ${F.row.session.title||`Untitled chat`}`,anchor:F.anchor,returnFocus:F.from,onClose:()=>L(null),items:le(F.row,S,H.metaAvailable,ee,()=>P(F.row.session.id))}):null]})}var $=`[data-focus-key^="verse-session:"]`;function se(e){if(e.altKey||e.metaKey||e.ctrlKey||e.shiftKey)return;let t=e.target;if(!t.matches($))return;let n=[...e.currentTarget.querySelectorAll($)],r=n.indexOf(t),i;if(e.key===`ArrowDown`)i=n[r+1];else if(e.key===`ArrowUp`)i=n[r-1];else if(e.key===`Home`)i=n[0];else if(e.key===`End`)i=n[n.length-1];else return;e.preventDefault(),i?.focus()}function ce(e){let{status:t}=e;switch(t.kind){case`running`:return`Running`;case`failed`:return`Last turn failed`}return e.needsYou?`Waiting for you`:t.kind===`unread`?`${t.newTurns} new turn${t.newTurns===1?``:`s`}`:null}function le(e,t,n,r,i){let a=e.session.id,o=e.status.kind===`running`,s=t.dispatchEnabled?null:`This server was started without dispatch.`,c=s??(n?null:r?`Pins and archive unavailable. ${r}`:`Not available on this server yet.`);return[{id:`pin`,label:e.pinned?`Unpin`:`Pin`,icon:(0,Y.jsx)(B,{size:14}),disabled:c!==null,reason:c,onSelect:()=>t.setPinned(a,!e.pinned)},{id:`archive`,label:e.archived?`Unarchive`:`Archive`,icon:(0,Y.jsx)(U,{size:14}),disabled:c!==null,reason:c,onSelect:()=>t.setArchived(a,!e.archived)},{id:`rename`,label:`Rename`,icon:(0,Y.jsx)(V,{size:14}),disabled:s!==null,reason:s,onSelect:i},{id:`handoff`,label:`Continue in a fresh chat…`,icon:(0,Y.jsx)(H,{size:14}),disabled:s!==null||o,reason:s??(o?`Available when its turn finishes.`:null),onSelect:()=>t.handoff(a)},{id:`delete`,label:`Delete…`,icon:(0,Y.jsx)(R,{size:14}),danger:!0,separated:!0,disabled:s!==null||o,reason:s??(o?`Stop its turn before deleting.`:null),onSelect:()=>t.requestDelete(a)}]}function ue({value:e,counts:t,onChange:n}){let r=(0,q.useRef)(new Map);function i(t){let i=L.indexOf(e),a;t.key===`ArrowRight`||t.key===`ArrowDown`?a=L[(i+1)%L.length]:t.key===`ArrowLeft`||t.key===`ArrowUp`?a=L[(i-1+L.length)%L.length]:t.key===`Home`?a=L[0]:t.key===`End`&&(a=L[L.length-1]),a&&(t.preventDefault(),n(a),r.current.get(a)?.focus())}return(0,Y.jsx)(`div`,{className:Q.filters,role:`radiogroup`,"aria-label":`Show chats`,onKeyDown:i,children:L.map(i=>{let a=t[i],o=i===e;return(0,Y.jsxs)(`button`,{ref:e=>{e?r.current.set(i,e):r.current.delete(i)},type:`button`,role:`radio`,"aria-checked":o,tabIndex:o?0:-1,className:Q.filter,"data-filter":i,onClick:()=>n(i),children:[F[i],i!==`all`&&a>0?(0,Y.jsx)(`span`,{className:Q.filterCount,children:a}):null]},i)})})}function de({query:e,filter:t,hasSessions:n,newChatHint:r,onClearQuery:i,onClearFilter:a,onNew:o}){if(e.trim())return(0,Y.jsxs)(`div`,{className:`${Q.empty} ${Q.emptyCompact}`,children:[(0,Y.jsxs)(`p`,{className:Q.emptyTitle,children:[`No chat titles match “`,e,`”`]}),(0,Y.jsx)(`p`,{children:`Titles and projects match as you type. Chats whose messages match, if any, are listed below.`}),(0,Y.jsx)(`button`,{type:`button`,className:Q.emptyAction,onClick:i,children:`Clear search`})]});if(t!==`all`&&n){let e=t===`running`?`No chat is running`:t===`needs-you`?`Nothing needs you`:`No pinned chats`;return(0,Y.jsxs)(`div`,{className:`${Q.empty} ${Q.emptyCompact}`,children:[(0,Y.jsx)(`p`,{className:Q.emptyTitle,children:e}),t===`pinned`?(0,Y.jsx)(`p`,{children:`Pin a chat from its row menu — hover it, or right-click.`}):null,(0,Y.jsx)(`button`,{type:`button`,className:Q.emptyAction,onClick:a,children:`Show all chats`})]})}return(0,Y.jsxs)(`div`,{className:Q.empty,children:[(0,Y.jsx)(`p`,{className:Q.emptyTitle,children:`No chats yet`}),(0,Y.jsx)(`p`,{children:`Start one on any project with any seat.`}),(0,Y.jsxs)(`button`,{type:`button`,className:Q.emptyAction,onClick:o,children:[`Start your first chat `,r?(0,Y.jsx)(`kbd`,{className:Q.emptyKey,children:r}):null]})]})}function fe({group:e,seats:t,selectedId:n,renaming:r,open:i,onToggle:a,onSelect:o,onMenu:s,onRenameDone:c}){let l=(0,q.useId)();return(0,Y.jsxs)(`section`,{className:Q.group,"aria-label":e.label,"data-group":e.kind,children:[(0,Y.jsxs)(`h2`,{className:Q.groupTitle,title:e.projectPath??void 0,children:[a?(0,Y.jsxs)(`button`,{type:`button`,className:Q.groupToggle,"aria-expanded":i,"aria-controls":l,onClick:a,children:[(0,Y.jsx)(`span`,{className:Q.twist,"data-open":i||void 0,"aria-hidden":`true`}),(0,Y.jsx)(`span`,{className:Q.groupName,children:e.label})]}):(0,Y.jsx)(`span`,{className:Q.groupName,children:e.label}),e.enrolled?(0,Y.jsx)(`span`,{className:Q.enrolled,children:`enrolled`}):null,(0,Y.jsx)(`span`,{className:Q.groupCount,"aria-hidden":`true`,children:e.rows.length})]}),(0,Y.jsx)(`ul`,{id:l,className:Q.list,hidden:!i,children:i?e.rows.map(e=>(0,Y.jsx)(`li`,{children:r===e.session.id?(0,Y.jsx)(he,{row:e,onDone:t=>{c(e,t)}}):(0,Y.jsx)(pe,{row:e,seats:t,selected:e.session.id===n,onSelect:o,onMenu:s})},e.session.id)):null})]})}function pe({row:e,seats:t,selected:n,onSelect:r,onMenu:i}){let{session:a,status:o}=e,s=y(t,a.seatId),c=s===void 0?null:b(s),u=o.kind===`running`&&c?.cls===`blocked`,d=[a.title||`Untitled chat`,v(t,a),c===null||c.cls===`ready`||c.cls===`unread`?null:c.summary,ce(e)].filter(e=>e!==null).join(` · `),f=(0,q.useRef)(null);function p(t){i&&(t.preventDefault(),i(e,{x:t.clientX,y:t.clientY},t.currentTarget))}function m(t){if(i&&(t.key===`ContextMenu`||t.key===`F10`&&t.shiftKey)){t.preventDefault();let n=t.currentTarget.getBoundingClientRect();i(e,{x:n.left+24,y:n.bottom},t.currentTarget)}}return(0,Y.jsxs)(`div`,{className:Q.row,"data-selected":n||void 0,children:[(0,Y.jsx)(l,{label:d,placement:`right`,children:(0,Y.jsxs)(`button`,{ref:f,type:`button`,className:`${Q.session} ${Q[`engine-${a.engine}`]??``}`,"aria-current":n?`true`:void 0,"data-focus-key":`verse-session:${a.id}`,"data-engine":a.engine,"data-status":o.kind,"aria-haspopup":i?`menu`:void 0,"aria-keyshortcuts":i?`Shift+F10`:void 0,onClick:()=>r(a.id),onContextMenu:p,onKeyDown:m,children:[(0,Y.jsx)(`span`,{className:Q.marker,"aria-hidden":`true`}),(0,Y.jsxs)(`span`,{className:Q.sessionBody,children:[(0,Y.jsx)(`span`,{className:Q.sessionText,children:a.title||`Untitled chat`}),e.live?(0,Y.jsx)(`span`,{className:Q.liveLine,title:e.live.text,children:e.live.text}):null]}),u&&c!==null?(0,Y.jsx)(`span`,{className:Q.seatSpent,role:`img`,"aria-label":`Seat limit reached: ${c.summary}`,children:`▮`}):null,(0,Y.jsx)(me,{row:e})]})}),i?(0,Y.jsx)(`button`,{type:`button`,className:Q.rowMore,tabIndex:-1,"aria-hidden":`true`,title:`Chat actions`,onClick:t=>{let n=t.currentTarget.getBoundingClientRect();i(e,{x:n.right-220,y:n.bottom+4},f.current??t.currentTarget)},children:(0,Y.jsx)(z,{size:14})}):null]})}function me({row:e}){let{status:t,session:n}=e,r=ce(e)??void 0;if(e.needsYou&&t.kind!==`running`&&t.kind!==`failed`)return(0,Y.jsx)(`span`,{className:Q.waiting,role:`img`,"aria-label":r,"data-status":`waiting`});switch(t.kind){case`running`:return(0,Y.jsxs)(`span`,{className:Q.statusRunning,children:[(0,Y.jsx)(`span`,{className:Q.running,role:`img`,"aria-label":r}),t.startedAt?(0,Y.jsx)(P,{className:Q.elapsed,since:t.startedAt}):null]});case`failed`:return(0,Y.jsx)(`span`,{className:Q.errored,role:`img`,"aria-label":r,children:`!`});case`unread`:return(0,Y.jsx)(`span`,{className:Q.unread,role:`img`,"aria-label":r});default:return(0,Y.jsx)(`time`,{className:Q.time,dateTime:n.updatedAt,children:_(n.updatedAt)})}}function he({row:e,onDone:t}){let[n,r]=(0,q.useState)(e.session.title),i=(0,q.useRef)(null),a=(0,q.useRef)(!1);(0,q.useEffect)(()=>{i.current?.focus(),i.current?.select()},[]);let o=e=>{a.current||(a.current=!0,t(e.trim()))};return(0,Y.jsx)(`div`,{className:`${Q.row} ${Q.renameRow}`,children:(0,Y.jsx)(`input`,{ref:i,className:Q.renameInput,value:n,maxLength:120,"aria-label":`Chat title`,onChange:e=>r(e.target.value),onBlur:()=>o(n),onKeyDown:t=>{t.key===`Enter`?(t.preventDefault(),o(n)):t.key===`Escape`&&(t.preventDefault(),o(e.session.title))}})})}export{oe as Sidebar};
|
|
3
|
+
//# sourceMappingURL=Sidebar-CcI1_B9Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/workspaces/SavedProjectDialog.tsx","../../../../../../src/web-ui/routes/verse/workspaces/SavedProjects.tsx","../../../../../../src/web-ui/routes/verse/Sidebar.tsx"],"sourcesContent":["/**\n * routes/verse/workspaces/SavedProjectDialog.tsx — create, rename, reorder and\n * delete a SAVED PROJECT (a workspace in `~/.ashlr/verse/workspaces.json`).\n *\n * Why this dialog exists: the workspace routes were complete and nothing in\n * the console ever called them, so the only way to get a saved project was to\n * hand-edit a JSON file. A folder the operator typed into the new-chat dialog\n * came back only AFTER a chat had been created on it. Now a folder can be kept\n * before any chat exists, which is what \"open my project again tomorrow\"\n * actually requires.\n *\n * Three honesty rules are load-bearing here:\n *\n * - THE FIRST FOLDER IS THE PRIMARY. It is the session's cwd, and it is the\n * only folder a Grok seat can reach, so the reorder buttons are not\n * cosmetic and the first row says \"Primary folder\" rather than \"Folder 1\".\n * - PRIORITY ORDERS, IT NEVER GRANTS. `ROOT_PRIORITY_NOTE` is rendered at the\n * point of the choice; ranking a repo `critical` does not enrol it.\n * - NO SEAT IS CHOSEN HERE, so no per-seat caveat can be honest. The dialog\n * states the engine rule flatly instead (`MULTI_ROOT_ENGINE_NOTE`); the\n * seat-specific warning belongs in the new-chat dialog, where a seat exists.\n */\nimport { useEffect, useId, useState, type FormEvent } from 'react';\nimport type { VerseRootPriority, VerseWorkspace } from '../../../data/api-types.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { nativePickerAvailable, pickDirectory } from '../folder-picker.js';\nimport { projectName } from '../verse-model.js';\nimport {\n createVerseWorkspace,\n deleteVerseWorkspace,\n setVerseFocusSection,\n setVerseRootPriority,\n updateVerseWorkspace,\n} from '../verse-queries.js';\nimport {\n MAX_WORKSPACE_ROOTS,\n MULTI_ROOT_ENGINE_NOTE,\n moveRoot,\n priorityOf,\n ROOT_PRIORITY_LABEL,\n ROOT_PRIORITY_NOTE,\n ROOT_PRIORITY_ORDER,\n rootRowLabel,\n validateWorkspaceDraft,\n workspaceRootPaths,\n} from '../workspace-model.js';\nimport styles from './SavedProjectDialog.module.css';\n\nexport interface SavedProjectDialogProps {\n open: boolean;\n /** The project being edited, or null to create a new one. */\n workspace: VerseWorkspace | null;\n /** Folder set to pre-fill a NEW project with (primary first). */\n initialRoots?: readonly string[];\n /** Per-path priority as the server holds it. Absent key means `normal`. */\n priorities?: Readonly<Record<string, VerseRootPriority>>;\n /** The section the autonomous lane is focused on, if any. */\n focusSectionId?: string | null;\n onClose: () => void;\n onSaved?: (workspace: VerseWorkspace) => void;\n onDeleted?: (id: string) => void;\n}\n\nexport function SavedProjectDialog(props: SavedProjectDialogProps) {\n const { open, workspace, initialRoots, priorities, focusSectionId = null, onClose, onSaved, onDeleted } = props;\n const titleId = useId();\n const nameId = useId();\n const [name, setName] = useState('');\n const [roots, setRoots] = useState<string[]>(['']);\n const [section, setSection] = useState(false);\n const [focused, setFocused] = useState(false);\n const [priorityDraft, setPriorityDraft] = useState<Record<string, VerseRootPriority>>({});\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Reset on the OPEN transition only, for the same reason NewChatDialog does:\n // the workspace list is a fresh array on every invalidation, and re-running\n // this on it would wipe a half-typed path.\n useEffect(() => {\n if (!open) return;\n const existing = workspace;\n setName(existing?.name ?? '');\n setRoots(existing ? workspaceRootPaths(existing) : [...(initialRoots ?? [])].filter((r) => r.length > 0));\n setSection(existing?.section ?? false);\n setFocused(existing !== null && focusSectionId === existing.id);\n setPriorityDraft({});\n setConfirmingDelete(false);\n setBusy(false);\n setError(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- open transition only; the inputs are read once, on purpose.\n }, [open]);\n\n // Always at least one row, so there is somewhere to type the primary folder.\n const rows = roots.length === 0 ? [''] : roots;\n const showPicker = nativePickerAvailable();\n\n function setRow(index: number, value: string) {\n setRoots(rows.map((r, i) => (i === index ? value : r)));\n }\n\n async function choose(index: number) {\n const picked = await pickDirectory();\n if (picked !== null && picked.length > 0) setRow(index, picked);\n }\n\n function priorityFor(path: string): VerseRootPriority {\n return priorityDraft[path] ?? priorityOf(path, priorities);\n }\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n const draft = validateWorkspaceDraft(name, rows);\n if (!draft.ok) {\n setError(draft.error);\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const saved = workspace === null\n ? await createVerseWorkspace({ name: draft.name, roots: draft.roots, section })\n : await updateVerseWorkspace(workspace.id, { name: draft.name, roots: draft.roots, section });\n // Priority is an attribute OF THE REPO, held once per path, so it is a\n // separate call per changed path rather than part of the workspace body.\n for (const path of draft.roots) {\n const next = priorityDraft[path];\n if (next !== undefined && next !== priorityOf(path, priorities)) {\n await setVerseRootPriority(path, next);\n }\n }\n const wasFocused = workspace !== null && focusSectionId === workspace.id;\n if (section && focused !== wasFocused) {\n await setVerseFocusSection(focused ? saved.id : null);\n }\n onSaved?.(saved);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n }\n\n async function remove() {\n if (workspace === null) return;\n setBusy(true);\n setError(null);\n try {\n await deleteVerseWorkspace(workspace.id);\n onDeleted?.(workspace.id);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setBusy(false);\n }\n }\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n titleId={titleId}\n title={workspace === null ? 'Save a project' : 'Edit project'}\n description=\"Saved projects stay in the picker — they do not need a chat on them first.\"\n widthClassName={styles.width}\n >\n <form className={styles.form} onSubmit={(event) => void submit(event)} noValidate>\n <label className={styles.field} htmlFor={nameId}>\n <span className={styles.label}>Name</span>\n <input id={nameId} className={styles.input} value={name} onChange={(event) => setName(event.target.value)}\n placeholder=\"Defaults to the folder’s own name\" maxLength={120} autoComplete=\"off\" />\n </label>\n\n <div className={styles.field}>\n <span className={styles.label}>Folders</span>\n <p className={styles.hint}>\n The first folder is the primary: it is the chat’s working directory. Move a folder to the top to make it\n the primary.\n </p>\n {rows.map((root, index) => (\n <div key={index} className={styles.rootRow}>\n <input\n className={styles.input}\n value={root}\n // A long path is cut with an ellipsis while the field is idle; the tooltip keeps it whole.\n title={root || undefined}\n onChange={(event) => setRow(index, event.target.value)}\n placeholder=\"/absolute/path/to/folder\"\n aria-label={rootRowLabel(index)}\n autoComplete=\"off\"\n spellCheck={false}\n />\n {showPicker ? (\n <button type=\"button\" className={styles.rowButton} onClick={() => void choose(index)}\n aria-label={`Choose ${rootRowLabel(index).toLowerCase()}`}>Choose folder…</button>\n ) : null}\n {/* Glyph-only: the accessible name AND the tooltip both say what the arrow does. */}\n <button type=\"button\" className={styles.rowButton} disabled={index === 0}\n onClick={() => setRoots(moveRoot(rows, index, 'up'))}\n aria-label={`Move ${rootRowLabel(index).toLowerCase()} up`}\n title={`Move ${rootRowLabel(index).toLowerCase()} up`}><span aria-hidden=\"true\">↑</span></button>\n <button type=\"button\" className={styles.rowButton} disabled={index === rows.length - 1}\n onClick={() => setRoots(moveRoot(rows, index, 'down'))}\n aria-label={`Move ${rootRowLabel(index).toLowerCase()} down`}\n title={`Move ${rootRowLabel(index).toLowerCase()} down`}><span aria-hidden=\"true\">↓</span></button>\n <button type=\"button\" className={styles.rowButton} disabled={rows.length === 1}\n onClick={() => setRoots(rows.filter((_, i) => i !== index))}\n aria-label={`Remove ${rootRowLabel(index).toLowerCase()}`}>Remove</button>\n </div>\n ))}\n {rows.length < MAX_WORKSPACE_ROOTS ? (\n <button type=\"button\" className={styles.addRoot} onClick={() => setRoots([...rows, ''])}>Add a folder</button>\n ) : null}\n {rows.length > 1 ? <p className={styles.hint}>{MULTI_ROOT_ENGINE_NOTE}</p> : null}\n </div>\n\n <div className={styles.field}>\n <label className={styles.checkbox}>\n <input type=\"checkbox\" checked={section} onChange={(event) => setSection(event.target.checked)} />\n <span>Offer this project to the autonomous lane as a section</span>\n </label>\n {section ? (\n <>\n <label className={styles.checkbox}>\n <input type=\"checkbox\" checked={focused} onChange={(event) => setFocused(event.target.checked)} />\n <span>Focus the fleet on this section</span>\n </label>\n <p className={styles.hint}>{ROOT_PRIORITY_NOTE}</p>\n {rows.filter((r) => r.trim().length > 0).map((root, index) => (\n <div key={`${root}-${index}`} className={styles.priorityRow}>\n {/* The folder's own name; the full path is the tooltip (and the select's accessible name). */}\n <span className={styles.priorityPath} title={root}>{projectName(root.trim())}</span>\n <select\n className={styles.select}\n aria-label={`Priority for ${root}`}\n value={priorityFor(root.trim())}\n onChange={(event) =>\n setPriorityDraft({ ...priorityDraft, [root.trim()]: event.target.value as VerseRootPriority })}\n >\n {ROOT_PRIORITY_ORDER.map((p) => (\n <option key={p} value={p}>{ROOT_PRIORITY_LABEL[p]}</option>\n ))}\n </select>\n </div>\n ))}\n </>\n ) : null}\n </div>\n\n {error ? <p role=\"alert\" className={styles.error}>{error}</p> : null}\n\n <div className={styles.actions}>\n {workspace === null ? null : confirmingDelete ? (\n <>\n <span className={styles.confirm}>Forget this project? Chats already on it are untouched.</span>\n <button type=\"button\" className={styles.danger} onClick={() => void remove()} disabled={busy}>Forget</button>\n <button type=\"button\" className={styles.cancel} onClick={() => setConfirmingDelete(false)}>Keep</button>\n </>\n ) : (\n <button type=\"button\" className={styles.remove} onClick={() => setConfirmingDelete(true)} disabled={busy}>\n Forget project\n </button>\n )}\n <span className={styles.spacer} />\n <button type=\"button\" className={styles.cancel} onClick={onClose}>Cancel</button>\n <button type=\"submit\" className={styles.save} disabled={busy}>{busy ? 'Saving…' : 'Save project'}</button>\n </div>\n </form>\n </Dialog>\n );\n}\n","/**\n * routes/verse/workspaces/SavedProjects.tsx — the sidebar's \"Projects\"\n * section: every saved project, and the one button that creates one.\n *\n * SELF-SUPPLIED ON PURPOSE. It reads `verseWorkspacesQuery` itself rather\n * than taking the list as a prop, because the sidebar's props are owned by the\n * chat section and this list has exactly one consumer. The key is the same one\n * the new-chat dialog's list is read from, so the cache serves both from one\n * request and the picker and this list can never disagree.\n *\n * Quiet when the read fails: an older server has no /api/verse/workspaces at\n * all, and a permanent red line in the sidebar for a feature that server does\n * not have would be noise, not honesty. The \"Save a project\" button stays —\n * pressing it surfaces the real refusal from the server, in the dialog.\n */\nimport { useState } from 'react';\nimport type { VerseWorkspace } from '../../../data/api-types.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { PlusIcon } from '../verse-icons.js';\nimport { verseWorkspacesQuery } from '../verse-queries.js';\nimport { workspacePrimary, workspaceSummary } from '../workspace-model.js';\nimport { SavedProjectDialog } from './SavedProjectDialog.js';\nimport styles from './SavedProjects.module.css';\n\nexport function SavedProjects() {\n const query = useQuery(verseWorkspacesQuery);\n const workspaces = query.data?.workspaces ?? [];\n const [editing, setEditing] = useState<{ open: boolean; workspace: VerseWorkspace | null }>(\n { open: false, workspace: null },\n );\n\n return (\n <section className={styles.projects} aria-label=\"Saved projects\">\n <h2 className={styles.head}>\n <span className={styles.headText}>Projects</span>\n <button\n type=\"button\"\n className={styles.add}\n title=\"Save a project\"\n aria-label=\"Save a project\"\n onClick={() => setEditing({ open: true, workspace: null })}\n >\n <PlusIcon />\n </button>\n </h2>\n\n {workspaces.length > 0 ? (\n <ul className={styles.list}>\n {workspaces.map((workspace) => {\n const primary = workspacePrimary(workspace) ?? '';\n return (\n <li key={workspace.id}>\n <button\n type=\"button\"\n className={styles.project}\n // The name truncates to one line, so the tooltip carries it in\n // full, then the primary folder — which costs no pixels here.\n title={primary ? `${workspace.name}\\n${primary}` : workspace.name}\n aria-label={`Edit project ${workspace.name}`}\n onClick={() => setEditing({ open: true, workspace })}\n >\n <span className={styles.name}>{workspace.name}</span>\n <span className={styles.summary}>{workspaceSummary(workspace)}</span>\n </button>\n </li>\n );\n })}\n </ul>\n ) : query.status === 'error' ? null : (\n <p className={styles.empty}>No saved projects yet. Press + to keep a folder you work in.</p>\n )}\n\n <SavedProjectDialog\n open={editing.open}\n workspace={editing.workspace}\n priorities={query.data?.priorities}\n focusSectionId={query.data?.focusSectionId ?? null}\n onClose={() => setEditing({ open: false, workspace: null })}\n />\n </section>\n );\n}\n","/**\n * routes/verse/Sidebar.tsx — the chat list (3.10, SPEC-310C §2; model:\n * chat/sidebar-model.ts).\n *\n * [search…………………………] [+] [⫿]\n * (All) (Running 2) (Needs you 1) (Pinned 3)\n * SAVED PROJECTS …\n * PINNED\n * │ Fix the login bug ● 1m 02s\n * │ npm test\n * HUB\n * │ Write the docs • ← unread\n * │ Migrate the store ! ← failed\n * ▸ ARCHIVED 12\n *\n * One row is a 2px engine tick, the title and ONE status — the most urgent\n * that applies: a pulse with the elapsed time (running), a failure mark, an\n * unread dot, or how long ago. A running row adds a muted second line from\n * activity: the command it is running, or the tail of what it is thinking.\n * Every status is a glyph with an accessible name, at least 11px, and never\n * colour alone (DESIGN §6). The row's tooltip spells the status out too\n * (\"… · Last turn failed\"), so the \"!\" is explained to a sighted pointer user\n * as well as to a screen reader.\n *\n * Group headings are the project's display name as it is on disk (never\n * upper-cased: a folder slug shouted in caps is a different-looking name),\n * with the full path as their tooltip. ↑/↓ move between chats, Home/End jump\n * to the ends, Enter opens; ↓ from the search field lands on the first chat.\n *\n * Hover a row (or right-click it, or press Shift+F10 / the menu key on it)\n * for pin, archive, rename, hand off and delete. Pin and archive need C1's\n * session-meta route; on a server without it they are shown disabled with\n * the reason, rather than hidden.\n *\n * ONE SEARCH FIELD, TWO ANSWERS (V3.9): titles and projects filter instantly\n * on the client; underneath, SessionSearch lists chats whose MESSAGES match\n * (a scan on this machine, nothing sent to a model).\n *\n * Saved projects sit above the chats: the registry the operator writes\n * deliberately (workspaces/SavedProjects.tsx).\n */\nimport { lazy, Suspense, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type MouseEvent as ReactMouseEvent } from 'react';\nimport type { VerseProject, VerseSeat, VerseSession } from '../../data/api-types.js';\nimport type { VerseActivityResponse, VerseSessionMetaResponse } from '../../../core/verse/workbench-types.js';\nimport type { QueryStatus } from '../../data/cache.js';\nimport { Button } from '../../components/primitives/Button.js';\nimport { Dialog } from '../../components/primitives/Dialog.js';\nimport { RefreshIndicator } from '../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../components/primitives/Skeleton.js';\nimport { Tooltip } from '../../components/primitives/Tooltip.js';\nimport { ActionMenu, type ActionMenuItem, type MenuAnchor } from './chat/ActionMenu.js';\nimport { LiveTimer } from './chat/LiveTimer.js';\nimport {\n buildSidebar,\n SIDEBAR_FILTERS,\n SIDEBAR_FILTER_LABEL,\n type SidebarFilter,\n type SidebarGroup,\n type SidebarRow,\n} from './chat/sidebar-model.js';\nimport { ArchiveGlyph, HandoffGlyph, MoreGlyph, PinGlyph, RenameGlyph, TrashGlyph } from './dock/dock-icons.js';\nimport { PlusIcon, SearchIcon, SidebarIcon } from './verse-icons.js';\nimport { seatSubscription } from './seat-subscription.js';\nimport { formatRelative, seatById, seatPillLabel } from './verse-model.js';\nimport { SavedProjects } from './workspaces/SavedProjects.js';\nimport { findCommand, formatChord } from './shell/command-catalog.js';\nimport styles from './Sidebar.module.css';\n\nexport interface SidebarProps {\n sessions: readonly VerseSession[];\n sessionsStatus: QueryStatus;\n sessionsError: string | null;\n projects: readonly VerseProject[];\n seats: readonly VerseSeat[];\n selectedId: string | null;\n query: string;\n onQuery: (value: string) => void;\n onSelect: (id: string) => void;\n onNew: () => void;\n onRetry: () => void;\n onCollapse: () => void;\n /** Called only once the operator confirms the footer's \"Disconnect from hub\" dialog. */\n onDisconnect: () => void;\n /** 3.10 — C1's activity (null: not on this server / not answered yet). */\n activity?: VerseActivityResponse | null;\n /** 3.10 — C1's per-chat meta (null: not on this server / not answered yet). */\n meta?: VerseSessionMetaResponse | null;\n /**\n * Why the per-chat meta could not be read (the server's sentence), when it\n * failed rather than being absent. Pin/Archive then name THIS as their\n * reason instead of \"not available on this server yet\".\n */\n metaError?: string | null;\n /** Turn counts this tab has seen, per chat. */\n localSeen?: ReadonlyMap<string, number>;\n /** Row actions (3.10). Absent → the row menu is not offered. */\n actions?: SidebarRowActions;\n}\n\nexport interface SidebarRowActions {\n setPinned: (sessionId: string, pinned: boolean) => void;\n setArchived: (sessionId: string, archived: boolean) => void;\n rename: (sessionId: string, title: string) => Promise<boolean>;\n handoff: (sessionId: string) => void;\n requestDelete: (sessionId: string) => void;\n /** False on a read-only server: every write is shown disabled with this reason. */\n dispatchEnabled: boolean;\n}\n\nconst NO_SEEN: ReadonlyMap<string, number> = new Map();\n\n// Message search loads with the first query, not with the chat list.\nconst SessionSearch = lazy(() => import('./context/SessionSearch.js').then((m) => ({ default: m.SessionSearch })));\n\nexport function Sidebar(props: SidebarProps) {\n const { sessions, sessionsStatus, sessionsError, projects, seats, selectedId, query, onQuery, onSelect, onNew,\n onRetry, onCollapse, onDisconnect, activity = null, meta = null, metaError = null, localSeen = NO_SEEN, actions } = props;\n const searchId = useId();\n const newChatShortcut = findCommand('chat.new')?.keys[0];\n const sidebarShortcut = findCommand('chat.sidebar')?.keys[0];\n const newChatHint = newChatShortcut ? formatChord(newChatShortcut) : null;\n const sidebarHint = sidebarShortcut ? formatChord(sidebarShortcut) : null;\n const [filter, setFilter] = useState<SidebarFilter>('all');\n const [archivedOpen, setArchivedOpen] = useState(false);\n const [renaming, setRenaming] = useState<string | null>(null);\n const [menu, setMenu] = useState<{ row: SidebarRow; anchor: MenuAnchor; from: HTMLElement } | null>(null);\n const [confirmDisconnect, setConfirmDisconnect] = useState(false);\n const disconnectTitleId = useId();\n const disconnectCancelRef = useRef<HTMLButtonElement>(null);\n const model = useMemo(\n () => buildSidebar({ sessions, projects, query, filter, activity, meta, localSeen, selectedId }),\n [sessions, projects, query, filter, activity, meta, localSeen, selectedId],\n );\n const loading = sessionsStatus === 'loading' || (sessionsStatus === 'idle' && sessions.length === 0);\n const searching = query.trim().length > 0;\n const scrollRef = useRef<HTMLDivElement>(null);\n\n /** ↓ from the search field: into the list, on its first chat. */\n function onSearchKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n if (event.key !== 'ArrowDown') return;\n const first = scrollRef.current?.querySelector<HTMLElement>(ROW_SELECTOR);\n if (!first) return;\n event.preventDefault();\n first.focus();\n }\n\n function openMenu(row: SidebarRow, anchor: MenuAnchor, from: HTMLElement) {\n if (!actions) return;\n setMenu({ row, anchor, from });\n }\n\n return (\n <nav className={styles.sidebar} aria-label=\"Chats\">\n <div className={styles.head}>\n {/* Draggable strip under the overlay title bar; zero-height in a browser. */}\n <div className={styles.headDragStrip} aria-hidden=\"true\" />\n <label className={styles.search} htmlFor={searchId}>\n <span className={styles.searchIcon} aria-hidden=\"true\"><SearchIcon /></span>\n <span className=\"visually-hidden\">Search chats and messages</span>\n <input id={searchId} type=\"search\" value={query} placeholder=\"Search chats\" autoComplete=\"off\"\n onChange={(event) => onQuery(event.target.value)} onKeyDown={onSearchKeyDown} />\n </label>\n <Tooltip label=\"New chat\" shortcut={newChatHint ?? undefined} placement=\"bottom\">\n <button type=\"button\" className={styles.iconButton} onClick={onNew} aria-label=\"New chat\">\n <PlusIcon />\n </button>\n </Tooltip>\n <Tooltip label=\"Hide chat list\" shortcut={sidebarHint ?? undefined} placement=\"bottom\">\n <button type=\"button\" className={styles.iconButton} onClick={onCollapse} aria-label=\"Hide chat list\">\n <SidebarIcon />\n </button>\n </Tooltip>\n {sessionsStatus === 'refreshing' ? <RefreshIndicator label=\"Refreshing chats\" /> : null}\n </div>\n\n <FilterChips value={filter} counts={model.counts} onChange={setFilter} />\n\n <div ref={scrollRef} className={styles.scroll} onKeyDown={onRowsKeyDown}>\n <SavedProjects />\n {loading ? (\n <div className={styles.skeleton} aria-busy=\"true\">\n <SkeletonLine width=\"48%\" /><SkeletonLine width=\"86%\" /><SkeletonLine width=\"74%\" />\n <SkeletonLine width=\"40%\" /><SkeletonLine width=\"80%\" />\n </div>\n ) : sessionsStatus === 'error' && sessions.length === 0 ? (\n <div role=\"alert\" className={styles.error}>\n <p>{sessionsError ?? 'Could not load chats.'}</p>\n <button type=\"button\" onClick={onRetry}>Retry</button>\n </div>\n ) : model.groups.length === 0 ? (\n <EmptyList query={query} filter={filter} hasSessions={sessions.length > 0} newChatHint={newChatHint} onClearQuery={() => onQuery('')}\n onClearFilter={() => setFilter('all')} onNew={onNew} />\n ) : model.groups.map((group) => (\n <GroupView key={group.id} group={group} seats={seats} selectedId={selectedId} renaming={renaming}\n open={group.kind !== 'archived' || archivedOpen || searching || filter !== 'all'}\n onToggle={group.kind === 'archived' ? () => setArchivedOpen((v) => !v) : undefined}\n onSelect={onSelect} onMenu={actions ? openMenu : undefined}\n onRenameDone={async (row, title) => {\n setRenaming(null);\n if (!actions || !title || title === row.session.title) return;\n await actions.rename(row.session.id, title);\n }} />\n ))}\n {searching ? (\n <Suspense fallback={null}>\n <SessionSearch query={query} onOpenSession={onSelect} selectedId={selectedId} />\n </Suspense>\n ) : null}\n </div>\n\n <footer className={styles.footer}>\n {/* clearReadSession (data/auth-store.ts): ends this window's read\n session — the cookie, the remembered token, the mutation hold,\n cached data and the composer's drafts — and shows the token screen\n again. The chats themselves stay on the hub. Said in the label and\n the tooltip, because \"Disconnect\" alone reads like a network blip.\n It throws away unsent drafts, so — like Settings ▸ Connection — it\n asks first; onDisconnect runs only from the dialog's red button. */}\n <Tooltip label=\"Signs this window out: clears cached chats and unsent drafts here. Chats stay on the hub.\" placement=\"top\">\n <button type=\"button\" onClick={() => setConfirmDisconnect(true)} className={styles.footerButton}\n aria-haspopup=\"dialog\">Disconnect from hub</button>\n </Tooltip>\n </footer>\n\n {/* The same confirm as Settings ▸ Connection (ConnectionPanel.tsx): the\n Dialog primitive, focus on CANCEL so Enter-Enter keeps the session,\n Escape and the backdrop cancel, and focus returns to the footer\n button. */}\n <Dialog open={confirmDisconnect} onClose={() => setConfirmDisconnect(false)} titleId={disconnectTitleId}\n title=\"Disconnect from this hub?\" initialFocusRef={disconnectCancelRef}\n description=\"Unsent drafts in open chats will be cleared. Your chats stay on the hub; you will need the read token to reconnect.\">\n <div className={styles.confirmActions}>\n <Button ref={disconnectCancelRef} variant=\"subtle\" onClick={() => setConfirmDisconnect(false)}>Cancel</Button>\n <Button variant=\"danger\" onClick={() => {\n setConfirmDisconnect(false);\n onDisconnect();\n }}>Disconnect</Button>\n </div>\n </Dialog>\n\n {menu && actions ? (\n <ActionMenu label={`Actions for ${menu.row.session.title || 'Untitled chat'}`} anchor={menu.anchor}\n returnFocus={menu.from} onClose={() => setMenu(null)}\n items={rowMenuItems(menu.row, actions, model.metaAvailable, metaError, () => setRenaming(menu.row.session.id))} />\n ) : null}\n </nav>\n );\n}\n\n/** Every chat row in the list (search results and saved projects are not rows). */\nconst ROW_SELECTOR = '[data-focus-key^=\"verse-session:\"]';\n\n/** ↑/↓ between chat rows, Home/End to the ends. Enter is the row button's own. */\nfunction onRowsKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.altKey || event.metaKey || event.ctrlKey || event.shiftKey) return;\n const target = event.target as HTMLElement;\n if (!target.matches(ROW_SELECTOR)) return;\n const rows = [...event.currentTarget.querySelectorAll<HTMLElement>(ROW_SELECTOR)];\n const at = rows.indexOf(target);\n let next: HTMLElement | undefined;\n if (event.key === 'ArrowDown') next = rows[at + 1];\n else if (event.key === 'ArrowUp') next = rows[at - 1];\n else if (event.key === 'Home') next = rows[0];\n else if (event.key === 'End') next = rows[rows.length - 1];\n else return;\n event.preventDefault();\n next?.focus();\n}\n\n/**\n * The row's status in words, for its tooltip (the glyph's accessible name,\n * said to everyone). Waiting on YOU — an approval or a question from the\n * Needs-you list — outranks news and age: it is the one state where the\n * chat cannot move until you do.\n */\nfunction rowStatusWords(row: Pick<SidebarRow, 'status' | 'needsYou'>): string | null {\n const { status } = row;\n switch (status.kind) {\n case 'running': return 'Running';\n case 'failed': return 'Last turn failed';\n default: break;\n }\n if (row.needsYou) return 'Waiting for you';\n return status.kind === 'unread' ? `${status.newTurns} new turn${status.newTurns === 1 ? '' : 's'}` : null;\n}\n\nfunction rowMenuItems(row: SidebarRow, actions: SidebarRowActions, metaAvailable: boolean, metaError: string | null,\n startRename: () => void): ActionMenuItem[] {\n const id = row.session.id;\n const running = row.status.kind === 'running';\n const writeReason = !actions.dispatchEnabled ? 'This server was started without dispatch.' : null;\n const metaReason = writeReason\n ?? (metaAvailable ? null : metaError ? `Pins and archive unavailable. ${metaError}` : 'Not available on this server yet.');\n return [\n {\n id: 'pin',\n label: row.pinned ? 'Unpin' : 'Pin',\n icon: <PinGlyph size={14} />,\n disabled: metaReason !== null,\n reason: metaReason,\n onSelect: () => actions.setPinned(id, !row.pinned),\n },\n {\n id: 'archive',\n label: row.archived ? 'Unarchive' : 'Archive',\n icon: <ArchiveGlyph size={14} />,\n disabled: metaReason !== null,\n reason: metaReason,\n onSelect: () => actions.setArchived(id, !row.archived),\n },\n { id: 'rename', label: 'Rename', icon: <RenameGlyph size={14} />, disabled: writeReason !== null, reason: writeReason, onSelect: startRename },\n {\n id: 'handoff',\n label: 'Continue in a fresh chat…',\n icon: <HandoffGlyph size={14} />,\n disabled: writeReason !== null || running,\n reason: writeReason ?? (running ? 'Available when its turn finishes.' : null),\n onSelect: () => actions.handoff(id),\n },\n {\n id: 'delete',\n label: 'Delete…',\n icon: <TrashGlyph size={14} />,\n danger: true,\n separated: true,\n disabled: writeReason !== null || running,\n reason: writeReason ?? (running ? 'Stop its turn before deleting.' : null),\n onSelect: () => actions.requestDelete(id),\n },\n ];\n}\n\n/**\n * All / Running / Needs you / Pinned — one radio group, ONE tab stop, ←/→\n * between the options (the list below is where Tab should go next).\n */\nfunction FilterChips({ value, counts, onChange }: { value: SidebarFilter; counts: Record<SidebarFilter, number>; onChange: (f: SidebarFilter) => void }) {\n const refs = useRef(new Map<SidebarFilter, HTMLButtonElement>());\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const i = SIDEBAR_FILTERS.indexOf(value);\n let next: SidebarFilter | undefined;\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') next = SIDEBAR_FILTERS[(i + 1) % SIDEBAR_FILTERS.length];\n else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') next = SIDEBAR_FILTERS[(i - 1 + SIDEBAR_FILTERS.length) % SIDEBAR_FILTERS.length];\n else if (event.key === 'Home') next = SIDEBAR_FILTERS[0];\n else if (event.key === 'End') next = SIDEBAR_FILTERS[SIDEBAR_FILTERS.length - 1];\n if (!next) return;\n event.preventDefault();\n onChange(next);\n refs.current.get(next)?.focus();\n }\n return (\n <div className={styles.filters} role=\"radiogroup\" aria-label=\"Show chats\" onKeyDown={onKeyDown}>\n {SIDEBAR_FILTERS.map((f) => {\n const n = counts[f];\n const checked = f === value;\n return (\n <button key={f} ref={(node) => { if (node) refs.current.set(f, node); else refs.current.delete(f); }}\n type=\"button\" role=\"radio\" aria-checked={checked} tabIndex={checked ? 0 : -1} className={styles.filter}\n data-filter={f} onClick={() => onChange(f)}>\n {SIDEBAR_FILTER_LABEL[f]}\n {f !== 'all' && n > 0 ? <span className={styles.filterCount}>{n}</span> : null}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction EmptyList({ query, filter, hasSessions, newChatHint, onClearQuery, onClearFilter, onNew }: {\n query: string;\n filter: SidebarFilter;\n hasSessions: boolean;\n newChatHint: string | null;\n onClearQuery: () => void;\n onClearFilter: () => void;\n onNew: () => void;\n}) {\n if (query.trim()) {\n return (\n <div className={`${styles.empty} ${styles.emptyCompact}`}>\n <p className={styles.emptyTitle}>No chat titles match “{query}”</p>\n <p>Titles and projects match as you type. Chats whose messages match, if any, are listed below.</p>\n <button type=\"button\" className={styles.emptyAction} onClick={onClearQuery}>Clear search</button>\n </div>\n );\n }\n if (filter !== 'all' && hasSessions) {\n const what = filter === 'running' ? 'No chat is running' : filter === 'needs-you' ? 'Nothing needs you' : 'No pinned chats';\n return (\n <div className={`${styles.empty} ${styles.emptyCompact}`}>\n <p className={styles.emptyTitle}>{what}</p>\n {filter === 'pinned' ? <p>Pin a chat from its row menu — hover it, or right-click.</p> : null}\n <button type=\"button\" className={styles.emptyAction} onClick={onClearFilter}>Show all chats</button>\n </div>\n );\n }\n return (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>No chats yet</p>\n <p>Start one on any project with any seat.</p>\n {/* Not named \"New chat\": the header already has a control by that name. */}\n <button type=\"button\" className={styles.emptyAction} onClick={onNew}>\n Start your first chat {newChatHint ? <kbd className={styles.emptyKey}>{newChatHint}</kbd> : null}\n </button>\n </div>\n );\n}\n\nfunction GroupView({ group, seats, selectedId, renaming, open, onToggle, onSelect, onMenu, onRenameDone }: {\n group: SidebarGroup;\n seats: readonly VerseSeat[];\n selectedId: string | null;\n renaming: string | null;\n open: boolean;\n onToggle?: () => void;\n onSelect: (id: string) => void;\n onMenu?: (row: SidebarRow, anchor: MenuAnchor, from: HTMLElement) => void;\n onRenameDone: (row: SidebarRow, title: string) => Promise<void>;\n}) {\n const listId = useId();\n return (\n <section className={styles.group} aria-label={group.label} data-group={group.kind}>\n <h2 className={styles.groupTitle} title={group.projectPath ?? undefined}>\n {onToggle ? (\n <button type=\"button\" className={styles.groupToggle} aria-expanded={open} aria-controls={listId} onClick={onToggle}>\n <span className={styles.twist} data-open={open || undefined} aria-hidden=\"true\" />\n <span className={styles.groupName}>{group.label}</span>\n </button>\n ) : <span className={styles.groupName}>{group.label}</span>}\n {group.enrolled ? <span className={styles.enrolled}>enrolled</span> : null}\n <span className={styles.groupCount} aria-hidden=\"true\">{group.rows.length}</span>\n </h2>\n <ul id={listId} className={styles.list} hidden={!open}>\n {open ? group.rows.map((row) => (\n <li key={row.session.id}>\n {renaming === row.session.id ? (\n <RenameRow row={row} onDone={(title) => { void onRenameDone(row, title); }} />\n ) : (\n <SessionRowView row={row} seats={seats} selected={row.session.id === selectedId} onSelect={onSelect} onMenu={onMenu} />\n )}\n </li>\n )) : null}\n </ul>\n </section>\n );\n}\n\nfunction SessionRowView({ row, seats, selected, onSelect, onMenu }: {\n row: SidebarRow;\n seats: readonly VerseSeat[];\n selected: boolean;\n onSelect: (id: string) => void;\n onMenu?: (row: SidebarRow, anchor: MenuAnchor, from: HTMLElement) => void;\n}) {\n const { session, status } = row;\n const seat = seatById(seats, session.seatId);\n const capacity = seat === undefined ? null : seatSubscription(seat);\n // Quiet by default: a marker only where it changes what the operator would\n // do — a turn in flight on a seat whose binding window is spent.\n const spentWhileRunning = status.kind === 'running' && capacity?.cls === 'blocked';\n const tip = [\n session.title || 'Untitled chat',\n seatPillLabel(seats, session),\n capacity === null || capacity.cls === 'ready' || capacity.cls === 'unread' ? null : capacity.summary,\n rowStatusWords(row),\n ].filter((part) => part !== null).join(' · ');\n const rowRef = useRef<HTMLButtonElement>(null);\n\n function onContextMenu(event: ReactMouseEvent<HTMLButtonElement>) {\n if (!onMenu) return;\n event.preventDefault();\n onMenu(row, { x: event.clientX, y: event.clientY }, event.currentTarget);\n }\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n if (!onMenu) return;\n if (event.key === 'ContextMenu' || (event.key === 'F10' && event.shiftKey)) {\n event.preventDefault();\n const rect = event.currentTarget.getBoundingClientRect();\n onMenu(row, { x: rect.left + 24, y: rect.bottom }, event.currentTarget);\n }\n }\n\n return (\n <div className={styles.row} data-selected={selected || undefined}>\n <Tooltip label={tip} placement=\"right\">\n <button ref={rowRef} type=\"button\" className={`${styles.session} ${styles[`engine-${session.engine}`] ?? ''}`}\n aria-current={selected ? 'true' : undefined}\n data-focus-key={`verse-session:${session.id}`} data-engine={session.engine} data-status={status.kind}\n aria-haspopup={onMenu ? 'menu' : undefined} aria-keyshortcuts={onMenu ? 'Shift+F10' : undefined}\n onClick={() => onSelect(session.id)} onContextMenu={onContextMenu} onKeyDown={onKeyDown}>\n <span className={styles.marker} aria-hidden=\"true\" />\n <span className={styles.sessionBody}>\n <span className={styles.sessionText}>{session.title || 'Untitled chat'}</span>\n {row.live ? <span className={styles.liveLine} title={row.live.text}>{row.live.text}</span> : null}\n </span>\n {spentWhileRunning && capacity !== null ? (\n <span className={styles.seatSpent} role=\"img\" aria-label={`Seat limit reached: ${capacity.summary}`}>▮</span>\n ) : null}\n <RowStatus row={row} />\n </button>\n </Tooltip>\n {onMenu ? (\n // A pointer affordance only, hidden from assistive tech: the row itself\n // announces its menu (aria-haspopup) and opens it with Shift+F10 or\n // the menu key, so a screen reader hears ONE control per chat.\n <button type=\"button\" className={styles.rowMore} tabIndex={-1} aria-hidden=\"true\" title=\"Chat actions\"\n onClick={(event) => {\n const rect = event.currentTarget.getBoundingClientRect();\n onMenu(row, { x: rect.right - 220, y: rect.bottom + 4 }, rowRef.current ?? event.currentTarget);\n }}>\n <MoreGlyph size={14} />\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction RowStatus({ row }: { row: SidebarRow }) {\n const { status, session } = row;\n // One wording for the glyph's name and the row's tooltip (rowStatusWords).\n const words = rowStatusWords(row) ?? undefined;\n if (row.needsYou && status.kind !== 'running' && status.kind !== 'failed') {\n // A ring, not a dot: waiting on you reads differently from \"new turns\" without colour.\n return <span className={styles.waiting} role=\"img\" aria-label={words} data-status=\"waiting\" />;\n }\n switch (status.kind) {\n case 'running':\n return (\n <span className={styles.statusRunning}>\n <span className={styles.running} role=\"img\" aria-label={words} />\n {status.startedAt ? <LiveTimer className={styles.elapsed} since={status.startedAt} /> : null}\n </span>\n );\n case 'failed':\n return <span className={styles.errored} role=\"img\" aria-label={words}>!</span>;\n case 'unread':\n return <span className={styles.unread} role=\"img\" aria-label={words} />;\n default:\n return <time className={styles.time} dateTime={session.updatedAt}>{formatRelative(session.updatedAt)}</time>;\n }\n}\n\nfunction RenameRow({ row, onDone }: { row: SidebarRow; onDone: (title: string) => void }) {\n const [value, setValue] = useState(row.session.title);\n const input = useRef<HTMLInputElement>(null);\n const done = useRef(false);\n useEffect(() => { input.current?.focus(); input.current?.select(); }, []);\n const finish = (title: string) => {\n if (done.current) return;\n done.current = true;\n onDone(title.trim());\n };\n return (\n <div className={`${styles.row} ${styles.renameRow}`}>\n <input ref={input} className={styles.renameInput} value={value} maxLength={120} aria-label=\"Chat title\"\n onChange={(event) => setValue(event.target.value)}\n onBlur={() => finish(value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') { event.preventDefault(); finish(value); }\n else if (event.key === 'Escape') { event.preventDefault(); finish(row.session.title); }\n }} />\n </div>\n );\n}\n"],"file":"Sidebar-CcI1_B9Y.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./index-_izD07R9.js";var t={grid:`_grid_x7p2y_1`,card:`_card_x7p2y_10`,title:`_title_x7p2y_19`,stat:`_stat_x7p2y_25`,caption:`_caption_x7p2y_31`,line:`_line_x7p2y_37`,row:`_row_x7p2y_42`,cell:`_cell_x7p2y_51`},n=e();function r({width:e=`100%`}){return(0,n.jsx)(`div`,{className:`skeleton ${t.line}`,style:{width:e}})}function i(){return(0,n.jsxs)(`div`,{className:t.card,children:[(0,n.jsx)(`div`,{className:`skeleton ${t.title}`}),(0,n.jsx)(`div`,{className:`skeleton ${t.stat}`}),(0,n.jsx)(`div`,{className:`skeleton ${t.caption}`})]})}function a(){return(0,n.jsxs)(`div`,{className:t.row,children:[(0,n.jsx)(`div`,{className:`skeleton ${t.cell}`,style:{width:`18%`}}),(0,n.jsx)(`div`,{className:`skeleton ${t.cell}`,style:{width:`38%`}}),(0,n.jsx)(`div`,{className:`skeleton ${t.cell}`,style:{width:`14%`}}),(0,n.jsx)(`div`,{className:`skeleton ${t.cell}`,style:{width:`10%`}})]})}function o({count:e=4}){return(0,n.jsx)(`div`,{className:t.grid,children:Array.from({length:e},(e,t)=>(0,n.jsx)(i,{},t))})}var s={skipLink:`_skipLink_1uply_1`};function c(){return(0,n.jsx)(`button`,{type:`button`,className:s.skipLink,onClick:()=>{let e=document.getElementById(`main-content`);e?.focus(),e?.scrollIntoView({block:`start`})},children:`Skip to content`})}export{a,r as i,i as n,o as r,c as t};
|
|
2
|
+
//# sourceMappingURL=SkipToContent-B0GAKhYQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkipToContent-B0GAKhYQ.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Skeleton.module.css","../../../../../../src/web-ui/components/primitives/Skeleton.tsx","../../../../../../src/web-ui/app/SkipToContent.module.css","../../../../../../src/web-ui/app/SkipToContent.tsx"],"sourcesContent":[".grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: var(--space-4);\n}\n\n/* No border and no fill: a skeleton stands in for CONTENT, and drawing it as\n a bordered card meant the placeholder had a box the real card does not\n (DESIGN-V2 §1.2) and the layout visibly lost an outline on first paint. */\n.card {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n padding: var(--space-4) 0;\n}\n\n/* Each bar matches the LINE BOX of the text it replaces, so nothing reflows\n when the real content lands: a label line, a display-face stat, a caption. */\n.title {\n height: var(--text-xs-line);\n width: 60%;\n border-radius: var(--radius-xs);\n}\n\n.stat {\n height: var(--text-2xl-line);\n width: 40%;\n border-radius: var(--radius-xs);\n}\n\n.caption {\n height: var(--text-2xs-line);\n width: 80%;\n border-radius: var(--radius-xs);\n}\n\n.line {\n height: var(--text-base-line);\n border-radius: var(--radius-xs);\n}\n\n.row {\n display: flex;\n align-items: center;\n gap: var(--space-4);\n min-height: var(--density-row);\n padding: var(--space-3) var(--space-4);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.cell {\n height: var(--text-sm-line);\n border-radius: var(--radius-xs);\n}\n","/**\n * components/primitives/Skeleton.tsx — loading placeholders. Used ONLY for\n * `status === 'loading'` (no data at all yet). A resource that already has\n * data and is merely refreshing should show <RefreshIndicator/> instead —\n * never re-blank a populated view (see DESIGN.md \"no blank screens\").\n */\nimport styles from './Skeleton.module.css';\n\nexport function SkeletonLine({ width = '100%' }: { width?: string }) {\n return <div className={`skeleton ${styles.line}`} style={{ width }} />;\n}\n\nexport function SkeletonCard() {\n return (\n <div className={styles.card}>\n <div className={`skeleton ${styles.title}`} />\n <div className={`skeleton ${styles.stat}`} />\n <div className={`skeleton ${styles.caption}`} />\n </div>\n );\n}\n\nexport function SkeletonRow() {\n return (\n <div className={styles.row}>\n <div className={`skeleton ${styles.cell}`} style={{ width: '18%' }} />\n <div className={`skeleton ${styles.cell}`} style={{ width: '38%' }} />\n <div className={`skeleton ${styles.cell}`} style={{ width: '14%' }} />\n <div className={`skeleton ${styles.cell}`} style={{ width: '10%' }} />\n </div>\n );\n}\n\nexport function SkeletonCardGrid({ count = 4 }: { count?: number }) {\n return (\n <div className={styles.grid}>\n {Array.from({ length: count }, (_, i) => (\n <SkeletonCard key={i} />\n ))}\n </div>\n );\n}\n",".skipLink {\n position: fixed;\n top: -100px;\n left: var(--space-3);\n z-index: var(--z-toast);\n background: var(--accent-500);\n color: var(--text-on-accent);\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-md);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n transition: top var(--duration-fast) var(--ease-standard);\n}\n\n.skipLink:focus-visible {\n top: var(--space-3);\n box-shadow: var(--shadow-focus-ring);\n}\n","/**\n * app/SkipToContent.tsx — a real skip link, deliberately NOT `<a\n * href=\"#main-content\">`: this app uses HashRouter, so a literal `#`\n * anchor would rewrite location.hash and hijack client-side routing\n * instead of just scrolling. A button that imperatively focuses the\n * `#main-content` element (set on <main> in components/layout/Shell.tsx)\n * gets the same keyboard behavior without touching the route.\n */\nimport styles from './SkipToContent.module.css';\n\nexport function SkipToContent() {\n return (\n <button\n type=\"button\"\n className={styles.skipLink}\n onClick={() => {\n const main = document.getElementById('main-content');\n main?.focus();\n main?.scrollIntoView({ block: 'start' });\n }}\n >\n Skip to content\n </button>\n );\n}\n"],"mappings":"2OCQA,SAAgB,EAAa,CAAE,QAAQ,QAA8B,CACnE,OAAO,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,YAAY,EAAO,OAAQ,MAAO,CAAE,OAAM,CAAI,CAAA,CACvE,CAEA,SAAgB,GAAe,CAC7B,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,YAAY,EAAO,OAAU,CAAA,GAC7C,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,YAAY,EAAO,MAAS,CAAA,GAC5C,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,YAAY,EAAO,SAAY,CAAA,CAC5C,GAET,CAEA,SAAgB,GAAc,CAC5B,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,YAAY,EAAO,OAAQ,MAAO,CAAE,MAAO,KAAM,CAAI,CAAA,GACrE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,YAAY,EAAO,OAAQ,MAAO,CAAE,MAAO,KAAM,CAAI,CAAA,GACrE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,YAAY,EAAO,OAAQ,MAAO,CAAE,MAAO,KAAM,CAAI,CAAA,GACrE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,YAAY,EAAO,OAAQ,MAAO,CAAE,MAAO,KAAM,CAAI,CAAA,CAClE,GAET,CAEA,SAAgB,EAAiB,CAAE,QAAQ,GAAyB,CAClE,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KACpB,SAAA,MAAM,KAAK,CAAE,OAAQ,CAAM,GAAI,EAAG,KACjC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAuB,EAAJ,CAAI,CACxB,CACE,CAAA,CAET,sCE/BA,SAAgB,GAAgB,CAC9B,OACE,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAO,SAClB,YAAe,CACb,IAAM,EAAO,SAAS,eAAe,cAAc,EACnD,GAAM,MAAM,EACZ,GAAM,eAAe,CAAE,MAAO,OAAQ,CAAC,CACzC,EACD,SAAA,iBAEO,CAAA,CAEZ"}
|
|
@@ -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";var r=e(n(),1),i={field:`_field_228wn_1`,label:`_label_228wn_8`,row:`_row_228wn_15`,value:`_value_228wn_22`,input:`_input_228wn_32`},a=t();function o({label:e,value:t,min:n=0,max:o=100,valueLabel:s,valueText:c,trackImage:l,className:u,id:d,...f}){let p=(0,r.useId)(),m=d??p,h=Math.max(1,o-n),g=Math.round((t-n)/h*100);return(0,a.jsxs)(`div`,{className:`${i.field} ${u??``}`,children:[e?(0,a.jsx)(`label`,{className:i.label,htmlFor:m,children:e}):null,(0,a.jsxs)(`div`,{className:i.row,children:[(0,a.jsx)(`input`,{...f,id:m,type:`range`,className:i.input,value:t,min:n,max:o,"aria-valuetext":c,style:{"--slider-fill":`${g}%`,...l?{"--slider-track-image":l}:{}},"data-custom-track":l?`true`:void 0}),s===void 0?null:(0,a.jsx)(`span`,{className:i.value,children:s})]})]})}export{o as t};
|
|
2
|
+
//# sourceMappingURL=Slider-Dzv55CNY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider-Dzv55CNY.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Slider.module.css","../../../../../../src/web-ui/components/primitives/Slider.tsx"],"sourcesContent":[".field {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.label {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n}\n\n.row {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n height: var(--density-row);\n}\n\n.value {\n flex: none;\n min-width: 4ch;\n text-align: right;\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n\n.input {\n appearance: none;\n -webkit-appearance: none;\n flex: 1;\n min-width: 0;\n height: 16px;\n background: none;\n cursor: pointer;\n}\n\n.input:focus {\n outline: none;\n}\n\n/* The ring goes on the thumb, not the whole row. */\n.input:focus-visible {\n box-shadow: none;\n}\n\n.input::-webkit-slider-runnable-track {\n height: 4px;\n border-radius: var(--radius-full);\n background: var(--slider-track-image, linear-gradient(to right, var(--accent-500) var(--slider-fill, 0%), var(--bg-active) var(--slider-fill, 0%)));\n}\n\n.input::-moz-range-track {\n height: 4px;\n border-radius: var(--radius-full);\n background: var(--slider-track-image, linear-gradient(to right, var(--accent-500) var(--slider-fill, 0%), var(--bg-active) var(--slider-fill, 0%)));\n}\n\n.input::-webkit-slider-thumb {\n appearance: none;\n -webkit-appearance: none;\n width: 12px;\n height: 12px;\n margin-top: -4px;\n border-radius: var(--radius-full);\n background: var(--bg-surface);\n border: 2px solid var(--accent-500);\n transition: border-color var(--duration-fast) var(--ease-standard);\n}\n\n.input::-moz-range-thumb {\n width: 12px;\n height: 12px;\n border-radius: var(--radius-full);\n background: var(--bg-surface);\n border: 2px solid var(--accent-500);\n}\n\n.input:focus-visible::-webkit-slider-thumb {\n box-shadow: var(--shadow-focus-ring);\n}\n\n.input:focus-visible::-moz-range-thumb {\n box-shadow: var(--shadow-focus-ring);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n","/**\n * components/primitives/Slider.tsx — a continuous value (accent hue,\n * saturation, a budget). Native <input type=\"range\"> so the platform's\n * keyboard model (arrows, Home/End, PageUp/PageDown) comes for free; the\n * track and thumb are restyled to the token system.\n *\n * `valueLabel` renders the number in the display face next to the control.\n * It is presentational: the control's own accessible value is carried by\n * aria-valuetext when a unit would otherwise be lost (\"245\" -> \"245 degrees\").\n */\nimport { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './Slider.module.css';\n\nexport interface SliderProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'value'> {\n label?: ReactNode;\n value: number;\n min?: number;\n max?: number;\n /** Rendered to the right of the track, in the display face. */\n valueLabel?: ReactNode;\n /** Spoken value, when the raw number needs a unit. */\n valueText?: string;\n /** Paint the filled portion of the track (hue sliders want a gradient instead). */\n trackImage?: string;\n className?: string;\n}\n\nexport function Slider({\n label,\n value,\n min = 0,\n max = 100,\n valueLabel,\n valueText,\n trackImage,\n className,\n id,\n ...rest\n}: SliderProps) {\n const generatedId = useId();\n const sliderId = id ?? generatedId;\n const span = Math.max(1, max - min);\n const percent = Math.round(((value - min) / span) * 100);\n\n return (\n <div className={`${styles.field} ${className ?? ''}`}>\n {label ? (\n <label className={styles.label} htmlFor={sliderId}>\n {label}\n </label>\n ) : null}\n <div className={styles.row}>\n <input\n {...rest}\n id={sliderId}\n type=\"range\"\n className={styles.input}\n value={value}\n min={min}\n max={max}\n aria-valuetext={valueText}\n style={\n {\n '--slider-fill': `${percent}%`,\n ...(trackImage ? { '--slider-track-image': trackImage } : {}),\n } as React.CSSProperties\n }\n data-custom-track={trackImage ? 'true' : undefined}\n />\n {valueLabel !== undefined ? <span className={styles.value}>{valueLabel}</span> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"6OC2BA,SAAgB,EAAO,CACrB,QACA,QACA,MAAM,EACN,MAAM,IACN,aACA,YACA,aACA,YACA,KACA,GAAG,GACW,CACd,IAAM,GAAA,EAAc,EAAA,MAAA,CAAM,EACpB,EAAW,GAAM,EACjB,EAAO,KAAK,IAAI,EAAG,EAAM,CAAG,EAC5B,EAAU,KAAK,OAAQ,EAAQ,GAAO,EAAQ,GAAG,EAEvD,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,MAAM,GAAG,GAAa,KAAhD,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAO,MAAO,QAAS,EACtC,SAAA,CACI,CAAA,EACL,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,GAAI,EACJ,GAAI,EACJ,KAAK,QACL,UAAW,EAAO,MACX,QACF,MACA,MACL,iBAAgB,EAChB,MACE,CACE,gBAAiB,GAAG,EAAQ,GAC5B,GAAI,EAAa,CAAE,uBAAwB,CAAW,EAAI,CAAC,CAC7D,EAEF,oBAAmB,EAAa,OAAS,IAAA,EAC1C,CAAA,EACA,IAAe,IAAA,GAAiE,MAArD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAiB,CAAA,CAC1E,CACF,CAAA,CAAA,GAET"}
|
|
@@ -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{u as r}from"./verse-model-DAOz9LrY.js";import{r as i}from"./path-display-C6BmdnBS.js";import{a,f as o}from"./dock-icons-DPXFt10d.js";import{u as s}from"./verse-icons-C92Qt7rh.js";import{t as c}from"./EmptyState-C3BUt2Ev.js";import{t as l}from"./useVerseTranscript-CvUqjRmZ.js";import{n as u,t as d}from"./stub-panes.module-aBfJsf41.js";var f=e(n(),1),p=t(),m={web:o,search:s,file:a},h={web:`Page`,search:`Search`,file:`File`};function g({sessionId:e,roots:t,host:n}){let a=l(e),o=(0,f.useMemo)(()=>u(a.items),[a.items]);if(o.length===0)return(0,p.jsx)(`div`,{className:d.pane,"aria-label":`Sources`,children:(0,p.jsx)(`section`,{className:d.section,children:(0,p.jsx)(c,{compact:!0,title:`No sources yet`,body:`When this chat fetches a page, searches the web or reads a file to answer you, it is listed here — so you can check what an answer rests on.`})})});let s=o.filter(e=>e.kind!==`file`),g=o.filter(e=>e.kind===`file`);return(0,p.jsx)(`div`,{className:d.pane,"aria-label":`Sources`,children:[{id:`pane-sources-web`,title:`Web`,list:s},{id:`pane-sources-files`,title:`Files read`,list:g}].filter(e=>e.list.length>0).map(e=>(0,p.jsxs)(`section`,{className:d.section,"aria-labelledby":e.id,children:[(0,p.jsxs)(`h3`,{id:e.id,className:d.sectionTitle,children:[e.title,` `,(0,p.jsx)(`span`,{className:d.count,children:e.list.length})]}),(0,p.jsx)(`ul`,{className:d.list,children:e.list.map(e=>{let a=e.kind===`file`?i(e.target,t):e.target;return(0,p.jsxs)(`li`,{className:d.row,"data-failed":e.failed||void 0,title:`${h[e.kind]}: ${e.target}${e.failed?` (failed)`:``}`,children:[(0,p.jsx)(`span`,{className:d.mark,role:`img`,"aria-label":h[e.kind],children:m[e.kind]({size:12})}),e.href?(0,p.jsx)(`a`,{className:`${d.name} ${d.link}`,href:e.href,target:`_blank`,rel:`noopener noreferrer`,children:a}):(0,p.jsx)(`span`,{className:d.name,children:a}),(0,p.jsxs)(`span`,{children:[(0,p.jsx)(`button`,{type:`button`,className:d.rowAction,"aria-label":`Cite ${a} in your message`,onClick:()=>n.addToMessage(e.kind===`file`?`@${a}`:e.target),children:`Cite`}),(0,p.jsx)(`span`,{className:d.meta,children:r(e.at)})]})]},e.key)})})]},e.id))})}export{g as SourcesPane};
|
|
2
|
+
//# sourceMappingURL=SourcesPane-rxRCi7cL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SourcesPane-rxRCi7cL.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/panes/builtin/SourcesPane.tsx"],"sourcesContent":["/**\n * routes/verse/panes/builtin/SourcesPane.tsx — the first-party Sources pane\n * (a registry STUB): what the chat looked at to answer — pages fetched, web\n * searches, files read — newest first. The Reasoning + Sources unit replaces\n * it by registering the id `sources` (../README.md).\n */\nimport { useMemo, type ReactNode } from 'react';\nimport { EmptyState } from '../../../../components/primitives/EmptyState.js';\nimport { displayPath } from '../../chat/path-display.js';\nimport { FilesGlyph, PreviewGlyph } from '../../dock/dock-icons.js';\nimport { SearchIcon } from '../../verse-icons.js';\nimport { useVerseTranscript } from '../../useVerseTranscript.js';\nimport { formatRelative } from '../../verse-model.js';\nimport type { PaneProps } from '../pane-registry.js';\nimport { chatSources, type SourceKind } from './pane-models.js';\nimport styles from './stub-panes.module.css';\n\nconst KIND_ICON: Record<SourceKind, (p: { size?: number }) => ReactNode> = { web: PreviewGlyph, search: SearchIcon, file: FilesGlyph };\nconst KIND_WORD: Record<SourceKind, string> = { web: 'Page', search: 'Search', file: 'File' };\n\nexport function SourcesPane({ sessionId, roots, host }: PaneProps) {\n const transcript = useVerseTranscript(sessionId);\n const sources = useMemo(() => chatSources(transcript.items), [transcript.items]);\n if (sources.length === 0) {\n return (\n <div className={styles.pane} aria-label=\"Sources\">\n <section className={styles.section}>\n <EmptyState compact title=\"No sources yet\"\n body=\"When this chat fetches a page, searches the web or reads a file to answer you, it is listed here — so you can check what an answer rests on.\" />\n </section>\n </div>\n );\n }\n const web = sources.filter((s) => s.kind !== 'file');\n const files = sources.filter((s) => s.kind === 'file');\n return (\n <div className={styles.pane} aria-label=\"Sources\">\n {[{ id: 'pane-sources-web', title: 'Web', list: web }, { id: 'pane-sources-files', title: 'Files read', list: files }]\n .filter((group) => group.list.length > 0)\n .map((group) => (\n <section key={group.id} className={styles.section} aria-labelledby={group.id}>\n <h3 id={group.id} className={styles.sectionTitle}>{group.title} <span className={styles.count}>{group.list.length}</span></h3>\n <ul className={styles.list}>\n {group.list.map((source) => {\n const label = source.kind === 'file' ? displayPath(source.target, roots) : source.target;\n return (\n <li key={source.key} className={styles.row} data-failed={source.failed || undefined}\n title={`${KIND_WORD[source.kind]}: ${source.target}${source.failed ? ' (failed)' : ''}`}>\n <span className={styles.mark} role=\"img\" aria-label={KIND_WORD[source.kind]}>{KIND_ICON[source.kind]({ size: 12 })}</span>\n {source.href ? (\n <a className={`${styles.name} ${styles.link}`} href={source.href} target=\"_blank\" rel=\"noopener noreferrer\">{label}</a>\n ) : <span className={styles.name}>{label}</span>}\n <span>\n <button type=\"button\" className={styles.rowAction} aria-label={`Cite ${label} in your message`}\n onClick={() => host.addToMessage(source.kind === 'file' ? `@${label}` : source.target)}>Cite</button>\n <span className={styles.meta}>{formatRelative(source.at)}</span>\n </span>\n </li>\n );\n })}\n </ul>\n </section>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -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,d as i,i as a,p as o,r as s}from"./tool-semantics-DtFU7rvB.js";import{a as c}from"./path-display-C6BmdnBS.js";import{t as l}from"./EmptyState-C3BUt2Ev.js";import{l as u}from"./sources-queries-DCKiXNAt.js";import{n as d,r as f,t as p}from"./ThinkingBlock-gWESdTxs.js";var m=e(n(),1);function h(){return{file:0,url:0,search:0,doc:0,memory:0,knowledge:0}}function g(e){return e?.memoryEnabled?[{kind:`memory`,ref:`memory:${e.projectPath}`,title:`Shared project memory (MEMORY.md)`,origin:`engine`,detail:`Offered to the agent at the start of every turn in this chat.`}]:[]}function _(e,t=[]){let n=[...t],i=new Map;for(let t of e){for(let e of t.items)e.kind===`source`&&e.turnId===null&&n.push(e.source);for(let e of t.citations){let r=e.source,a={...r,toolUseId:e.toolUseIds[0]??r.toolUseId};if(e.ranges.length===0){let e={...a};delete e.lineStart,delete e.lineEnd,n.push(e)}else for(let t of e.ranges){let e={...a,lineStart:t.start};t.end===null?delete e.lineEnd:e.lineEnd=t.end,n.push(e)}let o=i.get(r.ref)??[];o.includes(t.key)||o.push(t.key),i.set(r.ref,o)}}let a=h();return{entries:r(n).map(e=>(a[e.source.kind]+=1,{citation:e,turnKeys:i.get(e.source.ref)??[]})),byKind:a}}function v(e){let t=[];for(let n of e){let e=n.kind===`toolGroup`?n.items:[n];for(let n of e)n.kind===`thinking`&&t.push({key:n.key,text:n.text,redacted:n.redacted||n.text.trim().length===0,durationMs:n.durationMs,estimatedTokens:n.estimatedTokens,kind:n.thinkingKind})}return t}function y(e,t){let n=o(t);return e.map((e,t)=>{let r=v(e.items),i=e.status!==`running`;return{turnKey:e.key,index:t+1,title:u(e),status:e.status,work:e.work,reasoning:e.reasoning,thoughts:r,silentNote:i&&r.length===0?n.silentTurnNote:null}})}function b(e){let t={shown:0,hidden:0,durationMs:null,tokens:null};for(let n of e)t.shown+=n.reasoning.shown,t.hidden+=n.reasoning.hidden,n.reasoning.durationMs!==null&&(t.durationMs=(t.durationMs??0)+n.reasoning.durationMs),n.reasoning.tokens!==null&&(t.tokens=(t.tokens??0)+n.reasoning.tokens);return t}var x={sheet:`_sheet_hg117_5`,sheetHead:`_sheetHead_hg117_16`,tabs:`_tabs_hg117_24`,tab:`_tab_hg117_24`,close:`_close_hg117_26`,sheetBody:`_sheetBody_hg117_44`,panel:`_panel_hg117_47`,empty:`_empty_hg117_54`,toolbar:`_toolbar_hg117_56`,filters:`_filters_hg117_57`,filter:`_filter_hg117_57`,filterCount:`_filterCount_hg117_71`,search:`_search_hg117_72`,sourceList:`_sourceList_hg117_86`,sourceRow:`_sourceRow_hg117_87`,sourceNum:`_sourceNum_hg117_96`,sourceMain:`_sourceMain_hg117_104`,sourceName:`_sourceName_hg117_123`,sourceLoc:`_sourceLoc_hg117_126`,sourceSub:`_sourceSub_hg117_127`,sourceKind:`_sourceKind_hg117_128`,cite:`_cite_hg117_129`,sourceTurns:`_sourceTurns_hg117_143`,turnChip:`_turnChip_hg117_144`,turnMore:`_turnMore_hg117_157`,totals:`_totals_hg117_160`,totalsNote:`_totalsNote_hg117_161`,trail:`_trail_hg117_162`,trailTurn:`_trailTurn_hg117_163`,trailHead:`_trailHead_hg117_164`,trailIndex:`_trailIndex_hg117_181`,trailTitle:`_trailTitle_hg117_182`,trailWork:`_trailWork_hg117_183`,trailSilent:`_trailSilent_hg117_184`},S=t();function C({turns:e,engine:t=null,jumpToTurn:n}){let r=(0,m.useMemo)(()=>y(e,t),[e,t]),i=(0,m.useMemo)(()=>b(r),[r]),a=o(t),s=[];return i.shown>0&&s.push(`${i.shown} thought${i.shown===1?``:`s`}`),i.durationMs!==null&&i.durationMs>0&&s.push(d(i.durationMs)),i.tokens!==null&&i.tokens>0&&s.push(f(i.tokens)),i.hidden>0&&s.push(`${i.hidden} withheld by the provider`),r.length===0?(0,S.jsx)(`div`,{className:x.panel,children:(0,S.jsx)(l,{compact:!0,title:`No reasoning yet`,body:`When the model thinks before it answers, its reasoning streams here, turn by turn, with what each turn did — so you can follow why without scrolling the answer away.`})}):(0,S.jsxs)(`div`,{className:x.panel,children:[(0,S.jsxs)(`p`,{className:x.totals,children:[s.length>0?s.join(` · `):a.visibility===`hidden`?`This seat does not share its reasoning.`:`No reasoning shown yet.`,a.visibility===`summary`?(0,S.jsx)(`span`,{className:x.totalsNote,children:`Summaries written by the provider, not the raw chain of thought.`}):null]}),(0,S.jsx)(`ol`,{className:x.trail,children:r.map(e=>(0,S.jsxs)(`li`,{className:x.trailTurn,"data-status":e.status,children:[(0,S.jsxs)(`button`,{type:`button`,className:x.trailHead,onClick:()=>n(e.turnKey),"aria-label":`Turn ${e.index}: ${e.title} — go to turn`,children:[(0,S.jsx)(`span`,{className:x.trailIndex,children:e.index}),(0,S.jsx)(`span`,{className:x.trailTitle,children:e.title})]}),e.work?(0,S.jsx)(`p`,{className:x.trailWork,children:e.work}):null,e.thoughts.map(e=>(0,S.jsx)(p,{text:e.text,redacted:e.redacted,durationMs:e.durationMs,estimatedTokens:e.estimatedTokens,kind:e.kind,stateKey:`pane-thinking:${e.key}`},e.key)),e.silentNote?(0,S.jsxs)(`p`,{className:x.trailSilent,children:[e.silentNote,`.`]}):null]},e.turnKey))})]})}var w={files:[`file`],web:[`url`,`search`],docs:[`doc`,`memory`,`knowledge`]},T={all:`All`,files:`Files`,web:`Web`,docs:`Docs & memory`},E={file:`file`,url:`page`,search:`web search`,doc:`doc`,memory:`memory`,knowledge:`knowledge`};function D({turns:e,session:t=null,openFile:n,jumpToTool:r,jumpToTurn:i,onCite:a}){let[o,s]=(0,m.useState)(`all`),[u,d]=(0,m.useState)(``),f=c(),p=(0,m.useMemo)(()=>_(e,g(t)),[e,t]),h=(0,m.useMemo)(()=>new Map(e.map((e,t)=>[e.key,t+1])),[e]),v={all:p.entries.length,files:p.byKind.file,web:p.byKind.url+p.byKind.search,docs:p.byKind.doc+p.byKind.memory+p.byKind.knowledge},y=u.trim().toLowerCase(),b=p.entries.filter(e=>{if(o!==`all`&&!w[o].includes(e.citation.source.kind))return!1;if(!y)return!0;let t=e.citation.source;return`${t.title} ${t.path??``} ${t.url??``} ${t.query??``}`.toLowerCase().includes(y)});return p.entries.length===0?(0,S.jsx)(`div`,{className:x.panel,children:(0,S.jsx)(l,{compact:!0,title:`No sources yet`,body:`Files the agent reads (with the lines it saw), pages it fetches, searches it runs and docs it consults are listed here as it works — so you can check what an answer rests on.`})}):(0,S.jsxs)(`div`,{className:x.panel,children:[(0,S.jsxs)(`div`,{className:x.toolbar,children:[(0,S.jsx)(`div`,{className:x.filters,role:`group`,"aria-label":`Show sources of kind`,children:Object.keys(T).filter(e=>e===`all`||v[e]>0).map(e=>(0,S.jsxs)(`button`,{type:`button`,className:x.filter,"aria-pressed":o===e,onClick:()=>s(e),children:[T[e],` `,(0,S.jsx)(`span`,{className:x.filterCount,children:v[e]})]},e))}),(0,S.jsx)(`input`,{className:x.search,type:`search`,value:u,placeholder:`Filter sources`,"aria-label":`Filter sources`,onChange:e=>d(e.target.value)})]}),b.length===0?(0,S.jsx)(`p`,{className:x.empty,children:`No source matches.`}):(0,S.jsx)(`ol`,{className:x.sourceList,children:b.map(e=>(0,S.jsx)(k,{entry:e,show:f,turnIndex:h,openFile:n,jumpToTool:r,jumpToTurn:i,onCite:a},e.citation.source.ref))})]})}function O(e,t){let n=e.citation.source;return n.url?n.url:n.path?`@${t(n.path)}${e.citation.ranges.length>0?`:${i(e.citation.ranges)}`:``}`:null}function k({entry:e,show:t,turnIndex:n,openFile:r,jumpToTool:o,jumpToTurn:c,onCite:l}){let{citation:u,turnKeys:d}=e,f=u.source,p=u.ranges.length>0?`:${i(u.ranges)}`:``,m=f.path?t(f.path):null,h=u.toolUseIds[0],g;if(f.kind===`url`&&f.url)g=(0,S.jsxs)(`a`,{className:x.sourceMain,href:f.url,target:`_blank`,rel:`noopener noreferrer`,title:f.url,children:[(0,S.jsx)(`span`,{className:x.sourceName,children:f.title}),(0,S.jsx)(`span`,{className:x.sourceSub,children:f.domain})]});else if(f.kind===`search`)g=(0,S.jsx)(`button`,{type:`button`,className:x.sourceMain,disabled:!h,onClick:()=>{h&&o(h)},children:(0,S.jsx)(`span`,{className:x.sourceName,children:f.query??f.title})});else if(f.path){let e=f.path;g=(0,S.jsxs)(`button`,{type:`button`,className:x.sourceMain,title:`${e}${p}`,onClick:()=>{r?r(e,u.ranges[0]?.start).catch(()=>{h&&o(h)}):h&&o(h)},children:[(0,S.jsxs)(`span`,{className:x.sourceName,children:[s(m??e),(0,S.jsx)(`span`,{className:x.sourceLoc,children:p})]}),(0,S.jsx)(`span`,{className:x.sourceSub,children:a(m??e)})]})}else g=(0,S.jsxs)(`span`,{className:x.sourceMain,children:[(0,S.jsx)(`span`,{className:x.sourceName,children:f.title}),f.detail?(0,S.jsx)(`span`,{className:x.sourceSub,children:f.detail}):null]});let _=l?O(e,t):null;return(0,S.jsxs)(`li`,{className:x.sourceRow,"data-kind":f.kind,children:[(0,S.jsx)(`span`,{className:x.sourceNum,"aria-hidden":`true`,children:u.n}),g,(0,S.jsxs)(`span`,{className:x.sourceKind,children:[E[f.kind],u.count>1?` ×${u.count}`:``,_&&l?(0,S.jsx)(`button`,{type:`button`,className:x.cite,onClick:()=>l(_),"aria-label":`Cite ${f.title} in your message`,children:`Cite`}):null]}),d.length>0?(0,S.jsxs)(`span`,{className:x.sourceTurns,children:[d.slice(0,4).map(e=>(0,S.jsx)(`button`,{type:`button`,className:x.turnChip,onClick:()=>c(e),"aria-label":`Go to turn ${n.get(e)??``}`,children:`T${n.get(e)??`?`}`},e)),d.length>4?(0,S.jsxs)(`span`,{className:x.turnMore,children:[`+`,d.length-4]}):null]}):null]})}export{C as n,x as r,D as t};
|
|
2
|
+
//# sourceMappingURL=SourcesPanel-LyMp7aLt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SourcesPanel-LyMp7aLt.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/reasoning/reasoning-model.ts","../../../../../../src/web-ui/routes/verse/reasoning/reasoning.module.css","../../../../../../src/web-ui/routes/verse/reasoning/ReasoningPanel.tsx","../../../../../../src/web-ui/routes/verse/reasoning/SourcesPanel.tsx"],"sourcesContent":["/**\n * routes/verse/reasoning/reasoning-model.ts — the chat-level views behind the\n * Sources and Reasoning panes (V3.15). Pure over the transcript's TURNS\n * (chat/turn-model.ts), so the numbers the panes show are the numbers under\n * each answer by construction.\n *\n * - `buildChatSources` every citation in the chat, de-duplicated across\n * turns and numbered in order of first use, with the\n * turns that drew on each and a per-kind breakdown;\n * - `buildReasoningTrail` every turn's reasoning in order — the blocks it\n * showed, what the provider withheld, and the one-line\n * summary of what the turn did — with an honest note\n * for a seat that shares nothing.\n */\nimport type { VerseSession, VerseSource, VerseSourceKind, VerseThinkingKind } from '../../../../core/verse/types.js';\nimport { collateSources, reasoningPolicyFor, type VerseCitation } from '../../../../core/verse/trace.js';\nimport type { TurnBlock, TurnReasoning } from '../chat/turn-model.js';\nimport { turnTitle } from '../chat/turn-model.js';\nimport type { ToolGroupItem, TranscriptItem } from '../verse-transcript.js';\n\nexport interface ChatSourceEntry {\n citation: VerseCitation;\n /** Turns (keys, in order) whose answers cite it. */\n turnKeys: string[];\n}\n\nexport interface ChatSources {\n entries: ChatSourceEntry[];\n byKind: Record<VerseSourceKind, number>;\n}\n\nfunction zeroKinds(): Record<VerseSourceKind, number> {\n return { file: 0, url: 0, search: 0, doc: 0, memory: 0, knowledge: 0 };\n}\n\n/**\n * Context Verse itself put in front of the agent on every turn — today the\n * chat's pinned shared project memory (MEMORY.md). Derived from the session\n * record, not guessed: `memoryEnabled` is pinned at creation.\n */\nexport function injectedSources(session: Pick<VerseSession, 'memoryEnabled' | 'projectPath'> | null | undefined): VerseSource[] {\n if (!session?.memoryEnabled) return [];\n return [{\n kind: 'memory',\n ref: `memory:${session.projectPath}`,\n title: 'Shared project memory (MEMORY.md)',\n origin: 'engine',\n detail: 'Offered to the agent at the start of every turn in this chat.',\n }];\n}\n\n/** Chat-level sources: every turn's citations, plus chat-wide ones (turnId null) and injected context. */\nexport function buildChatSources(turns: readonly TurnBlock[], injected: readonly VerseSource[] = []): ChatSources {\n const all: VerseSource[] = [...injected];\n const turnsByRef = new Map<string, string[]>();\n for (const turn of turns) {\n for (const item of turn.items) {\n if (item.kind === 'source' && item.turnId === null) all.push(item.source);\n }\n for (const citation of turn.citations) {\n // Re-expand each turn citation's merged ranges so the chat-level merge\n // sees every range, not just the first sighting.\n const s = citation.source;\n const base = { ...s, toolUseId: citation.toolUseIds[0] ?? s.toolUseId };\n if (citation.ranges.length === 0) {\n const whole: VerseSource = { ...base };\n delete whole.lineStart;\n delete whole.lineEnd;\n all.push(whole);\n } else {\n for (const range of citation.ranges) {\n const ranged: VerseSource = { ...base, lineStart: range.start };\n if (range.end !== null) ranged.lineEnd = range.end;\n else delete ranged.lineEnd;\n all.push(ranged);\n }\n }\n const keys = turnsByRef.get(s.ref) ?? [];\n if (!keys.includes(turn.key)) keys.push(turn.key);\n turnsByRef.set(s.ref, keys);\n }\n }\n const byKind = zeroKinds();\n const entries = collateSources(all).map((citation) => {\n byKind[citation.source.kind] += 1;\n return { citation, turnKeys: turnsByRef.get(citation.source.ref) ?? [] };\n });\n return { entries, byKind };\n}\n\nexport interface ReasoningThought {\n key: string;\n text: string;\n redacted: boolean;\n durationMs: number | null;\n estimatedTokens: number | null;\n kind: VerseThinkingKind | null;\n}\n\nexport interface ReasoningTurnEntry {\n turnKey: string;\n /** 1-based position in the chat. */\n index: number;\n title: string;\n status: TurnBlock['status'];\n work: string;\n reasoning: TurnReasoning;\n thoughts: ReasoningThought[];\n /** Said instead of thoughts when a settled turn carried none and the seat is known to withhold it. */\n silentNote: string | null;\n}\n\nfunction thoughtsOf(items: readonly (TranscriptItem | ToolGroupItem)[]): ReasoningThought[] {\n const out: ReasoningThought[] = [];\n for (const item of items) {\n const members = item.kind === 'toolGroup' ? item.items : [item];\n for (const m of members) {\n if (m.kind !== 'thinking') continue;\n out.push({ key: m.key, text: m.text, redacted: m.redacted || m.text.trim().length === 0, durationMs: m.durationMs, estimatedTokens: m.estimatedTokens, kind: m.thinkingKind });\n }\n }\n return out;\n}\n\nexport function buildReasoningTrail(turns: readonly TurnBlock[], engine: string | null | undefined): ReasoningTurnEntry[] {\n const policy = reasoningPolicyFor(engine);\n return turns.map((turn, i) => {\n const thoughts = thoughtsOf(turn.items);\n const settled = turn.status !== 'running';\n return {\n turnKey: turn.key,\n index: i + 1,\n title: turnTitle(turn),\n status: turn.status,\n work: turn.work,\n reasoning: turn.reasoning,\n thoughts,\n silentNote: settled && thoughts.length === 0 ? policy.silentTurnNote : null,\n };\n });\n}\n\n/** Totals for the pane header: blocks shown / withheld, and summed time. */\nexport function reasoningTotals(entries: readonly ReasoningTurnEntry[]): TurnReasoning {\n const out: TurnReasoning = { shown: 0, hidden: 0, durationMs: null, tokens: null };\n for (const e of entries) {\n out.shown += e.reasoning.shown;\n out.hidden += e.reasoning.hidden;\n if (e.reasoning.durationMs !== null) out.durationMs = (out.durationMs ?? 0) + e.reasoning.durationMs;\n if (e.reasoning.tokens !== null) out.tokens = (out.tokens ?? 0) + e.reasoning.tokens;\n }\n return out;\n}\n","/* reasoning/ — the Sources and Reasoning panes and the transcript's sheet (V3.15).\n Chrome follows DESIGN §4: hairlines, ghost controls, density tokens. */\n\n/* ---- sheet (hosted by the transcript) ----------------------------------- */\n.sheet {\n position: absolute;\n inset: 0 0 0 auto;\n z-index: 3;\n display: flex;\n flex-direction: column;\n width: min(420px, 100%);\n border-left: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n box-shadow: var(--shadow-lg);\n}\n.sheetHead {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--density-row);\n padding: 0 var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n}\n.tabs { display: flex; gap: var(--space-1); }\n.tab,\n.close {\n min-height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.tab:hover,\n.close:hover { background: var(--bg-hover); color: var(--text-primary); }\n.tab[aria-selected='true'] { background: var(--bg-active); color: var(--text-primary); }\n.tab:focus-visible,\n.close:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; }\n.close { margin-left: auto; }\n.sheetBody { flex: 1 1 auto; min-height: 0; overflow: auto; }\n\n/* ---- shared panel ------------------------------------------------------- */\n.panel {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n padding: var(--space-3);\n font-size: var(--text-xs-size);\n}\n.empty { margin: 0; color: var(--text-tertiary); line-height: var(--text-xs-line-relaxed); }\n\n.toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }\n.filters { display: flex; flex-wrap: wrap; gap: var(--space-1); }\n.filter {\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-full);\n background: transparent;\n color: var(--text-secondary);\n font-family: var(--font-ui);\n font-size: var(--text-2xs-size, 11px);\n cursor: pointer;\n}\n.filter:hover { background: var(--bg-hover); }\n.filter[aria-pressed='true'] { border-color: var(--border-strong); background: var(--bg-active); color: var(--text-primary); }\n.filterCount { font-family: var(--font-display); font-variant-numeric: tabular-nums; color: var(--text-tertiary); }\n.search {\n flex: 1 1 140px;\n min-width: 0;\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n background: var(--bg-canvas);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n}\n\n/* ---- sources ------------------------------------------------------------ */\n.sourceList { list-style: none; margin: 0; padding: 0; border: 1px solid var(--border-subtle); border-radius: var(--radius-md); }\n.sourceRow {\n display: grid;\n grid-template-columns: calc(var(--space-3) + 3ch) minmax(0, 1fr) auto auto;\n grid-template-areas: 'num main kind turns';\n align-items: center;\n column-gap: var(--space-2);\n padding: var(--space-1) var(--space-3) var(--space-1) 0;\n}\n.sourceRow + .sourceRow { border-top: 1px solid var(--border-subtle); }\n.sourceNum {\n grid-area: num;\n padding-left: var(--space-3);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n}\n.sourceMain {\n grid-area: main;\n display: flex;\n flex-direction: column;\n min-width: 0;\n padding: var(--space-1) 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n text-decoration: none;\n}\nbutton.sourceMain,\na.sourceMain { cursor: pointer; border-radius: var(--radius-sm); }\nbutton.sourceMain:hover,\na.sourceMain:hover { background: var(--bg-hover); }\nbutton.sourceMain:focus-visible,\na.sourceMain:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 0; }\n.sourceName { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-primary); }\n.sourceRow[data-kind='url'] .sourceName,\n.sourceRow[data-kind='search'] .sourceName { color: var(--text-link); }\n.sourceLoc { font-family: var(--font-mono); color: var(--text-secondary); }\n.sourceSub { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-tertiary); font-size: var(--text-2xs-size, 11px); }\n.sourceKind { grid-area: kind; white-space: nowrap; color: var(--text-tertiary); font-size: var(--text-2xs-size, 11px); }\n.cite {\n margin-left: var(--space-2);\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font-family: var(--font-ui);\n font-size: var(--text-2xs-size, 11px);\n cursor: pointer;\n}\n.cite:hover { background: var(--bg-hover); color: var(--text-primary); }\n.cite:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; }\n.sourceTurns { grid-area: turns; display: flex; flex-wrap: nowrap; gap: var(--space-1); }\n.turnChip {\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n}\n.turnChip:hover { background: var(--bg-hover); color: var(--text-primary); }\n.turnMore { align-self: center; color: var(--text-tertiary); font-size: var(--text-2xs-size, 11px); }\n\n/* ---- reasoning trail ---------------------------------------------------- */\n.totals { margin: 0; color: var(--text-secondary); line-height: var(--text-xs-line-relaxed); }\n.totalsNote { display: block; color: var(--text-tertiary); }\n.trail { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--space-4); }\n.trailTurn { display: flex; flex-direction: column; gap: var(--space-2); }\n.trailHead {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n min-height: var(--control-h-xs);\n padding: 0 var(--space-1);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-primary);\n font: inherit;\n font-weight: var(--font-weight-medium);\n text-align: left;\n cursor: pointer;\n}\n.trailHead:hover { background: var(--bg-hover); }\n.trailHead:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; }\n.trailIndex { font-family: var(--font-display); font-variant-numeric: tabular-nums; color: var(--text-tertiary); }\n.trailTitle { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.trailWork,\n.trailSilent { margin: 0; padding-left: var(--space-1); color: var(--text-tertiary); }\n.trailSilent { font-style: italic; }\n","/**\n * routes/verse/reasoning/ReasoningPanel.tsx — the chat's chain of thought,\n * turn by turn, in one scroll (V3.15).\n *\n * In the transcript, reasoning folds between the actions it explains — right\n * for reading one answer, wrong for asking \"how did it get here over the last\n * twenty turns\". This pane lines the reasoning up alone: each turn's ask, the\n * one-line summary of what it did, every block it showed (streamed text,\n * provider summaries marked as such, withheld blocks said out loud) — and for\n * a seat that never shares its reasoning, that fact, in words, instead of an\n * empty space that looks like a bug.\n *\n * `ReasoningPanel` is presentational over derived turns; the dock pane is\n * dock-panes.tsx `ReasoningDockPane`, registered by reasoning.pane.tsx.\n */\nimport { useMemo } from 'react';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { reasoningPolicyFor } from '../../../../core/verse/trace.js';\nimport { formatThinkingDuration, formatThinkingTokens, ThinkingBlock } from '../chat/ThinkingBlock.js';\nimport type { TurnBlock } from '../chat/turn-model.js';\nimport { buildReasoningTrail, reasoningTotals } from './reasoning-model.js';\nimport styles from './reasoning.module.css';\n\nexport interface ReasoningPanelProps {\n turns: readonly TurnBlock[];\n /** The seat's engine, for the honest \"not shared\" wording. */\n engine?: string | null;\n jumpToTurn: (turnKey: string) => void;\n}\n\nexport function ReasoningPanel({ turns, engine = null, jumpToTurn }: ReasoningPanelProps) {\n const trail = useMemo(() => buildReasoningTrail(turns, engine), [turns, engine]);\n const totals = useMemo(() => reasoningTotals(trail), [trail]);\n const policy = reasoningPolicyFor(engine);\n const parts: string[] = [];\n if (totals.shown > 0) parts.push(`${totals.shown} thought${totals.shown === 1 ? '' : 's'}`);\n if (totals.durationMs !== null && totals.durationMs > 0) parts.push(formatThinkingDuration(totals.durationMs));\n if (totals.tokens !== null && totals.tokens > 0) parts.push(formatThinkingTokens(totals.tokens));\n if (totals.hidden > 0) parts.push(`${totals.hidden} withheld by the provider`);\n\n if (trail.length === 0) {\n return (\n <div className={styles.panel}>\n <EmptyState compact title=\"No reasoning yet\"\n body=\"When the model thinks before it answers, its reasoning streams here, turn by turn, with what each turn did — so you can follow why without scrolling the answer away.\" />\n </div>\n );\n }\n\n return (\n <div className={styles.panel}>\n <p className={styles.totals}>\n {parts.length > 0 ? parts.join(' · ') : policy.visibility === 'hidden' ? 'This seat does not share its reasoning.' : 'No reasoning shown yet.'}\n {policy.visibility === 'summary' ? <span className={styles.totalsNote}>Summaries written by the provider, not the raw chain of thought.</span> : null}\n </p>\n <ol className={styles.trail}>\n {trail.map((entry) => (\n <li key={entry.turnKey} className={styles.trailTurn} data-status={entry.status}>\n <button type=\"button\" className={styles.trailHead} onClick={() => jumpToTurn(entry.turnKey)}\n aria-label={`Turn ${entry.index}: ${entry.title} — go to turn`}>\n <span className={styles.trailIndex}>{entry.index}</span>\n <span className={styles.trailTitle}>{entry.title}</span>\n </button>\n {entry.work ? <p className={styles.trailWork}>{entry.work}</p> : null}\n {entry.thoughts.map((t) => (\n <ThinkingBlock key={t.key} text={t.text} redacted={t.redacted} durationMs={t.durationMs}\n estimatedTokens={t.estimatedTokens} kind={t.kind} stateKey={`pane-thinking:${t.key}`} />\n ))}\n {entry.silentNote ? <p className={styles.trailSilent}>{entry.silentNote}.</p> : null}\n </li>\n ))}\n </ol>\n </div>\n );\n}\n","/**\n * routes/verse/reasoning/SourcesPanel.tsx — every source a chat drew on, in\n * one list (V3.15).\n *\n * The per-answer citation lists (chat/SourceList) answer \"where did THIS\n * answer come from\"; this pane answers \"what has this whole chat looked at\":\n * files with the line ranges actually seen, pages fetched, searches run, docs\n * and wiki pages, shared memory Verse injected — de-duplicated across turns,\n * numbered in order of first use, each naming the turns that cited it.\n *\n * Two exports:\n * - `SourcesPanel` — presentational, over already-derived turns (the\n * transcript's sheet passes its own, so nothing is derived twice);\n * - the dock pane (dock-panes.tsx `SourcesDockPane`), registered for the\n * `sources` id by reasoning.pane.tsx.\n */\nimport { useMemo, useState } from 'react';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport type { VerseSession, VerseSourceKind } from '../../../../core/verse/types.js';\nimport { formatRanges } from '../../../../core/verse/trace.js';\nimport { useDisplayPath } from '../chat/path-display.js';\nimport { fileBasename, fileDirname } from '../chat/tool-semantics.js';\nimport type { SourceActions } from '../chat/SourceList.js';\nimport type { TurnBlock } from '../chat/turn-model.js';\nimport { buildChatSources, injectedSources, type ChatSourceEntry } from './reasoning-model.js';\nimport styles from './reasoning.module.css';\n\ntype Filter = 'all' | 'files' | 'web' | 'docs';\n\nconst FILTER_KINDS: Record<Exclude<Filter, 'all'>, readonly VerseSourceKind[]> = {\n files: ['file'],\n web: ['url', 'search'],\n docs: ['doc', 'memory', 'knowledge'],\n};\n\nconst FILTER_LABEL: Record<Filter, string> = { all: 'All', files: 'Files', web: 'Web', docs: 'Docs & memory' };\n\nconst KIND_WORD: Record<VerseSourceKind, string> = {\n file: 'file', url: 'page', search: 'web search', doc: 'doc', memory: 'memory', knowledge: 'knowledge',\n};\n\nexport interface SourcesPanelProps extends SourceActions {\n turns: readonly TurnBlock[];\n session?: Pick<VerseSession, 'memoryEnabled' | 'projectPath'> | null;\n jumpToTurn: (turnKey: string) => void;\n /** \"Cite\" a source into the message being written (the dock's `host.addToMessage`). Absent → no Cite action. */\n onCite?: (text: string) => void;\n}\n\nexport function SourcesPanel({ turns, session = null, openFile, jumpToTool, jumpToTurn, onCite }: SourcesPanelProps) {\n const [filter, setFilter] = useState<Filter>('all');\n const [query, setQuery] = useState('');\n const show = useDisplayPath();\n const model = useMemo(() => buildChatSources(turns, injectedSources(session)), [turns, session]);\n const turnIndex = useMemo(() => new Map(turns.map((t, i) => [t.key, i + 1])), [turns]);\n\n const counts: Record<Filter, number> = {\n all: model.entries.length,\n files: model.byKind.file,\n web: model.byKind.url + model.byKind.search,\n docs: model.byKind.doc + model.byKind.memory + model.byKind.knowledge,\n };\n const needle = query.trim().toLowerCase();\n const visible = model.entries.filter((entry) => {\n if (filter !== 'all' && !FILTER_KINDS[filter].includes(entry.citation.source.kind)) return false;\n if (!needle) return true;\n const s = entry.citation.source;\n return `${s.title} ${s.path ?? ''} ${s.url ?? ''} ${s.query ?? ''}`.toLowerCase().includes(needle);\n });\n\n if (model.entries.length === 0) {\n return (\n <div className={styles.panel}>\n <EmptyState compact title=\"No sources yet\"\n body=\"Files the agent reads (with the lines it saw), pages it fetches, searches it runs and docs it consults are listed here as it works — so you can check what an answer rests on.\" />\n </div>\n );\n }\n\n return (\n <div className={styles.panel}>\n <div className={styles.toolbar}>\n <div className={styles.filters} role=\"group\" aria-label=\"Show sources of kind\">\n {(Object.keys(FILTER_LABEL) as Filter[]).filter((f) => f === 'all' || counts[f] > 0).map((f) => (\n <button key={f} type=\"button\" className={styles.filter} aria-pressed={filter === f} onClick={() => setFilter(f)}>\n {FILTER_LABEL[f]} <span className={styles.filterCount}>{counts[f]}</span>\n </button>\n ))}\n </div>\n <input className={styles.search} type=\"search\" value={query} placeholder=\"Filter sources\" aria-label=\"Filter sources\"\n onChange={(e) => setQuery(e.target.value)} />\n </div>\n {visible.length === 0 ? <p className={styles.empty}>No source matches.</p> : (\n <ol className={styles.sourceList}>\n {visible.map((entry) => (\n <SourceRow key={entry.citation.source.ref} entry={entry} show={show} turnIndex={turnIndex}\n openFile={openFile} jumpToTool={jumpToTool} jumpToTurn={jumpToTurn} onCite={onCite} />\n ))}\n </ol>\n )}\n </div>\n );\n}\n\n/** What \"Cite\" puts in the message: `@path:12-40` for a file, the address for a page. Null = nothing citable. */\nexport function citeText(entry: ChatSourceEntry, show: (path: string) => string): string | null {\n const s = entry.citation.source;\n if (s.url) return s.url;\n if (s.path) return `@${show(s.path)}${entry.citation.ranges.length > 0 ? `:${formatRanges(entry.citation.ranges)}` : ''}`;\n return null;\n}\n\nfunction SourceRow({ entry, show, turnIndex, openFile, jumpToTool, jumpToTurn, onCite }: {\n entry: ChatSourceEntry;\n show: (path: string) => string;\n turnIndex: ReadonlyMap<string, number>;\n jumpToTurn: (turnKey: string) => void;\n onCite?: (text: string) => void;\n} & SourceActions) {\n const { citation, turnKeys } = entry;\n const s = citation.source;\n const loc = citation.ranges.length > 0 ? `:${formatRanges(citation.ranges)}` : '';\n const shown = s.path ? show(s.path) : null;\n const firstCall = citation.toolUseIds[0];\n\n let primary;\n if (s.kind === 'url' && s.url) {\n primary = (\n <a className={styles.sourceMain} href={s.url} target=\"_blank\" rel=\"noopener noreferrer\" title={s.url}>\n <span className={styles.sourceName}>{s.title}</span>\n <span className={styles.sourceSub}>{s.domain}</span>\n </a>\n );\n } else if (s.kind === 'search') {\n primary = (\n <button type=\"button\" className={styles.sourceMain} disabled={!firstCall} onClick={() => { if (firstCall) jumpToTool(firstCall); }}>\n <span className={styles.sourceName}>{s.query ?? s.title}</span>\n </button>\n );\n } else if (s.path) {\n const path = s.path;\n primary = (\n <button type=\"button\" className={styles.sourceMain} title={`${path}${loc}`}\n onClick={() => {\n if (openFile) openFile(path, citation.ranges[0]?.start).catch(() => { if (firstCall) jumpToTool(firstCall); });\n else if (firstCall) jumpToTool(firstCall);\n }}>\n <span className={styles.sourceName}>{fileBasename(shown ?? path)}<span className={styles.sourceLoc}>{loc}</span></span>\n <span className={styles.sourceSub}>{fileDirname(shown ?? path)}</span>\n </button>\n );\n } else {\n primary = (\n <span className={styles.sourceMain}>\n <span className={styles.sourceName}>{s.title}</span>\n {s.detail ? <span className={styles.sourceSub}>{s.detail}</span> : null}\n </span>\n );\n }\n\n const cite = onCite ? citeText(entry, show) : null;\n return (\n <li className={styles.sourceRow} data-kind={s.kind}>\n <span className={styles.sourceNum} aria-hidden=\"true\">{citation.n}</span>\n {primary}\n <span className={styles.sourceKind}>\n {KIND_WORD[s.kind]}{citation.count > 1 ? ` ×${citation.count}` : ''}\n {cite && onCite ? (\n <button type=\"button\" className={styles.cite} onClick={() => onCite(cite)} aria-label={`Cite ${s.title} in your message`}>Cite</button>\n ) : null}\n </span>\n {turnKeys.length > 0 ? (\n <span className={styles.sourceTurns}>\n {turnKeys.slice(0, 4).map((key) => (\n <button key={key} type=\"button\" className={styles.turnChip} onClick={() => jumpToTurn(key)}\n aria-label={`Go to turn ${turnIndex.get(key) ?? ''}`}>\n {`T${turnIndex.get(key) ?? '?'}`}\n </button>\n ))}\n {turnKeys.length > 4 ? <span className={styles.turnMore}>+{turnKeys.length - 4}</span> : null}\n </span>\n ) : null}\n </li>\n );\n}\n"],"mappings":"0YA+BA,SAAS,GAA6C,CACpD,MAAO,CAAE,KAAM,EAAG,IAAK,EAAG,OAAQ,EAAG,IAAK,EAAG,OAAQ,EAAG,UAAW,CAAE,CACvE,CAOA,SAAgB,EAAgB,EAAgG,CAE9H,OADK,GAAS,cACP,CAAC,CACN,KAAM,SACN,IAAK,UAAU,EAAQ,cACvB,MAAO,oCACP,OAAQ,SACR,OAAQ,+DACV,CAAC,EAPmC,CAAC,CAQvC,CAGA,SAAgB,EAAiB,EAA6B,EAAmC,CAAC,EAAgB,CAChH,IAAM,EAAqB,CAAC,GAAG,CAAQ,EACjC,EAAa,IAAI,IACvB,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAK,IAAM,KAAQ,EAAK,MAClB,EAAK,OAAS,UAAY,EAAK,SAAW,MAAM,EAAI,KAAK,EAAK,MAAM,EAE1E,IAAK,IAAM,KAAY,EAAK,UAAW,CAGrC,IAAM,EAAI,EAAS,OACb,EAAO,CAAE,GAAG,EAAG,UAAW,EAAS,WAAW,IAAM,EAAE,SAAU,EACtE,GAAI,EAAS,OAAO,SAAW,EAAG,CAChC,IAAM,EAAqB,CAAE,GAAG,CAAK,EACrC,OAAO,EAAM,UACb,OAAO,EAAM,QACb,EAAI,KAAK,CAAK,CAChB,MACE,IAAK,IAAM,KAAS,EAAS,OAAQ,CACnC,IAAM,EAAsB,CAAE,GAAG,EAAM,UAAW,EAAM,KAAM,EAC1D,EAAM,MAAQ,KACb,OAAO,EAAO,QADK,EAAO,QAAU,EAAM,IAE/C,EAAI,KAAK,CAAM,CACjB,CAEF,IAAM,EAAO,EAAW,IAAI,EAAE,GAAG,GAAK,CAAC,EAClC,EAAK,SAAS,EAAK,GAAG,GAAG,EAAK,KAAK,EAAK,GAAG,EAChD,EAAW,IAAI,EAAE,IAAK,CAAI,CAC5B,CACF,CACA,IAAM,EAAS,EAAU,EAKzB,MAAO,CAAE,QAJO,EAAe,CAAG,CAAC,CAAC,IAAK,IACvC,EAAO,EAAS,OAAO,OAAS,EACzB,CAAE,WAAU,SAAU,EAAW,IAAI,EAAS,OAAO,GAAG,GAAK,CAAC,CAAE,EAEhE,EAAS,QAAO,CAC3B,CAwBA,SAAS,EAAW,EAAwE,CAC1F,IAAM,EAA0B,CAAC,EACjC,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAK,OAAS,YAAc,EAAK,MAAQ,CAAC,CAAI,EAC9D,IAAK,IAAM,KAAK,EACV,EAAE,OAAS,YACf,EAAI,KAAK,CAAE,IAAK,EAAE,IAAK,KAAM,EAAE,KAAM,SAAU,EAAE,UAAY,EAAE,KAAK,KAAK,CAAC,CAAC,SAAW,EAAG,WAAY,EAAE,WAAY,gBAAiB,EAAE,gBAAiB,KAAM,EAAE,YAAa,CAAC,CAEjL,CACA,OAAO,CACT,CAEA,SAAgB,EAAoB,EAA6B,EAAyD,CACxH,IAAM,EAAS,EAAmB,CAAM,EACxC,OAAO,EAAM,KAAK,EAAM,IAAM,CAC5B,IAAM,EAAW,EAAW,EAAK,KAAK,EAChC,EAAU,EAAK,SAAW,UAChC,MAAO,CACL,QAAS,EAAK,IACd,MAAO,EAAI,EACX,MAAO,EAAU,CAAI,EACrB,OAAQ,EAAK,OACb,KAAM,EAAK,KACX,UAAW,EAAK,UAChB,WACA,WAAY,GAAW,EAAS,SAAW,EAAI,EAAO,eAAiB,IACzE,CACF,CAAC,CACH,CAGA,SAAgB,EAAgB,EAAuD,CACrF,IAAM,EAAqB,CAAE,MAAO,EAAG,OAAQ,EAAG,WAAY,KAAM,OAAQ,IAAK,EACjF,IAAK,IAAM,KAAK,EACd,EAAI,OAAS,EAAE,UAAU,MACzB,EAAI,QAAU,EAAE,UAAU,OACtB,EAAE,UAAU,aAAe,OAAM,EAAI,YAAc,EAAI,YAAc,GAAK,EAAE,UAAU,YACtF,EAAE,UAAU,SAAW,OAAM,EAAI,QAAU,EAAI,QAAU,GAAK,EAAE,UAAU,QAEhF,OAAO,CACT,ohCE1HA,SAAgB,EAAe,CAAE,QAAO,SAAS,KAAM,cAAmC,CACxF,IAAM,GAAA,EAAQ,EAAA,QAAA,KAAc,EAAoB,EAAO,CAAM,EAAG,CAAC,EAAO,CAAM,CAAC,EACzE,GAAA,EAAS,EAAA,QAAA,KAAc,EAAgB,CAAK,EAAG,CAAC,CAAK,CAAC,EACtD,EAAS,EAAmB,CAAM,EAClC,EAAkB,CAAC,EAezB,OAdI,EAAO,MAAQ,GAAG,EAAM,KAAK,GAAG,EAAO,MAAM,UAAU,EAAO,QAAU,EAAI,GAAK,KAAK,EACtF,EAAO,aAAe,MAAQ,EAAO,WAAa,GAAG,EAAM,KAAK,EAAuB,EAAO,UAAU,CAAC,EACzG,EAAO,SAAW,MAAQ,EAAO,OAAS,GAAG,EAAM,KAAK,EAAqB,EAAO,MAAM,CAAC,EAC3F,EAAO,OAAS,GAAG,EAAM,KAAK,GAAG,EAAO,OAAO,0BAA0B,EAEzE,EAAM,SAAW,GAEjB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MACrB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAA,GAAQ,MAAM,mBACxB,KAAK,uKAAyK,CAAA,CAC7K,CAAA,GAKP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,OAArB,SAAA,CACG,EAAM,OAAS,EAAI,EAAM,KAAK,KAAK,EAAI,EAAO,aAAe,SAAW,0CAA4C,0BACpH,EAAO,aAAe,WAAY,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAY,SAAA,kEAAsE,CAAA,EAAI,IAChJ,CACH,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,MACnB,SAAA,EAAM,IAAK,IACV,EAAA,EAAA,KAAA,CAAC,KAAD,CAAwB,UAAW,EAAO,UAAW,cAAa,EAAM,OAAxE,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,UAAW,YAAe,EAAW,EAAM,OAAO,EACxF,aAAY,QAAQ,EAAM,MAAM,IAAI,EAAM,MAAM,eADlD,SAAA,EAEE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAM,KAAY,CAAA,GACvD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAM,KAAY,CAAA,CACjD,IACP,EAAM,MAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAY,SAAA,EAAM,IAAQ,CAAA,EAAI,KAChE,EAAM,SAAS,IAAK,IACnB,EAAA,EAAA,IAAA,CAAC,EAAD,CAA2B,KAAM,EAAE,KAAM,SAAU,EAAE,SAAU,WAAY,EAAE,WAC3E,gBAAiB,EAAE,gBAAiB,KAAM,EAAE,KAAM,SAAU,iBAAiB,EAAE,KAAQ,EADrE,EAAE,GACmE,CAC1F,EACA,EAAM,YAAa,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAArB,SAAA,CAAmC,EAAM,WAAW,GAAI,CAAI,CAAA,EAAA,IAC9E,CAZK,EAAA,EAAM,OAYX,CACL,CACC,CAAA,CACD,GAET,CC7CA,IAAM,EAA2E,CAC/E,MAAO,CAAC,MAAM,EACd,IAAK,CAAC,MAAO,QAAQ,EACrB,KAAM,CAAC,MAAO,SAAU,WAAW,CACrC,EAEM,EAAuC,CAAE,IAAK,MAAO,MAAO,QAAS,IAAK,MAAO,KAAM,eAAgB,EAEvG,EAA6C,CACjD,KAAM,OAAQ,IAAK,OAAQ,OAAQ,aAAc,IAAK,MAAO,OAAQ,SAAU,UAAW,WAC5F,EAUA,SAAgB,EAAa,CAAE,QAAO,UAAU,KAAM,WAAU,aAAY,aAAY,UAA6B,CACnH,GAAM,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAiB,KAAK,EAC5C,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAS,EAAE,EAC/B,EAAO,EAAe,EACtB,GAAA,EAAQ,EAAA,QAAA,KAAc,EAAiB,EAAO,EAAgB,CAAO,CAAC,EAAG,CAAC,EAAO,CAAO,CAAC,EACzF,GAAA,EAAY,EAAA,QAAA,KAAc,IAAI,IAAI,EAAM,KAAK,EAAG,IAAM,CAAC,EAAE,IAAK,EAAI,CAAC,CAAC,CAAC,EAAG,CAAC,CAAK,CAAC,EAE/E,EAAiC,CACrC,IAAK,EAAM,QAAQ,OACnB,MAAO,EAAM,OAAO,KACpB,IAAK,EAAM,OAAO,IAAM,EAAM,OAAO,OACrC,KAAM,EAAM,OAAO,IAAM,EAAM,OAAO,OAAS,EAAM,OAAO,SAC9D,EACM,EAAS,EAAM,KAAK,CAAC,CAAC,YAAY,EAClC,EAAU,EAAM,QAAQ,OAAQ,GAAU,CAC9C,GAAI,IAAW,OAAS,CAAC,EAAa,EAAO,CAAC,SAAS,EAAM,SAAS,OAAO,IAAI,EAAG,MAAO,GAC3F,GAAI,CAAC,EAAQ,MAAO,GACpB,IAAM,EAAI,EAAM,SAAS,OACzB,MAAO,GAAG,EAAE,MAAM,GAAG,EAAE,MAAQ,GAAG,GAAG,EAAE,KAAO,GAAG,GAAG,EAAE,OAAS,KAAK,YAAY,CAAC,CAAC,SAAS,CAAM,CACnG,CAAC,EAWD,OATI,EAAM,QAAQ,SAAW,GAEzB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MACrB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAA,GAAQ,MAAM,iBACxB,KAAK,gLAAkL,CAAA,CACtL,CAAA,GAKP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAS,KAAK,QAAQ,aAAW,uBACpD,SAAA,OAAO,KAAK,CAAY,CAAC,CAAc,OAAQ,GAAM,IAAM,OAAS,EAAO,GAAK,CAAC,CAAC,CAAC,IAAK,IACxF,EAAA,EAAA,KAAA,CAAC,SAAD,CAAgB,KAAK,SAAS,UAAW,EAAO,OAAQ,eAAc,IAAW,EAAG,YAAe,EAAU,CAAC,EAA9G,SAAA,CACG,EAAa,GAAG,KAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,EAAO,EAAS,CAAA,CAClE,CAFK,EAAA,CAEL,CACT,CACE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAO,OAAQ,KAAK,SAAS,MAAO,EAAO,YAAY,iBAAiB,aAAW,iBACnG,SAAW,GAAM,EAAS,EAAE,OAAO,KAAK,CAAI,CAAA,CAC3C,CACJ,CAAA,EAAA,EAAQ,SAAW,GAAI,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,SAAA,oBAAqB,CAAA,GACvE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,WACnB,SAAA,EAAQ,IAAK,IACZ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAkD,QAAa,OAAiB,YACpE,WAAsB,aAAwB,aAAoB,QAAS,EADvE,EAAM,SAAS,OAAO,GACiD,CACxF,CACC,CAAA,CAEH,GAET,CAGA,SAAgB,EAAS,EAAwB,EAA+C,CAC9F,IAAM,EAAI,EAAM,SAAS,OAGzB,OAFI,EAAE,IAAY,EAAE,IAChB,EAAE,KAAa,IAAI,EAAK,EAAE,IAAI,IAAI,EAAM,SAAS,OAAO,OAAS,EAAI,IAAI,EAAa,EAAM,SAAS,MAAM,IAAM,KAC9G,IACT,CAEA,SAAS,EAAU,CAAE,QAAO,OAAM,YAAW,WAAU,aAAY,aAAY,UAM5D,CACjB,GAAM,CAAE,WAAU,YAAa,EACzB,EAAI,EAAS,OACb,EAAM,EAAS,OAAO,OAAS,EAAI,IAAI,EAAa,EAAS,MAAM,IAAM,GACzE,EAAQ,EAAE,KAAO,EAAK,EAAE,IAAI,EAAI,KAChC,EAAY,EAAS,WAAW,GAElC,EACJ,GAAI,EAAE,OAAS,OAAS,EAAE,IACxB,GACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,WAAY,KAAM,EAAE,IAAK,OAAO,SAAS,IAAI,sBAAsB,MAAO,EAAE,IAAjG,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAE,KAAY,CAAA,GACnD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAY,SAAA,EAAE,MAAa,CAAA,CAClD,SAEA,GAAI,EAAE,OAAS,SACpB,GACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,WAAY,SAAU,CAAC,EAAW,YAAe,CAAM,GAAW,EAAW,CAAS,CAAG,EAC/H,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAE,OAAS,EAAE,KAAY,CAAA,CACxD,CAAA,OAEL,GAAI,EAAE,KAAM,CACjB,IAAM,EAAO,EAAE,KACf,GACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,WAAY,MAAO,GAAG,IAAO,IACnE,YAAe,CACT,EAAU,EAAS,EAAM,EAAS,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,UAAY,CAAM,GAAW,EAAW,CAAS,CAAG,CAAC,EACpG,GAAW,EAAW,CAAS,CAC1C,EAJF,SAAA,EAKE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAxB,SAAA,CAAqC,EAAa,GAAS,CAAI,GAAE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAY,SAAA,CAAU,CAAA,CAAO,CACtH,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAY,SAAA,EAAY,GAAS,CAAI,CAAQ,CAAA,CAC/D,GAEZ,KACE,IACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAE,KAAY,CAAA,EAClD,EAAE,QAAS,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAY,SAAA,EAAE,MAAa,CAAA,EAAI,IAC/D,IAIV,IAAM,EAAO,EAAS,EAAS,EAAO,CAAI,EAAI,KAC9C,OACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,UAAW,YAAW,EAAE,KAA9C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAW,cAAY,OAAQ,SAAA,EAAS,CAAQ,CAAA,EACvE,GACD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAxB,SAAA,CACG,EAAU,EAAE,MAAO,EAAS,MAAQ,EAAI,KAAK,EAAS,QAAU,GAChE,GAAQ,GACP,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,KAAM,YAAe,EAAO,CAAI,EAAG,aAAY,QAAQ,EAAE,MAAM,kBAAmB,SAAA,MAAY,CAAA,EACpI,IACA,IACL,EAAS,OAAS,GACjB,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAxB,SAAA,CACG,EAAS,MAAM,EAAG,CAAC,CAAC,CAAC,IAAK,IACzB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAkB,KAAK,SAAS,UAAW,EAAO,SAAU,YAAe,EAAW,CAAG,EACvF,aAAY,cAAc,EAAU,IAAI,CAAG,GAAK,KAC/C,SAAA,IAAI,EAAU,IAAI,CAAG,GAAK,KACrB,EAHK,CAGL,CACT,EACA,EAAS,OAAS,GAAI,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAxB,SAAA,CAAkC,IAAE,EAAS,OAAS,CAAQ,CAAI,CAAA,EAAA,IACrF,CACJ,CAAA,EAAA,IACF,GAER"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./index-_izD07R9.js";import{a as t}from"./format-D7nBg2bn.js";import{n}from"./Swimlane-DAf7u5p3.js";var r={tile:`_tile_7dhx4_1`,label:`_label_7dhx4_15`,value:`_value_7dhx4_25`,trend:`_trend_7dhx4_36`,meta:`_meta_7dhx4_42`,delta:`_delta_7dhx4_49`,arrow:`_arrow_7dhx4_58`,deltaGood:`_deltaGood_7dhx4_64`,deltaBad:`_deltaBad_7dhx4_71`,deltaNeutral:`_deltaNeutral_7dhx4_78`,caption:`_caption_7dhx4_82`,skLabel:`_skLabel_7dhx4_89`,skValue:`_skValue_7dhx4_95`,skTrend:`_skTrend_7dhx4_101`,skMeta:`_skMeta_7dhx4_108`},i=e();function a(e){return[e.format?e.format(e.value):t(e.value),e.unit,e.versus].filter(e=>e!==void 0&&e!==``).join(` `)}function o({label:e,value:t,caption:o,delta:s,trend:c,trendLabel:l,describeTrend:u}){let d=s==null||s.goodWhenPositive===void 0||s.value===0?r.deltaNeutral:s.value>0===s.goodWhenPositive?r.deltaGood:r.deltaBad,f=s==null||s.value===0||!Number.isFinite(s.value)?null:s.value>0?`↑`:`↓`;return(0,i.jsxs)(`div`,{className:r.tile,"data-stat-tile":``,children:[(0,i.jsx)(`span`,{className:r.label,children:e}),(0,i.jsx)(`span`,{className:r.value,children:t}),c?(0,i.jsx)(`span`,{className:r.trend,children:(0,i.jsx)(n,{points:c,width:`fill`,height:28,area:!0,ariaLabel:l??`${e} trend`,describe:u})}):null,s||o?(0,i.jsxs)(`div`,{className:r.meta,children:[s?(0,i.jsxs)(`span`,{className:`${r.delta} ${d}`,"data-delta-tone":d===r.deltaGood?`good`:d===r.deltaBad?`bad`:`neutral`,children:[f?(0,i.jsx)(`span`,{className:r.arrow,"aria-hidden":`true`,children:f}):null,(0,i.jsx)(`span`,{children:a(s)})]}):null,o?(0,i.jsx)(`span`,{className:r.caption,children:o}):null]}):null]})}function s({trend:e=!0}){return(0,i.jsxs)(`div`,{className:r.tile,"data-stat-tile-skeleton":``,"aria-hidden":`true`,children:[(0,i.jsx)(`span`,{className:`skeleton ${r.skLabel}`}),(0,i.jsx)(`span`,{className:`skeleton ${r.skValue}`}),e?(0,i.jsx)(`span`,{className:`skeleton ${r.skTrend}`}):null,(0,i.jsx)(`span`,{className:`skeleton ${r.skMeta}`})]})}export{s as n,o as t};
|
|
2
|
+
//# sourceMappingURL=StatTile-1_HPOflX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatTile-1_HPOflX.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/StatTile.module.css","../../../../../../src/web-ui/components/charts/StatTile.tsx"],"sourcesContent":[".tile {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n padding: var(--card-pad, var(--space-4));\n border-radius: var(--radius-lg);\n border: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n /* Dark: a 4% white top hairline lifts the KPI row off the canvas; light:\n the token is transparent and this draws nothing. */\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n}\n\n/* KPI number: Plex 600, 24/32, tabular numerals (SPEC-310C §6). */\n.value {\n font-family: var(--font-ui);\n font-size: var(--text-2xl-size);\n line-height: var(--text-2xl-line);\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n overflow-wrap: anywhere;\n}\n\n/* The sparkline sits directly under the number it explains. */\n.trend {\n display: block;\n line-height: 0;\n margin: var(--space-1) 0 2px;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--space-1) var(--space-2);\n}\n\n.delta {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n}\n\n.arrow {\n font-weight: var(--font-weight-semibold);\n}\n\n/* A judged delta sits on its status tint, so good / bad reads at a glance;\n the words carry it too (never colour alone). */\n.deltaGood {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n\n.deltaBad {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n.deltaNeutral {\n color: var(--text-tertiary);\n}\n\n.caption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n/* StatTileSkeleton — bars at the size of what they stand in for. */\n.skLabel {\n display: block;\n width: 40%;\n height: var(--text-2xs-line);\n}\n\n.skValue {\n display: block;\n width: 55%;\n height: var(--text-2xl-line);\n}\n\n.skTrend {\n display: block;\n width: 100%;\n height: 28px;\n margin: var(--space-1) 0 2px;\n}\n\n.skMeta {\n display: block;\n width: 70%;\n height: var(--text-xs-line);\n}\n","/**\n * components/charts/StatTile.tsx — value + delta + optional sparkline, the\n * figure contract from marks-and-anatomy.md. Use for a single current value\n * (a one-bar bar chart is never the answer — this is). `value` takes a\n * ReactNode (not just a string) so callers can wrap a sourceQuality-bearing\n * field in <Epistemic/> and pass that straight through.\n *\n * V3.10 (SPEC-310C §6 \"StatTile: sparkline goes under the number; deltas show\n * units\"): the 72×24 sparkline used to float top-right, disconnected from the\n * number it explains; it now sits directly under it. A delta reads as a\n * sentence fragment with its unit and its comparison — \"+5 merges vs prior\n * 7d\", never a bare \"-1\". In dark the tile gets the 4% top hairline\n * (`--hairline-lift`, transparent in light) so a KPI row lifts off the canvas.\n *\n * Polish (verse-visual-quality): the sparkline spans the tile (`fill`), in\n * the quantity ink with a gradient wash; a judged delta sits on a tinted pill\n * with a direction arrow (the arrow is decoration — the signed number and\n * its words still say which way it went).\n */\nimport type { ReactNode } from 'react';\nimport { formatSignedCompact } from './format.js';\nimport { Sparkline } from './Sparkline.js';\nimport styles from './StatTile.module.css';\n\nexport interface StatTileDelta {\n /** Signed raw value, e.g. +12 or -3. */\n value: number;\n /** Whether a positive delta reads as good (green) or bad (red). Omit for\n * a neutral, non-judgmental delta (e.g. \"goals in flight\" — more isn't\n * inherently good or bad). */\n goodWhenPositive?: boolean;\n /** vs which period, e.g. \"vs prior 7d\". */\n versus?: string;\n /** Unit after the number: \"merges\", \"pts\", \"min\". Plural is the caller's call. */\n unit?: string;\n /** Formats the SIGNED value (default: \"+12\" / \"-3\"). Use for percent points, durations, dollars. */\n format?: (signed: number) => string;\n}\n\n/** \"+5 merges vs prior 7d\" — the whole delta as one readable phrase. */\nexport function deltaText(delta: StatTileDelta): string {\n const n = delta.format ? delta.format(delta.value) : formatSignedCompact(delta.value);\n return [n, delta.unit, delta.versus].filter((part) => part !== undefined && part !== '').join(' ');\n}\n\nexport function StatTile({\n label,\n value,\n caption,\n delta,\n trend,\n trendLabel,\n describeTrend,\n}: {\n label: string;\n value: ReactNode;\n caption?: ReactNode;\n delta?: StatTileDelta | null;\n trend?: (number | null)[];\n trendLabel?: string;\n /** Spoken summary formatter for the sparkline (first → latest, range). */\n describeTrend?: (v: number) => string;\n}) {\n const deltaTone =\n delta == null || delta.goodWhenPositive === undefined\n ? styles.deltaNeutral\n : delta.value === 0\n ? styles.deltaNeutral\n : (delta.value > 0) === delta.goodWhenPositive\n ? styles.deltaGood\n : styles.deltaBad;\n\n const arrow = delta == null || delta.value === 0 || !Number.isFinite(delta.value) ? null : delta.value > 0 ? '↑' : '↓';\n\n return (\n <div className={styles.tile} data-stat-tile=\"\">\n <span className={styles.label}>{label}</span>\n <span className={styles.value}>{value}</span>\n {trend ? (\n <span className={styles.trend}>\n <Sparkline points={trend} width=\"fill\" height={28} area ariaLabel={trendLabel ?? `${label} trend`} describe={describeTrend} />\n </span>\n ) : null}\n {delta || caption ? (\n <div className={styles.meta}>\n {delta ? (\n <span className={`${styles.delta} ${deltaTone}`} data-delta-tone={deltaTone === styles.deltaGood ? 'good' : deltaTone === styles.deltaBad ? 'bad' : 'neutral'}>\n {arrow ? <span className={styles.arrow} aria-hidden=\"true\">{arrow}</span> : null}\n <span>{deltaText(delta)}</span>\n </span>\n ) : null}\n {caption ? <span className={styles.caption}>{caption}</span> : null}\n </div>\n ) : null}\n </div>\n );\n}\n\n/**\n * A stat tile's loading placeholder in the tile's own shape — label, number\n * and sparkline bars on the same box — so a KPI row does not jump when its\n * figures land. Uses the app's shared `.skeleton` shimmer (design/global.css),\n * which already stops under reduced motion. Presentation only: the caller\n * announces the loading state once for the whole row.\n */\nexport function StatTileSkeleton({ trend = true }: { trend?: boolean }) {\n return (\n <div className={styles.tile} data-stat-tile-skeleton=\"\" aria-hidden=\"true\">\n <span className={`skeleton ${styles.skLabel}`} />\n <span className={`skeleton ${styles.skValue}`} />\n {trend ? <span className={`skeleton ${styles.skTrend}`} /> : null}\n <span className={`skeleton ${styles.skMeta}`} />\n </div>\n );\n}\n"],"mappings":"whBCwCA,SAAgB,EAAU,EAA8B,CAEtD,MAAO,CADG,EAAM,OAAS,EAAM,OAAO,EAAM,KAAK,EAAI,EAAoB,EAAM,KAAK,EACzE,EAAM,KAAM,EAAM,MAAM,CAAC,CAAC,OAAQ,GAAS,IAAS,IAAA,IAAa,IAAS,EAAE,CAAC,CAAC,KAAK,GAAG,CACnG,CAEA,SAAgB,EAAS,CACvB,QACA,QACA,UACA,QACA,QACA,aACA,iBAUC,CACD,IAAM,EACJ,GAAS,MAAQ,EAAM,mBAAqB,IAAA,IAExC,EAAM,QAAU,EADhB,EAAO,aAGJ,EAAM,MAAQ,IAAO,EAAM,iBAC1B,EAAO,UACP,EAAO,SAEX,EAAQ,GAAS,MAAQ,EAAM,QAAU,GAAK,CAAC,OAAO,SAAS,EAAM,KAAK,EAAI,KAAO,EAAM,MAAQ,EAAI,IAAM,IAEnH,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,iBAAe,GAA5C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,GAC5C,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,EAC3C,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MACtB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,OAAQ,EAAO,MAAM,OAAO,OAAQ,GAAI,KAAA,GAAK,UAAW,GAAc,GAAG,EAAM,QAAS,SAAU,CAAgB,CAAA,CACzH,CAAA,EACJ,KACH,GAAS,GACR,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GACC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,IAAa,kBAAiB,IAAc,EAAO,UAAY,OAAS,IAAc,EAAO,SAAW,MAAQ,UAApJ,SAAA,CACG,GAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,cAAY,OAAQ,SAAA,CAAY,CAAA,EAAI,MAC5E,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAU,CAAK,CAAQ,CAAA,CAC1B,CACJ,CAAA,EAAA,KACH,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAU,SAAA,CAAc,CAAA,EAAI,IAC5D,CACH,CAAA,EAAA,IACD,GAET,CASA,SAAgB,EAAiB,CAAE,QAAQ,IAA6B,CACtE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,0BAAwB,GAAG,cAAY,OAApE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,SAAY,CAAA,GAChD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,SAAY,CAAA,EAC/C,GAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,SAAY,CAAA,EAAI,MAC7D,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,QAAW,CAAA,CAC5C,GAET"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./index-_izD07R9.js";var t={badge:`_badge_ytqgz_4`,dot:`_dot_ytqgz_17`,neutral:`_neutral_ytqgz_24`,info:`_info_ytqgz_32`,running:`_running_ytqgz_40`,pulse:`_pulse_ytqgz_1`,success:`_success_ytqgz_49`,warning:`_warning_ytqgz_57`,danger:`_danger_ytqgz_65`,unknown:`_unknown_ytqgz_73`,phaseDot:`_phaseDot_ytqgz_82`},n=e(),r={pending:`neutral`,queued:`neutral`,waiting:`neutral`,running:`running`,active:`running`,in_progress:`running`,building:`running`,applying:`running`,done:`success`,success:`success`,succeeded:`success`,applied:`success`,merged:`success`,ready:`success`,approved:`success`,ship:`success`,review:`warning`,degraded:`warning`,paused:`warning`,noise:`neutral`,failed:`danger`,error:`danger`,errored:`danger`,rejected:`danger`,harmful:`danger`,cancelled:`neutral`,canceled:`neutral`,unknown:`unknown`};function i(e){return e?r[e.toLowerCase()]??`neutral`:`unknown`}function a({status:e,tone:r,children:a}){let o=r??i(e);return(0,n.jsxs)(`span`,{className:`${t.badge} ${t[o]}`,children:[(0,n.jsx)(`span`,{className:t.dot,"aria-hidden":`true`}),a??e]})}function o({index:e}){let r=(e%6+6)%6;return(0,n.jsx)(`span`,{className:t.phaseDot,style:{background:`var(--phase-${r+1})`},"aria-hidden":`true`})}export{a as n,i as r,o as t};
|
|
2
|
+
//# sourceMappingURL=StatusBadge-zR7YgIa8.js.map
|