@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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DiffViewer-DjtLl7ro.js","names":[],"sources":["../../../../../../src/web-ui/routes/inbox/DiffViewer.module.css","../../../../../../src/web-ui/routes/inbox/DiffViewer.tsx"],"sourcesContent":[".viewer {\n display: grid;\n grid-template-columns: minmax(180px, 260px) 1fr;\n gap: var(--space-4);\n align-items: start;\n min-height: 0;\n}\n\n.malformedNotice {\n grid-column: 1 / -1;\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-sm);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n}\n\n.empty {\n padding: var(--space-6);\n text-align: center;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n border: 1px dashed var(--border-default);\n border-radius: var(--radius-md);\n}\n\n.tree {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n padding: var(--space-2);\n max-height: 480px;\n overflow-y: auto;\n position: sticky;\n top: 0;\n}\n\n.treeItem {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-sm);\n background: transparent;\n border: none;\n text-align: left;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n cursor: pointer;\n}\n\n.treeItem:hover {\n background: var(--bg-hover);\n}\n\n.treeItemActive {\n background: var(--bg-selected);\n color: var(--text-primary);\n}\n\n.statusDot {\n flex: 0 0 auto;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n}\n.status_added { background: var(--status-success-solid); }\n.status_deleted { background: var(--status-danger-solid); }\n.status_modified { background: var(--status-info-solid); }\n.status_renamed { background: var(--status-warning-solid); }\n\n.treePath {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n}\n\n.treeStats {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n font-variant-numeric: tabular-nums;\n}\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n\n.body {\n min-width: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.fileHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-canvas);\n}\n\n.filePath {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.modeToggle {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n}\n.modeToggle button {\n padding: var(--space-1) var(--space-2);\n font-size: var(--text-xs-size);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-default);\n background: var(--bg-surface);\n color: var(--text-secondary);\n cursor: pointer;\n}\n.modeActive {\n background: var(--accent-50);\n border-color: var(--accent-500) !important;\n color: var(--accent-600) !important;\n}\n\n.notice {\n margin: var(--space-3);\n padding: var(--space-2);\n background: var(--bg-code);\n border-radius: var(--radius-sm);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.emptyFile {\n padding: var(--space-4);\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n}\n\n.hunkTable {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n table-layout: fixed;\n}\n\n.hunkCaption {\n caption-side: top;\n text-align: left;\n padding: var(--space-1) var(--space-3);\n color: var(--text-tertiary);\n background: var(--bg-canvas);\n border-bottom: 1px solid var(--border-subtle);\n border-top: 1px solid var(--border-subtle);\n}\n\n.lineNo {\n width: 44px;\n min-width: 44px;\n padding: 0 var(--space-2);\n text-align: right;\n color: var(--text-disabled);\n user-select: none;\n vertical-align: top;\n font-variant-numeric: tabular-nums;\n}\n\n.lineMarker {\n width: 16px;\n min-width: 16px;\n text-align: center;\n user-select: none;\n vertical-align: top;\n}\n\n.lineText {\n padding: 0 var(--space-2);\n white-space: pre-wrap;\n word-break: break-word;\n vertical-align: top;\n}\n\n.hunkTableSplit .lineText {\n width: 50%;\n}\n\n.rowBlank {\n background: var(--bg-canvas);\n}\n\n.row_add {\n background: var(--status-success-bg);\n}\n.row_del {\n background: var(--status-danger-bg);\n}\n.row_context {\n background: transparent;\n}\n\n.code {\n font-family: inherit;\n}\n\n.tok_plain { color: var(--text-primary); }\n.tok_comment { color: var(--text-tertiary); font-style: italic; }\n.tok_string { color: var(--status-success-fg); }\n.tok_number { color: var(--status-warning-fg); }\n.tok_keyword { color: var(--accent-600); font-weight: var(--font-weight-medium); }\n","/**\n * routes/inbox/DiffViewer.tsx — the core review interaction (operator-\n * console brief item 2). A multi-file unified diff gets a file tree plus a\n * syntax-highlighted, split/unified-toggleable hunk view instead of one\n * escaped <pre> block (the old UI's approach). No diff/highlighting\n * dependency: diff-parser.ts and highlight.ts are both hand-rolled per the\n * foundation's \"keep new runtime deps minimal\" constraint — checked\n * package.json first; nothing suitable was already a dependency.\n */\nimport { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport { parseUnifiedDiff, toSplitRows, type DiffHunk } from './diff-parser.js';\nimport { languageForPath, tokenizeLine, type LangFamily } from './highlight.js';\nimport styles from './DiffViewer.module.css';\n\ntype ViewMode = 'unified' | 'split';\n\nexport function DiffViewer({ diff, proposalKind }: { diff: string | undefined; proposalKind: string }) {\n const parsed = useMemo(() => parseUnifiedDiff(diff), [diff]);\n const [selectedId, setSelectedId] = useState<string | null>(parsed.files[0]?.id ?? null);\n const [mode, setMode] = useState<ViewMode>('unified');\n\n // Diff identity changed (a different proposal is now shown) — reset the\n // selected file rather than holding on to a stale id from the last one.\n useEffect(() => {\n setSelectedId(parsed.files[0]?.id ?? null);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- reset on diff content change only\n }, [diff]);\n\n if (parsed.files.length === 0) {\n return (\n <div className={styles.empty}>No diff attached to this proposal (kind: {proposalKind}).</div>\n );\n }\n\n const selected = parsed.files.find((f) => f.id === selectedId) ?? parsed.files[0]!;\n\n function onTreeKeyDown(e: React.KeyboardEvent) {\n const idx = parsed.files.findIndex((f) => f.id === selected.id);\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.min(idx + 1, parsed.files.length - 1)]!.id);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.max(idx - 1, 0)]!.id);\n }\n }\n\n return (\n <div className={styles.viewer}>\n {parsed.malformed ? (\n <p className={styles.malformedNotice}>Could not parse this as a unified diff — showing raw content.</p>\n ) : null}\n <div className={styles.tree} role=\"tree\" aria-label=\"Changed files\" onKeyDown={onTreeKeyDown}>\n {parsed.files.map((f) => (\n <button\n key={f.id}\n type=\"button\"\n role=\"treeitem\"\n aria-selected={f.id === selected.id}\n tabIndex={f.id === selected.id ? 0 : -1}\n className={`${styles.treeItem} ${f.id === selected.id ? styles.treeItemActive : ''}`}\n onClick={() => setSelectedId(f.id)}\n >\n <span className={`${styles.statusDot} ${styles[`status_${f.status}`]}`} aria-hidden=\"true\" />\n <span className={styles.treePath} title={f.displayPath}>\n {f.displayPath}\n </span>\n <span className={styles.treeStats}>\n {f.additions > 0 ? <span className={styles.add}>+{f.additions}</span> : null}\n {f.deletions > 0 ? <span className={styles.del}>-{f.deletions}</span> : null}\n </span>\n </button>\n ))}\n </div>\n\n <div className={styles.body}>\n <div className={styles.fileHeader}>\n <span className={styles.filePath}>{selected.displayPath}</span>\n <div className={styles.modeToggle} role=\"group\" aria-label=\"Diff view mode\">\n <button\n type=\"button\"\n aria-pressed={mode === 'unified'}\n className={mode === 'unified' ? styles.modeActive : ''}\n onClick={() => setMode('unified')}\n >\n Unified\n </button>\n <button\n type=\"button\"\n aria-pressed={mode === 'split'}\n className={mode === 'split' ? styles.modeActive : ''}\n onClick={() => setMode('split')}\n >\n Split\n </button>\n </div>\n </div>\n {selected.unparsedNotice ? <pre className={styles.notice}>{selected.unparsedNotice}</pre> : null}\n {selected.hunks.length === 0 && !selected.unparsedNotice ? (\n <p className={styles.emptyFile}>No line-level changes captured for this file.</p>\n ) : (\n selected.hunks.map((hunk, i) => <Hunk key={i} hunk={hunk} mode={mode} path={selected.displayPath} />)\n )}\n </div>\n </div>\n );\n}\n\nfunction Hunk({ hunk, mode, path }: { hunk: DiffHunk; mode: ViewMode; path: string }) {\n const lang = languageForPath(path);\n if (mode === 'split') {\n const rows = toSplitRows(hunk.lines);\n return (\n <table className={`${styles.hunkTable} ${styles.hunkTableSplit}`}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {rows.map((row, i) => (\n <tr key={i}>\n <td className={styles.lineNo}>{row.left?.oldLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.left ? styles[`row_${row.left.kind}`] : styles.rowBlank}`}>\n {row.left ? <CodeLine text={row.left.text} lang={lang} /> : null}\n </td>\n <td className={styles.lineNo}>{row.right?.newLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.right ? styles[`row_${row.right.kind}`] : styles.rowBlank}`}>\n {row.right ? <CodeLine text={row.right.text} lang={lang} /> : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n return (\n <table className={styles.hunkTable}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {hunk.lines.map((line, i) => (\n <tr key={i} className={styles[`row_${line.kind}`]}>\n <td className={styles.lineNo}>{line.oldLineNo ?? ''}</td>\n <td className={styles.lineNo}>{line.newLineNo ?? ''}</td>\n <td className={styles.lineMarker} aria-hidden=\"true\">\n {line.kind === 'add' ? '+' : line.kind === 'del' ? '-' : ''}\n </td>\n <td className={styles.lineText}>\n <CodeLine text={line.text} lang={lang} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction CodeLine({ text, lang }: { text: string; lang: LangFamily }): ReactNode {\n const tokens = tokenizeLine(text, lang);\n return (\n <code className={styles.code}>\n {tokens.map((t, i) => (\n <span key={i} className={styles[`tok_${t.kind}`]}>\n {t.text}\n </span>\n ))}\n </code>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e,s as t,u as n}from"./index-BbDqdepe.js";import{i as r}from"./SkipToContent-C7UObcP2.js";import{$ as i,Bt as a,G as o,H as s,Lt as c,Q as l,V as u,X as d,Y as f,Z as p,at as m,dt as h,et as g,it as _,q as v,st as y,ut as b}from"./VerseConsoleApp-kFOEmnGC.js";import{t as x}from"./Button-DP2ImS5n.js";import{n as S,t as ee}from"./ActionMenu-Bia8Re6u.js";import{_ as C,l as te,n as w,u as ne}from"./dock-icons-CRHjXBWm.js";import{c as T,i as re,l as ie,o as ae,r as E,s as oe}from"./panes-BjUzIDw6.js";import{t as D}from"./EmptyState-BEXDoNZd.js";import{t as O}from"./chat-pane-data-DIDV7uIU.js";var k=n(t(),1),A={dock:`_dock_17laz_8`,head:`_head_17laz_30`,sheetLayer:`_sheetLayer_17laz_33`,scrim:`_scrim_17laz_45`,"dock-fade":`_dock-fade_17laz_1`,"dock-in-right":`_dock-in-right_17laz_1`,"dock-in-up":`_dock-in-up_17laz_1`,grabber:`_grabber_17laz_72`,tabs:`_tabs_17laz_94`,tabWrap:`_tabWrap_17laz_105`,tab:`_tab_17laz_94`,tabClose:`_tabClose_17laz_143`,headActions:`_headActions_17laz_164`,iconButton:`_iconButton_17laz_170`,plus:`_plus_17laz_187`,body:`_body_17laz_193`,pane:`_pane_17laz_199`,splitHandle:`_splitHandle_17laz_208`,loading:`_loading_17laz_228`,heightHandle:`_heightHandle_17laz_236`,widthHandle:`_widthHandle_17laz_267`},j=e();function M(e){let t=c(e);return t?a(t):null}function N(e){return E(e)?.title??e}var P=16,F=64,I=.05;function L(e){let t=(0,k.useRef)(null),n=(0,k.useRef)(null);return(0,k.useEffect)(()=>()=>{n.current!==null&&cancelAnimationFrame(n.current)},[]),(0,k.useCallback)(r=>{t.current=r,n.current===null&&(n.current=requestAnimationFrame(()=>{n.current=null,t.current!==null&&e(t.current),t.current=null}))},[e])}function R(e){let{presentation:t,windowWidth:n,columnWidth:r,columnMax:i=1/0,columnHeight:a=0,pane:c}=e,{state:l,requests:d}=m();ie();let f=(0,k.useRef)(null),p=(0,k.useRef)(new Map),v=(0,k.useId)(),[x,D]=(0,k.useState)(null),[O,P]=(0,k.useState)(()=>new Set(l.open&&l.active?[l.active]:[])),F={sessionId:c.sessionId,session:c.session,roots:c.roots},I=l.tabs.filter(e=>re(e,F)),L=l.active!==null&&I.includes(l.active)?l.active:I[0]??null,R=l.splitWith!==null&&I.includes(l.splitWith)&&l.splitWith!==L?l.splitWith:null,z=l.open&&L!==null,B=t===`sheet`||t===`bottom-sheet`,V=!B,W=t===`column`||t===`sheet`,G=R!==null&&W;(0,k.useEffect)(()=>{z&&P(e=>{let t=[L,R].filter(e=>e!==null),n=new Set([...e].filter(e=>I.includes(e)));for(let e of t)n.add(e);return n.size===e.size&&[...n].every(t=>e.has(t))?e:n})},[z,L,R,I.join(`|`)]),(0,k.useEffect)(()=>{z&&T()},[z]),(0,k.useEffect)(()=>{if(!z||!B)return;let e=document.activeElement;return f.current?.focus({preventScroll:!0}),()=>{e&&document.contains(e)&&e.focus({preventScroll:!0})}},[z,B]);let le=(0,k.useCallback)(e=>{if(!B)return;let t=e.target instanceof Element&&e.target.closest(`[data-dock-pane="terminal"]`)!==null;if(e.key===`Escape`&&!t&&!e.defaultPrevented){e.preventDefault(),u();return}if(e.key!==`Tab`||t)return;let n=f.current;if(!n)return;let r=Array.from(n.querySelectorAll(`button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex="-1"])`)).filter(e=>!e.closest(`[hidden]`));if(r.length===0)return;let i=r[0],a=r[r.length-1];e.shiftKey&&document.activeElement===i?(e.preventDefault(),a.focus()):!e.shiftKey&&document.activeElement===a&&(e.preventDefault(),i.focus())},[B]);if(!z)return null;function ue(e,t){let n=I.indexOf(t),r;if(e.key===`ArrowRight`)r=I[(n+1)%I.length];else if(e.key===`ArrowLeft`)r=I[(n-1+I.length)%I.length];else if(e.key===`Home`)r=I[0];else if(e.key===`End`)r=I[I.length-1];else if((e.key===`Delete`||e.key===`Backspace`)&&I.length>0){e.preventDefault(),s(t);return}r&&(e.preventDefault(),o(r),p.current.get(r)?.focus())}let K=oe(F),q=(e,t,n)=>{let r=e.icon;return{id:e.id,label:t,icon:(0,j.jsx)(r,{size:14}),onSelect:n}},J=K.filter(e=>!I.includes(e.id)),de=J.map(e=>q(e,e.title,()=>o(e.id))),Y=[...K.filter(e=>e.id!==L).map(e=>q(e,`${e.title} below`,()=>g(e.id))),...R?[{id:`unsplit`,label:`One pane`,separated:!0,onSelect:()=>g(null)}]:[]],X=M(`dock.toggle`),Z=t===`column`?r:h(l.width,n),Q=b(l.height,a),fe=`Dock: ${N(L)}${G?` over ${N(R)}`:``}`,pe=t===`bottom-sheet`?{height:`${y.bottomSheetHeightVh}vh`}:t===`bottom`?{height:Q}:{width:Z},$=(0,j.jsxs)(`aside`,{ref:f,className:A.dock,"data-presentation":t,"data-split":G?`true`:void 0,"aria-label":fe,role:B?`dialog`:`complementary`,"aria-modal":B?!0:void 0,tabIndex:-1,style:pe,onKeyDown:le,children:[t===`column`?(0,j.jsx)(ce,{width:Z,windowWidth:n,columnMax:i}):null,t===`bottom`?(0,j.jsx)(H,{height:Q,columnHeight:a}):null,t===`bottom-sheet`?(0,j.jsx)(`span`,{className:A.grabber,"aria-hidden":`true`}):null,(0,j.jsxs)(`div`,{className:A.head,"data-app-region":t===`column`?`drag`:void 0,children:[(0,j.jsx)(`div`,{className:A.tabs,role:`tablist`,"aria-label":`Dock panes`,children:I.map(e=>{let t=E(e),n=t.icon,r=t.title,i=e===L,a=e===R&&G,c=ae(t);return(0,j.jsxs)(`div`,{className:A.tabWrap,"data-selected":i||void 0,"data-below":a||void 0,children:[(0,j.jsxs)(`button`,{ref:t=>{t?p.current.set(e,t):p.current.delete(e)},type:`button`,role:`tab`,id:`${v}-tab-${e}`,"aria-selected":i,"aria-controls":`${v}-pane-${e}`,tabIndex:i?0:-1,className:A.tab,onClick:()=>o(e),onKeyDown:t=>ue(t,e),title:a?`${r} (lower pane)`:c?`${r} (${c})`:void 0,children:[(0,j.jsx)(n,{size:14}),(0,j.jsx)(`span`,{className:A.tabLabel,children:r})]}),(0,j.jsx)(`button`,{type:`button`,className:A.tabClose,"aria-label":`Close ${r}`,title:`Close ${r}`,tabIndex:-1,onClick:()=>s(e),children:(0,j.jsx)(w,{size:12})})]},e)})}),(0,j.jsxs)(`div`,{className:A.headActions,children:[(0,j.jsx)(`button`,{type:`button`,className:A.iconButton,"aria-label":`Add a pane`,title:J.length>0?`Add a pane`:`Every pane is already open`,"aria-haspopup":`menu`,"aria-expanded":x?.kind===`add`,disabled:J.length===0,onClick:e=>D({kind:`add`,anchor:S(e.currentTarget),from:e.currentTarget}),children:(0,j.jsx)(`span`,{className:A.plus,"aria-hidden":`true`,children:`+`})}),W&&Y.length>0?(0,j.jsx)(`button`,{type:`button`,className:A.iconButton,"aria-label":G?`Split: change or undo`:`Split the dock`,title:G?`Change the split`:`Split: show a second pane below`,"aria-haspopup":`menu`,"aria-expanded":x?.kind===`split`,"aria-pressed":G,onClick:e=>D({kind:`split`,anchor:S(e.currentTarget),from:e.currentTarget}),children:(0,j.jsx)(C,{size:14})}):null,V?(0,j.jsx)(`button`,{type:`button`,className:A.iconButton,"aria-label":t===`bottom`?`Move the dock beside the chat`:`Move the dock below the chat`,title:t===`bottom`?`Move beside the chat`:`Move below the chat`,onClick:_,children:t===`bottom`?(0,j.jsx)(ne,{size:14}):(0,j.jsx)(te,{size:14})}):null,(0,j.jsx)(`button`,{type:`button`,className:A.iconButton,"aria-label":`Close the dock`,title:`Close the dock${X?` (${X})`:``}`,onClick:u,children:(0,j.jsx)(w,{size:14})})]})]}),(0,j.jsxs)(`div`,{className:A.body,children:[I.filter(e=>O.has(e)||e===L||e===R).map(e=>{let n=e===L||e===R&&G,r=e===L?`top`:e===R?`bottom`:`hidden`;return(0,j.jsx)(`div`,{id:`${v}-pane-${e}`,role:`tabpanel`,"aria-labelledby":`${v}-tab-${e}`,className:A.pane,"data-dock-pane":e,"data-position":n?r:`hidden`,hidden:!n,inert:!n,style:n&&G?{flexBasis:`${(r===`top`?l.splitRatio:1-l.splitRatio)*100}%`,order:r===`top`?0:2}:void 0,children:(0,j.jsx)(se,{id:e,visible:n,presentation:t,context:c,requests:d})},e)}),G?(0,j.jsx)(U,{ratio:l.splitRatio,lower:N(R)}):null]}),x?(0,j.jsx)(ee,{label:x.kind===`add`?`Add a pane`:`Split the dock`,items:x.kind===`add`?de:Y,anchor:x.anchor,returnFocus:x.from,onClose:()=>D(null)}):null]});return B?(0,j.jsxs)(`div`,{className:A.sheetLayer,"data-presentation":t,"data-dock-layer":!0,children:[(0,j.jsx)(`button`,{type:`button`,className:A.scrim,"aria-label":`Close the dock`,tabIndex:-1,onClick:u}),$]}):$}function se({id:e,visible:t,presentation:n,context:r,requests:i}){let[a,o]=(0,k.useState)(0),s=E(e);if(!s)return null;if(s.needsSession&&r.sessionId===null){let e=M(`chat.new`);return(0,j.jsx)(D,{compact:!0,title:`Open a chat to use ${s.title}`,body:`Pick a chat in the sidebar${e?` or start one with ${e}`:``}. ${s.description??`${s.title} works in that chat's folders.`}`})}let c=s.component;return(0,j.jsx)(B,{title:s.title,onRetry:()=>o(e=>e+1),children:(0,j.jsx)(k.Suspense,{fallback:(0,j.jsx)(z,{title:s.title}),children:(0,j.jsx)(c,{...r,paneId:e,visible:t,presentation:n,requests:i})})},`${a}`)}function z({title:e}){return(0,j.jsxs)(`div`,{className:A.loading,role:`status`,"aria-label":`Loading ${e}`,children:[(0,j.jsx)(r,{width:`42%`}),(0,j.jsx)(r,{width:`78%`}),(0,j.jsx)(r,{width:`64%`})]})}var B=class extends k.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(e,t){console.error(`[verse] ${this.props.title} pane failed`,e,t.componentStack)}render(){return this.state.failed?(0,j.jsx)(D,{compact:!0,tone:`error`,title:`${this.props.title} could not load`,body:`The rest of the chat still works.`,action:(0,j.jsx)(x,{variant:`subtle`,size:`sm`,onClick:this.props.onRetry,children:`Try again`})}):this.props.children}};function V({axis:e,size:t,min:n,max:r,cssVar:i,commit:a}){let o=(0,k.useRef)(null),[s,c]=(0,k.useState)(!1);(0,k.useEffect)(()=>()=>{o.current?.frame!=null&&cancelAnimationFrame(o.current.frame),document.body.removeAttribute(`data-verse-resizing`)},[]);function l(t,n){let r=t.parentElement,a=r?.parentElement;r&&(r.style[e===`x`?`width`:`height`]=`${n}px`),a?.style.setProperty(i,`${n}px`),t.setAttribute(`aria-valuenow`,String(n))}function u(n){n.button===0&&(n.preventDefault(),o.current={start:e===`x`?n.clientX:n.clientY,startSize:t,last:null,handle:n.currentTarget,frame:null},n.currentTarget.setPointerCapture?.(n.pointerId),c(!0),document.body.setAttribute(`data-verse-resizing`,e===`x`?`true`:`row`))}function d(t){let i=o.current;if(!i)return;let a=i.start-(e===`x`?t.clientX:t.clientY);i.last=Math.min(r,Math.max(n,Math.round(i.startSize+a))),i.frame===null&&(i.frame=requestAnimationFrame(()=>{i.frame=null,i.last!==null&&l(i.handle,i.last)}))}function f(){let e=o.current;o.current=null,c(!1),document.body.removeAttribute(`data-verse-resizing`),e&&(e.frame!==null&&cancelAnimationFrame(e.frame),e.last!==null&&a(e.last))}return{dragging:s,handlers:{onPointerDown:u,onPointerMove:d,onPointerUp:f,onPointerCancel:f,onLostPointerCapture:f}}}function ce({width:e,windowWidth:t,columnMax:n}){let r=Math.max(y.minWidth,Math.min(Math.floor(t*y.maxWidthFraction),n)),{dragging:a,handlers:o}=V({axis:`x`,size:e,min:y.minWidth,max:r,cssVar:`--verse-dock-width`,commit:i});function s(n){let a=n.shiftKey?F:P,o=null;n.key===`ArrowLeft`?o=e+a:n.key===`ArrowRight`?o=e-a:n.key===`Home`?o=y.minWidth:n.key===`End`&&(o=r),o!==null&&(n.preventDefault(),i(Math.min(r,h(o,t))))}return(0,j.jsx)(`div`,{className:A.widthHandle,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize the dock`,"aria-valuemin":y.minWidth,"aria-valuemax":r,"aria-valuenow":Math.round(e),tabIndex:0,"data-dragging":a||void 0,...o,onDoubleClick:()=>i(y.defaultWidth),onKeyDown:s})}function H({height:e,columnHeight:t}){let n=b(2**53-1,t),{dragging:r,handlers:i}=V({axis:`y`,size:e,min:y.minHeight,max:n,cssVar:`--verse-dock-height`,commit:p});function a(r){let i=r.shiftKey?F:P,a=null;r.key===`ArrowUp`?a=e+i:r.key===`ArrowDown`?a=e-i:r.key===`Home`?a=y.minHeight:r.key===`End`&&(a=n),a!==null&&(r.preventDefault(),p(b(a,t)))}return(0,j.jsx)(`div`,{className:A.heightHandle,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`Resize the dock`,"aria-valuemin":y.minHeight,"aria-valuemax":n,"aria-valuenow":Math.round(e),tabIndex:0,"data-dragging":r||void 0,...i,onDoubleClick:()=>p(y.defaultHeight),onKeyDown:a})}function U({ratio:e,lower:t}){let n=(0,k.useRef)(null),r=(0,k.useRef)(null),i=L(l);function a(e){if(e.button!==0)return;let t=n.current?.parentElement;if(!t)return;e.preventDefault();let i=t.getBoundingClientRect();r.current={top:i.top,height:i.height},e.currentTarget.setPointerCapture?.(e.pointerId)}function o(e){let t=r.current;!t||t.height<=0||i((e.clientY-t.top)/t.height)}function s(t){t.key===`ArrowUp`?(t.preventDefault(),l(e-I)):t.key===`ArrowDown`&&(t.preventDefault(),l(e+I))}return(0,j.jsx)(`div`,{ref:n,className:A.splitHandle,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`Resize: ${t} below`,"aria-valuemin":Math.round(y.splitRatio.min*100),"aria-valuemax":Math.round(y.splitRatio.max*100),"aria-valuenow":Math.round(e*100),tabIndex:0,style:{order:1},onPointerDown:a,onPointerMove:o,onPointerUp:()=>{r.current=null},onPointerCancel:()=>{r.current=null},onDoubleClick:()=>l(y.splitRatio.default),onKeyDown:s})}function W(e){let{session:t,seats:n,events:r,roots:i,rootsData:a,rootsError:c,turnFiles:l,otherRunning:u,dispatchEnabled:p,onOpenSession:m,onHandoff:h,onOpenAccounts:g,onSendToChat:_,onAddToMessage:y}=e,b=(0,k.useMemo)(()=>({sendToChat:_,addToMessage:y,openPane:o,closePane:s,openTerminal:f,openTerminalBelow:d,openDiff:v,openSession:m}),[_,y,m]),x=(0,k.useMemo)(()=>({sessionId:t?.id??null,session:t,roots:i,events:r,turnFiles:l,host:b}),[t,i,r,l,b]),S=(0,k.useMemo)(()=>({seats:n,rootsData:a,rootsError:c,otherRunning:u,dispatchEnabled:p,onHandoff:h,onOpenAccounts:g}),[n,a,c,u,p,h,g]);return(0,j.jsx)(O.Provider,{value:S,children:(0,j.jsx)(R,{presentation:e.presentation,windowWidth:e.windowWidth,columnWidth:e.columnWidth,columnMax:e.columnMax,columnHeight:e.columnHeight,pane:x})})}export{W as DockHost};
|
|
2
|
-
//# sourceMappingURL=DockHost-BHbosAjM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DockHost-BHbosAjM.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/Dock.module.css","../../../../../../src/web-ui/routes/verse/dock/Dock.tsx","../../../../../../src/web-ui/routes/verse/dock/DockHost.tsx"],"sourcesContent":["/**\n * dock/Dock.module.css — the chat dock: a column at ≥1024px, a right sheet\n * at 480–1023px, a bottom sheet (75vh) below 480px (dock-catalog.ts).\n * Hairlines, not shadows, separate it from the transcript in the column\n * layout; the sheets float, so they carry the dialog shadow. Tokens only\n * (style-scan-310).\n */\n.dock {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n height: 100%;\n background: var(--bg-surface);\n color: var(--text-primary);\n}\n.dock:focus { outline: none; }\n.dock[data-presentation='column'] {\n flex: none;\n border-left: 1px solid var(--border-subtle);\n}\n/* Under the transcript (placement 'bottom'): a row with a hairline above,\n no title-bar inset (the chat header already clears the traffic lights). */\n.dock[data-presentation='bottom'] {\n flex: none;\n height: auto;\n border-top: 1px solid var(--border-subtle);\n}\n.dock[data-presentation='bottom'] .head { height: var(--strip-height); padding-top: 0; }\n\n/* ---- sheets --------------------------------------------------------------- */\n.sheetLayer {\n position: absolute;\n inset: 0;\n z-index: var(--z-overlay);\n display: flex;\n justify-content: flex-end;\n pointer-events: none;\n}\n.sheetLayer[data-presentation='bottom-sheet'] {\n flex-direction: column;\n justify-content: flex-end;\n}\n.scrim {\n position: absolute;\n inset: 0;\n border: 0;\n padding: 0;\n background: var(--bg-overlay);\n cursor: default;\n pointer-events: auto;\n animation: dock-fade var(--duration-base) var(--ease-decelerate);\n}\n.sheetLayer .dock {\n z-index: 1;\n max-width: calc(100% - var(--space-8));\n border-left: 1px solid var(--border-default);\n box-shadow: var(--shadow-dialog);\n pointer-events: auto;\n animation: dock-in-right var(--duration-base) var(--ease-decelerate);\n}\n.sheetLayer[data-presentation='bottom-sheet'] .dock {\n width: 100%;\n max-width: none;\n height: 75vh;\n border-left: 0;\n border-top: 1px solid var(--border-default);\n border-radius: var(--radius-lg) var(--radius-lg) 0 0;\n animation-name: dock-in-up;\n}\n.grabber {\n flex: none;\n align-self: center;\n width: 36px;\n height: 4px;\n margin: var(--space-2) 0 0;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n\n/* ---- head: tabs + actions ------------------------------------------------- */\n.head {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--space-1);\n height: calc(var(--strip-height) + var(--app-titlebar-height, 0px));\n padding: var(--app-titlebar-height, 0px) var(--space-2) 0;\n border-bottom: 1px solid var(--border-subtle);\n}\n.sheetLayer .head { height: var(--strip-height); padding-top: 0; }\n\n.tabs {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: var(--space-1);\n overflow-x: auto;\n scrollbar-width: none;\n}\n.tabs::-webkit-scrollbar { display: none; }\n\n.tabWrap {\n position: relative;\n flex: none;\n display: flex;\n align-items: center;\n border-radius: var(--radius-sm);\n}\n.tabWrap:hover { background: var(--bg-hover); }\n.tabWrap[data-selected] { background: var(--bg-selected); }\n/* The lower pane of a split wears a quiet underline: open, but not on top. */\n.tabWrap[data-below]::after {\n content: '';\n position: absolute;\n left: var(--space-2);\n right: var(--space-2);\n bottom: 2px;\n height: 1px;\n background: var(--border-strong);\n}\n\n.tab {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n min-height: var(--control-h-sm);\n padding: 0 var(--space-1) 0 var(--space-2);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font: inherit;\n font-size: var(--text-sm-size);\n white-space: nowrap;\n cursor: pointer;\n}\n.tabWrap[data-selected] .tab { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.tab:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.tabClose {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--control-h-xs);\n height: var(--control-h-xs);\n margin-right: 2px;\n padding: 0;\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.tabWrap:hover .tabClose,\n.tabWrap[data-selected] .tabClose,\n.tabClose:focus-visible { opacity: 1; }\n.tabClose:hover { color: var(--text-primary); background: var(--bg-active); }\n\n.headActions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 2px;\n}\n.iconButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--control-h-sm);\n height: var(--control-h-sm);\n padding: 0;\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n}\n.iconButton:hover:not(:disabled) { color: var(--text-primary); background: var(--bg-hover); }\n.iconButton:disabled { color: var(--text-disabled); cursor: default; }\n.iconButton[aria-pressed='true'] { color: var(--text-primary); }\n.iconButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n.plus {\n font-size: var(--text-lg-size);\n line-height: 1;\n}\n\n/* ---- body: one pane, or two stacked --------------------------------------- */\n.body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n.pane {\n flex: 1 1 100%;\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n}\n.pane[hidden] { display: none; }\n.dock[data-split] .pane:not([hidden]) { flex-grow: 0; flex-shrink: 0; }\n\n.splitHandle {\n flex: none;\n position: relative;\n height: 1px;\n background: var(--border-subtle);\n cursor: row-resize;\n touch-action: none;\n}\n.splitHandle::before {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n top: -4px;\n bottom: -4px;\n}\n.splitHandle:hover,\n.splitHandle:focus-visible { background: var(--accent-500); outline: none; }\n\n/* ---- a pane loading: its shape, not a spinner ------------------------------ */\n.loading {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n padding: var(--space-4);\n}\n\n/* ---- height handle (bottom panel only) ------------------------------------- */\n.heightHandle {\n position: absolute;\n top: -4px;\n left: 0;\n right: 0;\n z-index: 1;\n height: 9px;\n cursor: row-resize;\n touch-action: none;\n}\n.heightHandle::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n top: 4px;\n height: 1px;\n background: transparent;\n transition: background var(--duration-fast) var(--ease-standard);\n}\n.heightHandle:hover::after,\n.heightHandle:focus-visible::after,\n.heightHandle[data-dragging]::after { background: var(--accent-500); }\n.heightHandle:focus-visible { outline: none; }\n:global(body[data-verse-resizing='row']) {\n user-select: none;\n -webkit-user-select: none;\n cursor: row-resize;\n}\n\n/* ---- width handle (column only) ------------------------------------------- */\n.widthHandle {\n position: absolute;\n top: var(--app-titlebar-height, 0px);\n bottom: 0;\n left: -4px;\n z-index: 1;\n width: 9px;\n cursor: col-resize;\n touch-action: none;\n}\n.widthHandle::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 4px;\n width: 1px;\n background: transparent;\n transition: background var(--duration-fast) var(--ease-standard);\n}\n.widthHandle:hover::after,\n.widthHandle:focus-visible::after,\n.widthHandle[data-dragging]::after { background: var(--accent-500); }\n.widthHandle:focus-visible { outline: none; }\n\n/* Dark theme: a 4% top hairline instead of a shadow (SPEC-310C §6). */\n.dock[data-presentation='column'] { box-shadow: inset 0 1px 0 var(--hairline-lift); }\n\n@keyframes dock-fade { from { opacity: 0; } to { opacity: 1; } }\n@keyframes dock-in-right { from { opacity: 0; transform: translateX(4px); } to { opacity: 1; transform: none; } }\n@keyframes dock-in-up { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .scrim,\n :root:not([data-motion='full']) .sheetLayer .dock { animation: none; }\n}\n:root[data-motion='reduce'] .scrim,\n:root[data-motion='reduce'] .sheetLayer .dock { animation: none; }\n","/**\n * routes/verse/dock/Dock.tsx — the chat's PANEL AREA: every registered pane\n * (Terminal, Browser, Changes, Files, Sources, Reasoning, Tasks, Context,\n * and whatever other units register) as tabs, one pane or two stacked\n * (SPEC-310C §3, unit C2; 3.16 workbench; contracts: shell/dock-catalog.ts,\n * panes/pane-registry.ts).\n *\n * THE CONTAINER, NOT THE PANES. Panes come from the pane REGISTRY: the dock\n * never imports a pane's code. A pane that is not registered (or whose\n * `when` says it does not apply to this chat) simply has no tab — its\n * persisted tab comes back when it does. Each pane renders inside its own\n * error boundary (a crash says so, with a retry, and takes nothing else\n * down) and Suspense boundary (a lazy pane is its own chunk).\n *\n * LAYOUT follows the window and the operator (dockPresentation):\n * ≥ 1024px beside the chat (`column`, 320px … 60% of the window, its\n * left edge dragged or moved with ←/→) — or under it (`bottom`,\n * its top edge dragged or moved with ↑/↓), the operator's pick;\n * 480–1023 a sheet over the chat from the right;\n * < 480 a bottom sheet, 75vh.\n * Two panes split vertically (\"Browser over Terminal\"), their boundary\n * dragged or moved with ↑/↓. Every drag is coalesced to one state write per\n * animation frame, so resizing holds 60fps however heavy the panes are.\n *\n * KEEP-ALIVE. A pane stays mounted from the moment its tab opens until the\n * tab closes — hidden, not unmounted, when another tab is on top — so a\n * terminal keeps its scrollback and a browser its page. Each pane is told\n * whether it is visible, so it can stop timers while hidden.\n *\n * State (open, tabs, split, sizes, placement, each chat's layout) lives in\n * dock-store.ts and persists with the shell's v3 blob.\n */\nimport {\n Component,\n Suspense,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ErrorInfo,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { ActionMenu, anchorBelow, type ActionMenuItem, type MenuAnchor } from '../chat/ActionMenu.js';\nimport { commandChord, formatChord } from '../shell/command-keys.js';\nimport { DOCK_LAYOUT, clampDockHeight, clampDockWidth, type DockPaneId, type DockPresentation } from '../shell/dock-catalog.js';\nimport { getPane, isPaneAvailable, paneChordLabel, panesFor, preloadPanes, usePanes, type PaneContext, type PaneProps, type RegisteredPane } from '../panes/index.js';\nimport {\n closeDock,\n closeDockTab,\n openDockPane,\n setDockHeight,\n setDockSplitRatio,\n setDockWidth,\n splitDock,\n toggleDockPlacement,\n useDock,\n} from './dock-store.js';\nimport { CloseGlyph, PanelBottomGlyph, PanelRightGlyph, SplitGlyph } from './dock-icons.js';\nimport styles from './Dock.module.css';\n\n/** What every pane gets besides its own id, visibility and presentation (PaneProps minus those). */\nexport type DockPaneContext = Omit<PaneProps, 'paneId' | 'visible' | 'presentation' | 'requests'>;\n\nexport interface DockProps {\n presentation: DockPresentation;\n /** Window width, for the 60% cap. */\n windowWidth: number;\n /** The width the column takes (after the transcript's floor); column presentation only. */\n columnWidth: number;\n /** The widest the column may be dragged before the transcript drops under its floor. */\n columnMax?: number;\n /** The chat column's height, for the bottom panel's caps; bottom presentation only. */\n columnHeight?: number;\n /** The open chat and the host actions, handed to every pane. */\n pane: DockPaneContext;\n}\n\n/** A catalog command's chord as this platform prints it (\"⌘N\" / \"Ctrl+N\"), or null when it has none. */\nfunction chordOf(id: string): string | null {\n const chord = commandChord(id);\n return chord ? formatChord(chord) : null;\n}\n\n/** The pane's title, or the id itself while its registration is not in (never a blank tab). */\nfunction titleOf(id: DockPaneId): string {\n return getPane(id)?.title ?? id;\n}\n\nconst KEY_STEP = 16;\nconst KEY_STEP_COARSE = 64;\nconst RATIO_STEP = 0.05;\n\n/**\n * One write per animation frame while a handle is dragged: pointermove fires\n * faster than the screen refreshes, and each write re-lays-out the chat.\n */\nfunction useFrameWriter(write: (value: number) => void): (value: number) => void {\n const pending = useRef<number | null>(null);\n const frame = useRef<number | null>(null);\n useEffect(() => () => { if (frame.current !== null) cancelAnimationFrame(frame.current); }, []);\n return useCallback((value: number) => {\n pending.current = value;\n if (frame.current !== null) return;\n frame.current = requestAnimationFrame(() => {\n frame.current = null;\n if (pending.current !== null) write(pending.current);\n pending.current = null;\n });\n }, [write]);\n}\n\nexport function Dock(props: DockProps) {\n const { presentation, windowWidth, columnWidth, columnMax = Number.POSITIVE_INFINITY, columnHeight = 0, pane: paneContext } = props;\n const { state, requests } = useDock();\n usePanes(); // re-render when a pane is registered, replaced or removed\n const panelRef = useRef<HTMLElement>(null);\n const tabRefs = useRef(new Map<DockPaneId, HTMLButtonElement>());\n const idBase = useId();\n const [menu, setMenu] = useState<{ kind: 'add' | 'split'; anchor: MenuAnchor; from: HTMLElement } | null>(null);\n // Panes mount on first show and stay mounted while their tab is open.\n const [mounted, setMounted] = useState<ReadonlySet<DockPaneId>>(() => new Set(state.open && state.active ? [state.active] : []));\n\n const context: PaneContext = { sessionId: paneContext.sessionId, session: paneContext.session, roots: paneContext.roots };\n const tabs = state.tabs.filter((id) => isPaneAvailable(id, context));\n const active = state.active !== null && tabs.includes(state.active) ? state.active : tabs[0] ?? null;\n const split = state.splitWith !== null && tabs.includes(state.splitWith) && state.splitWith !== active ? state.splitWith : null;\n const open = state.open && active !== null;\n const sheet = presentation === 'sheet' || presentation === 'bottom-sheet';\n const docked = !sheet;\n // Stacked panes only where there is height for two: not in a phone's sheet, not in the bottom row.\n const canSplit = presentation === 'column' || presentation === 'sheet';\n const showSplit = split !== null && canSplit;\n\n useEffect(() => {\n if (!open) return;\n setMounted((prev) => {\n const want = [active, split].filter((p): p is DockPaneId => p !== null);\n const next = new Set([...prev].filter((p) => tabs.includes(p)));\n for (const p of want) next.add(p);\n if (next.size === prev.size && [...next].every((p) => prev.has(p))) return prev;\n return next;\n });\n }, [open, active, split, tabs.join('|')]); // eslint-disable-line react-hooks/exhaustive-deps -- tabs is compared by content\n\n // The panel is open: fetch every pane's code now, so a tab's first click\n // renders in the same frame instead of flashing its skeleton.\n useEffect(() => {\n if (open) preloadPanes();\n }, [open]);\n\n // A sheet takes focus when it opens and gives it back when it closes; a\n // docked panel does not steal focus from the composer.\n useEffect(() => {\n if (!open || !sheet) return undefined;\n const before = document.activeElement as HTMLElement | null;\n panelRef.current?.focus({ preventScroll: true });\n return () => {\n if (before && document.contains(before)) before.focus({ preventScroll: true });\n };\n }, [open, sheet]);\n\n const onSheetKeyDown = useCallback((event: KeyboardEvent<HTMLElement>) => {\n if (!sheet) return;\n // Esc belongs to a terminal (vim, less, a REPL) when focus is in one.\n const inTerminal = event.target instanceof Element && event.target.closest('[data-dock-pane=\"terminal\"]') !== null;\n if (event.key === 'Escape' && !inTerminal && !event.defaultPrevented) {\n event.preventDefault();\n closeDock();\n return;\n }\n if (event.key !== 'Tab' || inTerminal) return;\n const node = panelRef.current;\n if (!node) return;\n const focusable = Array.from(node.querySelectorAll<HTMLElement>('button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex=\"-1\"])'))\n .filter((el) => !el.closest('[hidden]'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); }\n else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); }\n }, [sheet]);\n\n if (!open) return null;\n\n function onTabKeyDown(event: KeyboardEvent<HTMLButtonElement>, pane: DockPaneId) {\n const i = tabs.indexOf(pane);\n let next: DockPaneId | undefined;\n if (event.key === 'ArrowRight') next = tabs[(i + 1) % tabs.length];\n else if (event.key === 'ArrowLeft') next = tabs[(i - 1 + tabs.length) % tabs.length];\n else if (event.key === 'Home') next = tabs[0];\n else if (event.key === 'End') next = tabs[tabs.length - 1];\n else if ((event.key === 'Delete' || event.key === 'Backspace') && tabs.length > 0) {\n event.preventDefault();\n closeDockTab(pane);\n return;\n }\n if (!next) return;\n event.preventDefault();\n openDockPane(next);\n tabRefs.current.get(next)?.focus();\n }\n\n const available = panesFor(context);\n // One line per pane: the name is the item's whole accessible name. What a\n // pane is FOR is taught where it is needed — its empty state.\n const menuItem = (p: RegisteredPane, label: string, onSelect: () => void): ActionMenuItem => {\n const Icon = p.icon;\n return { id: p.id, label, icon: <Icon size={14} />, onSelect };\n };\n const closedPanes = available.filter((p) => !tabs.includes(p.id));\n const addItems: ActionMenuItem[] = closedPanes.map((p) => menuItem(p, p.title, () => openDockPane(p.id)));\n const splitItems: ActionMenuItem[] = [\n ...available.filter((p) => p.id !== active).map((p) => menuItem(p, `${p.title} below`, () => splitDock(p.id))),\n ...(split ? [{ id: 'unsplit', label: 'One pane', separated: true, onSelect: () => splitDock(null) }] : []),\n ];\n\n const toggleChord = chordOf('dock.toggle');\n const width = presentation === 'column' ? columnWidth : clampDockWidth(state.width, windowWidth);\n const height = clampDockHeight(state.height, columnHeight);\n const label = `Dock: ${titleOf(active!)}${showSplit ? ` over ${titleOf(split!)}` : ''}`;\n const style = presentation === 'bottom-sheet'\n ? { height: `${DOCK_LAYOUT.bottomSheetHeightVh}vh` }\n : presentation === 'bottom' ? { height } : { width };\n\n const panel = (\n <aside\n ref={panelRef}\n className={styles.dock}\n data-presentation={presentation}\n data-split={showSplit ? 'true' : undefined}\n aria-label={label}\n role={sheet ? 'dialog' : 'complementary'}\n aria-modal={sheet ? true : undefined}\n tabIndex={-1}\n style={style}\n onKeyDown={onSheetKeyDown}\n >\n {presentation === 'column' ? <WidthHandle width={width} windowWidth={windowWidth} columnMax={columnMax} /> : null}\n {presentation === 'bottom' ? <HeightHandle height={height} columnHeight={columnHeight} /> : null}\n {presentation === 'bottom-sheet' ? <span className={styles.grabber} aria-hidden=\"true\" /> : null}\n {/* Beside the chat, the head runs under the macOS title bar: it drags the window like the chat header does. */}\n <div className={styles.head} data-app-region={presentation === 'column' ? 'drag' : undefined}>\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Dock panes\">\n {tabs.map((id) => {\n const registered = getPane(id)!;\n const Icon = registered.icon;\n const title = registered.title;\n const selected = id === active;\n const below = id === split && showSplit;\n const key = paneChordLabel(registered);\n return (\n <div key={id} className={styles.tabWrap} data-selected={selected || undefined} data-below={below || undefined}>\n <button\n ref={(node) => { if (node) tabRefs.current.set(id, node); else tabRefs.current.delete(id); }}\n type=\"button\"\n role=\"tab\"\n id={`${idBase}-tab-${id}`}\n aria-selected={selected}\n aria-controls={`${idBase}-pane-${id}`}\n tabIndex={selected ? 0 : -1}\n className={styles.tab}\n onClick={() => openDockPane(id)}\n onKeyDown={(event) => onTabKeyDown(event, id)}\n title={below ? `${title} (lower pane)` : key ? `${title} (${key})` : undefined}\n >\n <Icon size={14} />\n <span className={styles.tabLabel}>{title}</span>\n </button>\n <button type=\"button\" className={styles.tabClose} aria-label={`Close ${title}`}\n title={`Close ${title}`} tabIndex={-1} onClick={() => closeDockTab(id)}>\n <CloseGlyph size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <div className={styles.headActions}>\n {/* Always drawn (disabled when every pane is open) so the actions\n never shift when the last closed pane is added back. */}\n <button type=\"button\" className={styles.iconButton} aria-label=\"Add a pane\"\n title={closedPanes.length > 0 ? 'Add a pane' : 'Every pane is already open'} aria-haspopup=\"menu\"\n aria-expanded={menu?.kind === 'add'} disabled={closedPanes.length === 0}\n onClick={(event) => setMenu({ kind: 'add', anchor: anchorBelow(event.currentTarget), from: event.currentTarget })}>\n <span className={styles.plus} aria-hidden=\"true\">+</span>\n </button>\n {canSplit && splitItems.length > 0 ? (\n <button type=\"button\" className={styles.iconButton} aria-label={showSplit ? 'Split: change or undo' : 'Split the dock'}\n title={showSplit ? 'Change the split' : 'Split: show a second pane below'} aria-haspopup=\"menu\" aria-expanded={menu?.kind === 'split'}\n aria-pressed={showSplit}\n onClick={(event) => setMenu({ kind: 'split', anchor: anchorBelow(event.currentTarget), from: event.currentTarget })}>\n <SplitGlyph size={14} />\n </button>\n ) : null}\n {docked ? (\n <button type=\"button\" className={styles.iconButton}\n aria-label={presentation === 'bottom' ? 'Move the dock beside the chat' : 'Move the dock below the chat'}\n title={presentation === 'bottom' ? 'Move beside the chat' : 'Move below the chat'} onClick={toggleDockPlacement}>\n {presentation === 'bottom' ? <PanelRightGlyph size={14} /> : <PanelBottomGlyph size={14} />}\n </button>\n ) : null}\n <button type=\"button\" className={styles.iconButton} aria-label=\"Close the dock\"\n title={`Close the dock${toggleChord ? ` (${toggleChord})` : ''}`} onClick={closeDock}>\n <CloseGlyph size={14} />\n </button>\n </div>\n </div>\n\n <div className={styles.body}>\n {tabs.filter((p) => mounted.has(p) || p === active || p === split).map((id) => {\n const shown = id === active || (id === split && showSplit);\n const position = id === active ? 'top' : id === split ? 'bottom' : 'hidden';\n return (\n <div\n key={id}\n id={`${idBase}-pane-${id}`}\n role=\"tabpanel\"\n aria-labelledby={`${idBase}-tab-${id}`}\n className={styles.pane}\n data-dock-pane={id}\n data-position={shown ? position : 'hidden'}\n hidden={!shown}\n inert={!shown}\n style={shown && showSplit\n ? { flexBasis: `${(position === 'top' ? state.splitRatio : 1 - state.splitRatio) * 100}%`, order: position === 'top' ? 0 : 2 }\n : undefined}\n >\n <PaneHost id={id} visible={shown} presentation={presentation} context={paneContext} requests={requests} />\n </div>\n );\n })}\n {showSplit ? <SplitHandle ratio={state.splitRatio} lower={titleOf(split!)} /> : null}\n </div>\n\n {menu ? (\n <ActionMenu\n label={menu.kind === 'add' ? 'Add a pane' : 'Split the dock'}\n items={menu.kind === 'add' ? addItems : splitItems}\n anchor={menu.anchor}\n returnFocus={menu.from}\n onClose={() => setMenu(null)}\n />\n ) : null}\n </aside>\n );\n\n if (!sheet) return panel;\n return (\n <div className={styles.sheetLayer} data-presentation={presentation} data-dock-layer>\n <button type=\"button\" className={styles.scrim} aria-label=\"Close the dock\" tabIndex={-1} onClick={closeDock} />\n {panel}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// One pane: its empty state, its boundary, its component\n// ---------------------------------------------------------------------------\n\nfunction PaneHost({ id, visible, presentation, context, requests }: {\n id: DockPaneId;\n visible: boolean;\n presentation: DockPresentation;\n context: DockPaneContext;\n requests: ReturnType<typeof useDock>['requests'];\n}) {\n const [attempt, setAttempt] = useState(0);\n const registered = getPane(id);\n if (!registered) return null;\n if (registered.needsSession && context.sessionId === null) {\n const newChat = chordOf('chat.new');\n return (\n <EmptyState compact title={`Open a chat to use ${registered.title}`}\n body={`Pick a chat in the sidebar${newChat ? ` or start one with ${newChat}` : ''}. ${registered.description ?? `${registered.title} works in that chat's folders.`}`} />\n );\n }\n const Body = registered.component;\n return (\n // A new key per attempt (and per replacement): a fresh boundary AND a fresh lazy component.\n <PaneBoundary key={`${attempt}`} title={registered.title} onRetry={() => setAttempt((n) => n + 1)}>\n <Suspense fallback={<PaneLoading title={registered.title} />}>\n <Body {...context} paneId={id} visible={visible} presentation={presentation} requests={requests} />\n </Suspense>\n </PaneBoundary>\n );\n}\n\n/** The pane's shape while its chunk loads — lines, not a spinner, so nothing jumps when it lands. */\nfunction PaneLoading({ title }: { title: string }) {\n return (\n <div className={styles.loading} role=\"status\" aria-label={`Loading ${title}`}>\n <SkeletonLine width=\"42%\" />\n <SkeletonLine width=\"78%\" />\n <SkeletonLine width=\"64%\" />\n </div>\n );\n}\n\nclass PaneBoundary extends Component<{ title: string; onRetry: () => void; children: ReactNode }, { failed: boolean }> {\n override state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n // The console, not the page: operator copy never carries a stack or a path.\n console.error(`[verse] ${this.props.title} pane failed`, error, info.componentStack);\n }\n\n override render(): ReactNode {\n if (!this.state.failed) return this.props.children;\n return (\n <EmptyState compact tone=\"error\" title={`${this.props.title} could not load`} body=\"The rest of the chat still works.\"\n action={<Button variant=\"subtle\" size=\"sm\" onClick={this.props.onRetry}>Try again</Button>} />\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Handles\n// ---------------------------------------------------------------------------\n\n/**\n * An edge drag that never re-renders React while it moves: each frame writes\n * the new size straight onto the panel (inline width / height), the chat\n * grid's CSS variable and the handle's aria-valuenow, and the store gets ONE\n * write on release. That is what keeps a resize at 60fps with a transcript,\n * a terminal and a browser all on screen.\n */\nfunction useEdgeDrag({ axis, size, min, max, cssVar, commit }: {\n axis: 'x' | 'y';\n size: number;\n min: number;\n max: number;\n /** The chat grid's variable for this size (ChatSection reads it for the track). */\n cssVar: '--verse-dock-width' | '--verse-dock-height';\n commit: (value: number) => void;\n}) {\n const drag = useRef<{ start: number; startSize: number; last: number | null; handle: HTMLElement; frame: number | null } | null>(null);\n const [dragging, setDragging] = useState(false);\n useEffect(() => () => {\n if (drag.current?.frame != null) cancelAnimationFrame(drag.current.frame);\n document.body.removeAttribute('data-verse-resizing');\n }, []);\n\n function paint(handle: HTMLElement, value: number) {\n const panel = handle.parentElement;\n const host = panel?.parentElement;\n if (panel) panel.style[axis === 'x' ? 'width' : 'height'] = `${value}px`;\n host?.style.setProperty(cssVar, `${value}px`);\n handle.setAttribute('aria-valuenow', String(value));\n }\n\n function onPointerDown(event: ReactPointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n drag.current = { start: axis === 'x' ? event.clientX : event.clientY, startSize: size, last: null, handle: event.currentTarget, frame: null };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n setDragging(true);\n document.body.setAttribute('data-verse-resizing', axis === 'x' ? 'true' : 'row');\n }\n function onPointerMove(event: ReactPointerEvent<HTMLDivElement>) {\n const d = drag.current;\n if (!d) return;\n // Both panels grow AWAY from the chat: dragging the edge left (or up) by N adds N.\n const delta = d.start - (axis === 'x' ? event.clientX : event.clientY);\n d.last = Math.min(max, Math.max(min, Math.round(d.startSize + delta)));\n if (d.frame !== null) return;\n d.frame = requestAnimationFrame(() => {\n d.frame = null;\n if (d.last !== null) paint(d.handle, d.last);\n });\n }\n function end() {\n const d = drag.current;\n drag.current = null;\n setDragging(false);\n document.body.removeAttribute('data-verse-resizing');\n if (!d) return;\n if (d.frame !== null) cancelAnimationFrame(d.frame);\n if (d.last !== null) commit(d.last);\n }\n return {\n dragging,\n handlers: { onPointerDown, onPointerMove, onPointerUp: end, onPointerCancel: end, onLostPointerCapture: end },\n };\n}\n\n/** The column's left edge: drag, or ←/→ (⇧ for coarse), double-click for the default. */\nfunction WidthHandle({ width, windowWidth, columnMax }: { width: number; windowWidth: number; columnMax: number }) {\n const max = Math.max(DOCK_LAYOUT.minWidth, Math.min(Math.floor(windowWidth * DOCK_LAYOUT.maxWidthFraction), columnMax));\n const { dragging, handlers } = useEdgeDrag({ axis: 'x', size: width, min: DOCK_LAYOUT.minWidth, max, cssVar: '--verse-dock-width', commit: setDockWidth });\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const step = event.shiftKey ? KEY_STEP_COARSE : KEY_STEP;\n let next: number | null = null;\n if (event.key === 'ArrowLeft') next = width + step;\n else if (event.key === 'ArrowRight') next = width - step;\n else if (event.key === 'Home') next = DOCK_LAYOUT.minWidth;\n else if (event.key === 'End') next = max;\n if (next === null) return;\n event.preventDefault();\n setDockWidth(Math.min(max, clampDockWidth(next, windowWidth)));\n }\n\n return (\n <div className={styles.widthHandle} role=\"separator\" aria-orientation=\"vertical\" aria-label=\"Resize the dock\"\n aria-valuemin={DOCK_LAYOUT.minWidth} aria-valuemax={max} aria-valuenow={Math.round(width)} tabIndex={0}\n data-dragging={dragging || undefined} {...handlers}\n onDoubleClick={() => setDockWidth(DOCK_LAYOUT.defaultWidth)} onKeyDown={onKeyDown} />\n );\n}\n\n/** The bottom panel's top edge: drag, or ↑/↓ (⇧ for coarse), double-click for the default. */\nfunction HeightHandle({ height, columnHeight }: { height: number; columnHeight: number }) {\n const max = clampDockHeight(Number.MAX_SAFE_INTEGER, columnHeight);\n const { dragging, handlers } = useEdgeDrag({ axis: 'y', size: height, min: DOCK_LAYOUT.minHeight, max, cssVar: '--verse-dock-height', commit: setDockHeight });\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const step = event.shiftKey ? KEY_STEP_COARSE : KEY_STEP;\n let next: number | null = null;\n if (event.key === 'ArrowUp') next = height + step;\n else if (event.key === 'ArrowDown') next = height - step;\n else if (event.key === 'Home') next = DOCK_LAYOUT.minHeight;\n else if (event.key === 'End') next = max;\n if (next === null) return;\n event.preventDefault();\n setDockHeight(clampDockHeight(next, columnHeight));\n }\n\n return (\n <div className={styles.heightHandle} role=\"separator\" aria-orientation=\"horizontal\" aria-label=\"Resize the dock\"\n aria-valuemin={DOCK_LAYOUT.minHeight} aria-valuemax={max} aria-valuenow={Math.round(height)} tabIndex={0}\n data-dragging={dragging || undefined} {...handlers}\n onDoubleClick={() => setDockHeight(DOCK_LAYOUT.defaultHeight)} onKeyDown={onKeyDown} />\n );\n}\n\n/** The boundary between the two stacked panes: drag, or ↑/↓. */\nfunction SplitHandle({ ratio, lower }: { ratio: number; lower: string }) {\n const ref = useRef<HTMLDivElement>(null);\n const drag = useRef<{ top: number; height: number } | null>(null);\n const write = useFrameWriter(setDockSplitRatio);\n\n function onPointerDown(event: ReactPointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n const body = ref.current?.parentElement;\n if (!body) return;\n event.preventDefault();\n const rect = body.getBoundingClientRect();\n drag.current = { top: rect.top, height: rect.height };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n }\n function onPointerMove(event: ReactPointerEvent<HTMLDivElement>) {\n const d = drag.current;\n if (!d || d.height <= 0) return;\n write((event.clientY - d.top) / d.height);\n }\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.key === 'ArrowUp') { event.preventDefault(); setDockSplitRatio(ratio - RATIO_STEP); }\n else if (event.key === 'ArrowDown') { event.preventDefault(); setDockSplitRatio(ratio + RATIO_STEP); }\n }\n return (\n <div ref={ref} className={styles.splitHandle} role=\"separator\" aria-orientation=\"horizontal\"\n aria-label={`Resize: ${lower} below`} aria-valuemin={Math.round(DOCK_LAYOUT.splitRatio.min * 100)}\n aria-valuemax={Math.round(DOCK_LAYOUT.splitRatio.max * 100)} aria-valuenow={Math.round(ratio * 100)} tabIndex={0}\n style={{ order: 1 }}\n onPointerDown={onPointerDown} onPointerMove={onPointerMove}\n onPointerUp={() => { drag.current = null; }} onPointerCancel={() => { drag.current = null; }}\n onDoubleClick={() => setDockSplitRatio(DOCK_LAYOUT.splitRatio.default)} onKeyDown={onKeyDown} />\n );\n}\n","/**\n * routes/verse/dock/DockHost.tsx — the dock with the open chat wired in\n * (unit C2; 3.16 workbench). The Chat section loads THIS lazily the first\n * time the dock opens: the dock starts closed, so none of it — the\n * container, the pane registry and every pane — belongs on the chat's\n * first-paint path (SPEC-310C budget: chat critical JS ≤ 350 KB).\n *\n * It turns the chat's data and actions into what every registered pane\n * receives (PaneProps: the chat, its folders and events, the host actions),\n * and provides the extra data the first-party Tasks and Context panes read.\n */\nimport { useMemo } from 'react';\nimport type { VerseEvent, VerseSeat, VerseSession, VerseSessionRootsResponse } from '../../../data/api-types.js';\nimport type { DockPresentation } from '../shell/dock-catalog.js';\nimport type { TurnFileChange } from '../shell/slots.js';\nimport type { ChatTask } from '../chat/tasks-model.js';\nimport { ChatPaneDataContext, type ChatPaneData } from '../panes/chat-pane-data.js';\nimport type { PaneHost } from '../panes/index.js';\nimport { Dock, type DockPaneContext } from './Dock.js';\nimport { closeDockTab, openDockPane, requestDiff, requestTerminal, requestTerminalBelow } from './dock-store.js';\n\nexport interface DockHostProps {\n presentation: DockPresentation;\n windowWidth: number;\n columnWidth: number;\n /** The widest the column may be dragged (the transcript keeps its floor). */\n columnMax?: number;\n /** The chat column's height (the bottom panel's caps). */\n columnHeight?: number;\n session: VerseSession | null;\n seats: readonly VerseSeat[];\n events: readonly VerseEvent[];\n roots: readonly string[];\n rootsData: VerseSessionRootsResponse | null;\n rootsError: string | null;\n turnFiles: readonly TurnFileChange[];\n otherRunning: readonly ChatTask[];\n dispatchEnabled: boolean;\n onOpenSession: (sessionId: string) => void;\n onHandoff: (sessionId: string) => void;\n onOpenAccounts: () => void;\n onSendToChat: (text: string) => void;\n onAddToMessage: (text: string) => void;\n}\n\nexport function DockHost(props: DockHostProps) {\n const { session, seats, events, roots, rootsData, rootsError, turnFiles, otherRunning, dispatchEnabled,\n onOpenSession, onHandoff, onOpenAccounts, onSendToChat, onAddToMessage } = props;\n\n const host = useMemo<PaneHost>(() => ({\n sendToChat: onSendToChat,\n addToMessage: onAddToMessage,\n openPane: openDockPane,\n closePane: closeDockTab,\n openTerminal: requestTerminal,\n openTerminalBelow: requestTerminalBelow,\n openDiff: requestDiff,\n openSession: onOpenSession,\n }), [onSendToChat, onAddToMessage, onOpenSession]);\n\n const pane = useMemo<DockPaneContext>(() => ({\n sessionId: session?.id ?? null,\n session,\n roots,\n events,\n turnFiles,\n host,\n }), [session, roots, events, turnFiles, host]);\n\n const data = useMemo<ChatPaneData>(() => ({\n seats, rootsData, rootsError, otherRunning, dispatchEnabled, onHandoff, onOpenAccounts,\n }), [seats, rootsData, rootsError, otherRunning, dispatchEnabled, onHandoff, onOpenAccounts]);\n\n return (\n <ChatPaneDataContext.Provider value={data}>\n <Dock presentation={props.presentation} windowWidth={props.windowWidth} columnWidth={props.columnWidth}\n columnMax={props.columnMax} columnHeight={props.columnHeight} pane={pane} />\n </ChatPaneDataContext.Provider>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./index-BbDqdepe.js";var t={empty:`_empty_yz3jf_13`,compact:`_compact_yz3jf_23`,icon:`_icon_yz3jf_28`,title:`_title_yz3jf_33`,body:`_body_yz3jf_42`,action:`_action_yz3jf_49`,error:`_error_yz3jf_56`,unauthorized:`_unauthorized_yz3jf_63`},n=e();function r({title:e,body:r,icon:i,action:a,tone:o=`neutral`,compact:s=!1,className:c}){return(0,n.jsxs)(`div`,{className:`${t.empty} ${t[o]} ${s?t.compact:``} ${c??``}`,role:o===`error`?`alert`:void 0,children:[i?(0,n.jsx)(`span`,{className:t.icon,children:i}):null,(0,n.jsx)(`p`,{className:t.title,children:e}),r?(0,n.jsx)(`p`,{className:t.body,children:r}):null,a?(0,n.jsx)(`div`,{className:t.action,children:a}):null]})}export{r as t};
|
|
2
|
-
//# sourceMappingURL=EmptyState-BEXDoNZd.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState-BEXDoNZd.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/EmptyState.module.css","../../../../../../src/web-ui/components/primitives/EmptyState.tsx"],"sourcesContent":["/**\n * The designed dead-end. DESIGN-V2 §1.2 allows no cards and no nested boxes,\n * and §5 asks an empty state to read as \"a single quiet line, one action\" —\n * so this is NOT a dashed box on a filled ground. It was one, which meant\n * every empty panel grew a second border inside the panel's own hairline and\n * announced the absence of data louder than the data would have been.\n *\n * What carries it instead: a 2px left rule (the same device the transcript\n * uses for a user turn, a blockquote and a failed tool call), left-aligned\n * text on the surface it already sits on, and one action. Tone moves the rule\n * and the glyph only — never a fill, never a border box.\n */\n.empty {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-6) 0 var(--space-6) var(--space-4);\n border-left: 2px solid var(--border-strong);\n text-align: left;\n}\n\n.compact {\n padding: var(--space-4) 0 var(--space-4) var(--space-3);\n gap: var(--space-1);\n}\n\n.icon {\n display: inline-flex;\n color: var(--text-tertiary);\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-medium);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.body {\n max-width: 52ch;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n.action {\n margin-top: var(--space-1);\n}\n\n/* Tone is carried by the rule and the glyph. The text stays neutral so the\n state never reads as a filled alert banner (§1.1: one accent per screen,\n colour only where it carries meaning). */\n.error {\n border-left-color: var(--status-danger-solid);\n}\n.error .icon {\n color: var(--status-danger-fg);\n}\n\n.unauthorized {\n border-left-color: var(--status-warning-solid);\n}\n.unauthorized .icon {\n color: var(--status-warning-fg);\n}\n","/**\n * components/primitives/EmptyState.tsx — the designed state for \"there is\n * genuinely nothing here\" (design doc §1.6: honest states).\n *\n * It takes a TITLE and a BODY because an empty surface has to say what it\n * means — \"No enrolled repositories\" is a fact, \"the daemon will do nothing\n * until you enroll one\" is the consequence the operator needs. `tone=\"error\"`\n * and `tone=\"unauthorized\"` cover the other two dead ends so no view has to\n * invent its own.\n */\nimport type { ReactNode } from 'react';\nimport styles from './EmptyState.module.css';\n\nexport interface EmptyStateProps {\n title: ReactNode;\n /** What it means / what to do about it. */\n body?: ReactNode;\n /** 16px glyph from ./icons.tsx. */\n icon?: ReactNode;\n /** A single action — usually the thing that resolves the emptiness. */\n action?: ReactNode;\n tone?: 'neutral' | 'error' | 'unauthorized';\n /** Tighter padding for a panel rather than a whole view. */\n compact?: boolean;\n className?: string;\n}\n\nexport function EmptyState({\n title,\n body,\n icon,\n action,\n tone = 'neutral',\n compact = false,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={`${styles.empty} ${styles[tone]} ${compact ? styles.compact : ''} ${className ?? ''}`}\n role={tone === 'error' ? 'alert' : undefined}\n >\n {icon ? <span className={styles.icon}>{icon}</span> : null}\n <p className={styles.title}>{title}</p>\n {body ? <p className={styles.body}>{body}</p> : null}\n {action ? <div className={styles.action}>{action}</div> : null}\n </div>\n );\n}\n"],"mappings":"sQC2BA,SAAgB,EAAW,CACzB,QACA,OACA,OACA,SACA,OAAO,UACP,UAAU,GACV,aACkB,CAClB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,GAAM,GAAG,EAAU,EAAO,QAAU,GAAG,GAAG,GAAa,KAC5F,KAAM,IAAS,QAAU,QAAU,IAAA,GAFrC,SAAA,CAIG,GAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAO,SAAA,CAAW,CAAA,EAAI,MACtD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAQ,SAAA,CAAS,CAAA,EACrC,GAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAO,SAAA,CAAQ,CAAA,EAAI,KAC/C,GAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAS,SAAA,CAAY,CAAA,EAAI,IACvD,GAET"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./index-BbDqdepe.js";var t={unknown:`_unknown_4gf0c_1`,dot:`_dot_4gf0c_11`,badge:`_badge_4gf0c_19`},n=e();function r(e){return!e||e.sourceState===`healthy`&&e.complete!==!1}function i({quality:e,children:i,renderControl:a,label:o}){if(r(e))return(0,n.jsxs)(n.Fragment,{children:[i,a?.()]});let s=e?.reason;return(0,n.jsxs)(`span`,{className:t.unknown,title:s?`Unavailable: ${s}`:`Source data unavailable`,children:[(0,n.jsx)(`span`,{className:t.dot,"aria-hidden":`true`}),`unknown`,o?(0,n.jsxs)(`span`,{className:`visually-hidden`,children:[` (`,o,`)`]}):null]})}function a({quality:e,label:i}){return r(e)?null:(0,n.jsxs)(`span`,{className:t.badge,title:e?.reason??`Source data unavailable`,children:[i?`${i}: `:``,`unknown`]})}export{a as n,r,i as t};
|
|
2
|
-
//# sourceMappingURL=Epistemic-BPBAmLNh.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Epistemic-BPBAmLNh.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Epistemic.module.css","../../../../../../src/web-ui/components/primitives/Epistemic.tsx"],"sourcesContent":[".unknown {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n color: var(--status-unknown-fg);\n font-size: var(--text-sm-size);\n font-style: italic;\n cursor: help;\n}\n\n.dot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-unknown-solid);\n flex-shrink: 0;\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n padding: 1px var(--space-2);\n border-radius: var(--radius-xs);\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-size: var(--text-xs-size);\n font-style: italic;\n cursor: help;\n}\n","/**\n * components/primitives/Epistemic.tsx — the one thing the old UI got right,\n * promoted to a first-class primitive (foundation brief, item 7).\n *\n * When a piece of data's `sourceQuality.sourceState` is 'degraded' or\n * 'unknown'/'missing', this component displays \"unknown\" (never a stale or\n * guessed value dressed up as current) AND withholds any control built on\n * top of it (`renderControl` simply never runs). Every future view should\n * wrap sourceQuality-bearing fields in this rather than reinventing the\n * check — that is the whole point of making it a primitive instead of a\n * convention someone has to remember.\n *\n * Reference (old, correct behavior this replaces): app.js:311-314, :336-347.\n */\nimport type { ReactNode } from 'react';\nimport type { SourceQuality } from '../../data/api-types.js';\nimport styles from './Epistemic.module.css';\n\nexport function isKnown(quality: SourceQuality | undefined): boolean {\n if (!quality) return true; // absent quality metadata => field predates the pattern; trust it.\n return quality.sourceState === 'healthy' && quality.complete !== false;\n}\n\nexport interface EpistemicProps {\n quality: SourceQuality | undefined;\n /** Rendered when the value is known-good. */\n children: ReactNode;\n /**\n * A control (button, toggle, link) whose action depends on this data\n * being trustworthy — e.g. \"restart daemon\" next to daemon.running.\n * Omitted entirely (not disabled — omitted) when the source is degraded,\n * so an operator never sees an actionable-looking control wired to a\n * guess.\n */\n renderControl?: () => ReactNode;\n /** Optional label used in the \"unknown\" state, e.g. \"daemon status\". */\n label?: string;\n}\n\nexport function Epistemic({ quality, children, renderControl, label }: EpistemicProps): ReactNode {\n if (isKnown(quality)) {\n return (\n <>\n {children}\n {renderControl?.()}\n </>\n );\n }\n\n const reason = quality?.reason;\n return (\n <span className={styles.unknown} title={reason ? `Unavailable: ${reason}` : 'Source data unavailable'}>\n <span className={styles.dot} aria-hidden=\"true\" />\n unknown\n {label ? <span className=\"visually-hidden\"> ({label})</span> : null}\n </span>\n );\n}\n\n/** Small inline badge form, for table cells / dense rows. */\nexport function EpistemicBadge({ quality, label }: { quality: SourceQuality | undefined; label?: string }): ReactNode {\n if (isKnown(quality)) return null;\n return (\n <span className={styles.badge} title={quality?.reason ?? 'Source data unavailable'}>\n {label ? `${label}: ` : ''}unknown\n </span>\n );\n}\n"],"mappings":"6HCkBA,SAAgB,EAAQ,EAA6C,CAEnE,MADA,CAAK,GACE,EAAQ,cAAgB,WAAa,EAAQ,WAAa,EACnE,CAkBA,SAAgB,EAAU,CAAE,UAAS,WAAU,gBAAe,SAAoC,CAChG,GAAI,EAAQ,CAAO,EACjB,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,EACA,IAAgB,CACjB,CAAA,CAAA,EAIN,IAAM,EAAS,GAAS,OACxB,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,MAAO,EAAS,gBAAgB,IAAW,0BAA5E,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,cAAY,MAAQ,CAAA,EAAC,UAEjD,GAAQ,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,kBAAhB,SAAA,CAAkC,KAAG,EAAM,GAAO,CAAI,CAAA,EAAA,IAC3D,GAEV,CAGA,SAAgB,EAAe,CAAE,UAAS,SAA4E,CAEpH,OADI,EAAQ,CAAO,EAAU,MAE3B,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,MAAO,GAAS,QAAU,0BAAzD,SAAA,CACG,EAAQ,GAAG,EAAM,IAAM,GAAG,SACvB,GAEV"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e,s as t,u as n}from"./index-BbDqdepe.js";import{i as r,l as i,t as a,u as o}from"./global-BWc2NPzv.js";import{n as s}from"./StatusBadge-CJbb9DhR.js";import{v as c}from"./context-model-DU3OPiBC.js";import{n as l}from"./Button-DP2ImS5n.js";import{l as u,y as d}from"./icons-U34oiN9M.js";import{t as f}from"./Sheet-D72WH4mP.js";import{r as p}from"./types-IYKrYLku.js";import{n as m}from"./types-BGCo0sbt.js";import{T as h,_ as g}from"./cloud-model-DuboHWPT.js";var _=n(t(),1);function v(e){return`/api/verse/cloud/tasks/${encodeURIComponent(e)}/timeline`}function y(e){return`/api/verse/devin/tasks/${encodeURIComponent(e)}/timeline`}function b(e){return p.test(e)?v(e):m.test(e)?y(e):null}var x=[`objective`,`launch`,`worker`,`report`,`pr`,`diff`,`checks`,`gates`,`merge`,`release`,`health`,`cost`],S={verified:`Verified`,claim:`Claim`,estimate:`Estimate`,unknown:`Unknown`},C={verified:`Read from a record Verse or GitHub wrote, not from the session.`,claim:`The cloud session’s own say-so. Nothing checked it.`,estimate:`An estimate, not a bill; the real usage is on the provider’s own page (this step links it).`,unknown:`Nothing was recorded, or the record could not be read.`},w={objective:`Objective`,launch:`Session`,worker:`Worker`,report:`Report`,pr:`Pull request`,diff:`Diff`,checks:`Checks`,gates:`Merge gates`,merge:`Merge`,release:`Release`,health:`Health`,cost:`Cost`};function T(e){return e.verified===!0?`verified`:e.verified===!1?e.kind===`cost`?`estimate`:`claim`:`unknown`}var E=[!0,!1,`unknown`];function D(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function O(e){return m.test(e)?[`github.com`,`app.devin.ai`]:[`github.com`,`claude.ai`]}function k(e,t){if(!D(e))return null;let n=e.kind;if(typeof n!=`string`||!x.includes(n)||!E.includes(e.verified)||typeof e.title!=`string`||typeof e.detail!=`string`||typeof e.source!=`string`||e.at!==null&&typeof e.at!=`string`)return null;let r={kind:n,at:e.at,title:e.title,detail:e.detail,source:e.source,verified:e.verified,reached:e.reached!==!1},i=e.link;if(D(i)&&typeof i.href==`string`&&typeof i.label==`string`){let e=null;for(let n of t)e??=g(i.href,n);e&&(r.link={href:e,label:i.label})}return r}function A(e){if(!D(e)||e.v!==1||typeof e.taskId!=`string`||!Array.isArray(e.steps))return null;let t=O(e.taskId),n=e.steps.map(e=>k(e,t)).filter(e=>e!==null);return{v:1,generatedAt:typeof e.generatedAt==`string`?e.generatedAt:``,taskId:e.taskId,repo:typeof e.repo==`string`?e.repo:``,title:typeof e.title==`string`?e.title:``,state:typeof e.state==`string`?e.state:``,steps:n}}function j(e,t=Date.now()){return c(e.at,t)}function M(e){return h(e)}function N(e){let t=0,n=0,r=0;for(let i of e){if(!i.reached)continue;let e=T(i);e===`verified`?t+=1:e===`unknown`?r+=1:n+=1}let i=[`${t} verified`];return n>0&&i.push(`${n} ${n===1?`claim or estimate`:`claims or estimates`}`),r>0&&i.push(`${r} unknown`),{verified:t,claims:n,unknown:r,text:i.join(` · `)}}var P={summaryRow:`_summaryRow_71hqu_11`,summary:`_summary_71hqu_11`,muted:`_muted_71hqu_20`,notice:`_notice_71hqu_27`,steps:`_steps_71hqu_38`,step:`_step_71hqu_38`,rail:`_rail_71hqu_52`,node:`_node_71hqu_59`,line:`_line_71hqu_82`,content:`_content_71hqu_90`,head:`_head_71hqu_98`,label:`_label_71hqu_105`,badge:`_badge_71hqu_112`,title:`_title_71hqu_117`,detail:`_detail_71hqu_131`,meta:`_meta_71hqu_139`,link:`_link_71hqu_155`},F=e(),I={verified:`success`,claim:`warning`,estimate:`neutral`,unknown:`unknown`};function L(e){return e instanceof a?e.status===404?`Verse has no evidence for this task — it is not in the task store, or this build has no timeline yet.`:e.status===503?`The timeline failed to load on the server.`:`The timeline answered HTTP ${e.status}.`:`The timeline could not be reached.`}function R(e){return{key:`verse-cloud-timeline-${e}`,fetch:async t=>{let n=b(e);if(!n)return{timeline:null,reason:`That task id is not one Verse issued.`};try{let e=A(await r(n,t));return e?{timeline:e,reason:null}:{timeline:null,reason:`Unrecognized response — update Ashlr.`}}catch(e){if(e instanceof a&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{timeline:null,reason:L(e)}}}}}function z({step:e,now:t,last:n}){let r=T(e),i=j(e,t),a=M(e.detail);return(0,F.jsxs)(`li`,{className:P.step,"data-badge":r,"data-reached":e.reached?`true`:`false`,"data-kind":e.kind,children:[(0,F.jsxs)(`span`,{className:P.rail,"aria-hidden":`true`,children:[(0,F.jsx)(`span`,{className:P.node}),n?null:(0,F.jsx)(`span`,{className:P.line})]}),(0,F.jsxs)(`div`,{className:P.content,children:[(0,F.jsxs)(`div`,{className:P.head,children:[(0,F.jsx)(`span`,{className:P.label,children:w[e.kind]}),(0,F.jsx)(`span`,{className:P.badge,title:C[r],children:(0,F.jsx)(s,{status:r,tone:I[r],children:r===`verified`?`✓ ${S[r]}`:S[r]})})]}),(0,F.jsx)(`p`,{className:P.title,children:M(e.title)}),a?(0,F.jsx)(`p`,{className:P.detail,children:a}):null,(0,F.jsxs)(`p`,{className:P.meta,children:[(0,F.jsx)(`span`,{children:e.source}),i?(0,F.jsx)(`span`,{children:i}):null,e.link?(0,F.jsxs)(`a`,{className:P.link,href:e.link.href,target:`_blank`,rel:`noreferrer noopener`,children:[e.link.label,` `,(0,F.jsx)(u,{width:11,height:11,"aria-hidden":`true`})]}):null]})]})]})}function B({taskId:e,now:t}){let n=(0,_.useMemo)(()=>R(e),[e]),r=i(n,{freshMs:15e3}),a=o(n),s=r.data?.timeline??null,c=s?N(s.steps):null;return!r.data&&!r.error?(0,F.jsx)(`p`,{className:P.muted,"aria-busy":`true`,children:`Reading the evidence…`}):s?(0,F.jsxs)(F.Fragment,{children:[(0,F.jsxs)(`div`,{className:P.summaryRow,children:[(0,F.jsx)(`p`,{className:P.summary,children:c?.text}),(0,F.jsx)(l,{size:`sm`,variant:`ghost`,icon:(0,F.jsx)(d,{width:14,height:14}),"aria-label":`Re-read the evidence`,onClick:a})]}),(0,F.jsx)(`ol`,{className:P.steps,"aria-label":`Evidence, from objective to cost`,children:s.steps.map((e,n)=>(0,F.jsx)(z,{step:e,now:t,last:n===s.steps.length-1},e.kind))})]}):(0,F.jsx)(`p`,{className:P.notice,role:`note`,children:r.data?.reason??r.error?.message??`The timeline did not answer.`})}function V({taskId:e,title:t,open:n,onClose:r,now:i=Date.now()}){let a=(0,_.useId)();return(0,F.jsx)(f,{open:n,onClose:r,titleId:a,width:520,title:`Evidence`,description:t,children:n?(0,F.jsx)(B,{taskId:e,now:i}):null})}export{V as EvidenceTimeline,V as default,R as cloudTimelineQuery};
|
|
2
|
-
//# sourceMappingURL=EvidenceTimeline-D2nuo6Oo.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EvidenceTimeline-D2nuo6Oo.js","names":[],"sources":["../../../../../../src/core/cloud/timeline-types.ts","../../../../../../src/web-ui/routes/verse/cloud/timeline-model.ts","../../../../../../src/web-ui/routes/verse/cloud/evidence-timeline.module.css","../../../../../../src/web-ui/routes/verse/cloud/EvidenceTimeline.tsx"],"sourcesContent":["/**\n * Cloud task evidence timeline — the HTTP contract (3.13).\n *\n * GET /api/verse/cloud/tasks/<id>/timeline → CloudTimelineResponse\n * GET /api/verse/devin/tasks/<id>/timeline → CloudTimelineResponse (3.15, a Devin task)\n *\n * One ordered chain per cloud task, from the objective to what it cost:\n *\n * objective → launch → worker (model / account) → report (a CLAIM) → PR\n * → diff → checks → merge gates → merge → release → health → cost\n *\n * Every step says where it came from (`source`) and how much it can be\n * trusted (`verified`):\n * true a record Verse (or GitHub, through the tracker) wrote itself —\n * the task store, the fleet merge record, the hash-chained\n * authority ledger, the post-merge watch, local git.\n * false someone's say-so. The session's own report is ALWAYS this,\n * and so is the cost, which is an estimate fixed at launch.\n * 'unknown' nothing was recorded, or the record could not be read.\n *\n * Steps are always present and always in this order, so the chain reads the\n * same for every task; a stage the task has not reached says so\n * (`reached: false`) instead of disappearing.\n *\n * NODE-FREE on purpose: the web UI imports these types and the path helper.\n */\nimport { CLOUD_TASK_ID_PATTERN } from './types.js';\nimport { DEVIN_TASK_ID_PATTERN } from '../devin/types.js';\n\nexport const CLOUD_TIMELINE_SCHEMA_VERSION = 1 as const;\n\n/** `/api/verse/cloud/tasks/<id>/timeline` — the id is checked against CLOUD_TASK_ID_PATTERN by the route. */\nexport const CLOUD_TIMELINE_PATH_RE = /^\\/api\\/verse\\/cloud\\/tasks\\/([^/]+)\\/timeline$/;\n\nexport function cloudTimelinePath(taskId: string): string {\n return `/api/verse/cloud/tasks/${encodeURIComponent(taskId)}/timeline`;\n}\n\n/**\n * 3.15: `/api/verse/devin/tasks/<id>/timeline` — checked against\n * DEVIN_TASK_ID_PATTERN by the route. Served by the same 'cloud-timeline'\n * module (timeline-api.ts), which is mounted before 'devin'.\n */\nexport const DEVIN_TIMELINE_PATH_RE = /^\\/api\\/verse\\/devin\\/tasks\\/([^/]+)\\/timeline$/;\n\nexport function devinTimelinePath(taskId: string): string {\n return `/api/verse/devin/tasks/${encodeURIComponent(taskId)}/timeline`;\n}\n\n/**\n * The evidence path for a task id Verse issued — cloud (`ct_…`) or Devin\n * (`dv_…`) — or null for anything else, so a caller can never splice an id\n * Verse did not issue into a request path.\n */\nexport function evidenceTimelinePath(taskId: string): string | null {\n if (CLOUD_TASK_ID_PATTERN.test(taskId)) return cloudTimelinePath(taskId);\n if (DEVIN_TASK_ID_PATTERN.test(taskId)) return devinTimelinePath(taskId);\n return null;\n}\n\nexport type TimelineStepKind =\n | 'objective'\n | 'launch'\n | 'worker'\n | 'report'\n | 'pr'\n | 'diff'\n | 'checks'\n | 'gates'\n | 'merge'\n | 'release'\n | 'health'\n | 'cost';\n\n/** The fixed order every timeline uses. */\nexport const TIMELINE_STEP_ORDER: readonly TimelineStepKind[] = [\n 'objective', 'launch', 'worker', 'report', 'pr', 'diff', 'checks', 'gates', 'merge', 'release', 'health', 'cost',\n];\n\nexport type TimelineVerified = true | false | 'unknown';\n\nexport interface TimelineLink {\n /** https only: claude.ai, github.com, and app.devin.ai (a Devin session, 3.15). */\n href: string;\n label: string;\n}\n\nexport interface TimelineStep {\n kind: TimelineStepKind;\n /** ISO time the evidence was recorded; null when no time was recorded (never guessed). */\n at: string | null;\n /** One short line (\"PR #512 merged\"). */\n title: string;\n /** Plain sentences; scrubbed. May be empty. */\n detail: string;\n /** Where the evidence came from, in operator words (\"authority ledger\", \"session report\"). */\n source: string;\n verified: TimelineVerified;\n /** False while the task has not reached this stage (it may never). */\n reached: boolean;\n link?: TimelineLink;\n}\n\nexport interface CloudTimelineResponse {\n v: typeof CLOUD_TIMELINE_SCHEMA_VERSION;\n generatedAt: string;\n taskId: string;\n repo: string;\n title: string;\n state: string;\n steps: TimelineStep[];\n}\n","/**\n * routes/verse/cloud/timeline-model.ts — the evidence timeline's words and\n * decisions as pure functions (3.13; server: core/cloud/timeline.ts). No React.\n *\n * Copy rules, on top of the cloud lane's (cloud-model.ts):\n * - every step carries a WORD for how far it can be trusted — \"Verified\",\n * \"Claim\", \"Estimate\" or \"Unknown\" — never a colour or an icon alone;\n * - the session's report is a claim and the cost an estimate, whatever the\n * server sends: the badge is derived from `verified`, and `false` can only\n * ever read as Claim / Estimate;\n * - times are local and relative; a step with no recorded time shows none\n * (it is never back-filled from a neighbour);\n * - (3.15) a Devin task's timeline has the same shape; its links may point\n * at app.devin.ai (its session, its usage page) — and only a Devin\n * task's may: a cloud timeline keeps github.com and claude.ai.\n */\nimport { DEVIN_TASK_ID_PATTERN } from '../../../../core/devin/types.js';\nimport {\n TIMELINE_STEP_ORDER,\n type CloudTimelineResponse,\n type TimelineStep,\n type TimelineStepKind,\n type TimelineVerified,\n} from '../../../../core/cloud/timeline-types.js';\nimport { scrubSecrets } from '../../../../core/util/scrub.js';\nimport { relativePhrase } from '../context/context-model.js';\nimport { safeHref } from './cloud-model.js';\n\nexport type TimelineBadge = 'verified' | 'claim' | 'estimate' | 'unknown';\n\nexport const BADGE_WORD: Record<TimelineBadge, string> = {\n verified: 'Verified',\n claim: 'Claim',\n estimate: 'Estimate',\n unknown: 'Unknown',\n};\n\n/** Tooltip / screen-reader sentence for each badge. */\nexport const BADGE_MEANING: Record<TimelineBadge, string> = {\n verified: 'Read from a record Verse or GitHub wrote, not from the session.',\n claim: 'The cloud session’s own say-so. Nothing checked it.',\n estimate: 'An estimate, not a bill; the real usage is on the provider’s own page (this step links it).',\n unknown: 'Nothing was recorded, or the record could not be read.',\n};\n\nexport const STEP_LABEL: Record<TimelineStepKind, string> = {\n objective: 'Objective',\n launch: 'Session',\n worker: 'Worker',\n report: 'Report',\n pr: 'Pull request',\n diff: 'Diff',\n checks: 'Checks',\n gates: 'Merge gates',\n merge: 'Merge',\n release: 'Release',\n health: 'Health',\n cost: 'Cost',\n};\n\nexport function badgeFor(step: Pick<TimelineStep, 'kind' | 'verified'>): TimelineBadge {\n if (step.verified === true) return 'verified';\n if (step.verified === false) return step.kind === 'cost' ? 'estimate' : 'claim';\n return 'unknown';\n}\n\nconst VERIFIED_VALUES: readonly TimelineVerified[] = [true, false, 'unknown'];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\ntype LinkHost = 'github.com' | 'claude.ai' | 'app.devin.ai';\n\n/** Hosts a timeline's links may point at: its lane's own, and GitHub. */\nfunction linkHostsFor(taskId: string): readonly LinkHost[] {\n return DEVIN_TASK_ID_PATTERN.test(taskId) ? ['github.com', 'app.devin.ai'] : ['github.com', 'claude.ai'];\n}\n\nfunction narrowStep(raw: unknown, hosts: readonly LinkHost[]): TimelineStep | null {\n if (!isRecord(raw)) return null;\n const kind = raw['kind'];\n if (typeof kind !== 'string' || !(TIMELINE_STEP_ORDER as readonly string[]).includes(kind)) return null;\n if (!VERIFIED_VALUES.includes(raw['verified'] as TimelineVerified)) return null;\n if (typeof raw['title'] !== 'string' || typeof raw['detail'] !== 'string' || typeof raw['source'] !== 'string') return null;\n if (raw['at'] !== null && typeof raw['at'] !== 'string') return null;\n const step: TimelineStep = {\n kind: kind as TimelineStepKind,\n at: raw['at'] as string | null,\n title: raw['title'],\n detail: raw['detail'],\n source: raw['source'],\n verified: raw['verified'] as TimelineVerified,\n reached: raw['reached'] !== false,\n };\n const link = raw['link'];\n if (isRecord(link) && typeof link['href'] === 'string' && typeof link['label'] === 'string') {\n // Only these hosts ever become links, whatever the server sent.\n let href: string | null = null;\n for (const host of hosts) href = href ?? safeHref(link['href'], host);\n if (href) step.link = { href, label: link['label'] };\n }\n return step;\n}\n\n/**\n * Just enough structure that no render can crash; an unknown step kind or a\n * malformed step is dropped rather than guessed at. Null when the envelope\n * itself is unrecognisable.\n */\nexport function narrowTimeline(raw: unknown): CloudTimelineResponse | null {\n if (!isRecord(raw) || raw['v'] !== 1 || typeof raw['taskId'] !== 'string' || !Array.isArray(raw['steps'])) return null;\n const hosts = linkHostsFor(raw['taskId']);\n const steps = raw['steps'].map((s) => narrowStep(s, hosts)).filter((s): s is TimelineStep => s !== null);\n return {\n v: 1,\n generatedAt: typeof raw['generatedAt'] === 'string' ? raw['generatedAt'] : '',\n taskId: raw['taskId'],\n repo: typeof raw['repo'] === 'string' ? raw['repo'] : '',\n title: typeof raw['title'] === 'string' ? raw['title'] : '',\n state: typeof raw['state'] === 'string' ? raw['state'] : '',\n steps,\n };\n}\n\n/** \"5m ago\" / \"on Sep 24\", or null when the step recorded no time. */\nexport function stepWhen(step: Pick<TimelineStep, 'at'>, now: number = Date.now()): string | null {\n return relativePhrase(step.at, now);\n}\n\n/** Server prose is already scrubbed; scrub again so the panel is safe outside the HTTP sanitizer too. */\nexport function stepText(text: string): string {\n return scrubSecrets(text);\n}\n\nexport interface TimelineSummary {\n verified: number;\n claims: number;\n unknown: number;\n /** \"7 verified · 2 claims · 3 unknown\" */\n text: string;\n}\n\n/** Counts over the stages the task has REACHED — pending stages are not \"unknown evidence\". */\nexport function timelineSummary(steps: readonly TimelineStep[]): TimelineSummary {\n let verified = 0;\n let claims = 0;\n let unknown = 0;\n for (const step of steps) {\n if (!step.reached) continue;\n const badge = badgeFor(step);\n if (badge === 'verified') verified += 1;\n else if (badge === 'unknown') unknown += 1;\n else claims += 1;\n }\n const parts = [`${verified} verified`];\n if (claims > 0) parts.push(`${claims} ${claims === 1 ? 'claim or estimate' : 'claims or estimates'}`);\n if (unknown > 0) parts.push(`${unknown} unknown`);\n return { verified, claims, unknown, text: parts.join(' · ') };\n}\n","/*\n * routes/verse/cloud/evidence-timeline.module.css — a cloud task's evidence\n * chain (3.13). Tokens only (style-scan-310): no raw hex colour, no px font\n * size, every colour follows the theme. Long text wraps at word boundaries;\n * nothing is ellipsized — evidence is read, not skimmed.\n *\n * The rail: a filled node for a reached stage (its colour follows the trust\n * badge), a hollow one for a stage not reached, joined by a hairline.\n */\n\n.summaryRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n margin-bottom: var(--space-3);\n}\n\n.summary,\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.notice {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n overflow-wrap: break-word;\n}\n\n.steps {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.step {\n display: grid;\n grid-template-columns: var(--space-4) minmax(0, 1fr);\n gap: 0 var(--space-3);\n}\n\n.rail {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: var(--space-1);\n}\n\n.node {\n width: 9px;\n height: 9px;\n flex-shrink: 0;\n border: 1.5px solid var(--border-strong);\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n\n.step[data-badge='verified'] .node {\n border-color: var(--status-success-solid);\n background: var(--status-success-solid);\n}\n\n.step[data-badge='claim'] .node {\n border-color: var(--status-warning-solid);\n background: var(--status-warning-solid);\n}\n\n.step[data-reached='false'] .node {\n background: var(--bg-surface);\n}\n\n.line {\n flex: 1 1 auto;\n width: 1px;\n min-height: var(--space-3);\n margin-top: var(--space-1);\n background: var(--border-subtle);\n}\n\n.content {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n padding-bottom: var(--space-4);\n}\n\n.head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.label {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n line-height: var(--text-xs-line);\n}\n\n.badge {\n display: inline-flex;\n flex-shrink: 0;\n}\n\n.title {\n margin: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n line-height: var(--text-sm-line);\n overflow-wrap: break-word;\n}\n\n.step[data-reached='false'] .title {\n color: var(--text-secondary);\n font-weight: var(--font-weight-regular);\n}\n\n.detail {\n margin: 0;\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n overflow-wrap: break-word;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-1) var(--space-2);\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.meta > span + span::before {\n content: '·';\n margin-right: var(--space-2);\n}\n\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n color: var(--text-link);\n text-decoration: none;\n white-space: nowrap;\n}\n\n.link:hover {\n text-decoration: underline;\n}\n\n.link:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}\n","/**\n * routes/verse/cloud/EvidenceTimeline.tsx — one cloud task's evidence chain\n * (3.13), in a side sheet opened from its row on Command's cloud card. 3.15:\n * a Devin task's too (Needs-you, the Devin resource card), from its own\n * route — the same shape, its own session and cost steps.\n *\n * Evidence [↻] [×]\n * Fix the flaky tracker test · ashlrai/ashlr-hub\n * 7 verified · 2 claims or estimates · 1 unknown\n * ● Objective Fix the flaky tracker test Verified\n * │ From New cloud task, requested by mason…\n * │ cloud task record · 2h ago\n * ● Report Session reports “done” (unverified) Claim\n * ○ Release Release unknown Unknown\n * …\n *\n * Reads GET /api/verse/cloud/tasks/<id>/timeline or\n * GET /api/verse/devin/tasks/<id>/timeline (core/cloud/timeline-api.ts) only\n * while open, picked by the id's own format (evidenceTimelinePath). Every\n * step shows a trust WORD (timeline-model.ts): the session's report is\n * always a Claim and the cost an Estimate. Stages the task has not reached\n * are drawn hollow and quiet, never hidden, so the chain always reads end to\n * end.\n *\n * LAZY: CloudCard imports this with React.lazy, so none of it costs chat\n * first-paint bytes (cloud-queries.ts rule).\n */\nimport { useId, useMemo } from 'react';\nimport { evidenceTimelinePath, type CloudTimelineResponse, type TimelineStep } from '../../../../core/cloud/timeline-types.js';\nimport { IconButton } from '../../../components/primitives/Button.js';\nimport { IconExternalLink, IconRefresh } from '../../../components/primitives/icons.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport {\n BADGE_MEANING,\n BADGE_WORD,\n badgeFor,\n narrowTimeline,\n STEP_LABEL,\n stepText,\n stepWhen,\n timelineSummary,\n type TimelineBadge,\n} from './timeline-model.js';\nimport styles from './evidence-timeline.module.css';\n\nconst BADGE_TONE: Record<TimelineBadge, Tone> = {\n verified: 'success',\n claim: 'warning',\n estimate: 'neutral',\n unknown: 'unknown',\n};\n\nexport type TimelineRead = { timeline: CloudTimelineResponse; reason: null } | { timeline: null; reason: string };\n\n/** Operator words for a timeline read that did not answer — never a path, never a trace. */\nfunction absence(err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return 'Verse has no evidence for this task — it is not in the task store, or this build has no timeline yet.';\n if (err.status === 503) return 'The timeline failed to load on the server.';\n return `The timeline answered HTTP ${err.status}.`;\n }\n return 'The timeline could not be reached.';\n}\n\nexport function cloudTimelineQuery(taskId: string): QueryDef<TimelineRead> {\n return {\n key: `verse-cloud-timeline-${taskId}`,\n fetch: async (signal) => {\n // The id came from the server, but it is spliced into a request path:\n // only a cloud (`ct_…`) or Devin (`dv_…`) id Verse issues gets one.\n const path = evidenceTimelinePath(taskId);\n if (!path) return { timeline: null, reason: 'That task id is not one Verse issued.' };\n try {\n const timeline = narrowTimeline(await apiGet<unknown>(path, signal));\n return timeline ? { timeline, reason: null } : { timeline: null, reason: 'Unrecognized response — update Ashlr.' };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { timeline: null, reason: absence(err) };\n }\n },\n };\n}\n\nfunction StepRow({ step, now, last }: { step: TimelineStep; now: number; last: boolean }) {\n const badge = badgeFor(step);\n const when = stepWhen(step, now);\n const detail = stepText(step.detail);\n return (\n <li className={styles.step} data-badge={badge} data-reached={step.reached ? 'true' : 'false'} data-kind={step.kind}>\n <span className={styles.rail} aria-hidden=\"true\">\n <span className={styles.node} />\n {last ? null : <span className={styles.line} />}\n </span>\n <div className={styles.content}>\n <div className={styles.head}>\n <span className={styles.label}>{STEP_LABEL[step.kind]}</span>\n <span className={styles.badge} title={BADGE_MEANING[badge]}>\n <StatusBadge status={badge} tone={BADGE_TONE[badge]}>\n {badge === 'verified' ? `✓ ${BADGE_WORD[badge]}` : BADGE_WORD[badge]}\n </StatusBadge>\n </span>\n </div>\n <p className={styles.title}>{stepText(step.title)}</p>\n {detail ? <p className={styles.detail}>{detail}</p> : null}\n <p className={styles.meta}>\n <span>{step.source}</span>\n {when ? <span>{when}</span> : null}\n {step.link ? (\n <a className={styles.link} href={step.link.href} target=\"_blank\" rel=\"noreferrer noopener\">\n {step.link.label} <IconExternalLink width={11} height={11} aria-hidden=\"true\" />\n </a>\n ) : null}\n </p>\n </div>\n </li>\n );\n}\n\nexport interface EvidenceTimelineProps {\n taskId: string;\n /** The row's title, shown while the timeline loads. */\n title: string;\n open: boolean;\n onClose: () => void;\n now?: number;\n}\n\nfunction Body({ taskId, now }: { taskId: string; now: number }) {\n const def = useMemo(() => cloudTimelineQuery(taskId), [taskId]);\n const read = useQuery(def, { freshMs: 15_000 });\n const refetch = useRefetch(def);\n const timeline = read.data?.timeline ?? null;\n const summary = timeline ? timelineSummary(timeline.steps) : null;\n if (!read.data && !read.error) return <p className={styles.muted} aria-busy=\"true\">Reading the evidence…</p>;\n if (!timeline) {\n return <p className={styles.notice} role=\"note\">{read.data?.reason ?? read.error?.message ?? 'The timeline did not answer.'}</p>;\n }\n return (\n <>\n <div className={styles.summaryRow}>\n <p className={styles.summary}>{summary?.text}</p>\n <IconButton size=\"sm\" variant=\"ghost\" icon={<IconRefresh width={14} height={14} />} aria-label=\"Re-read the evidence\" onClick={refetch} />\n </div>\n <ol className={styles.steps} aria-label=\"Evidence, from objective to cost\">\n {timeline.steps.map((step, i) => (\n <StepRow key={step.kind} step={step} now={now} last={i === timeline.steps.length - 1} />\n ))}\n </ol>\n </>\n );\n}\n\nexport function EvidenceTimeline({ taskId, title, open, onClose, now = Date.now() }: EvidenceTimelineProps) {\n const titleId = useId();\n return (\n <Sheet open={open} onClose={onClose} titleId={titleId} width={520} title=\"Evidence\" description={title}>\n {open ? <Body taskId={taskId} now={now} /> : null}\n </Sheet>\n );\n}\n\nexport default EvidenceTimeline;\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e,s as t,u as n}from"./index-BbDqdepe.js";import{u as r}from"./verse-model-CkF3q2IH.js";import{r as i}from"./tool-semantics-DtFU7rvB.js";import{r as a}from"./path-display-HyxETV-f.js";import{a as o}from"./dock-icons-CRHjXBWm.js";import{t as s}from"./EmptyState-BEXDoNZd.js";import{t as c}from"./useVerseTranscript-B6wLDOv8.js";import{i as l,t as u}from"./stub-panes.module-aBfJsf41.js";var d=n(t(),1),f=e(),p={created:`A`,edited:`M`,deleted:`D`,read:`R`},m={created:`created`,edited:`edited`,deleted:`deleted`,read:`read`};function h(e,t){let n=null;for(let r of t){let t=r.replace(/[\\/]+$/,``);(e===t||e.startsWith(`${t}/`)||e.startsWith(`${t}\\`))&&(!n||t.length>n.length)&&(n=t)}return n}function g({sessionId:e,roots:t,host:n}){let r=c(e),p=(0,d.useMemo)(()=>l(r.items),[r.items]),m=p.filter(e=>e.touch!==`read`),g=p.filter(e=>e.touch===`read`);function v(e,r){let i=h(e,t)??t[0];if(r!==`read`&&i){let t=e.startsWith(i)?e.slice(i.length).replace(/^[\\/]+/,``):e;n.openDiff({root:i,scope:`working`,file:t})}else n.addToMessage(`@${a(e,t)}`)}return(0,f.jsxs)(`div`,{className:u.pane,"aria-label":`Files`,children:[(0,f.jsxs)(`section`,{className:u.section,"aria-labelledby":`pane-files-roots`,children:[(0,f.jsxs)(`h3`,{id:`pane-files-roots`,className:u.sectionTitle,children:[`Folders `,(0,f.jsx)(`span`,{className:u.count,children:t.length||``})]}),t.length===0?(0,f.jsx)(`p`,{className:u.muted,children:`This chat has no folders yet.`}):(0,f.jsx)(`ul`,{className:u.list,children:t.map(e=>(0,f.jsxs)(`li`,{className:u.row,title:e,children:[(0,f.jsx)(`span`,{className:u.mark,"aria-hidden":`true`,children:(0,f.jsx)(o,{size:12})}),(0,f.jsx)(`span`,{className:u.name,children:i(e)||e}),(0,f.jsxs)(`span`,{children:[(0,f.jsx)(`button`,{type:`button`,className:u.rowAction,onClick:()=>n.openTerminal({root:e}),children:`Terminal`}),(0,f.jsx)(`button`,{type:`button`,className:u.rowAction,onClick:()=>n.openDiff({root:e,scope:`working`}),children:`Changes`})]})]},e))})]}),p.length===0?(0,f.jsx)(`section`,{className:u.section,children:(0,f.jsx)(s,{compact:!0,title:`No files yet`,body:`Files this chat reads or changes appear here as it works — changed ones first. Click a changed file to see its diff, or a read one to mention it in your message.`})}):null,m.length>0?(0,f.jsx)(_,{id:`pane-files-changed`,title:`Changed`,files:m,roots:t,onOpen:v}):null,g.length>0?(0,f.jsx)(_,{id:`pane-files-read`,title:`Read`,files:g,roots:t,onOpen:v}):null]})}function _({id:e,title:t,files:n,roots:i,onOpen:o}){return(0,f.jsxs)(`section`,{className:u.section,"aria-labelledby":e,children:[(0,f.jsxs)(`h3`,{id:e,className:u.sectionTitle,children:[t,` `,(0,f.jsx)(`span`,{className:u.count,children:n.length})]}),(0,f.jsx)(`ul`,{className:u.list,children:n.map(e=>(0,f.jsx)(`li`,{children:(0,f.jsxs)(`button`,{type:`button`,className:u.row,onClick:()=>o(e.path,e.touch),title:`${e.path} — ${m[e.touch]}${e.count>1?`, ${e.count} times`:``}`,"aria-label":`${a(e.path,i)}, ${m[e.touch]}${e.touch===`read`?` — add to message`:` — show changes`}`,children:[(0,f.jsx)(`span`,{className:u.mark,"data-touch":e.touch,"aria-hidden":`true`,children:p[e.touch]}),(0,f.jsx)(`span`,{className:u.name,children:a(e.path,i)}),(0,f.jsx)(`span`,{className:u.meta,children:r(e.lastAt)})]})},e.path))})]})}export{g as FilesPane};
|
|
2
|
-
//# sourceMappingURL=FilesPane-BQBcWyxr.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FilesPane-BQBcWyxr.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/panes/builtin/FilesPane.tsx"],"sourcesContent":["/**\n * routes/verse/panes/builtin/FilesPane.tsx — the first-party Files pane\n * (a registry STUB): the chat's folders, with a terminal or the changes one\n * click away, and every file the chat has read or changed. A file tree and\n * editor can replace it by registering the id `files` (../README.md).\n */\nimport { useMemo } from 'react';\nimport { EmptyState } from '../../../../components/primitives/EmptyState.js';\nimport { displayPath } from '../../chat/path-display.js';\nimport { fileBasename } from '../../chat/tool-semantics.js';\nimport { FilesGlyph } from '../../dock/dock-icons.js';\nimport { useVerseTranscript } from '../../useVerseTranscript.js';\nimport { formatRelative } from '../../verse-model.js';\nimport type { PaneProps } from '../pane-registry.js';\nimport { touchedFiles, type FileTouch } from './pane-models.js';\nimport styles from './stub-panes.module.css';\n\nconst TOUCH_MARK: Record<FileTouch, string> = { created: 'A', edited: 'M', deleted: 'D', read: 'R' };\nconst TOUCH_WORD: Record<FileTouch, string> = { created: 'created', edited: 'edited', deleted: 'deleted', read: 'read' };\n\n/** The longest root that holds `path` — the one a diff for it is taken in. */\nfunction rootOf(path: string, roots: readonly string[]): string | null {\n let best: string | null = null;\n for (const root of roots) {\n const r = root.replace(/[\\\\/]+$/, '');\n if ((path === r || path.startsWith(`${r}/`) || path.startsWith(`${r}\\\\`)) && (!best || r.length > best.length)) best = r;\n }\n return best;\n}\n\nexport function FilesPane({ sessionId, roots, host }: PaneProps) {\n const transcript = useVerseTranscript(sessionId);\n const files = useMemo(() => touchedFiles(transcript.items), [transcript.items]);\n const changed = files.filter((f) => f.touch !== 'read');\n const read = files.filter((f) => f.touch === 'read');\n\n function open(path: string, touch: FileTouch) {\n const root = rootOf(path, roots) ?? roots[0];\n if (touch !== 'read' && root) {\n const rel = path.startsWith(root) ? path.slice(root.length).replace(/^[\\\\/]+/, '') : path;\n host.openDiff({ root, scope: 'working', file: rel });\n } else {\n host.addToMessage(`@${displayPath(path, roots)}`);\n }\n }\n\n return (\n <div className={styles.pane} aria-label=\"Files\">\n <section className={styles.section} aria-labelledby=\"pane-files-roots\">\n <h3 id=\"pane-files-roots\" className={styles.sectionTitle}>Folders <span className={styles.count}>{roots.length || ''}</span></h3>\n {roots.length === 0 ? <p className={styles.muted}>This chat has no folders yet.</p> : (\n <ul className={styles.list}>\n {roots.map((root) => (\n <li key={root} className={styles.row} title={root}>\n <span className={styles.mark} aria-hidden=\"true\"><FilesGlyph size={12} /></span>\n <span className={styles.name}>{fileBasename(root) || root}</span>\n <span>\n <button type=\"button\" className={styles.rowAction} onClick={() => host.openTerminal({ root })}>Terminal</button>\n <button type=\"button\" className={styles.rowAction} onClick={() => host.openDiff({ root, scope: 'working' })}>Changes</button>\n </span>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n {files.length === 0 ? (\n <section className={styles.section}>\n <EmptyState compact title=\"No files yet\"\n body=\"Files this chat reads or changes appear here as it works — changed ones first. Click a changed file to see its diff, or a read one to mention it in your message.\" />\n </section>\n ) : null}\n\n {changed.length > 0 ? (\n <FileList id=\"pane-files-changed\" title=\"Changed\" files={changed} roots={roots} onOpen={open} />\n ) : null}\n {read.length > 0 ? <FileList id=\"pane-files-read\" title=\"Read\" files={read} roots={roots} onOpen={open} /> : null}\n </div>\n );\n}\n\nfunction FileList({ id, title, files, roots, onOpen }: {\n id: string;\n title: string;\n files: ReturnType<typeof touchedFiles>;\n roots: readonly string[];\n onOpen: (path: string, touch: FileTouch) => void;\n}) {\n return (\n <section className={styles.section} aria-labelledby={id}>\n <h3 id={id} className={styles.sectionTitle}>{title} <span className={styles.count}>{files.length}</span></h3>\n <ul className={styles.list}>\n {files.map((f) => (\n <li key={f.path}>\n <button type=\"button\" className={styles.row} onClick={() => onOpen(f.path, f.touch)}\n title={`${f.path} — ${TOUCH_WORD[f.touch]}${f.count > 1 ? `, ${f.count} times` : ''}`}\n aria-label={`${displayPath(f.path, roots)}, ${TOUCH_WORD[f.touch]}${f.touch === 'read' ? ' — add to message' : ' — show changes'}`}>\n <span className={styles.mark} data-touch={f.touch} aria-hidden=\"true\">{TOUCH_MARK[f.touch]}</span>\n <span className={styles.name}>{displayPath(f.path, roots)}</span>\n <span className={styles.meta}>{formatRelative(f.lastAt)}</span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e,s as t,u as n}from"./index-BbDqdepe.js";import{W as r,l as i,o as a,u as o}from"./global-BWc2NPzv.js";import{M as ee}from"./VerseShared-_pMXKs8m.js";import{a as s,f as te,i as ne,o as c,p as re,r as l}from"./VerseMobileApp-BTGF5yuZ.js";import{n as u}from"./budget-queries-q7mCG9Ek.js";import{o as d,t as f}from"./budget-model-CKd0d1Cj.js";import{f as p}from"./control-queries-Clgsy_eH.js";import{a as ie,c as ae,m,n as h,r as oe}from"./ladder-queries-Cf64JB04.js";import{a as g,s as _}from"./surface-data-DoN8peNV.js";import{c as v,i as se,n as y,o as b,s as x,t as S}from"./ui-parts-2JLq2ZSq.js";import{t as ce}from"./mobile-actions-CvGouAAH.js";import{a as le,i as ue,n as de,r as fe,t as C}from"./fleet-state-CCdBRK-m.js";var pe=n(t(),1),w={headerBanner:`_headerBanner_1wbpx_3`,fleetCard:`_fleetCard_1wbpx_7`,cardTitle:`_cardTitle_1wbpx_13`,detail:`_detail_1wbpx_18`,stats:`_stats_1wbpx_24`,stat:`_stat_1wbpx_24`,statValue:`_statValue_1wbpx_40`,statLabel:`_statLabel_1wbpx_48`,repoList:`_repoList_1wbpx_54`},T=e(),me=15e3,he=C.kind===`daemon`?C:null,E=10,ge={running:`running`,paused:`warning`,stopped:`neutral`,blocked:`danger`,unknown:`neutral`},D={off:`Off`,propose:`Propose`,autonomous:`Autonomous`},_e={none:`No grant`,active:`Active`,paused:`Paused`,expired:`Expired`,revoked:`Revoked`,invalid:`Invalid`},ve={none:`neutral`,active:`success`,paused:`warning`,expired:`danger`,revoked:`danger`,invalid:`danger`},O={merged:`Landed`,"would-merge":`Would merge`,refused:`Refused`,"owner-lane":`Owner lane`,waiting:`Waiting`,"in-progress":`In the gates`};function ye(e){return e===`success`||e===`warning`||e===`danger`?e:`neutral`}var k={merged:{word:`Landed`,tone:`success`},refused:{word:`Refused`,tone:`danger`},failed:{word:`Failed`,tone:`danger`},reverted:{word:`Reverted`,tone:`warning`}},A={local:`Local`,"grok-cli":`Grok`,"claude-cli":`Claude`,codex:`Codex`,devin:`Devin`};function j(e){return typeof e==`number`&&Number.isFinite(e)?String(e):`—`}function M(e){return f.find(t=>t.value===e)?.label??`—`}function N(){return Promise.all([r(p.key,()=>p.fetch(),!0),r(_.key,()=>_.fetch(),!0),r(g.key,()=>g.fetch(),!0),r(u.key,()=>u.fetch(),!0),r(h.key,()=>h.fetch(),!0)])}function P({label:e,value:t}){return(0,T.jsxs)(`div`,{className:w.stat,children:[(0,T.jsx)(`span`,{className:w.statValue,children:t}),(0,T.jsx)(`span`,{className:w.statLabel,children:e})]})}function F(){let{activity:e,permissions:t,reachability:n,navigate:r}=re(),C=i(p),E=i(_),F=i(g),I=i(u),L=i(h),be=o(p),xe=o(_),Se=o(g),Ce=o(u),we=o(h),Te=(0,pe.useCallback)(()=>{be(),xe(),Se(),Ce(),we()},[be,xe,Se,Ce,we]);ee(Te,me);let[R,Ee]=(0,pe.useState)(!1),z=E.data?.value??null,B=fe({control:C.data??null,live:z,badge:e.data?.autonomy??null}),V=te(t),H=n===`offline`||n===`unreachable`,De=!C.data&&!z,Oe=De&&(C.status===`loading`||C.status===`idle`||E.status===`loading`||E.status===`idle`),ke=De&&!Oe,U=B.action?.kind===`daemon`?B.action:null,Ae=C.data?.killSwitch,W=F.data?.value??null,G=W?.grant.maxMode??null,K=I.data?.mode??null,q=ae(W,Date.now()),je=e=>{if(e===K)return;let t=f.find(t=>t.value===e);t&&ce({title:`Switch to ${t.label}?`,consequences:`${t.description} This applies to autonomous work immediately.`,confirmLabel:`Use ${t.label}`,run:()=>le().setBudgetMode(e),success:`Budget mode: ${t.label}`})},Me=H&&V?(0,T.jsx)(`div`,{className:w.headerBanner,children:(0,T.jsx)(y,{tone:`warning`,children:`Your Mac isn’t answering — controls wait until it does.`})}):void 0,Ne;Ne=Oe?(0,T.jsx)(s,{rows:2,label:`Loading the fleet`}):ke?(0,T.jsx)(se,{title:`Couldn’t read the fleet`,reason:C.error?a(C.error):E.data?.reason??null,onRetry:Te}):(0,T.jsxs)(`section`,{className:c(v.card,w.fleetCard),"aria-label":`Fleet state`,children:[(0,T.jsxs)(`div`,{className:v.spread,children:[(0,T.jsx)(`span`,{className:w.cardTitle,children:`Fleet`}),(0,T.jsx)(S,{tone:ge[B.headline],dot:!0,pulse:B.headline===`running`&&(B.building??0)>0,children:B.label})]}),(0,T.jsx)(`p`,{className:w.detail,children:B.detail}),B.killEngaged?(0,T.jsx)(y,{tone:`danger`,children:(0,T.jsxs)(`span`,{className:v.stack,children:[(0,T.jsx)(`span`,{children:Ae?.note||Ae?.reason||`The kill switch is engaged: nothing autonomous runs, and the agents’ write tools refuse.`}),(0,T.jsxs)(`span`,{children:[`Release it on your Mac: `,(0,T.jsx)(`code`,{className:v.mono,children:`ashlr fleet resume`})]})]})}):null,V&&(U||de(B))?(0,T.jsxs)(`div`,{className:v.buttonRow,children:[U?(0,T.jsx)(l,{variant:U.destructive?`destructiveTinted`:`tinted`,disabled:H,onClick:()=>ue(U),children:U.verb===`pause`?`Pause`:U.verb===`resume`?`Resume`:`Start fleet`}):null,de(B)&&he?(0,T.jsx)(l,{variant:`destructiveTinted`,disabled:H,onClick:()=>ue(he),children:`Stop fleet`}):null]}):null,!V&&t.actReason?(0,T.jsx)(`p`,{className:v.faint,children:t.actReason}):null]});let Pe;Pe=E.status===`loading`&&!E.data?(0,T.jsx)(s,{rows:2,label:`Loading the live fleet`}):z?(0,T.jsxs)(`div`,{className:v.stack,children:[(0,T.jsxs)(`div`,{className:w.stats,children:[(0,T.jsx)(P,{label:`Building`,value:j(z.summary.building)}),(0,T.jsx)(P,{label:`Queued`,value:j(z.summary.queued)}),(0,T.jsx)(P,{label:`Parked`,value:j(z.summary.parked)}),(0,T.jsx)(P,{label:`Landed today`,value:j(z.summary.mergedToday)})]}),z.lanes.length>0?(0,T.jsx)(`div`,{className:v.group,"aria-label":`Lanes`,children:z.lanes.map(e=>(0,T.jsx)(b,{title:A[e.lane]??e.lane,subtitle:e.capReason??void 0,trailing:e.slots===0?`off`:`${e.busy} of ${e.slots} busy`},e.lane))}):null]}):(0,T.jsx)(`p`,{className:c(v.card,v.muted),children:E.data?.reason??`The live fleet view has not answered yet.`});let J;if(I.status===`loading`&&!I.data)J=(0,T.jsx)(s,{rows:1,label:`Loading the budget mode`});else if(!I.data)J=(0,T.jsx)(`p`,{className:c(v.card,v.muted),children:I.error?a(I.error):`The budget has not answered yet.`});else{let e=f.find(e=>e.value===K);J=(0,T.jsxs)(`div`,{className:v.stack,children:[(0,T.jsx)(`div`,{className:v.chips,role:`group`,"aria-label":`Budget mode`,children:f.map(e=>{let t=d(e.value,G);return(0,T.jsx)(`button`,{type:`button`,className:v.chip,"aria-pressed":e.value===K,disabled:!V||H||t,onClick:()=>je(e.value),children:e.label},e.value)})}),(0,T.jsx)(`p`,{className:v.muted,children:e?.description??`The Mac reported a mode this phone doesn’t know.`}),G&&f.some(e=>d(e.value,G))?(0,T.jsxs)(`p`,{className:v.faint,children:[`Above `,M(G),` is off: the grant caps spending there. Raise the ceiling with a new grant on your Mac.`]}):null]})}let Y;if(F.status===`loading`&&!F.data)Y=(0,T.jsx)(s,{rows:2,label:`Loading the grant`});else if(!W)Y=(0,T.jsx)(`p`,{className:c(v.card,v.muted),children:F.data?.reason??`The authority service has not answered yet.`});else{let e=W.grant.repos;Y=(0,T.jsxs)(`div`,{className:v.group,children:[(0,T.jsx)(b,{title:`Autonomy`,subtitle:W.effectiveSwitch===W.switch?void 0:W.effectiveReason??void 0,trailing:W.effectiveSwitch===W.switch?D[W.switch]:`${D[W.switch]} · in force: ${D[W.effectiveSwitch]}`}),(0,T.jsx)(b,{title:`Grant`,subtitle:W.grant.reason??(q?`Until ${q.until}`:void 0),trailing:(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(S,{tone:ve[W.grant.state]??`neutral`,children:_e[W.grant.state]??W.grant.state}),q?(0,T.jsx)(`span`,{children:q.text}):null]})}),(0,T.jsx)(b,{title:`Repos`,trailing:`${e.length}`,onClick:e.length>0?()=>Ee(e=>!e):void 0,chevron:!1,label:e.length>0?`${R?`Hide`:`Show`} ${e.length} granted repos`:void 0}),R?(0,T.jsx)(`ul`,{className:w.repoList,children:e.map(e=>(0,T.jsxs)(`li`,{children:[(0,T.jsx)(`span`,{className:v.mono,children:e.nameWithOwner}),` `,(0,T.jsx)(`span`,{className:v.faint,children:e.stage})]},e.nameWithOwner))}):null,(0,T.jsx)(b,{title:`Engines`,trailing:W.grant.engines.length>0?W.grant.engines.map(e=>A[e]??e).join(`, `):`—`}),(0,T.jsx)(b,{title:`Max budget mode`,trailing:M(W.grant.maxMode)})]})}let X=L.data?.value?.decisions??null,Z=(z?.runs??[]).filter(e=>e.endedAt&&e.outcome&&k[e.outcome]).slice(0,10),Q=Date.now(),$;if(L.status===`loading`&&!L.data)$=(0,T.jsx)(s,{rows:3,label:`Loading recent decisions`});else if(X)$=X.length===0?(0,T.jsx)(`p`,{className:c(v.card,v.muted),children:`No decisions yet. Each fleet PR the gates judge shows here: landed, refused, or held for you.`}):(0,T.jsx)(`div`,{className:v.group,children:X.slice(0,10).map(e=>(0,T.jsx)(b,{leading:(0,T.jsx)(S,{tone:ye(oe[e.outcome]),children:O[e.outcome]}),title:e.prNumber===null?m(e.repo):`${m(e.repo)} #${e.prNumber}`,subtitle:e.why,trailing:ie(e.at,Q)},`${e.proposalId}-${e.at}`))});else{let e=L.data?.reason??(L.error?a(L.error):`The decisions ledger has not answered.`);$=(0,T.jsxs)(`div`,{className:v.stack,children:[(0,T.jsxs)(`p`,{className:v.faint,children:[e,Z.length>0?` Showing finished runs instead.`:``]}),Z.length>0?(0,T.jsx)(`div`,{className:v.group,children:Z.map(e=>{let t=k[e.outcome],n=e.prNumber===null?m(e.repo):`${m(e.repo)} #${e.prNumber}`;return(0,T.jsx)(b,{leading:(0,T.jsx)(S,{tone:t.tone,children:t.word}),title:e.title,subtitle:e.hold?.reason?`${n} · ${e.hold.reason}`:n,trailing:e.endedAt?ie(e.endedAt,Q):void 0},e.id)})}):null]})}return(0,T.jsxs)(ne,{title:`Fleet`,onBack:()=>r({screen:`more`}),backLabel:`More`,onRefresh:N,header:Me,label:`Fleet`,children:[Ne,(0,T.jsx)(x,{title:`Right now`,flat:!0,children:Pe}),(0,T.jsx)(x,{title:`Budget mode`,flat:!0,children:J}),(0,T.jsx)(x,{title:`Grant`,flat:!0,footer:`Grants are signed on your Mac with Touch ID.`,children:Y}),(0,T.jsx)(x,{title:`Recent decisions`,flat:!0,children:$})]})}export{E as DECISION_ROWS,O as DECISION_WORD,me as FLEET_POLL_MS,F as FleetScreen,N as refreshFleetScreen};
|
|
2
|
-
//# sourceMappingURL=FleetScreen-YXDuVwKd.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FleetScreen-YXDuVwKd.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/screens/FleetScreen.module.css","../../../../../../src/web-ui/routes/verse/mobile/screens/FleetScreen.tsx"],"sourcesContent":["/* routes/verse/mobile/screens/FleetScreen.module.css — the fleet card, the live counts and the granted-repo list. */\n\n.headerBanner {\n padding: 0 max(var(--space-4), env(safe-area-inset-right)) 0 max(var(--space-4), env(safe-area-inset-left));\n}\n\n.fleetCard {\n display: grid;\n gap: var(--space-3);\n margin: var(--space-4) 0 var(--space-6);\n}\n\n.cardTitle {\n font-weight: var(--font-weight-semibold);\n font-size: 1.05em;\n}\n\n.detail {\n margin: 0;\n color: var(--text-secondary);\n font-size: 0.92em;\n}\n\n.stats {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--space-2);\n}\n\n.stat {\n display: grid;\n gap: 0.1em;\n min-width: 0;\n padding: var(--space-3);\n border-radius: var(--radius-xl);\n border: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n.statValue {\n font-family: var(--font-display);\n font-size: 1.45em;\n line-height: 1.1;\n font-weight: var(--font-weight-bold);\n font-variant-numeric: tabular-nums;\n}\n\n.statLabel {\n font-size: 0.8em;\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n}\n\n.repoList {\n margin: 0;\n padding: 0 var(--space-4) var(--space-3) var(--space-8);\n display: grid;\n gap: var(--space-1);\n font-size: 0.9em;\n}\n","/**\n * routes/verse/mobile/screens/FleetScreen.tsx — the fleet from a pocket:\n * what state it is in and the one safe button, Stop, how much of your seats\n * it may spend (budget mode), what it is allowed to touch (the grant —\n * read-only here), and what it decided lately.\n *\n * Reads, all the workbench's own (same cache keys, so the Mac's Fleet and\n * Command views and this screen never disagree):\n * control GET /api/verse/control daemon, pause, kill switch\n * live GET /api/verse/fleet/live state, summary, lanes, runs\n * authority GET /api/verse/authority switch, grant\n * budget GET /api/verse/budget mode\n * decisions GET /api/verse/authority/ledger?view=decisions\n * plus the shell's activity badge. Polled every 15 s while on screen.\n *\n * What the phone deliberately cannot do: release the kill switch (the Mac's\n * `ashlr fleet resume`), sign or widen a grant (Touch ID on the Mac), or\n * raise the budget above the grant's ceiling. Each says so where it applies.\n */\nimport { useCallback, useState } from 'react';\nimport type { BudgetMode } from '../../../../../core/routing/types.js';\nimport type { AutonomySwitch } from '../../../../../core/authority/types.js';\nimport type { FleetLiveRun } from '../../../../../core/fleet/fleet-types.js';\nimport type { ShadowDecisionOutcome } from '../../../../../core/verse/autonomy-ladder.js';\nimport { refetchQuery } from '../../../../data/cache.js';\nimport { readFailureReason } from '../../../../data/client.js';\nimport { useQuery, useRefetch } from '../../../../data/hooks.js';\nimport { verseControlQuery } from '../../autonomy/control-queries.js';\nimport { budgetQuery } from '../../budget/budget-queries.js';\nimport { BUDGET_MODE_OPTIONS, modeAboveCeiling } from '../../budget/budget-model.js';\nimport { decisionsQuery } from '../../command/ladder-queries.js';\nimport { ago, grantExpiry, OUTCOME_TONE, repoShort } from '../../command/ladder-model.js';\nimport { authorityQuery, fleetLiveQuery } from '../../command/surface-data.js';\nimport { usePollWhileVisible } from '../../shell/section-visibility.js';\nimport { runFleetAction } from '../fleet-actions.js';\nimport { getMobileFleetClient } from '../fleet-client.js';\nimport { canStop, fleetStateView, STOP_ACTION, type FleetHeadline } from '../fleet-state.js';\nimport { runMobileAction } from '../mobile-actions.js';\nimport { canShowActions, useMobile } from '../mobile-context.js';\nimport { Button, cx, Screen, SkeletonList } from '../ui.js';\nimport { Badge, Banner, ErrorState, Row, Section, ui, type Tone } from '../ui-parts.js';\nimport styles from './FleetScreen.module.css';\n\nexport const FLEET_POLL_MS = 15_000;\nconst STOP = STOP_ACTION.kind === 'daemon' ? STOP_ACTION : null;\n/** Decisions shown before the list stops (the Mac's Fleet view has the rest). */\nexport const DECISION_ROWS = 10;\n\nconst HEADLINE_TONE: Readonly<Record<FleetHeadline, Tone>> = {\n running: 'running',\n paused: 'warning',\n stopped: 'neutral',\n blocked: 'danger',\n unknown: 'neutral',\n};\n\nconst SWITCH_WORD: Readonly<Record<AutonomySwitch, string>> = { off: 'Off', propose: 'Propose', autonomous: 'Autonomous' };\n\nconst GRANT_WORD: Readonly<Record<string, string>> = {\n none: 'No grant',\n active: 'Active',\n paused: 'Paused',\n expired: 'Expired',\n revoked: 'Revoked',\n invalid: 'Invalid',\n};\n\nconst GRANT_TONE: Readonly<Record<string, Tone>> = {\n none: 'neutral',\n active: 'success',\n paused: 'warning',\n expired: 'danger',\n revoked: 'danger',\n invalid: 'danger',\n};\n\n/** The phone's words for a decision: a merge is \"Landed\" here. */\nexport const DECISION_WORD: Readonly<Record<ShadowDecisionOutcome, string>> = {\n merged: 'Landed',\n 'would-merge': 'Would merge',\n refused: 'Refused',\n 'owner-lane': 'Owner lane',\n waiting: 'Waiting',\n 'in-progress': 'In the gates',\n};\n\nfunction toneOf(chip: string): Tone {\n return chip === 'success' || chip === 'warning' || chip === 'danger' ? chip : 'neutral';\n}\n\nconst RUN_OUTCOME: Readonly<Record<string, { word: string; tone: Tone }>> = {\n merged: { word: 'Landed', tone: 'success' },\n refused: { word: 'Refused', tone: 'danger' },\n failed: { word: 'Failed', tone: 'danger' },\n reverted: { word: 'Reverted', tone: 'warning' },\n};\n\nconst LANE_LABEL: Readonly<Record<string, string>> = {\n local: 'Local',\n 'grok-cli': 'Grok',\n 'claude-cli': 'Claude',\n codex: 'Codex',\n devin: 'Devin',\n};\n\nfunction count(n: number | null | undefined): string {\n return typeof n === 'number' && Number.isFinite(n) ? String(n) : '—';\n}\n\nfunction modeLabel(mode: BudgetMode | null | undefined): string {\n return BUDGET_MODE_OPTIONS.find((o) => o.value === mode)?.label ?? '—';\n}\n\n/** Pull-to-refresh: every read this screen shows, forced fresh. */\nexport function refreshFleetScreen(): Promise<unknown> {\n return Promise.all([\n refetchQuery(verseControlQuery.key, () => verseControlQuery.fetch(), true),\n refetchQuery(fleetLiveQuery.key, () => fleetLiveQuery.fetch(), true),\n refetchQuery(authorityQuery.key, () => authorityQuery.fetch(), true),\n refetchQuery(budgetQuery.key, () => budgetQuery.fetch(), true),\n refetchQuery(decisionsQuery.key, () => decisionsQuery.fetch(), true),\n ]);\n}\n\nfunction Stat({ label, value }: { label: string; value: string }) {\n return (\n <div className={styles.stat}>\n <span className={styles.statValue}>{value}</span>\n <span className={styles.statLabel}>{label}</span>\n </div>\n );\n}\n\nexport function FleetScreen() {\n const { activity, permissions, reachability, navigate } = useMobile();\n const control = useQuery(verseControlQuery);\n const live = useQuery(fleetLiveQuery);\n const authority = useQuery(authorityQuery);\n const budget = useQuery(budgetQuery);\n const decisions = useQuery(decisionsQuery);\n const refetchControl = useRefetch(verseControlQuery);\n const refetchLive = useRefetch(fleetLiveQuery);\n const refetchAuthority = useRefetch(authorityQuery);\n const refetchBudget = useRefetch(budgetQuery);\n const refetchDecisions = useRefetch(decisionsQuery);\n const poll = useCallback(() => {\n refetchControl();\n refetchLive();\n refetchAuthority();\n refetchBudget();\n refetchDecisions();\n }, [refetchControl, refetchLive, refetchAuthority, refetchBudget, refetchDecisions]);\n usePollWhileVisible(poll, FLEET_POLL_MS);\n const [reposOpen, setReposOpen] = useState(false);\n\n const snapshot = live.data?.value ?? null;\n const fleet = fleetStateView({ control: control.data ?? null, live: snapshot, badge: activity.data?.autonomy ?? null });\n const canAct = canShowActions(permissions);\n const offline = reachability === 'offline' || reachability === 'unreachable';\n // Nothing to say about the fleet until one of its two sources has answered with a reading.\n const nothingYet = !control.data && !snapshot;\n const loading = nothingYet && (control.status === 'loading' || control.status === 'idle' || live.status === 'loading' || live.status === 'idle');\n const failed = nothingYet && !loading;\n const action = fleet.action?.kind === 'daemon' ? fleet.action : null;\n const kill = control.data?.killSwitch;\n\n const status = authority.data?.value ?? null;\n const ceiling = status?.grant.maxMode ?? null;\n const currentMode = budget.data?.mode ?? null;\n const expiry = grantExpiry(status, Date.now());\n\n const chooseMode = (mode: BudgetMode) => {\n if (mode === currentMode) return;\n const option = BUDGET_MODE_OPTIONS.find((o) => o.value === mode);\n if (!option) return;\n runMobileAction({\n title: `Switch to ${option.label}?`,\n consequences: `${option.description} This applies to autonomous work immediately.`,\n confirmLabel: `Use ${option.label}`,\n run: () => getMobileFleetClient().setBudgetMode(mode),\n success: `Budget mode: ${option.label}`,\n });\n };\n\n const header = offline && canAct ? <div className={styles.headerBanner}><Banner tone=\"warning\">Your Mac isn’t answering — controls wait until it does.</Banner></div> : undefined;\n\n let fleetCard;\n if (loading) {\n fleetCard = <SkeletonList rows={2} label=\"Loading the fleet\" />;\n } else if (failed) {\n fleetCard = (\n <ErrorState\n title=\"Couldn’t read the fleet\"\n reason={control.error ? readFailureReason(control.error) : live.data?.reason ?? null}\n onRetry={poll}\n />\n );\n } else {\n fleetCard = (\n <section className={cx(ui.card, styles.fleetCard)} aria-label=\"Fleet state\">\n <div className={ui.spread}>\n <span className={styles.cardTitle}>Fleet</span>\n <Badge tone={HEADLINE_TONE[fleet.headline]} dot pulse={fleet.headline === 'running' && (fleet.building ?? 0) > 0}>{fleet.label}</Badge>\n </div>\n <p className={styles.detail}>{fleet.detail}</p>\n {fleet.killEngaged ? (\n <Banner tone=\"danger\">\n <span className={ui.stack}>\n <span>{kill?.note || kill?.reason || 'The kill switch is engaged: nothing autonomous runs, and the agents’ write tools refuse.'}</span>\n <span>Release it on your Mac: <code className={ui.mono}>ashlr fleet resume</code></span>\n </span>\n </Banner>\n ) : null}\n {canAct && (action || canStop(fleet)) ? (\n <div className={ui.buttonRow}>\n {action ? (\n <Button variant={action.destructive ? 'destructiveTinted' : 'tinted'} disabled={offline} onClick={() => runFleetAction(action)}>\n {action.verb === 'pause' ? 'Pause' : action.verb === 'resume' ? 'Resume' : 'Start fleet'}\n </Button>\n ) : null}\n {canStop(fleet) && STOP ? (\n <Button variant=\"destructiveTinted\" disabled={offline} onClick={() => runFleetAction(STOP)}>\n Stop fleet\n </Button>\n ) : null}\n </div>\n ) : null}\n {!canAct && permissions.actReason ? <p className={ui.faint}>{permissions.actReason}</p> : null}\n </section>\n );\n }\n\n let liveBody;\n if (live.status === 'loading' && !live.data) liveBody = <SkeletonList rows={2} label=\"Loading the live fleet\" />;\n else if (!snapshot) liveBody = <p className={cx(ui.card, ui.muted)}>{live.data?.reason ?? 'The live fleet view has not answered yet.'}</p>;\n else {\n liveBody = (\n <div className={ui.stack}>\n <div className={styles.stats}>\n <Stat label=\"Building\" value={count(snapshot.summary.building)} />\n <Stat label=\"Queued\" value={count(snapshot.summary.queued)} />\n <Stat label=\"Parked\" value={count(snapshot.summary.parked)} />\n <Stat label=\"Landed today\" value={count(snapshot.summary.mergedToday)} />\n </div>\n {snapshot.lanes.length > 0 ? (\n <div className={ui.group} aria-label=\"Lanes\">\n {snapshot.lanes.map((lane) => (\n <Row\n key={lane.lane}\n title={LANE_LABEL[lane.lane] ?? lane.lane}\n subtitle={lane.capReason ?? undefined}\n trailing={lane.slots === 0 ? 'off' : `${lane.busy} of ${lane.slots} busy`}\n />\n ))}\n </div>\n ) : null}\n </div>\n );\n }\n\n let budgetBody;\n if (budget.status === 'loading' && !budget.data) budgetBody = <SkeletonList rows={1} label=\"Loading the budget mode\" />;\n else if (!budget.data) budgetBody = <p className={cx(ui.card, ui.muted)}>{budget.error ? readFailureReason(budget.error) : 'The budget has not answered yet.'}</p>;\n else {\n const selected = BUDGET_MODE_OPTIONS.find((o) => o.value === currentMode);\n budgetBody = (\n <div className={ui.stack}>\n <div className={ui.chips} role=\"group\" aria-label=\"Budget mode\">\n {BUDGET_MODE_OPTIONS.map((o) => {\n const above = modeAboveCeiling(o.value, ceiling);\n return (\n <button\n key={o.value}\n type=\"button\"\n className={ui.chip}\n aria-pressed={o.value === currentMode}\n disabled={!canAct || offline || above}\n onClick={() => chooseMode(o.value)}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n <p className={ui.muted}>{selected?.description ?? 'The Mac reported a mode this phone doesn’t know.'}</p>\n {ceiling && BUDGET_MODE_OPTIONS.some((o) => modeAboveCeiling(o.value, ceiling)) ? (\n <p className={ui.faint}>Above {modeLabel(ceiling)} is off: the grant caps spending there. Raise the ceiling with a new grant on your Mac.</p>\n ) : null}\n </div>\n );\n }\n\n let grantBody;\n if (authority.status === 'loading' && !authority.data) grantBody = <SkeletonList rows={2} label=\"Loading the grant\" />;\n else if (!status) grantBody = <p className={cx(ui.card, ui.muted)}>{authority.data?.reason ?? 'The authority service has not answered yet.'}</p>;\n else {\n const repos = status.grant.repos;\n grantBody = (\n <div className={ui.group}>\n <Row\n title=\"Autonomy\"\n subtitle={status.effectiveSwitch !== status.switch ? status.effectiveReason ?? undefined : undefined}\n trailing={status.effectiveSwitch === status.switch ? SWITCH_WORD[status.switch] : `${SWITCH_WORD[status.switch]} · in force: ${SWITCH_WORD[status.effectiveSwitch]}`}\n />\n <Row\n title=\"Grant\"\n subtitle={status.grant.reason ?? (expiry ? `Until ${expiry.until}` : undefined)}\n trailing={(\n <>\n <Badge tone={GRANT_TONE[status.grant.state] ?? 'neutral'}>{GRANT_WORD[status.grant.state] ?? status.grant.state}</Badge>\n {expiry ? <span>{expiry.text}</span> : null}\n </>\n )}\n />\n <Row\n title=\"Repos\"\n trailing={`${repos.length}`}\n onClick={repos.length > 0 ? () => setReposOpen((o) => !o) : undefined}\n chevron={false}\n label={repos.length > 0 ? `${reposOpen ? 'Hide' : 'Show'} ${repos.length} granted repos` : undefined}\n />\n {reposOpen ? (\n <ul className={styles.repoList}>\n {repos.map((r) => <li key={r.nameWithOwner}><span className={ui.mono}>{r.nameWithOwner}</span> <span className={ui.faint}>{r.stage}</span></li>)}\n </ul>\n ) : null}\n <Row title=\"Engines\" trailing={status.grant.engines.length > 0 ? status.grant.engines.map((e) => LANE_LABEL[e] ?? e).join(', ') : '—'} />\n <Row title=\"Max budget mode\" trailing={modeLabel(status.grant.maxMode)} />\n </div>\n );\n }\n\n const decisionList = decisions.data?.value?.decisions ?? null;\n const endedRuns: FleetLiveRun[] = (snapshot?.runs ?? []).filter((r) => r.endedAt && r.outcome && RUN_OUTCOME[r.outcome]).slice(0, DECISION_ROWS);\n const now = Date.now();\n let decisionsBody;\n if (decisions.status === 'loading' && !decisions.data) decisionsBody = <SkeletonList rows={3} label=\"Loading recent decisions\" />;\n else if (decisionList) {\n decisionsBody = decisionList.length === 0 ? (\n <p className={cx(ui.card, ui.muted)}>No decisions yet. Each fleet PR the gates judge shows here: landed, refused, or held for you.</p>\n ) : (\n <div className={ui.group}>\n {decisionList.slice(0, DECISION_ROWS).map((d) => (\n <Row\n key={`${d.proposalId}-${d.at}`}\n leading={<Badge tone={toneOf(OUTCOME_TONE[d.outcome])}>{DECISION_WORD[d.outcome]}</Badge>}\n title={d.prNumber !== null ? `${repoShort(d.repo)} #${d.prNumber}` : repoShort(d.repo)}\n subtitle={d.why}\n trailing={ago(d.at, now)}\n />\n ))}\n </div>\n );\n } else {\n const why = decisions.data?.reason ?? (decisions.error ? readFailureReason(decisions.error) : 'The decisions ledger has not answered.');\n decisionsBody = (\n <div className={ui.stack}>\n <p className={ui.faint}>{why}{endedRuns.length > 0 ? ' Showing finished runs instead.' : ''}</p>\n {endedRuns.length > 0 ? (\n <div className={ui.group}>\n {endedRuns.map((r) => {\n const o = RUN_OUTCOME[r.outcome!]!;\n const where = r.prNumber !== null ? `${repoShort(r.repo)} #${r.prNumber}` : repoShort(r.repo);\n return (\n <Row\n key={r.id}\n leading={<Badge tone={o.tone}>{o.word}</Badge>}\n title={r.title}\n subtitle={r.hold?.reason ? `${where} · ${r.hold.reason}` : where}\n trailing={r.endedAt ? ago(r.endedAt, now) : undefined}\n />\n );\n })}\n </div>\n ) : null}\n </div>\n );\n }\n\n return (\n <Screen title=\"Fleet\" onBack={() => navigate({ screen: 'more' })} backLabel=\"More\" onRefresh={refreshFleetScreen} header={header} label=\"Fleet\">\n {fleetCard}\n <Section title=\"Right now\" flat>{liveBody}</Section>\n <Section title=\"Budget mode\" flat>{budgetBody}</Section>\n <Section title=\"Grant\" flat footer=\"Grants are signed on your Mac with Touch ID.\">{grantBody}</Section>\n <Section title=\"Recent decisions\" flat>{decisionsBody}</Section>\n </Screen>\n );\n}\n"],"mappings":"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"}
|