@ashlr/hub 3.10.0 → 3.11.0
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 +156 -0
- package/README.md +343 -82
- package/dist/authority-surface.json +109 -29
- package/dist/build-identity.json +2 -2
- package/dist/cli/cloud.d.ts +39 -0
- package/dist/cli/cloud.js +448 -0
- package/dist/cli/cloud.js.map +1 -0
- package/dist/cli/completions.js +4 -0
- package/dist/cli/completions.js.map +1 -1
- package/dist/cli/help.js +2 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/cloud/backlog.d.ts +17 -0
- package/dist/core/cloud/backlog.js +177 -0
- package/dist/core/cloud/backlog.js.map +1 -0
- package/dist/core/cloud/budget.d.ts +19 -0
- package/dist/core/cloud/budget.js +99 -0
- package/dist/core/cloud/budget.js.map +1 -0
- package/dist/core/cloud/checkout.d.ts +41 -0
- package/dist/core/cloud/checkout.js +168 -0
- package/dist/core/cloud/checkout.js.map +1 -0
- package/dist/core/cloud/cloud-api.d.ts +86 -0
- package/dist/core/cloud/cloud-api.js +599 -0
- package/dist/core/cloud/cloud-api.js.map +1 -0
- package/dist/core/cloud/delivery-contract.d.ts +25 -0
- package/dist/core/cloud/delivery-contract.js +138 -0
- package/dist/core/cloud/delivery-contract.js.map +1 -0
- package/dist/core/cloud/improvement-backlog.d.ts +11 -0
- package/dist/core/cloud/improvement-backlog.js +26 -0
- package/dist/core/cloud/improvement-backlog.js.map +1 -0
- package/dist/core/cloud/launcher.d.ts +68 -0
- package/dist/core/cloud/launcher.js +312 -0
- package/dist/core/cloud/launcher.js.map +1 -0
- package/dist/core/cloud/service.d.ts +51 -0
- package/dist/core/cloud/service.js +215 -0
- package/dist/core/cloud/service.js.map +1 -0
- package/dist/core/cloud/store.d.ts +41 -0
- package/dist/core/cloud/store.js +278 -0
- package/dist/core/cloud/store.js.map +1 -0
- package/dist/core/cloud/tracker.d.ts +30 -0
- package/dist/core/cloud/tracker.js +152 -0
- package/dist/core/cloud/tracker.js.map +1 -0
- package/dist/core/cloud/types.d.ts +233 -0
- package/dist/core/cloud/types.js +73 -0
- package/dist/core/cloud/types.js.map +1 -0
- package/dist/core/daemon/capacity-publisher.d.ts +19 -0
- package/dist/core/daemon/capacity-publisher.js +49 -2
- package/dist/core/daemon/capacity-publisher.js.map +1 -1
- package/dist/core/daemon/overnight-status.d.ts +13 -0
- package/dist/core/daemon/overnight-status.js +93 -8
- package/dist/core/daemon/overnight-status.js.map +1 -1
- package/dist/core/fleet/dispatch-router.js +26 -9
- package/dist/core/fleet/dispatch-router.js.map +1 -1
- package/dist/core/fleet/fleet-runtime-journal.js +12 -5
- package/dist/core/fleet/fleet-runtime-journal.js.map +1 -1
- package/dist/core/fleet/fleet-types.d.ts +13 -0
- package/dist/core/routing/budget-store.js +11 -5
- package/dist/core/routing/budget-store.js.map +1 -1
- package/dist/core/routing/capacity-history-api.d.ts +30 -0
- package/dist/core/routing/capacity-history-api.js +147 -0
- package/dist/core/routing/capacity-history-api.js.map +1 -0
- package/dist/core/routing/capacity-history-types.d.ts +63 -0
- package/dist/core/routing/capacity-history-types.js +18 -0
- package/dist/core/routing/capacity-history-types.js.map +1 -0
- package/dist/core/routing/capacity-history.d.ts +130 -0
- package/dist/core/routing/capacity-history.js +654 -0
- package/dist/core/routing/capacity-history.js.map +1 -0
- package/dist/core/routing/headroom.d.ts +5 -1
- package/dist/core/routing/headroom.js +82 -41
- package/dist/core/routing/headroom.js.map +1 -1
- package/dist/core/routing/router.d.ts +8 -1
- package/dist/core/routing/router.js +49 -16
- package/dist/core/routing/router.js.map +1 -1
- package/dist/core/routing/seat-reasons.d.ts +35 -0
- package/dist/core/routing/seat-reasons.js +48 -0
- package/dist/core/routing/seat-reasons.js.map +1 -0
- package/dist/core/routing/types.d.ts +37 -0
- package/dist/core/routing/types.js.map +1 -1
- package/dist/core/verse/activity-api.d.ts +3 -1
- package/dist/core/verse/activity-api.js +16 -1
- package/dist/core/verse/activity-api.js.map +1 -1
- package/dist/core/verse/activity.d.ts +7 -0
- package/dist/core/verse/activity.js +23 -0
- package/dist/core/verse/activity.js.map +1 -1
- package/dist/core/verse/fleet-history-types.d.ts +12 -4
- package/dist/core/verse/fleet-history-types.js +4 -2
- package/dist/core/verse/fleet-history-types.js.map +1 -1
- package/dist/core/verse/fleet-live-api.d.ts +14 -1
- package/dist/core/verse/fleet-live-api.js +31 -11
- package/dist/core/verse/fleet-live-api.js.map +1 -1
- package/dist/core/verse/preferences.d.ts +3 -1
- package/dist/core/verse/preferences.js +5 -2
- package/dist/core/verse/preferences.js.map +1 -1
- package/dist/core/verse/types.d.ts +5 -1
- package/dist/core/verse/types.js.map +1 -1
- package/dist/core/verse/verse-api.d.ts +1 -1
- package/dist/core/verse/verse-api.js +4 -1
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/vision/leader-cloud.d.ts +63 -0
- package/dist/core/vision/leader-cloud.js +134 -0
- package/dist/core/vision/leader-cloud.js.map +1 -0
- package/dist/core/vision/leader.d.ts +6 -0
- package/dist/core/vision/leader.js +12 -1
- package/dist/core/vision/leader.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js → ActionMenu-CQvNJvHY.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js.map → ActionMenu-CQvNJvHY.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-Bywv_iYR.css +1 -0
- package/dist/core/web/public/next/assets/Advanced-DEM93sKI.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-DEM93sKI.js.map +1 -0
- package/dist/core/web/public/next/assets/{App-DyBg1v_q.js → App-CimXmK0L.js} +5 -5
- package/dist/core/web/public/next/assets/{App-DyBg1v_q.js.map → App-CimXmK0L.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-D6U-dSj6.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-D6U-dSj6.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-LD9lCPkT.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-LD9lCPkT.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-3V9pUyxm.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-CoMngwNB.js.map → AutonomySection-3V9pUyxm.js.map} +1 -1
- package/dist/core/web/public/next/assets/BranchBar-BZNQ50YE.css +1 -0
- package/dist/core/web/public/next/assets/BranchBar-U8UdpfEB.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-U8UdpfEB.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-DOTlMSmW.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-DOTlMSmW.js.map +1 -0
- package/dist/core/web/public/next/assets/BurnDown-x4PWH9JF.js +2 -0
- package/dist/core/web/public/next/assets/BurnDown-x4PWH9JF.js.map +1 -0
- package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js → Button-DYv_KKxr.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js.map → Button-DYv_KKxr.js.map} +1 -1
- package/dist/core/web/public/next/assets/CapacityStrip-C667yQe8.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-C667yQe8.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-Cc28CyWk.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-CCcIPpOq.js +3 -0
- package/dist/core/web/public/next/assets/{ChatSection-B9cdRKUh.js.map → ChatSection-CCcIPpOq.js.map} +1 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-DJeJvBEu.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-DJeJvBEu.js.map +1 -0
- package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js → CommandPalette-FiD4N8XD.js} +2 -2
- package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js.map → CommandPalette-FiD4N8XD.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandSection-DN8KwH-X.js +2 -0
- package/dist/core/web/public/next/assets/CommandSection-DN8KwH-X.js.map +1 -0
- package/dist/core/web/public/next/assets/Composer-ByzxOJK6.css +1 -0
- package/dist/core/web/public/next/assets/Composer.module-C8U73KdQ.js +2 -0
- package/dist/core/web/public/next/assets/{Composer.module-DJMdrqNt.js.map → Composer.module-C8U73KdQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/DiffPane-BAvvbBsf.css +1 -0
- package/dist/core/web/public/next/assets/DiffPane-DLJ3gGGK.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-DLJ3gGGK.js.map +1 -0
- package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js → DiffViewer-B7NWPjIO.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js.map → DiffViewer-B7NWPjIO.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-B4RaYOET.css +1 -0
- package/dist/core/web/public/next/assets/DockHost-DvR-hPhZ.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-DvR-hPhZ.js.map +1 -0
- package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js → EmptyState-DhNgDDrF.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js.map → EmptyState-DhNgDDrF.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js → Epistemic-uARPnx9x.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js.map → Epistemic-uARPnx9x.js.map} +1 -1
- package/dist/core/web/public/next/assets/FleetSection-CFiWeOEs.css +1 -0
- package/dist/core/web/public/next/assets/FleetSection-D_zRBCub.js +3 -0
- package/dist/core/web/public/next/assets/FleetSection-D_zRBCub.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-CL8uHONq.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-CL8uHONq.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-C7k4l_BW.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-C7k4l_BW.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-DwdNSGj8.js +2 -0
- package/dist/core/web/public/next/assets/GrowthSection-DwdNSGj8.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-FPVOqOMN.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-FPVOqOMN.js.map +1 -0
- package/dist/core/web/public/next/assets/{Input-CTu0CycC.js → Input-B9-VLcHS.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-CTu0CycC.js.map → Input-B9-VLcHS.js.map} +1 -1
- package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js → LeaderCard-4R0BhDzT.js} +2 -2
- package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js.map → LeaderCard-4R0BhDzT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MatrixHeatmap-9dKgJ_pT.css → MatrixHeatmap-Bmnvo1l1.css} +1 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-DiuushcS.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-DiuushcS.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-CJ__OJKl.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-1UncWBpW.js.map → McpSection-CJ__OJKl.js.map} +1 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-Cgh5f1-Q.css +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-qWKyJvAQ.js +3 -0
- package/dist/core/web/public/next/assets/{MessageMarkdown-C4pl9LI5.js.map → MessageMarkdown-qWKyJvAQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js → MessageMarkdownRenderer-x05TrsrW.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js.map → MessageMarkdownRenderer-x05TrsrW.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js → Meter-D-hncpkO.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js.map → Meter-D-hncpkO.js.map} +1 -1
- package/dist/core/web/public/next/assets/MindSection-BjXHkQPS.js +2 -0
- package/dist/core/web/public/next/assets/MindSection-BjXHkQPS.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-SkRxqV_I.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-SkRxqV_I.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BpvidnM2.css +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-rSd1ZHAR.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-rSd1ZHAR.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CG-nB1tr.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CG-nB1tr.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-BeDQ1eW3.js +3 -0
- package/dist/core/web/public/next/assets/{NewChatDialog-B_BsS9pr.js.map → NewChatDialog-BeDQ1eW3.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-CkTZtt-m.js +2 -0
- package/dist/core/web/public/next/assets/{OnboardingFlow-CtCPpgoX.js.map → OnboardingFlow-CkTZtt-m.js.map} +1 -1
- package/dist/core/web/public/next/assets/PreviewPane-DoMsJSG3.css +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-kzbbSK4u.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-kzbbSK4u.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-D-t2gPae.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-D-t2gPae.js.map +1 -0
- package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js → RefreshIndicator-BLnr9IOM.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js.map → RefreshIndicator-BLnr9IOM.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js → ResourcePoolConsoleApp-BeG0gBif.js} +4 -4
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js.map → ResourcePoolConsoleApp-BeG0gBif.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-B3Z3O98t.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-BzV6bkIa.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-BzV6bkIa.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-o4ILHdep.js +2 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-o4ILHdep.js.map +1 -0
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js → RouteErrorBoundary-C5SxA2Dg.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js.map → RouteErrorBoundary-C5SxA2Dg.js.map} +1 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-C3LBp7C4.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-C3LBp7C4.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-DpvvbjNm.js +3 -0
- package/dist/core/web/public/next/assets/{SeatSelector-DaUO-zoK.js.map → SeatSelector-DpvvbjNm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js → Segmented-BL40udoO.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js.map → Segmented-BL40udoO.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js → Select-FWLnAw_j.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js.map → Select-FWLnAw_j.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js → SessionInsightChip-CWye87Ju.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js.map → SessionInsightChip-CWye87Ju.js.map} +1 -1
- package/dist/core/web/public/next/assets/SessionSearch-YvCHFUuN.js +2 -0
- package/dist/core/web/public/next/assets/{SessionSearch-B5aQ0BCM.js.map → SessionSearch-YvCHFUuN.js.map} +1 -1
- package/dist/core/web/public/next/assets/SettingsSection-Dr18upeE.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-Dr18upeE.js.map +1 -0
- package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js → Sheet-DZKcQXQg.js} +2 -2
- package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js.map → Sheet-DZKcQXQg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js → ShortcutsOverlay-BpDimdPq.js} +2 -2
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js.map → ShortcutsOverlay-BpDimdPq.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-BRc1vGDF.css +1 -0
- package/dist/core/web/public/next/assets/Sidebar-BoBzBEFX.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-BoBzBEFX.js.map +1 -0
- package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js → Slider-DUMo9HDD.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js.map → Slider-DUMo9HDD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js → StatusBadge-BwnBNFQr.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js.map → StatusBadge-BwnBNFQr.js.map} +1 -1
- package/dist/core/web/public/next/assets/StepBand-PDXMIlRk.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-PDXMIlRk.js.map +1 -0
- package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js → Surface-B3TZVoER.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js.map → Surface-B3TZVoER.js.map} +1 -1
- package/dist/core/web/public/next/assets/Swimlane-DR4OgON_.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-DR4OgON_.js.map +1 -0
- package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js → Switch-CcR5Llk5.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js.map → Switch-CcR5Llk5.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js → Tag-_-K1h7Hk.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js.map → Tag-_-K1h7Hk.js.map} +1 -1
- package/dist/core/web/public/next/assets/TerminalPane-BwfMbnJz.css +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-_1aH4ndN.js +7 -0
- package/dist/core/web/public/next/assets/TerminalPane-_1aH4ndN.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BUsq-inZ.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-DKqAf-eD.js.map → UniverseConsoleApp-BUsq-inZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js → UniverseView-Dogy_dsB.js} +2 -2
- package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js.map → UniverseView-Dogy_dsB.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-DiX_dTyo.js +2 -0
- package/dist/core/web/public/next/assets/UsageSection-DiX_dTyo.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-DsB-Jqyl.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cxqr-3qc.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-WVeyJnW7.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-WVeyJnW7.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +1 -0
- package/dist/core/web/public/next/assets/Workspace-BbxZHwQd.js +10 -0
- package/dist/core/web/public/next/assets/Workspace-BbxZHwQd.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +1 -0
- package/dist/core/web/public/next/assets/actions-s2lfm_5k.js +2 -0
- package/dist/core/web/public/next/assets/actions-s2lfm_5k.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +1 -0
- package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js → budget-queries-wUshcovN.js} +2 -2
- package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js.map → budget-queries-wUshcovN.js.map} +1 -1
- package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js +2 -0
- package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-Bj_9ztzs.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-Bj_9ztzs.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-CMSgAUKn.js +2 -0
- package/dist/core/web/public/next/assets/charts-CMSgAUKn.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-CnV1yaNG.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-CnV1yaNG.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud.module-CiwatLj3.js +2 -0
- package/dist/core/web/public/next/assets/cloud.module-CiwatLj3.js.map +1 -0
- package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js +2 -0
- package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js.map +1 -0
- package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js → command-bus-DqimKCUY.js} +2 -2
- package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js.map → command-bus-DqimKCUY.js.map} +1 -1
- package/dist/core/web/public/next/assets/command-catalog-BdtDH93o.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-BdtDH93o.js.map +1 -0
- package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js → composer-keys-DBRymxQn.js} +2 -2
- package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js.map → composer-keys-DBRymxQn.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-model-Dwd49-dp.js +2 -0
- package/dist/core/web/public/next/assets/context-model-Dwd49-dp.js.map +1 -0
- package/dist/core/web/public/next/assets/context-model-MT17V86_.js +2 -0
- package/dist/core/web/public/next/assets/context-model-MT17V86_.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-xVKIeynP.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-xVKIeynP.js.map +1 -0
- package/dist/core/web/public/next/assets/context.module-BijAfoJw.js +2 -0
- package/dist/core/web/public/next/assets/context.module-BijAfoJw.js.map +1 -0
- package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js → control-queries-DOZR-D8G.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js.map → control-queries-DOZR-D8G.js.map} +1 -1
- package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +2 -0
- package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-8EtARwUm.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-8EtARwUm.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-UKS-mXhr.js +2 -0
- package/dist/core/web/public/next/assets/{dock-panes-BNTLvX7G.js.map → dock-panes-UKS-mXhr.js.map} +1 -1
- package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js → dock-store-BA1cHOYA.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js.map → dock-store-BA1cHOYA.js.map} +1 -1
- package/dist/core/web/public/next/assets/fleet-model-CNe8Wh-s.js +2 -0
- package/dist/core/web/public/next/assets/fleet-model-CNe8Wh-s.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-BSdRlUwJ.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-BSdRlUwJ.js.map +1 -0
- package/dist/core/web/public/next/assets/format-B8DAVcn2.js +2 -0
- package/dist/core/web/public/next/assets/format-B8DAVcn2.js.map +1 -0
- package/dist/core/web/public/next/assets/format-DKrNjdwD.js +2 -0
- package/dist/core/web/public/next/assets/format-DKrNjdwD.js.map +1 -0
- package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js → git-model-CivuBY_D.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js.map → git-model-CivuBY_D.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-Di2PUgj4.js +2 -0
- package/dist/core/web/public/next/assets/global-Di2PUgj4.js.map +1 -0
- package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js → guarded-action-CvOHcqyH.js} +2 -2
- package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js.map → guarded-action-CvOHcqyH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-DWb24OA6.js → icons-B_yuAgdN.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-DWb24OA6.js.map → icons-B_yuAgdN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-afDA8cwW.js → index-oAAq8XJa.js} +3 -3
- package/dist/core/web/public/next/assets/{index-afDA8cwW.js.map → index-oAAq8XJa.js.map} +1 -1
- package/dist/core/web/public/next/assets/live-model-DCw_IFRI.js +2 -0
- package/dist/core/web/public/next/assets/live-model-DCw_IFRI.js.map +1 -0
- package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +2 -0
- package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +1 -0
- package/dist/core/web/public/next/assets/mind-B9PzLcl0.css +1 -0
- package/dist/core/web/public/next/assets/mind.module-vnuJcwvD.js +2 -0
- package/dist/core/web/public/next/assets/mind.module-vnuJcwvD.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-Dpsql5t7.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-C6E10SPX.js.map → mutations-Dpsql5t7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js → overnight-queries-X-44Gsw5.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js.map → overnight-queries-X-44Gsw5.js.map} +1 -1
- package/dist/core/web/public/next/assets/pane-chrome-8JmEhHVD.css +1 -0
- package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js +2 -0
- package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-BDIcUvob.js +1 -0
- package/dist/core/web/public/next/assets/{queries-BuYIEHst.js → queries-BA4rNGD-.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-BuYIEHst.js.map → queries-BA4rNGD-.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js → reasoning-pref-B9-DJUXP.js} +2 -2
- package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js.map → reasoning-pref-B9-DJUXP.js.map} +1 -1
- package/dist/core/web/public/next/assets/seat-subscription-CH6fW4fJ.js +2 -0
- package/dist/core/web/public/next/assets/seat-subscription-CH6fW4fJ.js.map +1 -0
- package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js → section-visibility-qFqc_d4Z.js} +2 -2
- package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js.map → section-visibility-qFqc_d4Z.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js → sidebar-model-M1GaQU5l.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js.map → sidebar-model-M1GaQU5l.js.map} +1 -1
- package/dist/core/web/public/next/assets/slots-Ds9ZIqUL.js +3 -0
- package/dist/core/web/public/next/assets/{slots-W8gkmdfE.js.map → slots-Ds9ZIqUL.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-data-J52iIGMD.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-J52iIGMD.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CgZ-LEJK.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CgZ-LEJK.js.map +1 -0
- package/dist/core/web/public/next/assets/tasks-model-ent8f0jZ.js +2 -0
- package/dist/core/web/public/next/assets/{tasks-model-CnYQzgxk.js.map → tasks-model-ent8f0jZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js → terminal-icons-DJTK7QpR.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js.map → terminal-icons-DJTK7QpR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js → tool-semantics-GX8ScuSH.js} +2 -2
- package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js.map → tool-semantics-GX8ScuSH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js → turn-files-BPHQzYuH.js} +2 -2
- package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js.map → turn-files-BPHQzYuH.js.map} +1 -1
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js +2 -0
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -0
- package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js → usage-queries-Bn8ccqyN.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js.map → usage-queries-Bn8ccqyN.js.map} +1 -1
- package/dist/core/web/public/next/assets/use-guarded-action-C2HlSzkz.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-C2HlSzkz.js.map +1 -0
- package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js → use-ticker-BNc1H4ZC.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js.map → use-ticker-BNc1H4ZC.js.map} +1 -1
- package/dist/core/web/public/next/assets/use-token-gate-B3IJL6bf.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-B3IJL6bf.js.map +1 -0
- package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js → useActivity-Bk3XgXjL.js} +2 -2
- package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js.map → useActivity-Bk3XgXjL.js.map} +1 -1
- package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +1 -0
- package/dist/core/web/public/next/assets/useChartWidth-lZ9PrQn0.js +2 -0
- package/dist/core/web/public/next/assets/useChartWidth-lZ9PrQn0.js.map +1 -0
- package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js → useSeatsRefresh-CG4jczeL.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js.map → useSeatsRefresh-CG4jczeL.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-model-D7NZQFAR.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-D7NZQFAR.js.map +1 -0
- package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js → verse-queries-DvIJcn6Z.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js.map → verse-queries-DvIJcn6Z.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-store-DjBWj04q.js +3 -0
- package/dist/core/web/public/next/assets/verse-store-DjBWj04q.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-ui-store-zafyzXKD.js +3 -0
- package/dist/core/web/public/next/assets/{verse-ui-store-KTTKfv-T.js.map → verse-ui-store-zafyzXKD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js → viewport-BEqGUoTA.js} +2 -2
- package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js.map → viewport-BEqGUoTA.js.map} +1 -1
- package/dist/core/web/public/next/assets/warmup-BR6pxAKs.js +3 -0
- package/dist/core/web/public/next/assets/warmup-BR6pxAKs.js.map +1 -0
- package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js → workspace-model-D_tWD5Wt.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js.map → workspace-model-D_tWD5Wt.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/Advanced-CHjxJt2z.css +0 -1
- package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-CoMngwNB.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-C9BpPVLr.css +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js.map +0 -1
- package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js +0 -2
- package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-wgFP9MUA.css +0 -1
- package/dist/core/web/public/next/assets/ChatSection-B9cdRKUh.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js +0 -2
- package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js.map +0 -1
- package/dist/core/web/public/next/assets/Composer-CkcwbQhG.css +0 -1
- package/dist/core/web/public/next/assets/Composer.module-DJMdrqNt.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-Csboxnn0.css +0 -1
- package/dist/core/web/public/next/assets/DockHost-BGnTgdIb.css +0 -1
- package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js +0 -3
- package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-w9AjqfTR.css +0 -1
- package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js +0 -2
- package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-1UncWBpW.js +0 -2
- package/dist/core/web/public/next/assets/MessageMarkdown-C4pl9LI5.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-Czcl3L_Q.css +0 -1
- package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-SkhvvdLb.css +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-B_BsS9pr.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-CtCPpgoX.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-WQJFjSXe.css +0 -1
- package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-DaUO-zoK.js +0 -3
- package/dist/core/web/public/next/assets/SessionSearch-B5aQ0BCM.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-DfD8MNZt.css +0 -1
- package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js +0 -7
- package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-CmE2QL-Q.css +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-DKqAf-eD.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-DwgNOYvi.css +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-C0V221WL.css +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-DQXMVDf7.css +0 -1
- package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js +0 -10
- package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-Bszsdpms.js +0 -2
- package/dist/core/web/public/next/assets/actions-Bszsdpms.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-Dug8YIf0.css +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-D4NaLaXA.js +0 -2
- package/dist/core/web/public/next/assets/charts-D4NaLaXA.js.map +0 -1
- package/dist/core/web/public/next/assets/colors-B-vHsX1S.js +0 -2
- package/dist/core/web/public/next/assets/colors-B-vHsX1S.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js +0 -2
- package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js.map +0 -1
- package/dist/core/web/public/next/assets/context.module-B_k02HNU.js +0 -2
- package/dist/core/web/public/next/assets/context.module-B_k02HNU.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-BNTLvX7G.js +0 -2
- package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js +0 -2
- package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js.map +0 -1
- package/dist/core/web/public/next/assets/format-BNYWGJat.js +0 -2
- package/dist/core/web/public/next/assets/format-BNYWGJat.js.map +0 -1
- package/dist/core/web/public/next/assets/global-DVgMguLr.js +0 -2
- package/dist/core/web/public/next/assets/global-DVgMguLr.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js +0 -2
- package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js.map +0 -1
- package/dist/core/web/public/next/assets/mind-B-lYfSUJ.css +0 -1
- package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js +0 -2
- package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-C6E10SPX.js +0 -2
- package/dist/core/web/public/next/assets/primitives-DQvYikjm.js +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js +0 -2
- package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-W8gkmdfE.js +0 -3
- package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js.map +0 -1
- package/dist/core/web/public/next/assets/tasks-model-CnYQzgxk.js +0 -2
- package/dist/core/web/public/next/assets/types-Dypu22dp.js +0 -3
- package/dist/core/web/public/next/assets/types-Dypu22dp.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js.map +0 -1
- package/dist/core/web/public/next/assets/useChartWidth-B8E5mJgM.css +0 -1
- package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js +0 -2
- package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-E98kXngO.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-E98kXngO.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js +0 -2
- package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-ui-store-KTTKfv-T.js +0 -3
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MutationTokenDialog-Dn0tzCrh.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/focus-trap.ts","../../../../../../src/web-ui/components/primitives/Dialog.module.css","../../../../../../src/web-ui/components/primitives/Dialog.tsx","../../../../../../src/web-ui/components/auth/MutationTokenDialog.module.css","../../../../../../src/web-ui/components/auth/MutationTokenDialog.tsx"],"sourcesContent":["/**\n * components/primitives/focus-trap.ts — the modal focus contract, extracted\n * from Dialog.tsx so Sheet.tsx (the slide-over overlay) gets exactly the same\n * behavior instead of a second, subtly different implementation:\n *\n * - focus moves into the overlay (or `initialFocusRef`) on open\n * - focus is trapped inside while open (Tab/Shift+Tab wrap)\n * - focus returns to the element that opened it on close\n * - Escape closes\n *\n * Dialog.tsx is unchanged in behavior — it now calls this instead of\n * inlining it. Any future overlay MUST use this rather than hand-rolling a\n * trap (DESIGN.md §3, \"primitives own their accessibility\").\n */\nimport { useEffect, type RefObject } from 'react';\n\nexport const FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\n/** Focusable descendants that are actually rendered (offsetParent is null for hidden nodes). */\nexport function focusableWithin(node: HTMLElement): HTMLElement[] {\n return Array.from(node.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter((el) => el.offsetParent !== null);\n}\n\nexport interface FocusTrapOptions {\n open: boolean;\n containerRef: RefObject<HTMLElement | null>;\n onClose: () => void;\n initialFocusRef?: RefObject<HTMLElement | null>;\n}\n\nexport function useFocusTrap({ open, containerRef, onClose, initialFocusRef }: FocusTrapOptions): void {\n useEffect(() => {\n if (!open) return;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n const target = initialFocusRef?.current ?? containerRef.current;\n target?.focus({ preventScroll: true });\n\n return () => {\n previouslyFocused?.focus?.({ preventScroll: true });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- the refs are refs (stable identity is not the point); only `open` should re-run this.\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.stopPropagation();\n onClose();\n return;\n }\n if (e.key !== 'Tab') return;\n const node = containerRef.current;\n if (!node) return;\n const focusable = focusableWithin(node);\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n document.addEventListener('keydown', onKeyDown, true);\n return () => document.removeEventListener('keydown', onKeyDown, true);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- containerRef is a ref; re-binding on every render would drop in-flight key handling.\n }, [open, onClose]);\n}\n",".backdrop {\n position: fixed;\n inset: 0;\n background: var(--bg-overlay);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 12vh;\n z-index: var(--z-dialog);\n animation: fade var(--duration-fast) var(--ease-standard);\n}\n\n.dialog {\n width: min(480px, calc(100vw - var(--space-8)));\n max-height: 76vh;\n overflow: auto;\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-dialog);\n padding: var(--space-5);\n animation: rise var(--duration-base) var(--ease-decelerate);\n}\n\n.title {\n margin: 0 0 var(--space-4);\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n}\n\n/* Sits between title and body: the title's bottom margin collapses into\n this one's top, so give the pair the same rhythm as a title alone. */\n.description {\n margin: calc(var(--space-4) * -1 + var(--space-1)) 0 var(--space-4);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n@keyframes fade {\n from {\n opacity: 0;\n }\n}\n\n@keyframes rise {\n from {\n opacity: 0;\n transform: translateY(4px);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .backdrop,\n :root:not([data-motion=\"full\"]) .dialog {\n animation: none;\n }\n}\n\n:root[data-motion=\"reduce\"] .backdrop,\n:root[data-motion=\"reduce\"] .dialog {\n animation: none;\n}\n","/**\n * components/primitives/Dialog.tsx — focus-managed modal base. Used by\n * MutationTokenDialog, CommandPalette and the Verse confirm flows so all of\n * them get the same accessible behavior instead of each hand-rolling it:\n *\n * - focus moves to the dialog (or `initialFocusRef`) on open\n * - focus is trapped inside while open (Tab/Shift+Tab wrap)\n * - focus returns to the trigger element on close\n * - Escape closes\n * - a click on the backdrop closes\n *\n * The trap itself lives in ./focus-trap.ts, shared with Sheet.tsx — the\n * behavior here is unchanged, it just stopped being copy-pasteable.\n */\nimport { useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useFocusTrap } from './focus-trap.js';\nimport styles from './Dialog.module.css';\n\nexport interface DialogProps {\n open: boolean;\n onClose: () => void;\n titleId: string;\n title: ReactNode;\n children: ReactNode;\n /** Optional one-line description under the title. */\n description?: ReactNode;\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n widthClassName?: string;\n}\n\nexport function Dialog({\n open,\n onClose,\n titleId,\n title,\n description,\n children,\n initialFocusRef,\n widthClassName,\n}: DialogProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n\n useFocusTrap({ open, containerRef: dialogRef, onClose, initialFocusRef });\n\n if (!open) return null;\n\n return createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\n <div\n ref={dialogRef}\n className={`${styles.dialog} ${widthClassName ?? ''}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n >\n <h2 id={titleId} className={styles.title}>\n {title}\n </h2>\n {description ? <p className={styles.description}>{description}</p> : null}\n {children}\n </div>\n </div>,\n document.body,\n );\n}\n",".body {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n margin-bottom: var(--space-4);\n}\n\n.form {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.label {\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n}\n\n.inputRow {\n display: flex;\n gap: var(--space-2);\n}\n\n.input {\n flex: 1;\n padding: var(--space-3);\n border-radius: var(--radius-md);\n border: 1px solid var(--border-default);\n background: var(--bg-input);\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n min-width: 0;\n}\n\n.input:focus-visible {\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n\n.reveal {\n padding: 0 var(--space-3);\n border-radius: var(--radius-md);\n border: 1px solid var(--border-default);\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n.reveal:hover {\n background: var(--bg-hover);\n}\n\n.error {\n color: var(--status-danger-fg);\n font-size: var(--text-sm-size);\n}\n\n.actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--space-2);\n margin-top: var(--space-3);\n}\n\n.cancel {\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-md);\n color: var(--text-secondary);\n}\n.cancel:hover {\n background: var(--bg-hover);\n}\n\n.submit {\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-md);\n background: var(--accent-500);\n color: var(--text-on-accent);\n font-weight: var(--font-weight-medium);\n}\n.submit:hover:not(:disabled) {\n background: var(--accent-600);\n}\n.submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n","/**\n * components/auth/MutationTokenDialog.tsx — replaces window.prompt() for\n * the mutation token (foundation brief item 5, the \"biggest reason\n * operators abandon the UI for the CLI\" finding). A focus-managed dialog\n * instead of a blocking native prompt, and a session-scoped hold (see\n * auth-store.ts) so approving 12 proposals is one paste, not twelve.\n *\n * The token is NEVER written to localStorage/sessionStorage/cookies — only\n * held in an in-memory module variable in auth-store.ts, cleared on tab\n * close, idle timeout, or the explicit \"Lock\" action here.\n */\nimport { useId, useRef, useState, type FormEvent } from 'react';\nimport { Dialog } from '../primitives/Dialog.js';\nimport { useMutationHold } from '../../data/hooks.js';\nimport styles from './MutationTokenDialog.module.css';\n\nconst TOKEN_RE = /^[a-f0-9]{64}$/;\n\nexport interface MutationTokenDialogProps {\n open: boolean;\n onClose: () => void;\n onUnlocked?: () => void;\n /** Human context for why the token is being requested right now. */\n reason?: string;\n /** Scoped consoles can name their own startup token without changing the hold. */\n tokenLabel?: string;\n tokenHelp?: string;\n}\n\nexport function MutationTokenDialog({ open, onClose, onUnlocked, reason, tokenLabel = 'Mutation token',\n tokenHelp = 'the mutation token ashlr serve printed' }: MutationTokenDialogProps) {\n const { setToken } = useMutationHold();\n const [value, setValue] = useState('');\n const [reveal, setReveal] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const titleId = useId();\n const inputId = useId();\n\n function submit(e: FormEvent) {\n e.preventDefault();\n const trimmed = value.trim();\n if (!TOKEN_RE.test(trimmed)) {\n setError(`Expected 64 hex characters — ${tokenHelp}.`);\n return;\n }\n setToken(trimmed);\n setValue('');\n setError(null);\n onClose();\n onUnlocked?.();\n }\n\n return (\n <Dialog open={open} onClose={onClose} titleId={titleId} title=\"Unlock actions\" initialFocusRef={inputRef}>\n <p className={styles.body}>\n {reason ?? 'This action mutates the fleet and requires the dispatch token.'} It is held in\n memory only, for this browser tab, and is cleared automatically after 20 minutes idle.\n </p>\n <form onSubmit={submit} className={styles.form} noValidate>\n <label htmlFor={inputId} className={styles.label}>\n {tokenLabel}\n </label>\n <div className={styles.inputRow}>\n <input\n ref={inputRef}\n id={inputId}\n type={reveal ? 'text' : 'password'}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n className={styles.input}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n aria-invalid={error ? true : undefined}\n placeholder=\"64 hex characters\"\n />\n <button\n type=\"button\"\n className={styles.reveal}\n onClick={() => setReveal((r) => !r)}\n aria-pressed={reveal}\n >\n {reveal ? 'Hide' : 'Show'}\n </button>\n </div>\n {error ? (\n <p className={styles.error} role=\"alert\">\n {error}\n </p>\n ) : null}\n <div className={styles.actions}>\n <button type=\"button\" className={styles.cancel} onClick={onClose}>\n Cancel\n </button>\n <button type=\"submit\" className={styles.submit} disabled={value.trim().length === 0}>\n Unlock\n </button>\n </div>\n </form>\n </Dialog>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,i as t,n,s as r}from"./index-afDA8cwW.js";import{D as i,P as a,a as o,at as s,c,it as l,k as u,m as ee,o as d,s as f,u as p}from"./global-DVgMguLr.js";import{r as m,t as h}from"./MutationTokenDialog-Dn0tzCrh.js";import{t as te}from"./Epistemic-BLjM5y_y.js";import{n as g}from"./StatusBadge-DAf-ArKE.js";import{h as _}from"./queries-BuYIEHst.js";import{r as v,t as y}from"./mutations-C6E10SPX.js";import{i as b,r as x}from"./RouteErrorBoundary-AyUPCIb3.js";import{t as S}from"./RefreshIndicator-CnhEovMZ.js";import{t as C}from"./DiffViewer-tOGWk0CA.js";import{l as w}from"./command-catalog-s3W6Z96D.js";import{b as T,i as E,n as D}from"./workbench-types-DzN-5trg.js";import{i as O,n as k,r as A}from"./guarded-action-vOPc8v75.js";import{n as j}from"./viewport-ZB86jdES.js";import{C as M,S as N,b as P,g as F,r as I,s as L,t as R}from"./verse-ui-store-KTTKfv-T.js";import{x as ne}from"./verse-queries-BjQoOTwv.js";import{i as re,r as ie}from"./useActivity-Cg_9-7nt.js";import{T as ae,l as oe}from"./icons-DWb24OA6.js";import{o as se,p as ce}from"./VerseConsoleApp-bjARLPwN.js";import{n as le,t as z}from"./Button-0-nNbv1h.js";var B=r(e(),1),ue=r(t(),1),V={all:`All`,approvals:`Approvals`,fleet:`Fleet`,chats:`Chats`,accounts:`Accounts`},H={all:[`approvals`,`authority`,`fleet`,`leader`,`chats`,`accounts`],approvals:[`approvals`,`fleet`,`leader`],fleet:[`authority`,`fleet`,`leader`],chats:[`chats`],accounts:[`accounts`]},U={approvals:`the approvals inbox`,authority:`the autonomy grant`,fleet:`the fleet`,leader:`the Leader`,chats:`chats`,accounts:`account health`};function de(e,t){return t===`all`?[...e]:e.filter(e=>E[e.kind]===t)}function fe(e){let t={all:e.length,approvals:0,fleet:0,chats:0,accounts:0};for(let n of e)t[E[n.kind]]+=1;return t}function pe(e,t){let n=[];for(let r of H[t]){let t=e?.[r]??`unavailable`;t!==`ok`&&n.push({source:r,name:U[r],state:t})}return{vouched:n.length===0,silent:n}}function me(e){let t=e.silent.map(e=>e.state===`error`?`${e.name} failed to answer`:`${e.name} isn't reporting in this build`);return t.length===0?``:t.length===1?W(t[0]):W(`${t.slice(0,-1).join(`, `)} and ${t[t.length-1]}`)}function W(e){return e.charAt(0).toUpperCase()+e.slice(1)}var G=new Set([`approve`,`reject`,`veto`]);function he(e,t){return e.actions.find(e=>e.kind===t)??null}var K={approve:{title:`Approve this?`,confirmLabel:`Approve`},reject:{title:`Reject this?`,confirmLabel:`Reject`},veto:{title:`Veto this action?`,confirmLabel:`Veto`}};function ge(e,t){if(t.confirm)return t.confirm;if(t.kind===`approve`||t.kind===`reject`||t.kind===`veto`){let n=K[t.kind];return{title:n.title,body:e.title,confirmLabel:n.confirmLabel}}return null}function q(e,t=Date.now()){let n=Date.parse(e);if(!Number.isFinite(n))return`—`;let r=Math.max(0,Math.round((t-n)/1e3));if(r<45)return`just now`;let i=Math.round(r/60);if(i<60)return`${i}m ago`;let a=Math.round(i/60);return a<36?`${a}h ago`:`${Math.round(a/24)}d ago`}function J(e,t=Date.now()){let n=Date.parse(e);if(!Number.isFinite(n))return`—`;let r=Math.round((n-t)/1e3);if(r<=0)return`expired`;if(r<90)return`in ${r}s`;let i=Math.round(r/60);if(i<90)return`in ${i}m`;let a=Math.round(i/60);return a<48?`in ${a}h`:`in ${Math.round(a/24)}d`}function _e(e,t){let n=t||`the target repository`;switch(e){case`pr`:return`Pushes a branch to ${n}'s remote and opens a real pull request. Other people can see it immediately, and this dialog cannot undo it.`;case`patch`:return`Writes the diff to ${n} on disk now. Nothing is pushed, but the working tree changes.`;default:return`Applies this ${String(e)} proposal to ${n} now.`}}function ve(e){return e===`pr`}function ye(e){return e.engineModel?e.engineModel:e.engineTier?e.engineTier:null}var Y={layout:`_layout_1e5d8_8`,listPane:`_listPane_1e5d8_9`,detailPane:`_detailPane_1e5d8_10`,filters:`_filters_1e5d8_12`,filterField:`_filterField_1e5d8_13`,filterLabel:`_filterLabel_1e5d8_14`,filterSelect:`_filterSelect_1e5d8_31`,count:`_count_1e5d8_46`,rows:`_rows_1e5d8_48`,row:`_row_1e5d8_48`,rowActive:`_rowActive_1e5d8_63`,riskRule:`_riskRule_1e5d8_68`,rowTitle:`_rowTitle_1e5d8_72`,rowMeta:`_rowMeta_1e5d8_73`,rowMetaMono:`_rowMetaMono_1e5d8_82`,rowAge:`_rowAge_1e5d8_83`,riskWord:`_riskWord_1e5d8_84`,detail:`_detail_1e5d8_10`,detailHead:`_detailHead_1e5d8_91`,detailTitle:`_detailTitle_1e5d8_92`,detailMeta:`_detailMeta_1e5d8_93`,summary:`_summary_1e5d8_95`,block:`_block_1e5d8_97`,blockTitle:`_blockTitle_1e5d8_98`,defs:`_defs_1e5d8_107`,muted:`_muted_1e5d8_111`,failedChecks:`_failedChecks_1e5d8_112`,actions:`_actions_1e5d8_114`,actionNote:`_actionNote_1e5d8_115`,reject:`_reject_1e5d8_116`,approve:`_approve_1e5d8_117`,decided:`_decided_1e5d8_133`,empty:`_empty_1e5d8_135`,emptyStrong:`_emptyStrong_1e5d8_136`,error:`_error_1e5d8_137`,skeletons:`_skeletons_1e5d8_138`},X=n(),be={"judge-ship-would-merge":{label:`Ship (would merge)`,tone:`success`},"judge-ship-review-required":{label:`Ship (review required)`,tone:`success`},"judge-review":{label:`Review`,tone:`warning`},"judge-noise":{label:`Noise`,tone:`neutral`},"judge-harmful":{label:`Harmful`,tone:`danger`},"judge-verdict-unrecognized":{label:`Unrecognized verdict`,tone:`unknown`},"judge-parse-failure":{label:`Judge parse failure — not a review`,tone:`unknown`},"judge-network-failure":{label:`Judge network failure — not a review`,tone:`unknown`}};function xe(e){let t=e.filter(e=>e.action===`judged`&&e.judgeReasonCode);return t.length===0?null:t.reduce((e,t)=>Date.parse(t.ts)>Date.parse(e.ts)?t:e)}function Se({id:e,dispatchEnabled:t,onDispatchDisabled:n,onDecided:r}){let i=ee(_(e)),[a,s]=(0,B.useState)(null),[l,d]=(0,B.useState)(!1),[f,p]=(0,B.useState)(!1),[m,x]=(0,B.useState)(!1),[w,T]=(0,B.useState)(null);function E(e){T(null),s(e),p(!0)}function D(){d(!1),u()?(p(!0),A()):s(null)}function O(){if(a){if(!u()){p(!1),d(!0);return}A()}}async function A(){if(a){x(!0),T(null);try{a===`approve`?await y(e):await v(e),p(!1),s(null),r()}catch(e){e instanceof c?(p(!1),s(null),n()):T(k(e))}finally{x(!1)}}}if(i.status===`loading`)return(0,X.jsxs)(`div`,{className:Y.detail,children:[(0,X.jsx)(o,{width:`55%`}),(0,X.jsx)(o,{width:`30%`}),(0,X.jsx)(o,{width:`88%`})]});if(i.status===`error`||!i.data)return(0,X.jsx)(`p`,{className:Y.error,role:`alert`,children:i.error?.message??`Could not load this proposal.`});let j=i.data,M=j.decisionEvidence,N=xe(M?.decisions??[]),P=N?.judgeReasonCode?be[N.judgeReasonCode]:null,F=j.status===`pending`&&t,I=ye(j),L=_e(j.kind,j.repo);return(0,X.jsxs)(`div`,{className:Y.detail,children:[(0,X.jsxs)(`header`,{className:Y.detailHead,children:[(0,X.jsx)(`h3`,{className:Y.detailTitle,children:j.title}),(0,X.jsxs)(`div`,{className:Y.detailMeta,children:[(0,X.jsx)(g,{status:j.status}),(0,X.jsx)(`span`,{children:j.kind}),(0,X.jsx)(`code`,{title:j.repo??void 0,children:j.repo??`no repo`}),(0,X.jsx)(`span`,{children:j.riskClass?`${j.riskClass} risk`:`risk unstated`}),I?(0,X.jsx)(`code`,{children:I}):null,(0,X.jsxs)(`span`,{children:[`created `,q(j.createdAt)]}),j.decidedAt?(0,X.jsxs)(`span`,{children:[`decided `,q(j.decidedAt)]}):null,i.status===`refreshing`?(0,X.jsx)(S,{}):null]}),j.summary?(0,X.jsx)(`p`,{className:Y.summary,children:j.summary}):null]}),(0,X.jsxs)(`section`,{className:Y.block,"aria-label":`Evidence`,children:[(0,X.jsx)(`h4`,{className:Y.blockTitle,children:`Evidence`}),(0,X.jsxs)(`dl`,{className:Y.defs,children:[(0,X.jsx)(`dt`,{children:`Judge verdict`}),(0,X.jsx)(`dd`,{children:(0,X.jsx)(te,{quality:M?.sourceQuality,label:`judge verdict`,children:P&&N?.judgeReasonCode?(0,X.jsx)(g,{status:N.judgeReasonCode,tone:P.tone,children:P.label}):(0,X.jsx)(`span`,{className:Y.muted,children:`not yet judged`})})}),(0,X.jsx)(`dt`,{children:`Verification`}),(0,X.jsx)(`dd`,{children:j.verifyResult?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(g,{status:j.verifyResult.passed?`success`:`failed`,children:j.verifyResult.passed?`passed`:`failed`}),j.verifyResult.ran&&j.verifyResult.ran.length>0?(0,X.jsxs)(`span`,{className:Y.muted,children:[` · ran `,j.verifyResult.ran.map(e=>e.kind).join(`, `)]}):null,!j.verifyResult.passed&&j.verifyResult.failureCategory&&j.verifyResult.failureCategory!==`code`?(0,X.jsxs)(`span`,{className:Y.muted,children:[` · `,j.verifyResult.failureCategory,` failure — the verifier itself, not the diff`]}):null,j.verifyResult.failed&&j.verifyResult.failed.length>0?(0,X.jsxs)(`p`,{className:Y.failedChecks,children:[`failed: `,j.verifyResult.failed.join(`, `)]}):null]}):(0,X.jsx)(`span`,{className:Y.muted,children:`not verified`})}),j.decisionReason?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`dt`,{children:`Decision reason`}),(0,X.jsx)(`dd`,{children:j.decisionReason})]}):null,j.evidenceOutcome?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`dt`,{children:`Gates`}),(0,X.jsxs)(`dd`,{className:Y.muted,children:[j.evidenceOutcome.gateCount??0,` gate`,j.evidenceOutcome.gateCount===1?``:`s`,j.evidenceOutcome.policyAction?` · policy ${j.evidenceOutcome.policyAction}`:``,j.evidenceOutcome.trustBasis?` · trust ${j.evidenceOutcome.trustBasis}`:``]})]}):null,j.result?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`dt`,{children:`Result`}),(0,X.jsx)(`dd`,{children:j.result})]}):null]})]}),(0,X.jsxs)(`section`,{className:Y.block,"aria-label":`Provenance`,children:[(0,X.jsx)(`h4`,{className:Y.blockTitle,children:`Provenance`}),(0,X.jsxs)(`dl`,{className:Y.defs,children:[(0,X.jsx)(`dt`,{children:`Produced by`}),(0,X.jsx)(`dd`,{children:I?(0,X.jsx)(`code`,{children:I}):(0,X.jsx)(`span`,{className:Y.muted,children:`unknown engine`})}),(0,X.jsx)(`dt`,{children:`Origin`}),(0,X.jsx)(`dd`,{children:j.origin}),j.workItemId?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`dt`,{children:`Work item`}),(0,X.jsx)(`dd`,{children:(0,X.jsx)(`code`,{children:j.workItemId})})]}):null,j.runId?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`dt`,{children:`Run`}),(0,X.jsx)(`dd`,{children:(0,X.jsx)(`code`,{children:j.runId})})]}):null,(0,X.jsx)(`dt`,{children:`Attestation`}),(0,X.jsxs)(`dd`,{className:Y.muted,children:[j.producerProvenanceSig?`signed by the sandboxed producer (v${j.producerProvenanceVersion??2})`:j.provenanceSig?`legacy signature present`:`unsigned — earns no positive routing credit`,j.diffHash?` · diff hashed at signing time`:``]})]})]}),(0,X.jsxs)(`section`,{className:Y.block,"aria-label":`Diff`,children:[(0,X.jsx)(`h4`,{className:Y.blockTitle,children:`Diff`}),(0,X.jsx)(C,{diff:j.diff,proposalKind:j.kind})]}),j.status===`pending`?(0,X.jsxs)(`footer`,{className:Y.actions,children:[(0,X.jsx)(`p`,{className:Y.actionNote,children:t?L:`Read-only session — approve and reject are unavailable without dispatch.`}),w&&!f?(0,X.jsx)(`p`,{className:Y.error,role:`alert`,children:w}):null,(0,X.jsx)(`button`,{type:`button`,className:Y.reject,disabled:!F||m,onClick:()=>E(`reject`),children:`Reject`}),(0,X.jsx)(`button`,{type:`button`,className:Y.approve,disabled:!F||m,onClick:()=>E(`approve`),children:`Approve…`})]}):(0,X.jsxs)(`footer`,{className:Y.decided,children:[`This proposal is already `,(0,X.jsx)(`strong`,{children:j.status}),` — no further action is available.`]}),(0,X.jsx)(h,{open:l,onClose:D,reason:a===`approve`?`Approving a proposal writes to a real repository and requires the dispatch token.`:`Rejecting a proposal requires the dispatch token.`,tokenHelp:`the mutation token ashlr verse printed`}),(0,X.jsx)(b,{open:f,onClose:()=>{p(!1),s(null),T(null)},title:a===`approve`?`Approve this ${j.kind} against ${j.repo?j.repo.split(`/`).pop():`the repository`}?`:`Reject this proposal?`,body:a===`approve`?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`strong`,{children:j.title}),(0,X.jsx)(`br`,{}),`Kind `,(0,X.jsx)(`strong`,{children:j.kind}),` · repository `,(0,X.jsx)(`code`,{children:j.repo??`unknown`}),(0,X.jsx)(`br`,{}),(0,X.jsx)(`br`,{}),L,ve(j.kind)?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`br`,{}),(0,X.jsx)(`br`,{}),`This one leaves your machine.`]}):null]}):(0,X.jsxs)(X.Fragment,{children:[`This rejects `,(0,X.jsx)(`strong`,{children:j.title}),` and discards it. It stays in history as rejected and is never applied.`]}),confirmLabel:a===`approve`?`Approve and ${ve(j.kind)?`open the pull request`:`apply`}`:`Reject`,destructive:a===`approve`,busy:m,error:w,onConfirm:O})]})}var Z=new Map,Q=new Set;function Ce(){for(let e of[...Q])e()}function we(e,t=Date.now()){Z=new Map(Z).set(e,t),Ce()}function Te(e,t=Date.now()){let n=!1,r=new Map(Z);for(let[i,a]of r)(!e.has(i)||t-a>6e4)&&(r.delete(i),n=!0);n&&(Z=r,Ce())}function Ee(){return(0,B.useSyncExternalStore)(e=>(Q.add(e),()=>Q.delete(e)),()=>Z,()=>Z)}function De(e){we(e.id),e.source===`approvals`&&(l(`inbox`),l(`dashboard-snapshot`),s(`inbox-list:`),e.target.kind===`approval`&&l(`proposal-detail-${e.target.proposalId}`)),ie()}function Oe(e,t,n){let r=t.request;if(!r){n.openTarget(e);return}if(!T(r.path)){n.toast(`That action points outside this app and was not sent.`,`danger`);return}let o=ge(e,t),s=async()=>{let e=i();if(!e)throw new f(`Mutation token was rejected.`,401,r.path);await p(r.path,r.body,e),a()},c=G.has(t.kind)||o!==null;O({title:o?.title??t.label,body:o?.body??e.title,confirmLabel:o?.confirmLabel??t.label,destructive:t.destructive,token:!0,tokenReason:`${t.label} changes state on this machine and requires the dispatch token.`,skipConfirm:!c,run:s,onDone:()=>{De(e),n.toast(`${t.label}: ${e.title}`,`success`)},onError:c?void 0:e=>n.toast(e,`danger`)})}var $={backdrop:`_backdrop_1088p_4`,fade:`_fade_1088p_1`,panel:`_panel_1088p_14`,slide:`_slide_1088p_1`,rise:`_rise_1088p_1`,head:`_head_1088p_33`,title:`_title_1088p_43`,titleCount:`_titleCount_1088p_54`,splits:`_splits_1088p_62`,split:`_split_1088p_62`,splitCount:`_splitCount_1088p_86`,body:`_body_1088p_98`,rows:`_rows_1088p_106`,row:`_row_1088p_106`,rule:`_rule_1088p_125`,rowMain:`_rowMain_1088p_133`,rowTitle:`_rowTitle_1088p_135`,rowMeta:`_rowMeta_1088p_144`,severity:`_severity_1088p_153`,mono:`_mono_1088p_162`,deadline:`_deadline_1088p_163`,rowKeys:`_rowKeys_1088p_165`,key:`_key_1088p_167`,inlineKey:`_inlineKey_1088p_168`,loading:`_loading_1088p_184`,empty:`_empty_1088p_186`,emptyTitle:`_emptyTitle_1088p_194`,emptyBody:`_emptyBody_1088p_201`,clearMark:`_clearMark_1088p_209`,focusSink:`_focusSink_1088p_229`,detail:`_detail_1088p_231`,back:`_back_1088p_4`,approval:`_approval_1088p_245`,item:`_item_1088p_247`,itemTitle:`_itemTitle_1088p_249`,itemDetail:`_itemDetail_1088p_257`,defs:`_defs_1088p_264`,itemActions:`_itemActions_1088p_275`,foot:`_foot_1088p_277`,caveat:`_caveat_1088p_289`},ke={high:`Urgent`,warn:`Soon`,info:`When you can`},Ae={approvals:`Approval`,authority:`Autonomy`,fleet:`Fleet`,leader:`Leader`,chats:`Chat`,accounts:`Account`},je=(0,B.forwardRef)(function({items:e,selectedId:t,onSelect:n,onOpen:r,now:i,label:a},o){let s=`verse-needs-you-list`,c=(0,B.useRef)(null);return(0,B.useEffect)(()=>{t&&[...c.current?.querySelectorAll(`[data-item-id]`)??[]].find(e=>e.dataset.itemId===t)?.scrollIntoView?.({block:`nearest`})},[t]),(0,X.jsx)(`div`,{ref:e=>{c.current=e,typeof o==`function`?o(e):o&&(o.current=e)},id:s,role:`listbox`,"aria-label":a,tabIndex:0,"aria-activedescendant":t?`${s}-${e.findIndex(e=>e.id===t)}`:void 0,className:$.rows,children:e.map((e,a)=>{let o=e.actions.map(e=>D[e.kind]).filter(e=>e!==void 0);return(0,X.jsxs)(`div`,{id:`${s}-${a}`,"data-item-id":e.id,role:`option`,"aria-selected":e.id===t,className:$.row,"data-severity":e.severity,onClick:()=>r(e.id),onMouseMove:()=>e.id!==t&&n(e.id),children:[(0,X.jsx)(`span`,{className:$.rule,"aria-hidden":`true`}),(0,X.jsxs)(`span`,{className:$.rowMain,children:[(0,X.jsx)(`span`,{className:$.rowTitle,children:e.title}),(0,X.jsxs)(`span`,{className:$.rowMeta,children:[(0,X.jsx)(`span`,{className:$.severity,"data-severity":e.severity,children:ke[e.severity]}),(0,X.jsx)(`span`,{children:Ae[e.source]}),e.subject.repo?(0,X.jsx)(`span`,{className:$.mono,children:e.subject.repo}):null,e.subject.pr?(0,X.jsxs)(`span`,{children:[`#`,e.subject.pr]}):null,(0,X.jsx)(`span`,{children:q(e.since,i)}),e.expiresAt?(0,X.jsxs)(`span`,{className:$.deadline,children:[`closes `,J(e.expiresAt,i)]}):null]})]}),e.id===t&&o.length>0?(0,X.jsx)(`span`,{className:$.rowKeys,"aria-hidden":`true`,children:o.map(e=>(0,X.jsx)(`kbd`,{className:$.key,children:e},e))}):null]},e.id)})})}),Me={"drawer.approve":`approve`,"drawer.reject":`reject`,"drawer.veto":`veto`,"drawer.done":`done`};function Ne(e){return e instanceof HTMLElement?e.isContentEditable||/^(INPUT|TEXTAREA|SELECT)$/.test(e.tagName):!1}function Pe(){let e=ce(),t=re(),n=x(),r=ee(ne),{compact:i}=j(),a=Ee(),o=(0,B.useId)(),s=(0,B.useRef)(null),c=(0,B.useRef)(null),l=(0,B.useRef)(null),[u,f]=(0,B.useState)(null),[p,h]=(0,B.useState)(null),[te,g]=(0,B.useState)(!1),[_,v]=(0,B.useState)(()=>Date.now());(0,B.useEffect)(()=>{let e=setInterval(()=>v(Date.now()),15e3);return()=>clearInterval(e)},[]);let y=t.data,b=y?.needsYou;(0,B.useEffect)(()=>{b&&Te(new Set(b.map(e=>e.id)))},[b]);let S=(0,B.useMemo)(()=>(b??[]).filter(e=>!a.has(e.id)),[b,a]),C=e.needsYouSplit,T=(0,B.useMemo)(()=>de(S,C),[S,C]),E=(0,B.useMemo)(()=>fe(S),[S]),D=pe(y?.sources??null,C),O=(r.data?.dispatchEnabled??!0)&&!te,k=e.needsYouFocus;(0,B.useEffect)(()=>{if(!k)return;let e=S.find(e=>e.id===k);e&&(f(e.id),h(e.id))},[k,S]),(0,B.useEffect)(()=>{if(T.length===0){u!==null&&f(null);return}(!u||!T.some(e=>e.id===u))&&f(T[0].id)},[T,u]);let P=p?S.find(e=>e.id===p)??null:null;(0,B.useEffect)(()=>{p&&!P&&h(null)},[p,P]);let I=(0,B.useCallback)(()=>h(null),[]),oe=(0,B.useCallback)(()=>{A()||document.querySelector(`[aria-modal="true"]:not([data-verse-overlay])`)||(p?I():L())},[p,I]);m({open:!0,containerRef:s,onClose:oe,initialFocusRef:c});let z=(0,B.useRef)(!1);(0,B.useEffect)(()=>{p?(z.current=!0,l.current?.focus({preventScroll:!0})):z.current&&(z.current=!1,c.current?.focus({preventScroll:!0}))},[p]);let H=T.length>0;(0,B.useEffect)(()=>{if(!H||p)return;let e=document.activeElement;(e===null||e===document.body||e===s.current)&&c.current?.focus({preventScroll:!0})},[H,p]);let U=(0,B.useCallback)(e=>{let t=e.target;switch(t.kind){case`approval`:f(e.id),h(e.id);return;case`session`:L(),F(t.sessionId);return;case`section`:L(),M(t.section,t.anchor);return;case`seat`:L(),M(`apps`,`seat:${t.seatId}`);return;case`url`:window.open(t.url,`_blank`,`noopener,noreferrer`);return;default:return}},[]),W=(0,B.useCallback)((e,t)=>{let r=he(e,t);if(!r){n.show(`Nothing to ${t} on this item.`,`neutral`);return}if(!O&&r.request){n.show("This server was started without dispatch — run `ashlr verse` to act.",`neutral`);return}Oe(e,r,{openTarget:U,toast:n.show})},[O,U,n]);function G(e){if(T.length===0)return;let t=Math.max(0,T.findIndex(e=>e.id===u)),n=T[(t+e+T.length)%T.length];f(n.id),p&&h(n.id)}function K(e){let t=R.indexOf(C),n=R[(t+e+R.length)%R.length];N(n),h(null)}function ge(e){if(e.defaultPrevented||Ne(e.target)||!(e.target instanceof Node)||!s.current?.contains(e.target))return;let t=w(e.nativeEvent,[`drawer`]);if(!t||t.id===`drawer.open`&&e.target instanceof HTMLButtonElement)return;e.preventDefault(),e.stopPropagation();let n=T.find(e=>e.id===(p??u))??null;switch(t.id){case`drawer.next`:G(1);return;case`drawer.prev`:G(-1);return;case`drawer.split-next`:K(1);return;case`drawer.split-prev`:K(-1);return;case`drawer.open`:n&&h(n.id);return;default:{let e=Me[t.id];e&&n&&W(n,e)}}}let q=!y&&(t.status===`loading`||t.status===`idle`),J=!y&&t.status===`unavailable`;return(0,ue.createPortal)((0,X.jsx)(`div`,{className:$.backdrop,onMouseDown:e=>e.target===e.currentTarget&&L(),children:(0,X.jsxs)(`div`,{ref:s,role:`dialog`,"aria-modal":`true`,"aria-labelledby":o,className:$.panel,"data-presentation":i?`full`:`side`,"data-verse-overlay":`needs-you`,"data-scope":`drawer`,tabIndex:-1,onKeyDown:ge,children:[(0,X.jsxs)(`header`,{className:$.head,children:[(0,X.jsxs)(`h2`,{id:o,className:$.title,children:[`Needs you`,y?(0,X.jsx)(`span`,{className:$.titleCount,children:E.all}):null]}),(0,X.jsx)(le,{variant:`ghost`,size:`sm`,icon:(0,X.jsx)(ae,{}),"aria-label":`Close Needs you`,onClick:L})]}),(0,X.jsx)(`div`,{role:`tablist`,"aria-label":`Splits`,className:$.splits,onKeyDown:e=>{(e.key===`ArrowRight`||e.key===`ArrowLeft`)&&(e.preventDefault(),K(e.key===`ArrowRight`?1:-1))},children:R.map(e=>(0,X.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":e===C,tabIndex:e===C?0:-1,className:$.split,onClick:()=>{N(e),h(null)},children:[V[e],(0,X.jsx)(`span`,{className:$.splitCount,"aria-label":`${E[e]} items`,children:E[e]})]},e))}),(0,X.jsxs)(`div`,{className:$.body,children:[P?(0,X.jsxs)(`div`,{ref:l,className:$.detail,tabIndex:-1,"aria-label":`Item detail`,children:[(0,X.jsxs)(`button`,{type:`button`,className:$.back,onClick:I,children:[`‹ All `,V[C].toLowerCase()]}),P.target.kind===`approval`?(0,X.jsx)(`div`,{className:$.approval,children:(0,X.jsx)(Se,{id:P.target.proposalId,dispatchEnabled:O,onDispatchDisabled:()=>g(!0),onDecided:()=>{we(P.id),ie(),I()}},P.target.proposalId)}):(0,X.jsx)(Le,{item:P,now:_,onAct:W,onOpenTarget:U,dispatchEnabled:O})]}):q?(0,X.jsxs)(`div`,{className:$.loading,role:`status`,"aria-label":`Loading`,children:[(0,X.jsx)(d,{}),(0,X.jsx)(d,{}),(0,X.jsx)(d,{})]}):J?(0,X.jsxs)(`div`,{className:$.empty,children:[(0,X.jsx)(`p`,{className:$.emptyTitle,children:`Needs you isn't available on this server`}),(0,X.jsx)(`p`,{className:$.emptyBody,children:`This build does not report activity yet, so nothing here can be vouched for. Approvals still work from the inbox.`})]}):T.length===0?(0,X.jsx)(Fe,{coverageText:me(D),vouched:D.vouched,autonomyLabel:y?.autonomy?.label??null,split:C}):(0,X.jsx)(je,{ref:c,items:T,selectedId:u,onSelect:f,onOpen:e=>{f(e),h(e)},now:_,label:`${V[C]} needing you`}),T.length===0&&!P?(0,X.jsx)(`div`,{ref:c,tabIndex:-1,className:$.focusSink,"aria-hidden":`true`}):null]}),i?null:(0,X.jsxs)(`footer`,{className:$.foot,"aria-hidden":`true`,children:[(0,X.jsxs)(`span`,{children:[(0,X.jsx)(`kbd`,{className:$.key,children:`J`}),(0,X.jsx)(`kbd`,{className:$.key,children:`K`}),` move`]}),(0,X.jsxs)(`span`,{children:[(0,X.jsx)(`kbd`,{className:$.key,children:(0,X.jsx)(se,{})}),` open`]}),(0,X.jsxs)(`span`,{children:[(0,X.jsx)(`kbd`,{className:$.key,children:`A`}),` approve`]}),(0,X.jsxs)(`span`,{children:[(0,X.jsx)(`kbd`,{className:$.key,children:`R`}),` reject`]}),(0,X.jsxs)(`span`,{children:[(0,X.jsx)(`kbd`,{className:$.key,children:`V`}),` veto`]}),(0,X.jsxs)(`span`,{children:[(0,X.jsx)(`kbd`,{className:$.key,children:`E`}),` done`]}),(0,X.jsxs)(`span`,{children:[(0,X.jsx)(`kbd`,{className:$.key,children:`H`}),(0,X.jsx)(`kbd`,{className:$.key,children:`L`}),` splits`]})]}),!D.vouched&&T.length>0?(0,X.jsxs)(`p`,{className:$.caveat,role:`note`,children:[me(D),` — this list may be incomplete.`]}):null]})}),document.body)}function Fe({vouched:e,coverageText:t,autonomyLabel:n,split:r}){return e?(0,X.jsxs)(`div`,{className:$.empty,"data-state":`clear`,children:[(0,X.jsx)(`span`,{className:$.clearMark,"aria-hidden":`true`}),(0,X.jsx)(`p`,{className:$.emptyTitle,children:`All clear`}),(0,X.jsx)(`p`,{className:$.emptyBody,children:n?`Fleet: ${n}.`:`Nothing is waiting on you.`})]}):(0,X.jsxs)(`div`,{className:$.empty,"data-state":`unknown`,children:[(0,X.jsxs)(`p`,{className:$.emptyTitle,children:[`Nothing to show`,r===`all`?``:` in ${V[r]}`,` — but it isn't an all-clear`]}),(0,X.jsxs)(`p`,{className:$.emptyBody,children:[t,`.`]})]})}var Ie=e=>{switch(e.target.kind){case`session`:return`Open chat`;case`section`:return`Open ${P(e.target.section).label}`;case`seat`:return`Open Apps & Accounts`;case`url`:return`Open on GitHub`;default:return null}};function Le({item:e,now:t,onAct:n,onOpenTarget:r,dispatchEnabled:i}){let a=Ie(e);return(0,X.jsxs)(`article`,{className:$.item,children:[(0,X.jsx)(`h3`,{className:$.itemTitle,children:e.title}),e.detail?(0,X.jsx)(`p`,{className:$.itemDetail,children:e.detail}):null,(0,X.jsxs)(`dl`,{className:$.defs,children:[e.subject.repo?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`dt`,{children:`Repo`}),(0,X.jsx)(`dd`,{className:$.mono,children:e.subject.repo})]}):null,e.subject.pr?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`dt`,{children:`Pull request`}),(0,X.jsxs)(`dd`,{children:[`#`,e.subject.pr]})]}):null,e.subject.seatId?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`dt`,{children:`Seat`}),(0,X.jsx)(`dd`,{className:$.mono,children:e.subject.seatId})]}):null,(0,X.jsx)(`dt`,{children:`Waiting`}),(0,X.jsxs)(`dd`,{children:[`since `,q(e.since,t)]}),e.expiresAt?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`dt`,{children:`Closes`}),(0,X.jsx)(`dd`,{className:$.deadline,children:J(e.expiresAt,t)})]}):null]}),(0,X.jsxs)(`div`,{className:$.itemActions,children:[a?(0,X.jsx)(z,{variant:`subtle`,size:`sm`,onClick:()=>r(e),trailingIcon:e.target.kind===`url`?(0,X.jsx)(oe,{}):void 0,children:a}):null,e.actions.map(t=>{let r=D[t.kind],a=t.request!==null;return(0,X.jsxs)(z,{size:`sm`,variant:t.destructive?`danger`:t.kind===`approve`?`primary`:`subtle`,disabled:a&&!i,onClick:()=>n(e,t.kind),"aria-keyshortcuts":r,children:[t.label,r?(0,X.jsx)(`kbd`,{className:$.inlineKey,"aria-hidden":`true`,children:r}):null]},t.kind)})]}),i?null:(0,X.jsx)(`p`,{className:$.caveat,children:"Read-only session — actions need `ashlr verse`."})]})}export{Pe as NeedsYouDrawer,I as VERSE_ANCHOR_EVENT};
|
|
2
|
-
//# sourceMappingURL=NeedsYouDrawer-CuNYJCJ0.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NeedsYouDrawer-CuNYJCJ0.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/needs-you-model.ts","../../../../../../src/web-ui/routes/verse/approvals/approvals-model.ts","../../../../../../src/web-ui/routes/verse/approvals/approvals.module.css","../../../../../../src/web-ui/routes/verse/approvals/ApprovalDetail.tsx","../../../../../../src/web-ui/routes/verse/shell/needs-you-actions.ts","../../../../../../src/web-ui/routes/verse/shell/NeedsYouDrawer.module.css","../../../../../../src/web-ui/routes/verse/shell/NeedsYouList.tsx","../../../../../../src/web-ui/routes/verse/shell/NeedsYouDrawer.tsx"],"sourcesContent":["/**\n * routes/verse/shell/needs-you-model.ts — the Needs-you drawer as data (unit\n * C1): which items a split shows, how many each split has, whether the drawer\n * may say \"All clear\", and what a key press does to an item.\n *\n * Pure. The items come from GET /api/verse/activity (C1's own producers plus\n * Track B's, R1); each carries its own actions, so nothing here knows what a\n * grant or an owner-lane PR is.\n */\nimport {\n NEEDS_YOU_KIND_CATEGORY,\n type NeedsYouAction,\n type NeedsYouActionKind,\n type NeedsYouItem,\n type NeedsYouSource,\n type VerseActivitySources,\n} from '../../../../core/verse/workbench-types.js';\nimport type { NeedsYouSplit } from '../verse-ui-store.js';\n\nexport const SPLIT_LABEL: Readonly<Record<NeedsYouSplit, string>> = {\n all: 'All',\n approvals: 'Approvals',\n fleet: 'Fleet',\n chats: 'Chats',\n accounts: 'Accounts',\n};\n\n/**\n * Which producers can put an item in each split. \"All clear\" is only\n * claimed for a split whose every producer answered: an owner-lane PR is in\n * Approvals but comes from the FLEET producer, so Approvals is only vouched\n * for when the fleet source answered too.\n */\nexport const SPLIT_SOURCES: Readonly<Record<NeedsYouSplit, readonly NeedsYouSource[]>> = {\n all: ['approvals', 'authority', 'fleet', 'leader', 'chats', 'accounts'],\n approvals: ['approvals', 'fleet', 'leader'],\n fleet: ['authority', 'fleet', 'leader'],\n chats: ['chats'],\n accounts: ['accounts'],\n};\n\nconst SOURCE_NAME: Readonly<Record<NeedsYouSource, string>> = {\n approvals: 'the approvals inbox',\n authority: 'the autonomy grant',\n fleet: 'the fleet',\n leader: 'the Leader',\n chats: 'chats',\n accounts: 'account health',\n};\n\nexport function itemsForSplit(items: readonly NeedsYouItem[], split: NeedsYouSplit): NeedsYouItem[] {\n if (split === 'all') return [...items];\n return items.filter((item) => NEEDS_YOU_KIND_CATEGORY[item.kind] === split);\n}\n\nexport function splitCounts(items: readonly NeedsYouItem[]): Record<NeedsYouSplit, number> {\n const counts: Record<NeedsYouSplit, number> = { all: items.length, approvals: 0, fleet: 0, chats: 0, accounts: 0 };\n for (const item of items) counts[NEEDS_YOU_KIND_CATEGORY[item.kind]] += 1;\n return counts;\n}\n\nexport interface SplitCoverage {\n /** Every producer feeding this split answered. */\n vouched: boolean;\n /** Operator-language names of the ones that did not, with why. */\n silent: Array<{ source: NeedsYouSource; name: string; state: 'unavailable' | 'error' }>;\n}\n\n/** Null sources (activity itself unavailable) vouch for nothing. */\nexport function splitCoverage(sources: VerseActivitySources | null, split: NeedsYouSplit): SplitCoverage {\n const silent: SplitCoverage['silent'] = [];\n for (const source of SPLIT_SOURCES[split]) {\n const state = sources?.[source] ?? 'unavailable';\n if (state !== 'ok') silent.push({ source, name: SOURCE_NAME[source], state });\n }\n return { vouched: silent.length === 0, silent };\n}\n\n/** \"the fleet isn't reporting yet and the Leader failed to answer\" — for the empty state. */\nexport function describeSilence(coverage: SplitCoverage): string {\n const phrases = coverage.silent.map((s) => (s.state === 'error' ? `${s.name} failed to answer` : `${s.name} isn't reporting in this build`));\n if (phrases.length === 0) return '';\n if (phrases.length === 1) return capitalise(phrases[0]!);\n return capitalise(`${phrases.slice(0, -1).join(', ')} and ${phrases[phrases.length - 1]}`);\n}\n\nfunction capitalise(text: string): string {\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/** Approve / reject / veto ALWAYS confirm (SPEC-310C §1); other kinds only when the item says so. */\nexport const ALWAYS_CONFIRM: ReadonlySet<NeedsYouActionKind> = new Set(['approve', 'reject', 'veto']);\n\nexport function actionOf(item: NeedsYouItem, kind: NeedsYouActionKind): NeedsYouAction | null {\n return item.actions.find((a) => a.kind === kind) ?? null;\n}\n\nconst GENERIC_CONFIRM: Readonly<Record<'approve' | 'reject' | 'veto', { title: string; confirmLabel: string }>> = {\n approve: { title: 'Approve this?', confirmLabel: 'Approve' },\n reject: { title: 'Reject this?', confirmLabel: 'Reject' },\n veto: { title: 'Veto this action?', confirmLabel: 'Veto' },\n};\n\nexport interface ConfirmCopy {\n title: string;\n body: string;\n confirmLabel: string;\n}\n\n/** The dialog for `action` on `item`; null when the action runs without one. */\nexport function confirmCopy(item: NeedsYouItem, action: NeedsYouAction): ConfirmCopy | null {\n if (action.confirm) return action.confirm;\n if (action.kind === 'approve' || action.kind === 'reject' || action.kind === 'veto') {\n const generic = GENERIC_CONFIRM[action.kind];\n return { title: generic.title, body: item.title, confirmLabel: generic.confirmLabel };\n }\n return null;\n}\n\n/** Relative time in operator language: \"just now\", \"4m\", \"3h\", \"2d\". */\nexport function ago(iso: string, now: number = Date.now()): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return '—';\n const s = Math.max(0, Math.round((now - t) / 1000));\n if (s < 45) return 'just now';\n const m = Math.round(s / 60);\n if (m < 60) return `${m}m ago`;\n const h = Math.round(m / 60);\n if (h < 36) return `${h}h ago`;\n return `${Math.round(h / 24)}d ago`;\n}\n\n/** \"closes in 24m\" / \"expired\" — for veto windows and grants. */\nexport function until(iso: string, now: number = Date.now()): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return '—';\n const s = Math.round((t - now) / 1000);\n if (s <= 0) return 'expired';\n if (s < 90) return `in ${s}s`;\n const m = Math.round(s / 60);\n if (m < 90) return `in ${m}m`;\n const h = Math.round(m / 60);\n if (h < 48) return `in ${h}h`;\n return `in ${Math.round(h / 24)}d`;\n}\n","/**\n * routes/verse/approvals/approvals-model.ts — the pure decisions behind the\n * approvals queue: what order rows come in, and exactly what a human is\n * agreeing to when they press Approve.\n *\n * Kept framework-free and unit-tested because both are easy to get subtly\n * wrong: \"pending first\" must survive a status filter that also returns\n * decided rows, and the approve consequence sentence is the last thing\n * standing between a click and a real pull request against a real remote.\n */\nimport type { Proposal, ProposalKind } from '../../../data/api-types.js';\n\n/** Pending first, then newest first within each group. Stable and total. */\nexport function orderProposals(rows: readonly Proposal[]): Proposal[] {\n return [...rows].sort((a, b) => {\n const pendingA = a.status === 'pending' ? 0 : 1;\n const pendingB = b.status === 'pending' ? 0 : 1;\n if (pendingA !== pendingB) return pendingA - pendingB;\n const tsA = Date.parse(a.createdAt);\n const tsB = Date.parse(b.createdAt);\n const safeA = Number.isNaN(tsA) ? 0 : tsA;\n const safeB = Number.isNaN(tsB) ? 0 : tsB;\n if (safeA !== safeB) return safeB - safeA;\n return a.id.localeCompare(b.id);\n });\n}\n\nexport type RiskClass = NonNullable<Proposal['riskClass']>;\n\n/** high → medium → low → unstated. Used for the risk column's sort affordance. */\nexport function riskRank(risk: Proposal['riskClass']): number {\n switch (risk) {\n case 'high':\n return 0;\n case 'medium':\n return 1;\n case 'low':\n return 2;\n default:\n return 3;\n }\n}\n\n/** Client-side narrowing over whatever page the server returned. */\nexport function filterProposals(rows: readonly Proposal[], search: string, repo: string): Proposal[] {\n const s = search.trim().toLowerCase();\n const r = repo.trim().toLowerCase();\n if (!s && !r) return [...rows];\n return rows.filter((p) => {\n if (s && !p.title.toLowerCase().includes(s) && !(p.summary ?? '').toLowerCase().includes(s)) return false;\n if (r && !(p.repo ?? '').toLowerCase().includes(r)) return false;\n return true;\n });\n}\n\n/**\n * What approving this proposal actually does, in one sentence, naming the\n * repo. `pr` is the dangerous one: it pushes a branch to the remote and opens\n * a real pull request, which is visible to other people and cannot be undone\n * from the dialog. The confirm step MUST show this before the click.\n */\nexport function describeApproveConsequence(kind: ProposalKind | string, repo: string | null): string {\n const where = repo ? repo : 'the target repository';\n switch (kind) {\n case 'pr':\n return `Pushes a branch to ${where}'s remote and opens a real pull request. Other people can see it immediately, and this dialog cannot undo it.`;\n case 'patch':\n return `Writes the diff to ${where} on disk now. Nothing is pushed, but the working tree changes.`;\n default:\n return `Applies this ${String(kind)} proposal to ${where} now.`;\n }\n}\n\n/** True when approving reaches a remote — the loudest confirm wording. */\nexport function reachesRemote(kind: ProposalKind | string): boolean {\n return kind === 'pr';\n}\n\n/** The engine that produced the diff, as a short display string. */\nexport function engineOf(proposal: Pick<Proposal, 'engineModel' | 'engineTier'>): string | null {\n if (proposal.engineModel) return proposal.engineModel;\n if (proposal.engineTier) return proposal.engineTier;\n return null;\n}\n","/**\n * routes/verse/approvals/approvals.module.css — list + detail styling for the\n * Approvals surface. Same language as the cockpit: hairlines, no cards, tight\n * radii, Space Grotesk on identifiers and numerals, colour reserved for risk\n * and for the two irreversible buttons.\n */\n\n.layout { display: grid; grid-template-columns: minmax(320px, 420px) minmax(0, 1fr); min-height: 0; height: 100%; }\n.listPane { display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--border-subtle); background: var(--bg-surface); }\n.detailPane { display: flex; flex-direction: column; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; background: var(--bg-canvas); }\n\n.filters { flex-shrink: 0; display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.filterField { display: flex; flex-direction: column; gap: var(--space-1); flex: 1; min-width: 120px; }\n.filterLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.filters input {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n}\n\n/* The Select primitive renders its own <label>; restyle it to the uppercase\n micro-label the sibling text filters use so the row still reads as one\n group. Descendant element selector, so it stays module-scoped. */\n/* Layout comes from the primitive's own .field; this only matches the\n sibling text filters' flex behaviour. */\n.filterSelect { flex: 1; min-width: 120px; }\n.filterSelect > label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-regular, 400);\n color: var(--text-tertiary);\n}\n\n/* WebKit paints its own clear affordance inside type=search, which is a\n default browser control (§7). Sidebar.module.css already resets it. */\n.filters input[type='search']::-webkit-search-cancel-button { appearance: none; }\n\n\n.count { flex-shrink: 0; display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); font-size: var(--text-xs-size); color: var(--text-tertiary); border-bottom: 1px solid var(--border-subtle); }\n\n.rows { flex: 1; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; }\n.row {\n display: grid;\n grid-template-columns: 2px minmax(0, 1fr);\n column-gap: var(--space-3);\n width: 100%;\n padding: var(--space-3) var(--space-4);\n border: 0;\n border-bottom: 1px solid var(--border-subtle);\n background: transparent;\n text-align: left;\n color: var(--text-primary);\n cursor: pointer;\n}\n.row:hover { background: var(--bg-hover); }\n.rowActive { background: var(--bg-selected); }\n/* Inset, because .rows scrolls (`overflow-y: auto`) and a full-width row's\n outward ring is clipped at the left and right edges. The global ring is\n silenced so only one paints. */\n.row:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; box-shadow: none; }\n.riskRule { grid-row: 1 / span 2; border-radius: var(--radius-full); background: var(--border-strong); }\n.riskRule[data-risk=\"high\"] { background: var(--status-danger-solid); }\n.riskRule[data-risk=\"medium\"] { background: var(--status-warning-solid); }\n.riskRule[data-risk=\"low\"] { background: var(--status-success-solid); }\n.rowTitle { font-size: var(--text-sm-size); line-height: var(--text-sm-line); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.rowMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-1) var(--space-3); margin-top: 2px; font-size: var(--text-xs-size); color: var(--text-tertiary); }\n/* --text-tertiary is a direct declaration on a CHILD, so the parent's\n :hover/[aria-current] colour change does not reach it — only the ground\n under it moves. Measured on --bg-selected it is 3.95:1 in light and 4.40:1\n in dark, both under the 4.5:1 floor in DESIGN-V2 §6; --text-secondary is\n 6.32:1 on the worst of them. design/tokens-contrast.test.ts now pins the\n token pair so the gap cannot reopen. */\n.row:hover .rowMeta,\n.rowActive .rowMeta { color: var(--text-secondary); }\n.rowMetaMono { font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 14ch; }\n.rowAge { font-family: var(--font-display); }\n.riskWord { font-family: var(--font-display); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; font-size: var(--text-2xs-size, 11px); }\n.riskWord[data-risk=\"high\"] { color: var(--status-danger-fg); }\n.riskWord[data-risk=\"medium\"] { color: var(--status-warning-fg); }\n.riskWord[data-risk=\"low\"] { color: var(--status-success-fg); }\n\n/* --- detail ------------------------------------------------------------- */\n.detail { padding: var(--space-5) var(--space-6) var(--space-16); max-width: 1040px; }\n.detailHead { padding-bottom: var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.detailTitle { font-family: var(--font-display); font-size: var(--text-xl-size); line-height: var(--text-xl-line); font-weight: var(--font-weight-semibold); letter-spacing: var(--tracking-display, -0.02em); }\n.detailMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); margin-top: var(--space-2); font-size: var(--text-xs-size); color: var(--text-tertiary); }\n.detailMeta code { font-family: var(--font-mono); }\n.summary { margin-top: var(--space-3); font-size: var(--text-base-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 72ch; }\n\n.block { padding-block: var(--space-5); border-bottom: 1px solid var(--border-subtle); }\n.blockTitle {\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n margin-bottom: var(--space-3);\n}\n.defs { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--space-2) var(--space-4); margin: 0; font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.defs dt { color: var(--text-tertiary); }\n.defs dd { margin: 0; color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }\n.defs dd code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.muted { color: var(--text-tertiary); }\n.failedChecks { margin: var(--space-1) 0 0; font-family: var(--font-mono); font-size: var(--text-xs-size); color: var(--status-danger-fg); }\n\n.actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--space-2); padding-top: var(--space-5); }\n.actionNote { flex: 1; min-width: 240px; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); }\n.reject,\n.approve {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-4);\n border-radius: var(--radius-sm);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.reject { border: 1px solid var(--border-default); background: var(--bg-surface); color: var(--text-primary); }\n.reject:hover:not(:disabled) { border-color: var(--status-danger-solid); color: var(--status-danger-fg); }\n.approve { border: 1px solid var(--accent-500); background: var(--accent-500); color: var(--accent-contrast); }\n.approve:hover:not(:disabled) { background: var(--accent-600); border-color: var(--accent-600); }\n.reject:disabled,\n.approve:disabled { border-color: var(--border-default); background: var(--bg-surface); color: var(--text-disabled); cursor: not-allowed; }\n\n.decided { padding-top: var(--space-5); font-size: var(--text-sm-size); color: var(--text-secondary); }\n\n.empty { padding: var(--space-8) var(--space-6); font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 62ch; }\n.emptyStrong { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.error { margin: var(--space-4); padding: var(--space-3); border: 1px solid var(--status-danger-solid); border-radius: var(--radius-sm); background: var(--status-danger-bg); color: var(--status-danger-fg); font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.skeletons { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-4); }\n\n@media (max-width: 900px) {\n .layout { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(160px, 38%) minmax(0, 1fr); }\n .listPane { border-right: 0; border-bottom: 1px solid var(--border-subtle); }\n .detail { padding: var(--space-4) var(--space-4) var(--space-12); }\n}\n","/**\n * routes/verse/approvals/ApprovalDetail.tsx — everything a human needs before\n * deciding, and an approve path that cannot fire on one click.\n *\n * Reuses the inbox review machinery verbatim (`DiffViewer` + `diff-parser.ts`\n * + `highlight.ts`, and `ConfirmDialog`) rather than growing a second diff\n * renderer, per docs/VERSE-CONTRACT-V2.md.\n *\n * Two rules enforced here:\n * - **Judge evidence is epistemic.** A `judge-parse-failure` /\n * `judge-network-failure` is an infra failure, never a considered verdict,\n * and a degraded decisions-ledger read renders \"unknown\" via <Epistemic/>\n * instead of letting an empty array read as \"never judged\".\n * - **Nothing signed is ever printed.** Provenance shows WHETHER a proposal\n * carries a producer attestation, never the HMAC itself — the same rule\n * that keeps launcher commands and tokens off every Verse payload.\n */\nimport { useState } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Epistemic } from '../../../components/primitives/Epistemic.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport type { DecisionEntry, JudgeDecisionReasonCode } from '../../../data/api-types.js';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { DispatchDisabledError } from '../../../data/client.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { approveProposal, rejectProposal } from '../../../data/mutations.js';\nimport { proposalDetailQuery } from '../../../data/queries.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { DiffViewer } from '../../inbox/DiffViewer.js';\n// Shell helpers, not autonomy/'s: 3.10 moves the Autonomy panels under Fleet\n// (C7), and the drawer that hosts this view must not break when they move.\nimport { describeActionError as describeControlError } from '../shell/guarded-action.js';\nimport { ago as formatRelative } from '../shell/needs-you-model.js';\nimport { describeApproveConsequence, engineOf, reachesRemote } from './approvals-model.js';\nimport styles from './approvals.module.css';\n\nconst JUDGE_REASON_DISPLAY: Record<JudgeDecisionReasonCode, { label: string; tone: Tone }> = {\n 'judge-ship-would-merge': { label: 'Ship (would merge)', tone: 'success' },\n 'judge-ship-review-required': { label: 'Ship (review required)', tone: 'success' },\n 'judge-review': { label: 'Review', tone: 'warning' },\n 'judge-noise': { label: 'Noise', tone: 'neutral' },\n 'judge-harmful': { label: 'Harmful', tone: 'danger' },\n 'judge-verdict-unrecognized': { label: 'Unrecognized verdict', tone: 'unknown' },\n 'judge-parse-failure': { label: 'Judge parse failure — not a review', tone: 'unknown' },\n 'judge-network-failure': { label: 'Judge network failure — not a review', tone: 'unknown' },\n};\n\nfunction latestJudged(decisions: DecisionEntry[]): DecisionEntry | null {\n const judged = decisions.filter((d) => d.action === 'judged' && d.judgeReasonCode);\n if (judged.length === 0) return null;\n return judged.reduce((a, b) => (Date.parse(b.ts) > Date.parse(a.ts) ? b : a));\n}\n\ntype PendingAction = 'approve' | 'reject' | null;\n\nexport interface ApprovalDetailProps {\n id: string;\n dispatchEnabled: boolean;\n onDispatchDisabled: () => void;\n onDecided: () => void;\n}\n\nexport function ApprovalDetail({ id, dispatchEnabled, onDispatchDisabled, onDecided }: ApprovalDetailProps) {\n const query = useQuery(proposalDetailQuery(id));\n const [pendingAction, setPendingAction] = useState<PendingAction>(null);\n const [tokenPrompt, setTokenPrompt] = useState(false);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n // Confirmation FIRST, then the token (SPEC-310C §1; the same order as the\n // Needs-you drawer's A / R keys — shell/guarded-action.tsx). An operator who\n // pressed Approve by mistake backs out at a prompt that says what is about\n // to happen, not at one asking for a secret.\n function requestAction(action: 'approve' | 'reject') {\n setActionError(null);\n setPendingAction(action);\n setConfirmOpen(true);\n }\n\n function closeTokenPrompt() {\n setTokenPrompt(false);\n // Live read — MutationTokenDialog closes synchronously after setToken().\n if (hasMutationHold()) {\n setConfirmOpen(true);\n void execute();\n } else {\n setPendingAction(null);\n }\n }\n\n function confirmAction() {\n if (!pendingAction) return;\n if (!hasMutationHold()) {\n setConfirmOpen(false);\n setTokenPrompt(true);\n return;\n }\n void execute();\n }\n\n async function execute() {\n if (!pendingAction) return;\n setBusy(true);\n setActionError(null);\n try {\n if (pendingAction === 'approve') await approveProposal(id);\n else await rejectProposal(id);\n setConfirmOpen(false);\n setPendingAction(null);\n onDecided();\n } catch (err) {\n if (err instanceof DispatchDisabledError) {\n setConfirmOpen(false);\n setPendingAction(null);\n onDispatchDisabled();\n } else {\n setActionError(describeControlError(err));\n }\n } finally {\n setBusy(false);\n }\n }\n\n if (query.status === 'loading') {\n return (\n <div className={styles.detail}>\n <SkeletonLine width=\"55%\" />\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"88%\" />\n </div>\n );\n }\n\n if (query.status === 'error' || !query.data) {\n return (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not load this proposal.'}\n </p>\n );\n }\n\n const p = query.data;\n const evidence = p.decisionEvidence;\n const judged = latestJudged(evidence?.decisions ?? []);\n const judgeDisplay = judged?.judgeReasonCode ? JUDGE_REASON_DISPLAY[judged.judgeReasonCode] : null;\n const canDecide = p.status === 'pending' && dispatchEnabled;\n const engine = engineOf(p);\n const consequence = describeApproveConsequence(p.kind, p.repo);\n\n return (\n <div className={styles.detail}>\n <header className={styles.detailHead}>\n <h3 className={styles.detailTitle}>{p.title}</h3>\n <div className={styles.detailMeta}>\n <StatusBadge status={p.status} />\n <span>{p.kind}</span>\n <code title={p.repo ?? undefined}>{p.repo ?? 'no repo'}</code>\n <span>{p.riskClass ? `${p.riskClass} risk` : 'risk unstated'}</span>\n {engine ? <code>{engine}</code> : null}\n <span>created {formatRelative(p.createdAt)}</span>\n {p.decidedAt ? <span>decided {formatRelative(p.decidedAt)}</span> : null}\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n {p.summary ? <p className={styles.summary}>{p.summary}</p> : null}\n </header>\n\n <section className={styles.block} aria-label=\"Evidence\">\n <h4 className={styles.blockTitle}>Evidence</h4>\n <dl className={styles.defs}>\n <dt>Judge verdict</dt>\n <dd>\n <Epistemic quality={evidence?.sourceQuality} label=\"judge verdict\">\n {judgeDisplay && judged?.judgeReasonCode ? (\n <StatusBadge status={judged.judgeReasonCode} tone={judgeDisplay.tone}>\n {judgeDisplay.label}\n </StatusBadge>\n ) : (\n <span className={styles.muted}>not yet judged</span>\n )}\n </Epistemic>\n </dd>\n\n <dt>Verification</dt>\n <dd>\n {p.verifyResult ? (\n <>\n <StatusBadge status={p.verifyResult.passed ? 'success' : 'failed'}>\n {p.verifyResult.passed ? 'passed' : 'failed'}\n </StatusBadge>\n {p.verifyResult.ran && p.verifyResult.ran.length > 0 ? (\n <span className={styles.muted}> · ran {p.verifyResult.ran.map((r) => r.kind).join(', ')}</span>\n ) : null}\n {!p.verifyResult.passed && p.verifyResult.failureCategory && p.verifyResult.failureCategory !== 'code' ? (\n <span className={styles.muted}> · {p.verifyResult.failureCategory} failure — the verifier itself, not the diff</span>\n ) : null}\n {p.verifyResult.failed && p.verifyResult.failed.length > 0 ? (\n <p className={styles.failedChecks}>failed: {p.verifyResult.failed.join(', ')}</p>\n ) : null}\n </>\n ) : (\n <span className={styles.muted}>not verified</span>\n )}\n </dd>\n\n {p.decisionReason ? (\n <>\n <dt>Decision reason</dt>\n <dd>{p.decisionReason}</dd>\n </>\n ) : null}\n\n {p.evidenceOutcome ? (\n <>\n <dt>Gates</dt>\n <dd className={styles.muted}>\n {p.evidenceOutcome.gateCount ?? 0} gate{p.evidenceOutcome.gateCount === 1 ? '' : 's'}\n {p.evidenceOutcome.policyAction ? ` · policy ${p.evidenceOutcome.policyAction}` : ''}\n {p.evidenceOutcome.trustBasis ? ` · trust ${p.evidenceOutcome.trustBasis}` : ''}\n </dd>\n </>\n ) : null}\n\n {p.result ? (\n <>\n <dt>Result</dt>\n <dd>{p.result}</dd>\n </>\n ) : null}\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Provenance\">\n <h4 className={styles.blockTitle}>Provenance</h4>\n <dl className={styles.defs}>\n <dt>Produced by</dt>\n <dd>{engine ? <code>{engine}</code> : <span className={styles.muted}>unknown engine</span>}</dd>\n <dt>Origin</dt>\n <dd>{p.origin}</dd>\n {p.workItemId ? (\n <>\n <dt>Work item</dt>\n <dd>\n <code>{p.workItemId}</code>\n </dd>\n </>\n ) : null}\n {p.runId ? (\n <>\n <dt>Run</dt>\n <dd>\n <code>{p.runId}</code>\n </dd>\n </>\n ) : null}\n <dt>Attestation</dt>\n <dd className={styles.muted}>\n {/* The signature itself is never rendered — only whether one exists. */}\n {p.producerProvenanceSig\n ? `signed by the sandboxed producer (v${p.producerProvenanceVersion ?? 2})`\n : p.provenanceSig\n ? 'legacy signature present'\n : 'unsigned — earns no positive routing credit'}\n {p.diffHash ? ' · diff hashed at signing time' : ''}\n </dd>\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Diff\">\n <h4 className={styles.blockTitle}>Diff</h4>\n <DiffViewer diff={p.diff} proposalKind={p.kind} />\n </section>\n\n {p.status === 'pending' ? (\n <footer className={styles.actions}>\n <p className={styles.actionNote}>\n {dispatchEnabled ? consequence : 'Read-only session — approve and reject are unavailable without dispatch.'}\n </p>\n {actionError && !confirmOpen ? (\n <p className={styles.error} role=\"alert\">\n {actionError}\n </p>\n ) : null}\n <button type=\"button\" className={styles.reject} disabled={!canDecide || busy} onClick={() => requestAction('reject')}>\n Reject\n </button>\n <button type=\"button\" className={styles.approve} disabled={!canDecide || busy} onClick={() => requestAction('approve')}>\n Approve…\n </button>\n </footer>\n ) : (\n <footer className={styles.decided}>\n This proposal is already <strong>{p.status}</strong> — no further action is available.\n </footer>\n )}\n\n <MutationTokenDialog\n open={tokenPrompt}\n onClose={closeTokenPrompt}\n reason={\n pendingAction === 'approve'\n ? 'Approving a proposal writes to a real repository and requires the dispatch token.'\n : 'Rejecting a proposal requires the dispatch token.'\n }\n tokenHelp=\"the mutation token ashlr verse printed\"\n />\n\n <ConfirmDialog\n open={confirmOpen}\n onClose={() => {\n setConfirmOpen(false);\n setPendingAction(null);\n setActionError(null);\n }}\n title={\n pendingAction === 'approve'\n ? `Approve this ${p.kind} against ${p.repo ? p.repo.split('/').pop() : 'the repository'}?`\n : 'Reject this proposal?'\n }\n body={\n pendingAction === 'approve' ? (\n <>\n <strong>{p.title}</strong>\n <br />\n Kind <strong>{p.kind}</strong> · repository <code>{p.repo ?? 'unknown'}</code>\n <br />\n <br />\n {consequence}\n {reachesRemote(p.kind) ? (\n <>\n <br />\n <br />\n This one leaves your machine.\n </>\n ) : null}\n </>\n ) : (\n <>\n This rejects <strong>{p.title}</strong> and discards it. It stays in history as rejected and is never\n applied.\n </>\n )\n }\n confirmLabel={pendingAction === 'approve' ? `Approve and ${reachesRemote(p.kind) ? 'open the pull request' : 'apply'}` : 'Reject'}\n // Approve is the irreversible one — a `pr` pushes a branch and opens a\n // real PR other people can see, a `patch` writes to disk now. Reject\n // only discards a proposal that stays in history. Putting the danger\n // styling on Reject trained the reflex that the red button is the safe\n // one; VERSE-CONTRACT-V2 calls Approve destructive explicitly.\n destructive={pendingAction === 'approve'}\n busy={busy}\n error={actionError}\n onConfirm={confirmAction}\n />\n </div>\n );\n}\n","/**\n * routes/verse/shell/needs-you-actions.ts — doing what a Needs-you item asks\n * (unit C1). One path for a drawer key (A / R / V / E), a drawer button and\n * the palette:\n *\n * 1. the action's route must be a same-origin `/api/` route\n * (isSafeApiRoute — checked again here, not only at the server's\n * producer boundary, because this is where the mutation token is sent);\n * 2. approve / reject / veto always confirm (the item's own copy, else a\n * generic one); other kinds only when the item carries copy;\n * 3. then the token, then the POST (guarded-action.tsx owns 2–3's order);\n * 4. on success the item is hidden at once (optimistic) and activity is\n * re-polled; it stays hidden until a poll no longer lists it, or 60 s.\n *\n * An action with no route (it needs Touch ID or a terminal) opens the item's\n * target instead — that is where the flow lives.\n */\nimport { useSyncExternalStore } from 'react';\nimport { isSafeApiRoute, type NeedsYouAction, type NeedsYouItem } from '../../../../core/verse/workbench-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate, invalidatePrefix } from '../../../data/cache.js';\nimport { ApiError, apiPost } from '../../../data/client.js';\nimport { requestGuarded } from './guarded-action.js';\nimport { ALWAYS_CONFIRM, confirmCopy } from './needs-you-model.js';\nimport { refreshActivity } from './useActivity.js';\n\n/** How long an acted-on item stays hidden while the server catches up. */\nexport const RESOLVED_HIDE_MS = 60_000;\n\nlet resolved = new Map<string, number>();\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\nexport function markResolved(id: string, at: number = Date.now()): void {\n resolved = new Map(resolved).set(id, at);\n emit();\n}\n\n/** Drop marks the server has caught up with (the id is gone) or that are too old. */\nexport function pruneResolved(liveIds: ReadonlySet<string>, now: number = Date.now()): void {\n let changed = false;\n const next = new Map(resolved);\n for (const [id, at] of next) {\n if (!liveIds.has(id) || now - at > RESOLVED_HIDE_MS) {\n next.delete(id);\n changed = true;\n }\n }\n if (changed) {\n resolved = next;\n emit();\n }\n}\n\nexport function useResolvedIds(): ReadonlyMap<string, number> {\n return useSyncExternalStore(\n (l) => {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n () => resolved,\n () => resolved,\n );\n}\n\nexport function resetResolvedForTest(): void {\n resolved = new Map();\n emit();\n}\n\nexport interface ActionContext {\n /** Open the item's target (for an action with no route). */\n openTarget: (item: NeedsYouItem) => void;\n toast: (message: string, tone?: 'neutral' | 'success' | 'danger') => void;\n}\n\nfunction afterSuccess(item: NeedsYouItem): void {\n markResolved(item.id);\n if (item.source === 'approvals') {\n // The approvals list, the inbox badge and the proposal detail all read\n // these keys (data/mutations.ts approveProposal does the same).\n invalidate('inbox');\n invalidate('dashboard-snapshot');\n invalidatePrefix('inbox-list:');\n if (item.target.kind === 'approval') invalidate(`proposal-detail-${item.target.proposalId}`);\n }\n void refreshActivity();\n}\n\n/** Run `action` on `item` through confirm → token → POST. */\nexport function runNeedsYouAction(item: NeedsYouItem, action: NeedsYouAction, ctx: ActionContext): void {\n const request = action.request;\n if (!request) {\n ctx.openTarget(item);\n return;\n }\n if (!isSafeApiRoute(request.path)) {\n ctx.toast('That action points outside this app and was not sent.', 'danger');\n return;\n }\n const copy = confirmCopy(item, action);\n const run = async () => {\n const token = getMutationToken();\n if (!token) throw new ApiError('Mutation token was rejected.', 401, request.path);\n await apiPost<unknown>(request.path, request.body, token);\n touchMutationHold();\n };\n const mustConfirm = ALWAYS_CONFIRM.has(action.kind) || copy !== null;\n requestGuarded({\n title: copy?.title ?? action.label,\n body: copy?.body ?? item.title,\n confirmLabel: copy?.confirmLabel ?? action.label,\n destructive: action.destructive,\n token: true,\n tokenReason: `${action.label} changes state on this machine and requires the dispatch token.`,\n skipConfirm: !mustConfirm,\n run,\n onDone: () => {\n afterSuccess(item);\n ctx.toast(`${action.label}: ${item.title}`, 'success');\n },\n onError: mustConfirm ? undefined : (message) => ctx.toast(message, 'danger'),\n });\n}\n","/* ⌘J — a right-hand sheet over the workbench; full screen on a phone.\n Hairlines, no cards. Severity is a word plus a 2px rule, never colour alone. */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: var(--z-dialog);\n display: flex;\n justify-content: flex-end;\n background: var(--bg-overlay);\n animation: fade var(--duration-fast) var(--ease-standard);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n width: min(480px, calc(100vw - var(--space-8)));\n height: 100%;\n background: var(--bg-surface);\n border-left: 1px solid var(--border-default);\n box-shadow: var(--shadow-dialog);\n outline: none;\n animation: slide var(--duration-base) var(--ease-decelerate);\n}\n\n/* Phone: the whole screen, sliding up. */\n.panel[data-presentation='full'] {\n width: 100%;\n border-left: 0;\n animation-name: rise;\n}\n\n.head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n min-height: var(--strip-height);\n padding: var(--space-2) var(--space-3) var(--space-2) var(--space-4);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.title {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n}\n\n.titleCount {\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-regular);\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n}\n\n.splits {\n display: flex;\n gap: var(--space-1);\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n overflow-x: auto;\n scrollbar-width: none;\n}\n\n.split {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n flex: none;\n min-height: var(--control-h-sm);\n padding: 0 var(--space-2);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n.split:hover { background: var(--bg-hover); color: var(--text-primary); }\n.split[aria-selected='true'] { background: var(--bg-selected); color: var(--text-primary); font-weight: var(--font-weight-medium); }\n\n.splitCount {\n min-width: 18px;\n padding: 0 4px;\n border-radius: var(--radius-full);\n background: var(--bg-hover);\n font-size: var(--text-2xs-size);\n line-height: 18px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n color: var(--text-secondary);\n}\n\n.body {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n.rows { outline: none; }\n.rows:focus-visible { box-shadow: none; }\n/* The list holds focus (aria-activedescendant), so the focus ring is drawn on\n the ROW it points at — a ring around the whole list says nothing about\n which item A / R / V will act on. */\n.rows:focus-visible .row[aria-selected='true'] { box-shadow: inset 0 0 0 2px var(--border-focus); }\n\n.row {\n display: grid;\n grid-template-columns: 2px minmax(0, 1fr) auto;\n column-gap: var(--space-3);\n align-items: center;\n padding: var(--space-3) var(--space-4);\n border-bottom: 1px solid var(--border-subtle);\n cursor: pointer;\n}\n.row:hover { background: var(--bg-hover); }\n.row[aria-selected='true'] { background: var(--bg-selected); }\n\n.rule {\n align-self: stretch;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n.row[data-severity='high'] .rule { background: var(--status-danger-solid); }\n.row[data-severity='warn'] .rule { background: var(--status-warning-solid); }\n\n.rowMain { display: flex; flex-direction: column; min-width: 0; gap: 2px; }\n\n.rowTitle {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n\n.rowMeta {\n display: flex;\n flex-wrap: wrap;\n gap: 0 var(--space-2);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n.severity {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n}\n.severity[data-severity='high'] { color: var(--status-danger-fg); }\n.severity[data-severity='warn'] { color: var(--status-warning-fg); }\n\n.mono { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.deadline { color: var(--status-warning-fg); font-variant-numeric: tabular-nums; }\n\n.rowKeys { display: flex; gap: 2px; }\n\n.key,\n.inlineKey {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 4px;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n background: var(--bg-surface);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n color: var(--text-secondary);\n}\n.inlineKey { margin-left: var(--space-2); background: transparent; }\n\n.loading { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-4); }\n\n.empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-16) var(--space-6);\n text-align: center;\n}\n.emptyTitle {\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.emptyBody {\n max-width: 44ch;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n\n/* The reward for an empty inbox: a quiet check, not a confetti cannon. */\n.clearMark {\n position: relative;\n width: 40px;\n height: 40px;\n margin-bottom: var(--space-2);\n border-radius: var(--radius-full);\n background: var(--status-success-bg);\n}\n.clearMark::after {\n content: '';\n position: absolute;\n left: 14px;\n top: 10px;\n width: 10px;\n height: 16px;\n border: solid var(--status-success-solid);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.focusSink { position: absolute; width: 1px; height: 1px; overflow: hidden; outline: none; }\n\n.detail { outline: none; }\n\n.back {\n display: inline-flex;\n align-items: center;\n margin: var(--space-2) var(--space-3) 0;\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-sm);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n.back:hover { background: var(--bg-hover); color: var(--text-primary); }\n\n/* ApprovalDetail was drawn for a wide pane: tighten its gutters in the sheet. */\n.approval > div { padding: var(--space-3) var(--space-4) var(--space-12); }\n\n.item { display: flex; flex-direction: column; gap: var(--space-4); padding: var(--space-3) var(--space-4) var(--space-8); }\n\n.itemTitle {\n font-family: var(--font-display);\n font-size: var(--text-lg-size);\n line-height: var(--text-lg-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n}\n\n.itemDetail {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n color: var(--text-secondary);\n overflow-wrap: anywhere;\n}\n\n.defs {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n gap: var(--space-2) var(--space-4);\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n.defs dt { color: var(--text-tertiary); }\n.defs dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }\n\n.itemActions { display: flex; flex-wrap: wrap; gap: var(--space-2); }\n\n.foot {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-4);\n padding: var(--space-2) var(--space-4);\n border-top: 1px solid var(--border-subtle);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n}\n.foot span { display: inline-flex; align-items: center; gap: 2px; }\n\n.caveat {\n margin: 0;\n padding: var(--space-2) var(--space-4);\n border-top: 1px solid var(--border-subtle);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--status-warning-fg);\n background: var(--status-warning-bg);\n}\n\n@keyframes fade { from { opacity: 0; } }\n@keyframes slide { from { opacity: 0; transform: translateX(4px); } }\n@keyframes rise { from { opacity: 0; transform: translateY(4px); } }\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .backdrop,\n :root:not([data-motion='full']) .panel { animation: none; }\n}\n:root[data-motion='reduce'] .backdrop,\n:root[data-motion='reduce'] .panel { animation: none; }\n","/**\n * routes/verse/shell/NeedsYouList.tsx — the rows of the Needs-you drawer\n * (unit C1). A listbox with ONE tab stop and aria-activedescendant, so J / K\n * move the selection without moving focus (and without the page scrolling\n * under the drawer). Presentational: selection and keys belong to the drawer.\n *\n * Each row says what, where, and how urgent — severity is a word AND a colour\n * (never colour alone), and an item with a deadline shows it counting down.\n */\nimport { forwardRef, useEffect, useRef } from 'react';\nimport type { NeedsYouItem } from '../../../../core/verse/workbench-types.js';\nimport { NEEDS_YOU_ACTION_KEYS } from '../../../../core/verse/workbench-types.js';\nimport { ago, until } from './needs-you-model.js';\nimport styles from './NeedsYouDrawer.module.css';\n\nconst SEVERITY_WORD: Readonly<Record<NeedsYouItem['severity'], string>> = { high: 'Urgent', warn: 'Soon', info: 'When you can' };\n\nconst SOURCE_WORD: Readonly<Record<NeedsYouItem['source'], string>> = {\n approvals: 'Approval',\n authority: 'Autonomy',\n fleet: 'Fleet',\n leader: 'Leader',\n chats: 'Chat',\n accounts: 'Account',\n};\n\nexport interface NeedsYouListProps {\n items: readonly NeedsYouItem[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n onOpen: (id: string) => void;\n now: number;\n label: string;\n}\n\nexport const NeedsYouList = forwardRef<HTMLDivElement, NeedsYouListProps>(function NeedsYouList(\n { items, selectedId, onSelect, onOpen, now, label },\n ref,\n) {\n const listId = 'verse-needs-you-list';\n const rowsRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!selectedId) return;\n // Matched by dataset, not a selector: ids come from other units' producers.\n const rows = rowsRef.current?.querySelectorAll<HTMLElement>('[data-item-id]') ?? [];\n const row = [...rows].find((el) => el.dataset['itemId'] === selectedId);\n row?.scrollIntoView?.({ block: 'nearest' });\n }, [selectedId]);\n\n return (\n <div\n ref={(node) => {\n rowsRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n id={listId}\n role=\"listbox\"\n aria-label={label}\n tabIndex={0}\n aria-activedescendant={selectedId ? `${listId}-${items.findIndex((i) => i.id === selectedId)}` : undefined}\n className={styles.rows}\n >\n {items.map((item, index) => {\n const keyed = item.actions\n .map((a) => NEEDS_YOU_ACTION_KEYS[a.kind])\n .filter((k): k is 'A' | 'R' | 'V' | 'E' => k !== undefined);\n return (\n <div\n key={item.id}\n id={`${listId}-${index}`}\n data-item-id={item.id}\n role=\"option\"\n aria-selected={item.id === selectedId}\n className={styles.row}\n data-severity={item.severity}\n onClick={() => onOpen(item.id)}\n onMouseMove={() => item.id !== selectedId && onSelect(item.id)}\n >\n <span className={styles.rule} aria-hidden=\"true\" />\n <span className={styles.rowMain}>\n <span className={styles.rowTitle}>{item.title}</span>\n <span className={styles.rowMeta}>\n <span className={styles.severity} data-severity={item.severity}>{SEVERITY_WORD[item.severity]}</span>\n <span>{SOURCE_WORD[item.source]}</span>\n {item.subject.repo ? <span className={styles.mono}>{item.subject.repo}</span> : null}\n {item.subject.pr ? <span>#{item.subject.pr}</span> : null}\n <span>{ago(item.since, now)}</span>\n {item.expiresAt ? <span className={styles.deadline}>closes {until(item.expiresAt, now)}</span> : null}\n </span>\n </span>\n {item.id === selectedId && keyed.length > 0 ? (\n <span className={styles.rowKeys} aria-hidden=\"true\">\n {keyed.map((k) => (\n <kbd key={k} className={styles.key}>{k}</kbd>\n ))}\n </span>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n});\n","/**\n * routes/verse/shell/NeedsYouDrawer.tsx — ⌘J, the one inbox for everything\n * waiting on the operator (unit C1; SPEC-310C §1 \"Needs-you drawer\").\n *\n * splits All · Approvals · Fleet · Chats · Accounts (H / L)\n * list J / K move · ↩ open · A approve · R reject · V veto · E done\n * detail an approval reuses ApprovalDetail (diff, evidence, provenance);\n * anything else shows its argument, its deadline and its actions\n *\n * Every A / R / V goes through confirmation and then the mutation token\n * (needs-you-actions.ts → guarded-action.tsx) — keyboard triage is fast, but\n * never one keystroke from a real pull request.\n *\n * \"All clear\" is a claim, so it is only made for a split whose every producer\n * answered (needs-you-model splitCoverage). Otherwise the empty state names\n * who is not reporting — an empty list from a silent source is not good news.\n *\n * A right-hand sheet on a desktop window; a full-screen sheet below 480px.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport { IconExternalLink, IconX } from '../../../components/primitives/icons.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { useToast } from '../../../components/primitives/Toast.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport {\n NEEDS_YOU_ACTION_KEYS,\n type NeedsYouActionKind,\n type NeedsYouItem,\n} from '../../../../core/verse/workbench-types.js';\nimport { ApprovalDetail } from '../approvals/ApprovalDetail.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { ReturnKeyIcon } from '../verse-icons.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport {\n closeVerseOverlay,\n NEEDS_YOU_SPLITS,\n openVerseSession,\n sectionEntry,\n setVerseNeedsYouSplit,\n setVerseSection,\n type NeedsYouSplit,\n} from '../verse-ui-store.js';\nimport { matchCommand } from './command-catalog.js';\nimport { isGuardOpen } from './guarded-action.js';\nimport { markResolved, pruneResolved, runNeedsYouAction, useResolvedIds } from './needs-you-actions.js';\nimport { actionOf, ago, describeSilence, itemsForSplit, SPLIT_LABEL, splitCounts, splitCoverage, until } from './needs-you-model.js';\nimport { NeedsYouList } from './NeedsYouList.js';\nimport { refreshActivity, useActivity } from './useActivity.js';\nimport { useViewport } from './viewport.js';\nimport styles from './NeedsYouDrawer.module.css';\n\n/** A section anchor for the surface an item points into (the shell reveals it: shell/reveal-anchor.ts). */\nexport { VERSE_ANCHOR_EVENT } from '../verse-ui-store.js';\n\nconst DRAWER_ACTION: Readonly<Record<string, NeedsYouActionKind>> = {\n 'drawer.approve': 'approve',\n 'drawer.reject': 'reject',\n 'drawer.veto': 'veto',\n 'drawer.done': 'done',\n};\n\nfunction isTextTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return target.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName);\n}\n\nexport function NeedsYouDrawer() {\n const ui = useVerseUi();\n const activity = useActivity();\n const toast = useToast();\n const bootstrap = useQuery(verseBootstrapQuery);\n const { compact } = useViewport();\n const resolved = useResolvedIds();\n const titleId = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const detailRef = useRef<HTMLDivElement>(null);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [detailId, setDetailId] = useState<string | null>(null);\n const [dispatchDenied, setDispatchDenied] = useState(false);\n const [now, setNow] = useState(() => Date.now());\n\n // Countdowns (\"closes in 24m\") tick while the drawer is open; nothing else re-renders.\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), 15_000);\n return () => clearInterval(id);\n }, []);\n\n const data = activity.data;\n const liveItems = data?.needsYou;\n useEffect(() => {\n if (liveItems) pruneResolved(new Set(liveItems.map((i) => i.id)));\n }, [liveItems]);\n\n const all = useMemo(() => (liveItems ?? []).filter((i) => !resolved.has(i.id)), [liveItems, resolved]);\n const split = ui.needsYouSplit;\n const items = useMemo(() => itemsForSplit(all, split), [all, split]);\n const counts = useMemo(() => splitCounts(all), [all]);\n const coverage = splitCoverage(data?.sources ?? null, split);\n const dispatchEnabled = (bootstrap.data?.dispatchEnabled ?? true) && !dispatchDenied;\n\n // Open on the item the palette / a notification asked for.\n const focusId = ui.needsYouFocus;\n useEffect(() => {\n if (!focusId) return;\n const item = all.find((i) => i.id === focusId);\n if (!item) return;\n setSelectedId(item.id);\n setDetailId(item.id);\n }, [focusId, all]);\n\n // Keep the selection on a real row as items come and go.\n useEffect(() => {\n if (items.length === 0) {\n if (selectedId !== null) setSelectedId(null);\n return;\n }\n if (!selectedId || !items.some((i) => i.id === selectedId)) setSelectedId(items[0]!.id);\n }, [items, selectedId]);\n\n const detailItem = detailId ? all.find((i) => i.id === detailId) ?? null : null;\n useEffect(() => {\n // The item was resolved (here or elsewhere) while open: back to the list.\n if (detailId && !detailItem) setDetailId(null);\n }, [detailId, detailItem]);\n\n const closeDetail = useCallback(() => setDetailId(null), []);\n\n const trapClose = useCallback(() => {\n // Esc in a dialog opened FROM the drawer (a confirmation, the token\n // prompt) belongs to that dialog: every trap hears Escape, and this one\n // registered first.\n if (isGuardOpen() || document.querySelector('[aria-modal=\"true\"]:not([data-verse-overlay])')) return;\n if (detailId) closeDetail();\n else closeVerseOverlay();\n }, [detailId, closeDetail]);\n useFocusTrap({ open: true, containerRef: panelRef, onClose: trapClose, initialFocusRef: listRef });\n\n // Focus follows the view: into the detail when it opens, back to the list\n // when it closes (not on first mount — the focus trap places that).\n const detailWasOpen = useRef(false);\n useEffect(() => {\n if (detailId) {\n detailWasOpen.current = true;\n detailRef.current?.focus({ preventScroll: true });\n } else if (detailWasOpen.current) {\n detailWasOpen.current = false;\n listRef.current?.focus({ preventScroll: true });\n }\n }, [detailId]);\n\n // The list usually arrives AFTER the drawer opened (the first poll): the\n // trap focused the placeholder, which is then removed and focus falls to\n // <body>. Hand it to the list — unless the operator has moved it anywhere\n // real (a dialog opened from the drawer lives outside this panel).\n const hasItems = items.length > 0;\n useEffect(() => {\n if (!hasItems || detailId) return;\n const active = document.activeElement;\n if (active === null || active === document.body || active === panelRef.current) listRef.current?.focus({ preventScroll: true });\n }, [hasItems, detailId]);\n\n const openTarget = useCallback((item: NeedsYouItem) => {\n const target = item.target;\n switch (target.kind) {\n case 'approval':\n setSelectedId(item.id);\n setDetailId(item.id);\n return;\n case 'session':\n closeVerseOverlay();\n openVerseSession(target.sessionId);\n return;\n case 'section':\n closeVerseOverlay();\n setVerseSection(target.section, target.anchor);\n return;\n case 'seat':\n closeVerseOverlay();\n setVerseSection('apps', `seat:${target.seatId}`);\n return;\n case 'url':\n // https only (isNeedsYouItem), a new browsing context with no opener.\n window.open(target.url, '_blank', 'noopener,noreferrer');\n return;\n default:\n return;\n }\n }, []);\n\n const act = useCallback((item: NeedsYouItem, kind: NeedsYouActionKind) => {\n const action = actionOf(item, kind);\n if (!action) {\n toast.show(`Nothing to ${kind} on this item.`, 'neutral');\n return;\n }\n if (!dispatchEnabled && action.request) {\n toast.show('This server was started without dispatch — run `ashlr verse` to act.', 'neutral');\n return;\n }\n runNeedsYouAction(item, action, { openTarget, toast: toast.show });\n }, [dispatchEnabled, openTarget, toast]);\n\n function move(delta: 1 | -1) {\n if (items.length === 0) return;\n const at = Math.max(0, items.findIndex((i) => i.id === selectedId));\n const next = items[(at + delta + items.length) % items.length]!;\n setSelectedId(next.id);\n if (detailId) setDetailId(next.id);\n }\n\n function stepSplit(delta: 1 | -1) {\n const at = NEEDS_YOU_SPLITS.indexOf(split);\n const next = NEEDS_YOU_SPLITS[(at + delta + NEEDS_YOU_SPLITS.length) % NEEDS_YOU_SPLITS.length]!;\n setVerseNeedsYouSplit(next);\n setDetailId(null);\n }\n\n function onKeyDown(event: ReactKeyboardEvent<HTMLDivElement>) {\n if (event.defaultPrevented || isTextTarget(event.target)) return;\n // React bubbles through portals: a key typed in a dialog ApprovalDetail\n // opened (rendered outside this panel's DOM) is not a triage key.\n if (!(event.target instanceof Node) || !panelRef.current?.contains(event.target)) return;\n const command = matchCommand(event.nativeEvent, ['drawer']);\n if (!command) return;\n // A button inside the detail answers Enter itself; the drawer's Enter is\n // for the list.\n if (command.id === 'drawer.open' && event.target instanceof HTMLButtonElement) return;\n event.preventDefault();\n event.stopPropagation();\n const current = items.find((i) => i.id === (detailId ?? selectedId)) ?? null;\n switch (command.id) {\n case 'drawer.next':\n move(1);\n return;\n case 'drawer.prev':\n move(-1);\n return;\n case 'drawer.split-next':\n stepSplit(1);\n return;\n case 'drawer.split-prev':\n stepSplit(-1);\n return;\n case 'drawer.open':\n if (current) setDetailId(current.id);\n return;\n default: {\n const kind = DRAWER_ACTION[command.id];\n if (kind && current) act(current, kind);\n }\n }\n }\n\n const loading = !data && (activity.status === 'loading' || activity.status === 'idle');\n const unavailable = !data && activity.status === 'unavailable';\n\n return createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && closeVerseOverlay()}>\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={styles.panel}\n data-presentation={compact ? 'full' : 'side'}\n data-verse-overlay=\"needs-you\"\n data-scope=\"drawer\"\n tabIndex={-1}\n onKeyDown={onKeyDown}\n >\n <header className={styles.head}>\n <h2 id={titleId} className={styles.title}>\n Needs you\n {data ? <span className={styles.titleCount}>{counts.all}</span> : null}\n </h2>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconX />} aria-label=\"Close Needs you\" onClick={closeVerseOverlay} />\n </header>\n\n <div\n role=\"tablist\"\n aria-label=\"Splits\"\n className={styles.splits}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;\n e.preventDefault();\n stepSplit(e.key === 'ArrowRight' ? 1 : -1);\n }}\n >\n {NEEDS_YOU_SPLITS.map((s: NeedsYouSplit) => (\n <button\n key={s}\n type=\"button\"\n role=\"tab\"\n aria-selected={s === split}\n tabIndex={s === split ? 0 : -1}\n className={styles.split}\n onClick={() => {\n setVerseNeedsYouSplit(s);\n setDetailId(null);\n }}\n >\n {SPLIT_LABEL[s]}\n <span className={styles.splitCount} aria-label={`${counts[s]} items`}>{counts[s]}</span>\n </button>\n ))}\n </div>\n\n <div className={styles.body}>\n {detailItem ? (\n <div ref={detailRef} className={styles.detail} tabIndex={-1} aria-label=\"Item detail\">\n <button type=\"button\" className={styles.back} onClick={closeDetail}>\n ‹ All {SPLIT_LABEL[split].toLowerCase()}\n </button>\n {detailItem.target.kind === 'approval' ? (\n <div className={styles.approval}>\n <ApprovalDetail\n key={detailItem.target.proposalId}\n id={detailItem.target.proposalId}\n dispatchEnabled={dispatchEnabled}\n onDispatchDisabled={() => setDispatchDenied(true)}\n onDecided={() => {\n markResolved(detailItem.id);\n void refreshActivity();\n closeDetail();\n }}\n />\n </div>\n ) : (\n <ItemDetail item={detailItem} now={now} onAct={act} onOpenTarget={openTarget} dispatchEnabled={dispatchEnabled} />\n )}\n </div>\n ) : loading ? (\n <div className={styles.loading} role=\"status\" aria-label=\"Loading\">\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : unavailable ? (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>Needs you isn't available on this server</p>\n <p className={styles.emptyBody}>This build does not report activity yet, so nothing here can be vouched for. Approvals still work from the inbox.</p>\n </div>\n ) : items.length === 0 ? (\n <EmptySplit coverageText={describeSilence(coverage)} vouched={coverage.vouched} autonomyLabel={data?.autonomy?.label ?? null} split={split} />\n ) : (\n <NeedsYouList\n ref={listRef}\n items={items}\n selectedId={selectedId}\n onSelect={setSelectedId}\n // A click (or a tap — a phone has no J / K) opens the item;\n // the keyboard moves the selection without opening.\n onOpen={(id) => {\n setSelectedId(id);\n setDetailId(id);\n }}\n now={now}\n label={`${SPLIT_LABEL[split]} needing you`}\n />\n )}\n {/* The list holds the initial focus; with no list, the panel does. */}\n {items.length === 0 && !detailItem ? <div ref={listRef} tabIndex={-1} className={styles.focusSink} aria-hidden=\"true\" /> : null}\n </div>\n\n {!compact ? (\n <footer className={styles.foot} aria-hidden=\"true\">\n <span><kbd className={styles.key}>J</kbd><kbd className={styles.key}>K</kbd> move</span>\n <span><kbd className={styles.key}><ReturnKeyIcon /></kbd> open</span>\n <span><kbd className={styles.key}>A</kbd> approve</span>\n <span><kbd className={styles.key}>R</kbd> reject</span>\n <span><kbd className={styles.key}>V</kbd> veto</span>\n <span><kbd className={styles.key}>E</kbd> done</span>\n <span><kbd className={styles.key}>H</kbd><kbd className={styles.key}>L</kbd> splits</span>\n </footer>\n ) : null}\n {!coverage.vouched && items.length > 0 ? (\n <p className={styles.caveat} role=\"note\">{describeSilence(coverage)} — this list may be incomplete.</p>\n ) : null}\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction EmptySplit({ vouched, coverageText, autonomyLabel, split }: { vouched: boolean; coverageText: string; autonomyLabel: string | null; split: NeedsYouSplit }) {\n if (vouched) {\n return (\n <div className={styles.empty} data-state=\"clear\">\n <span className={styles.clearMark} aria-hidden=\"true\" />\n <p className={styles.emptyTitle}>All clear</p>\n <p className={styles.emptyBody}>{autonomyLabel ? `Fleet: ${autonomyLabel}.` : 'Nothing is waiting on you.'}</p>\n </div>\n );\n }\n return (\n <div className={styles.empty} data-state=\"unknown\">\n <p className={styles.emptyTitle}>Nothing to show{split === 'all' ? '' : ` in ${SPLIT_LABEL[split]}`} — but it isn't an all-clear</p>\n <p className={styles.emptyBody}>{coverageText}.</p>\n </div>\n );\n}\n\nconst TARGET_LABEL = (item: NeedsYouItem): string | null => {\n switch (item.target.kind) {\n case 'session':\n return 'Open chat';\n case 'section':\n return `Open ${sectionEntry(item.target.section).label}`;\n case 'seat':\n return 'Open Apps & Accounts';\n case 'url':\n return 'Open on GitHub';\n default:\n return null;\n }\n};\n\nfunction ItemDetail({\n item,\n now,\n onAct,\n onOpenTarget,\n dispatchEnabled,\n}: {\n item: NeedsYouItem;\n now: number;\n onAct: (item: NeedsYouItem, kind: NeedsYouActionKind) => void;\n onOpenTarget: (item: NeedsYouItem) => void;\n dispatchEnabled: boolean;\n}) {\n const targetLabel = TARGET_LABEL(item);\n return (\n <article className={styles.item}>\n <h3 className={styles.itemTitle}>{item.title}</h3>\n {item.detail ? <p className={styles.itemDetail}>{item.detail}</p> : null}\n <dl className={styles.defs}>\n {item.subject.repo ? (<><dt>Repo</dt><dd className={styles.mono}>{item.subject.repo}</dd></>) : null}\n {item.subject.pr ? (<><dt>Pull request</dt><dd>#{item.subject.pr}</dd></>) : null}\n {item.subject.seatId ? (<><dt>Seat</dt><dd className={styles.mono}>{item.subject.seatId}</dd></>) : null}\n <dt>Waiting</dt>\n <dd>since {ago(item.since, now)}</dd>\n {item.expiresAt ? (<><dt>Closes</dt><dd className={styles.deadline}>{until(item.expiresAt, now)}</dd></>) : null}\n </dl>\n <div className={styles.itemActions}>\n {targetLabel ? (\n <Button variant=\"subtle\" size=\"sm\" onClick={() => onOpenTarget(item)} trailingIcon={item.target.kind === 'url' ? <IconExternalLink /> : undefined}>\n {targetLabel}\n </Button>\n ) : null}\n {item.actions.map((action) => {\n const key = NEEDS_YOU_ACTION_KEYS[action.kind];\n const needsDispatch = action.request !== null;\n return (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.destructive ? 'danger' : action.kind === 'approve' ? 'primary' : 'subtle'}\n disabled={needsDispatch && !dispatchEnabled}\n onClick={() => onAct(item, action.kind)}\n aria-keyshortcuts={key}\n >\n {action.label}\n {key ? <kbd className={styles.inlineKey} aria-hidden=\"true\">{key}</kbd> : null}\n </Button>\n );\n })}\n </div>\n {!dispatchEnabled ? <p className={styles.caveat}>Read-only session — actions need `ashlr verse`.</p> : null}\n </article>\n );\n}\n"],"mappings":"6oCAmBa,EAAuD,CAClE,IAAK,MACL,UAAW,YACX,MAAO,QACP,MAAO,QACP,SAAU,UACZ,EAQa,EAA4E,CACvF,IAAK,CAAC,YAAa,YAAa,QAAS,SAAU,QAAS,UAAU,EACtE,UAAW,CAAC,YAAa,QAAS,QAAQ,EAC1C,MAAO,CAAC,YAAa,QAAS,QAAQ,EACtC,MAAO,CAAC,OAAO,EACf,SAAU,CAAC,UAAU,CACvB,EAEM,EAAwD,CAC5D,UAAW,sBACX,UAAW,qBACX,MAAO,YACP,OAAQ,aACR,MAAO,QACP,SAAU,gBACZ,EAEA,SAAgB,GAAc,EAAgC,EAAsC,CAElG,OADI,IAAU,MAAc,CAAC,GAAG,CAAK,EAC9B,EAAM,OAAQ,GAAS,EAAwB,EAAK,QAAU,CAAK,CAC5E,CAEA,SAAgB,GAAY,EAA+D,CACzF,IAAM,EAAwC,CAAE,IAAK,EAAM,OAAQ,UAAW,EAAG,MAAO,EAAG,MAAO,EAAG,SAAU,CAAE,EACjH,IAAK,IAAM,KAAQ,EAAO,EAAO,EAAwB,EAAK,QAAU,EACxE,OAAO,CACT,CAUA,SAAgB,GAAc,EAAsC,EAAqC,CACvG,IAAM,EAAkC,CAAC,EACzC,IAAK,IAAM,KAAU,EAAc,GAAQ,CACzC,IAAM,EAAQ,IAAU,IAAW,cAC/B,IAAU,MAAM,EAAO,KAAK,CAAE,SAAQ,KAAM,EAAY,GAAS,OAAM,CAAC,CAC9E,CACA,MAAO,CAAE,QAAS,EAAO,SAAW,EAAG,QAAO,CAChD,CAGA,SAAgB,GAAgB,EAAiC,CAC/D,IAAM,EAAU,EAAS,OAAO,IAAK,GAAO,EAAE,QAAU,QAAU,GAAG,EAAE,KAAK,mBAAqB,GAAG,EAAE,KAAK,+BAAgC,EAG3I,OAFI,EAAQ,SAAW,EAAU,GAC7B,EAAQ,SAAW,EAAU,EAAW,EAAQ,EAAG,EAChD,EAAW,GAAG,EAAQ,MAAM,EAAG,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,EAAQ,EAAQ,OAAS,IAAI,CAC3F,CAEA,SAAS,EAAW,EAAsB,CACxC,OAAO,EAAK,OAAO,CAAC,CAAC,CAAC,YAAY,EAAI,EAAK,MAAM,CAAC,CACpD,CAGA,IAAa,EAAkD,IAAI,IAAI,CAAC,UAAW,SAAU,MAAM,CAAC,EAEpG,SAAgB,GAAS,EAAoB,EAAiD,CAC5F,OAAO,EAAK,QAAQ,KAAM,GAAM,EAAE,OAAS,CAAI,GAAK,IACtD,CAEA,IAAM,EAA4G,CAChH,QAAS,CAAE,MAAO,gBAAiB,aAAc,SAAU,EAC3D,OAAQ,CAAE,MAAO,eAAgB,aAAc,QAAS,EACxD,KAAM,CAAE,MAAO,oBAAqB,aAAc,MAAO,CAC3D,EASA,SAAgB,GAAY,EAAoB,EAA4C,CAC1F,GAAI,EAAO,QAAS,OAAO,EAAO,QAClC,GAAI,EAAO,OAAS,WAAa,EAAO,OAAS,UAAY,EAAO,OAAS,OAAQ,CACnF,IAAM,EAAU,EAAgB,EAAO,MACvC,MAAO,CAAE,MAAO,EAAQ,MAAO,KAAM,EAAK,MAAO,aAAc,EAAQ,YAAa,CACtF,CACA,OAAO,IACT,CAGA,SAAgB,EAAI,EAAa,EAAc,KAAK,IAAI,EAAW,CACjE,IAAM,EAAI,KAAK,MAAM,CAAG,EACxB,GAAI,CAAC,OAAO,SAAS,CAAC,EAAG,MAAO,IAChC,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,OAAO,EAAM,GAAK,GAAI,CAAC,EAClD,GAAI,EAAI,GAAI,MAAO,WACnB,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAC3B,GAAI,EAAI,GAAI,MAAO,GAAG,EAAE,OACxB,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAE3B,OADI,EAAI,GAAW,GAAG,EAAE,OACjB,GAAG,KAAK,MAAM,EAAI,EAAE,EAAE,MAC/B,CAGA,SAAgB,EAAM,EAAa,EAAc,KAAK,IAAI,EAAW,CACnE,IAAM,EAAI,KAAK,MAAM,CAAG,EACxB,GAAI,CAAC,OAAO,SAAS,CAAC,EAAG,MAAO,IAChC,IAAM,EAAI,KAAK,OAAO,EAAI,GAAO,GAAI,EACrC,GAAI,GAAK,EAAG,MAAO,UACnB,GAAI,EAAI,GAAI,MAAO,MAAM,EAAE,GAC3B,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAC3B,GAAI,EAAI,GAAI,MAAO,MAAM,EAAE,GAC3B,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAE3B,OADI,EAAI,GAAW,MAAM,EAAE,GACpB,MAAM,KAAK,MAAM,EAAI,EAAE,EAAE,EAClC,CCnFA,SAAgB,GAA2B,EAA6B,EAA6B,CACnG,IAAM,EAAQ,GAAc,wBAC5B,OAAQ,EAAR,CACE,IAAK,KACH,MAAO,sBAAsB,EAAM,+GACrC,IAAK,QACH,MAAO,sBAAsB,EAAM,gEACrC,QACE,MAAO,gBAAgB,OAAO,CAAI,EAAE,eAAe,EAAM,MAC7D,CACF,CAGA,SAAgB,GAAc,EAAsC,CAClE,OAAO,IAAS,IAClB,CAGA,SAAgB,GAAS,EAAuE,CAG9F,OAFI,EAAS,YAAoB,EAAS,YACtC,EAAS,WAAmB,EAAS,WAClC,IACT,mkCE7CM,GAAuF,CAC3F,yBAA0B,CAAE,MAAO,qBAAsB,KAAM,SAAU,EACzE,6BAA8B,CAAE,MAAO,yBAA0B,KAAM,SAAU,EACjF,eAAgB,CAAE,MAAO,SAAU,KAAM,SAAU,EACnD,cAAe,CAAE,MAAO,QAAS,KAAM,SAAU,EACjD,gBAAiB,CAAE,MAAO,UAAW,KAAM,QAAS,EACpD,6BAA8B,CAAE,MAAO,uBAAwB,KAAM,SAAU,EAC/E,sBAAuB,CAAE,MAAO,qCAAsC,KAAM,SAAU,EACtF,wBAAyB,CAAE,MAAO,uCAAwC,KAAM,SAAU,CAC5F,EAEA,SAAS,GAAa,EAAkD,CACtE,IAAM,EAAS,EAAU,OAAQ,GAAM,EAAE,SAAW,UAAY,EAAE,eAAe,EAEjF,OADI,EAAO,SAAW,EAAU,KACzB,EAAO,QAAQ,EAAG,IAAO,KAAK,MAAM,EAAE,EAAE,EAAI,KAAK,MAAM,EAAE,EAAE,EAAI,EAAI,CAAE,CAC9E,CAWA,SAAgB,GAAe,CAAE,KAAI,kBAAiB,qBAAoB,aAAkC,CAC1G,IAAM,EAAQ,GAAS,EAAoB,CAAE,CAAC,EACxC,CAAC,EAAe,IAAA,EAAoB,EAAA,SAAA,CAAwB,IAAI,EAChE,CAAC,EAAa,IAAA,EAAkB,EAAA,SAAA,CAAS,EAAK,EAC9C,CAAC,EAAa,IAAA,EAAkB,EAAA,SAAA,CAAS,EAAK,EAC9C,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,CAAC,EAAa,IAAA,EAAkB,EAAA,SAAA,CAAwB,IAAI,EAMlE,SAAS,EAAc,EAA8B,CACnD,EAAe,IAAI,EACnB,EAAiB,CAAM,EACvB,EAAe,EAAI,CACrB,CAEA,SAAS,GAAmB,CAC1B,EAAe,EAAK,EAEhB,EAAgB,GAClB,EAAe,EAAI,EACnB,EAAa,GAEb,EAAiB,IAAI,CAEzB,CAEA,SAAS,GAAgB,CAClB,KACL,IAAI,CAAC,EAAgB,EAAG,CACtB,EAAe,EAAK,EACpB,EAAe,EAAI,EACnB,MACF,CACA,EAAa,CADb,CAEF,CAEA,eAAe,GAAU,CAClB,KAEL,CADA,EAAQ,EAAI,EACZ,EAAe,IAAI,EACnB,GAAI,CACE,IAAkB,UAAW,MAAM,EAAgB,CAAE,EACpD,MAAM,EAAe,CAAE,EAC5B,EAAe,EAAK,EACpB,EAAiB,IAAI,EACrB,EAAU,CACZ,OAAS,EAAK,CACR,aAAe,GACjB,EAAe,EAAK,EACpB,EAAiB,IAAI,EACrB,EAAmB,GAEnB,EAAe,EAAqB,CAAG,CAAC,CAE5C,QAAU,CACR,EAAQ,EAAK,CACf,CAjBmB,CAkBrB,CAEA,GAAI,EAAM,SAAW,UACnB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,CACxB,IAIT,GAAI,EAAM,SAAW,SAAW,CAAC,EAAM,KACrC,OACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAC9B,SAAA,EAAM,OAAO,SAAW,+BACxB,CAAA,EAIP,IAAM,EAAI,EAAM,KACV,EAAW,EAAE,iBACb,EAAS,GAAa,GAAU,WAAa,CAAC,CAAC,EAC/C,EAAe,GAAQ,gBAAkB,GAAqB,EAAO,iBAAmB,KACxF,EAAY,EAAE,SAAW,WAAa,EACtC,EAAS,GAAS,CAAC,EACnB,EAAc,GAA2B,EAAE,KAAM,EAAE,IAAI,EAE7D,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,WAA1B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,YAAc,SAAA,EAAE,KAAU,CAAA,GAChD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,OAAQ,EAAE,MAAS,CAAA,GAChC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,IAAW,CAAA,GACpB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,MAAO,EAAE,MAAQ,IAAA,GAAY,SAAA,EAAE,MAAQ,SAAgB,CAAA,GAC7D,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,UAAY,GAAG,EAAE,UAAU,OAAS,eAAsB,CAAA,EAClE,GAAS,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,CAAa,CAAA,EAAI,MAClC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,WAAS,EAAe,EAAE,SAAS,CAAQ,CAAA,CAAA,EAChD,EAAE,WAAY,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,WAAS,EAAe,EAAE,SAAS,CAAQ,CAAA,CAAA,EAAI,KACnE,EAAM,SAAW,cAAe,EAAA,EAAA,IAAA,CAAC,EAAD,CAAmB,CAAA,EAAI,IACrD,IACJ,EAAE,SAAU,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,QAAU,SAAA,EAAE,OAAW,CAAA,EAAI,IACvD,KAER,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,MAAO,aAAW,WAA7C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,WAAY,SAAA,UAAY,CAAA,GAC9C,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KAAtB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,eAAiB,CAAA,GACrB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,QAAS,GAAU,cAAe,MAAM,gBAChD,SAAA,GAAgB,GAAQ,iBACvB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,OAAQ,EAAO,gBAAiB,KAAM,EAAa,KAC7D,SAAA,EAAa,KACH,CAAA,GAEb,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,SAAA,gBAAoB,CAAA,CAE5C,CAAA,CACT,CAAA,GAEJ,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,cAAgB,CAAA,GACpB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SACG,EAAE,cACD,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,OAAQ,EAAE,aAAa,OAAS,UAAY,SACtD,SAAA,EAAE,aAAa,OAAS,SAAW,QACzB,CAAA,EACZ,EAAE,aAAa,KAAO,EAAE,aAAa,IAAI,OAAS,GACjD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,SAAA,CAA+B,UAAQ,EAAE,aAAa,IAAI,IAAK,GAAM,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,CAAQ,CAC5F,CAAA,EAAA,KACH,CAAC,EAAE,aAAa,QAAU,EAAE,aAAa,iBAAmB,EAAE,aAAa,kBAAoB,QAC9F,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,SAAA,CAA+B,MAAI,EAAE,aAAa,gBAAgB,8CAAkD,CAClH,CAAA,EAAA,KACH,EAAE,aAAa,QAAU,EAAE,aAAa,OAAO,OAAS,GACvD,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,aAArB,SAAA,CAAmC,WAAS,EAAE,aAAa,OAAO,KAAK,IAAI,CAAK,CAC9E,CAAA,EAAA,IACJ,CAAA,CAAA,GAEF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,SAAA,cAAkB,CAAA,CAEjD,CAAA,EAEH,EAAE,gBACD,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,iBAAmB,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,cAAmB,CAAA,CAC1B,CAAA,CAAA,EACA,KAEH,EAAE,iBACD,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,OAAS,CAAA,GACb,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,MAAtB,SAAA,CACG,EAAE,gBAAgB,WAAa,EAAE,QAAM,EAAE,gBAAgB,YAAc,EAAI,GAAK,IAChF,EAAE,gBAAgB,aAAe,aAAa,EAAE,gBAAgB,eAAiB,GACjF,EAAE,gBAAgB,WAAa,YAAY,EAAE,gBAAgB,aAAe,EAC3E,CACJ,CAAA,CAAA,CAAA,CAAA,EACA,KAEH,EAAE,QACD,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,QAAU,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,MAAW,CAAA,CAClB,CAAA,CAAA,EACA,IACF,CACG,CAAA,CAAA,KAET,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,MAAO,aAAW,aAA7C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,WAAY,SAAA,YAAc,CAAA,GAChD,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KAAtB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,aAAe,CAAA,GACnB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,GAAS,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,CAAa,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,SAAA,gBAAoB,CAAA,CAAM,CAAA,GAC/F,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,QAAU,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAE,MAAW,CAAA,EACjB,EAAE,YACD,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,WAAa,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,UAAiB,CAAA,CACxB,CAAA,CACJ,CAAA,CAAA,EACA,KACH,EAAE,OACD,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,KAAO,CAAA,GACX,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,KAAY,CAAA,CACnB,CAAA,CACJ,CAAA,CAAA,EACA,MACJ,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,aAAe,CAAA,GACnB,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,MAAtB,SAAA,CAEG,EAAE,sBACC,sCAAsC,EAAE,2BAA6B,EAAE,GACvE,EAAE,cACA,2BACA,8CACL,EAAE,SAAW,iCAAmC,EAC/C,GACF,CACG,CAAA,CAAA,KAET,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,MAAO,aAAW,OAA7C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,WAAY,SAAA,MAAQ,CAAA,GAC1C,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,KAAM,EAAE,KAAM,aAAc,EAAE,IAAO,CAAA,CAC1C,IAER,EAAE,SAAW,WACZ,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,QAA1B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,WAClB,SAAA,EAAkB,EAAc,0EAChC,CAAA,EACF,GAAe,CAAC,GACf,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAC9B,SAAA,CACA,CAAA,EACD,MACJ,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,OAAQ,SAAU,CAAC,GAAa,EAAM,YAAe,EAAc,QAAQ,EAAG,SAAA,QAE9G,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,QAAS,SAAU,CAAC,GAAa,EAAM,YAAe,EAAc,SAAS,EAAG,SAAA,UAEhH,CAAA,CACF,CAER,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,QAA1B,SAAA,CAAmC,6BACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAE,MAAe,CAAA,EAAC,oCAC9C,KAGV,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EACN,QAAS,EACT,OACE,IAAkB,UACd,oFACA,oDAEN,UAAU,wCACX,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EACN,YAAe,CACb,EAAe,EAAK,EACpB,EAAiB,IAAI,EACrB,EAAe,IAAI,CACrB,EACA,MACE,IAAkB,UACd,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAO,EAAE,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,EAAI,iBAAiB,GACtF,wBAEN,KACE,IAAkB,WAChB,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAE,KAAc,CAAA,GACzB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAK,CAAA,EAAC,SACD,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAE,IAAa,CAAA,EAAC,kBAAc,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,MAAQ,SAAgB,CAAA,GAC7E,EAAA,EAAA,IAAA,CAAC,KAAD,CAAK,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,KAAD,CAAK,CAAA,EACJ,EACA,GAAc,EAAE,IAAI,GACnB,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAK,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,KAAD,CAAK,CAAA,EAAC,+BAEN,CAAA,CAAA,EACA,IACJ,CAAA,CAAA,GAEF,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CAAE,iBACa,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAE,KAAc,CAAA,EAAC,yEAEvC,CAAA,CAAA,EAGN,aAAc,IAAkB,UAAY,eAAe,GAAc,EAAE,IAAI,EAAI,wBAA0B,UAAY,SAMzH,YAAa,IAAkB,UACzB,OACN,MAAO,EACP,UAAW,CACZ,CAAA,CACE,GAET,CCzUA,IAAI,EAAW,IAAI,IACb,EAAY,IAAI,IAEtB,SAAS,IAAa,CACpB,IAAK,IAAM,IAAK,CAAC,GAAG,CAAS,EAAG,EAAE,CACpC,CAEA,SAAgB,GAAa,EAAY,EAAa,KAAK,IAAI,EAAS,CACtE,EAAW,IAAI,IAAI,CAAQ,CAAC,CAAC,IAAI,EAAI,CAAE,EACvC,GAAK,CACP,CAGA,SAAgB,GAAc,EAA8B,EAAc,KAAK,IAAI,EAAS,CAC1F,IAAI,EAAU,GACR,EAAO,IAAI,IAAI,CAAQ,EAC7B,IAAK,GAAM,CAAC,EAAI,KAAO,GACjB,CAAC,EAAQ,IAAI,CAAE,GAAK,EAAM,EAAA,OAC5B,EAAK,OAAO,CAAE,EACd,EAAU,IAGV,IACF,EAAW,EACX,GAAK,EAET,CAEA,SAAgB,IAA8C,CAC5D,OAAA,EAAO,EAAA,qBAAA,CACJ,IACC,EAAU,IAAI,CAAC,MACF,EAAU,OAAO,CAAC,OAE3B,MACA,CACR,CACF,CAaA,SAAS,GAAa,EAA0B,CAC9C,GAAa,EAAK,EAAE,EAChB,EAAK,SAAW,cAGlB,EAAW,OAAO,EAClB,EAAW,oBAAoB,EAC/B,EAAiB,aAAa,EAC1B,EAAK,OAAO,OAAS,YAAY,EAAW,mBAAmB,EAAK,OAAO,YAAY,GAE7F,GAAqB,CACvB,CAGA,SAAgB,GAAkB,EAAoB,EAAwB,EAA0B,CACtG,IAAM,EAAU,EAAO,QACvB,GAAI,CAAC,EAAS,CACZ,EAAI,WAAW,CAAI,EACnB,MACF,CACA,GAAI,CAAC,EAAe,EAAQ,IAAI,EAAG,CACjC,EAAI,MAAM,wDAAyD,QAAQ,EAC3E,MACF,CACA,IAAM,EAAO,GAAY,EAAM,CAAM,EAC/B,EAAM,SAAY,CACtB,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EAAS,+BAAgC,IAAK,EAAQ,IAAI,EAChF,MAAM,EAAiB,EAAQ,KAAM,EAAQ,KAAM,CAAK,EACxD,EAAkB,CACpB,EACM,EAAc,EAAe,IAAI,EAAO,IAAI,GAAK,IAAS,KAChE,EAAe,CACb,MAAO,GAAM,OAAS,EAAO,MAC7B,KAAM,GAAM,MAAQ,EAAK,MACzB,aAAc,GAAM,cAAgB,EAAO,MAC3C,YAAa,EAAO,YACpB,MAAO,GACP,YAAa,GAAG,EAAO,MAAM,iEAC7B,YAAa,CAAC,EACd,MACA,WAAc,CACZ,GAAa,CAAI,EACjB,EAAI,MAAM,GAAG,EAAO,MAAM,IAAI,EAAK,QAAS,SAAS,CACvD,EACA,QAAS,EAAc,IAAA,GAAa,GAAY,EAAI,MAAM,EAAS,QAAQ,CAC7E,CAAC,CACH,ilCE/GM,GAAoE,CAAE,KAAM,SAAU,KAAM,OAAQ,KAAM,cAAe,EAEzH,GAAgE,CACpE,UAAW,WACX,UAAW,WACX,MAAO,QACP,OAAQ,SACR,MAAO,OACP,SAAU,SACZ,EAWa,IAAA,EAAe,EAAA,WAAA,CAA8C,SACxE,CAAE,QAAO,aAAY,WAAU,SAAQ,MAAK,SAC5C,EACA,CACA,IAAM,EAAS,uBACT,GAAA,EAAU,EAAA,OAAA,CAA8B,IAAI,EAUlD,OARA,EAAA,EAAA,UAAA,KAAgB,CACT,GAIL,CADa,GADA,EAAQ,SAAS,iBAA8B,gBAAgB,GAAK,CAAC,CAC9D,CAAC,CAAC,KAAM,GAAO,EAAG,QAAQ,SAAc,CAC5D,CAAA,EAAK,iBAAiB,CAAE,MAAO,SAAU,CAAC,CAC5C,EAAG,CAAC,CAAU,CAAC,GAGb,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,IAAM,GAAS,CACb,EAAQ,QAAU,EACd,OAAO,GAAQ,WAAY,EAAI,CAAI,EAC9B,IAAK,EAAI,QAAU,EAC9B,EACA,GAAI,EACJ,KAAK,UACL,aAAY,EACZ,SAAU,EACV,wBAAuB,EAAa,GAAG,EAAO,GAAG,EAAM,UAAW,GAAM,EAAE,KAAO,CAAU,IAAM,IAAA,GACjG,UAAW,EAAO,KAEjB,SAAA,EAAM,KAAK,EAAM,IAAU,CAC1B,IAAM,EAAQ,EAAK,QAChB,IAAK,GAAM,EAAsB,EAAE,KAAK,CAAC,CACzC,OAAQ,GAAkC,IAAM,IAAA,EAAS,EAC5D,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAEE,GAAI,GAAG,EAAO,GAAG,IACjB,eAAc,EAAK,GACnB,KAAK,SACL,gBAAe,EAAK,KAAO,EAC3B,UAAW,EAAO,IAClB,gBAAe,EAAK,SACpB,YAAe,EAAO,EAAK,EAAE,EAC7B,gBAAmB,EAAK,KAAO,GAAc,EAAS,EAAK,EAAE,EAT/D,SAAA,EAWE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,cAAY,MAAQ,CAAA,GAClD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAW,SAAA,EAAK,KAAY,CAAA,GACpD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,gBAAe,EAAK,SAAW,SAAA,GAAc,EAAK,SAAgB,CAAA,GACpG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAY,EAAK,OAAc,CAAA,EACrC,EAAK,QAAQ,MAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAO,SAAA,EAAK,QAAQ,IAAW,CAAA,EAAI,KAC/E,EAAK,QAAQ,IAAK,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,IAAE,EAAK,QAAQ,EAAS,CAAA,CAAA,EAAI,MACrD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAI,EAAK,MAAO,CAAG,CAAQ,CAAA,EACjC,EAAK,WAAY,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAxB,SAAA,CAAkC,UAAQ,EAAM,EAAK,UAAW,CAAG,CAAQ,CAAI,CAAA,EAAA,IAC7F,CACF,CAAA,CAAA,IACL,EAAK,KAAO,GAAc,EAAM,OAAS,GACxC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,cAAY,OAC1C,SAAA,EAAM,IAAK,IACV,EAAA,EAAA,IAAA,CAAC,MAAD,CAAa,UAAW,EAAO,IAAM,SAAA,CAAO,EAAlC,CAAkC,CAC7C,CACG,CAAA,EACJ,IACD,CA7BE,EAAA,EAAK,EA6BP,CAET,CAAC,CACE,CAAA,CAET,CAAC,EC/CK,GAA8D,CAClE,iBAAkB,UAClB,gBAAiB,SACjB,cAAe,OACf,cAAe,MACjB,EAEA,SAAS,GAAa,EAAqC,CAEzD,OADM,aAAkB,YACjB,EAAO,mBAAqB,4BAA4B,KAAK,EAAO,OAAO,EADrC,EAE/C,CAEA,SAAgB,IAAiB,CAC/B,IAAM,EAAK,GAAW,EAChB,EAAW,GAAY,EACvB,EAAQ,EAAS,EACjB,EAAY,GAAS,EAAmB,EACxC,CAAE,WAAY,EAAY,EAC1B,EAAW,GAAe,EAC1B,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAW,EAAA,OAAA,CAAuB,IAAI,EACtC,GAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,GAAA,EAAY,EAAA,OAAA,CAAuB,IAAI,EACvC,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAwB,IAAI,EAC1D,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAwB,IAAI,EACtD,CAAC,GAAgB,IAAA,EAAqB,EAAA,SAAA,CAAS,EAAK,EACpD,CAAC,EAAK,IAAA,EAAU,EAAA,SAAA,KAAe,KAAK,IAAI,CAAC,GAG/C,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAK,gBAAkB,EAAO,KAAK,IAAI,CAAC,EAAG,IAAM,EACvD,UAAa,cAAc,CAAE,CAC/B,EAAG,CAAC,CAAC,EAEL,IAAM,EAAO,EAAS,KAChB,EAAY,GAAM,UACxB,EAAA,EAAA,UAAA,KAAgB,CACV,GAAW,GAAc,IAAI,IAAI,EAAU,IAAK,GAAM,EAAE,EAAE,CAAC,CAAC,CAClE,EAAG,CAAC,CAAS,CAAC,EAEd,IAAM,GAAA,EAAM,EAAA,QAAA,MAAe,GAAa,CAAC,EAAA,CAAG,OAAQ,GAAM,CAAC,EAAS,IAAI,EAAE,EAAE,CAAC,EAAG,CAAC,EAAW,CAAQ,CAAC,EAC/F,EAAQ,EAAG,cACX,GAAA,EAAQ,EAAA,QAAA,KAAc,GAAc,EAAK,CAAK,EAAG,CAAC,EAAK,CAAK,CAAC,EAC7D,GAAA,EAAS,EAAA,QAAA,KAAc,GAAY,CAAG,EAAG,CAAC,CAAG,CAAC,EAC9C,EAAW,GAAc,GAAM,SAAW,KAAM,CAAK,EACrD,GAAmB,EAAU,MAAM,iBAAmB,KAAS,CAAC,GAGhE,EAAU,EAAG,eACnB,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,EAAS,OACd,IAAM,EAAO,EAAI,KAAM,GAAM,EAAE,KAAO,CAAO,EACxC,IACL,EAAc,EAAK,EAAE,EACrB,EAAY,EAAK,EAAE,EACrB,EAAG,CAAC,EAAS,CAAG,CAAC,GAGjB,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,EAAM,SAAW,EAAG,CAClB,IAAe,MAAM,EAAc,IAAI,EAC3C,MACF,EACI,CAAC,GAAc,CAAC,EAAM,KAAM,GAAM,EAAE,KAAO,CAAU,IAAG,EAAc,EAAM,EAAE,CAAE,EAAE,CACxF,EAAG,CAAC,EAAO,CAAU,CAAC,EAEtB,IAAM,EAAa,EAAW,EAAI,KAAM,GAAM,EAAE,KAAO,CAAQ,GAAK,KAAO,MAC3E,EAAA,EAAA,UAAA,KAAgB,CAEV,GAAY,CAAC,GAAY,EAAY,IAAI,CAC/C,EAAG,CAAC,EAAU,CAAU,CAAC,EAEzB,IAAM,GAAA,EAAc,EAAA,YAAA,KAAkB,EAAY,IAAI,EAAG,CAAC,CAAC,EAErD,IAAA,EAAY,EAAA,YAAA,KAAkB,CAI9B,EAAY,GAAK,SAAS,cAAc,+CAA+C,IACvF,EAAU,EAAY,EACrB,EAAkB,EACzB,EAAG,CAAC,EAAU,CAAW,CAAC,EAC1B,EAAa,CAAE,KAAM,GAAM,aAAc,EAAU,QAAS,GAAW,gBAAiB,CAAQ,CAAC,EAIjG,IAAM,GAAA,EAAgB,EAAA,OAAA,CAAO,EAAK,GAClC,EAAA,EAAA,UAAA,KAAgB,CACV,GACF,EAAc,QAAU,GACxB,EAAU,SAAS,MAAM,CAAE,cAAe,EAAK,CAAC,GACvC,EAAc,UACvB,EAAc,QAAU,GACxB,EAAQ,SAAS,MAAM,CAAE,cAAe,EAAK,CAAC,EAElD,EAAG,CAAC,CAAQ,CAAC,EAMb,IAAM,EAAW,EAAM,OAAS,GAChC,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,GAAY,EAAU,OAC3B,IAAM,EAAS,SAAS,eACpB,IAAW,MAAQ,IAAW,SAAS,MAAQ,IAAW,EAAS,UAAS,EAAQ,SAAS,MAAM,CAAE,cAAe,EAAK,CAAC,CAChI,EAAG,CAAC,EAAU,CAAQ,CAAC,EAEvB,IAAM,GAAA,EAAa,EAAA,YAAA,CAAa,GAAuB,CACrD,IAAM,EAAS,EAAK,OACpB,OAAQ,EAAO,KAAf,CACE,IAAK,WACH,EAAc,EAAK,EAAE,EACrB,EAAY,EAAK,EAAE,EACnB,OACF,IAAK,UACH,EAAkB,EAClB,EAAiB,EAAO,SAAS,EACjC,OACF,IAAK,UACH,EAAkB,EAClB,EAAgB,EAAO,QAAS,EAAO,MAAM,EAC7C,OACF,IAAK,OACH,EAAkB,EAClB,EAAgB,OAAQ,QAAQ,EAAO,QAAQ,EAC/C,OACF,IAAK,MAEH,OAAO,KAAK,EAAO,IAAK,SAAU,qBAAqB,EACvD,OACF,QACE,MACJ,CACF,EAAG,CAAC,CAAC,EAEC,GAAA,EAAM,EAAA,YAAA,EAAa,EAAoB,IAA6B,CACxE,IAAM,EAAS,GAAS,EAAM,CAAI,EAClC,GAAI,CAAC,EAAQ,CACX,EAAM,KAAK,cAAc,EAAK,gBAAiB,SAAS,EACxD,MACF,CACA,GAAI,CAAC,GAAmB,EAAO,QAAS,CACtC,EAAM,KAAK,uEAAwE,SAAS,EAC5F,MACF,CACA,GAAkB,EAAM,EAAQ,CAAE,aAAY,MAAO,EAAM,IAAK,CAAC,CACnE,EAAG,CAAC,EAAiB,EAAY,CAAK,CAAC,EAEvC,SAAS,EAAK,EAAe,CAC3B,GAAI,EAAM,SAAW,EAAG,OACxB,IAAM,EAAK,KAAK,IAAI,EAAG,EAAM,UAAW,GAAM,EAAE,KAAO,CAAU,CAAC,EAC5D,EAAO,GAAO,EAAK,EAAQ,EAAM,QAAU,EAAM,QACvD,EAAc,EAAK,EAAE,EACjB,GAAU,EAAY,EAAK,EAAE,CACnC,CAEA,SAAS,EAAU,EAAe,CAChC,IAAM,EAAK,EAAiB,QAAQ,CAAK,EACnC,EAAO,GAAkB,EAAK,EAAQ,EAAiB,QAAU,EAAiB,QACxF,EAAsB,CAAI,EAC1B,EAAY,IAAI,CAClB,CAEA,SAAS,GAAU,EAA2C,CAI5D,GAHI,EAAM,kBAAoB,GAAa,EAAM,MAAM,GAGnD,EAAE,EAAM,kBAAkB,OAAS,CAAC,EAAS,SAAS,SAAS,EAAM,MAAM,EAAG,OAClF,IAAM,EAAU,EAAa,EAAM,YAAa,CAAC,QAAQ,CAAC,EAI1D,GAHI,CAAC,GAGD,EAAQ,KAAO,eAAiB,EAAM,kBAAkB,kBAAmB,OAC/E,EAAM,eAAe,EACrB,EAAM,gBAAgB,EACtB,IAAM,EAAU,EAAM,KAAM,GAAM,EAAE,MAAQ,GAAY,EAAW,GAAK,KACxE,OAAQ,EAAQ,GAAhB,CACE,IAAK,cACH,EAAK,CAAC,EACN,OACF,IAAK,cACH,EAAK,EAAE,EACP,OACF,IAAK,oBACH,EAAU,CAAC,EACX,OACF,IAAK,oBACH,EAAU,EAAE,EACZ,OACF,IAAK,cACC,GAAS,EAAY,EAAQ,EAAE,EACnC,OACF,QAAS,CACP,IAAM,EAAO,GAAc,EAAQ,IAC/B,GAAQ,GAAS,EAAI,EAAS,CAAI,CACxC,CACF,CACF,CAEA,IAAM,EAAU,CAAC,IAAS,EAAS,SAAW,WAAa,EAAS,SAAW,QACzE,EAAc,CAAC,GAAQ,EAAS,SAAW,cAEjD,OAAA,EAAO,GAAA,aAAA,EACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAU,YAAc,GAAM,EAAE,SAAW,EAAE,eAAiB,EAAkB,EACrG,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,IAAK,EACL,KAAK,SACL,aAAW,OACX,kBAAiB,EACjB,UAAW,EAAO,MAClB,oBAAmB,EAAU,OAAS,OACtC,qBAAmB,YACnB,aAAW,SACX,SAAU,GACC,aAVb,SAAA,EAYE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,KAA1B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,MAAnC,SAAA,CAA0C,YAEvC,GAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAO,GAAU,CAAA,EAAI,IAChE,CACJ,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAQ,CAAA,EAAG,aAAW,kBAAkB,QAAS,CAAoB,CAAA,CAC3G,KAER,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,KAAK,UACL,aAAW,SACX,UAAW,EAAO,OAClB,UAAY,GAAM,EACZ,EAAE,MAAQ,cAAgB,EAAE,MAAQ,eACxC,EAAE,eAAe,EACjB,EAAU,EAAE,MAAQ,aAAe,EAAI,EAAE,EAC3C,EAEC,SAAA,EAAiB,IAAK,IACrB,EAAA,EAAA,KAAA,CAAC,SAAD,CAEE,KAAK,SACL,KAAK,MACL,gBAAe,IAAM,EACrB,SAAU,IAAM,EAAQ,EAAI,GAC5B,UAAW,EAAO,MAClB,YAAe,CACb,EAAsB,CAAC,EACvB,EAAY,IAAI,CAClB,EAVF,SAAA,CAYG,EAAY,IACb,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAY,aAAY,GAAG,EAAO,GAAG,QAAU,SAAA,EAAO,EAAS,CAAA,CACjF,CAbD,EAAA,CAaC,CACT,CACE,CAAA,GAEL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,IAAK,EAAW,UAAW,EAAO,OAAQ,SAAU,GAAI,aAAW,cAAxE,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,KAAM,QAAS,EAAvD,SAAA,CAAoE,SAC3D,EAAY,EAAM,CAAC,YAAY,CAChC,CACP,CAAA,EAAA,EAAW,OAAO,OAAS,YAC1B,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SACrB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAEE,GAAI,EAAW,OAAO,WACL,kBACjB,uBAA0B,EAAkB,EAAI,EAChD,cAAiB,CACf,GAAa,EAAW,EAAE,EAC1B,GAAqB,EACrB,EAAY,CACd,CACD,EATM,EAAW,OAAO,UASxB,CACE,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,KAAM,EAAiB,MAAK,MAAO,EAAK,aAAc,EAA6B,iBAAkB,CAAA,CAEhH,CACH,CAAA,EAAA,GACF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAS,KAAK,SAAS,aAAW,UAAzD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,CAAA,CACX,CACH,CAAA,EAAA,GACF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,WAAY,SAAA,0CAA2C,CAAA,GAC5E,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,SAAA,mHAAoH,CAAA,CACjJ,CACH,CAAA,EAAA,EAAM,SAAW,GACnB,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,aAAc,GAAgB,CAAQ,EAAG,QAAS,EAAS,QAAS,cAAe,GAAM,UAAU,OAAS,KAAa,OAAQ,CAAA,GAE7I,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,IAAK,EACE,QACK,aACZ,SAAU,EAGV,OAAS,GAAO,CACd,EAAc,CAAE,EAChB,EAAY,CAAE,CAChB,EACK,MACL,MAAO,GAAG,EAAY,GAAO,aAC9B,CAAA,EAGF,EAAM,SAAW,GAAK,CAAC,GAAa,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,IAAK,EAAS,SAAU,GAAI,UAAW,EAAO,UAAW,cAAY,MAAQ,CAAA,EAAI,IACxH,IAEH,EAUE,MATF,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,KAAM,cAAY,OAA5C,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAC,OAAW,CAAA,CAAA,GACvF,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAgB,CAAA,CAAM,CAAA,EAAC,OAAW,CAAA,CAAA,GACpE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAC,UAAc,CAAA,CAAA,GACvD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAC,SAAa,CAAA,CAAA,GACtD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAC,OAAW,CAAA,CAAA,GACpD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAC,OAAW,CAAA,CAAA,GACpD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAC,SAAa,CAAA,CAAA,CACnF,CACN,CAAA,EACH,CAAC,EAAS,SAAW,EAAM,OAAS,GACnC,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,OAAQ,KAAK,OAAlC,SAAA,CAA0C,GAAgB,CAAQ,EAAE,iCAAkC,CACpG,CAAA,EAAA,IACD,GACF,CAAA,EACL,SAAS,IACX,CACF,CAEA,SAAS,GAAW,CAAE,UAAS,eAAc,gBAAe,SAAyG,CAUnK,OATI,GAEA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAO,aAAW,QAAzC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAW,cAAY,MAAQ,CAAA,GACvD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,WAAY,SAAA,WAAY,CAAA,GAC7C,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAY,SAAA,EAAgB,UAAU,EAAc,GAAK,4BAAgC,CAAA,CAC3G,KAIP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAO,aAAW,UAAzC,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,WAArB,SAAA,CAAiC,kBAAgB,IAAU,MAAQ,GAAK,OAAO,EAAY,KAAS,8BAA+B,CACnI,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CAAiC,EAAa,GAAI,CAC/C,CAAA,CAAA,GAET,CAEA,IAAM,GAAgB,GAAsC,CAC1D,OAAQ,EAAK,OAAO,KAApB,CACE,IAAK,UACH,MAAO,YACT,IAAK,UACH,MAAO,QAAQ,EAAa,EAAK,OAAO,OAAO,CAAC,CAAC,QACnD,IAAK,OACH,MAAO,uBACT,IAAK,MACH,MAAO,iBACT,QACE,OAAO,IACX,CACF,EAEA,SAAS,GAAW,CAClB,OACA,MACA,QACA,eACA,mBAOC,CACD,IAAM,EAAc,GAAa,CAAI,EACrC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,KAA3B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,UAAY,SAAA,EAAK,KAAU,CAAA,EAChD,EAAK,QAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,WAAa,SAAA,EAAK,MAAU,CAAA,EAAI,MACpE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KAAtB,SAAA,CACG,EAAK,QAAQ,MAAQ,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KAAO,SAAA,EAAK,QAAQ,IAAS,CAAA,CAAG,CAAA,CAAA,EAAK,KAC/F,EAAK,QAAQ,IAAM,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,cAAgB,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAI,IAAE,EAAK,QAAQ,EAAO,CAAA,CAAA,CAAG,CAAA,CAAA,EAAK,KAC5E,EAAK,QAAQ,QAAU,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KAAO,SAAA,EAAK,QAAQ,MAAW,CAAA,CAAG,CAAA,CAAA,EAAK,MACpG,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,SAAW,CAAA,GACf,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAI,SAAO,EAAI,EAAK,MAAO,CAAG,CAAM,CAAA,CAAA,EACnC,EAAK,WAAa,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,QAAU,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,SAAW,SAAA,EAAM,EAAK,UAAW,CAAG,CAAM,CAAA,CAAG,CAAA,CAAA,EAAK,IAC1G,KACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAvB,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,YAAe,EAAa,CAAI,EAAG,aAAc,EAAK,OAAO,OAAS,OAAQ,EAAA,EAAA,IAAA,CAAC,GAAD,CAAmB,CAAA,EAAI,IAAA,GACrI,SAAA,CACK,CAAA,EACN,KACH,EAAK,QAAQ,IAAK,GAAW,CAC5B,IAAM,EAAM,EAAsB,EAAO,MACnC,EAAgB,EAAO,UAAY,KACzC,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAEE,KAAK,KACL,QAAS,EAAO,YAAc,SAAW,EAAO,OAAS,UAAY,UAAY,SACjF,SAAU,GAAiB,CAAC,EAC5B,YAAe,EAAM,EAAM,EAAO,IAAI,EACtC,oBAAmB,EANrB,SAAA,CAQG,EAAO,MACP,GAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UAAW,cAAY,OAAQ,SAAA,CAAS,CAAA,EAAI,IACpE,CATD,EAAA,EAAO,IASN,CAEZ,CAAC,CACE,IACH,EAAqG,MAAnF,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,OAAQ,SAAA,iDAAkD,CAAA,CAC5F,GAEb"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._layout_1e5d8_8{grid-template-columns:minmax(320px,420px) minmax(0,1fr);height:100%;min-height:0;display:grid}._listPane_1e5d8_9{border-right:1px solid var(--border-subtle);background:var(--bg-surface);flex-direction:column;min-height:0;display:flex}._detailPane_1e5d8_10{scrollbar-gutter:stable;background:var(--bg-canvas);flex-direction:column;min-height:0;display:flex;overflow-y:auto}._filters_1e5d8_12{gap:var(--space-2);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border-subtle);flex-wrap:wrap;flex-shrink:0;display:flex}._filterField_1e5d8_13{gap:var(--space-1);flex-direction:column;flex:1;min-width:120px;display:flex}._filterLabel_1e5d8_14{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._filters_1e5d8_12 input{min-height:var(--density-row,32px);padding:0 var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-family:var(--font-ui);font-size:var(--text-xs-size)}._filterSelect_1e5d8_31{flex:1;min-width:120px}._filterSelect_1e5d8_31>label{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;font-weight:var(--font-weight-regular,400);color:var(--text-tertiary)}._filters_1e5d8_12 input[type=search]::-webkit-search-cancel-button{appearance:none}._count_1e5d8_46{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);font-size:var(--text-xs-size);color:var(--text-tertiary);border-bottom:1px solid var(--border-subtle);flex-shrink:0;display:flex}._rows_1e5d8_48{scrollbar-gutter:stable;flex:1;min-height:0;overflow-y:auto}._row_1e5d8_48{column-gap:var(--space-3);width:100%;padding:var(--space-3) var(--space-4);border:0;border-bottom:1px solid var(--border-subtle);text-align:left;color:var(--text-primary);cursor:pointer;background:0 0;grid-template-columns:2px minmax(0,1fr);display:grid}._row_1e5d8_48:hover{background:var(--bg-hover)}._rowActive_1e5d8_63{background:var(--bg-selected)}._row_1e5d8_48:focus-visible{outline:2px solid var(--border-focus);outline-offset:-2px;box-shadow:none}._riskRule_1e5d8_68{border-radius:var(--radius-full);background:var(--border-strong);grid-row:1/span 2}._riskRule_1e5d8_68[data-risk=high]{background:var(--status-danger-solid)}._riskRule_1e5d8_68[data-risk=medium]{background:var(--status-warning-solid)}._riskRule_1e5d8_68[data-risk=low]{background:var(--status-success-solid)}._rowTitle_1e5d8_72{font-size:var(--text-sm-size);line-height:var(--text-sm-line);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._rowMeta_1e5d8_73{align-items:center;gap:var(--space-1) var(--space-3);font-size:var(--text-xs-size);color:var(--text-tertiary);flex-wrap:wrap;margin-top:2px;display:flex}._row_1e5d8_48:hover ._rowMeta_1e5d8_73,._rowActive_1e5d8_63 ._rowMeta_1e5d8_73{color:var(--text-secondary)}._rowMetaMono_1e5d8_82{font-family:var(--font-mono);text-overflow:ellipsis;white-space:nowrap;max-width:14ch;overflow:hidden}._rowAge_1e5d8_83{font-family:var(--font-display)}._riskWord_1e5d8_84{font-family:var(--font-display);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;font-size:var(--text-2xs-size,11px)}._riskWord_1e5d8_84[data-risk=high]{color:var(--status-danger-fg)}._riskWord_1e5d8_84[data-risk=medium]{color:var(--status-warning-fg)}._riskWord_1e5d8_84[data-risk=low]{color:var(--status-success-fg)}._detail_1e5d8_10{padding:var(--space-5) var(--space-6) var(--space-16);max-width:1040px}._detailHead_1e5d8_91{padding-bottom:var(--space-4);border-bottom:1px solid var(--border-subtle)}._detailTitle_1e5d8_92{font-family:var(--font-display);font-size:var(--text-xl-size);line-height:var(--text-xl-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display,-.02em)}._detailMeta_1e5d8_93{align-items:center;gap:var(--space-2) var(--space-3);margin-top:var(--space-2);font-size:var(--text-xs-size);color:var(--text-tertiary);flex-wrap:wrap;display:flex}._detailMeta_1e5d8_93 code{font-family:var(--font-mono)}._summary_1e5d8_95{margin-top:var(--space-3);font-size:var(--text-base-size);line-height:var(--text-base-line);color:var(--text-secondary);max-width:72ch}._block_1e5d8_97{padding-block:var(--space-5);border-bottom:1px solid var(--border-subtle)}._blockTitle_1e5d8_98{font-family:var(--font-display);font-size:var(--text-xs-size);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;font-weight:var(--font-weight-semibold);color:var(--text-tertiary);margin-bottom:var(--space-3)}._defs_1e5d8_107{gap:var(--space-2) var(--space-4);font-size:var(--text-sm-size);line-height:var(--text-sm-line);grid-template-columns:max-content minmax(0,1fr);margin:0;display:grid}._defs_1e5d8_107 dt{color:var(--text-tertiary)}._defs_1e5d8_107 dd{color:var(--text-primary);overflow-wrap:anywhere;min-width:0;margin:0}._defs_1e5d8_107 dd code{font-family:var(--font-mono);font-size:var(--text-xs-size)}._muted_1e5d8_111{color:var(--text-tertiary)}._failedChecks_1e5d8_112{margin:var(--space-1) 0 0;font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--status-danger-fg)}._actions_1e5d8_114{justify-content:flex-end;align-items:center;gap:var(--space-2);padding-top:var(--space-5);flex-wrap:wrap;display:flex}._actionNote_1e5d8_115{min-width:240px;font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);flex:1}._reject_1e5d8_116,._approve_1e5d8_117{min-height:var(--density-row,32px);padding:0 var(--space-4);border-radius:var(--radius-sm);font-family:var(--font-ui);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);cursor:pointer}._reject_1e5d8_116{border:1px solid var(--border-default);background:var(--bg-surface);color:var(--text-primary)}._reject_1e5d8_116:hover:not(:disabled){border-color:var(--status-danger-solid);color:var(--status-danger-fg)}._approve_1e5d8_117{border:1px solid var(--accent-500);background:var(--accent-500);color:var(--accent-contrast)}._approve_1e5d8_117:hover:not(:disabled){background:var(--accent-600);border-color:var(--accent-600)}._reject_1e5d8_116:disabled,._approve_1e5d8_117:disabled{border-color:var(--border-default);background:var(--bg-surface);color:var(--text-disabled);cursor:not-allowed}._decided_1e5d8_133{padding-top:var(--space-5);font-size:var(--text-sm-size);color:var(--text-secondary)}._empty_1e5d8_135{padding:var(--space-8) var(--space-6);font-size:var(--text-sm-size);line-height:var(--text-base-line);color:var(--text-secondary);max-width:62ch}._emptyStrong_1e5d8_136{color:var(--text-primary);font-weight:var(--font-weight-medium)}._error_1e5d8_137{margin:var(--space-4);padding:var(--space-3);border:1px solid var(--status-danger-solid);border-radius:var(--radius-sm);background:var(--status-danger-bg);color:var(--status-danger-fg);font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._skeletons_1e5d8_138{gap:var(--space-2);padding:var(--space-4);flex-direction:column;display:flex}@media (max-width:900px){._layout_1e5d8_8{grid-template-rows:minmax(160px,38%) minmax(0,1fr);grid-template-columns:minmax(0,1fr)}._listPane_1e5d8_9{border-right:0;border-bottom:1px solid var(--border-subtle)}._detail_1e5d8_10{padding:var(--space-4) var(--space-4) var(--space-12)}}._backdrop_1088p_4{z-index:var(--z-dialog);background:var(--bg-overlay);animation:_fade_1088p_1 var(--duration-fast) var(--ease-standard);justify-content:flex-end;display:flex;position:fixed;inset:0}._panel_1088p_14{width:min(480px, calc(100vw - var(--space-8)));background:var(--bg-surface);border-left:1px solid var(--border-default);height:100%;box-shadow:var(--shadow-dialog);animation:_slide_1088p_1 var(--duration-base) var(--ease-decelerate);outline:none;flex-direction:column;display:flex}._panel_1088p_14[data-presentation=full]{border-left:0;width:100%;animation-name:_rise_1088p_1}._head_1088p_33{justify-content:space-between;align-items:center;gap:var(--space-3);min-height:var(--strip-height);padding:var(--space-2) var(--space-3) var(--space-2) var(--space-4);border-bottom:1px solid var(--border-subtle);display:flex}._title_1088p_43{align-items:baseline;gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-md-size);line-height:var(--text-md-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display);display:flex}._titleCount_1088p_54{font-family:var(--font-ui);font-size:var(--text-sm-size);font-weight:var(--font-weight-regular);font-variant-numeric:tabular-nums;color:var(--text-tertiary)}._splits_1088p_62{gap:var(--space-1);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--border-subtle);scrollbar-width:none;display:flex;overflow-x:auto}._split_1088p_62{align-items:center;gap:var(--space-1);min-height:var(--control-h-sm);padding:0 var(--space-2);border-radius:var(--radius-sm);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-sm-line);flex:none;display:inline-flex}._split_1088p_62:hover{background:var(--bg-hover);color:var(--text-primary)}._split_1088p_62[aria-selected=true]{background:var(--bg-selected);color:var(--text-primary);font-weight:var(--font-weight-medium)}._splitCount_1088p_86{border-radius:var(--radius-full);background:var(--bg-hover);min-width:18px;font-size:var(--text-2xs-size);text-align:center;font-variant-numeric:tabular-nums;color:var(--text-secondary);padding:0 4px;line-height:18px}._body_1088p_98{overscroll-behavior:contain;flex:1;min-height:0;position:relative;overflow-y:auto}._rows_1088p_106{outline:none}._rows_1088p_106:focus-visible{box-shadow:none}._rows_1088p_106:focus-visible ._row_1088p_106[aria-selected=true]{box-shadow:inset 0 0 0 2px var(--border-focus)}._row_1088p_106{column-gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border-subtle);cursor:pointer;grid-template-columns:2px minmax(0,1fr) auto;align-items:center;display:grid}._row_1088p_106:hover{background:var(--bg-hover)}._row_1088p_106[aria-selected=true]{background:var(--bg-selected)}._rule_1088p_125{border-radius:var(--radius-full);background:var(--border-strong);align-self:stretch}._row_1088p_106[data-severity=high] ._rule_1088p_125{background:var(--status-danger-solid)}._row_1088p_106[data-severity=warn] ._rule_1088p_125{background:var(--status-warning-solid)}._rowMain_1088p_133{flex-direction:column;gap:2px;min-width:0;display:flex}._rowTitle_1088p_135{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);overflow:hidden}._rowMeta_1088p_144{gap:0 var(--space-2);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);flex-wrap:wrap;display:flex}._severity_1088p_153{font-family:var(--font-display);font-size:var(--text-2xs-size);letter-spacing:var(--tracking-label);text-transform:uppercase}._severity_1088p_153[data-severity=high]{color:var(--status-danger-fg)}._severity_1088p_153[data-severity=warn]{color:var(--status-warning-fg)}._mono_1088p_162{font-family:var(--font-mono);font-size:var(--text-xs-size)}._deadline_1088p_163{color:var(--status-warning-fg);font-variant-numeric:tabular-nums}._rowKeys_1088p_165{gap:2px;display:flex}._key_1088p_167,._inlineKey_1088p_168{border:1px solid var(--border-subtle);border-radius:var(--radius-xs);background:var(--bg-surface);min-width:18px;height:18px;font-family:var(--font-mono);font-size:var(--text-2xs-size);color:var(--text-secondary);justify-content:center;align-items:center;padding:0 4px;display:inline-flex}._inlineKey_1088p_168{margin-left:var(--space-2);background:0 0}._loading_1088p_184{gap:var(--space-2);padding:var(--space-4);flex-direction:column;display:flex}._empty_1088p_186{align-items:center;gap:var(--space-2);padding:var(--space-16) var(--space-6);text-align:center;flex-direction:column;display:flex}._emptyTitle_1088p_194{font-family:var(--font-display);font-size:var(--text-md-size);line-height:var(--text-md-line);font-weight:var(--font-weight-semibold);color:var(--text-primary)}._emptyBody_1088p_201{max-width:44ch;font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-secondary)}._clearMark_1088p_209{width:40px;height:40px;margin-bottom:var(--space-2);border-radius:var(--radius-full);background:var(--status-success-bg);position:relative}._clearMark_1088p_209:after{content:"";border:solid var(--status-success-solid);border-width:0 2px 2px 0;width:10px;height:16px;position:absolute;top:10px;left:14px;transform:rotate(45deg)}._focusSink_1088p_229{outline:none;width:1px;height:1px;position:absolute;overflow:hidden}._detail_1088p_231{outline:none}._back_1088p_4{margin:var(--space-2) var(--space-3) 0;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--text-xs-size);color:var(--text-secondary);align-items:center;display:inline-flex}._back_1088p_4:hover{background:var(--bg-hover);color:var(--text-primary)}._approval_1088p_245>div{padding:var(--space-3) var(--space-4) var(--space-12)}._item_1088p_247{gap:var(--space-4);padding:var(--space-3) var(--space-4) var(--space-8);flex-direction:column;display:flex}._itemTitle_1088p_249{font-family:var(--font-display);font-size:var(--text-lg-size);line-height:var(--text-lg-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display)}._itemDetail_1088p_257{font-size:var(--text-sm-size);line-height:var(--text-sm-line-relaxed);color:var(--text-secondary);overflow-wrap:anywhere}._defs_1088p_264{gap:var(--space-2) var(--space-4);font-size:var(--text-sm-size);line-height:var(--text-sm-line);grid-template-columns:max-content minmax(0,1fr);margin:0;display:grid}._defs_1088p_264 dt{color:var(--text-tertiary)}._defs_1088p_264 dd{overflow-wrap:anywhere;min-width:0;margin:0}._itemActions_1088p_275{gap:var(--space-2);flex-wrap:wrap;display:flex}._foot_1088p_277{gap:var(--space-1) var(--space-4);padding:var(--space-2) var(--space-4);border-top:1px solid var(--border-subtle);font-size:var(--text-2xs-size);line-height:var(--text-2xs-line);color:var(--text-tertiary);flex-wrap:wrap;display:flex}._foot_1088p_277 span{align-items:center;gap:2px;display:inline-flex}._caveat_1088p_289{padding:var(--space-2) var(--space-4);border-top:1px solid var(--border-subtle);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--status-warning-fg);background:var(--status-warning-bg);margin:0}@keyframes _fade_1088p_1{0%{opacity:0}}@keyframes _slide_1088p_1{0%{opacity:0;transform:translate(4px)}}@keyframes _rise_1088p_1{0%{opacity:0;transform:translateY(4px)}}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._backdrop_1088p_4,:root:not([data-motion=full]) ._panel_1088p_14{animation:none}}:root[data-motion=reduce] ._backdrop_1088p_4,:root[data-motion=reduce] ._panel_1088p_14{animation:none}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{$ as r,W as i,h as a,s as o}from"./global-DVgMguLr.js";import{n as ee}from"./MutationTokenDialog-Dn0tzCrh.js";import{o as s,r as c,x as te}from"./verse-queries-BjQoOTwv.js";import{t as l}from"./Segmented-B_8c_83S.js";import{r as u}from"./verse-store-BgKx_YGs.js";import{c as d,i as ne,n as f}from"./context-queries-DVdSLrYy.js";import{a as p,v as m}from"./git-model-5v5xGobf.js";import{i as h}from"./verse-model-E98kXngO.js";import{C as g,_ as re,a as ie,b as ae,c as _,g as v,h as y,i as oe,l as se,n as b,t as x,u as S,x as ce,y as C}from"./context-model-Bto3LZn2.js";import{n as le,t as ue}from"./SeatSelector-DaUO-zoK.js";import{n as de}from"./CapacityStrip-D6Yyg4a1.js";import{a as fe,m as pe,o as me,s as he,v as ge}from"./workspace-model-4hq_Mv3N.js";import{n as _e,t as ve}from"./folder-picker-C8zo3A56.js";var w=n(e(),1),T={option:`_option_qkog4_1`,toggle:`_toggle_qkog4_12`,details:`_details_qkog4_24`,nameLabel:`_nameLabel_qkog4_30`,name:`_name_qkog4_30`,hint:`_hint_qkog4_46`},E=t(),D=/^[a-z0-9][a-z0-9._-]{0,62}$/i;function O(e){return D.test(e)&&!e.endsWith(`.lock`)&&!e.includes(`..`)}function ye(e=new Date){let t=e=>String(e).padStart(2,`0`);return`chat-${t(e.getMonth()+1)}${t(e.getDate())}-${t(e.getHours())}${t(e.getMinutes())}`}function k(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/g,`-`).replace(/^[^a-z0-9]+/,``).replace(/-{2,}/g,`-`).slice(0,63)}function be({repoName:e,value:t,onChange:n,disabled:r=!1}){let i=(0,w.useId)(),a=(0,w.useId)(),o=O(t.name);return(0,E.jsxs)(`fieldset`,{className:T.option,disabled:r,children:[(0,E.jsxs)(`label`,{className:T.toggle,children:[(0,E.jsx)(`input`,{type:`checkbox`,checked:t.enabled,onChange:e=>n({enabled:e.target.checked,name:t.name||ye()}),"aria-describedby":a}),`Isolate in a worktree`]}),t.enabled?(0,E.jsxs)(`div`,{className:T.details,children:[(0,E.jsx)(`label`,{className:T.nameLabel,htmlFor:i,children:`Name`}),(0,E.jsx)(`input`,{id:i,className:T.name,value:t.name,onChange:e=>n({...t,name:k(e.target.value)}),spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,"aria-invalid":!o||void 0,"aria-describedby":a,maxLength:63})]}):null,(0,E.jsx)(`p`,{id:a,className:T.hint,children:t.enabled?o?(0,E.jsxs)(E.Fragment,{children:[`Creates `,(0,E.jsxs)(`code`,{children:[`~/.ashlr-worktrees/`,e,`/`,t.name]}),` on a new branch `,(0,E.jsxs)(`code`,{children:[`verse/`,t.name]}),`, from the current commit. Uncommitted changes stay in `,e,`.`]}):`Use letters, digits, dots, dashes or underscores.`:`The chat works on its own branch in its own folder, so your checkout is untouched.`})]})}async function xe(e,t){return t.enabled?(await m(e,t.name)).path:e}var A={width:`_width_stwix_1`,form:`_form_stwix_3`,field:`_field_stwix_4`,label:`_label_stwix_5`,optional:`_optional_stwix_13`,select:`_select_stwix_15`,input:`_input_stwix_16`,hint:`_hint_stwix_40`,error:`_error_stwix_41`,actions:`_actions_stwix_49`,cancel:`_cancel_stwix_50`,create:`_create_stwix_51`,capacity:`_capacity_stwix_72`,rootRow:`_rootRow_stwix_78`,removeRoot:`_removeRoot_stwix_87`,addRoot:`_addRoot_stwix_88`,context:`_context_stwix_108`,contextHead:`_contextHead_stwix_115`,contextBudget:`_contextBudget_stwix_122`,warn:`_warn_stwix_130`,fit:`_fit_stwix_137`,fitLine:`_fitLine_stwix_138`,fitBadge:`_fitBadge_stwix_147`,seatFacts:`_seatFacts_stwix_165`},Se=`\0workspace:`,j=`\0other`,Ce=(e,t)=>t();function we(e,t){return e?.seats[t]?.contextMode??`standard`}function Te(e,t,n){return e?r(e)?C(e,t):n!==`standard`&&i(e,`standard`)!==null?`standard`:null:null}function M(e){return e instanceof c?`Unlock actions with the mutation token to save a default.`:e instanceof o?e.detail??e.message:e instanceof Error?e.message:String(e)}function N({open:e,onClose:t,projects:n,seats:i,workspaces:o=[],initialProjectPath:c,initialSeat:l,busy:u=!1,error:m,onCreate:h,runMutation:re=Ce}){let ie=(0,w.useId)(),ae=(0,w.useId)(),_=(0,w.useId)(),y=(0,w.useId)(),oe=(0,w.useId)(),se=(0,w.useRef)(null),[b,S]=(0,w.useState)(``),[ce,T]=(0,w.useState)(``),[D,k]=(0,w.useState)(null),[N,ke]=(0,w.useState)(``),[Ae,P]=(0,w.useState)(null),[F,I]=(0,w.useState)([]),[je,Me]=(0,w.useState)([]),[Ne,L]=(0,w.useState)(!1),[Pe,R]=(0,w.useState)(null),[z,B]=(0,w.useState)(null),[Fe,Ie]=(0,w.useState)(null),[Le,V]=(0,w.useState)(null),[Re,ze]=(0,w.useState)(!1),[Be,H]=(0,w.useState)(null),[Ve,U]=(0,w.useState)({status:`idle`}),[W,He]=(0,w.useState)({enabled:!1,name:``}),[Ue,We]=(0,w.useState)(!1),Ge=(0,w.useRef)(new Map),Ke=(0,w.useMemo)(()=>[...n].sort((e,t)=>Number(t.enrolled)-Number(e.enrolled)||e.name.localeCompare(t.name)),[n]),qe=(0,w.useRef)({initialProjectPath:c,initialSeat:l,projects:n,seats:i,sortedProjects:Ke});qe.current={initialProjectPath:c,initialSeat:l,projects:n,seats:i,sortedProjects:Ke},(0,w.useEffect)(()=>{if(!e)return;let{initialProjectPath:t,initialSeat:n,projects:r,seats:i,sortedProjects:a}=qe.current,o=t&&r.some(e=>e.path===t)?t:null;S(o??(t?j:a[0]?.path??j)),T(o?``:t??``),k(De(n??null,i)??le(i)),ke(``),P(null),I([]),R(null),L(!1),Me([]),V(null),H(null),ze(!1),He({enabled:!1,name:ye()}),We(!1),Ge.current=new Map},[e]),(0,w.useEffect)(()=>{if(!e)return;let t=!1;return Ie(null),ne().then(e=>{t||B(e)}).catch(e=>{t||(B(null),Ie(M(e)))}),()=>{t=!0}},[e]),(0,w.useEffect)(()=>{e&&D===null&&i.length!==0&&k(De(l??null,i)??le(i))},[e,D,i,l]);let Je=a(te);(0,w.useEffect)(()=>{e&&Je()},[e,Je]);let Ye=(0,w.useMemo)(()=>{let e=new Map;for(let t of o)e.set(t.id,t);for(let t of je)e.has(t.id)||e.set(t.id,t);return[...e.values()]},[o,je]),G=b.startsWith(Se),K=G?b.slice(11):null,q=G?``:b===j?ce.trim():b,J=D===null?null:i.find(e=>e.id===D.seatId)??null,Y=J===null||D===null?null:g(J,D.model),Xe=J?.health.state===`unavailable`,X=J!==null&&Y!==null?v(J,Y):null,Ze=!G&&q.length>0,Qe=Ze&&W.enabled,$e=!u&&!Ue&&(G||q.length>0)&&D!==null&&!Xe&&Y!==null&&X===null&&(!Qe||O(W.name)),et=K===null?null:Ye.find(e=>e.id===K)??null,Z=D===null?`standard`:we(z,D.seatId),Q=C(Y,Le??Z),tt=r(Y),nt=C(Y,Z),rt=(0,w.useCallback)((e,t)=>D!==null&&e.id===D.seatId&&t.id===D.model?Q:C(t,we(z,e.id)),[D,Q,z]);function it(e){k(e),V(null),H(null)}async function at(){if(D===null||J===null)return;let e=Q;ze(!0),H(null);try{let t=await re(`Saving ${x[e]} as the default context mode for ${J.label}.`,()=>d({seatId:D.seatId,contextMode:e}).then(e=>({ok:!0,prefs:e}),e=>({ok:!1,error:e})));if(t===null)return;if(!t.ok){H({ok:!1,text:M(t.error)});return}B(t.prefs),V(null),H({ok:!0,text:`New chats on ${J.label} now start in ${x[e]}.`})}catch(e){H({ok:!1,text:M(e)})}finally{ze(!1)}}let ot=(0,w.useMemo)(()=>{if(K!==null)return{key:`w:${K}`,query:{workspaceId:K}};if(G)return null;let e=pe(q,F);if(!e.ok)return null;let[t,...n]=e.roots;return{key:`p:${e.roots.join(`
|
|
2
|
-
`)}`,query:n.length>0?{projectPath:t,extraRoots:n}:{projectPath:t}}},[K,G,q,F]),st=(0,w.useRef)(ot);st.current=ot;let $=ot?.key??null;(0,w.useEffect)(()=>{let t=st.current;if(!e||$===null||t===null){U({status:`idle`});return}let n=Ge.current.get($);if(n){U({status:`ready`,key:$,fit:n});return}let r=!1;U({status:`loading`,key:$});let i=setTimeout(()=>{f(t.query).then(e=>{Ge.current.set($,e),r||U({status:`ready`,key:$,fit:e})}).catch(e=>{r||U({status:`error`,key:$,message:M(e)})})},350);return()=>{r=!0,clearTimeout(i)}},[e,$]);let ct=$===null?{status:`idle`}:Ve.status!==`idle`&&Ve.key===$?Ve:{status:`loading`,key:$},lt=ct.status===`ready`?ct.fit:null,ut=he(J?.engine??null,1+F.length),dt=me(J?.engine??null,et?.roots.length??0),ft=ve();async function pt(){let e=await _e();e!==null&&e.length>0&&(S(j),T(e))}async function mt(e){let t=await _e();t!==null&&t.length>0&&I(F.map((n,r)=>r===e?t:n))}async function ht(){let e=pe(q,F);if(!e.ok){P(e.error);return}L(!0),P(null),R(null);try{let t=fe(e.roots[0]),n=await s({name:t,roots:e.roots});Me(e=>[...e,n]),S(`${Se}${n.id}`),R(`Saved. “${n.name}” is in this list from now on.`)}catch(e){P(e instanceof Error?e.message:String(e))}finally{L(!1)}}function gt(e){if(e.preventDefault(),!D){P(`Pick a seat first.`);return}if(Y===null){P(`Pick a model this seat offers.`);return}if(X!==null){P(`${Y.label} cannot run on this seat: ${X}.`);return}if(K!==null){P(null);let e={workspaceId:K,seatId:D.seatId,model:D.model};delete e.projectPath;let t=N.trim();t&&(e.title=t);let n=Te(Y,Q,Z);n!==null&&(e.contextMode=n),h(e);return}let t=pe(q,F);if(!t.ok){P(t.error);return}if(Qe&&!O(W.name)){P(`Name the worktree with letters, digits, dots, dashes or underscores.`);return}P(null);let[n,...r]=t.roots,i={projectPath:n,seatId:D.seatId,model:D.model};r.length>0&&(i.extraRoots=r);let a=N.trim();a&&(i.title=a);let o=Te(Y,Q,Z);if(o!==null&&(i.contextMode=o),!Qe){h(i);return}_t(n,i)}async function _t(e,t){We(!0);try{let n=await re(`Creating the worktree ${W.name} (a new branch verse/${W.name}) for this chat.`,()=>xe(e,W).then(e=>({ok:!0,folder:e}),e=>({ok:!1,error:e})));if(n===null)return;if(!n.ok){P(`The worktree could not be created: ${p(n.error)}`);return}await h({...t,projectPath:n.folder})}catch(e){P(p(e))}finally{We(!1)}}let vt=Ae??m??null;return(0,E.jsx)(ee,{open:e,onClose:t,titleId:ie,title:`New chat`,initialFocusRef:se,widthClassName:A.width,children:(0,E.jsxs)(`form`,{className:A.form,onSubmit:gt,noValidate:!0,children:[(0,E.jsxs)(`label`,{className:A.field,htmlFor:ae,children:[(0,E.jsx)(`span`,{className:A.label,children:`Project`}),(0,E.jsxs)(`select`,{id:ae,ref:se,value:b,onChange:e=>S(e.target.value),className:A.select,children:[Ye.length>0?(0,E.jsx)(`optgroup`,{label:`Saved projects`,children:Ye.map(e=>(0,E.jsxs)(`option`,{value:`${Se}${e.id}`,children:[e.name,` — `,ge(e)]},e.id))}):null,Ke.map(e=>(0,E.jsxs)(`option`,{value:e.path,children:[e.name,e.enrolled?``:` (recent)`,` — `,e.path]},e.path)),(0,E.jsx)(`option`,{value:j,children:`Other folder…`})]})]}),b===j&&!G?(0,E.jsxs)(`label`,{className:A.field,htmlFor:_,children:[(0,E.jsx)(`span`,{className:A.label,children:`Folder path`}),(0,E.jsxs)(`div`,{className:A.rootRow,children:[(0,E.jsx)(`input`,{id:_,className:A.input,value:ce,onChange:e=>T(e.target.value),placeholder:`/absolute/path/to/project`,autoComplete:`off`,spellCheck:!1}),ft?(0,E.jsx)(`button`,{type:`button`,className:A.addRoot,onClick:()=>void pt(),children:`Choose folder…`}):null]})]}):null,dt?(0,E.jsx)(`p`,{className:A.hint,children:dt}):null,G?null:(0,E.jsxs)(`div`,{className:A.field,children:[(0,E.jsxs)(`span`,{className:A.label,children:[`Also include `,(0,E.jsx)(`span`,{className:A.optional,children:`optional`})]}),F.map((e,t)=>(0,E.jsxs)(`div`,{className:A.rootRow,children:[(0,E.jsx)(`input`,{className:A.input,value:e,onChange:e=>I(F.map((n,r)=>r===t?e.target.value:n)),placeholder:`/absolute/path/to/another/folder`,"aria-label":`Additional folder ${t+1}`,autoComplete:`off`,spellCheck:!1}),ft?(0,E.jsx)(`button`,{type:`button`,className:A.removeRoot,onClick:()=>void mt(t),"aria-label":`Choose additional folder ${t+1}`,children:`Choose folder…`}):null,(0,E.jsx)(`button`,{type:`button`,className:A.removeRoot,onClick:()=>I(F.filter((e,n)=>n!==t)),"aria-label":`Remove additional folder ${t+1}`,children:`Remove`})]},t)),F.length+1<8?(0,E.jsx)(`button`,{type:`button`,className:A.addRoot,onClick:()=>I([...F,``]),children:`Add a folder`}):null,ut?(0,E.jsx)(`p`,{className:A.hint,children:ut}):null,(0,E.jsxs)(`div`,{className:A.rootRow,children:[(0,E.jsx)(`button`,{type:`button`,className:A.addRoot,onClick:()=>void ht(),disabled:Ne||q.length===0,children:Ne?`Saving…`:`Save as a project`}),(0,E.jsx)(`span`,{className:A.hint,children:`Keeps these folders in the list above. No chat needed first.`})]})]}),Pe?(0,E.jsx)(`p`,{role:`status`,className:A.hint,children:Pe}):null,Ze?(0,E.jsx)(be,{repoName:Ee(q),value:W,onChange:He,disabled:Ue||u}):null,(0,E.jsx)(ue,{id:oe,seats:i,value:D,onChange:it,workingSetTokens:lt?.totalEstTokens??null,modeFor:rt}),J===null?null:(0,E.jsx)(`div`,{className:A.capacity,children:(0,E.jsx)(de,{seats:i,seatIds:[J.id],local:`each`,headline:!1,title:`${J.label} capacity`})}),J===null||Y===null?null:(0,E.jsx)(Oe,{seat:J,option:Y,unavailableReason:X,mode:Q,offersModes:tt,savedDefault:nt,prefsLoaded:z!==null,prefsError:Fe,onMode:e=>{V(e),H(null)},savingDefault:Re,defaultNote:Be,onMakeDefault:()=>void at(),fitState:ct}),i.length===0?(0,E.jsx)(`p`,{className:A.hint,children:`No seats yet — connect an account or start Ollama, then reload.`}):null,(0,E.jsxs)(`label`,{className:A.field,htmlFor:y,children:[(0,E.jsxs)(`span`,{className:A.label,children:[`Title `,(0,E.jsx)(`span`,{className:A.optional,children:`optional`})]}),(0,E.jsx)(`input`,{id:y,className:A.input,value:N,onChange:e=>ke(e.target.value),placeholder:`Defaults to your first message`,maxLength:120})]}),vt?(0,E.jsx)(`p`,{role:`alert`,className:A.error,children:vt}):null,(0,E.jsxs)(`div`,{className:A.actions,children:[(0,E.jsx)(`button`,{type:`button`,className:A.cancel,onClick:t,children:`Cancel`}),(0,E.jsx)(`button`,{type:`submit`,className:A.create,disabled:!$e,children:Ue?`Creating worktree…`:u?`Creating…`:`Start chat`})]})]})})}function Ee(e){let t=e.replace(/[\\/]+$/,``).split(/[\\/]/);return t[t.length-1]||e}function De(e,t){if(e===null)return null;let n=t.find(t=>t.id===e.seatId),r=g(n,e.model);return r===null?e:{seatId:e.seatId,model:r.id}}function Oe({seat:e,option:t,unavailableReason:n,mode:r,offersModes:a,savedDefault:o,prefsLoaded:ee,prefsError:s,onMode:c,savingDefault:te,defaultNote:d,onMakeDefault:ne,fitState:f}){let p=(0,w.useId)(),m=ie(t,r),g=ae(e),v=ce(e),C=f.status===`ready`?y(f.fit.totalEstTokens,t,r,e.engine):null;return(0,E.jsxs)(`div`,{className:A.context,role:`group`,"aria-labelledby":p,children:[(0,E.jsxs)(`div`,{className:A.contextHead,children:[(0,E.jsx)(`span`,{id:p,className:A.label,children:`Context`}),(0,E.jsx)(`span`,{className:A.contextBudget,children:m===null?`Window unknown`:`${u(m.contextWindow)} window${m.autoCompactAt===null?``:` · compacts ≈${u(m.autoCompactAt)}`}`})]}),m!==null&&t.windowSource?(0,E.jsxs)(`p`,{className:A.hint,children:[`Window `,h[t.windowSource],`.`]}):null,n===null?null:(0,E.jsxs)(`p`,{className:A.warn,children:[t.label,` cannot run on this seat: `,n,`. Pick another model.`]}),a?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(l,{"aria-label":`Context mode`,size:`sm`,value:r,onChange:c,options:[`standard`,`expansive`].map(e=>{let n=i(t,e);return{value:e,label:n===null?x[e]:`${x[e]} · ≈${u(n.autoCompactAt??n.contextWindow)}`,ariaLabel:x[e]}})}),(0,E.jsx)(`p`,{className:A.hint,children:oe(e.engine,t,r)}),ee&&r!==o?(0,E.jsx)(`div`,{className:A.rootRow,children:(0,E.jsx)(`button`,{type:`button`,className:A.addRoot,onClick:ne,disabled:te,children:te?`Saving…`:`Make ${x[r]} the default for ${e.label}`})}):null,d===null?null:(0,E.jsx)(`p`,{role:d.ok?`status`:`alert`,className:d.ok?A.hint:A.error,children:d.text}),s===null?null:(0,E.jsxs)(`p`,{className:A.hint,children:[`Saved defaults could not be read (`,s,`); this chat starts in `,x[r],` unless you pick otherwise.`]})]}):(0,E.jsx)(`p`,{className:A.hint,children:re(e.engine,t)}),(0,E.jsx)(`div`,{className:A.fit,"aria-live":`polite`,children:f.status===`idle`?null:f.status===`loading`?(0,E.jsx)(`p`,{className:A.hint,children:`Sizing the chosen folders…`}):f.status===`error`?(0,E.jsxs)(`p`,{className:A.hint,children:[`Could not size the chosen folders: `,f.message]}):C===null?(0,E.jsxs)(`p`,{className:A.hint,children:[`~`,u(f.fit.totalEstTokens),` tokens of tracked code; this model’s budget is unknown, so no fit is claimed.`]}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsxs)(`p`,{className:A.fitLine,children:[(0,E.jsx)(`span`,{className:A.fitBadge,"data-fit":C,children:b[C]}),(0,E.jsx)(`span`,{children:_({verdict:C,tokens:f.fit.totalEstTokens,option:t,mode:r,floor:se(f.fit)})})]}),(0,E.jsx)(`p`,{className:A.hint,children:S(e.engine)})]})}),g===null&&v.length===0?null:(0,E.jsxs)(`ul`,{className:A.seatFacts,"aria-label":`${e.label} facts`,children:[g===null?null:(0,E.jsxs)(`li`,{children:[`Runs `,g,`.`]}),v.map(e=>(0,E.jsx)(`li`,{children:e},e))]})]})}export{N as NewChatDialog};
|
|
3
|
-
//# sourceMappingURL=NewChatDialog-B_BsS9pr.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{m as r}from"./global-DVgMguLr.js";import{C as i,n as a,y as o}from"./verse-ui-store-KTTKfv-T.js";import{S as s,T as c,c as l,f as u,i as d,n as f,t as p}from"./icons-DWb24OA6.js";import{C as m,b as h,s as g,x as _,y as v}from"./VerseConsoleApp-bjARLPwN.js";import{n as y}from"./CapacityStrip-D6Yyg4a1.js";import{t as b}from"./Button-0-nNbv1h.js";import"./primitives-DQvYikjm.js";import{a as x,s as S}from"./usage-queries-CQOpeE1H.js";var C=n(e(),1),w=[{id:`welcome`,title:`Welcome to Verse`,subtitle:`Five sections, one rail. Two minutes and you will know what each one does.`},{id:`accounts`,title:`Your seats`,subtitle:`Which provider accounts this machine can actually dispatch to right now.`},{id:`local`,title:`Local runtime`,subtitle:`Whether there is a model on this machine, and what that changes.`},{id:`stops`,title:`Three ways to stop`,subtitle:`They do not have the same blast radius. This is the one screen that says so.`},{id:`finish`,title:`Make it yours`,subtitle:`Theme, accent, density and font live in Settings. Then start a chat.`}];function T(e){return Number.isFinite(e)?Math.min(w.length-1,Math.max(0,Math.trunc(e))):0}var E=`Local seats cost nothing and consume no provider quota, so the autonomous loop can keep working after a cloud window is used up.`,D=`Without one, every turn and every autonomous tick spends a provider account, and a used-up window stops the work.`;function O(e){if(e.loading)return{tone:`unknown`,state:`checking`,summary:`Probing the local runtimes on this machine…`,meaning:E,fix:null,modelCount:0,toolCapableCount:0,stale:!1};if(!e.snapshot)return{tone:`unknown`,state:`not reported`,summary:`This server does not report local runtimes, so Verse cannot say whether one is available here.`,meaning:D,fix:e.unavailableReason,modelCount:0,toolCapableCount:0,stale:!1};let t=e.snapshot.models,n=t.filter(e=>e.supportsTools===!0).length,r=e.snapshot.runtimes.some(e=>e.stale);return e.snapshot.reachable?t.length===0?{tone:`attention`,state:`no models`,summary:`A local runtime answered, but it has no models installed.`,meaning:D,fix:`Pull a model into the runtime, then press Refresh in Usage.`,modelCount:0,toolCapableCount:0,stale:r}:{tone:`ok`,state:r?`available (retained reading)`:`available`,summary:`${t.length} local ${t.length===1?`model`:`models`} available`+(n>0?`, ${n} of them tool-capable.`:`, none of them tool-capable.`)+(r?` This is a retained reading, not a fresh probe.`:``),meaning:n>0?E:`${E} A model that cannot call tools can answer, but cannot run an agentic turn.`,fix:null,modelCount:t.length,toolCapableCount:n,stale:r}:{tone:`attention`,state:`unreachable`,summary:`No local runtime answered. Verse cannot tell whether one is not running or not installed — the probe only knows it got no answer.`,meaning:D,fix:`Start Ollama (or LM Studio) and press Refresh in Usage. If neither is installed, everything still works — it all runs on the cloud seats.`,modelCount:0,toolCapableCount:0,stale:r}}var k=[{name:`Pause`,scope:`Halts autonomous dispatch only. A running loop parks instead of exiting.`,limit:`Your own chats and the agent’s write tools keep working.`,reversible:`Reversible in one click, with no restart and no confirmation.`,tone:`ok`},{name:`Stop loop`,scope:`Stops the daemon — and engages the GLOBAL kill switch while doing it.`,limit:`That means it also refuses the agent’s own write tools, exactly like the emergency control.`,reversible:`Reversible, but confirm-guarded. For an ordinary halt, use Pause.`,tone:`attention`},{name:`Emergency stop`,scope:`Engages the global kill switch (~/.ashlr/KILL) directly.`,limit:`Every mutating path refuses: the loop, dispatch, and the agent’s own write tools.`,reversible:`Reversible, confirm-guarded, and deliberately separated from the other two.`,tone:`attention`}],A={card:`_card_13g9r_14`,"onboarding-in":`_onboarding-in_13g9r_1`,head:`_head_13g9r_56`,headText:`_headText_13g9r_64`,eyebrow:`_eyebrow_13g9r_72`,title:`_title_13g9r_80`,subtitle:`_subtitle_13g9r_88`,body:`_body_13g9r_96`,lead:`_lead_13g9r_107`,aside:`_aside_13g9r_113`,caveat:`_caveat_13g9r_114`,kbd:`_kbd_13g9r_125`,sections:`_sections_13g9r_138`,findings:`_findings_13g9r_139`,sectionRow:`_sectionRow_13g9r_148`,sectionIcon:`_sectionIcon_13g9r_160`,localIcon:`_localIcon_13g9r_161`,sectionText:`_sectionText_13g9r_173`,sectionName:`_sectionName_13g9r_180`,sectionBlurb:`_sectionBlurb_13g9r_190`,finding:`_finding_13g9r_139`,findingHead:`_findingHead_13g9r_210`,stopName:`_stopName_13g9r_218`,findingDetail:`_findingDetail_13g9r_225`,findingNote:`_findingNote_13g9r_231`,findingFix:`_findingFix_13g9r_237`,fixLabel:`_fixLabel_13g9r_245`,fixText:`_fixText_13g9r_254`,code:`_code_13g9r_260`,tone:`_tone_13g9r_276`,toneLabel:`_toneLabel_13g9r_283`,foot:`_foot_13g9r_305`,pips:`_pips_13g9r_315`,pip:`_pip_13g9r_315`,actions:`_actions_13g9r_338`},j=t();function M({tone:e,label:t}){let n=e===`ok`?d:e===`attention`?p:u;return(0,j.jsxs)(`span`,{className:A.tone,"data-tone":e,children:[(0,j.jsx)(n,{size:13,"aria-hidden":`true`,focusable:`false`}),(0,j.jsx)(`span`,{className:A.toneLabel,children:t})]})}function N({children:e}){return(0,j.jsx)(`div`,{className:A.body,children:e})}function P(){return(0,j.jsxs)(N,{children:[(0,j.jsx)(`p`,{className:A.lead,children:`Verse is the desktop surface over this machine’s agentic fleet. Everything it shows comes from one local server — no session, token or artifact leaves this machine.`}),(0,j.jsx)(`ul`,{className:A.sections,children:a.map((e,t)=>{let n=g[e.id];return(0,j.jsxs)(`li`,{className:A.sectionRow,children:[(0,j.jsx)(`span`,{className:A.sectionIcon,"aria-hidden":`true`,children:(0,j.jsx)(n,{})}),(0,j.jsxs)(`span`,{className:A.sectionText,children:[(0,j.jsxs)(`span`,{className:A.sectionName,children:[e.label,` `,(0,j.jsxs)(`kbd`,{className:A.kbd,children:[`⌘`,t+1]})]}),(0,j.jsx)(`span`,{className:A.sectionBlurb,children:e.blurb})]})]},e.id)})}),(0,j.jsxs)(`p`,{className:A.sectionBlurb,children:[(0,j.jsx)(`kbd`,{className:A.kbd,children:`⌘K`}),` runs anything by name · `,(0,j.jsx)(`kbd`,{className:A.kbd,children:`⌘J`}),` is everything waiting on you · Settings, Apps & Accounts and Usage are under the gear.`]})]})}function F(){return(0,j.jsxs)(N,{children:[(0,j.jsx)(y,{density:`compact`,headline:!0,local:`collapse`,labelledBy:`verse-onboarding-title`,emptyText:`No seats reported yet. Connect an account in Apps & Accounts, or start Ollama for local models.`,renderActions:e=>e.connection?.fixCommand?(0,j.jsxs)(`p`,{className:A.findingFix,children:[(0,j.jsx)(`span`,{className:A.fixLabel,children:`Fix`}),(0,j.jsx)(`code`,{className:A.code,children:e.connection.fixCommand.join(` `)})]}):null}),(0,j.jsx)(`p`,{className:A.aside,children:`Every window, reset and reserve lives in Apps & Accounts, under the gear.`})]})}function I(){let e=r(x),t=(0,C.useMemo)(()=>O({snapshot:e.data?.available?S(e.data.raw):null,loading:e.data===void 0&&e.status!==`error`,unavailableReason:e.data?.reason??e.error?.message??null}),[e.data,e.status,e.error]);return(0,j.jsxs)(N,{children:[(0,j.jsxs)(`div`,{className:A.findingHead,children:[(0,j.jsx)(`span`,{className:A.localIcon,"aria-hidden":`true`,children:(0,j.jsx)(l,{size:15})}),(0,j.jsx)(M,{tone:t.tone,label:t.state})]}),(0,j.jsx)(`p`,{className:A.lead,children:t.summary}),(0,j.jsx)(`p`,{className:A.findingDetail,children:t.meaning}),t.fix?(0,j.jsxs)(`p`,{className:A.findingFix,children:[(0,j.jsx)(`span`,{className:A.fixLabel,children:`Fix`}),(0,j.jsx)(`span`,{className:A.fixText,children:t.fix})]}):null]})}function L(){return(0,j.jsxs)(N,{children:[(0,j.jsxs)(`p`,{className:A.lead,children:[`Fleet `,(0,j.jsx)(`kbd`,{className:A.kbd,children:`⌘2`}),` has three stop controls. They are not interchangeable, and the difference is the most important thing on this screen.`]}),(0,j.jsx)(`ul`,{className:A.findings,children:k.map(e=>(0,j.jsxs)(`li`,{className:A.finding,children:[(0,j.jsxs)(`div`,{className:A.findingHead,children:[(0,j.jsx)(`span`,{className:A.stopName,children:e.name}),(0,j.jsx)(M,{tone:e.tone,label:e.tone===`ok`?`narrow`:`global`})]}),(0,j.jsx)(`p`,{className:A.findingDetail,children:e.scope}),(0,j.jsx)(`p`,{className:A.findingDetail,children:e.limit}),(0,j.jsx)(`p`,{className:A.findingNote,children:e.reversible})]},e.name))})]})}function R(){return(0,j.jsxs)(N,{children:[(0,j.jsxs)(`p`,{className:A.lead,children:[`Settings `,(0,j.jsx)(`kbd`,{className:A.kbd,children:`⌘,`}),` carries theme, accent hue, density, display font, corner radius and reduced motion. Every change applies as you make it — there is no save button.`]}),(0,j.jsx)(b,{variant:`subtle`,icon:(0,j.jsx)(s,{size:14}),onClick:()=>i(`settings`),children:`Open Settings`}),(0,j.jsx)(`p`,{className:A.aside,children:`You can replay this tour any time from Settings → Onboarding.`})]})}var z=[P,F,I,L,R];function B(){let{open:e,step:t}=v(),n=T(t),r=w[n],i=z[n],a=n===w.length-1,s=(0,C.useCallback)(()=>_(),[]),l=(0,C.useRef)(null);return(0,C.useEffect)(()=>{if(!e)return;function t(e){if(e.key!==`Escape`)return;let t=l.current;t&&e.target instanceof Node&&t.contains(e.target)&&(e.preventDefault(),_())}return document.addEventListener(`keydown`,t),()=>document.removeEventListener(`keydown`,t)},[e]),e?(0,j.jsxs)(`aside`,{ref:l,className:A.card,"aria-labelledby":`verse-onboarding-title`,role:`region`,children:[(0,j.jsxs)(`header`,{className:A.head,children:[(0,j.jsxs)(`div`,{className:A.headText,children:[(0,j.jsxs)(`p`,{className:A.eyebrow,children:[`Getting started · `,n+1,` of `,w.length]}),(0,j.jsx)(`h2`,{id:`verse-onboarding-title`,className:A.title,children:r.title}),(0,j.jsx)(`p`,{className:A.subtitle,children:r.subtitle})]}),(0,j.jsx)(b,{iconOnly:!0,variant:`ghost`,size:`sm`,"aria-label":`Close getting started`,icon:(0,j.jsx)(c,{size:14}),onClick:s})]}),(0,j.jsx)(i,{}),(0,j.jsxs)(`footer`,{className:A.foot,children:[(0,j.jsx)(`ol`,{className:A.pips,"aria-hidden":`true`,children:w.map((e,t)=>(0,j.jsx)(`li`,{className:A.pip,"data-state":t===n?`current`:t<n?`done`:`todo`},e.id))}),(0,j.jsxs)(`div`,{className:A.actions,children:[(0,j.jsx)(b,{variant:`ghost`,size:`sm`,onClick:s,children:`Skip setup`}),n>0?(0,j.jsx)(b,{variant:`subtle`,size:`sm`,onClick:()=>m(n-1),children:`Back`}):null,a?(0,j.jsx)(b,{variant:`primary`,size:`sm`,icon:(0,j.jsx)(f,{size:14}),onClick:()=>{h(),o(`new-chat`)},children:`Start a first chat`}):(0,j.jsx)(b,{variant:`primary`,size:`sm`,onClick:()=>m(n+1),children:`Next`})]})]})]}):null}export{B as OnboardingFlow};
|
|
2
|
-
//# sourceMappingURL=OnboardingFlow-CtCPpgoX.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{M as r,O as i,a,l as o,s}from"./global-DVgMguLr.js";import{d as c,f as l,y as u}from"./workbench-types-DzN-5trg.js";import{n as ee}from"./viewport-ZB86jdES.js";import{i as te,r as ne}from"./section-visibility-CSrsTcwK.js";import{T as d,l as re,v as ie}from"./icons-DWb24OA6.js";import{t as f}from"./MessageMarkdown-C4pl9LI5.js";import{t as ae}from"./Segmented-B_8c_83S.js";import{n as p,t as m}from"./Button-0-nNbv1h.js";import{t as h}from"./EmptyState-DdJ4CxtO.js";import{a as oe,c as se,d as ce,i as le,l as ue,n as de,o as fe,s as g,t as pe}from"./terminal-icons-CxUYaWX9.js";var _=n(e(),1),v=`/api/verse/preview/ticket`;function y(e){return new URLSearchParams(e).toString()}var b={targets:(e,t)=>o(`${l}?${y({sessionId:e})}`,t),ticket:(e,t)=>o(`${v}?${y({sessionId:e,path:t})}`),text:async(e,t)=>{let n=`${c}?${y({sessionId:e,path:t})}`,a=await fetch(n,{credentials:`same-origin`,headers:{"x-ashlr-read-client":i()}});if(a.status===401)throw r(),new s(`Read session expired.`,401,n);if(!a.ok)throw new s(`GET ${n} failed (HTTP ${a.status}).`,a.status,n);return a.text()}};function x(e){return e.port||(e.protocol===`https:`?`443`:`80`)}function S(e,t){let n=e.trim();if(n.length===0||n.length>2048||/\s/.test(n))return{kind:`invalid`};let r=n;if(/^:?\d{2,5}$/.test(n))r=`http://localhost:${n.replace(`:`,``)}/`;else if(/^(?:localhost|127\.0\.0\.1)(?::\d{1,5})?(?:[/?#].*)?$/i.test(n))r=`http://${n}`;else if(!/^[a-z][a-z0-9+.-]*:/i.test(n)){if(!/^[\w-]+(?:\.[\w-]+)+(?::\d{1,5})?(?:[/?#].*)?$/.test(n))return{kind:`invalid`};r=`https://${n}`}let i;try{i=new URL(r)}catch{return{kind:`invalid`}}if(i.protocol!==`http:`&&i.protocol!==`https:`)return{kind:`invalid`};if(u(i.href)){let e=null;try{e=new URL(t)}catch{e=null}return e&&(e.hostname===`localhost`||e.hostname===`127.0.0.1`)&&x(e)===x(i)?{kind:`self`,url:i.href}:{kind:`loopback`,url:i.href}}return i.username||i.password?{kind:`invalid`}:{kind:`external`,url:i.href}}function C(e){try{let t=new URL(e),n=t.pathname===`/`?``:t.pathname;return`${t.host}${n}${t.search}`}catch{return e}}function w(e){return!Number.isFinite(e)||e<0?`—`:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(+(e<10240))} KB`:`${(e/1048576).toFixed(1)} MB`}var T={pane:`_pane_17gzm_8`,strip:`_strip_17gzm_19`,tabs:`_tabs_17gzm_28`,tab:`_tab_17gzm_28`,tabButton:`_tabButton_17gzm_60`,tabClose:`_tabClose_17gzm_78`,noticeClose:`_noticeClose_17gzm_79`,external:`_external_17gzm_80`,tabTitle:`_tabTitle_17gzm_85`,newTab:`_newTab_17gzm_118`,toolbar:`_toolbar_17gzm_122`,nav:`_nav_17gzm_132`,addressForm:`_addressForm_17gzm_138`,address:`_address_17gzm_138`,addressNote:`_addressNote_17gzm_179`,notice:`_notice_17gzm_79`,waiting:`_waiting_17gzm_181`,waitingText:`_waitingText_17gzm_203`,pulse:`_pulse_17gzm_210`,body:`_body_17gzm_236`,loading:`_loading_17gzm_245`,stage:`_stage_17gzm_252`,frame:`_frame_17gzm_264`,frameHint:`_frameHint_17gzm_280`,imageStage:`_imageStage_17gzm_293`,image:`_image_17gzm_293`,markdown:`_markdown_17gzm_310`,launcher:`_launcher_17gzm_318`,section:`_section_17gzm_324`,sectionTitle:`_sectionTitle_17gzm_330`,muted:`_muted_17gzm_341`,rows:`_rows_17gzm_349`,row:`_row_17gzm_349`,dot:`_dot_17gzm_366`,fileIcon:`_fileIcon_17gzm_378`,rowMain:`_rowMain_17gzm_380`,rowTitle:`_rowTitle_17gzm_387`,rowMeta:`_rowMeta_17gzm_397`,rowCommand:`_rowCommand_17gzm_407`},E=t(),me={api:b,origin:()=>window.location.origin,now:()=>Date.now()},he=12e4,ge=2e3,_e=5e3,D=`ashlr.verse.preview.v1:`,O={"launch-json":`launch.json`,"package-json":`package.json`,listening:`running`},ve={html:`HTML`,md:`Markdown`,svg:`SVG`,image:`Image`,pdf:`PDF`},k=0,A=0,j=()=>`p${++A}`;function M(){k=0,A=0}function N(e){let t=e.toLowerCase().slice(e.lastIndexOf(`.`));return t===`.html`||t===`.htm`?`html`:t===`.md`||t===`.markdown`?`md`:t===`.svg`?`svg`:t===`.pdf`?`pdf`:[`.png`,`.jpg`,`.jpeg`,`.gif`,`.webp`,`.avif`,`.bmp`,`.ico`].includes(t)?`image`:null}function P(e){return e.slice(e.lastIndexOf(`/`)+1)||e}function F(e){return e.kind===`launcher`?`New tab`:e.kind===`url`?C(e.history[e.index]??``):P(e.path)}function ye(e){return e?.kind===`url`?e.history[e.index]??null:null}function I(e,t){try{let n=localStorage.getItem(`${D}${e}`);if(!n)return null;let r=JSON.parse(n),i=[],a=null;return Array.isArray(r.tabs)&&r.tabs.slice(0,12).forEach((e,n)=>{if(!e||typeof e!=`object`)return;let o=e,s=j();if(o.url&&typeof o.url==`string`&&S(o.url,t).kind===`loopback`)i.push({id:s,kind:`url`,history:[o.url],index:0,reloadKey:0});else if(typeof o.path==`string`){let e=N(o.path);if(e)i.push({id:s,kind:`artifact`,path:o.path,artifactKind:e,reloadKey:0});else return}else return;r.active===n&&(a=s)}),{tabs:i,activeId:a??i.at(-1)?.id??null,device:r.device===`phone`?`phone`:`desktop`}}catch{return null}}function be(e,t,n,r){try{let i=t.filter(e=>e.kind!==`launcher`);localStorage.setItem(`${D}${e}`,JSON.stringify({tabs:i.map(e=>e.kind===`url`?{url:e.history[e.index]}:e.kind===`artifact`?{path:e.path}:{}),active:i.findIndex(e=>e.id===n),device:r}))}catch{}}function L({sessionId:e,roots:t,request:n,onOpenTerminal:r,visible:i,deps:a}){let o=(0,_.useMemo)(()=>({...me,...a}),[a]),c=te(),l=i&&c,u=ee().compact,[f]=(0,_.useState)(()=>I(e,o.origin())),[h,g]=(0,_.useState)(()=>f?.tabs??[]),[v,y]=(0,_.useState)(()=>f?.activeId??null),[b,x]=(0,_.useState)(()=>f?.device??`desktop`),[w,he]=(0,_.useState)(e),[D,O]=(0,_.useState)(null),[ve,A]=(0,_.useState)(null),[M,P]=(0,_.useState)(``),[L,R]=(0,_.useState)(null),[z,B]=(0,_.useState)(null),[we,V]=(0,_.useState)(null),[H,U]=(0,_.useState)(()=>new Map),[Te,Ee]=(0,_.useState)(()=>o.now()),W=(0,_.useRef)(!0),G=(0,_.useRef)(new Map),De=(0,_.useRef)(null);if(w!==e){let t=I(e,o.origin());he(e),g(t?.tabs??[]),y(t?.activeId??null),O(null),B(null),V(null)}let K=h.find(e=>e.id===v)??null,q=ye(K),J=!K||K.kind===`launcher`;(0,_.useEffect)(()=>(W.current=!0,()=>{W.current=!1}),[]),(0,_.useEffect)(()=>{w===e&&be(e,h,v,b)},[w,e,h,v,b]),(0,_.useEffect)(()=>{P(K?.kind===`url`?K.history[K.index]??``:K?.kind===`artifact`?K.path:``),R(null)},[K]);let Y=(0,_.useCallback)(async()=>{try{let t=await o.api.targets(e);return W.current?(O(t),A(null),t):null}catch(e){return W.current&&A(e instanceof s&&e.detail?e.detail:`Dev servers and files could not be listed.`),null}},[o.api,e]),Oe=(0,_.useRef)(null);(0,_.useEffect)(()=>{l&&Oe.current!==e&&(Oe.current=e,Y())},[l,e,Y]),ne(()=>{Y()},z?ge:_e,{enabled:i&&(z!==null||J)});let X=(0,_.useCallback)((e,t={})=>{V(null);let n=h.find(e=>e.id===v);if(!t.newTab&&n?.kind===`launcher`){g(h.map(t=>t.id===n.id?{id:t.id,kind:`url`,history:[e],index:0,reloadKey:0}:t));return}let r=h.find(t=>t.kind===`url`&&t.history[t.index]===e);if(r&&!t.newTab){y(r.id);return}let i=j();g([...h,{id:i,kind:`url`,history:[e],index:0,reloadKey:0}]),y(i)},[h,v]),ke=(0,_.useCallback)(e=>{if(!K||K.kind!==`url`){X(e);return}g(t=>t.map(t=>{if(t.id!==K.id||t.kind!==`url`)return t;let n=[...t.history.slice(0,t.index+1),e].slice(-50);return{...t,history:n,index:n.length-1}}))},[K,X]),Z=(0,_.useCallback)((e,t)=>{V(null);let n=h.find(t=>t.kind===`artifact`&&t.path===e);if(n){y(n.id);return}let r=h.find(e=>e.id===v);if(r?.kind===`launcher`){g(h.map(n=>n.id===r.id?{id:n.id,kind:`artifact`,path:e,artifactKind:t,reloadKey:0}:n));return}let i=j();g([...h,{id:i,kind:`artifact`,path:e,artifactKind:t,reloadKey:0}]),y(i)},[h,v]),Ae=()=>{let e=h.find(e=>e.kind===`launcher`);if(e)y(e.id);else{let e=j();g(t=>[...t,{id:e,kind:`launcher`}]),y(e)}Y()},je=e=>{let t=h.findIndex(t=>t.id===e.id),n=h.filter(t=>t.id!==e.id);g(n),U(t=>{let n=new Map(t);for(let r of t.keys())r.startsWith(`${e.id}:`)&&n.delete(r);return n}),v===e.id&&y((n[t]??n[t-1]??null)?.id??null)},Me=(e,t)=>{let n=-1;if(e.key===`ArrowRight`?n=(t+1)%h.length:e.key===`ArrowLeft`?n=(t-1+h.length)%h.length:e.key===`Home`?n=0:e.key===`End`&&(n=h.length-1),n<0)return;e.preventDefault();let r=h[n];y(r.id),G.current.get(r.id)?.focus()},Ne=(0,_.useCallback)(e=>{V(null),r({root:e.root,devServerId:e.id}),B({server:e,since:o.now()})},[o,r]),Q=(0,_.useCallback)(e=>{e.running?X(e.url):Ne(e)},[X,Ne]);(0,_.useEffect)(()=>{if(z&&D){if(D.devServers.find(e=>e.running&&(e.id===z.server.id||e.port===z.server.port))){B(null),X(z.server.url);return}o.now()-z.since>12e4&&(B(null),V(`Nothing answered on port ${z.server.port} within 2 minutes. Check the terminal for errors.`))}},[D,z,X,o,Te]),(0,_.useEffect)(()=>{if(!z)return;let e=setInterval(()=>Ee(o.now()),1e3);return()=>clearInterval(e)},[z,o]);let Pe=(0,_.useCallback)(async e=>{if(e.url){let t=S(e.url,o.origin());t.kind===`loopback`?X(t.url):R(t);return}if(e.artifactPath){let t=D?.artifacts.find(t=>t.path===e.artifactPath)?.kind??N(e.artifactPath);t?Z(e.artifactPath,t):V(`That file cannot be previewed.`);return}if(e.devServerId){let t=(await Y()??D)?.devServers.find(t=>t.id===e.devServerId);t?Q(t):V(`That dev server is no longer listed for this chat.`)}},[o,Z,Q,X,Y,D]);(0,_.useEffect)(()=>{!n||n.nonce<=k||(k=n.nonce,Pe(n))},[n,Pe]);let $=K?.kind===`artifact`?`${K.id}:${K.reloadKey}`:null;(0,_.useEffect)(()=>{if(!l||!K||K.kind!==`artifact`||!$||H.has($))return;let t=K,n=$;U(e=>new Map(e).set(n,{status:`loading`})),(t.artifactKind===`md`?o.api.text(e,t.path).then(e=>({status:`text`,text:e})):o.api.ticket(e,t.path).then(e=>({status:`frame`,src:e.url}))).then(e=>{W.current&&U(t=>new Map(t).set(n,e))},e=>{let t=e instanceof s&&e.status===404?`This file is no longer in the chat's folder.`:e instanceof s&&e.status===413?`This file is larger than 5 MB, too large to preview.`:`This file could not be loaded.`;W.current&&U(e=>new Map(e).set(n,{status:`error`,message:t}))})},[l,K,$,H,o.api,e]);let Fe=e=>{K&&K.kind===`url`&&g(t=>t.map(t=>t.id===K.id&&t.kind===`url`?{...t,index:Math.min(t.history.length-1,Math.max(0,t.index+e))}:t))},Ie=()=>{if(K){if(K.kind===`launcher`){Y();return}g(e=>e.map(e=>e.id===K.id&&e.kind!==`launcher`?{...e,reloadKey:e.reloadKey+1}:e))}},Le=e=>{e.preventDefault();let t=S(M,o.origin());if(t.kind===`loopback`){R(null),K?.kind===`url`?ke(t.url):X(t.url);return}R(t)},Re=e=>{e.key===`Escape`&&(e.preventDefault(),P(q??(K?.kind===`artifact`?K.path:``)),R(null),e.currentTarget.blur())},ze=K?.kind===`url`&&K.index>0,Be=K?.kind===`url`&&K.index<K.history.length-1;return(0,E.jsxs)(`div`,{className:T.pane,"data-compact":u||void 0,children:[(0,E.jsxs)(`div`,{className:T.strip,children:[(0,E.jsx)(`div`,{className:T.tabs,role:`tablist`,"aria-label":`Previews`,children:h.map((e,t)=>{let n=e.id===v,r=F(e);return(0,E.jsxs)(`div`,{className:T.tab,"data-selected":n||void 0,role:`presentation`,children:[(0,E.jsxs)(`button`,{ref:t=>{t?G.current.set(e.id,t):G.current.delete(e.id)},type:`button`,role:`tab`,id:`preview-tab-${e.id}`,"aria-selected":n,"aria-controls":`preview-panel`,tabIndex:n?0:-1,className:T.tabButton,title:e.kind===`url`?e.history[e.index]:e.kind===`artifact`?e.path:`Choose what to preview`,onClick:()=>y(e.id),onKeyDown:e=>Me(e,t),children:[e.kind===`artifact`?(0,E.jsx)(oe,{size:12}):e.kind===`url`?(0,E.jsx)(ce,{size:12}):(0,E.jsx)(se,{size:12}),(0,E.jsx)(`span`,{className:T.tabTitle,children:r})]}),(0,E.jsx)(`button`,{type:`button`,className:T.tabClose,"aria-label":`Close preview ${r}`,title:`Close`,onClick:()=>je(e),children:(0,E.jsx)(d,{size:12})})]},e.id)})}),(0,E.jsx)(p,{variant:`ghost`,size:`sm`,icon:(0,E.jsx)(ie,{}),"aria-label":`New preview tab`,title:`New preview tab`,className:T.newTab,onClick:Ae})]}),(0,E.jsxs)(`div`,{className:T.toolbar,children:[(0,E.jsxs)(`div`,{className:T.nav,children:[(0,E.jsx)(p,{variant:`ghost`,size:`sm`,icon:(0,E.jsx)(pe,{}),"aria-label":`Back`,disabled:!ze,onClick:()=>Fe(-1)}),(0,E.jsx)(p,{variant:`ghost`,size:`sm`,icon:(0,E.jsx)(de,{}),"aria-label":`Forward`,disabled:!Be,onClick:()=>Fe(1)}),(0,E.jsx)(p,{variant:`ghost`,size:`sm`,icon:(0,E.jsx)(ue,{}),"aria-label":J?`Refresh the list`:`Reload`,disabled:!K&&J&&D===null,onClick:Ie})]}),(0,E.jsx)(`form`,{className:T.addressForm,onSubmit:Le,role:`search`,"aria-label":`Preview address`,children:(0,E.jsx)(`input`,{ref:De,className:T.address,value:M,onChange:e=>P(e.target.value),onKeyDown:Re,onFocus:e=>e.currentTarget.select(),placeholder:`localhost:5173`,"aria-label":`Address`,spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,inputMode:`url`,readOnly:K?.kind===`artifact`})}),u?null:(0,E.jsx)(ae,{"aria-label":`Frame width`,size:`sm`,value:b,onChange:x,options:[{value:`desktop`,label:(0,E.jsx)(le,{size:14}),ariaLabel:`Desktop width`},{value:`phone`,label:(0,E.jsx)(fe,{size:14}),ariaLabel:`375 px width`}]}),q?(0,E.jsx)(`a`,{className:T.external,href:q,target:`_blank`,rel:`noopener noreferrer`,"aria-label":`Open in browser`,title:`Open in browser`,children:(0,E.jsx)(re,{})}):null]}),L?(0,E.jsx)(xe,{note:L,onDismiss:()=>R(null)}):null,z?(0,E.jsxs)(`div`,{className:T.waiting,role:`status`,children:[(0,E.jsx)(`span`,{className:T.pulse,"aria-hidden":`true`}),(0,E.jsxs)(`span`,{className:T.waitingText,children:[`Starting `,(0,E.jsx)(`code`,{children:z.server.command??z.server.label}),` — waiting for `,C(z.server.url),` · `,Math.max(0,Math.round((Te-z.since)/1e3)),`s`]}),(0,E.jsx)(m,{size:`sm`,variant:`ghost`,onClick:()=>B(null),children:`Stop waiting`})]}):null,we?(0,E.jsxs)(`div`,{className:T.notice,role:`alert`,children:[(0,E.jsx)(`span`,{children:we}),(0,E.jsx)(`button`,{type:`button`,className:T.noticeClose,"aria-label":`Dismiss`,onClick:()=>V(null),children:(0,E.jsx)(d,{size:12})})]}):null,(0,E.jsx)(`div`,{className:T.body,id:`preview-panel`,role:`tabpanel`,"aria-labelledby":K?`preview-tab-${K.id}`:void 0,children:J?(0,E.jsx)(Ce,{targets:D,error:ve,roots:t,onOpenServer:Q,onOpenArtifact:e=>Z(e.path,e.kind),onRetry:()=>void Y(),waitingId:z?.server.id??null}):K?.kind===`url`?(0,E.jsxs)(`div`,{className:T.stage,"data-device":b,children:[(0,E.jsx)(`iframe`,{className:T.frame,src:K.history[K.index],title:`Preview of ${F(K)}`,sandbox:`allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-downloads`,referrerPolicy:`no-referrer`},`${K.id}:${K.index}:${K.reloadKey}`),(0,E.jsxs)(`p`,{className:T.frameHint,children:[`Blank page? Some servers refuse to be framed.`,` `,(0,E.jsx)(`a`,{href:K.history[K.index],target:`_blank`,rel:`noopener noreferrer`,children:`Open in browser ↗`})]})]}):K?.kind===`artifact`?(0,E.jsx)(Se,{tab:K,content:$?H.get($)??{status:`loading`}:{status:`loading`},device:b}):null})]})}function xe({note:e,onDismiss:t}){return(0,E.jsxs)(`div`,{className:T.addressNote,role:`status`,children:[e.kind===`external`?(0,E.jsxs)(`span`,{children:[`Only local dev servers open here.`,` `,(0,E.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,children:`Open in browser ↗`})]}):e.kind===`self`?(0,E.jsx)(`span`,{children:`That address is Verse itself.`}):(0,E.jsxs)(`span`,{children:[`Enter a local address, like `,(0,E.jsx)(`code`,{children:`localhost:5173`}),`.`]}),(0,E.jsx)(`button`,{type:`button`,className:T.noticeClose,"aria-label":`Dismiss`,onClick:t,children:(0,E.jsx)(d,{size:12})})]})}function Se({tab:e,content:t,device:n}){return t.status===`loading`?(0,E.jsxs)(`div`,{className:T.loading,"aria-busy":`true`,children:[(0,E.jsx)(a,{width:`50%`}),(0,E.jsx)(a,{width:`80%`})]}):t.status===`error`?(0,E.jsx)(h,{compact:!0,tone:`error`,title:`Preview unavailable`,body:t.message}):t.status===`text`?(0,E.jsx)(`article`,{className:T.markdown,"aria-label":e.path,children:(0,E.jsx)(f,{text:t.text})}):e.artifactKind===`image`?(0,E.jsx)(`div`,{className:T.imageStage,children:(0,E.jsx)(`img`,{className:T.image,src:t.src,alt:P(e.path)})}):(0,E.jsx)(`div`,{className:T.stage,"data-device":e.artifactKind===`pdf`?`desktop`:n,children:(0,E.jsx)(`iframe`,{className:T.frame,src:t.src,title:`Preview of ${e.path}`,...e.artifactKind===`pdf`?{}:{sandbox:`allow-scripts`},referrerPolicy:`no-referrer`},t.src)})}function Ce({targets:e,error:t,roots:n,onOpenServer:r,onOpenArtifact:i,onRetry:o,waitingId:s}){if(!e)return t?(0,E.jsx)(h,{compact:!0,tone:`error`,title:`Nothing to list`,body:t,action:(0,E.jsx)(m,{size:`sm`,variant:`subtle`,onClick:o,children:`Try again`})}):(0,E.jsxs)(`div`,{className:T.loading,"aria-busy":`true`,children:[(0,E.jsx)(a,{width:`35%`}),(0,E.jsx)(a,{width:`70%`}),(0,E.jsx)(a,{width:`60%`})]});let c=n.length>1;return e.devServers.length===0&&e.artifacts.length===0?(0,E.jsx)(h,{compact:!0,icon:(0,E.jsx)(se,{size:20}),title:`Nothing to preview yet`,body:`Start a dev server in the terminal, or ask for an HTML report. Local servers and the files this chat writes show up here.`}):(0,E.jsxs)(`div`,{className:T.launcher,children:[(0,E.jsxs)(`section`,{className:T.section,"aria-labelledby":`preview-servers-title`,children:[(0,E.jsx)(`h3`,{className:T.sectionTitle,id:`preview-servers-title`,children:`Dev servers`}),e.devServers.length===0?(0,E.jsxs)(`p`,{className:T.muted,children:[`No dev server found in this chat's folders. Add one to `,(0,E.jsx)(`code`,{children:`.claude/launch.json`}),`, or start it in the terminal.`]}):(0,E.jsx)(`ul`,{className:T.rows,children:e.devServers.map(e=>(0,E.jsxs)(`li`,{className:T.row,children:[(0,E.jsx)(`span`,{className:T.dot,"data-running":e.running||void 0,"aria-hidden":`true`}),(0,E.jsxs)(`span`,{className:T.rowMain,children:[(0,E.jsx)(`span`,{className:T.rowTitle,children:e.label}),(0,E.jsxs)(`span`,{className:T.rowMeta,children:[C(e.url),` · `,e.running?`running`:`stopped`,` · `,O[e.source],c?` · ${P(e.root)}`:``]}),!e.running&&e.command&&e.command!==e.label?(0,E.jsx)(`code`,{className:T.rowCommand,children:e.command}):null]}),e.running?(0,E.jsx)(m,{size:`sm`,variant:`subtle`,onClick:()=>r(e),"aria-label":`Open ${e.label}`,children:`Open`}):(0,E.jsx)(m,{size:`sm`,variant:`subtle`,icon:(0,E.jsx)(g,{size:12}),busy:s===e.id,onClick:()=>r(e),"aria-label":`Start ${e.label}`,title:`Runs ${e.command??e.label} in a terminal tab`,children:`Start`})]},e.id))})]}),(0,E.jsxs)(`section`,{className:T.section,"aria-labelledby":`preview-files-title`,children:[(0,E.jsx)(`h3`,{className:T.sectionTitle,id:`preview-files-title`,children:`This chat's files`}),e.artifacts.length===0?(0,E.jsx)(`p`,{className:T.muted,children:`HTML, Markdown, SVG, images and PDFs this chat writes appear here.`}):(0,E.jsx)(`ul`,{className:T.rows,children:e.artifacts.map(e=>{let t=e.bytes>5242880;return(0,E.jsxs)(`li`,{className:T.row,children:[(0,E.jsx)(oe,{size:14,className:T.fileIcon}),(0,E.jsxs)(`span`,{className:T.rowMain,children:[(0,E.jsx)(`span`,{className:T.rowTitle,title:e.path,children:e.path}),(0,E.jsxs)(`span`,{className:T.rowMeta,children:[ve[e.kind],` · `,w(e.bytes)]})]}),(0,E.jsx)(m,{size:`sm`,variant:`subtle`,disabled:t,title:t?`Larger than 5 MB`:void 0,onClick:()=>i(e),"aria-label":`Open ${e.path}`,children:`Open`})]},e.path)})})]})]})}export{he as PREVIEW_START_TIMEOUT_MS,L as PreviewPane,M as resetPreviewPaneForTest};
|
|
2
|
-
//# sourceMappingURL=PreviewPane-Cx6RRwzM.js.map
|