@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
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The delivery contract appended to every cloud task prompt (unit C1), and
|
|
3
|
+
* the parser for what the session reports back in its PR body.
|
|
4
|
+
*
|
|
5
|
+
* WHY a contract at all: Verse cannot read a cloud session back (attach is
|
|
6
|
+
* not enabled for the account), so GitHub is the only channel. A session that
|
|
7
|
+
* delivers anywhere but `ashlr-cloud/<taskId>` is invisible to the tracker,
|
|
8
|
+
* and one that merges bypasses custody — so both are spelled out, every time.
|
|
9
|
+
*/
|
|
10
|
+
import { CLOUD_PR_TITLE_PREFIX, CLOUD_REPORT_FENCE } from './types.js';
|
|
11
|
+
/** A report block is a few hundred bytes; past this it is not a report, it is a dump. */
|
|
12
|
+
export const CLOUD_REPORT_MAX_BLOCK_CHARS = 32 * 1024;
|
|
13
|
+
/** PR bodies can be edited by anyone with write access; only this much of the tail is scanned. */
|
|
14
|
+
const MAX_BODY_CHARS = 512 * 1024;
|
|
15
|
+
const MAX_SUMMARY_CHARS = 2_000;
|
|
16
|
+
const MAX_LIST_ITEMS = 50;
|
|
17
|
+
const MAX_LIST_ITEM_CHARS = 500;
|
|
18
|
+
const STATUSES = ['done', 'partial', 'blocked', 'no-change'];
|
|
19
|
+
/**
|
|
20
|
+
* The full prompt handed to `claude --cloud`: the task text, then the
|
|
21
|
+
* contract — create and work on branch `task.branch` from `task.baseBranch`;
|
|
22
|
+
* never push to any other branch; never merge; run the repo's relevant tests;
|
|
23
|
+
* commit; push; open a DRAFT PR against `task.baseBranch` titled
|
|
24
|
+
* `${CLOUD_PR_TITLE_PREFIX} <title>`; the PR body ends with a fenced
|
|
25
|
+
* `${CLOUD_REPORT_FENCE}` JSON block matching CloudTaskReport. If nothing
|
|
26
|
+
* needs changing, still push an empty commit on the branch and open the PR
|
|
27
|
+
* with status "no-change" so Verse sees completion.
|
|
28
|
+
*/
|
|
29
|
+
export function buildCloudPrompt(task) {
|
|
30
|
+
const example = JSON.stringify({
|
|
31
|
+
status: 'done',
|
|
32
|
+
summary: 'One or two plain sentences on what changed and why.',
|
|
33
|
+
testsRun: ['npx vitest run test/example.test.ts (12 passed)'],
|
|
34
|
+
risks: ['Anything a reviewer should look at closely.'],
|
|
35
|
+
filesChanged: 3,
|
|
36
|
+
}, null, 2);
|
|
37
|
+
return [
|
|
38
|
+
task.prompt.trim(),
|
|
39
|
+
'',
|
|
40
|
+
'---',
|
|
41
|
+
`DELIVERY CONTRACT (Ashlr Verse cloud task ${task.id}) — follow it exactly; Verse only sees what arrives on GitHub.`,
|
|
42
|
+
'',
|
|
43
|
+
`1. Create branch \`${task.branch}\` from \`${task.baseBranch}\` and do all work on it.`,
|
|
44
|
+
`2. Never push to any other branch. Never push to \`${task.baseBranch}\`, master or main. Never merge anything, and never enable auto-merge.`,
|
|
45
|
+
'3. Run the repository\'s relevant checks and tests for what you changed, and fix what you broke.',
|
|
46
|
+
`4. Commit your work, then push \`${task.branch}\` to origin.`,
|
|
47
|
+
`5. Open a DRAFT pull request from \`${task.branch}\` against \`${task.baseBranch}\` titled \`${CLOUD_PR_TITLE_PREFIX} ${task.title}\`.`,
|
|
48
|
+
`6. The pull request body must END with a fenced code block whose language tag is \`${CLOUD_REPORT_FENCE}\`, containing one JSON object:`,
|
|
49
|
+
' - "status": "done" | "partial" | "blocked" | "no-change"',
|
|
50
|
+
' - "summary": a short plain-language summary',
|
|
51
|
+
' - "testsRun": the exact commands you ran, each with its result',
|
|
52
|
+
' - "risks": anything a reviewer should know (an empty list if none)',
|
|
53
|
+
' - "filesChanged": the number of files changed (optional)',
|
|
54
|
+
' For example:',
|
|
55
|
+
'',
|
|
56
|
+
`\`\`\`${CLOUD_REPORT_FENCE}`,
|
|
57
|
+
example,
|
|
58
|
+
'```',
|
|
59
|
+
'',
|
|
60
|
+
`7. If nothing needs changing, still push an empty commit on \`${task.branch}\` (git commit --allow-empty) and open the draft pull request with status "no-change", so Verse sees the task finish.`,
|
|
61
|
+
'8. If you are blocked, push what you have and open the draft pull request with status "blocked" and the reason in the summary.',
|
|
62
|
+
].join('\n');
|
|
63
|
+
}
|
|
64
|
+
const clip = (text, max) => (text.length > max ? `${text.slice(0, max - 1).trimEnd()}…` : text);
|
|
65
|
+
function stringList(value) {
|
|
66
|
+
if (value === undefined || value === null)
|
|
67
|
+
return [];
|
|
68
|
+
if (!Array.isArray(value))
|
|
69
|
+
return null;
|
|
70
|
+
const out = [];
|
|
71
|
+
for (const entry of value) {
|
|
72
|
+
if (typeof entry !== 'string')
|
|
73
|
+
return null;
|
|
74
|
+
const text = entry.trim();
|
|
75
|
+
if (text !== '' && out.length < MAX_LIST_ITEMS)
|
|
76
|
+
out.push(clip(text, MAX_LIST_ITEM_CHARS));
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
/** Validates one block's JSON as a CloudTaskReport; lists and text are bounded, not rejected, when long. */
|
|
81
|
+
function reportFromBlock(text) {
|
|
82
|
+
if (text.length > CLOUD_REPORT_MAX_BLOCK_CHARS)
|
|
83
|
+
return null;
|
|
84
|
+
let value;
|
|
85
|
+
try {
|
|
86
|
+
value = JSON.parse(text);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
92
|
+
return null;
|
|
93
|
+
const record = value;
|
|
94
|
+
const status = record['status'];
|
|
95
|
+
if (typeof status !== 'string' || !STATUSES.includes(status))
|
|
96
|
+
return null;
|
|
97
|
+
const summary = typeof record['summary'] === 'string' ? record['summary'].trim() : '';
|
|
98
|
+
if (summary === '')
|
|
99
|
+
return null;
|
|
100
|
+
const testsRun = stringList(record['testsRun']);
|
|
101
|
+
const risks = stringList(record['risks']);
|
|
102
|
+
if (!testsRun || !risks)
|
|
103
|
+
return null;
|
|
104
|
+
const report = {
|
|
105
|
+
status: status,
|
|
106
|
+
summary: clip(summary, MAX_SUMMARY_CHARS),
|
|
107
|
+
testsRun,
|
|
108
|
+
risks,
|
|
109
|
+
};
|
|
110
|
+
const files = record['filesChanged'];
|
|
111
|
+
// An invalid count is dropped rather than failing a report that is otherwise fine.
|
|
112
|
+
if (typeof files === 'number' && Number.isInteger(files) && files >= 0 && files <= 1_000_000)
|
|
113
|
+
report.filesChanged = files;
|
|
114
|
+
return report;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Opening fence (3+ backticks) tagged `ashlr-cloud-report`, the body, and a
|
|
118
|
+
* closing fence of the same length — so a report containing a ``` string
|
|
119
|
+
* inside a longer fence still parses.
|
|
120
|
+
*/
|
|
121
|
+
const REPORT_BLOCK_RE = new RegExp(String.raw `(?:^|\n)[ \t]*(\`{3,})[ \t]*` + CLOUD_REPORT_FENCE + String.raw `[ \t]*\n([\s\S]*?)\n[ \t]*\1[ \t]*(?=\n|$)`, 'g');
|
|
122
|
+
/** Last well-formed `ashlr-cloud-report` block in the body, validated; else null. */
|
|
123
|
+
export function parseCloudReport(prBody) {
|
|
124
|
+
if (typeof prBody !== 'string' || prBody === '')
|
|
125
|
+
return null;
|
|
126
|
+
// The contract puts the block at the END, so a giant body keeps its tail.
|
|
127
|
+
const body = (prBody.length > MAX_BODY_CHARS ? prBody.slice(-MAX_BODY_CHARS) : prBody).replace(/\r\n?/g, '\n');
|
|
128
|
+
const blocks = [...body.matchAll(REPORT_BLOCK_RE)].map((match) => match[2] ?? '');
|
|
129
|
+
// Newest wins: a session that revised its report appends a second block,
|
|
130
|
+
// and an earlier malformed block must not hide a later good one (or vice versa).
|
|
131
|
+
for (let i = blocks.length - 1; i >= 0; i -= 1) {
|
|
132
|
+
const report = reportFromBlock(blocks[i]);
|
|
133
|
+
if (report)
|
|
134
|
+
return report;
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=delivery-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-contract.js","sourceRoot":"","sources":["../../../src/core/cloud/delivery-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in self-improvement backlog for Ashlr Verse (3.11 cloud lane).
|
|
3
|
+
*
|
|
4
|
+
* Each item is a COMPLETE brief for a Claude Code cloud session working in
|
|
5
|
+
* ashlrai/ashlr-hub. The delivery contract (branch, draft PR, report block)
|
|
6
|
+
* is appended by delivery-contract.ts — do not repeat it here. Items are
|
|
7
|
+
* real, verified gaps as of 3.10.1 (2026-09-24), highest leverage first.
|
|
8
|
+
* Operator and Leader items are added at runtime in <cloudHome>/backlog.json.
|
|
9
|
+
*/
|
|
10
|
+
import type { CloudBacklogItem } from './types.js';
|
|
11
|
+
export declare const BUILTIN_IMPROVEMENT_BACKLOG: readonly CloudBacklogItem[];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const REPO_NOTES = [
|
|
2
|
+
'Repo: TypeScript (Node 22+/Bun), `npm ci` then verify with `npx tsc --noEmit -p tsconfig.json`,',
|
|
3
|
+
'`npx tsc --noEmit -p src/web-ui/tsconfig.json`, `npx eslint <changed files>`, and the relevant',
|
|
4
|
+
'tests: backend `npx vitest run <test files>`, web `npx vitest run --config vitest.config.web.ts <paths>`.',
|
|
5
|
+
'Tests must stay HOME-isolated (never write a real ~/.ashlr). Never make paid model calls in tests.',
|
|
6
|
+
'Some suites are macOS-only (sandbox-exec, custody, launchd); on Linux skip ones you did not touch.',
|
|
7
|
+
'Keep changes focused; add a regression test for every behaviour change; write clear WHY comments.',
|
|
8
|
+
].join(' ');
|
|
9
|
+
const item = (id, priority, area, title, task) => Object.freeze({ id, priority, area, title, prompt: `${task}\n\n${REPO_NOTES}` });
|
|
10
|
+
export const BUILTIN_IMPROVEMENT_BACKLOG = Object.freeze([
|
|
11
|
+
item('fix-universe-recovery-tests', 1, 'tests', 'Fix the 8 long-failing Universe campaign-recovery tests', 'Eight backend tests have failed since 3.9.1 and are treated as known failures: test/universe-campaign-seed-evaluation.test.ts (4, "Installed built-in evaluator unavailable or changed"), test/universe-dispatch-recovery-integration.test.ts (2, "Controller diagnostic does not match an unresolved dispatch intent"), test/universe-delivery-recovery.test.ts (1, readCompletedCampaignDelivery returns null for a verified strict improvement — commit f8cd6f1e "require delivered work to beat its seed" likely left the fixture without seed evidence), and test/universe-resource-integration.test.ts (1, campaign reaches "failed" instead of "completed" on deadline). Diagnose each root cause (product bug vs stale fixture) and fix it properly so all four files pass. Do not weaken assertions; if an evaluator requires macOS, make the test skip cleanly on other platforms with a reason.'),
|
|
12
|
+
item('fix-release-policy-pins', 1, 'tests', 'Bring the release-policy pin tests up to the current release line', 'These backend tests fail because they pin old release lines: test/m454.agent-skills-routing-challenge.test.ts, test/m440.dependency-audit-ci.test.ts, test/m468.release-desktop-workflow-policy.test.ts (2), test/m522.production-promotion-admission.test.ts ("binds the frozen release lane to 3.3.2 and the unreleased product line to 3.4.0"). Releases are now manual and local (GitHub Actions is off; npm latest is 3.10.x). Read the policy each test protects and update the policy data and tests together so they describe the real current process, keeping the safety intent (no silent weakening). Also fix test/m231.north-star-grounding.test.ts and test/npm-cli-launch.test.ts if their failures are the same kind of staleness; explain each in the PR.'),
|
|
13
|
+
item('m571-gen-dir', 2, 'tests', 'Make the local production gate robust to Tauri build output', 'test/m571.local-production-gate.test.ts fails on any machine that has run a Tauri build, because desktop/src-tauri/gen exists (generated schema output). Decide whether the gate should ignore generated Tauri output (add it to the right ignore list / .gitignore handling) or whether the check is wrong, fix it at the root, and add a test proving a generated gen/ directory no longer trips the gate while a genuinely unexpected file still does.'),
|
|
14
|
+
item('first-paint-350', 1, 'performance', 'Get chat first-paint JavaScript to 350 KB', 'Chat first-paint critical JS is ~367 KB against a 350 KB target (npm run check:first-paint enforces 370). Use the build output (npm run build, then the report from scripts/check-first-paint-budget.mjs) to find what the chat first paint statically pulls in that it does not need before first interaction (e.g. panels, markdown extensions, charts, stores, date helpers) and move it behind dynamic import or lighter code. Keep behaviour identical; keep src/web-ui/routes/verse/VerseApp.first-paint.test.ts passing and tighten it so regressions are caught. Then lower the budget in package.json check:first-paint to the new measured size + 3 KB (and at most 355).'),
|
|
15
|
+
item('probe-event-loop', 2, 'performance', 'Remove the runtime-probe event-loop stall', 'The Verse server\'s runtime probe stalls the Node/Bun event loop for 53–78 ms per run against a 20 ms budget (noted in CHANGELOG 3.10.0 "Not yet met"). Find the probe (search src/core/verse and src/core/local-runtime for the runtime/health probe that runs on an interval) and the synchronous work inside it (sync fs, JSON of large files, child_process sync calls). Make it asynchronous or chunked so no single tick exceeds 20 ms, and add a test that measures the max synchronous slice with a fake heavy input.'),
|
|
16
|
+
item('harness-dispatch', 2, 'autonomy', 'Apply harness effort and sampling at dispatch', 'Harness experiments (src/core/learn/harness-*.ts) choose effort/sampling settings, but those settings are not applied when the fleet dispatches a run (known gap in 3.10). Trace a dispatch from src/core/fleet/dispatch-router.ts through src/core/run/ engines, find where the adopted HarnessVersion should feed effort/temperature/sampling into the engine invocation, wire it through with the engine-specific flag mapping, and add tests proving an adopted harness changes the engine argv/options and the compiled defaults apply otherwise.'),
|
|
17
|
+
item('router-lambda', 2, 'autonomy', 'Use the router\'s λ weights', 'The cost-aware router (src/core/routing/router.ts and related) declares λ weights for its objective but does not use them (known gap). Read the scoring code, apply the weights as documented in the code/doc comments (quality vs cost vs latency vs headroom), keep the current default behaviour when weights are at defaults, and add table-driven tests that show changing a weight changes the ranking in the expected direction.'),
|
|
18
|
+
item('server-lane-wording', 3, 'ux', 'Write lane and seat reasons in plain words on the server', 'The web UI now translates router jargon ("2 slot(s)", "(a class-B action)", "grok-cli") via laneReasonText in src/web-ui/routes/verse/fleet/, but the server still produces it in src/core/fleet/dispatch-router.ts (~lines 223/229) and src/core/fleet/tick-hooks-live.ts (~line 1499). Make the server write plain, correctly pluralised sentences at the source (keeping any machine-readable fields unchanged), update CLI output that prints them, and simplify the web translation to a pass-through where it becomes redundant. Tests for both.'),
|
|
19
|
+
item('account-health-reset', 2, 'accounts', 'Pick the latest spent window server-side in account health', 'The Accounts panel now chooses the LATEST reset among a seat\'s spent windows (seatReopensAt in src/web-ui/routes/verse/), matching Fleet\'s "eligible again", but the server (account-health.ts resetAt and its tie-break) still picks differently. Find the server computation, make it return the time the seat actually reopens (latest spent-window reset; no time when a spent window only has provider text), and add tests. Keep the API shape backward compatible.'),
|
|
20
|
+
item('pulse-local-days', 3, 'ux', 'Bucket Pulse days by the viewer\'s local calendar day', 'src/web-ui/intelligence/pulse/PulseView.tsx (~line 89) buckets days at UTC midnight, so charts show days one day early west of UTC. Reuse the shared helper src/web-ui/routes/verse/growth/calendar-day.ts (do not duplicate) and add tests that run under America/Los_Angeles and Pacific/Kiritimati semantics (see src/web-ui/routes/verse/growth/time-zone.test-support.ts).'),
|
|
21
|
+
item('barstack-titles', 3, 'charts', 'Give chart categories full-name tooltips', 'BarStack (src/web-ui/components/charts/BarStack.tsx) uses one label for axis, tooltip and table, so Growth "Model outcomes" can only show shortened model names. Add an optional per-category `title` (full name) used by the tooltip and table while the axis keeps the short label, then pass full model ids from Growth (src/web-ui/routes/verse/growth/). Tests for both.'),
|
|
22
|
+
item('meter-percent-rule', 3, 'accessibility', 'Apply the one percent rule to the shared Meter', 'src/web-ui/components/primitives/Meter.tsx builds screen-reader text with Math.round, so a 99.6% meter announces "100%". Use usedPercentText from src/web-ui/routes/verse/percent-text.ts for aria-valuetext (keep aria-valuenow numeric), and audit other remaining Math.round percent text in src/web-ui (outside chart tick math) for the same rule. Tests.'),
|
|
23
|
+
item('dependabot-32', 1, 'security', 'Fix the open moderate Dependabot alert', 'GitHub reports one moderate vulnerability on the default branch (Dependabot alert #32). Find which dependency it is (npm audit / package-lock.json), upgrade or override to a patched version with the smallest safe change, confirm `npm audit` is clean for it, and run the full typecheck, lint, web suite and the backend suites that exercise the dependency. Explain the advisory and the fix in the PR.'),
|
|
24
|
+
item('verse-error-forwarding', 2, 'reliability', 'Forward budget and activity API errors instead of swallowing them', 'Known gap: src/core/routing/budget-api.ts and src/core/verse/activity-api.ts swallow some upstream errors and answer with empty/partial data, so the UI shows "nothing" instead of "could not read X". Make them return a structured error (status + plain reason, no absolute paths or secrets) that the existing web ChartFrame/NoticeSlot conventions can display, and update the web consumers to show it. Tests for server responses and one consumer.'),
|
|
25
|
+
]);
|
|
26
|
+
//# sourceMappingURL=improvement-backlog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"improvement-backlog.js","sourceRoot":"","sources":["../../../src/core/cloud/improvement-backlog.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,GAAG;IACjB,iGAAiG;IACjG,gGAAgG;IAChG,2GAA2G;IAC3G,oGAAoG;IACpG,oGAAoG;IACpG,mGAAmG;CACpG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,QAAmB,EAAE,IAAY,EAAE,KAAa,EAAE,IAAY,EAAoB,EAAE,CAC5G,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,OAAO,UAAU,EAAE,EAAE,CAAC,CAAC;AAEnF,MAAM,CAAC,MAAM,2BAA2B,GAAgC,MAAM,CAAC,MAAM,CAAC;IACpF,IAAI,CAAC,6BAA6B,EAAE,CAAC,EAAE,OAAO,EAAE,yDAAyD,EACvG,42BAA42B,CAAC;IAC/2B,IAAI,CAAC,yBAAyB,EAAE,CAAC,EAAE,OAAO,EAAE,mEAAmE,EAC7G,4uBAA4uB,CAAC;IAC/uB,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,6DAA6D,EAC5F,2bAA2b,CAAC;IAC9b,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,aAAa,EAAE,2CAA2C,EACnF,qpBAAqpB,CAAC;IACxpB,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAAE,aAAa,EAAE,2CAA2C,EACpF,+fAA+f,CAAC;IAClgB,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAAE,UAAU,EAAE,+CAA+C,EACrF,whBAAwhB,CAAC;IAC3hB,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,UAAU,EAAE,6BAA6B,EAChE,yaAAya,CAAC;IAC5a,IAAI,CAAC,qBAAqB,EAAE,CAAC,EAAE,IAAI,EAAE,0DAA0D,EAC7F,whBAAwhB,CAAC;IAC3hB,IAAI,CAAC,sBAAsB,EAAE,CAAC,EAAE,UAAU,EAAE,4DAA4D,EACtG,6cAA6c,CAAC;IAChd,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,uDAAuD,EACvF,iXAAiX,CAAC;IACpX,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,QAAQ,EAAE,0CAA0C,EAC7E,+WAA+W,CAAC;IAClX,IAAI,CAAC,oBAAoB,EAAE,CAAC,EAAE,eAAe,EAAE,gDAAgD,EAC7F,gWAAgW,CAAC;IACnW,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,UAAU,EAAE,wCAAwC,EAC3E,gZAAgZ,CAAC;IACnZ,IAAI,CAAC,wBAAwB,EAAE,CAAC,EAAE,aAAa,EAAE,mEAAmE,EAClH,6bAA6b,CAAC;CACjc,CAAC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type CloudLaunchFailureCode } from './types.js';
|
|
2
|
+
export type CloudLaunchResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
sessionId: string;
|
|
5
|
+
url: string;
|
|
6
|
+
title: string;
|
|
7
|
+
} | {
|
|
8
|
+
ok: false;
|
|
9
|
+
failure: CloudLaunchFailureCode;
|
|
10
|
+
message: string;
|
|
11
|
+
};
|
|
12
|
+
export interface CloudLaunchDeps {
|
|
13
|
+
/** Seat launcher argv (default: read the claude-a native profile command.json). */
|
|
14
|
+
seatArgv?: () => string[] | null;
|
|
15
|
+
/** Spawn override for tests: returns combined output + exit code. */
|
|
16
|
+
run?: (argv: string[], opts: {
|
|
17
|
+
cwd: string;
|
|
18
|
+
timeoutMs: number;
|
|
19
|
+
}) => Promise<{
|
|
20
|
+
output: string;
|
|
21
|
+
code: number | null;
|
|
22
|
+
timedOut: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
platform?: NodeJS.Platform;
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
/** Mark the launch folder trusted for the seat (default: trustCloudCheckoutFolder). */
|
|
27
|
+
trustFolder?: (cwd: string) => void;
|
|
28
|
+
}
|
|
29
|
+
export declare const SEAT_NOT_READY_REASON = "The Claude seat isn't set up on this Mac.";
|
|
30
|
+
export declare function cloudSeatCommandPath(seat?: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* The seat's launcher argv from its native profile's command.json, or null
|
|
33
|
+
* when it is missing, unreadable, or not a non-empty array of non-empty
|
|
34
|
+
* strings. Reads a file only — never runs anything.
|
|
35
|
+
*/
|
|
36
|
+
export declare function readCloudSeatArgv(seat?: string): string[] | null;
|
|
37
|
+
/** POSIX single-quote one word: `it's` → `'it'\''s'`. Safe for any byte but NUL. */
|
|
38
|
+
export declare function shellQuote(word: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* The argv that runs `<seat argv…> --cloud <prompt>` under a pseudo-terminal,
|
|
41
|
+
* or null on a platform with no known `script(1)` form.
|
|
42
|
+
*
|
|
43
|
+
* macOS (BSD script) takes the command as argv, so the prompt stays ONE argv
|
|
44
|
+
* element and never meets a shell. util-linux script only takes a command
|
|
45
|
+
* string (`-c`), so there each word is single-quoted; `-e` returns the
|
|
46
|
+
* child's exit code instead of script's own.
|
|
47
|
+
*/
|
|
48
|
+
export declare function cloudPtyArgv(seatArgv: readonly string[], prompt: string, platform: NodeJS.Platform): string[] | null;
|
|
49
|
+
/** The environment the PTY wrapper runs with — the native launcher's keep-list plus terminal basics. */
|
|
50
|
+
export declare function cloudLaunchEnv(base?: NodeJS.ProcessEnv): Record<string, string>;
|
|
51
|
+
export declare function stripTerminalSequences(raw: string): string;
|
|
52
|
+
/** Pure: ANSI-strip + find "Created cloud session: <title>" / "View: <url>" / session id, or classify the error text. */
|
|
53
|
+
export declare function parseCloudLaunchOutput(raw: string): CloudLaunchResult;
|
|
54
|
+
/**
|
|
55
|
+
* A brand-new folder makes Claude Code stop at its interactive "Do you trust
|
|
56
|
+
* this folder?" prompt, which a scripted --cloud launch can never answer (it
|
|
57
|
+
* times out). Verse only ever launches from its OWN isolated checkouts
|
|
58
|
+
* (<cloudHome>/checkouts/<owner>__<name>, fresh clones of the operator's
|
|
59
|
+
* GitHub repo), so it records trust for exactly those folders in the seat's
|
|
60
|
+
* native-state .claude.json — once per folder, merged into the existing
|
|
61
|
+
* config, written atomically. Anything outside the checkouts root, a missing
|
|
62
|
+
* profile or an unreadable config is left alone (never throws).
|
|
63
|
+
*/
|
|
64
|
+
export declare function trustCloudCheckoutFolder(cwd: string, seat?: string): void;
|
|
65
|
+
export declare function launchCloudSession(opts: {
|
|
66
|
+
cwd: string;
|
|
67
|
+
prompt: string;
|
|
68
|
+
}, deps?: CloudLaunchDeps): Promise<CloudLaunchResult>;
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PTY-wrapped `claude --cloud` launcher (unit C1). New cloud sessions can
|
|
3
|
+
* only be created by the interactive CLI, so the seat launcher runs under a
|
|
4
|
+
* pseudo-terminal: macOS `script -q /dev/null <argv…>`, Linux
|
|
5
|
+
* `script -qec "<quoted argv>" /dev/null`. Output is ANSI-stripped and
|
|
6
|
+
* parsed. The seat launcher argv comes from the seat's native profile
|
|
7
|
+
* (`~/.ashlr/native-profiles/<seat>/command.json`, an argv array) — never a
|
|
8
|
+
* shell string, never the ambient `claude` (it may be API-key authed).
|
|
9
|
+
*
|
|
10
|
+
* Environment: the child gets only what the native-profile launcher itself
|
|
11
|
+
* keeps (PATH, HOME, TMPDIR, LANG, LC_ALL) plus the terminal variables the
|
|
12
|
+
* PTY needs. The launcher strips everything else again before exec'ing the
|
|
13
|
+
* pinned CLI — an inherited ANTHROPIC_API_KEY would turn a claude.ai seat
|
|
14
|
+
* into an API-key one, which cloud sessions refuse.
|
|
15
|
+
*/
|
|
16
|
+
import { spawn } from 'node:child_process';
|
|
17
|
+
import { chmodSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
|
|
18
|
+
import { join, resolve, sep } from 'node:path';
|
|
19
|
+
import { readPrivateFileCapped } from '../verse/preferences.js';
|
|
20
|
+
import { ashlrHome, cloudHome } from './store.js';
|
|
21
|
+
import { CLOUD_LAUNCH_TIMEOUT_MS, CLOUD_SEAT_ID } from './types.js';
|
|
22
|
+
export const SEAT_NOT_READY_REASON = "The Claude seat isn't set up on this Mac.";
|
|
23
|
+
const MAX_COMMAND_BYTES = 16 * 1024;
|
|
24
|
+
const MAX_ARGV = 32;
|
|
25
|
+
/** The CLI prints three lines on success; anything this large is a runaway TUI. */
|
|
26
|
+
const MAX_OUTPUT_BYTES = 256 * 1024;
|
|
27
|
+
const MAX_DETAIL_CHARS = 300;
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Seat argv
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
export function cloudSeatCommandPath(seat = CLOUD_SEAT_ID) {
|
|
32
|
+
return join(ashlrHome(), 'native-profiles', seat, 'command.json');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The seat's launcher argv from its native profile's command.json, or null
|
|
36
|
+
* when it is missing, unreadable, or not a non-empty array of non-empty
|
|
37
|
+
* strings. Reads a file only — never runs anything.
|
|
38
|
+
*/
|
|
39
|
+
export function readCloudSeatArgv(seat = CLOUD_SEAT_ID) {
|
|
40
|
+
const file = readPrivateFileCapped(cloudSeatCommandPath(seat), MAX_COMMAND_BYTES);
|
|
41
|
+
if (!file || file.truncated)
|
|
42
|
+
return null;
|
|
43
|
+
let value;
|
|
44
|
+
try {
|
|
45
|
+
value = JSON.parse(file.text);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
if (!Array.isArray(value) || value.length === 0 || value.length > MAX_ARGV)
|
|
51
|
+
return null;
|
|
52
|
+
if (!value.every((arg) => typeof arg === 'string' && arg !== '' && !arg.includes('\0')))
|
|
53
|
+
return null;
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// PTY wrapping
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
/** POSIX single-quote one word: `it's` → `'it'\''s'`. Safe for any byte but NUL. */
|
|
60
|
+
export function shellQuote(word) {
|
|
61
|
+
return `'${word.replace(/'/g, `'\\''`)}'`;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The argv that runs `<seat argv…> --cloud <prompt>` under a pseudo-terminal,
|
|
65
|
+
* or null on a platform with no known `script(1)` form.
|
|
66
|
+
*
|
|
67
|
+
* macOS (BSD script) takes the command as argv, so the prompt stays ONE argv
|
|
68
|
+
* element and never meets a shell. util-linux script only takes a command
|
|
69
|
+
* string (`-c`), so there each word is single-quoted; `-e` returns the
|
|
70
|
+
* child's exit code instead of script's own.
|
|
71
|
+
*/
|
|
72
|
+
export function cloudPtyArgv(seatArgv, prompt, platform) {
|
|
73
|
+
// A prompt starting with "-" would be read as another option by the CLI's
|
|
74
|
+
// argument parser; a leading space is invisible to the model.
|
|
75
|
+
const safePrompt = prompt.startsWith('-') ? ` ${prompt}` : prompt;
|
|
76
|
+
const command = [...seatArgv, '--cloud', safePrompt];
|
|
77
|
+
if (platform === 'darwin')
|
|
78
|
+
return ['/usr/bin/script', '-q', '/dev/null', ...command];
|
|
79
|
+
if (platform === 'linux')
|
|
80
|
+
return ['script', '-qec', command.map(shellQuote).join(' '), '/dev/null'];
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
/** The environment the PTY wrapper runs with — the native launcher's keep-list plus terminal basics. */
|
|
84
|
+
export function cloudLaunchEnv(base = process.env) {
|
|
85
|
+
const env = {};
|
|
86
|
+
for (const key of ['PATH', 'HOME', 'TMPDIR', 'LANG', 'LC_ALL']) {
|
|
87
|
+
const value = base[key];
|
|
88
|
+
if (typeof value === 'string')
|
|
89
|
+
env[key] = value;
|
|
90
|
+
}
|
|
91
|
+
// util-linux script runs its -c string through $SHELL; pin a POSIX shell so
|
|
92
|
+
// the quoting above means what it says whatever the operator's login shell is.
|
|
93
|
+
env['SHELL'] = '/bin/sh';
|
|
94
|
+
env['TERM'] = 'xterm-256color';
|
|
95
|
+
return env;
|
|
96
|
+
}
|
|
97
|
+
/** Production runner: own process group (a timeout kills the CLI and its children), bounded output. */
|
|
98
|
+
function defaultRun(argv, opts) {
|
|
99
|
+
return new Promise((resolve) => {
|
|
100
|
+
const chunks = [];
|
|
101
|
+
let bytes = 0;
|
|
102
|
+
let timedOut = false;
|
|
103
|
+
let settled = false;
|
|
104
|
+
let child;
|
|
105
|
+
const finish = (code) => {
|
|
106
|
+
if (settled)
|
|
107
|
+
return;
|
|
108
|
+
settled = true;
|
|
109
|
+
clearTimeout(timer);
|
|
110
|
+
try {
|
|
111
|
+
child.stdin?.end();
|
|
112
|
+
}
|
|
113
|
+
catch { /* already closed */ }
|
|
114
|
+
resolve({ output: Buffer.concat(chunks).toString('utf8'), code, timedOut });
|
|
115
|
+
};
|
|
116
|
+
const killGroup = () => {
|
|
117
|
+
try {
|
|
118
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
try {
|
|
122
|
+
child.kill('SIGKILL');
|
|
123
|
+
}
|
|
124
|
+
catch { /* gone */ }
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
try {
|
|
128
|
+
child = spawn(argv[0], argv.slice(1), {
|
|
129
|
+
cwd: opts.cwd,
|
|
130
|
+
env: cloudLaunchEnv(),
|
|
131
|
+
// stdin is /dev/null: macOS script(1) calls tcgetattr on its stdin and
|
|
132
|
+
// aborts ("Operation not supported on socket") when that is a pipe.
|
|
133
|
+
// Verified 2026-09-24: with /dev/null the CLI prints the session and
|
|
134
|
+
// exits 0 on its own.
|
|
135
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
136
|
+
detached: true,
|
|
137
|
+
windowsHide: true,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
resolve({ output: '', code: null, timedOut: false });
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const timer = setTimeout(() => {
|
|
145
|
+
timedOut = true;
|
|
146
|
+
killGroup();
|
|
147
|
+
finish(null);
|
|
148
|
+
}, opts.timeoutMs);
|
|
149
|
+
const collect = (chunk) => {
|
|
150
|
+
if (bytes >= MAX_OUTPUT_BYTES)
|
|
151
|
+
return;
|
|
152
|
+
chunks.push(chunk.subarray(0, MAX_OUTPUT_BYTES - bytes));
|
|
153
|
+
bytes += chunk.length;
|
|
154
|
+
};
|
|
155
|
+
child.stdout?.on('data', collect);
|
|
156
|
+
child.stderr?.on('data', collect);
|
|
157
|
+
child.stdin?.on('error', () => { });
|
|
158
|
+
child.on('error', () => finish(null));
|
|
159
|
+
child.on('close', (code) => finish(code));
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// Parsing
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
/**
|
|
166
|
+
* Terminal control sequences: OSC (`ESC ]` … BEL / ST — hyperlinks, titles),
|
|
167
|
+
* CSI (`ESC [` … final byte — colour, cursor), 8-bit CSI, and the remaining
|
|
168
|
+
* escapes (`ESC 7` cursor save, `ESC ( B` charset: intermediates + final).
|
|
169
|
+
* OSC first, so a hyperlink's URL payload goes with it.
|
|
170
|
+
*/
|
|
171
|
+
/* eslint-disable no-control-regex -- matching terminal control bytes is the point */
|
|
172
|
+
const OSC_RE = /\u001b\][\s\S]*?(?:\u0007|\u001b\\)/g;
|
|
173
|
+
const CSI_RE = /(?:\u001b\[|\u009b)[0-?]*[ -/]*[@-~]/g;
|
|
174
|
+
const ESC_RE = /\u001b[ -/]*[0-~]/g;
|
|
175
|
+
/* eslint-enable no-control-regex */
|
|
176
|
+
// eslint-disable-next-line no-control-regex
|
|
177
|
+
const CONTROL_RE = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g;
|
|
178
|
+
export function stripTerminalSequences(raw) {
|
|
179
|
+
return raw
|
|
180
|
+
.replace(OSC_RE, '')
|
|
181
|
+
.replace(CSI_RE, '')
|
|
182
|
+
.replace(ESC_RE, '')
|
|
183
|
+
.replace(/\r\n?/g, '\n')
|
|
184
|
+
.replace(CONTROL_RE, '');
|
|
185
|
+
}
|
|
186
|
+
const SESSION_ID = String.raw `session_[A-Za-z0-9_-]+`;
|
|
187
|
+
const CREATED_RE = /Created cloud session:[ \t]*([^\n]*)/;
|
|
188
|
+
const VIEW_RE = new RegExp(String.raw `View:[ \t]*(https://claude\.ai/code/(${SESSION_ID})[^\s]*)`);
|
|
189
|
+
const TELEPORT_RE = new RegExp(String.raw `--teleport[ \t]+(${SESSION_ID})`);
|
|
190
|
+
const FAILURE_MESSAGES = {
|
|
191
|
+
'auth': "The Claude seat isn't signed in with a Claude.ai account, so it can't start cloud sessions. Sign it in again and retry.",
|
|
192
|
+
'not-enabled': "Claude Code cloud sessions aren't enabled for this Claude account.",
|
|
193
|
+
'rate-limited': 'Claude refused the cloud session: the account is out of credits or hit a usage limit.',
|
|
194
|
+
'no-remote': "Claude couldn't start the session from this checkout: it needs a GitHub origin with the branch pushed.",
|
|
195
|
+
};
|
|
196
|
+
/** Error text → failure code, most specific first (the auth message also says "API key … not sufficient"). */
|
|
197
|
+
function classifyFailure(text) {
|
|
198
|
+
const lower = text.toLowerCase();
|
|
199
|
+
if (lower.includes('requires authentication with a claude.ai account') || lower.includes('require authentication with a claude.ai account'))
|
|
200
|
+
return 'auth';
|
|
201
|
+
if (lower.includes('not enabled'))
|
|
202
|
+
return 'not-enabled';
|
|
203
|
+
if (lower.includes('rate limit') || lower.includes('usage limit') || lower.includes('out of credits'))
|
|
204
|
+
return 'rate-limited';
|
|
205
|
+
if (lower.includes('not a git repository') || lower.includes('no remote') || /\bpush/.test(lower))
|
|
206
|
+
return 'no-remote';
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
/** One line of the CLI's own words for an unclassified failure, with machine paths removed. */
|
|
210
|
+
function detailLine(text) {
|
|
211
|
+
const lines = text.split('\n').map((line) => line.trim()).filter(Boolean);
|
|
212
|
+
const line = lines.find((l) => /error|failed|fatal|cannot|can't|unable/i.test(l)) ?? lines[lines.length - 1] ?? '';
|
|
213
|
+
const scrubbed = line.replace(/(?:~|\/)[^\s'"`]*\/[^\s'"`]*/g, '…');
|
|
214
|
+
return scrubbed.length > MAX_DETAIL_CHARS ? `${scrubbed.slice(0, MAX_DETAIL_CHARS - 1).trimEnd()}…` : scrubbed;
|
|
215
|
+
}
|
|
216
|
+
/** Pure: ANSI-strip + find "Created cloud session: <title>" / "View: <url>" / session id, or classify the error text. */
|
|
217
|
+
export function parseCloudLaunchOutput(raw) {
|
|
218
|
+
const text = stripTerminalSequences(typeof raw === 'string' ? raw : '');
|
|
219
|
+
const created = CREATED_RE.exec(text);
|
|
220
|
+
const view = VIEW_RE.exec(text);
|
|
221
|
+
const teleport = TELEPORT_RE.exec(text);
|
|
222
|
+
const sessionId = view?.[2] ?? teleport?.[1] ?? null;
|
|
223
|
+
if (created && sessionId) {
|
|
224
|
+
return {
|
|
225
|
+
ok: true,
|
|
226
|
+
sessionId,
|
|
227
|
+
// The printed URL carries `?from=cli&m=0`; keep it — it is the link Claude itself offers.
|
|
228
|
+
url: view?.[1] ?? `https://claude.ai/code/${sessionId}`,
|
|
229
|
+
title: (created[1] ?? '').trim().slice(0, 200),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
const failure = classifyFailure(text);
|
|
233
|
+
if (failure)
|
|
234
|
+
return { ok: false, failure, message: FAILURE_MESSAGES[failure] };
|
|
235
|
+
const detail = detailLine(text);
|
|
236
|
+
if (detail === '')
|
|
237
|
+
return { ok: false, failure: 'unknown', message: 'Claude Code exited without saying anything, so no cloud session was created.' };
|
|
238
|
+
if (/error|failed|fatal/i.test(detail)) {
|
|
239
|
+
return { ok: false, failure: 'unknown', message: `Claude Code couldn't create the cloud session. It said: ${detail}` };
|
|
240
|
+
}
|
|
241
|
+
return { ok: false, failure: 'unparsed', message: `Claude Code finished but printed no cloud session. Last line: ${detail}` };
|
|
242
|
+
}
|
|
243
|
+
// ---------------------------------------------------------------------------
|
|
244
|
+
// Launch
|
|
245
|
+
// ---------------------------------------------------------------------------
|
|
246
|
+
/**
|
|
247
|
+
* A brand-new folder makes Claude Code stop at its interactive "Do you trust
|
|
248
|
+
* this folder?" prompt, which a scripted --cloud launch can never answer (it
|
|
249
|
+
* times out). Verse only ever launches from its OWN isolated checkouts
|
|
250
|
+
* (<cloudHome>/checkouts/<owner>__<name>, fresh clones of the operator's
|
|
251
|
+
* GitHub repo), so it records trust for exactly those folders in the seat's
|
|
252
|
+
* native-state .claude.json — once per folder, merged into the existing
|
|
253
|
+
* config, written atomically. Anything outside the checkouts root, a missing
|
|
254
|
+
* profile or an unreadable config is left alone (never throws).
|
|
255
|
+
*/
|
|
256
|
+
export function trustCloudCheckoutFolder(cwd, seat = CLOUD_SEAT_ID) {
|
|
257
|
+
try {
|
|
258
|
+
const root = resolve(cloudHome(), 'checkouts') + sep;
|
|
259
|
+
const folder = resolve(cwd);
|
|
260
|
+
if (!folder.startsWith(root))
|
|
261
|
+
return;
|
|
262
|
+
const profile = JSON.parse(readFileSync(join(ashlrHome(), 'native-profiles', seat, 'profile.json'), 'utf8'));
|
|
263
|
+
if (typeof profile.nativeStatePath !== 'string' || profile.nativeStatePath === '')
|
|
264
|
+
return;
|
|
265
|
+
const configPath = join(profile.nativeStatePath, '.claude.json');
|
|
266
|
+
const config = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
267
|
+
if (config === null || typeof config !== 'object' || Array.isArray(config))
|
|
268
|
+
return;
|
|
269
|
+
const projects = (config.projects && typeof config.projects === 'object' && !Array.isArray(config.projects)
|
|
270
|
+
? config.projects : {});
|
|
271
|
+
if (projects[folder]?.hasTrustDialogAccepted === true)
|
|
272
|
+
return;
|
|
273
|
+
projects[folder] = { ...(projects[folder] ?? {}), hasTrustDialogAccepted: true };
|
|
274
|
+
config.projects = projects;
|
|
275
|
+
const mode = statSync(configPath).mode & 0o777;
|
|
276
|
+
const tmp = `${configPath}.ashlr-${process.pid}.tmp`;
|
|
277
|
+
writeFileSync(tmp, JSON.stringify(config, null, 2), { mode });
|
|
278
|
+
chmodSync(tmp, mode);
|
|
279
|
+
renameSync(tmp, configPath);
|
|
280
|
+
}
|
|
281
|
+
catch { /* launch proceeds; a trust prompt then shows up as a timeout */ }
|
|
282
|
+
}
|
|
283
|
+
export async function launchCloudSession(opts, deps = {}) {
|
|
284
|
+
if (typeof opts.prompt !== 'string' || opts.prompt.trim() === '') {
|
|
285
|
+
return { ok: false, failure: 'unknown', message: 'There was no task text to launch.' };
|
|
286
|
+
}
|
|
287
|
+
const seatArgv = (deps.seatArgv ?? readCloudSeatArgv)();
|
|
288
|
+
if (!seatArgv || seatArgv.length === 0)
|
|
289
|
+
return { ok: false, failure: 'seat-unavailable', message: SEAT_NOT_READY_REASON };
|
|
290
|
+
const argv = cloudPtyArgv(seatArgv, opts.prompt, deps.platform ?? process.platform);
|
|
291
|
+
if (!argv)
|
|
292
|
+
return { ok: false, failure: 'unknown', message: 'Cloud sessions can only be launched on macOS or Linux.' };
|
|
293
|
+
const timeoutMs = deps.timeoutMs ?? CLOUD_LAUNCH_TIMEOUT_MS;
|
|
294
|
+
(deps.trustFolder ?? trustCloudCheckoutFolder)(opts.cwd);
|
|
295
|
+
let result;
|
|
296
|
+
try {
|
|
297
|
+
result = await (deps.run ?? defaultRun)(argv, { cwd: opts.cwd, timeoutMs });
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return { ok: false, failure: 'unknown', message: "The Claude seat couldn't be started." };
|
|
301
|
+
}
|
|
302
|
+
const parsed = parseCloudLaunchOutput(result.output);
|
|
303
|
+
// A session that was printed counts even if the CLI then hung or exited
|
|
304
|
+
// non-zero: it exists and is running on the account's credits.
|
|
305
|
+
if (parsed.ok)
|
|
306
|
+
return parsed;
|
|
307
|
+
if (result.timedOut && (parsed.failure === 'unparsed' || parsed.failure === 'unknown')) {
|
|
308
|
+
return { ok: false, failure: 'timeout', message: `Claude Code didn't create a cloud session within ${Math.round(timeoutMs / 1000)} seconds, so it was stopped.` };
|
|
309
|
+
}
|
|
310
|
+
return parsed;
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../../src/core/cloud/launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAA+B,MAAM,YAAY,CAAC;AAiBjG,MAAM,CAAC,MAAM,qBAAqB,GAAG,2CAA2C,CAAC;AAEjF,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AACpC,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,mFAAmF;AACnF,MAAM,gBAAgB,GAAG,GAAG,GAAG,IAAI,CAAC;AACpC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,UAAU,oBAAoB,CAAC,OAAe,aAAa;IAC/D,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,aAAa;IAC5D,MAAM,IAAI,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAClF,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ;QAAE,OAAO,IAAI,CAAC;IACxF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACrG,OAAO,KAAiB,CAAC;AAC3B,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,oFAAoF;AACpF,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC5C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,QAA2B,EAAE,MAAc,EAAE,QAAyB;IACjG,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC;IACrF,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;IACpG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,cAAc,CAAC,OAA0B,OAAO,CAAC,GAAG;IAClE,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAClD,CAAC;IACD,4EAA4E;IAC5E,+EAA+E;IAC/E,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IACzB,GAAG,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC;IAC/B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uGAAuG;AACvG,SAAS,UAAU,CAAC,IAAc,EAAE,IAAwC;IAC1E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,KAA+B,CAAC;QACpC,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAQ,EAAE;YAC3C,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC;gBAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;YAC1D,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9E,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,GAAS,EAAE;YAC3B,IAAI,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAI,EAAE,SAAS,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,IAAI,CAAC;oBAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YAAC,CAAC;QAC7G,CAAC,CAAC;QACF,IAAI,CAAC;YACH,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACrC,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,GAAG,EAAE,cAAc,EAAE;gBACrB,uEAAuE;gBACvE,oEAAoE;gBACpE,qEAAqE;gBACrE,sBAAsB;gBACtB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,OAAO,GAAG,CAAC,KAAa,EAAQ,EAAE;YACtC,IAAI,KAAK,IAAI,gBAAgB;gBAAE,OAAO;YACtC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC;YACzD,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;QACxB,CAAC,CAAC;QACF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAA0B,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;GAKG;AACH,qFAAqF;AACrF,MAAM,MAAM,GAAG,sCAAsC,CAAC;AACtD,MAAM,MAAM,GAAG,uCAAuC,CAAC;AACvD,MAAM,MAAM,GAAG,oBAAoB,CAAC;AACpC,oCAAoC;AACpC,4CAA4C;AAC5C,MAAM,UAAU,GAAG,iDAAiD,CAAC;AAErE,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,OAAO,GAAG;SACP,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;SACvB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAA,wBAAwB,CAAC;AACtD,MAAM,UAAU,GAAG,sCAAsC,CAAC;AAC1D,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,wCAAwC,UAAU,UAAU,CAAC,CAAC;AACnG,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,oBAAoB,UAAU,GAAG,CAAC,CAAC;AAE5E,MAAM,gBAAgB,GAA4I;IAChK,MAAM,EAAE,yHAAyH;IACjI,aAAa,EAAE,oEAAoE;IACnF,cAAc,EAAE,uFAAuF;IACvG,WAAW,EAAE,wGAAwG;CACtH,CAAC;AAEF,8GAA8G;AAC9G,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,QAAQ,CAAC,kDAAkD,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3J,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,aAAa,CAAC;IACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,OAAO,cAAc,CAAC;IAC7H,IAAI,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACtH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+FAA+F;AAC/F,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;IACpE,OAAO,QAAQ,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjH,CAAC;AAED,yHAAyH;AACzH,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACrD,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,SAAS;YACT,0FAA0F;YAC1F,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,0BAA0B,SAAS,EAAE;YACvD,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAC/C,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/E,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,8EAA8E,EAAE,CAAC;IACrJ,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,2DAA2D,MAAM,EAAE,EAAE,CAAC;IACzH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,iEAAiE,MAAM,EAAE,EAAE,CAAC;AAChI,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAW,EAAE,OAAe,aAAa;IAChF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAkC,CAAC;QAC9I,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ,IAAI,OAAO,CAAC,eAAe,KAAK,EAAE;YAAE,OAAO;QAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAA4B,CAAC;QACvF,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO;QACnF,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;YACzG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAA4C,CAAC;QACrE,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,KAAK,IAAI;YAAE,OAAO;QAC9D,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;QACjF,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;QAC/C,MAAM,GAAG,GAAG,GAAG,UAAU,UAAU,OAAO,CAAC,GAAG,MAAM,CAAC;QACrD,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrB,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC,CAAC,gEAAgE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAqC,EAAE,OAAwB,EAAE;IACxG,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC;IACzF,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC,EAAE,CAAC;IACxD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;IAC1H,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpF,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,wDAAwD,EAAE,CAAC;IACvH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,uBAAuB,CAAC;IAC5D,CAAC,IAAI,CAAC,WAAW,IAAI,wBAAwB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,MAAkE,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC;IAC5F,CAAC;IACD,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,wEAAwE;IACxE,+DAA+D;IAC/D,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC7B,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,UAAU,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,EAAE,CAAC;QACvF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,oDAAoD,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,8BAA8B,EAAE,CAAC;IACpK,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|