@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.
Files changed (534) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +343 -82
  3. package/dist/authority-surface.json +109 -29
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/cloud.d.ts +39 -0
  6. package/dist/cli/cloud.js +448 -0
  7. package/dist/cli/cloud.js.map +1 -0
  8. package/dist/cli/completions.js +4 -0
  9. package/dist/cli/completions.js.map +1 -1
  10. package/dist/cli/help.js +2 -0
  11. package/dist/cli/help.js.map +1 -1
  12. package/dist/cli/index.d.ts +1 -0
  13. package/dist/cli/index.js +10 -0
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/core/cloud/backlog.d.ts +17 -0
  16. package/dist/core/cloud/backlog.js +177 -0
  17. package/dist/core/cloud/backlog.js.map +1 -0
  18. package/dist/core/cloud/budget.d.ts +19 -0
  19. package/dist/core/cloud/budget.js +99 -0
  20. package/dist/core/cloud/budget.js.map +1 -0
  21. package/dist/core/cloud/checkout.d.ts +41 -0
  22. package/dist/core/cloud/checkout.js +168 -0
  23. package/dist/core/cloud/checkout.js.map +1 -0
  24. package/dist/core/cloud/cloud-api.d.ts +86 -0
  25. package/dist/core/cloud/cloud-api.js +599 -0
  26. package/dist/core/cloud/cloud-api.js.map +1 -0
  27. package/dist/core/cloud/delivery-contract.d.ts +25 -0
  28. package/dist/core/cloud/delivery-contract.js +138 -0
  29. package/dist/core/cloud/delivery-contract.js.map +1 -0
  30. package/dist/core/cloud/improvement-backlog.d.ts +11 -0
  31. package/dist/core/cloud/improvement-backlog.js +26 -0
  32. package/dist/core/cloud/improvement-backlog.js.map +1 -0
  33. package/dist/core/cloud/launcher.d.ts +68 -0
  34. package/dist/core/cloud/launcher.js +312 -0
  35. package/dist/core/cloud/launcher.js.map +1 -0
  36. package/dist/core/cloud/service.d.ts +51 -0
  37. package/dist/core/cloud/service.js +215 -0
  38. package/dist/core/cloud/service.js.map +1 -0
  39. package/dist/core/cloud/store.d.ts +41 -0
  40. package/dist/core/cloud/store.js +278 -0
  41. package/dist/core/cloud/store.js.map +1 -0
  42. package/dist/core/cloud/tracker.d.ts +30 -0
  43. package/dist/core/cloud/tracker.js +152 -0
  44. package/dist/core/cloud/tracker.js.map +1 -0
  45. package/dist/core/cloud/types.d.ts +233 -0
  46. package/dist/core/cloud/types.js +73 -0
  47. package/dist/core/cloud/types.js.map +1 -0
  48. package/dist/core/daemon/capacity-publisher.d.ts +19 -0
  49. package/dist/core/daemon/capacity-publisher.js +49 -2
  50. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  51. package/dist/core/daemon/overnight-status.d.ts +13 -0
  52. package/dist/core/daemon/overnight-status.js +93 -8
  53. package/dist/core/daemon/overnight-status.js.map +1 -1
  54. package/dist/core/fleet/dispatch-router.js +26 -9
  55. package/dist/core/fleet/dispatch-router.js.map +1 -1
  56. package/dist/core/fleet/fleet-runtime-journal.js +12 -5
  57. package/dist/core/fleet/fleet-runtime-journal.js.map +1 -1
  58. package/dist/core/fleet/fleet-types.d.ts +13 -0
  59. package/dist/core/routing/budget-store.js +11 -5
  60. package/dist/core/routing/budget-store.js.map +1 -1
  61. package/dist/core/routing/capacity-history-api.d.ts +30 -0
  62. package/dist/core/routing/capacity-history-api.js +147 -0
  63. package/dist/core/routing/capacity-history-api.js.map +1 -0
  64. package/dist/core/routing/capacity-history-types.d.ts +63 -0
  65. package/dist/core/routing/capacity-history-types.js +18 -0
  66. package/dist/core/routing/capacity-history-types.js.map +1 -0
  67. package/dist/core/routing/capacity-history.d.ts +130 -0
  68. package/dist/core/routing/capacity-history.js +654 -0
  69. package/dist/core/routing/capacity-history.js.map +1 -0
  70. package/dist/core/routing/headroom.d.ts +5 -1
  71. package/dist/core/routing/headroom.js +82 -41
  72. package/dist/core/routing/headroom.js.map +1 -1
  73. package/dist/core/routing/router.d.ts +8 -1
  74. package/dist/core/routing/router.js +49 -16
  75. package/dist/core/routing/router.js.map +1 -1
  76. package/dist/core/routing/seat-reasons.d.ts +35 -0
  77. package/dist/core/routing/seat-reasons.js +48 -0
  78. package/dist/core/routing/seat-reasons.js.map +1 -0
  79. package/dist/core/routing/types.d.ts +37 -0
  80. package/dist/core/routing/types.js.map +1 -1
  81. package/dist/core/verse/activity-api.d.ts +3 -1
  82. package/dist/core/verse/activity-api.js +16 -1
  83. package/dist/core/verse/activity-api.js.map +1 -1
  84. package/dist/core/verse/activity.d.ts +7 -0
  85. package/dist/core/verse/activity.js +23 -0
  86. package/dist/core/verse/activity.js.map +1 -1
  87. package/dist/core/verse/fleet-history-types.d.ts +12 -4
  88. package/dist/core/verse/fleet-history-types.js +4 -2
  89. package/dist/core/verse/fleet-history-types.js.map +1 -1
  90. package/dist/core/verse/fleet-live-api.d.ts +14 -1
  91. package/dist/core/verse/fleet-live-api.js +31 -11
  92. package/dist/core/verse/fleet-live-api.js.map +1 -1
  93. package/dist/core/verse/preferences.d.ts +3 -1
  94. package/dist/core/verse/preferences.js +5 -2
  95. package/dist/core/verse/preferences.js.map +1 -1
  96. package/dist/core/verse/types.d.ts +5 -1
  97. package/dist/core/verse/types.js.map +1 -1
  98. package/dist/core/verse/verse-api.d.ts +1 -1
  99. package/dist/core/verse/verse-api.js +4 -1
  100. package/dist/core/verse/verse-api.js.map +1 -1
  101. package/dist/core/vision/leader-cloud.d.ts +63 -0
  102. package/dist/core/vision/leader-cloud.js +134 -0
  103. package/dist/core/vision/leader-cloud.js.map +1 -0
  104. package/dist/core/vision/leader.d.ts +6 -0
  105. package/dist/core/vision/leader.js +12 -1
  106. package/dist/core/vision/leader.js.map +1 -1
  107. package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js → ActionMenu-CQvNJvHY.js} +2 -2
  108. package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js.map → ActionMenu-CQvNJvHY.js.map} +1 -1
  109. package/dist/core/web/public/next/assets/Advanced-Bywv_iYR.css +1 -0
  110. package/dist/core/web/public/next/assets/Advanced-DEM93sKI.js +2 -0
  111. package/dist/core/web/public/next/assets/Advanced-DEM93sKI.js.map +1 -0
  112. package/dist/core/web/public/next/assets/{App-DyBg1v_q.js → App-CimXmK0L.js} +5 -5
  113. package/dist/core/web/public/next/assets/{App-DyBg1v_q.js.map → App-CimXmK0L.js.map} +1 -1
  114. package/dist/core/web/public/next/assets/AppsSection-D6U-dSj6.js +2 -0
  115. package/dist/core/web/public/next/assets/AppsSection-D6U-dSj6.js.map +1 -0
  116. package/dist/core/web/public/next/assets/AreaTrend-LD9lCPkT.js +2 -0
  117. package/dist/core/web/public/next/assets/AreaTrend-LD9lCPkT.js.map +1 -0
  118. package/dist/core/web/public/next/assets/AutonomySection-3V9pUyxm.js +2 -0
  119. package/dist/core/web/public/next/assets/{AutonomySection-CoMngwNB.js.map → AutonomySection-3V9pUyxm.js.map} +1 -1
  120. package/dist/core/web/public/next/assets/BranchBar-BZNQ50YE.css +1 -0
  121. package/dist/core/web/public/next/assets/BranchBar-U8UdpfEB.js +2 -0
  122. package/dist/core/web/public/next/assets/BranchBar-U8UdpfEB.js.map +1 -0
  123. package/dist/core/web/public/next/assets/BudgetControl-DOTlMSmW.js +2 -0
  124. package/dist/core/web/public/next/assets/BudgetControl-DOTlMSmW.js.map +1 -0
  125. package/dist/core/web/public/next/assets/BurnDown-x4PWH9JF.js +2 -0
  126. package/dist/core/web/public/next/assets/BurnDown-x4PWH9JF.js.map +1 -0
  127. package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js → Button-DYv_KKxr.js} +2 -2
  128. package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js.map → Button-DYv_KKxr.js.map} +1 -1
  129. package/dist/core/web/public/next/assets/CapacityStrip-C667yQe8.js +2 -0
  130. package/dist/core/web/public/next/assets/CapacityStrip-C667yQe8.js.map +1 -0
  131. package/dist/core/web/public/next/assets/CapacityStrip-Cc28CyWk.css +1 -0
  132. package/dist/core/web/public/next/assets/ChatSection-CCcIPpOq.js +3 -0
  133. package/dist/core/web/public/next/assets/{ChatSection-B9cdRKUh.js.map → ChatSection-CCcIPpOq.js.map} +1 -1
  134. package/dist/core/web/public/next/assets/CloudBudgetForm-DJeJvBEu.js +2 -0
  135. package/dist/core/web/public/next/assets/CloudBudgetForm-DJeJvBEu.js.map +1 -0
  136. package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js → CommandPalette-FiD4N8XD.js} +2 -2
  137. package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js.map → CommandPalette-FiD4N8XD.js.map} +1 -1
  138. package/dist/core/web/public/next/assets/CommandSection-DN8KwH-X.js +2 -0
  139. package/dist/core/web/public/next/assets/CommandSection-DN8KwH-X.js.map +1 -0
  140. package/dist/core/web/public/next/assets/Composer-ByzxOJK6.css +1 -0
  141. package/dist/core/web/public/next/assets/Composer.module-C8U73KdQ.js +2 -0
  142. package/dist/core/web/public/next/assets/{Composer.module-DJMdrqNt.js.map → Composer.module-C8U73KdQ.js.map} +1 -1
  143. package/dist/core/web/public/next/assets/DiffPane-BAvvbBsf.css +1 -0
  144. package/dist/core/web/public/next/assets/DiffPane-DLJ3gGGK.js +2 -0
  145. package/dist/core/web/public/next/assets/DiffPane-DLJ3gGGK.js.map +1 -0
  146. package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js → DiffViewer-B7NWPjIO.js} +2 -2
  147. package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js.map → DiffViewer-B7NWPjIO.js.map} +1 -1
  148. package/dist/core/web/public/next/assets/DockHost-B4RaYOET.css +1 -0
  149. package/dist/core/web/public/next/assets/DockHost-DvR-hPhZ.js +2 -0
  150. package/dist/core/web/public/next/assets/DockHost-DvR-hPhZ.js.map +1 -0
  151. package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js → EmptyState-DhNgDDrF.js} +2 -2
  152. package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js.map → EmptyState-DhNgDDrF.js.map} +1 -1
  153. package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js → Epistemic-uARPnx9x.js} +2 -2
  154. package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js.map → Epistemic-uARPnx9x.js.map} +1 -1
  155. package/dist/core/web/public/next/assets/FleetSection-CFiWeOEs.css +1 -0
  156. package/dist/core/web/public/next/assets/FleetSection-D_zRBCub.js +3 -0
  157. package/dist/core/web/public/next/assets/FleetSection-D_zRBCub.js.map +1 -0
  158. package/dist/core/web/public/next/assets/Funnel-CL8uHONq.js +2 -0
  159. package/dist/core/web/public/next/assets/Funnel-CL8uHONq.js.map +1 -0
  160. package/dist/core/web/public/next/assets/GearTray-C7k4l_BW.js +2 -0
  161. package/dist/core/web/public/next/assets/GearTray-C7k4l_BW.js.map +1 -0
  162. package/dist/core/web/public/next/assets/GrowthSection-DwdNSGj8.js +2 -0
  163. package/dist/core/web/public/next/assets/GrowthSection-DwdNSGj8.js.map +1 -0
  164. package/dist/core/web/public/next/assets/HandoffDialog-FPVOqOMN.js +2 -0
  165. package/dist/core/web/public/next/assets/HandoffDialog-FPVOqOMN.js.map +1 -0
  166. package/dist/core/web/public/next/assets/{Input-CTu0CycC.js → Input-B9-VLcHS.js} +2 -2
  167. package/dist/core/web/public/next/assets/{Input-CTu0CycC.js.map → Input-B9-VLcHS.js.map} +1 -1
  168. package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js → LeaderCard-4R0BhDzT.js} +2 -2
  169. package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js.map → LeaderCard-4R0BhDzT.js.map} +1 -1
  170. package/dist/core/web/public/next/assets/{MatrixHeatmap-9dKgJ_pT.css → MatrixHeatmap-Bmnvo1l1.css} +1 -1
  171. package/dist/core/web/public/next/assets/MatrixHeatmap-DiuushcS.js +2 -0
  172. package/dist/core/web/public/next/assets/MatrixHeatmap-DiuushcS.js.map +1 -0
  173. package/dist/core/web/public/next/assets/McpSection-CJ__OJKl.js +2 -0
  174. package/dist/core/web/public/next/assets/{McpSection-1UncWBpW.js.map → McpSection-CJ__OJKl.js.map} +1 -1
  175. package/dist/core/web/public/next/assets/MessageMarkdown-Cgh5f1-Q.css +1 -0
  176. package/dist/core/web/public/next/assets/MessageMarkdown-qWKyJvAQ.js +3 -0
  177. package/dist/core/web/public/next/assets/{MessageMarkdown-C4pl9LI5.js.map → MessageMarkdown-qWKyJvAQ.js.map} +1 -1
  178. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js → MessageMarkdownRenderer-x05TrsrW.js} +2 -2
  179. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js.map → MessageMarkdownRenderer-x05TrsrW.js.map} +1 -1
  180. package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js → Meter-D-hncpkO.js} +2 -2
  181. package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js.map → Meter-D-hncpkO.js.map} +1 -1
  182. package/dist/core/web/public/next/assets/MindSection-BjXHkQPS.js +2 -0
  183. package/dist/core/web/public/next/assets/MindSection-BjXHkQPS.js.map +1 -0
  184. package/dist/core/web/public/next/assets/MutationTokenDialog-SkRxqV_I.js +2 -0
  185. package/dist/core/web/public/next/assets/MutationTokenDialog-SkRxqV_I.js.map +1 -0
  186. package/dist/core/web/public/next/assets/NeedsYouDrawer-BpvidnM2.css +1 -0
  187. package/dist/core/web/public/next/assets/NeedsYouDrawer-rSd1ZHAR.js +2 -0
  188. package/dist/core/web/public/next/assets/NeedsYouDrawer-rSd1ZHAR.js.map +1 -0
  189. package/dist/core/web/public/next/assets/NeedsYouList-CG-nB1tr.js +2 -0
  190. package/dist/core/web/public/next/assets/NeedsYouList-CG-nB1tr.js.map +1 -0
  191. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +1 -0
  192. package/dist/core/web/public/next/assets/NewChatDialog-BeDQ1eW3.js +3 -0
  193. package/dist/core/web/public/next/assets/{NewChatDialog-B_BsS9pr.js.map → NewChatDialog-BeDQ1eW3.js.map} +1 -1
  194. package/dist/core/web/public/next/assets/OnboardingFlow-CkTZtt-m.js +2 -0
  195. package/dist/core/web/public/next/assets/{OnboardingFlow-CtCPpgoX.js.map → OnboardingFlow-CkTZtt-m.js.map} +1 -1
  196. package/dist/core/web/public/next/assets/PreviewPane-DoMsJSG3.css +1 -0
  197. package/dist/core/web/public/next/assets/PreviewPane-kzbbSK4u.js +2 -0
  198. package/dist/core/web/public/next/assets/PreviewPane-kzbbSK4u.js.map +1 -0
  199. package/dist/core/web/public/next/assets/RailStatus-D-t2gPae.js +2 -0
  200. package/dist/core/web/public/next/assets/RailStatus-D-t2gPae.js.map +1 -0
  201. package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js → RefreshIndicator-BLnr9IOM.js} +2 -2
  202. package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js.map → RefreshIndicator-BLnr9IOM.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js → ResourcePoolConsoleApp-BeG0gBif.js} +4 -4
  204. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js.map → ResourcePoolConsoleApp-BeG0gBif.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/ResourcesChrome-B3Z3O98t.css +1 -0
  206. package/dist/core/web/public/next/assets/ResourcesChrome-BzV6bkIa.js +3 -0
  207. package/dist/core/web/public/next/assets/ResourcesChrome-BzV6bkIa.js.map +1 -0
  208. package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +1 -0
  209. package/dist/core/web/public/next/assets/ResourcesDrawer-o4ILHdep.js +2 -0
  210. package/dist/core/web/public/next/assets/ResourcesDrawer-o4ILHdep.js.map +1 -0
  211. package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js → RouteErrorBoundary-C5SxA2Dg.js} +2 -2
  212. package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js.map → RouteErrorBoundary-C5SxA2Dg.js.map} +1 -1
  213. package/dist/core/web/public/next/assets/RunInCloudAction-C3LBp7C4.js +2 -0
  214. package/dist/core/web/public/next/assets/RunInCloudAction-C3LBp7C4.js.map +1 -0
  215. package/dist/core/web/public/next/assets/SeatSelector-DpvvbjNm.js +3 -0
  216. package/dist/core/web/public/next/assets/{SeatSelector-DaUO-zoK.js.map → SeatSelector-DpvvbjNm.js.map} +1 -1
  217. package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js → Segmented-BL40udoO.js} +2 -2
  218. package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js.map → Segmented-BL40udoO.js.map} +1 -1
  219. package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js → Select-FWLnAw_j.js} +2 -2
  220. package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js.map → Select-FWLnAw_j.js.map} +1 -1
  221. package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js → SessionInsightChip-CWye87Ju.js} +2 -2
  222. package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js.map → SessionInsightChip-CWye87Ju.js.map} +1 -1
  223. package/dist/core/web/public/next/assets/SessionSearch-YvCHFUuN.js +2 -0
  224. package/dist/core/web/public/next/assets/{SessionSearch-B5aQ0BCM.js.map → SessionSearch-YvCHFUuN.js.map} +1 -1
  225. package/dist/core/web/public/next/assets/SettingsSection-Dr18upeE.js +2 -0
  226. package/dist/core/web/public/next/assets/SettingsSection-Dr18upeE.js.map +1 -0
  227. package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js → Sheet-DZKcQXQg.js} +2 -2
  228. package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js.map → Sheet-DZKcQXQg.js.map} +1 -1
  229. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js → ShortcutsOverlay-BpDimdPq.js} +2 -2
  230. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js.map → ShortcutsOverlay-BpDimdPq.js.map} +1 -1
  231. package/dist/core/web/public/next/assets/Sidebar-BRc1vGDF.css +1 -0
  232. package/dist/core/web/public/next/assets/Sidebar-BoBzBEFX.js +3 -0
  233. package/dist/core/web/public/next/assets/Sidebar-BoBzBEFX.js.map +1 -0
  234. package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js → Slider-DUMo9HDD.js} +2 -2
  235. package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js.map → Slider-DUMo9HDD.js.map} +1 -1
  236. package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js → StatusBadge-BwnBNFQr.js} +2 -2
  237. package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js.map → StatusBadge-BwnBNFQr.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/StepBand-PDXMIlRk.js +2 -0
  239. package/dist/core/web/public/next/assets/StepBand-PDXMIlRk.js.map +1 -0
  240. package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js → Surface-B3TZVoER.js} +2 -2
  241. package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js.map → Surface-B3TZVoER.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/Swimlane-DR4OgON_.js +2 -0
  243. package/dist/core/web/public/next/assets/Swimlane-DR4OgON_.js.map +1 -0
  244. package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js → Switch-CcR5Llk5.js} +2 -2
  245. package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js.map → Switch-CcR5Llk5.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js → Tag-_-K1h7Hk.js} +2 -2
  247. package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js.map → Tag-_-K1h7Hk.js.map} +1 -1
  248. package/dist/core/web/public/next/assets/TerminalPane-BwfMbnJz.css +1 -0
  249. package/dist/core/web/public/next/assets/TerminalPane-_1aH4ndN.js +7 -0
  250. package/dist/core/web/public/next/assets/TerminalPane-_1aH4ndN.js.map +1 -0
  251. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUsq-inZ.js +2 -0
  252. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DKqAf-eD.js.map → UniverseConsoleApp-BUsq-inZ.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js → UniverseView-Dogy_dsB.js} +2 -2
  254. package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js.map → UniverseView-Dogy_dsB.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/UsageSection-DiX_dTyo.js +2 -0
  256. package/dist/core/web/public/next/assets/UsageSection-DiX_dTyo.js.map +1 -0
  257. package/dist/core/web/public/next/assets/UsageSection-DsB-Jqyl.css +1 -0
  258. package/dist/core/web/public/next/assets/VerseConsoleApp-Cxqr-3qc.css +1 -0
  259. package/dist/core/web/public/next/assets/VerseConsoleApp-WVeyJnW7.js +3 -0
  260. package/dist/core/web/public/next/assets/VerseConsoleApp-WVeyJnW7.js.map +1 -0
  261. package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +1 -0
  262. package/dist/core/web/public/next/assets/Workspace-BbxZHwQd.js +10 -0
  263. package/dist/core/web/public/next/assets/Workspace-BbxZHwQd.js.map +1 -0
  264. package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +1 -0
  265. package/dist/core/web/public/next/assets/actions-s2lfm_5k.js +2 -0
  266. package/dist/core/web/public/next/assets/actions-s2lfm_5k.js.map +1 -0
  267. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +2 -0
  268. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +1 -0
  269. package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js → budget-queries-wUshcovN.js} +2 -2
  270. package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js.map → budget-queries-wUshcovN.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js +2 -0
  272. package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js.map +1 -0
  273. package/dist/core/web/public/next/assets/capacity-strip-model-Bj_9ztzs.js +2 -0
  274. package/dist/core/web/public/next/assets/capacity-strip-model-Bj_9ztzs.js.map +1 -0
  275. package/dist/core/web/public/next/assets/charts-CMSgAUKn.js +2 -0
  276. package/dist/core/web/public/next/assets/charts-CMSgAUKn.js.map +1 -0
  277. package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +1 -0
  278. package/dist/core/web/public/next/assets/cloud-queries-CnV1yaNG.js +2 -0
  279. package/dist/core/web/public/next/assets/cloud-queries-CnV1yaNG.js.map +1 -0
  280. package/dist/core/web/public/next/assets/cloud.module-CiwatLj3.js +2 -0
  281. package/dist/core/web/public/next/assets/cloud.module-CiwatLj3.js.map +1 -0
  282. package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js +2 -0
  283. package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js.map +1 -0
  284. package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js → command-bus-DqimKCUY.js} +2 -2
  285. package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js.map → command-bus-DqimKCUY.js.map} +1 -1
  286. package/dist/core/web/public/next/assets/command-catalog-BdtDH93o.js +2 -0
  287. package/dist/core/web/public/next/assets/command-catalog-BdtDH93o.js.map +1 -0
  288. package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js → composer-keys-DBRymxQn.js} +2 -2
  289. package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js.map → composer-keys-DBRymxQn.js.map} +1 -1
  290. package/dist/core/web/public/next/assets/context-model-Dwd49-dp.js +2 -0
  291. package/dist/core/web/public/next/assets/context-model-Dwd49-dp.js.map +1 -0
  292. package/dist/core/web/public/next/assets/context-model-MT17V86_.js +2 -0
  293. package/dist/core/web/public/next/assets/context-model-MT17V86_.js.map +1 -0
  294. package/dist/core/web/public/next/assets/context-queries-xVKIeynP.js +2 -0
  295. package/dist/core/web/public/next/assets/context-queries-xVKIeynP.js.map +1 -0
  296. package/dist/core/web/public/next/assets/context.module-BijAfoJw.js +2 -0
  297. package/dist/core/web/public/next/assets/context.module-BijAfoJw.js.map +1 -0
  298. package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js → control-queries-DOZR-D8G.js} +2 -2
  299. package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js.map → control-queries-DOZR-D8G.js.map} +1 -1
  300. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +2 -0
  301. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +1 -0
  302. package/dist/core/web/public/next/assets/dock-icons-8EtARwUm.js +2 -0
  303. package/dist/core/web/public/next/assets/dock-icons-8EtARwUm.js.map +1 -0
  304. package/dist/core/web/public/next/assets/dock-panes-UKS-mXhr.js +2 -0
  305. package/dist/core/web/public/next/assets/{dock-panes-BNTLvX7G.js.map → dock-panes-UKS-mXhr.js.map} +1 -1
  306. package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js → dock-store-BA1cHOYA.js} +2 -2
  307. package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js.map → dock-store-BA1cHOYA.js.map} +1 -1
  308. package/dist/core/web/public/next/assets/fleet-model-CNe8Wh-s.js +2 -0
  309. package/dist/core/web/public/next/assets/fleet-model-CNe8Wh-s.js.map +1 -0
  310. package/dist/core/web/public/next/assets/fleet-queries-BSdRlUwJ.js +2 -0
  311. package/dist/core/web/public/next/assets/fleet-queries-BSdRlUwJ.js.map +1 -0
  312. package/dist/core/web/public/next/assets/format-B8DAVcn2.js +2 -0
  313. package/dist/core/web/public/next/assets/format-B8DAVcn2.js.map +1 -0
  314. package/dist/core/web/public/next/assets/format-DKrNjdwD.js +2 -0
  315. package/dist/core/web/public/next/assets/format-DKrNjdwD.js.map +1 -0
  316. package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js → git-model-CivuBY_D.js} +2 -2
  317. package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js.map → git-model-CivuBY_D.js.map} +1 -1
  318. package/dist/core/web/public/next/assets/global-Di2PUgj4.js +2 -0
  319. package/dist/core/web/public/next/assets/global-Di2PUgj4.js.map +1 -0
  320. package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js → guarded-action-CvOHcqyH.js} +2 -2
  321. package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js.map → guarded-action-CvOHcqyH.js.map} +1 -1
  322. package/dist/core/web/public/next/assets/{icons-DWb24OA6.js → icons-B_yuAgdN.js} +2 -2
  323. package/dist/core/web/public/next/assets/{icons-DWb24OA6.js.map → icons-B_yuAgdN.js.map} +1 -1
  324. package/dist/core/web/public/next/assets/{index-afDA8cwW.js → index-oAAq8XJa.js} +3 -3
  325. package/dist/core/web/public/next/assets/{index-afDA8cwW.js.map → index-oAAq8XJa.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/live-model-DCw_IFRI.js +2 -0
  327. package/dist/core/web/public/next/assets/live-model-DCw_IFRI.js.map +1 -0
  328. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +2 -0
  329. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +1 -0
  330. package/dist/core/web/public/next/assets/mind-B9PzLcl0.css +1 -0
  331. package/dist/core/web/public/next/assets/mind.module-vnuJcwvD.js +2 -0
  332. package/dist/core/web/public/next/assets/mind.module-vnuJcwvD.js.map +1 -0
  333. package/dist/core/web/public/next/assets/mutations-Dpsql5t7.js +2 -0
  334. package/dist/core/web/public/next/assets/{mutations-C6E10SPX.js.map → mutations-Dpsql5t7.js.map} +1 -1
  335. package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js → overnight-queries-X-44Gsw5.js} +2 -2
  336. package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js.map → overnight-queries-X-44Gsw5.js.map} +1 -1
  337. package/dist/core/web/public/next/assets/pane-chrome-8JmEhHVD.css +1 -0
  338. package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js +2 -0
  339. package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js.map +1 -0
  340. package/dist/core/web/public/next/assets/primitives-BDIcUvob.js +1 -0
  341. package/dist/core/web/public/next/assets/{queries-BuYIEHst.js → queries-BA4rNGD-.js} +2 -2
  342. package/dist/core/web/public/next/assets/{queries-BuYIEHst.js.map → queries-BA4rNGD-.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js → reasoning-pref-B9-DJUXP.js} +2 -2
  344. package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js.map → reasoning-pref-B9-DJUXP.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/seat-subscription-CH6fW4fJ.js +2 -0
  346. package/dist/core/web/public/next/assets/seat-subscription-CH6fW4fJ.js.map +1 -0
  347. package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js → section-visibility-qFqc_d4Z.js} +2 -2
  348. package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js.map → section-visibility-qFqc_d4Z.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js → sidebar-model-M1GaQU5l.js} +2 -2
  350. package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js.map → sidebar-model-M1GaQU5l.js.map} +1 -1
  351. package/dist/core/web/public/next/assets/slots-Ds9ZIqUL.js +3 -0
  352. package/dist/core/web/public/next/assets/{slots-W8gkmdfE.js.map → slots-Ds9ZIqUL.js.map} +1 -1
  353. package/dist/core/web/public/next/assets/surface-data-J52iIGMD.js +2 -0
  354. package/dist/core/web/public/next/assets/surface-data-J52iIGMD.js.map +1 -0
  355. package/dist/core/web/public/next/assets/surface-prefetch-CgZ-LEJK.js +2 -0
  356. package/dist/core/web/public/next/assets/surface-prefetch-CgZ-LEJK.js.map +1 -0
  357. package/dist/core/web/public/next/assets/tasks-model-ent8f0jZ.js +2 -0
  358. package/dist/core/web/public/next/assets/{tasks-model-CnYQzgxk.js.map → tasks-model-ent8f0jZ.js.map} +1 -1
  359. package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js → terminal-icons-DJTK7QpR.js} +2 -2
  360. package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js.map → terminal-icons-DJTK7QpR.js.map} +1 -1
  361. package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js → tool-semantics-GX8ScuSH.js} +2 -2
  362. package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js.map → tool-semantics-GX8ScuSH.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js → turn-files-BPHQzYuH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js.map → turn-files-BPHQzYuH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +2 -0
  366. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -0
  367. package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js → usage-queries-Bn8ccqyN.js} +2 -2
  368. package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js.map → usage-queries-Bn8ccqyN.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/use-guarded-action-C2HlSzkz.js +2 -0
  370. package/dist/core/web/public/next/assets/use-guarded-action-C2HlSzkz.js.map +1 -0
  371. package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js → use-ticker-BNc1H4ZC.js} +2 -2
  372. package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js.map → use-ticker-BNc1H4ZC.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/use-token-gate-B3IJL6bf.js +2 -0
  374. package/dist/core/web/public/next/assets/use-token-gate-B3IJL6bf.js.map +1 -0
  375. package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js → useActivity-Bk3XgXjL.js} +2 -2
  376. package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js.map → useActivity-Bk3XgXjL.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +1 -0
  378. package/dist/core/web/public/next/assets/useChartWidth-lZ9PrQn0.js +2 -0
  379. package/dist/core/web/public/next/assets/useChartWidth-lZ9PrQn0.js.map +1 -0
  380. package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js → useSeatsRefresh-CG4jczeL.js} +2 -2
  381. package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js.map → useSeatsRefresh-CG4jczeL.js.map} +1 -1
  382. package/dist/core/web/public/next/assets/verse-model-D7NZQFAR.js +2 -0
  383. package/dist/core/web/public/next/assets/verse-model-D7NZQFAR.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js → verse-queries-DvIJcn6Z.js} +2 -2
  385. package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js.map → verse-queries-DvIJcn6Z.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/verse-store-DjBWj04q.js +3 -0
  387. package/dist/core/web/public/next/assets/verse-store-DjBWj04q.js.map +1 -0
  388. package/dist/core/web/public/next/assets/verse-ui-store-zafyzXKD.js +3 -0
  389. package/dist/core/web/public/next/assets/{verse-ui-store-KTTKfv-T.js.map → verse-ui-store-zafyzXKD.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js → viewport-BEqGUoTA.js} +2 -2
  391. package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js.map → viewport-BEqGUoTA.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/warmup-BR6pxAKs.js +3 -0
  393. package/dist/core/web/public/next/assets/warmup-BR6pxAKs.js.map +1 -0
  394. package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js → workspace-model-D_tWD5Wt.js} +2 -2
  395. package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js.map → workspace-model-D_tWD5Wt.js.map} +1 -1
  396. package/dist/core/web/public/next/index.html +1 -1
  397. package/dist/release-dependency-inventory.json +1 -1
  398. package/package.json +1 -1
  399. package/dist/core/web/public/next/assets/Advanced-CHjxJt2z.css +0 -1
  400. package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js +0 -2
  401. package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js.map +0 -1
  402. package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js +0 -2
  403. package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js.map +0 -1
  404. package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js +0 -2
  405. package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js.map +0 -1
  406. package/dist/core/web/public/next/assets/AutonomySection-CoMngwNB.js +0 -2
  407. package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js +0 -2
  408. package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js.map +0 -1
  409. package/dist/core/web/public/next/assets/BranchBar-C9BpPVLr.css +0 -1
  410. package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js +0 -2
  411. package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js.map +0 -1
  412. package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js +0 -2
  413. package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js.map +0 -1
  414. package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js +0 -2
  415. package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js.map +0 -1
  416. package/dist/core/web/public/next/assets/CapacityStrip-wgFP9MUA.css +0 -1
  417. package/dist/core/web/public/next/assets/ChatSection-B9cdRKUh.js +0 -3
  418. package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js +0 -2
  419. package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js.map +0 -1
  420. package/dist/core/web/public/next/assets/Composer-CkcwbQhG.css +0 -1
  421. package/dist/core/web/public/next/assets/Composer.module-DJMdrqNt.js +0 -2
  422. package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js +0 -2
  423. package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js.map +0 -1
  424. package/dist/core/web/public/next/assets/DiffPane-Csboxnn0.css +0 -1
  425. package/dist/core/web/public/next/assets/DockHost-BGnTgdIb.css +0 -1
  426. package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js +0 -2
  427. package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js.map +0 -1
  428. package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js +0 -3
  429. package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js.map +0 -1
  430. package/dist/core/web/public/next/assets/FleetSection-w9AjqfTR.css +0 -1
  431. package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js +0 -2
  432. package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js.map +0 -1
  433. package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js +0 -2
  434. package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js.map +0 -1
  435. package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js +0 -2
  436. package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js.map +0 -1
  437. package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js +0 -2
  438. package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js.map +0 -1
  439. package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js +0 -2
  440. package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js.map +0 -1
  441. package/dist/core/web/public/next/assets/McpSection-1UncWBpW.js +0 -2
  442. package/dist/core/web/public/next/assets/MessageMarkdown-C4pl9LI5.js +0 -3
  443. package/dist/core/web/public/next/assets/MessageMarkdown-Czcl3L_Q.css +0 -1
  444. package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js +0 -2
  445. package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js.map +0 -1
  446. package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js +0 -2
  447. package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js.map +0 -1
  448. package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js +0 -2
  449. package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js.map +0 -1
  450. package/dist/core/web/public/next/assets/NeedsYouDrawer-SkhvvdLb.css +0 -1
  451. package/dist/core/web/public/next/assets/NewChatDialog-B_BsS9pr.js +0 -3
  452. package/dist/core/web/public/next/assets/OnboardingFlow-CtCPpgoX.js +0 -2
  453. package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js +0 -2
  454. package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js.map +0 -1
  455. package/dist/core/web/public/next/assets/PreviewPane-WQJFjSXe.css +0 -1
  456. package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js +0 -2
  457. package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js.map +0 -1
  458. package/dist/core/web/public/next/assets/SeatSelector-DaUO-zoK.js +0 -3
  459. package/dist/core/web/public/next/assets/SessionSearch-B5aQ0BCM.js +0 -2
  460. package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js +0 -2
  461. package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js.map +0 -1
  462. package/dist/core/web/public/next/assets/Sidebar-DfD8MNZt.css +0 -1
  463. package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js +0 -3
  464. package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js.map +0 -1
  465. package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js +0 -2
  466. package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js.map +0 -1
  467. package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js +0 -2
  468. package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js.map +0 -1
  469. package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js +0 -7
  470. package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js.map +0 -1
  471. package/dist/core/web/public/next/assets/TerminalPane-CmE2QL-Q.css +0 -1
  472. package/dist/core/web/public/next/assets/UniverseConsoleApp-DKqAf-eD.js +0 -2
  473. package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js +0 -2
  474. package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js.map +0 -1
  475. package/dist/core/web/public/next/assets/UsageSection-DwgNOYvi.css +0 -1
  476. package/dist/core/web/public/next/assets/VerseConsoleApp-C0V221WL.css +0 -1
  477. package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js +0 -3
  478. package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js.map +0 -1
  479. package/dist/core/web/public/next/assets/Workspace-DQXMVDf7.css +0 -1
  480. package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js +0 -10
  481. package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js.map +0 -1
  482. package/dist/core/web/public/next/assets/actions-Bszsdpms.js +0 -2
  483. package/dist/core/web/public/next/assets/actions-Bszsdpms.js.map +0 -1
  484. package/dist/core/web/public/next/assets/actions-Dug8YIf0.css +0 -1
  485. package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js +0 -2
  486. package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js.map +0 -1
  487. package/dist/core/web/public/next/assets/charts-D4NaLaXA.js +0 -2
  488. package/dist/core/web/public/next/assets/charts-D4NaLaXA.js.map +0 -1
  489. package/dist/core/web/public/next/assets/colors-B-vHsX1S.js +0 -2
  490. package/dist/core/web/public/next/assets/colors-B-vHsX1S.js.map +0 -1
  491. package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js +0 -2
  492. package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js.map +0 -1
  493. package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js +0 -2
  494. package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js.map +0 -1
  495. package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js +0 -2
  496. package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js.map +0 -1
  497. package/dist/core/web/public/next/assets/context.module-B_k02HNU.js +0 -2
  498. package/dist/core/web/public/next/assets/context.module-B_k02HNU.js.map +0 -1
  499. package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js +0 -2
  500. package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js.map +0 -1
  501. package/dist/core/web/public/next/assets/dock-panes-BNTLvX7G.js +0 -2
  502. package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js +0 -2
  503. package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js.map +0 -1
  504. package/dist/core/web/public/next/assets/format-BNYWGJat.js +0 -2
  505. package/dist/core/web/public/next/assets/format-BNYWGJat.js.map +0 -1
  506. package/dist/core/web/public/next/assets/global-DVgMguLr.js +0 -2
  507. package/dist/core/web/public/next/assets/global-DVgMguLr.js.map +0 -1
  508. package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js +0 -2
  509. package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js.map +0 -1
  510. package/dist/core/web/public/next/assets/mind-B-lYfSUJ.css +0 -1
  511. package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js +0 -2
  512. package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js.map +0 -1
  513. package/dist/core/web/public/next/assets/mutations-C6E10SPX.js +0 -2
  514. package/dist/core/web/public/next/assets/primitives-DQvYikjm.js +0 -1
  515. package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js +0 -2
  516. package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js.map +0 -1
  517. package/dist/core/web/public/next/assets/slots-W8gkmdfE.js +0 -3
  518. package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js +0 -2
  519. package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js.map +0 -1
  520. package/dist/core/web/public/next/assets/tasks-model-CnYQzgxk.js +0 -2
  521. package/dist/core/web/public/next/assets/types-Dypu22dp.js +0 -3
  522. package/dist/core/web/public/next/assets/types-Dypu22dp.js.map +0 -1
  523. package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js +0 -2
  524. package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js.map +0 -1
  525. package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js +0 -2
  526. package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js.map +0 -1
  527. package/dist/core/web/public/next/assets/useChartWidth-B8E5mJgM.css +0 -1
  528. package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js +0 -2
  529. package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js.map +0 -1
  530. package/dist/core/web/public/next/assets/verse-model-E98kXngO.js +0 -2
  531. package/dist/core/web/public/next/assets/verse-model-E98kXngO.js.map +0 -1
  532. package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js +0 -2
  533. package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js.map +0 -1
  534. package/dist/core/web/public/next/assets/verse-ui-store-KTTKfv-T.js +0 -3
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Self-improvement backlog (unit C1): built-in items (improvement-backlog.ts)
3
+ * plus operator/Leader items at `<cloudHome>/backlog.json`. An item is
4
+ * "claimed" by its newest task; it becomes available again 3 days after
5
+ * that task ends closed/failed/expired, never after merged.
6
+ *
7
+ * File: `{ "v": 1, "items": CloudBacklogItem[] }`, 0600, at most
8
+ * CLOUD_BACKLOG_MAX_USER_ITEMS items. Readers validate every item and skip
9
+ * the bad ones, so one hand-mangled entry cannot hide the rest.
10
+ */
11
+ import { join } from 'node:path';
12
+ import { readPrivateFileCapped, writePrivateFileAtomic } from '../verse/preferences.js';
13
+ import { BUILTIN_IMPROVEMENT_BACKLOG } from './improvement-backlog.js';
14
+ import { CLOUD_REPO_PATTERN, cloudHome, ensureCloudDirectory, listCloudTasks } from './store.js';
15
+ import { CLOUD_PROMPT_MAX_CHARS } from './types.js';
16
+ export const CLOUD_BACKLOG_FILE = 'backlog.json';
17
+ export const CLOUD_BACKLOG_MAX_USER_ITEMS = 200;
18
+ /** A closed/failed/expired item is retried after this long (a merged one never is). */
19
+ export const CLOUD_BACKLOG_RETRY_MS = 3 * 24 * 60 * 60 * 1000;
20
+ const BACKLOG_VERSION = 1;
21
+ /** 200 items × a 20 000-char prompt, with room for JSON escaping. */
22
+ const MAX_FILE_BYTES = 8 * 1024 * 1024;
23
+ const ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,119}$/;
24
+ const MAX_TITLE_CHARS = 200;
25
+ const MAX_AREA_CHARS = 40;
26
+ const RETRYABLE = ['closed', 'failed', 'expired'];
27
+ export function cloudBacklogPath() {
28
+ return join(cloudHome(), CLOUD_BACKLOG_FILE);
29
+ }
30
+ /** A clean copy of a valid item, or null. Titles and areas are trimmed; nothing else is rewritten. */
31
+ export function validBacklogItem(value) {
32
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
33
+ return null;
34
+ const r = value;
35
+ const id = r['id'];
36
+ const title = typeof r['title'] === 'string' ? r['title'].trim() : '';
37
+ const prompt = typeof r['prompt'] === 'string' ? r['prompt'] : '';
38
+ const area = typeof r['area'] === 'string' ? r['area'].trim() : '';
39
+ const priority = r['priority'];
40
+ const repo = r['repo'];
41
+ if (typeof id !== 'string' || !ID_RE.test(id))
42
+ return null;
43
+ if (title === '' || title.length > MAX_TITLE_CHARS)
44
+ return null;
45
+ if (prompt.trim() === '' || prompt.length > CLOUD_PROMPT_MAX_CHARS)
46
+ return null;
47
+ if (area === '' || area.length > MAX_AREA_CHARS)
48
+ return null;
49
+ if (priority !== 1 && priority !== 2 && priority !== 3)
50
+ return null;
51
+ if (repo !== undefined && (typeof repo !== 'string' || !CLOUD_REPO_PATTERN.test(repo)))
52
+ return null;
53
+ return { id, title, prompt, area, priority, ...(repo !== undefined ? { repo } : {}) };
54
+ }
55
+ /** Dedupe key for titles: case, punctuation and spacing do not make an item new. */
56
+ export function normaliseBacklogTitle(title) {
57
+ return title.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();
58
+ }
59
+ /** The operator/Leader items on disk, validated, deduped, capped. Total: any bad file reads as empty. */
60
+ export function readUserBacklogItems() {
61
+ const file = readPrivateFileCapped(cloudBacklogPath(), MAX_FILE_BYTES);
62
+ if (!file || file.truncated)
63
+ return [];
64
+ let value;
65
+ try {
66
+ value = JSON.parse(file.text);
67
+ }
68
+ catch {
69
+ return [];
70
+ }
71
+ // A bare array is accepted too: it is what an operator writes by hand.
72
+ const raw = Array.isArray(value) ? value
73
+ : value !== null && typeof value === 'object' && Array.isArray(value['items'])
74
+ ? value['items']
75
+ : [];
76
+ const ids = new Set(BUILTIN_IMPROVEMENT_BACKLOG.map((item) => item.id));
77
+ const titles = new Set(BUILTIN_IMPROVEMENT_BACKLOG.map((item) => normaliseBacklogTitle(item.title)));
78
+ const items = [];
79
+ for (const entry of raw) {
80
+ if (items.length >= CLOUD_BACKLOG_MAX_USER_ITEMS)
81
+ break;
82
+ const item = validBacklogItem(entry);
83
+ if (!item || ids.has(item.id) || titles.has(normaliseBacklogTitle(item.title)))
84
+ continue;
85
+ ids.add(item.id);
86
+ titles.add(normaliseBacklogTitle(item.title));
87
+ items.push(item);
88
+ }
89
+ return items;
90
+ }
91
+ /** Built-in first, then user items, each in file order: the tie-break after priority. */
92
+ function allItems() {
93
+ return [...BUILTIN_IMPROVEMENT_BACKLOG, ...readUserBacklogItems()];
94
+ }
95
+ /** Newest task per backlog item id. */
96
+ function newestTaskByItem(tasks) {
97
+ const newest = new Map();
98
+ for (const task of tasks) {
99
+ if (!task.backlogItemId)
100
+ continue;
101
+ const seen = newest.get(task.backlogItemId);
102
+ if (!seen || Date.parse(task.createdAt) > Date.parse(seen.createdAt))
103
+ newest.set(task.backlogItemId, task);
104
+ }
105
+ return newest;
106
+ }
107
+ function claimOf(task, nowMs) {
108
+ if (!task)
109
+ return { claimedBy: null, lastState: null };
110
+ if (RETRYABLE.includes(task.state)) {
111
+ // updatedAt is when the task last changed — for a terminal task, when it ended.
112
+ const endedAt = Date.parse(task.updatedAt);
113
+ const released = Number.isFinite(endedAt) && nowMs - endedAt >= CLOUD_BACKLOG_RETRY_MS;
114
+ return { claimedBy: released ? null : task.id, lastState: task.state };
115
+ }
116
+ // Non-terminal: in progress. Merged: done for good.
117
+ return { claimedBy: task.id, lastState: task.state };
118
+ }
119
+ function ordered(items) {
120
+ return items.map((item, index) => ({ item, index }))
121
+ .sort((a, b) => a.item.priority - b.item.priority || a.index - b.index)
122
+ .map(({ item }) => item);
123
+ }
124
+ export function readCloudBacklog(tasks, now) {
125
+ const newest = newestTaskByItem(tasks);
126
+ const nowMs = now.getTime();
127
+ const items = ordered(allItems()).map((item) => ({ ...item, ...claimOf(newest.get(item.id), nowMs) }));
128
+ return { items, nextUp: items.find((item) => item.claimedBy === null)?.id ?? null };
129
+ }
130
+ /** Next unclaimed item for `repo`, highest priority first, then built-in order. */
131
+ export function nextBacklogItem(tasks, repo, now) {
132
+ const newest = newestTaskByItem(tasks);
133
+ const nowMs = now.getTime();
134
+ const target = repo.toLowerCase();
135
+ // An item without a repo targets whichever repo self-improvement is pointed at.
136
+ const match = ordered(allItems()).find((item) => (item.repo === undefined || item.repo.toLowerCase() === target) && claimOf(newest.get(item.id), nowMs).claimedBy === null);
137
+ return match ?? null;
138
+ }
139
+ /** Adds items (dedupe by id and by normalised title); returns how many were new. Leader/operator entry point. */
140
+ export function appendUserBacklogItems(items) {
141
+ if (!Array.isArray(items) || items.length === 0)
142
+ return 0;
143
+ let existing = readUserBacklogItems();
144
+ const ids = new Set([...BUILTIN_IMPROVEMENT_BACKLOG, ...existing].map((item) => item.id));
145
+ const titles = new Set([...BUILTIN_IMPROVEMENT_BACKLOG, ...existing].map((item) => normaliseBacklogTitle(item.title)));
146
+ const fresh = [];
147
+ for (const entry of items) {
148
+ const item = validBacklogItem(entry);
149
+ if (!item || ids.has(item.id) || titles.has(normaliseBacklogTitle(item.title)))
150
+ continue;
151
+ ids.add(item.id);
152
+ titles.add(normaliseBacklogTitle(item.title));
153
+ fresh.push(item);
154
+ }
155
+ if (fresh.length === 0)
156
+ return 0;
157
+ if (existing.length + fresh.length > CLOUD_BACKLOG_MAX_USER_ITEMS) {
158
+ // Make room by retiring items that are finished for good (their newest
159
+ // task merged), oldest first — never an item still waiting to run.
160
+ const newest = newestTaskByItem(listCloudTasks());
161
+ let excess = existing.length + fresh.length - CLOUD_BACKLOG_MAX_USER_ITEMS;
162
+ existing = existing.filter((item) => {
163
+ if (excess > 0 && newest.get(item.id)?.state === 'merged') {
164
+ excess -= 1;
165
+ return false;
166
+ }
167
+ return true;
168
+ });
169
+ }
170
+ const accepted = fresh.slice(0, Math.max(0, CLOUD_BACKLOG_MAX_USER_ITEMS - existing.length));
171
+ if (accepted.length === 0)
172
+ return 0;
173
+ ensureCloudDirectory();
174
+ writePrivateFileAtomic(cloudBacklogPath(), `${JSON.stringify({ v: BACKLOG_VERSION, items: [...existing, ...accepted] }, null, 2)}\n`);
175
+ return accepted.length;
176
+ }
177
+ //# sourceMappingURL=backlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../../src/core/cloud/backlog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,sBAAsB,EAAuF,MAAM,YAAY,CAAC;AAEzI,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AACjD,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAChD,uFAAuF;AACvF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9D,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,qEAAqE;AACrE,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,MAAM,KAAK,GAAG,oCAAoC,CAAC;AACnD,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,SAAS,GAA8B,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAE7E,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC/C,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,sBAAsB;QAAE,OAAO,IAAI,CAAC;IAChF,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,cAAc;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAChE,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,EAAE,cAAc,CAAC,CAAC;IACvE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IACvC,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,EAAE,CAAC;IACZ,CAAC;IACD,uEAAuE;IACvE,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;QACtC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,KAAiC,CAAC,OAAO,CAAC,CAAC;YACzG,CAAC,CAAE,KAAiC,CAAC,OAAO,CAAc;YAC1D,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrG,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,MAAM,IAAI,4BAA4B;YAAE,MAAM;QACxD,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAE,SAAS;QACzF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yFAAyF;AACzF,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,2BAA2B,EAAE,GAAG,oBAAoB,EAAE,CAAC,CAAC;AACrE,CAAC;AAOD,uCAAuC;AACvC,SAAS,gBAAgB,CAAC,KAA6B;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,SAAS;QAClC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC7G,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,OAAO,CAAC,IAA6B,EAAE,KAAa;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACvD,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,gFAAgF;QAChF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,GAAG,OAAO,IAAI,sBAAsB,CAAC;QACvF,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACzE,CAAC;IACD,oDAAoD;IACpD,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,OAAO,CAA6B,KAAmB;IAC9D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;SACjD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACtE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAA6B,EAAE,GAAS;IACvE,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACvG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;AACtF,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,KAA6B,EAAE,IAAY,EAAE,GAAS;IACpF,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAClC,gFAAgF;IAChF,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9C,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;IAC7H,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED,iHAAiH;AACjH,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,2BAA2B,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,2BAA2B,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvH,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAE,SAAS;QACzF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEjC,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,4BAA4B,EAAE,CAAC;QAClE,uEAAuE;QACvE,mEAAmE;QACnE,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,4BAA4B,CAAC;QAC3E,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAClC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC1D,MAAM,IAAI,CAAC,CAAC;gBACZ,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,4BAA4B,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACpC,oBAAoB,EAAE,CAAC;IACvB,sBAAsB,CAAC,gBAAgB,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACtI,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Budget view + gates (unit C1). Spend = creditsSpentAdjustmentUsd + sum of
3
+ * estimatedCostUsd over tasks that reached `running` or later (failed
4
+ * launches cost nothing). "Today" = the operator's local calendar day.
5
+ *
6
+ * Pure: no clock, no disk — the caller passes the tasks, the budget and now.
7
+ */
8
+ import { type CloudBudgetV1, type CloudBudgetView, type CloudTaskV1 } from './types.js';
9
+ /**
10
+ * Whether a task consumed a session. A session id is the proof; the states
11
+ * cover a task recorded without one. A `closed` task with no session is a
12
+ * dismissed failure, not spend.
13
+ */
14
+ export declare function taskConsumedSession(task: CloudTaskV1): boolean;
15
+ /** `YYYY-MM-DD` of the operator's local calendar day. */
16
+ export declare function localDayKey(date: Date): string;
17
+ /** `$3`, `$2.50`, `$1,234` — whole dollars without cents. */
18
+ export declare function formatUsd(value: number): string;
19
+ export declare function cloudBudgetView(tasks: readonly CloudTaskV1[], budget: CloudBudgetV1, now: Date): CloudBudgetView;
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Budget view + gates (unit C1). Spend = creditsSpentAdjustmentUsd + sum of
3
+ * estimatedCostUsd over tasks that reached `running` or later (failed
4
+ * launches cost nothing). "Today" = the operator's local calendar day.
5
+ *
6
+ * Pure: no clock, no disk — the caller passes the tasks, the budget and now.
7
+ */
8
+ import { CLOUD_BALANCE_URL } from './types.js';
9
+ const OK = Object.freeze({ ok: true, reason: null });
10
+ const refuse = (reason) => ({ ok: false, reason });
11
+ /**
12
+ * Whether a task consumed a session. A session id is the proof; the states
13
+ * cover a task recorded without one. A `closed` task with no session is a
14
+ * dismissed failure, not spend.
15
+ */
16
+ export function taskConsumedSession(task) {
17
+ return task.sessionId !== null || task.state === 'running' || task.state === 'pr-open' || task.state === 'merged' || task.state === 'expired';
18
+ }
19
+ /** In flight: accepted and not yet resolved into a session or a failure. Counts toward the daily caps so a burst cannot overshoot them. */
20
+ const inFlight = (task) => task.state === 'queued' || task.state === 'launching';
21
+ /** `YYYY-MM-DD` of the operator's local calendar day. */
22
+ export function localDayKey(date) {
23
+ return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
24
+ }
25
+ /** `$3`, `$2.50`, `$1,234` — whole dollars without cents. */
26
+ export function formatUsd(value) {
27
+ const rounded = Math.round(value * 100) / 100;
28
+ const whole = Number.isInteger(rounded);
29
+ return `$${rounded.toLocaleString('en-US', { minimumFractionDigits: whole ? 0 : 2, maximumFractionDigits: whole ? 0 : 2 })}`;
30
+ }
31
+ const plural = (n, one, many) => (n === 1 ? one : many);
32
+ export function cloudBudgetView(tasks, budget, now) {
33
+ const today = localDayKey(now);
34
+ let spent = budget.creditsSpentAdjustmentUsd;
35
+ let sessionsToday = 0;
36
+ let selfImproveToday = 0;
37
+ let running = 0;
38
+ let queued = 0;
39
+ for (const task of tasks) {
40
+ const consumed = taskConsumedSession(task);
41
+ if (consumed)
42
+ spent += task.estimatedCostUsd;
43
+ if (task.state === 'launching' || task.state === 'running')
44
+ running += 1;
45
+ if (task.state === 'queued')
46
+ queued += 1;
47
+ if (!consumed && !inFlight(task))
48
+ continue;
49
+ const at = Date.parse(task.launchedAt ?? task.createdAt);
50
+ if (!Number.isFinite(at) || localDayKey(new Date(at)) !== today)
51
+ continue;
52
+ sessionsToday += 1;
53
+ if (task.origin === 'self-improve')
54
+ selfImproveToday += 1;
55
+ }
56
+ const estimatedSpentUsd = Math.round(spent * 100) / 100;
57
+ const estimatedRemainingUsd = Math.max(0, Math.round((budget.creditsTotalUsd - estimatedSpentUsd) * 100) / 100);
58
+ const cost = budget.estimatedCostPerSessionUsd;
59
+ let canLaunch = OK;
60
+ if (estimatedRemainingUsd < cost || (cost === 0 && estimatedRemainingUsd <= 0)) {
61
+ canLaunch = refuse(`About ${formatUsd(estimatedRemainingUsd)} of estimated credits is left — not enough for another session at ${formatUsd(cost)} each.`);
62
+ }
63
+ else if (sessionsToday >= budget.maxSessionsPerDay) {
64
+ canLaunch = refuse(`${sessionsToday} of ${budget.maxSessionsPerDay} cloud ${plural(budget.maxSessionsPerDay, 'session', 'sessions')} used today.`);
65
+ }
66
+ else if (running + queued >= budget.maxConcurrent) {
67
+ // Queued tasks are about to launch, so they hold a slot: otherwise two
68
+ // launches accepted back to back (different repos) could both pass a cap of one.
69
+ canLaunch = refuse(`${running + queued} of ${budget.maxConcurrent} cloud ${plural(budget.maxConcurrent, 'session is', 'sessions are')} already running.`);
70
+ }
71
+ let canSelfImprove = canLaunch;
72
+ if (canLaunch.ok) {
73
+ if (!budget.selfImprove.enabled) {
74
+ canSelfImprove = refuse('Self-improvement is turned off.');
75
+ }
76
+ else if (selfImproveToday >= budget.selfImprove.maxPerDay) {
77
+ canSelfImprove = refuse(`${selfImproveToday} of ${budget.selfImprove.maxPerDay} self-improvement ${plural(budget.selfImprove.maxPerDay, 'launch', 'launches')} used today.`);
78
+ }
79
+ else if (estimatedRemainingUsd - cost < budget.selfImprove.reserveUsd) {
80
+ // The reserve is kept for the operator's own tasks: self-improvement
81
+ // stops BEFORE a launch would take the estimate below it.
82
+ canSelfImprove = refuse(`Another self-improvement session would take estimated credits below the ${formatUsd(budget.selfImprove.reserveUsd)} reserve.`);
83
+ }
84
+ }
85
+ return {
86
+ creditsTotalUsd: budget.creditsTotalUsd,
87
+ estimatedSpentUsd,
88
+ estimatedRemainingUsd,
89
+ sessionsToday,
90
+ selfImproveToday,
91
+ running,
92
+ canLaunch,
93
+ canSelfImprove,
94
+ estimateNote: `Estimated at ${formatUsd(cost)} per session — Claude doesn't expose the credit balance. Check it on claude.ai and adjust here.`,
95
+ balanceUrl: CLOUD_BALANCE_URL,
96
+ budget,
97
+ };
98
+ }
99
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../../src/core/cloud/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export type CloudCheckoutResult = {
2
+ ok: true;
3
+ path: string;
4
+ } | {
5
+ ok: false;
6
+ failure: 'no-remote' | 'checkout-failed';
7
+ message: string;
8
+ };
9
+ export interface CloudCheckoutDeps {
10
+ git?: (args: string[], opts: {
11
+ cwd: string;
12
+ timeoutMs: number;
13
+ }) => Promise<{
14
+ ok: boolean;
15
+ stdout: string;
16
+ stderr: string;
17
+ }>;
18
+ originUrlFor?: (repo: string) => string;
19
+ }
20
+ export declare const CLOUD_CHECKOUTS_DIR = "checkouts";
21
+ /**
22
+ * In-process FIFO mutex keyed by string. Two `--cloud` runs (or a fetch and
23
+ * a launch) in one folder would race on the checked-out branch, so every
24
+ * user of a folder queues here. The map entry is dropped when the last
25
+ * waiter finishes, so it never grows with the number of repos ever used.
26
+ */
27
+ export declare class KeyedMutex {
28
+ private readonly tails;
29
+ run<T>(key: string, fn: () => Promise<T>): Promise<T>;
30
+ /** True while any caller holds or waits for `key` (tests, diagnostics). */
31
+ busy(key: string): boolean;
32
+ }
33
+ /**
34
+ * A branch name git accepts that also cannot be read as an option or escape
35
+ * the ref namespace. Stricter than check-ref-format on purpose: base
36
+ * branches are human names like `main` or `v3110-cloud`.
37
+ */
38
+ export declare function isSafeBranchName(branch: string): boolean;
39
+ /** Lower-cased: GitHub names are case-insensitive, and so is the default macOS filesystem — one repo, one folder, one lock. */
40
+ export declare function cloudCheckoutPath(repo: string): string;
41
+ export declare function ensureCloudCheckout(repo: string, branch: string, deps?: CloudCheckoutDeps): Promise<CloudCheckoutResult>;
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Isolated launch checkouts (unit C1): `<cloudHome>/checkouts/<owner>__<name>`,
3
+ * a shallow single-branch clone of https://github.com/<owner>/<name>.git
4
+ * using the operator's normal git credentials. Before each launch:
5
+ * `git fetch --depth 1 origin <branch>` then `git checkout -B <branch>
6
+ * FETCH_HEAD` with upstream set, so the CLI sees a pushed branch. Never
7
+ * touches the operator's own clones or fleet mirrors. Serialise per path.
8
+ *
9
+ * WHY a checkout of our own: `claude --cloud` clones the cwd's origin at the
10
+ * cwd's CURRENT branch. Launching from the operator's working copy would pin
11
+ * the session to whatever branch they happen to have checked out (possibly
12
+ * unpushed); a private checkout pinned to the requested base makes the
13
+ * session start exactly where the task says.
14
+ */
15
+ import { lstatSync, rmSync } from 'node:fs';
16
+ import { join } from 'node:path';
17
+ import { defaultGitRunner } from '../verse/git-ops.js';
18
+ import { CLOUD_REPO_PATTERN, cloudHome, ensureCloudDirectory } from './store.js';
19
+ export const CLOUD_CHECKOUTS_DIR = 'checkouts';
20
+ const CLONE_TIMEOUT_MS = 180_000;
21
+ const GIT_TIMEOUT_MS = 60_000;
22
+ // ---------------------------------------------------------------------------
23
+ // Per-key mutex
24
+ // ---------------------------------------------------------------------------
25
+ /**
26
+ * In-process FIFO mutex keyed by string. Two `--cloud` runs (or a fetch and
27
+ * a launch) in one folder would race on the checked-out branch, so every
28
+ * user of a folder queues here. The map entry is dropped when the last
29
+ * waiter finishes, so it never grows with the number of repos ever used.
30
+ */
31
+ export class KeyedMutex {
32
+ tails = new Map();
33
+ async run(key, fn) {
34
+ const previous = this.tails.get(key) ?? Promise.resolve();
35
+ let release;
36
+ const current = new Promise((resolve) => { release = resolve; });
37
+ const tail = previous.then(() => current);
38
+ this.tails.set(key, tail);
39
+ await previous;
40
+ try {
41
+ return await fn();
42
+ }
43
+ finally {
44
+ release();
45
+ if (this.tails.get(key) === tail)
46
+ this.tails.delete(key);
47
+ }
48
+ }
49
+ /** True while any caller holds or waits for `key` (tests, diagnostics). */
50
+ busy(key) {
51
+ return this.tails.has(key);
52
+ }
53
+ }
54
+ const checkoutMutex = new KeyedMutex();
55
+ // ---------------------------------------------------------------------------
56
+ // Checkout
57
+ // ---------------------------------------------------------------------------
58
+ /**
59
+ * A branch name git accepts that also cannot be read as an option or escape
60
+ * the ref namespace. Stricter than check-ref-format on purpose: base
61
+ * branches are human names like `main` or `v3110-cloud`.
62
+ */
63
+ export function isSafeBranchName(branch) {
64
+ return typeof branch === 'string'
65
+ && branch.length > 0 && branch.length <= 200
66
+ && /^[A-Za-z0-9._/-]+$/.test(branch)
67
+ && !branch.startsWith('-') && !branch.startsWith('/') && !branch.endsWith('/')
68
+ && !branch.endsWith('.') && !branch.endsWith('.lock')
69
+ && !branch.includes('..') && !branch.includes('//') && !branch.includes('/.');
70
+ }
71
+ /** Lower-cased: GitHub names are case-insensitive, and so is the default macOS filesystem — one repo, one folder, one lock. */
72
+ export function cloudCheckoutPath(repo) {
73
+ const [owner, name] = repo.toLowerCase().split('/');
74
+ return join(cloudHome(), CLOUD_CHECKOUTS_DIR, `${owner}__${name}`);
75
+ }
76
+ const defaultOriginUrl = (repo) => `https://github.com/${repo}.git`;
77
+ async function defaultGit(args, opts) {
78
+ const result = await defaultGitRunner('git', args, { cwd: opts.cwd, timeoutMs: opts.timeoutMs });
79
+ return { ok: result.code === 0 && !result.timedOut, stdout: result.stdout, stderr: result.missing ? 'git is not installed' : result.stderr };
80
+ }
81
+ /** git's words for "that repo or branch is not on GitHub (or not reachable with these credentials)". */
82
+ function isMissingRemote(stderr) {
83
+ return /couldn't find remote ref|remote branch .* not found|repository not found|could not read from remote repository|could not read username|authentication failed|does not appear to be a git repository/i.test(stderr);
84
+ }
85
+ function failed(repo, branch, stderr) {
86
+ if (isMissingRemote(stderr)) {
87
+ return { ok: false, failure: 'no-remote', message: `Couldn't find branch ${branch} of ${repo} on GitHub. Check the repo name, that the branch is pushed, and that git can reach it.` };
88
+ }
89
+ return { ok: false, failure: 'checkout-failed', message: `Couldn't prepare a checkout of ${repo} at ${branch} for the cloud launch.` };
90
+ }
91
+ function isGitCheckout(path) {
92
+ try {
93
+ const dir = lstatSync(path);
94
+ if (!dir.isDirectory() || dir.isSymbolicLink())
95
+ return false;
96
+ return lstatSync(join(path, '.git')).isDirectory();
97
+ }
98
+ catch {
99
+ return false;
100
+ }
101
+ }
102
+ async function prepare(repo, branch, deps) {
103
+ const git = deps.git ?? defaultGit;
104
+ const url = (deps.originUrlFor ?? defaultOriginUrl)(repo);
105
+ let parent;
106
+ try {
107
+ parent = ensureCloudDirectory(CLOUD_CHECKOUTS_DIR);
108
+ }
109
+ catch {
110
+ return { ok: false, failure: 'checkout-failed', message: "Couldn't create the private folder for cloud checkouts." };
111
+ }
112
+ const path = cloudCheckoutPath(repo);
113
+ if (!isGitCheckout(path)) {
114
+ // Anything else at our own path is a clone that died half-way (or was
115
+ // tampered with); it is ours to replace, and git refuses a non-empty target.
116
+ try {
117
+ rmSync(path, { recursive: true, force: true });
118
+ }
119
+ catch { /* clone below reports it */ }
120
+ const clone = await git(['clone', '--depth', '1', '--single-branch', '--no-tags', '--branch', branch, '--', url, path], { cwd: parent, timeoutMs: CLONE_TIMEOUT_MS });
121
+ if (!clone.ok) {
122
+ try {
123
+ rmSync(path, { recursive: true, force: true });
124
+ }
125
+ catch { /* best effort */ }
126
+ return failed(repo, branch, clone.stderr);
127
+ }
128
+ }
129
+ const steps = [
130
+ // The origin URL is re-asserted every time so a checkout can never launch
131
+ // against a remote other than the one the task names.
132
+ ['remote', 'set-url', 'origin', url],
133
+ // A single-branch clone only maps its first branch to a remote-tracking
134
+ // ref; git refuses an upstream (and cannot resolve @{u}) for any other
135
+ // base until the remote's fetch refspec covers it.
136
+ ['remote', 'set-branches', 'origin', '*'],
137
+ // An explicit refspec keeps a remote-tracking ref even in a single-branch
138
+ // clone, which is what the upstream below points at.
139
+ ['fetch', '--depth', '1', '--no-tags', 'origin', `+refs/heads/${branch}:refs/remotes/origin/${branch}`],
140
+ ['checkout', '--force', '-B', branch, 'FETCH_HEAD'],
141
+ ['branch', `--set-upstream-to=origin/${branch}`, branch],
142
+ // Nothing a previous launch left behind may ride along into the next session.
143
+ ['clean', '-ffdx'],
144
+ ];
145
+ for (const args of steps) {
146
+ const step = await git(args, { cwd: path, timeoutMs: args[0] === 'fetch' ? CLONE_TIMEOUT_MS : GIT_TIMEOUT_MS });
147
+ if (!step.ok)
148
+ return failed(repo, branch, step.stderr);
149
+ }
150
+ return { ok: true, path };
151
+ }
152
+ export async function ensureCloudCheckout(repo, branch, deps = {}) {
153
+ if (typeof repo !== 'string' || !CLOUD_REPO_PATTERN.test(repo)) {
154
+ return { ok: false, failure: 'checkout-failed', message: 'The repo must look like owner/name.' };
155
+ }
156
+ if (!isSafeBranchName(branch)) {
157
+ return { ok: false, failure: 'checkout-failed', message: `"${String(branch).slice(0, 80)}" isn't a branch name the cloud lane accepts.` };
158
+ }
159
+ return checkoutMutex.run(cloudCheckoutPath(repo), async () => {
160
+ try {
161
+ return await prepare(repo, branch, deps);
162
+ }
163
+ catch {
164
+ return { ok: false, failure: 'checkout-failed', message: `Couldn't prepare a checkout of ${repo} at ${branch} for the cloud launch.` };
165
+ }
166
+ });
167
+ }
168
+ //# sourceMappingURL=checkout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout.js","sourceRoot":"","sources":["../../../src/core/cloud/checkout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import type { ApiModule } from '../verse/api-modules.js';
2
+ import { type NeedsYouItem } from '../verse/workbench-types.js';
3
+ import { type CloudBudgetUpdate, type CloudLaunchRequest, type CloudTaskV1 } from './types.js';
4
+ /** Same shape the service validates (spec C1); checked here too so bad input is a 400, not a failed task. */
5
+ export declare const CLOUD_REPO_PATTERN: RegExp;
6
+ export declare class CloudInputError extends Error {
7
+ }
8
+ export declare function isValidCloudRepo(value: unknown): value is string;
9
+ export declare function isValidBranchName(value: unknown): value is string;
10
+ /** Strict parse of a launch body; throws CloudInputError with a plain sentence. `origin` defaults to operator. */
11
+ export declare function parseCloudLaunchBody(body: Record<string, unknown>): CloudLaunchRequest;
12
+ /**
13
+ * Strict parse of a budget update: types and signs only. Clamping to sane
14
+ * maxima is the store's job (updateCloudBudget), so the two never disagree
15
+ * about what "sane" means.
16
+ */
17
+ export declare function parseCloudBudgetBody(body: Record<string, unknown>): CloudBudgetUpdate;
18
+ export declare function parseCloudImproveBody(body: Record<string, unknown>): {
19
+ count: number;
20
+ };
21
+ export declare const CLOUD_DISMISS_REASON = "Dismissed in Verse.";
22
+ export type CloudDismissResult = {
23
+ ok: true;
24
+ task: CloudTaskV1;
25
+ } | {
26
+ ok: false;
27
+ status: 404 | 409;
28
+ error: string;
29
+ };
30
+ /**
31
+ * Mark a task `closed` with "Dismissed in Verse." — idempotent for a task
32
+ * already closed. Refused for a MERGED task (closing it would rewrite what
33
+ * happened) and while a launch is still in flight (the service would then
34
+ * overwrite the dismissal with `running`).
35
+ */
36
+ export declare function dismissCloudTask(id: string, now?: Date): CloudDismissResult;
37
+ /** Failed launches stay in Needs-you this long (spec C2). */
38
+ export declare const CLOUD_FAILED_WINDOW_MS: number;
39
+ /**
40
+ * PURE: the Needs-you items for `tasks` at `now`.
41
+ *
42
+ * WHY THESE SOURCES AND KINDS: the Needs-you contract (workbench-types.ts
43
+ * §2) has a closed set of sources and kinds, and the web drawer and the
44
+ * desktop shell switch on both exhaustively, so a new one is not additive.
45
+ * A cloud PR is exactly an `owner-lane-pr` — a PR that is never merged
46
+ * automatically and waits for Mason — filed under `fleet`, the source the
47
+ * drawer already reads for that kind. A failed launch is a failed piece of
48
+ * work the operator started (often from a chat's "Run in cloud"), so it is a
49
+ * `chats` / `chat-failed` item with no session to open.
50
+ */
51
+ export declare function cloudNeedsYouItems(tasks: readonly CloudTaskV1[], now: Date): NeedsYouItem[];
52
+ /**
53
+ * Needs-you producer (activity-api.ts calls it on every poll). Returns the
54
+ * cached items in O(1) and, when the cache is stale, rebuilds it on a later
55
+ * tick — the task store is file I/O and never runs on the poll's stack. The
56
+ * first call answers [] (cloud items are additive to sources that vouch for
57
+ * themselves) and has the real answer ready for the next poll.
58
+ */
59
+ export declare function needsYouItems(): NeedsYouItem[];
60
+ /** Test seam: replace the task reader (null restores) and drop the cache. */
61
+ export declare function setCloudNeedsYouReaderForTest(read: (() => readonly CloudTaskV1[]) | null): void;
62
+ export declare function refreshCloudTasksGuarded(): Promise<{
63
+ checked: number;
64
+ updated: number;
65
+ }>;
66
+ export declare const CLOUD_REFRESH_EVERY_MS: number;
67
+ export declare const CLOUD_IMPROVE_EVERY_MS: number;
68
+ export declare const CLOUD_IMPROVE_FIRST_DELAY_MS: number;
69
+ /** Why this process must not run the scheduler; null when it may. */
70
+ export declare function cloudSchedulerRefusal(env?: NodeJS.ProcessEnv): string | null;
71
+ export interface CloudSchedulerDeps {
72
+ refresh?: () => Promise<unknown>;
73
+ improve?: () => Promise<unknown>;
74
+ log?: (message: string) => void;
75
+ }
76
+ /**
77
+ * Start the process-wide scheduler once (idempotent, never throws). True when
78
+ * it runs. Jobs are guarded against overlapping runs — a tick that finds its
79
+ * previous run still going is skipped, not queued — and a failure is logged
80
+ * once per DISTINCT error, then stays quiet until it changes or clears.
81
+ */
82
+ export declare function startCloudScheduler(env?: NodeJS.ProcessEnv, deps?: CloudSchedulerDeps): boolean;
83
+ /** Stop the scheduler (tests, shutdown). Safe to call when it never started. */
84
+ export declare function stopCloudScheduler(): void;
85
+ export declare function cloudSchedulerRunning(): boolean;
86
+ export declare const handleCloudApi: ApiModule;