@ebrindley/build 0.0.0-stage → 1.42.1-rc28

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 (878) hide show
  1. package/.build-project/providers/catalog.json +13951 -0
  2. package/.build-project/providers/pricing.json +1978 -0
  3. package/.build-project/providers/registry.json +4103 -0
  4. package/.github/SECURITY.md +75 -0
  5. package/.nvmrc +1 -0
  6. package/CHANGELOG.md +661 -0
  7. package/CODE_OF_CONDUCT.md +44 -0
  8. package/CONTRIBUTING.md +24 -0
  9. package/INSTALL.md +623 -0
  10. package/LICENSE +21 -0
  11. package/README.md +118 -2
  12. package/THIRD_PARTY_NOTICES.txt +26 -0
  13. package/dist/ai-judge-UE5UOYOO.js +191 -0
  14. package/dist/allowlist-grounding-KPLN6NC5.js +16 -0
  15. package/dist/allowlist-utils-MZZKKXRD.js +31 -0
  16. package/dist/apply-completion-mode-EM37UZHB.js +110 -0
  17. package/dist/artifact-migrator-WPACNSEP.js +276 -0
  18. package/dist/ask-2OZ4JFQR.js +176 -0
  19. package/dist/auth-6UKBTJUQ.js +185 -0
  20. package/dist/auth-H5KJL6HL.js +165 -0
  21. package/dist/auth-LVJRJDMU.js +12 -0
  22. package/dist/auth-NHZOCNRR.js +94 -0
  23. package/dist/auth-PBXHWXGW.js +95 -0
  24. package/dist/auth-T7Y5DCAH.js +91 -0
  25. package/dist/auth-TVVKCHQW.js +13 -0
  26. package/dist/auth-UHB2UCSS.js +97 -0
  27. package/dist/auth-VACA3VUL.js +98 -0
  28. package/dist/auth-VVLC77S3.js +44 -0
  29. package/dist/auth-liveness-XO4AGDDD.js +53 -0
  30. package/dist/autoloop-cleanup-SI3VGAAR.js +106 -0
  31. package/dist/autoloop-evidence-gates-J5GG5YQB.js +39 -0
  32. package/dist/autoloop-gate-policy-SUNAEP6Q.js +169 -0
  33. package/dist/autoloop-helpers-VQGQNTT6.js +52 -0
  34. package/dist/autoloop-ledger-P6TIDP7C.js +96 -0
  35. package/dist/autoloop-ledger-subscriber-HFAGOZXH.js +161 -0
  36. package/dist/autoloop-run-defaults-GWGZBNT7.js +27 -0
  37. package/dist/autoloop-run-lock-GBWRM5A2.js +197 -0
  38. package/dist/autoloop-success-C32QVWOP.js +93 -0
  39. package/dist/autoloop-termination-summary-GI6IBQWD.js +58 -0
  40. package/dist/autoloop-trajectory-AMKSQISD.js +70 -0
  41. package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
  42. package/dist/automatic-branch-cleanup-R62X2C5O.js +49 -0
  43. package/dist/autonomous-loop-controller-2WL363LW.js +4386 -0
  44. package/dist/backend-YUTFDZXZ.js +30 -0
  45. package/dist/background-executor-Z3ODTMD7.js +260 -0
  46. package/dist/backlog-75QPEAMW.js +403 -0
  47. package/dist/backlog-execution-intent-GWUV5TUK.js +19 -0
  48. package/dist/backup-active-store-XHWLN34M.js +16 -0
  49. package/dist/backup-machine-stores-UI4LTJOY.js +251 -0
  50. package/dist/backup-telemetry-db-Z4ICYCNW.js +26 -0
  51. package/dist/branch-archive-manager-FMSQ7YJF.js +18 -0
  52. package/dist/branch-cleanup-manager-ST6FJGND.js +35 -0
  53. package/dist/build-gate-7NKWPY62.js +68 -0
  54. package/dist/build-root-S7DINODY.js +18 -0
  55. package/dist/change-summary-R6CB6VXJ.js +50 -0
  56. package/dist/chunk-24MNKKOM.js +173 -0
  57. package/dist/chunk-2H6VZFIO.js +235 -0
  58. package/dist/chunk-2JIX3EKV.js +39 -0
  59. package/dist/chunk-2KO7HVZM.js +106 -0
  60. package/dist/chunk-2L36U25O.js +100 -0
  61. package/dist/chunk-2NMNFUQA.js +475 -0
  62. package/dist/chunk-2OUAEH67.js +83 -0
  63. package/dist/chunk-2VLJUXJU.js +115 -0
  64. package/dist/chunk-2VUEDIUM.js +77 -0
  65. package/dist/chunk-2Y2IIHPI.js +430 -0
  66. package/dist/chunk-2YRG3LHZ.js +220 -0
  67. package/dist/chunk-2Z5Q3SUY.js +65 -0
  68. package/dist/chunk-32IYXIE5.js +873 -0
  69. package/dist/chunk-33IGPPUI.js +292 -0
  70. package/dist/chunk-352PCJLK.js +283 -0
  71. package/dist/chunk-35J4NE6S.js +226 -0
  72. package/dist/chunk-3C7WBIVK.js +1016 -0
  73. package/dist/chunk-3H3EY6U7.js +1225 -0
  74. package/dist/chunk-3H4MWYIC.js +198 -0
  75. package/dist/chunk-3HHWQR3N.js +2479 -0
  76. package/dist/chunk-3JKNRYEE.js +14 -0
  77. package/dist/chunk-3LECCYZY.js +128 -0
  78. package/dist/chunk-3LOY6YZI.js +852 -0
  79. package/dist/chunk-3M57DADF.js +44 -0
  80. package/dist/chunk-3NOTLVLG.js +3803 -0
  81. package/dist/chunk-3OPP2OZB.js +1480 -0
  82. package/dist/chunk-3P5IN5E7.js +9 -0
  83. package/dist/chunk-3PL22IYZ.js +20 -0
  84. package/dist/chunk-3REDAJUJ.js +14 -0
  85. package/dist/chunk-3S2R4XJI.js +203 -0
  86. package/dist/chunk-3UBZI5DW.js +61 -0
  87. package/dist/chunk-3VV5OBGG.js +308 -0
  88. package/dist/chunk-3WY5TU2O.js +823 -0
  89. package/dist/chunk-43OKHTW4.js +82 -0
  90. package/dist/chunk-45KUJBDI.js +112 -0
  91. package/dist/chunk-47X5LM7B.js +224 -0
  92. package/dist/chunk-4B6FQJ77.js +268 -0
  93. package/dist/chunk-4BTDUT2S.js +42 -0
  94. package/dist/chunk-4DJL2VXA.js +24 -0
  95. package/dist/chunk-4EBSXZ73.js +48 -0
  96. package/dist/chunk-4QKP6I4C.js +294 -0
  97. package/dist/chunk-4U6XK2DG.js +300 -0
  98. package/dist/chunk-4UMRUFBD.js +132 -0
  99. package/dist/chunk-4US4SYJ4.js +569 -0
  100. package/dist/chunk-4ZPLWEZO.js +154 -0
  101. package/dist/chunk-56WPYDJH.js +624 -0
  102. package/dist/chunk-57WRCJJW.js +50 -0
  103. package/dist/chunk-5AW4RMNG.js +24 -0
  104. package/dist/chunk-5EQN56OZ.js +155 -0
  105. package/dist/chunk-5F43TUIN.js +38 -0
  106. package/dist/chunk-5FKHIKTS.js +115 -0
  107. package/dist/chunk-5HDP7XZG.js +91 -0
  108. package/dist/chunk-5KQETTNS.js +152 -0
  109. package/dist/chunk-5PDVN2KO.js +498 -0
  110. package/dist/chunk-5UBIFVRD.js +509 -0
  111. package/dist/chunk-5YDE3Q62.js +46 -0
  112. package/dist/chunk-626AJVMU.js +302 -0
  113. package/dist/chunk-633XZ7UF.js +3583 -0
  114. package/dist/chunk-63DHNHGA.js +236 -0
  115. package/dist/chunk-666656AR.js +568 -0
  116. package/dist/chunk-67YRJPJO.js +19 -0
  117. package/dist/chunk-6CAU7VBA.js +20 -0
  118. package/dist/chunk-6CB3KJRY.js +21 -0
  119. package/dist/chunk-6DBMALXL.js +29 -0
  120. package/dist/chunk-6E25C4IA.js +269 -0
  121. package/dist/chunk-6FIBNIQU.js +73 -0
  122. package/dist/chunk-6G57FYBV.js +189 -0
  123. package/dist/chunk-6KZKRTG3.js +4885 -0
  124. package/dist/chunk-6LAH2UV2.js +525 -0
  125. package/dist/chunk-6PZY2TTU.js +921 -0
  126. package/dist/chunk-6T6NHXK4.js +230 -0
  127. package/dist/chunk-6TBEX4R4.js +432 -0
  128. package/dist/chunk-6TRD7TEE.js +911 -0
  129. package/dist/chunk-6XCP2RAI.js +47 -0
  130. package/dist/chunk-726G6WDL.js +351 -0
  131. package/dist/chunk-75EMT7BF.js +616 -0
  132. package/dist/chunk-762ACDZJ.js +4696 -0
  133. package/dist/chunk-77I6G4CO.js +1 -0
  134. package/dist/chunk-7DJ6SQH3.js +510 -0
  135. package/dist/chunk-7HPCIOMA.js +1383 -0
  136. package/dist/chunk-7HYBSRPZ.js +17503 -0
  137. package/dist/chunk-7KBEOPVB.js +73 -0
  138. package/dist/chunk-7LHJDJB3.js +2222 -0
  139. package/dist/chunk-7NVJMH52.js +306 -0
  140. package/dist/chunk-7RMARDVH.js +33 -0
  141. package/dist/chunk-7SEWU4QG.js +36 -0
  142. package/dist/chunk-7TUTZTI2.js +911 -0
  143. package/dist/chunk-7VBDFPUM.js +340 -0
  144. package/dist/chunk-7VRJHTGZ.js +6406 -0
  145. package/dist/chunk-7YAOUUKK.js +493 -0
  146. package/dist/chunk-AAAODV76.js +860 -0
  147. package/dist/chunk-AB4HUJVQ.js +339 -0
  148. package/dist/chunk-AEQWV746.js +611 -0
  149. package/dist/chunk-AHU3FKPA.js +11639 -0
  150. package/dist/chunk-AISTV5XU.js +226 -0
  151. package/dist/chunk-AJBTKGJZ.js +48 -0
  152. package/dist/chunk-AJJNW7XT.js +248 -0
  153. package/dist/chunk-AJN5Y5YZ.js +160 -0
  154. package/dist/chunk-ALDTFNZ3.js +150 -0
  155. package/dist/chunk-ARARVIZK.js +281 -0
  156. package/dist/chunk-ATBM6AW5.js +53 -0
  157. package/dist/chunk-ATKEKM3E.js +206 -0
  158. package/dist/chunk-AUJLW6JZ.js +92 -0
  159. package/dist/chunk-AY3MHEFM.js +24 -0
  160. package/dist/chunk-B7PYTV72.js +236 -0
  161. package/dist/chunk-B7YRSULE.js +1423 -0
  162. package/dist/chunk-BAWJNMWF.js +339 -0
  163. package/dist/chunk-BBPIILO2.js +88 -0
  164. package/dist/chunk-BD3PGW6A.js +957 -0
  165. package/dist/chunk-BDPYFAB4.js +44 -0
  166. package/dist/chunk-BIUV23HH.js +729 -0
  167. package/dist/chunk-BQ3VAGXH.js +243 -0
  168. package/dist/chunk-BQJOGAWT.js +31 -0
  169. package/dist/chunk-BT7EG7CO.js +68 -0
  170. package/dist/chunk-BV3XQQLU.js +27 -0
  171. package/dist/chunk-BY6ODHNZ.js +78 -0
  172. package/dist/chunk-BZRLSZNV.js +79 -0
  173. package/dist/chunk-C3DH3NCY.js +2773 -0
  174. package/dist/chunk-C3KCMAJP.js +756 -0
  175. package/dist/chunk-C7AGUJ5K.js +267 -0
  176. package/dist/chunk-CBSWKQCX.js +342 -0
  177. package/dist/chunk-CE5OZBYY.js +21 -0
  178. package/dist/chunk-CFCVYHSW.js +373 -0
  179. package/dist/chunk-CHA2HDE5.js +126 -0
  180. package/dist/chunk-CIHWPGS5.js +146 -0
  181. package/dist/chunk-CJBSZX3F.js +127 -0
  182. package/dist/chunk-CLA6QIJM.js +43 -0
  183. package/dist/chunk-CPSVQR2I.js +365 -0
  184. package/dist/chunk-CRPRVNQ4.js +254 -0
  185. package/dist/chunk-CSIE4Y7C.js +1093 -0
  186. package/dist/chunk-CSOPSYDY.js +142 -0
  187. package/dist/chunk-CSXLLEGB.js +205 -0
  188. package/dist/chunk-CTDLERWU.js +293 -0
  189. package/dist/chunk-CULBXMSK.js +110 -0
  190. package/dist/chunk-D2M2Y5ID.js +21 -0
  191. package/dist/chunk-D37WY7SH.js +1060 -0
  192. package/dist/chunk-D4VJFCGZ.js +89 -0
  193. package/dist/chunk-D6WTZMZB.js +48 -0
  194. package/dist/chunk-DBHOWDUH.js +976 -0
  195. package/dist/chunk-DCACX7BV.js +19364 -0
  196. package/dist/chunk-DFHX4XYA.js +128 -0
  197. package/dist/chunk-DIKBRRKE.js +176 -0
  198. package/dist/chunk-DJG5RIOR.js +9 -0
  199. package/dist/chunk-DNIOIISW.js +616 -0
  200. package/dist/chunk-DOA5G7IA.js +315 -0
  201. package/dist/chunk-DP7FKP6W.js +855 -0
  202. package/dist/chunk-DS2JZ677.js +79 -0
  203. package/dist/chunk-DSRLVYBS.js +82 -0
  204. package/dist/chunk-EAEVKNJA.js +209 -0
  205. package/dist/chunk-EEUESN3T.js +575 -0
  206. package/dist/chunk-EJ4LUU5Y.js +73 -0
  207. package/dist/chunk-EJIWTPSZ.js +1063 -0
  208. package/dist/chunk-EJVCDTAN.js +116 -0
  209. package/dist/chunk-EKLUBDBQ.js +627 -0
  210. package/dist/chunk-EN62WLFD.js +849 -0
  211. package/dist/chunk-ENYRCL43.js +26 -0
  212. package/dist/chunk-EP22ZMFO.js +273 -0
  213. package/dist/chunk-EP4SVAVI.js +87 -0
  214. package/dist/chunk-EPAMVGI3.js +1562 -0
  215. package/dist/chunk-EPRMH6HO.js +24 -0
  216. package/dist/chunk-ES6NWJ36.js +4057 -0
  217. package/dist/chunk-ETA2K4KI.js +30 -0
  218. package/dist/chunk-ETAD4NKD.js +31 -0
  219. package/dist/chunk-EUWIIDQ7.js +93 -0
  220. package/dist/chunk-EVE3OD2W.js +141 -0
  221. package/dist/chunk-EXA26FFC.js +459 -0
  222. package/dist/chunk-EXSPAA35.js +244 -0
  223. package/dist/chunk-F55YABKV.js +258 -0
  224. package/dist/chunk-F5DNGU5W.js +27 -0
  225. package/dist/chunk-F622MJYV.js +103 -0
  226. package/dist/chunk-F6NIQD74.js +5111 -0
  227. package/dist/chunk-FAWJTC34.js +43 -0
  228. package/dist/chunk-FAZBRHGG.js +47 -0
  229. package/dist/chunk-FIEUSGNJ.js +39 -0
  230. package/dist/chunk-FKCG7K6H.js +1146 -0
  231. package/dist/chunk-FOVVXV45.js +229 -0
  232. package/dist/chunk-FRBPKBFE.js +30 -0
  233. package/dist/chunk-FSA5BPFI.js +268 -0
  234. package/dist/chunk-FSJ5TTZ3.js +29 -0
  235. package/dist/chunk-FT7SGLXT.js +193 -0
  236. package/dist/chunk-FUUVZZUB.js +62 -0
  237. package/dist/chunk-FYMRVUNZ.js +1697 -0
  238. package/dist/chunk-FYTAA5FG.js +162 -0
  239. package/dist/chunk-G3VB2UCZ.js +3892 -0
  240. package/dist/chunk-G6OIMVXH.js +405 -0
  241. package/dist/chunk-G7PQCXVH.js +228 -0
  242. package/dist/chunk-GAB6UW52.js +1087 -0
  243. package/dist/chunk-GAFJEYLK.js +29 -0
  244. package/dist/chunk-GC4CRMTS.js +642 -0
  245. package/dist/chunk-GFHSIWHL.js +5297 -0
  246. package/dist/chunk-GI5M67YA.js +735 -0
  247. package/dist/chunk-GIJWHUWF.js +191 -0
  248. package/dist/chunk-GO6DRECI.js +1 -0
  249. package/dist/chunk-GOFVBTMN.js +314 -0
  250. package/dist/chunk-GQIP72ZJ.js +13 -0
  251. package/dist/chunk-GQXLXRFA.js +28 -0
  252. package/dist/chunk-GT6HFKJB.js +48 -0
  253. package/dist/chunk-GVJGSSKM.js +174 -0
  254. package/dist/chunk-GWHGTG37.js +36 -0
  255. package/dist/chunk-GZAJHLKO.js +18 -0
  256. package/dist/chunk-GZK62I3N.js +314 -0
  257. package/dist/chunk-H3HGMISG.js +483 -0
  258. package/dist/chunk-H3ISZJMJ.js +403 -0
  259. package/dist/chunk-H4HXVWEC.js +9 -0
  260. package/dist/chunk-H6MJGKAW.js +120 -0
  261. package/dist/chunk-HBTTGVR5.js +353 -0
  262. package/dist/chunk-HBZ322WZ.js +35 -0
  263. package/dist/chunk-HEP3ILP4.js +34 -0
  264. package/dist/chunk-HGFXODKO.js +106 -0
  265. package/dist/chunk-HHWDTB6S.js +59 -0
  266. package/dist/chunk-HKO45NLZ.js +286 -0
  267. package/dist/chunk-HLVTEA6A.js +89 -0
  268. package/dist/chunk-HS3SY6HN.js +160 -0
  269. package/dist/chunk-HT5OCGKN.js +899 -0
  270. package/dist/chunk-HXIIEMGF.js +78 -0
  271. package/dist/chunk-I56TH7VM.js +46 -0
  272. package/dist/chunk-I6FN3R5D.js +352 -0
  273. package/dist/chunk-I7SCBHJN.js +655 -0
  274. package/dist/chunk-IJM4GKAT.js +529 -0
  275. package/dist/chunk-IMEYU36R.js +344 -0
  276. package/dist/chunk-INJ3SS6A.js +936 -0
  277. package/dist/chunk-IUKOPCCE.js +441 -0
  278. package/dist/chunk-IVEPZQJO.js +33 -0
  279. package/dist/chunk-IVZEONFC.js +43 -0
  280. package/dist/chunk-IWBHRSG7.js +936 -0
  281. package/dist/chunk-IYY3HQAD.js +484 -0
  282. package/dist/chunk-J2ICMYDA.js +48 -0
  283. package/dist/chunk-J2QCFLUN.js +505 -0
  284. package/dist/chunk-J5HM6V5P.js +1039 -0
  285. package/dist/chunk-J6NZX6QH.js +398 -0
  286. package/dist/chunk-JBBB2Y47.js +432 -0
  287. package/dist/chunk-JDCZQZU7.js +42 -0
  288. package/dist/chunk-JEDNXGSS.js +169 -0
  289. package/dist/chunk-JHP7OT6K.js +89 -0
  290. package/dist/chunk-JLS65NUQ.js +14 -0
  291. package/dist/chunk-JNMWYMC6.js +38 -0
  292. package/dist/chunk-JNSTWNNW.js +25 -0
  293. package/dist/chunk-JOSK6GEU.js +9564 -0
  294. package/dist/chunk-JQUMSIGC.js +100 -0
  295. package/dist/chunk-JVHGMURQ.js +1106 -0
  296. package/dist/chunk-JYXS47FQ.js +951 -0
  297. package/dist/chunk-K2ZMW2Z5.js +2147 -0
  298. package/dist/chunk-K7FAFORM.js +14 -0
  299. package/dist/chunk-KBJXX3ON.js +333 -0
  300. package/dist/chunk-KHFKVQWY.js +486 -0
  301. package/dist/chunk-KHMEI3DQ.js +173 -0
  302. package/dist/chunk-KHW3UD7B.js +69 -0
  303. package/dist/chunk-KKQKWAMF.js +365 -0
  304. package/dist/chunk-KOKXJV2U.js +455 -0
  305. package/dist/chunk-KQ4NGOJI.js +14 -0
  306. package/dist/chunk-KQYQOXMS.js +342 -0
  307. package/dist/chunk-KTMW65UX.js +14 -0
  308. package/dist/chunk-KUEWV2JH.js +593 -0
  309. package/dist/chunk-KXYDV3HP.js +1523 -0
  310. package/dist/chunk-KZ4JMGZ5.js +96 -0
  311. package/dist/chunk-KZWGBUIO.js +2659 -0
  312. package/dist/chunk-L2CBG5IX.js +1892 -0
  313. package/dist/chunk-L2S235CU.js +314 -0
  314. package/dist/chunk-L32WD57F.js +98 -0
  315. package/dist/chunk-LDJCKAJP.js +123 -0
  316. package/dist/chunk-LDWNBEN7.js +541 -0
  317. package/dist/chunk-LJVH57G2.js +241 -0
  318. package/dist/chunk-LPQ7NZEN.js +209 -0
  319. package/dist/chunk-LRGH3CCV.js +148 -0
  320. package/dist/chunk-LULOGMMM.js +1133 -0
  321. package/dist/chunk-LWGKN2GY.js +8284 -0
  322. package/dist/chunk-LX4F24ZH.js +157 -0
  323. package/dist/chunk-M4BUEXXF.js +839 -0
  324. package/dist/chunk-M6UHOC4I.js +553 -0
  325. package/dist/chunk-MCBNWZNO.js +657 -0
  326. package/dist/chunk-MEMSY6VY.js +223 -0
  327. package/dist/chunk-MHLEZQQI.js +145 -0
  328. package/dist/chunk-MJ6WNSIX.js +192 -0
  329. package/dist/chunk-MKASIKWZ.js +442 -0
  330. package/dist/chunk-MNOVBYFU.js +60 -0
  331. package/dist/chunk-MO2BYAAF.js +2896 -0
  332. package/dist/chunk-MP6P7Y2A.js +180 -0
  333. package/dist/chunk-MQ4TFJAG.js +3365 -0
  334. package/dist/chunk-MT2WAIR3.js +131 -0
  335. package/dist/chunk-MTU7VTNN.js +1122 -0
  336. package/dist/chunk-MULMXX4V.js +150 -0
  337. package/dist/chunk-MW2DWWVA.js +147 -0
  338. package/dist/chunk-MY3ZPUN4.js +151 -0
  339. package/dist/chunk-MYLH2S4G.js +64 -0
  340. package/dist/chunk-MZ5WYKNA.js +28 -0
  341. package/dist/chunk-N3Q2JNPV.js +249 -0
  342. package/dist/chunk-N5DX4JAK.js +12 -0
  343. package/dist/chunk-NAINGKHF.js +35 -0
  344. package/dist/chunk-NEQUQHOX.js +223 -0
  345. package/dist/chunk-NHNPEZS4.js +1408 -0
  346. package/dist/chunk-NHTIXJCR.js +17 -0
  347. package/dist/chunk-NKLPMBNV.js +1154 -0
  348. package/dist/chunk-NMVZ5YES.js +199 -0
  349. package/dist/chunk-NRFRY3GE.js +256 -0
  350. package/dist/chunk-NTD6CSI6.js +1266 -0
  351. package/dist/chunk-NUO7B3SH.js +318 -0
  352. package/dist/chunk-NVOHIJKG.js +1319 -0
  353. package/dist/chunk-NXH3RX7O.js +523 -0
  354. package/dist/chunk-NXZ3DURF.js +257 -0
  355. package/dist/chunk-O26L6F7F.js +209 -0
  356. package/dist/chunk-O5RRIUEP.js +124 -0
  357. package/dist/chunk-O5X6BKAO.js +10 -0
  358. package/dist/chunk-O6ZQUVTR.js +31 -0
  359. package/dist/chunk-O7FE75QZ.js +306 -0
  360. package/dist/chunk-OC7Z6AJQ.js +81 -0
  361. package/dist/chunk-OH7IEZ63.js +307 -0
  362. package/dist/chunk-OI734GRS.js +115 -0
  363. package/dist/chunk-OJBH62DK.js +684 -0
  364. package/dist/chunk-OKJLVSTJ.js +247 -0
  365. package/dist/chunk-OMX5VL43.js +79 -0
  366. package/dist/chunk-ONHAMBN6.js +12 -0
  367. package/dist/chunk-ONYPLIVE.js +753 -0
  368. package/dist/chunk-OSK7QWPD.js +637 -0
  369. package/dist/chunk-OTXLMJKP.js +438 -0
  370. package/dist/chunk-OV5PKQMA.js +213 -0
  371. package/dist/chunk-OXK5HA4B.js +31 -0
  372. package/dist/chunk-OYDWFQA4.js +272 -0
  373. package/dist/chunk-OZAUKWHB.js +22 -0
  374. package/dist/chunk-P5P2EKGH.js +94 -0
  375. package/dist/chunk-P6SSWAKY.js +29 -0
  376. package/dist/chunk-P7CQGPLS.js +30 -0
  377. package/dist/chunk-P7RVCHQV.js +197 -0
  378. package/dist/chunk-PEBWDYIW.js +726 -0
  379. package/dist/chunk-PFCXFO7A.js +9193 -0
  380. package/dist/chunk-PFLDWMX6.js +168 -0
  381. package/dist/chunk-PHZGLQSK.js +15883 -0
  382. package/dist/chunk-PNFTPNSR.js +20 -0
  383. package/dist/chunk-PPHXX4W7.js +175 -0
  384. package/dist/chunk-PPZESPJT.js +262 -0
  385. package/dist/chunk-PRDHI2L5.js +296 -0
  386. package/dist/chunk-PSTKWHHN.js +32 -0
  387. package/dist/chunk-PV53ODOT.js +555 -0
  388. package/dist/chunk-PVJBTI7P.js +24 -0
  389. package/dist/chunk-PXKERBKX.js +100 -0
  390. package/dist/chunk-PZ5AY32C.js +10 -0
  391. package/dist/chunk-Q3DHEZA5.js +85 -0
  392. package/dist/chunk-Q5RZDVQK.js +204 -0
  393. package/dist/chunk-Q64IR2Z2.js +4933 -0
  394. package/dist/chunk-Q6Z5UGPL.js +398 -0
  395. package/dist/chunk-QAMAV4DT.js +627 -0
  396. package/dist/chunk-QBWF4444.js +112 -0
  397. package/dist/chunk-QDKYT4CI.js +22805 -0
  398. package/dist/chunk-QFLBRWCJ.js +126 -0
  399. package/dist/chunk-QILAQACE.js +107 -0
  400. package/dist/chunk-QJ6OEH4K.js +3683 -0
  401. package/dist/chunk-QK3NLYTV.js +320 -0
  402. package/dist/chunk-QOFLUS24.js +535 -0
  403. package/dist/chunk-QOIASNEJ.js +98 -0
  404. package/dist/chunk-QP4UTSOV.js +3587 -0
  405. package/dist/chunk-QP5ST7RI.js +904 -0
  406. package/dist/chunk-QS5AGRZN.js +167 -0
  407. package/dist/chunk-QTAOU53N.js +107 -0
  408. package/dist/chunk-QTCLJHLZ.js +351 -0
  409. package/dist/chunk-QTOLTG4L.js +119 -0
  410. package/dist/chunk-QWDV4OSL.js +142 -0
  411. package/dist/chunk-QWMQ74KD.js +508 -0
  412. package/dist/chunk-QX6LOMMH.js +158 -0
  413. package/dist/chunk-QXBKIHY7.js +238 -0
  414. package/dist/chunk-QXBKTJT6.js +270 -0
  415. package/dist/chunk-QYQOVOLR.js +196 -0
  416. package/dist/chunk-R2CKS6WT.js +73 -0
  417. package/dist/chunk-R2TIYG7U.js +68 -0
  418. package/dist/chunk-R2W3LESH.js +465 -0
  419. package/dist/chunk-R5EXHMUN.js +100 -0
  420. package/dist/chunk-RBBTBCHX.js +289 -0
  421. package/dist/chunk-RBKLOUXA.js +121 -0
  422. package/dist/chunk-RCP2Y6DQ.js +86 -0
  423. package/dist/chunk-RCYEJSD5.js +260 -0
  424. package/dist/chunk-RFDVSI4N.js +134 -0
  425. package/dist/chunk-RGJU63FV.js +1717 -0
  426. package/dist/chunk-RI4EX2QE.js +18 -0
  427. package/dist/chunk-RIMARPCF.js +152 -0
  428. package/dist/chunk-RJ6RSNT6.js +42 -0
  429. package/dist/chunk-RNI2GUIF.js +131 -0
  430. package/dist/chunk-RPHUWJ3K.js +264 -0
  431. package/dist/chunk-RPIMAMV7.js +361 -0
  432. package/dist/chunk-RQFX6YRN.js +49 -0
  433. package/dist/chunk-RRC5BL7B.js +285 -0
  434. package/dist/chunk-RSYTSBOO.js +79 -0
  435. package/dist/chunk-RWQQIKIC.js +35 -0
  436. package/dist/chunk-RZUBOZH2.js +373 -0
  437. package/dist/chunk-S2E632FQ.js +380 -0
  438. package/dist/chunk-S2VQCZO4.js +22 -0
  439. package/dist/chunk-S2XIMQJQ.js +681 -0
  440. package/dist/chunk-S47ISY27.js +183 -0
  441. package/dist/chunk-S6I4KISU.js +142 -0
  442. package/dist/chunk-S6TAFQI5.js +2403 -0
  443. package/dist/chunk-SBBNT5ZJ.js +27 -0
  444. package/dist/chunk-SDJV2DTQ.js +491 -0
  445. package/dist/chunk-SDPIFNLD.js +33 -0
  446. package/dist/chunk-SF6YK3JI.js +835 -0
  447. package/dist/chunk-SK3ZFONO.js +976 -0
  448. package/dist/chunk-SKTFRFQ7.js +1775 -0
  449. package/dist/chunk-SNGM452K.js +2002 -0
  450. package/dist/chunk-STW7OFOA.js +581 -0
  451. package/dist/chunk-SU6UFUQY.js +1351 -0
  452. package/dist/chunk-SVJM3LJA.js +27 -0
  453. package/dist/chunk-SVUNZOPG.js +129 -0
  454. package/dist/chunk-T5XLUYV3.js +34 -0
  455. package/dist/chunk-T7E5JS6N.js +57 -0
  456. package/dist/chunk-TA3N5MMO.js +450 -0
  457. package/dist/chunk-TAJPCXSB.js +13 -0
  458. package/dist/chunk-TDEMDRN2.js +1639 -0
  459. package/dist/chunk-TDSEX5CF.js +24 -0
  460. package/dist/chunk-TGCVL74Y.js +28 -0
  461. package/dist/chunk-TGXXYDL4.js +1012 -0
  462. package/dist/chunk-TIKTYUJO.js +296 -0
  463. package/dist/chunk-TIZAJD4M.js +6029 -0
  464. package/dist/chunk-TLSEZZCG.js +5549 -0
  465. package/dist/chunk-TMBDRHAX.js +19 -0
  466. package/dist/chunk-TRURQUBP.js +1217 -0
  467. package/dist/chunk-TSQ256N5.js +152 -0
  468. package/dist/chunk-TUQMMFEQ.js +2244 -0
  469. package/dist/chunk-U424MJLC.js +81 -0
  470. package/dist/chunk-U4DRS6ZW.js +11 -0
  471. package/dist/chunk-U5KS22IN.js +204 -0
  472. package/dist/chunk-UAPHFJPN.js +673 -0
  473. package/dist/chunk-UB7LQITD.js +1040 -0
  474. package/dist/chunk-UBVRHGAZ.js +237 -0
  475. package/dist/chunk-UDNNAQN5.js +98 -0
  476. package/dist/chunk-UJP3XM54.js +342 -0
  477. package/dist/chunk-UJYDH2MW.js +305 -0
  478. package/dist/chunk-UKMPASIC.js +399 -0
  479. package/dist/chunk-UKUL3EHK.js +763 -0
  480. package/dist/chunk-UPHU64NB.js +1327 -0
  481. package/dist/chunk-URMSZXAD.js +43 -0
  482. package/dist/chunk-US3RT6CY.js +525 -0
  483. package/dist/chunk-UTDEOPKV.js +30 -0
  484. package/dist/chunk-UUUDKV7N.js +13 -0
  485. package/dist/chunk-UVKWU3SM.js +39 -0
  486. package/dist/chunk-V2TVPO3X.js +521 -0
  487. package/dist/chunk-V3KLVK7B.js +398 -0
  488. package/dist/chunk-V3YFFHDR.js +17 -0
  489. package/dist/chunk-VAG6GUBR.js +1162 -0
  490. package/dist/chunk-VBENAHDA.js +1814 -0
  491. package/dist/chunk-VBNCKCCI.js +16 -0
  492. package/dist/chunk-VCGSWN5M.js +1300 -0
  493. package/dist/chunk-VE2O2I7M.js +115 -0
  494. package/dist/chunk-VIFHYTI5.js +31 -0
  495. package/dist/chunk-VJER3FUS.js +5080 -0
  496. package/dist/chunk-VLMDM56Q.js +268 -0
  497. package/dist/chunk-VMFZEVVX.js +99 -0
  498. package/dist/chunk-VNDPQVUZ.js +1853 -0
  499. package/dist/chunk-VSPJRLGA.js +4783 -0
  500. package/dist/chunk-VSWC5ZXI.js +103 -0
  501. package/dist/chunk-VYI4DSZP.js +2017 -0
  502. package/dist/chunk-W4BAIQ6L.js +1212 -0
  503. package/dist/chunk-W7VQAL2K.js +2203 -0
  504. package/dist/chunk-WEI3ZDZH.js +33 -0
  505. package/dist/chunk-WEIUS5NT.js +26 -0
  506. package/dist/chunk-WEW7UFWE.js +546 -0
  507. package/dist/chunk-WGQAXLNA.js +384 -0
  508. package/dist/chunk-WJAL4JL3.js +206 -0
  509. package/dist/chunk-WKFOJ5ZG.js +141 -0
  510. package/dist/chunk-WMWQEFLN.js +2177 -0
  511. package/dist/chunk-WNECKKO2.js +154 -0
  512. package/dist/chunk-WPKLYOAM.js +195 -0
  513. package/dist/chunk-WSH37YQN.js +243 -0
  514. package/dist/chunk-WV3KQDPE.js +84 -0
  515. package/dist/chunk-WZFC4V4U.js +389 -0
  516. package/dist/chunk-XCOIBNET.js +13 -0
  517. package/dist/chunk-XDM65LBX.js +53 -0
  518. package/dist/chunk-XGU6PBO5.js +645 -0
  519. package/dist/chunk-XHOI4V62.js +43 -0
  520. package/dist/chunk-XIBVFMLQ.js +6858 -0
  521. package/dist/chunk-XJ2E7YEJ.js +117 -0
  522. package/dist/chunk-XON4ZCYX.js +69 -0
  523. package/dist/chunk-XQPEWJPI.js +127 -0
  524. package/dist/chunk-XSJTIFUY.js +31 -0
  525. package/dist/chunk-XT7OVWM3.js +64 -0
  526. package/dist/chunk-XTXYIISX.js +1104 -0
  527. package/dist/chunk-XV7NZL4B.js +57 -0
  528. package/dist/chunk-XWIZ6B5S.js +109 -0
  529. package/dist/chunk-XWLIKOBX.js +240 -0
  530. package/dist/chunk-XZOXEIN4.js +156 -0
  531. package/dist/chunk-XZRS7I7W.js +3673 -0
  532. package/dist/chunk-Y4ZDDHB6.js +44 -0
  533. package/dist/chunk-Y733RB7T.js +194 -0
  534. package/dist/chunk-YBHUB4XR.js +14931 -0
  535. package/dist/chunk-YKC75XK4.js +147 -0
  536. package/dist/chunk-YKMXFVK7.js +27 -0
  537. package/dist/chunk-YO5BAJ55.js +225 -0
  538. package/dist/chunk-YPDCLXNZ.js +568 -0
  539. package/dist/chunk-YSQPGVFK.js +116 -0
  540. package/dist/chunk-YTVVTIWJ.js +716 -0
  541. package/dist/chunk-YVCMDVBB.js +698 -0
  542. package/dist/chunk-YYTOA6DP.js +114 -0
  543. package/dist/chunk-Z5WGNULV.js +88 -0
  544. package/dist/chunk-Z6NGVVXG.js +66 -0
  545. package/dist/chunk-Z7CDQNH3.js +20 -0
  546. package/dist/chunk-ZH4G3FU5.js +187 -0
  547. package/dist/chunk-ZJB6SQPA.js +257 -0
  548. package/dist/chunk-ZL6E4HMY.js +42 -0
  549. package/dist/chunk-ZMLOC3DW.js +62 -0
  550. package/dist/chunk-ZORW64QH.js +101 -0
  551. package/dist/chunk-ZVVD2XGV.js +1369 -0
  552. package/dist/cli-utils-ER33ODC5.js +31 -0
  553. package/dist/cli-validation-6CHPTANV.js +146 -0
  554. package/dist/commit-utils-3STAY7C7.js +49 -0
  555. package/dist/compatibility-notice-IHNXR2JR.js +21 -0
  556. package/dist/compete-config-resolver-V3GDNJMM.js +125 -0
  557. package/dist/compete-results-XUM3PJHS.js +318 -0
  558. package/dist/competition-outcome-tracker-NWSMVUPG.js +62 -0
  559. package/dist/config-4HHE4OIK.js +238 -0
  560. package/dist/config-D6YAZASH.js +10 -0
  561. package/dist/config-MIPRDYYV.js +46 -0
  562. package/dist/config-audit-GA5DCUAI.js +371 -0
  563. package/dist/config-explain-4LMO556H.js +71 -0
  564. package/dist/config-loader-RGP634PC.js +51 -0
  565. package/dist/config-manager-J2UTO635.js +114 -0
  566. package/dist/config-merger-TVUJBZTS.js +14 -0
  567. package/dist/config-validator-H4ZVIE56.js +122 -0
  568. package/dist/cost-HSIV5U2Y.js +85 -0
  569. package/dist/data-migration-state-OAUL2WPQ.js +35 -0
  570. package/dist/db-migrator-NUOW5NKR.js +34 -0
  571. package/dist/default-paths-UILB62BN.js +49 -0
  572. package/dist/discovery-V6GYUJUC.js +53 -0
  573. package/dist/doctor-BBSMCDWE.js +271 -0
  574. package/dist/doctor-context-blocks-LPY75VZA.js +231 -0
  575. package/dist/doctor-instructions-import-JXHDDOE5.js +70 -0
  576. package/dist/doctor-purpose-6YJOXPBE.js +30 -0
  577. package/dist/domain-analyzer-S35ABUNA.js +48 -0
  578. package/dist/ensure-initialized-Q6PEU55O.js +78 -0
  579. package/dist/entry.js +922 -0
  580. package/dist/error-parser-core-MZFMFANN.js +70 -0
  581. package/dist/evaluation-context-GQBYDAEV.js +63 -0
  582. package/dist/evidence-plan-resolver-5FUAP3SA.js +111 -0
  583. package/dist/execution-data-writer-YCG5UH37.js +72 -0
  584. package/dist/execution-policy-applier-PWZM5LNA.js +63 -0
  585. package/dist/execution-preflight-DASJWWQF.js +223 -0
  586. package/dist/execution-roles-KNSNNB2D.js +112 -0
  587. package/dist/exit-code-error-QIY5DOKF.js +18 -0
  588. package/dist/external-temp-cleanup-CAW7LQ6R.js +360 -0
  589. package/dist/factory-YCYCB7AE.js +209 -0
  590. package/dist/file-utils-ZQYNBQBW.js +45 -0
  591. package/dist/flywheel-allowlist-revert-H22HA6JE.js +21 -0
  592. package/dist/flywheel-autoloop-executor-PDOASJEZ.js +316 -0
  593. package/dist/flywheel-autoloop-unverified-TOKYFCDC.js +36 -0
  594. package/dist/flywheel-competition-executor-YJUMMEJO.js +320 -0
  595. package/dist/flywheel-executor-JWU43KAY.js +437 -0
  596. package/dist/flywheel-git-isolation-FQ2TRWMB.js +56 -0
  597. package/dist/flywheel-manifest-HDPNMWWF.js +114 -0
  598. package/dist/flywheel-model-defaults-UHAKTZT3.js +110 -0
  599. package/dist/flywheel-preflight-III2C7TH.js +163 -0
  600. package/dist/flywheel-resume-2O45MS7Y.js +31 -0
  601. package/dist/flywheel-resume-execution-lease-P2BK257J.js +59 -0
  602. package/dist/flywheel-safety-AVAVFXIJ.js +19 -0
  603. package/dist/flywheel-scope-decision-ALJUUNGG.js +14 -0
  604. package/dist/get-telemetry-logger-MPDVO2JA.js +155 -0
  605. package/dist/git-message-style-KCXGMTDT.js +104 -0
  606. package/dist/guidance-profile-config-G3K5YQOO.js +113 -0
  607. package/dist/guidance-profile-renderer-TX4TNDFL.js +23 -0
  608. package/dist/identity-XLQJ4YJF.js +25 -0
  609. package/dist/index-query-6NUY4FKX.js +37 -0
  610. package/dist/index.js +85588 -0
  611. package/dist/indexer-DL54CM3K.js +44 -0
  612. package/dist/init-OUZ72344.js +245 -0
  613. package/dist/instructions-import-offer-NSYXSITC.js +363 -0
  614. package/dist/instructions-run-NBII7W36.js +114 -0
  615. package/dist/interrupted-work-E4TLKJLE.js +43 -0
  616. package/dist/invoke-provider-auth-NEWEIHCI.js +38 -0
  617. package/dist/judge-scoring.json +64 -0
  618. package/dist/lab-mode-YXQ2Y3NG.js +44 -0
  619. package/dist/lab-utils-5QAMDJR5.js +29 -0
  620. package/dist/linux-host-class-YDWQX65O.js +31 -0
  621. package/dist/llm-judge-executor-OJSNCTFJ.js +179 -0
  622. package/dist/local-ci-config-VZ4WWDT5.js +48 -0
  623. package/dist/local-executor-DCMDDRX2.js +280 -0
  624. package/dist/logger-5KNKS3O4.js +154 -0
  625. package/dist/matrix-prompt-builder-4ZBOGZSB.js +527 -0
  626. package/dist/matrix-result-parser-EZJM4YXP.js +14 -0
  627. package/dist/merge-batch-RTEEMVDB.js +313 -0
  628. package/dist/merge-batch-members-VIWGVRHP.js +24 -0
  629. package/dist/merge-queue-TIIUSOY6.js +126 -0
  630. package/dist/merge-queue-trust-DUNZ4J65.js +21 -0
  631. package/dist/metadata-UKSMWM6J.js +29 -0
  632. package/dist/model-catalog-readiness-R5KJBP5M.js +202 -0
  633. package/dist/model-invocations-db-XTUPPQ34.js +70 -0
  634. package/dist/model-resolver-JFZ2MHOJ.js +39 -0
  635. package/dist/model-resolver-SCQ57KAQ.js +217 -0
  636. package/dist/model-roles-D3OR4NAH.js +110 -0
  637. package/dist/monitor-F4SIU5G2.js +96 -0
  638. package/dist/nested-worktrees-2WUWQ75N.js +23 -0
  639. package/dist/next-S3IRLVER.js +96 -0
  640. package/dist/next-UKPFRXOO.js +148 -0
  641. package/dist/opportunistic-TL4S26VX.js +86 -0
  642. package/dist/optimization-config-resolver-NAEIYU6A.js +148 -0
  643. package/dist/package-HJR4QJT4.js +10 -0
  644. package/dist/parse-git-status-7PIYFPS2.js +21 -0
  645. package/dist/path-security-5WJSY56G.js +41 -0
  646. package/dist/paths-JUI7C4KU.js +45 -0
  647. package/dist/plan-backlog-list-fast-SSTQL5XP.js +89 -0
  648. package/dist/plan-backlog-show-fast-PFRAQ3JB.js +114 -0
  649. package/dist/plan-sprint-list-fast-HD2KBZSY.js +110 -0
  650. package/dist/plan-sprint-status-fast-YFYH7WQF.js +116 -0
  651. package/dist/plan-task-status-fast-JU5PNLUU.js +114 -0
  652. package/dist/plan-to-flywheel-PY5MSY2H.js +529 -0
  653. package/dist/preflight-PJHGTJNZ.js +12 -0
  654. package/dist/process-registry-B4ZUCN7T.js +28 -0
  655. package/dist/process-scanner-TU3QHWVB.js +23 -0
  656. package/dist/processes-6FHVGT72.js +28 -0
  657. package/dist/processes-json-fast-YWTMUWXB.js +72 -0
  658. package/dist/profile-HWTC56SG.js +209 -0
  659. package/dist/project-runtime-paths-2UQNG5Y4.js +41 -0
  660. package/dist/protected-branches-N36LDBFY.js +71 -0
  661. package/dist/provider-aware-resource-manager-YTFAHNGJ.js +40 -0
  662. package/dist/provider-matrix-2KO2V5OM.js +214 -0
  663. package/dist/provider-matrix-renderer-MEC3PER7.js +139 -0
  664. package/dist/provider-output-forwarding-2AHL7YMA.js +26 -0
  665. package/dist/provider-registry-WCZ65QHC.js +136 -0
  666. package/dist/provider-temp-cleanup-IUNPJCZF.js +14 -0
  667. package/dist/prune-engine-EOQVWEP6.js +448 -0
  668. package/dist/publication-turn-S42RZTQF.js +44 -0
  669. package/dist/quality-gate-JQMVCKOO.js +72 -0
  670. package/dist/quickstart-3O6FRCFB.js +105 -0
  671. package/dist/readiness-GW6ABRHB.js +139 -0
  672. package/dist/readiness-KFZCXDTT.js +215 -0
  673. package/dist/registry-7XG376SY.js +217 -0
  674. package/dist/repair-helpers-TTV5FEF4.js +117 -0
  675. package/dist/repo-root-YG6MQZDW.js +28 -0
  676. package/dist/resolution-engine-FFEK7HQ2.js +187 -0
  677. package/dist/resolve-provider-cli-ZEXVZKET.js +44 -0
  678. package/dist/restore-telemetry-db-E7BR5PO7.js +459 -0
  679. package/dist/routing-events-AW6SRZ6G.js +13 -0
  680. package/dist/routing-history-store-FMDDQL6W.js +39 -0
  681. package/dist/routing-planner-C6OHO3EY.js +221 -0
  682. package/dist/runner-KHDNQ5KU.js +1194 -0
  683. package/dist/runner-PIS2BW7Y.js +1801 -0
  684. package/dist/safety-E3JJVSFL.js +67 -0
  685. package/dist/safety-stanza-HE6GXP4G.js +49 -0
  686. package/dist/sandbox-7LBZC5PE.js +72 -0
  687. package/dist/sandbox-ASWCDYZL.js +80 -0
  688. package/dist/schema-extensions.sql +234 -0
  689. package/dist/security-JI22TBEB.js +17 -0
  690. package/dist/setup-bb-plugin-FQXLA76Y.js +531 -0
  691. package/dist/setup-claude-code-NF4ZSHVE.js +197 -0
  692. package/dist/setup-temp-cleanup-2APZ4HMA.js +29 -0
  693. package/dist/shared-utils-34HJZ6JX.js +40 -0
  694. package/dist/simple-artifact-goal-MQLDDMMX.js +29 -0
  695. package/dist/sprint-N7JFTEGL.js +403 -0
  696. package/dist/sprint-bridge-KJXIBNRJ.js +117 -0
  697. package/dist/sprint-completion-dependents-34SR7JVL.js +43 -0
  698. package/dist/sprint-execution-service-A6JPUBWY.js +376 -0
  699. package/dist/sprint-manager-MU2ZUWN2.js +140 -0
  700. package/dist/sqlite-timeout-config-U2CT4LKU.js +13 -0
  701. package/dist/sqlite-wrapper-FSGJ2QEW.js +19 -0
  702. package/dist/stale-cleanup-orchestrator-4X6324VF.js +71 -0
  703. package/dist/storage-access-I3V5LER7.js +31 -0
  704. package/dist/store-XVG64ZR2.js +25 -0
  705. package/dist/task-classifier-MN2DYE5R.js +558 -0
  706. package/dist/task-list-fast-7AT6LTTA.js +112 -0
  707. package/dist/task-manager-LHPBBRRE.js +136 -0
  708. package/dist/task-report-OLPAWBTK.js +64 -0
  709. package/dist/task-type-detector-6RG3YNZF.js +27 -0
  710. package/dist/task-type-resolver-EQHOUIHT.js +64 -0
  711. package/dist/telemetry-5VYSK772.js +212 -0
  712. package/dist/telemetry-health-tracker-4GFW2EMP.js +12 -0
  713. package/dist/telemetry-path-resolver-H3NFHHQY.js +34 -0
  714. package/dist/telemetry-reliability-URJDTNPZ.js +76 -0
  715. package/dist/transports-NREZQTJK.js +106 -0
  716. package/dist/unified-cost-tracker-5MTBJ2CL.js +59 -0
  717. package/dist/unified-state-cleanup-GGAXLHXF.js +292 -0
  718. package/dist/universal-cost-calculator-JTFEJVWK.js +70 -0
  719. package/dist/user-agents-QLIGPLP2.js +30 -0
  720. package/dist/variant-execution-I4ZZUAWY.js +319 -0
  721. package/dist/variant-opt-parser-JHCXKY2K.js +251 -0
  722. package/dist/variant-request-input-PL37N3AN.js +11 -0
  723. package/dist/variant-state-cleanup-KHMXRBZN.js +287 -0
  724. package/dist/variant-worker-COB5YTJX.js +4517 -0
  725. package/dist/variant-worker.js +26 -0
  726. package/dist/variants-XGDSXYG3.js +267 -0
  727. package/dist/verification-command-YSPU4VBH.js +66 -0
  728. package/dist/verify-command-timeout-DQUYH33Z.js +11 -0
  729. package/dist/verify-commands-LOHMOFKC.js +65 -0
  730. package/dist/warning-JSKSFKBT.js +13 -0
  731. package/dist/work-edge-K65NHVWY.js +50 -0
  732. package/dist/work-item-writer-KY5ZWZWW.js +30 -0
  733. package/dist/worker-JNXXEIT6.js +1504 -0
  734. package/dist/worker.js +21 -0
  735. package/dist/workspace-tree-identity-JO5PSKTW.js +52 -0
  736. package/dist/worktree-environment-WTVABAQW.js +64 -0
  737. package/dist/worktree-metrics-VZRQI26T.js +66 -0
  738. package/dist/writeback-TQFQBJNU.js +50 -0
  739. package/docs/CLI_REFERENCE.md +8287 -0
  740. package/docs/PROVIDER_SETUP.md +1737 -0
  741. package/docs/README.md +96 -0
  742. package/docs/TROUBLESHOOTING.md +2209 -0
  743. package/docs/getting-started/QUICK_START.md +260 -0
  744. package/docs/getting-started/README.md +198 -0
  745. package/docs/getting-started/SETUP.md +25 -0
  746. package/docs/reference/AGENT_CONTEXT.md +84 -0
  747. package/docs/reference/DELIVERY_ONBOARDING.md +198 -0
  748. package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
  749. package/docs/reference/SECURITY.md +291 -0
  750. package/docs/reference/TELEMETRY_PRIVACY.md +259 -0
  751. package/integrations/bb-plugin-build/README.md +391 -0
  752. package/integrations/bb-plugin-build/app.css +431 -0
  753. package/integrations/bb-plugin-build/app.tsx +6210 -0
  754. package/integrations/bb-plugin-build/package.json +45 -0
  755. package/integrations/bb-plugin-build/server.ts +488 -0
  756. package/integrations/bb-plugin-build/src/adapter.ts +3672 -0
  757. package/integrations/bb-plugin-build/src/backlog-authoring-model.ts +150 -0
  758. package/integrations/bb-plugin-build/src/backlog-authoring-schema.ts +458 -0
  759. package/integrations/bb-plugin-build/src/backlog-authoring-service.ts +467 -0
  760. package/integrations/bb-plugin-build/src/backlog-authoring-view.ts +1025 -0
  761. package/integrations/bb-plugin-build/src/command-evidence-schema.ts +13 -0
  762. package/integrations/bb-plugin-build/src/competition-defaults-schema.ts +122 -0
  763. package/integrations/bb-plugin-build/src/competition-defaults-service.ts +105 -0
  764. package/integrations/bb-plugin-build/src/competition-defaults-view.ts +138 -0
  765. package/integrations/bb-plugin-build/src/contract.ts +718 -0
  766. package/integrations/bb-plugin-build/src/execution-activity-view.ts +98 -0
  767. package/integrations/bb-plugin-build/src/finalize-model.ts +205 -0
  768. package/integrations/bb-plugin-build/src/finalize-schema.ts +150 -0
  769. package/integrations/bb-plugin-build/src/finalize-service.ts +330 -0
  770. package/integrations/bb-plugin-build/src/finalize-view.ts +159 -0
  771. package/integrations/bb-plugin-build/src/judge-operations-readback.ts +303 -0
  772. package/integrations/bb-plugin-build/src/judge-operations-schema.ts +33 -0
  773. package/integrations/bb-plugin-build/src/judge-operations-view.ts +459 -0
  774. package/integrations/bb-plugin-build/src/model.ts +1318 -0
  775. package/integrations/bb-plugin-build/src/monitor-service.ts +233 -0
  776. package/integrations/bb-plugin-build/src/panel-read-ux.ts +97 -0
  777. package/integrations/bb-plugin-build/src/patch-preview-schema.ts +166 -0
  778. package/integrations/bb-plugin-build/src/patch-preview-service.ts +480 -0
  779. package/integrations/bb-plugin-build/src/patch-preview-view.ts +109 -0
  780. package/integrations/bb-plugin-build/src/planning-readback.ts +228 -0
  781. package/integrations/bb-plugin-build/src/planning-service.ts +647 -0
  782. package/integrations/bb-plugin-build/src/planning-sync-evidence.ts +37 -0
  783. package/integrations/bb-plugin-build/src/planning-workspace-readback.ts +33 -0
  784. package/integrations/bb-plugin-build/src/planning-workspace-schema.ts +131 -0
  785. package/integrations/bb-plugin-build/src/planning-workspace.ts +333 -0
  786. package/integrations/bb-plugin-build/src/poll-handoff.ts +136 -0
  787. package/integrations/bb-plugin-build/src/project-target-server.ts +21 -0
  788. package/integrations/bb-plugin-build/src/project-target.ts +45 -0
  789. package/integrations/bb-plugin-build/src/reference-index.ts +218 -0
  790. package/integrations/bb-plugin-build/src/repository-identity.ts +17 -0
  791. package/integrations/bb-plugin-build/src/repository-schema.ts +30 -0
  792. package/integrations/bb-plugin-build/src/result-explorer-view.ts +597 -0
  793. package/integrations/bb-plugin-build/src/result-readback-model.ts +163 -0
  794. package/integrations/bb-plugin-build/src/result-readback-schema.ts +319 -0
  795. package/integrations/bb-plugin-build/src/result-readback-service.ts +333 -0
  796. package/integrations/bb-plugin-build/src/run-page-view.ts +332 -0
  797. package/integrations/bb-plugin-build/src/setup-config-schema.ts +293 -0
  798. package/integrations/bb-plugin-build/src/setup-config-service.ts +620 -0
  799. package/integrations/bb-plugin-build/src/setup-config-view.ts +388 -0
  800. package/integrations/bb-plugin-build/src/sprint-close-model.ts +150 -0
  801. package/integrations/bb-plugin-build/src/sprint-close-schema.ts +128 -0
  802. package/integrations/bb-plugin-build/src/sprint-close-service.ts +293 -0
  803. package/integrations/bb-plugin-build/src/sprint-close-view.ts +116 -0
  804. package/integrations/bb-plugin-build/src/sprint-composition-model.ts +709 -0
  805. package/integrations/bb-plugin-build/src/sprint-composition-readback.ts +231 -0
  806. package/integrations/bb-plugin-build/src/sprint-composition-schema.ts +597 -0
  807. package/integrations/bb-plugin-build/src/sprint-composition-service.ts +773 -0
  808. package/integrations/bb-plugin-build/src/sprint-composition-view.ts +1221 -0
  809. package/integrations/bb-plugin-build/src/sprint-execution-schema.ts +188 -0
  810. package/integrations/bb-plugin-build/src/sprint-execution-service.ts +289 -0
  811. package/integrations/bb-plugin-build/src/sprint-execution-view.ts +54 -0
  812. package/integrations/bb-plugin-build/src/task-authoring-model.ts +563 -0
  813. package/integrations/bb-plugin-build/src/task-authoring-schema.ts +629 -0
  814. package/integrations/bb-plugin-build/src/task-authoring-service.ts +842 -0
  815. package/integrations/bb-plugin-build/src/task-authoring-view.ts +1227 -0
  816. package/integrations/bb-plugin-build/src/task-catalog-schema.ts +46 -0
  817. package/integrations/bb-plugin-build/src/task-catalog-service.ts +44 -0
  818. package/integrations/bb-plugin-build/src/task-detail-readback.ts +56 -0
  819. package/integrations/bb-plugin-build/src/task-detail-schema.ts +171 -0
  820. package/integrations/bb-plugin-build/src/task-navigation.ts +446 -0
  821. package/integrations/bb-plugin-build/src/workbench-route.ts +74 -0
  822. package/package.json +306 -4
  823. package/schemas/README.md +80 -0
  824. package/schemas/build.config.schema.json +2110 -0
  825. package/schemas/config-v1.schema.json +136 -0
  826. package/schemas/execution-config.schema.json +47 -0
  827. package/schemas/judge-scoring.schema.json +257 -0
  828. package/schemas/provider-config.schema.json +179 -0
  829. package/schemas/telemetry-config.schema.json +79 -0
  830. package/schemas/user-preferences.schema.json +141 -0
  831. package/scripts/assert-node-runtime.mjs +146 -0
  832. package/scripts/preflight-native.mjs +49 -0
  833. package/scripts/setup-git-hooks.mjs +39 -0
  834. package/scripts/sync.sh +2871 -0
  835. package/scripts/write-node-launcher.sh +138 -0
  836. package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
  837. package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
  838. package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
  839. package/templates/.build-project/README.md +41 -0
  840. package/templates/.build-project/agents/README.md +50 -0
  841. package/templates/.build-project/agents/architect.md +10 -0
  842. package/templates/.build-project/agents/code-reviewer.md +10 -0
  843. package/templates/.build-project/agents/debugger.md +10 -0
  844. package/templates/.build-project/agents/documenter.md +10 -0
  845. package/templates/.build-project/agents/test-automator.md +10 -0
  846. package/templates/.build-project/config/build.config.jsonc +64 -0
  847. package/templates/.build-project/config/project-context.template.json +6 -0
  848. package/templates/.build-project/config/task-type-aliases.presets/kanban.yaml +14 -0
  849. package/templates/.build-project/config/task-type-aliases.presets/scrum.yaml +17 -0
  850. package/templates/.build-project/config/task-type-aliases.presets/xp.yaml +12 -0
  851. package/templates/.build-project/config/task-type-aliases.yaml +29 -0
  852. package/templates/.build-project/gitignore.template +70 -0
  853. package/templates/.build-project/task-types/analysis.yaml +38 -0
  854. package/templates/.build-project/task-types/architecture.yaml +35 -0
  855. package/templates/.build-project/task-types/doc.yaml +34 -0
  856. package/templates/.build-project/task-types/feature.yaml +22 -0
  857. package/templates/.build-project/task-types/general.yaml +4 -0
  858. package/templates/.build-project/task-types/security.yaml +38 -0
  859. package/templates/AGENTS.template.md +85 -0
  860. package/templates/CLAUDE.template.md +1 -0
  861. package/templates/GEMINI.template.md +1 -0
  862. package/templates/builtin-workflows/code-review.yaml +73 -0
  863. package/templates/builtin-workflows/skills/code-review/SKILL.md +61 -0
  864. package/templates/builtin-workflows/skills/execution-contract-analysis/SKILL.md +24 -0
  865. package/templates/builtin-workflows/skills/execution-contract-code/SKILL.md +19 -0
  866. package/templates/builtin-workflows/skills/execution-contract-structured/SKILL.md +17 -0
  867. package/templates/ci/incident-intake.mjs +787 -0
  868. package/templates/ci/incidents.yml.template +103 -0
  869. package/templates/ci/node.yml.template +17 -0
  870. package/templates/ci/python.yml.template +17 -0
  871. package/templates/guard-kit/GUARD_SETUP.md.template +258 -0
  872. package/templates/guard-kit/build-guard.yml.template +189 -0
  873. package/templates/guard-kit/check.mjs.template +932 -0
  874. package/templates/guard-kit/config.json.template +7 -0
  875. package/templates/guard-kit/policy.json.template +1 -0
  876. package/templates/profiles/README.md +57 -0
  877. package/templates/profiles/frontier-claude.json +23 -0
  878. package/templates/profiles/frontier-codex.json +23 -0
@@ -0,0 +1,1133 @@
1
+ import {
2
+ PROVIDER_CONCURRENCY,
3
+ applyProviderConcurrencyPenalty,
4
+ getProviderConcurrencyBaseline,
5
+ getProviderConcurrencyLimit
6
+ } from "./chunk-QILAQACE.js";
7
+ import {
8
+ getAvailableMemoryGB,
9
+ getMemoryPressureLevel
10
+ } from "./chunk-WPKLYOAM.js";
11
+ import {
12
+ globalProcessLimiter
13
+ } from "./chunk-SF6YK3JI.js";
14
+ import {
15
+ RESOURCE_ACQUISITION_TIMEOUT_MS
16
+ } from "./chunk-I56TH7VM.js";
17
+
18
+ // src/orchestrator/provider-aware-resource-manager.ts
19
+ import { totalmem } from "os";
20
+
21
+ // src/orchestrator/process-capacity-admission.ts
22
+ var PROCESS_CAPACITY_RECHECK_MS = 100;
23
+ var TIER_LIMITS = {
24
+ minimal: 8,
25
+ standard: 15,
26
+ performance: 25,
27
+ power: 40,
28
+ ultra: 50
29
+ };
30
+ function resolveMemoryTierConcurrency(totalMemoryGB, envTier) {
31
+ let tier;
32
+ if (envTier && envTier in TIER_LIMITS) {
33
+ tier = envTier;
34
+ } else if (totalMemoryGB < 8) {
35
+ tier = "minimal";
36
+ } else if (totalMemoryGB < 16) {
37
+ tier = "standard";
38
+ } else if (totalMemoryGB < 32) {
39
+ tier = "performance";
40
+ } else if (totalMemoryGB < 64) {
41
+ tier = "power";
42
+ } else {
43
+ tier = "ultra";
44
+ }
45
+ return TIER_LIMITS[tier];
46
+ }
47
+ function clampToLiveProcessCapacity(configured) {
48
+ const processCap = globalProcessLimiter.getMaxProcesses();
49
+ return Math.max(1, Math.min(configured, processCap));
50
+ }
51
+ function canAdmitProcessSlot() {
52
+ return typeof globalProcessLimiter.canSpawn === "function" ? globalProcessLimiter.canSpawn() : true;
53
+ }
54
+ var ProcessCapacityQueueRecheck = class {
55
+ constructor(drain, hasWaiters, canAdmit = canAdmitProcessSlot) {
56
+ this.drain = drain;
57
+ this.hasWaiters = hasWaiters;
58
+ this.canAdmit = canAdmit;
59
+ }
60
+ drain;
61
+ hasWaiters;
62
+ canAdmit;
63
+ timer;
64
+ ensure() {
65
+ if (this.timer !== void 0 || !this.hasWaiters()) {
66
+ return;
67
+ }
68
+ this.timer = setInterval(() => {
69
+ if (!this.hasWaiters()) {
70
+ this.stop();
71
+ return;
72
+ }
73
+ if (!this.canAdmit()) {
74
+ return;
75
+ }
76
+ this.drain();
77
+ if (!this.hasWaiters()) {
78
+ this.stop();
79
+ }
80
+ }, PROCESS_CAPACITY_RECHECK_MS);
81
+ this.timer.unref?.();
82
+ }
83
+ stop() {
84
+ if (this.timer === void 0) {
85
+ return;
86
+ }
87
+ clearInterval(this.timer);
88
+ this.timer = void 0;
89
+ }
90
+ };
91
+
92
+ // src/orchestrator/resource-manager-types.ts
93
+ import * as os from "os";
94
+ function clampInteger(value, min, max) {
95
+ if (!Number.isFinite(value)) return min;
96
+ return Math.max(min, Math.min(max, Math.round(value)));
97
+ }
98
+ function captureConcurrencyBackpressureSnapshot(queueDepth, activeConcurrency, currentGlobalConcurrency, configuredGlobalConcurrency, minGlobalConcurrency = 1) {
99
+ const cpuCount = Math.max(1, os.cpus().length);
100
+ const load1 = os.loadavg?.()[0] ?? 0;
101
+ const cpuPercent = Math.max(0, load1 / cpuCount * 100);
102
+ const availableMemoryGB = getAvailableMemoryGB();
103
+ const memoryPressure = getMemoryPressureLevel();
104
+ return {
105
+ cpuPercent,
106
+ availableMemoryGB,
107
+ memoryPressure,
108
+ queueDepth,
109
+ activeConcurrency,
110
+ currentGlobalConcurrency,
111
+ configuredGlobalConcurrency,
112
+ minGlobalConcurrency
113
+ };
114
+ }
115
+ function recommendGlobalConcurrency(snapshot) {
116
+ const configured = Math.max(1, Math.floor(snapshot.configuredGlobalConcurrency));
117
+ const minGlobalConcurrency = clampInteger(snapshot.minGlobalConcurrency ?? 1, 1, configured);
118
+ const current = clampInteger(snapshot.currentGlobalConcurrency, minGlobalConcurrency, configured);
119
+ const queueDepth = Math.max(0, Math.floor(snapshot.queueDepth));
120
+ const activeConcurrency = Math.max(0, Math.floor(snapshot.activeConcurrency));
121
+ const cpuPercent = Math.max(0, snapshot.cpuPercent);
122
+ const availableMemoryGB = Math.max(0, snapshot.availableMemoryGB);
123
+ const kernelPressure = snapshot.memoryPressure ?? "unknown";
124
+ const memLabel = `availMem=${availableMemoryGB.toFixed(1)}GB` + (kernelPressure === "warn" || kernelPressure === "critical" ? ` kernel=${kernelPressure}` : "");
125
+ let recommended = current;
126
+ let pressureLevel = "healthy";
127
+ let reason = "steady concurrency";
128
+ let backpressureActive = false;
129
+ const criticalPressure = kernelPressure === "critical" || cpuPercent >= 92 || availableMemoryGB < 1;
130
+ const elevatedPressure = kernelPressure === "warn" || cpuPercent >= 80 || availableMemoryGB < 2;
131
+ const moderatePressure = cpuPercent >= 70 || availableMemoryGB < 4;
132
+ const healthySystem = cpuPercent <= 45 && availableMemoryGB >= 6;
133
+ if (criticalPressure) {
134
+ pressureLevel = "critical";
135
+ backpressureActive = true;
136
+ recommended = Math.max(minGlobalConcurrency, Math.floor(current / 2));
137
+ reason = `critical pressure cpu=${cpuPercent.toFixed(1)}% ${memLabel}`;
138
+ } else if (elevatedPressure) {
139
+ pressureLevel = "backpressure";
140
+ backpressureActive = true;
141
+ const shed = Math.max(2, Math.ceil(current * 0.25));
142
+ recommended = Math.max(minGlobalConcurrency, current - shed);
143
+ reason = `high pressure cpu=${cpuPercent.toFixed(1)}% ${memLabel}`;
144
+ } else if (moderatePressure) {
145
+ pressureLevel = "watch";
146
+ backpressureActive = true;
147
+ recommended = Math.max(minGlobalConcurrency, current - 1);
148
+ reason = `moderate pressure cpu=${cpuPercent.toFixed(1)}% ${memLabel}`;
149
+ } else if (healthySystem && queueDepth > 0 && current < configured) {
150
+ const queueDemand = queueDepth >= Math.max(2, current * 2) || activeConcurrency >= current * 2 ? 2 : 1;
151
+ recommended = Math.min(configured, current + queueDemand);
152
+ reason = `healthy system with queueDepth=${queueDepth}`;
153
+ } else if (!healthySystem && queueDepth > current && current < configured) {
154
+ recommended = Math.min(configured, current + 1);
155
+ reason = `recovering with queued work queueDepth=${queueDepth}`;
156
+ }
157
+ return {
158
+ recommendedGlobalConcurrency: recommended,
159
+ backpressureActive,
160
+ reason,
161
+ pressureLevel
162
+ };
163
+ }
164
+
165
+ // src/orchestrator/provider-aware-resource-manager.ts
166
+ var ProviderAwareResourceManager = class {
167
+ configuredGlobalMaxConcurrent;
168
+ globalMaxConcurrent;
169
+ fairnessMode;
170
+ enableTelemetry;
171
+ telemetryHooks = [];
172
+ lastBackpressureDecision;
173
+ lastBackpressureUpdatedAt = Date.now();
174
+ // Provider-specific baselines (host overlay / CLI overrides replace the shipped default)
175
+ providerLimits;
176
+ // Correctness ceilings no override may exceed (see config.providerHardCaps)
177
+ providerHardCaps;
178
+ // Current active counts
179
+ globalActiveCount = 0;
180
+ providerActiveCounts = /* @__PURE__ */ new Map();
181
+ // Queue of pending acquisitions (singles and atomic groups)
182
+ queue = [];
183
+ processCapacityRecheck;
184
+ // Round-robin state for strict-fair mode
185
+ lastProviderServiced = null;
186
+ // Provider usage statistics for weighted-fair mode
187
+ providerUsageHistory = /* @__PURE__ */ new Map();
188
+ usageHistoryWindow = 100;
189
+ // Track last N acquisitions
190
+ providerAvgHoldMs = /* @__PURE__ */ new Map();
191
+ globalAvgHoldMs = 6e4;
192
+ holdTimeEwmaAlpha = 0.2;
193
+ constructor(config) {
194
+ if (config.globalMaxConcurrent < 1) {
195
+ throw new Error("globalMaxConcurrent must be at least 1");
196
+ }
197
+ this.configuredGlobalMaxConcurrent = config.globalMaxConcurrent;
198
+ this.globalMaxConcurrent = config.globalMaxConcurrent;
199
+ this.fairnessMode = config.fairnessMode ?? "weighted-fair";
200
+ this.enableTelemetry = config.enableTelemetry ?? true;
201
+ this.lastBackpressureDecision = {
202
+ recommendedGlobalConcurrency: config.globalMaxConcurrent,
203
+ backpressureActive: false,
204
+ reason: "baseline",
205
+ pressureLevel: "healthy"
206
+ };
207
+ this.providerHardCaps = /* @__PURE__ */ new Map();
208
+ for (const [provider, cap] of Object.entries(config.providerHardCaps ?? {})) {
209
+ if (Number.isFinite(cap)) {
210
+ this.providerHardCaps.set(provider, Math.max(1, Math.floor(cap)));
211
+ }
212
+ }
213
+ this.providerLimits = /* @__PURE__ */ new Map();
214
+ const providers = new Set(Object.keys(PROVIDER_CONCURRENCY));
215
+ for (const provider of Object.keys(config.providerLimits ?? {})) {
216
+ providers.add(provider);
217
+ }
218
+ for (const provider of providers) {
219
+ const generatedBaseline = PROVIDER_CONCURRENCY[provider]?.maxConcurrent;
220
+ const limit = config.providerLimits?.[provider] ?? generatedBaseline ?? getProviderConcurrencyLimit(provider);
221
+ this.providerLimits.set(provider, limit);
222
+ this.providerActiveCounts.set(provider, 0);
223
+ this.providerUsageHistory.set(provider, 0);
224
+ this.providerAvgHoldMs.set(provider, 6e4);
225
+ }
226
+ this.processCapacityRecheck = new ProcessCapacityQueueRecheck(
227
+ () => this.processQueue(),
228
+ () => this.queue.length > 0,
229
+ () => this.canAdmitProcessSlot()
230
+ );
231
+ }
232
+ /**
233
+ * Acquire a resource slot (blocks if at capacity)
234
+ *
235
+ * Waits until both constraints are satisfied:
236
+ * 1. Provider-specific limit not exceeded
237
+ * 2. Global limit not exceeded
238
+ *
239
+ * @param provider - Provider ID requesting the resource
240
+ * @param signal - Optional AbortSignal for cancellation
241
+ * @param timeoutMs - Maximum time to wait (default: 60 seconds)
242
+ * @returns Resource handle with release callback
243
+ * @throws Error if timeout reached or signal aborted
244
+ *
245
+ * @example
246
+ * ```typescript
247
+ * const handle = await manager.acquire('gemini', signal);
248
+ * try {
249
+ * await executeTask();
250
+ * } finally {
251
+ * await handle.release();
252
+ * }
253
+ * ```
254
+ */
255
+ acquire(provider, signal, timeoutMs = RESOURCE_ACQUISITION_TIMEOUT_MS) {
256
+ if (signal?.aborted) {
257
+ return Promise.reject(new Error("Acquisition aborted before queuing"));
258
+ }
259
+ const immediate = this.tryAcquire(provider);
260
+ if (immediate) {
261
+ return Promise.resolve(immediate);
262
+ }
263
+ let pendingResolve;
264
+ let pendingReject;
265
+ const pending = new Promise((resolve, reject) => {
266
+ pendingResolve = resolve;
267
+ pendingReject = reject;
268
+ });
269
+ pending.catch(() => {
270
+ });
271
+ const queuedAt = Date.now();
272
+ let timeoutHandle = null;
273
+ let abortHandler = null;
274
+ const cleanup = () => {
275
+ if (timeoutHandle) {
276
+ clearTimeout(timeoutHandle);
277
+ }
278
+ if (abortHandler && signal) {
279
+ signal.removeEventListener("abort", abortHandler);
280
+ }
281
+ };
282
+ const wrappedResolve = (handle) => {
283
+ cleanup();
284
+ pendingResolve(handle);
285
+ };
286
+ const wrappedReject = (error) => {
287
+ cleanup();
288
+ const index = this.queue.findIndex((e) => e.resolve === wrappedResolve);
289
+ if (index !== -1) {
290
+ this.queue.splice(index, 1);
291
+ }
292
+ queueMicrotask(() => pendingReject(error));
293
+ this.syncProcessCapacityRecheck();
294
+ };
295
+ const entry = {
296
+ provider,
297
+ resolve: wrappedResolve,
298
+ reject: wrappedReject,
299
+ signal,
300
+ queuedAt,
301
+ weight: this.calculateWeight(provider)
302
+ };
303
+ this.queue.push(entry);
304
+ timeoutHandle = setTimeout(() => {
305
+ const waitTimeMs = Date.now() - queuedAt;
306
+ const error = new Error(
307
+ `Resource acquisition timeout after ${waitTimeMs}ms (limit: ${timeoutMs}ms). Provider: ${provider}, Active: ${this.globalActiveCount}/${this.globalMaxConcurrent} global, ${this.providerActiveCounts.get(provider)}/${this.getEffectiveProviderLimit(provider)} provider, Queued: ${this.queue.length}. This may indicate resource contention or a leak (release() not called).`
308
+ );
309
+ this.emitTelemetry({
310
+ type: "resource_timeout",
311
+ provider,
312
+ waitTimeMs,
313
+ status: this.getStatus(),
314
+ timestamp: Date.now(),
315
+ error
316
+ });
317
+ wrappedReject(error);
318
+ }, timeoutMs);
319
+ if (signal) {
320
+ abortHandler = () => {
321
+ const waitTimeMs = Date.now() - queuedAt;
322
+ const error = new Error(
323
+ `Resource acquisition cancelled after ${waitTimeMs}ms for provider ${provider}`
324
+ );
325
+ this.emitTelemetry({
326
+ type: "resource_cancelled",
327
+ provider,
328
+ waitTimeMs,
329
+ status: this.getStatus(),
330
+ timestamp: Date.now(),
331
+ error
332
+ });
333
+ wrappedReject(error);
334
+ };
335
+ signal.addEventListener("abort", abortHandler);
336
+ }
337
+ this.processQueue();
338
+ this.syncProcessCapacityRecheck();
339
+ return pending;
340
+ }
341
+ /**
342
+ * Acquire a group of resource slots via atomic queued reservation.
343
+ *
344
+ * Charges **one slot per reserved entry** (duplicate providers each consume a
345
+ * slot up to baseline). The outer reservation is **capacity-aware**: the
346
+ * request is clamped to configured baselines so oversized competitions remain
347
+ * runnable (per provider min(count, baseline), total ≤ min(configured global
348
+ * max, live process-limiter hard cap)). Temporary backpressure does not shrink
349
+ * the reserved group; it waits. Overflow beyond that clamp is serialized.
350
+ *
351
+ * The group receives **no handles** until every reserved slot fits current
352
+ * effective capacity; there are never partial holds. Transient effective
353
+ * reductions cause a wait (queue), not a hard reject.
354
+ *
355
+ * Ordering is owned by the shared manager queue (FIFO / fairness with
356
+ * single-slot entries).
357
+ *
358
+ * @param providers - Providers for each requested slot (order preserved)
359
+ * @param signal - Optional AbortSignal for cancellation while queued
360
+ * @param timeoutMs - Max time to wait for the full group (default: RESOURCE_ACQUISITION_TIMEOUT_MS)
361
+ */
362
+ acquireMany(providers, signal, timeoutMs = RESOURCE_ACQUISITION_TIMEOUT_MS) {
363
+ if (providers.length === 0) {
364
+ return Promise.reject(new Error("acquireMany requires at least one provider slot"));
365
+ }
366
+ const reservedProviders = this.clampProvidersToBaselineCapacity(providers);
367
+ if (reservedProviders.length === 0) {
368
+ return Promise.reject(
369
+ new Error(
370
+ "acquireMany could not reserve any slots: all providers have zero configured baseline capacity"
371
+ )
372
+ );
373
+ }
374
+ if (signal?.aborted) {
375
+ return Promise.reject(new Error("Group acquisition aborted before queuing"));
376
+ }
377
+ if (this.queue.length === 0) {
378
+ const immediate = this.tryAcquireGroup(reservedProviders);
379
+ if (immediate) {
380
+ return Promise.resolve(immediate);
381
+ }
382
+ }
383
+ let pendingResolve;
384
+ let pendingReject;
385
+ const pending = new Promise((resolve, reject) => {
386
+ pendingResolve = resolve;
387
+ pendingReject = reject;
388
+ });
389
+ pending.catch(() => {
390
+ });
391
+ const queuedAt = Date.now();
392
+ let timeoutHandle = null;
393
+ let abortHandler = null;
394
+ const cleanup = () => {
395
+ if (timeoutHandle) {
396
+ clearTimeout(timeoutHandle);
397
+ }
398
+ if (abortHandler && signal) {
399
+ signal.removeEventListener("abort", abortHandler);
400
+ }
401
+ };
402
+ const wrappedResolve = (handles) => {
403
+ cleanup();
404
+ pendingResolve(handles);
405
+ };
406
+ const wrappedReject = (error) => {
407
+ cleanup();
408
+ const index = this.queue.findIndex((e) => e.resolveGroup === wrappedResolve);
409
+ if (index !== -1) {
410
+ this.queue.splice(index, 1);
411
+ }
412
+ queueMicrotask(() => pendingReject(error));
413
+ this.syncProcessCapacityRecheck();
414
+ };
415
+ const primaryProvider = reservedProviders[0];
416
+ const weight = reservedProviders.reduce((sum, provider) => sum + this.calculateWeight(provider), 0) / reservedProviders.length;
417
+ const entry = {
418
+ provider: primaryProvider,
419
+ providers: [...reservedProviders],
420
+ // Single resolve is unused for groups; provide a no-op to satisfy the type.
421
+ resolve: () => {
422
+ },
423
+ resolveGroup: wrappedResolve,
424
+ reject: wrappedReject,
425
+ signal,
426
+ queuedAt,
427
+ weight
428
+ };
429
+ this.queue.push(entry);
430
+ timeoutHandle = setTimeout(() => {
431
+ const waitTimeMs = Date.now() - queuedAt;
432
+ const error = new Error(
433
+ `Resource group acquisition timeout after ${waitTimeMs}ms (limit: ${timeoutMs}ms). Providers: [${reservedProviders.join(", ")}], Active: ${this.globalActiveCount}/${this.globalMaxConcurrent} global, Queued: ${this.queue.length}. This may indicate resource contention or a leak (release() not called).`
434
+ );
435
+ this.emitTelemetry({
436
+ type: "resource_timeout",
437
+ provider: primaryProvider,
438
+ waitTimeMs,
439
+ status: this.getStatus(),
440
+ timestamp: Date.now(),
441
+ error
442
+ });
443
+ wrappedReject(error);
444
+ }, timeoutMs);
445
+ if (signal) {
446
+ abortHandler = () => {
447
+ const waitTimeMs = Date.now() - queuedAt;
448
+ const error = new Error(
449
+ `Resource group acquisition cancelled after ${waitTimeMs}ms for providers [${reservedProviders.join(", ")}]`
450
+ );
451
+ this.emitTelemetry({
452
+ type: "resource_cancelled",
453
+ provider: primaryProvider,
454
+ waitTimeMs,
455
+ status: this.getStatus(),
456
+ timestamp: Date.now(),
457
+ error
458
+ });
459
+ wrappedReject(error);
460
+ };
461
+ signal.addEventListener("abort", abortHandler);
462
+ }
463
+ this.processQueue();
464
+ this.syncProcessCapacityRecheck();
465
+ return pending;
466
+ }
467
+ /**
468
+ * Try to acquire a resource slot (non-blocking)
469
+ *
470
+ * Returns immediately with a handle if available, or null if at capacity.
471
+ * Useful for opportunistic acquisition without blocking.
472
+ *
473
+ * @param provider - Provider ID requesting the resource
474
+ * @returns Resource handle if available, null otherwise
475
+ *
476
+ * @example
477
+ * ```typescript
478
+ * const handle = manager.tryAcquire('gemini');
479
+ * if (handle) {
480
+ * try {
481
+ * await executeTask();
482
+ * } finally {
483
+ * await handle.release();
484
+ * }
485
+ * } else {
486
+ * console.log('At capacity, will queue later');
487
+ * }
488
+ * ```
489
+ */
490
+ tryAcquire(provider) {
491
+ const providerLimit = this.getEffectiveProviderLimit(provider);
492
+ const providerActive = this.providerActiveCounts.get(provider) ?? 0;
493
+ const canAcquireProvider = providerActive < providerLimit;
494
+ const canAcquireGlobal = this.globalActiveCount < this.getEffectiveGlobalLimit();
495
+ const canAcquireProcess = this.canAdmitProcessSlot();
496
+ if (!canAcquireProvider || !canAcquireGlobal || !canAcquireProcess) {
497
+ if (process.env.DEBUG_ORCHESTRATOR) {
498
+ console.log(
499
+ `[DEBUG] At capacity for ${provider}: canAcquireProvider=${canAcquireProvider}, canAcquireGlobal=${canAcquireGlobal}, active=${providerActive}, limit=${providerLimit}, globalActive=${this.globalActiveCount}, globalMax=${this.globalMaxConcurrent}`
500
+ );
501
+ }
502
+ return null;
503
+ }
504
+ this.globalActiveCount++;
505
+ this.providerActiveCounts.set(provider, providerActive + 1);
506
+ this.updateUsageHistory(provider);
507
+ const acquiredAt = Date.now();
508
+ let released = false;
509
+ const release = async () => {
510
+ if (released) {
511
+ return;
512
+ }
513
+ released = true;
514
+ await this.releaseInternal(provider, acquiredAt);
515
+ };
516
+ this.emitTelemetry({
517
+ type: "resource_acquired",
518
+ provider,
519
+ waitTimeMs: 0,
520
+ // Immediate acquisition
521
+ status: this.getStatus(),
522
+ timestamp: acquiredAt
523
+ });
524
+ return {
525
+ provider,
526
+ release,
527
+ acquiredAt
528
+ };
529
+ }
530
+ /**
531
+ * Get current resource status
532
+ *
533
+ * @returns Current utilization across all providers
534
+ */
535
+ getStatus() {
536
+ const timestamp = Date.now();
537
+ const providers = {};
538
+ const providerIds = Array.from(this.providerLimits.keys());
539
+ for (const provider of providerIds) {
540
+ const limit = this.getEffectiveProviderLimit(provider);
541
+ const active = this.providerActiveCounts.get(provider) ?? 0;
542
+ const queued = this.queue.reduce((count, entry) => {
543
+ if (entry.providers && entry.providers.length > 0) {
544
+ return count + entry.providers.filter((p) => p === provider).length;
545
+ }
546
+ return count + (entry.provider === provider ? 1 : 0);
547
+ }, 0);
548
+ const utilization = limit > 0 ? Math.round(active / limit * 100) : 0;
549
+ const available = Math.max(0, limit - active);
550
+ providers[provider] = {
551
+ provider,
552
+ active,
553
+ queued,
554
+ max: limit,
555
+ utilization,
556
+ available
557
+ };
558
+ }
559
+ const effectiveGlobalMax = this.getEffectiveGlobalLimit();
560
+ const globalUtilization = effectiveGlobalMax > 0 ? Math.round(this.globalActiveCount / effectiveGlobalMax * 100) : 0;
561
+ const globalAvailable = Math.max(0, effectiveGlobalMax - this.globalActiveCount);
562
+ return {
563
+ global: {
564
+ active: this.globalActiveCount,
565
+ queued: this.queue.length,
566
+ max: effectiveGlobalMax,
567
+ utilization: globalUtilization,
568
+ available: globalAvailable,
569
+ baselineMax: this.configuredGlobalMaxConcurrent
570
+ },
571
+ backpressure: {
572
+ active: this.lastBackpressureDecision.backpressureActive,
573
+ recommendedGlobalConcurrency: this.lastBackpressureDecision.recommendedGlobalConcurrency,
574
+ configuredGlobalConcurrency: this.configuredGlobalMaxConcurrent,
575
+ evaluatedAt: this.lastBackpressureUpdatedAt,
576
+ reason: this.lastBackpressureDecision.reason,
577
+ pressureLevel: this.lastBackpressureDecision.pressureLevel
578
+ },
579
+ providers,
580
+ fairnessMode: this.fairnessMode,
581
+ timestamp
582
+ };
583
+ }
584
+ /**
585
+ * Get queue depth and estimated wait time for a provider
586
+ *
587
+ * Estimates are best-effort and intended for fail-fast routing decisions.
588
+ */
589
+ getQueueStatus(provider) {
590
+ const providerQueued = this.queue.reduce((count, entry) => {
591
+ if (entry.providers && entry.providers.length > 0) {
592
+ return count + entry.providers.filter((p) => p === provider).length;
593
+ }
594
+ return count + (entry.provider === provider ? 1 : 0);
595
+ }, 0);
596
+ const providerActive = this.providerActiveCounts.get(provider) ?? 0;
597
+ const providerMax = this.getEffectiveProviderLimit(provider);
598
+ const avgProviderHoldMs = Math.max(1e3, this.providerAvgHoldMs.get(provider) ?? 6e4);
599
+ const globalQueued = this.queue.length;
600
+ const globalActive = this.globalActiveCount;
601
+ const globalMax = this.getEffectiveGlobalLimit();
602
+ const avgGlobalHoldMs = Math.max(1e3, this.globalAvgHoldMs);
603
+ const providerWaves = providerQueued <= 0 ? 0 : Math.ceil(providerQueued / Math.max(1, providerMax));
604
+ const providerWaitMs = providerWaves * Math.ceil(avgProviderHoldMs / Math.max(1, providerMax));
605
+ const globalWaves = globalQueued <= 0 ? 0 : Math.ceil(globalQueued / Math.max(1, globalMax));
606
+ const globalWaitMs = globalWaves * Math.ceil(avgGlobalHoldMs / Math.max(1, globalMax));
607
+ return {
608
+ provider,
609
+ queued: providerQueued,
610
+ active: providerActive,
611
+ max: providerMax,
612
+ estimatedWaitMs: Math.max(providerWaitMs, globalWaitMs),
613
+ globalQueued,
614
+ globalActive,
615
+ globalMax
616
+ };
617
+ }
618
+ /**
619
+ * Update provider-specific concurrency baseline dynamically
620
+ *
621
+ * Useful for runtime tuning based on observed performance. The new value is
622
+ * authoritative in both directions, still bounded by any correctness ceiling
623
+ * (`providerHardCaps`) and by live rate-limit penalties.
624
+ *
625
+ * @param provider - Provider ID
626
+ * @param newLimit - New concurrency limit (must be >= 1)
627
+ *
628
+ * @example
629
+ * ```typescript
630
+ * // Raise Cursor capacity after validating host resources
631
+ * manager.updateProviderLimit('cursor', 3);
632
+ * ```
633
+ */
634
+ updateProviderLimit(provider, newLimit) {
635
+ if (newLimit < 1) {
636
+ throw new Error(`Invalid limit for ${provider}: ${newLimit} (must be >= 1)`);
637
+ }
638
+ const previousEffective = this.getEffectiveProviderLimit(provider);
639
+ this.providerLimits.set(provider, newLimit);
640
+ if (this.getEffectiveProviderLimit(provider) > previousEffective) {
641
+ this.processQueue();
642
+ }
643
+ }
644
+ /**
645
+ * Update the global concurrency limit.
646
+ *
647
+ * This is intentionally non-preemptive: active work continues, and the new
648
+ * limit only affects future acquisitions and queue draining.
649
+ */
650
+ updateGlobalLimit(newLimit) {
651
+ if (newLimit < 1) {
652
+ throw new Error(`Invalid global limit: ${newLimit} (must be >= 1)`);
653
+ }
654
+ const nextLimit = Math.max(
655
+ 1,
656
+ Math.min(this.configuredGlobalMaxConcurrent, Math.floor(newLimit))
657
+ );
658
+ const previousLimit = this.globalMaxConcurrent;
659
+ if (nextLimit === previousLimit) {
660
+ return;
661
+ }
662
+ this.globalMaxConcurrent = nextLimit;
663
+ this.lastBackpressureUpdatedAt = Date.now();
664
+ const decision = {
665
+ recommendedGlobalConcurrency: nextLimit,
666
+ backpressureActive: nextLimit < this.configuredGlobalMaxConcurrent,
667
+ reason: nextLimit < previousLimit ? "concurrency reduced by backpressure" : "concurrency increased after recovery",
668
+ pressureLevel: nextLimit < previousLimit ? nextLimit <= Math.max(1, Math.floor(previousLimit / 2)) ? "critical" : "backpressure" : nextLimit === this.configuredGlobalMaxConcurrent ? "healthy" : "watch"
669
+ };
670
+ this.lastBackpressureDecision = decision;
671
+ if (nextLimit > previousLimit) {
672
+ this.processQueue();
673
+ }
674
+ }
675
+ /**
676
+ * Evaluate and apply the current backpressure policy.
677
+ *
678
+ * Returns the decision so callers can log or persist the same signal that
679
+ * was applied to the manager.
680
+ */
681
+ applyBackpressure(snapshot) {
682
+ const decision = recommendGlobalConcurrency(snapshot);
683
+ const previousLimit = this.globalMaxConcurrent;
684
+ if (decision.recommendedGlobalConcurrency !== previousLimit) {
685
+ this.updateGlobalLimit(decision.recommendedGlobalConcurrency);
686
+ this.lastBackpressureDecision = decision;
687
+ this.lastBackpressureUpdatedAt = Date.now();
688
+ this.emitTelemetry({
689
+ type: decision.backpressureActive ? "backpressure_active" : decision.recommendedGlobalConcurrency === this.configuredGlobalMaxConcurrent ? "backpressure_released" : "concurrency_adjusted",
690
+ provider: "system",
691
+ status: this.getStatus(),
692
+ timestamp: Date.now(),
693
+ snapshot,
694
+ previousGlobalConcurrency: previousLimit,
695
+ recommendedGlobalConcurrency: decision.recommendedGlobalConcurrency,
696
+ appliedGlobalConcurrency: this.globalMaxConcurrent,
697
+ reason: decision.reason,
698
+ backpressureActive: decision.backpressureActive
699
+ });
700
+ return decision;
701
+ }
702
+ this.lastBackpressureDecision = decision;
703
+ this.lastBackpressureUpdatedAt = Date.now();
704
+ return decision;
705
+ }
706
+ /**
707
+ * Register a telemetry hook
708
+ *
709
+ * @param hook - Callback function for telemetry events
710
+ *
711
+ * @example
712
+ * ```typescript
713
+ * manager.onTelemetry((event) => {
714
+ * console.log(`[${event.type}] ${event.provider} - wait: ${event.waitTimeMs}ms`);
715
+ * });
716
+ * ```
717
+ */
718
+ onTelemetry(hook) {
719
+ this.telemetryHooks.push(hook);
720
+ }
721
+ /**
722
+ * Reset the manager (for testing or recovery)
723
+ *
724
+ * WARNING: Only use when you're sure no executions are running
725
+ */
726
+ reset() {
727
+ if (this.globalActiveCount > 0 || this.queue.length > 0) {
728
+ console.warn(
729
+ `[ProviderAwareResourceManager] reset() called with ${this.globalActiveCount} active slots and ${this.queue.length} queued requests \u2014 potential race condition`
730
+ );
731
+ }
732
+ this.processCapacityRecheck.stop();
733
+ const queuedEntries = this.queue.splice(0);
734
+ for (const entry of queuedEntries) {
735
+ entry.reject(new Error("Resource acquisition cancelled by manager reset"));
736
+ }
737
+ this.globalActiveCount = 0;
738
+ this.globalMaxConcurrent = this.configuredGlobalMaxConcurrent;
739
+ this.lastBackpressureUpdatedAt = Date.now();
740
+ this.lastBackpressureDecision = {
741
+ recommendedGlobalConcurrency: this.configuredGlobalMaxConcurrent,
742
+ backpressureActive: false,
743
+ reason: "reset to baseline",
744
+ pressureLevel: "healthy"
745
+ };
746
+ this.globalAvgHoldMs = 6e4;
747
+ const providerIds = Array.from(this.providerActiveCounts.keys());
748
+ for (const provider of providerIds) {
749
+ this.providerActiveCounts.set(provider, 0);
750
+ this.providerUsageHistory.set(provider, 0);
751
+ this.providerAvgHoldMs.set(provider, 6e4);
752
+ }
753
+ this.lastProviderServiced = null;
754
+ }
755
+ // ============================================================================
756
+ // Private Methods
757
+ // ============================================================================
758
+ /**
759
+ * Configured baseline max for a provider (not temporary effective/penalty),
760
+ * bounded by any correctness ceiling.
761
+ *
762
+ * The hard cap is applied here — not only in getEffectiveProviderLimit — so
763
+ * group reservation (clampProvidersToBaselineCapacity) never reserves slots
764
+ * that acquisition can never grant, which would queue a group until timeout.
765
+ */
766
+ getConfiguredProviderBaseline(provider) {
767
+ const baseline = this.providerLimits.get(provider) ?? getProviderConcurrencyBaseline(provider);
768
+ const hardCap = this.providerHardCaps.get(provider);
769
+ return hardCap === void 0 ? baseline : Math.min(baseline, hardCap);
770
+ }
771
+ /**
772
+ * Clamp an outer competition reservation to configured baselines so oversized
773
+ * variant lists remain runnable. Overflow beyond the clamp is not reserved
774
+ * (callers serialize that work). Never produces a group larger than baseline
775
+ * global, live process hard cap, or per-provider capacity.
776
+ *
777
+ * - Per provider: at most configured baseline slots (order preserved)
778
+ * - Total: at most min(configured global max, live process-limiter hard cap)
779
+ * - Temporary backpressure (reduced globalMaxConcurrent) is not applied here
780
+ * so the group waits rather than shrinking to current free slots
781
+ * - Each reserved entry keeps its actual provider association
782
+ */
783
+ clampProvidersToBaselineCapacity(providers) {
784
+ const globalMax = clampToLiveProcessCapacity(this.configuredGlobalMaxConcurrent);
785
+ const perProviderTaken = /* @__PURE__ */ new Map();
786
+ const clamped = [];
787
+ for (const provider of providers) {
788
+ if (clamped.length >= globalMax) {
789
+ break;
790
+ }
791
+ const baseline = Math.max(0, this.getConfiguredProviderBaseline(provider));
792
+ const taken = perProviderTaken.get(provider) ?? 0;
793
+ if (taken >= baseline) {
794
+ continue;
795
+ }
796
+ clamped.push(provider);
797
+ perProviderTaken.set(provider, taken + 1);
798
+ }
799
+ return clamped;
800
+ }
801
+ /**
802
+ * Whether the full group fits current effective capacity without taking any slots.
803
+ */
804
+ canGrantGroup(providers) {
805
+ let simulatedGlobal = this.globalActiveCount;
806
+ const simulatedProvider = new Map(this.providerActiveCounts);
807
+ for (const provider of providers) {
808
+ const providerLimit = this.getEffectiveProviderLimit(provider);
809
+ const providerActive = simulatedProvider.get(provider) ?? 0;
810
+ if (providerActive >= providerLimit) {
811
+ return false;
812
+ }
813
+ if (simulatedGlobal >= this.getEffectiveGlobalLimit() || !this.canAdmitProcessSlot()) {
814
+ return false;
815
+ }
816
+ simulatedProvider.set(provider, providerActive + 1);
817
+ simulatedGlobal += 1;
818
+ }
819
+ return true;
820
+ }
821
+ /**
822
+ * Atomically grant every slot in the group, or return null without holding any.
823
+ * Never leaves partial holds.
824
+ */
825
+ tryAcquireGroup(providers, waitTimeMs = 0) {
826
+ if (!this.canGrantGroup(providers)) {
827
+ return null;
828
+ }
829
+ const acquiredAt = Date.now();
830
+ const handles = [];
831
+ for (const provider of providers) {
832
+ this.globalActiveCount++;
833
+ const providerActive = this.providerActiveCounts.get(provider) ?? 0;
834
+ this.providerActiveCounts.set(provider, providerActive + 1);
835
+ this.updateUsageHistory(provider);
836
+ let released = false;
837
+ const release = async () => {
838
+ if (released) {
839
+ return;
840
+ }
841
+ released = true;
842
+ await this.releaseInternal(provider, acquiredAt);
843
+ };
844
+ handles.push({
845
+ provider,
846
+ release,
847
+ acquiredAt
848
+ });
849
+ this.emitTelemetry({
850
+ type: "resource_acquired",
851
+ provider,
852
+ waitTimeMs,
853
+ status: this.getStatus(),
854
+ timestamp: acquiredAt
855
+ });
856
+ }
857
+ return handles;
858
+ }
859
+ /**
860
+ * Internal release implementation
861
+ */
862
+ async releaseInternal(provider, acquiredAt) {
863
+ const currentActive = this.providerActiveCounts.get(provider) ?? 0;
864
+ if (currentActive <= 0) {
865
+ throw new Error(
866
+ `Cannot release ${provider} - no active executions (possible double-release)`
867
+ );
868
+ }
869
+ if (this.globalActiveCount <= 0) {
870
+ throw new Error("Cannot release - no global active executions (possible double-release)");
871
+ }
872
+ this.globalActiveCount--;
873
+ this.providerActiveCounts.set(provider, currentActive - 1);
874
+ const holdTimeMs = Date.now() - acquiredAt;
875
+ this.updateHoldTimeEstimates(provider, holdTimeMs);
876
+ this.emitTelemetry({
877
+ type: "resource_released",
878
+ provider,
879
+ waitTimeMs: holdTimeMs,
880
+ status: this.getStatus(),
881
+ timestamp: Date.now()
882
+ });
883
+ this.processQueue();
884
+ }
885
+ /**
886
+ * Effective per-provider capacity for the next acquisition decision.
887
+ *
888
+ * Composed rather than minimum-clamped, because the three inputs answer three
889
+ * different questions and only one of them is an upper bound on operator
890
+ * intent:
891
+ *
892
+ * baseline — configured capacity for THIS host (override, else shipped
893
+ * default). An override replaces the default in both directions;
894
+ * clamping it downward against the default is what previously
895
+ * made every host overlay and `--provider-limit` inert.
896
+ * hard cap — correctness ceiling (concurrency would be unsafe, not merely
897
+ * expensive). Never raisable by configuration.
898
+ * penalty — live rate-limit throttle, one-way down, decays on its own.
899
+ *
900
+ * Penalty is applied to the capped baseline so an operator who raised capacity
901
+ * is still throttled proportionally by an observed 429 instead of having the
902
+ * override discarded outright.
903
+ */
904
+ getEffectiveProviderLimit(provider) {
905
+ return applyProviderConcurrencyPenalty(provider, this.getConfiguredProviderBaseline(provider));
906
+ }
907
+ /**
908
+ * Live global admission ceiling: configured/backpressure limit, never above
909
+ * the process-limiter spawn cap. Recomputed each decision so later
910
+ * raiseMaxProcesses / clamps apply without a frozen import-time default.
911
+ */
912
+ getEffectiveGlobalLimit() {
913
+ return clampToLiveProcessCapacity(this.globalMaxConcurrent);
914
+ }
915
+ /** Do not admit work that cannot yet take a spawn slot (no reservation here). */
916
+ canAdmitProcessSlot() {
917
+ return canAdmitProcessSlot();
918
+ }
919
+ syncProcessCapacityRecheck() {
920
+ if (this.queue.length === 0) {
921
+ this.processCapacityRecheck.stop();
922
+ return;
923
+ }
924
+ if (!this.canAdmitProcessSlot()) {
925
+ this.processCapacityRecheck.ensure();
926
+ }
927
+ }
928
+ /**
929
+ * Compute a queue-wait ceiling for a stage that is about to be enqueued for
930
+ * `provider`, given the number of same-provider stages dispatched together in
931
+ * the same wave (`coDispatchedCount`).
932
+ *
933
+ * A flat ceiling (e.g. one variant duration) false-fails the back of a large
934
+ * same-provider wave: with provider limit N and W co-dispatched stages, a
935
+ * stage at the back waits up to ceil(W / N) variant durations before it can
936
+ * even start. This scales the ceiling by that batch depth so a legitimately
937
+ * queued stage is not failed while earlier stages are still running, while
938
+ * still bounding the wait so a genuine leak/deadlock is eventually surfaced.
939
+ *
940
+ * @param perVariantMs The expected upper bound on a single variant's hold time.
941
+ * @param coDispatchedCount Number of stages (incl. this one) dispatched together for this provider.
942
+ * @param totalWaveCount Total stages dispatched together across ALL providers in this wave.
943
+ * When omitted, defaults to coDispatchedCount (provider-only sizing).
944
+ */
945
+ computeQueueWaitCeilingMs(provider, perVariantMs, coDispatchedCount, totalWaveCount) {
946
+ const providerLimit = Math.max(1, this.getEffectiveProviderLimit(provider));
947
+ const globalLimit = Math.max(1, this.getEffectiveGlobalLimit());
948
+ const providerWidth = Math.min(providerLimit, globalLimit);
949
+ const providerBatches = Math.ceil(Math.max(1, coDispatchedCount) / providerWidth);
950
+ const waveCount = Math.max(coDispatchedCount, totalWaveCount ?? coDispatchedCount);
951
+ const globalBatches = Math.ceil(Math.max(1, waveCount) / globalLimit);
952
+ const batches = Math.max(1, providerBatches, globalBatches);
953
+ return perVariantMs * (batches + 1);
954
+ }
955
+ updateHoldTimeEstimates(provider, holdTimeMs) {
956
+ const boundedHoldMs = Math.max(250, Math.min(holdTimeMs, 30 * 60 * 1e3));
957
+ const currentProviderAvg = this.providerAvgHoldMs.get(provider) ?? 6e4;
958
+ const nextProviderAvg = Math.round(
959
+ currentProviderAvg + this.holdTimeEwmaAlpha * (boundedHoldMs - currentProviderAvg)
960
+ );
961
+ this.providerAvgHoldMs.set(provider, nextProviderAvg);
962
+ this.globalAvgHoldMs = Math.round(
963
+ this.globalAvgHoldMs + this.holdTimeEwmaAlpha * (boundedHoldMs - this.globalAvgHoldMs)
964
+ );
965
+ }
966
+ /**
967
+ * Process the queue based on fairness mode
968
+ *
969
+ * Attempts to satisfy queued acquisitions in priority order.
970
+ * Single entries use tryAcquire; group entries are granted only when the
971
+ * full group fits (atomic, no partial holds). Runs synchronously to prevent
972
+ * race conditions.
973
+ */
974
+ processQueue() {
975
+ if (this.queue.length === 0) {
976
+ return;
977
+ }
978
+ let madeProgress = true;
979
+ while (madeProgress && this.queue.length > 0) {
980
+ madeProgress = false;
981
+ this.sortQueueByFairness();
982
+ for (let index = 0; index < this.queue.length; ) {
983
+ const entry = this.queue[index];
984
+ if (!entry) {
985
+ this.queue.splice(index, 1);
986
+ madeProgress = true;
987
+ continue;
988
+ }
989
+ if (entry.signal?.aborted) {
990
+ this.queue.splice(index, 1);
991
+ entry.reject(new Error("Acquisition aborted while queued"));
992
+ madeProgress = true;
993
+ continue;
994
+ }
995
+ if (entry.providers && entry.providers.length > 0 && entry.resolveGroup) {
996
+ const waitTimeMs = Date.now() - entry.queuedAt;
997
+ const handles = this.tryAcquireGroup(entry.providers, waitTimeMs);
998
+ if (handles) {
999
+ this.queue.splice(index, 1);
1000
+ entry.resolveGroup(handles);
1001
+ madeProgress = true;
1002
+ if (this.globalActiveCount >= this.getEffectiveGlobalLimit()) {
1003
+ this.syncProcessCapacityRecheck();
1004
+ return;
1005
+ }
1006
+ continue;
1007
+ }
1008
+ index++;
1009
+ continue;
1010
+ }
1011
+ const handle = this.tryAcquire(entry.provider);
1012
+ if (handle) {
1013
+ this.queue.splice(index, 1);
1014
+ entry.resolve(handle);
1015
+ madeProgress = true;
1016
+ if (this.globalActiveCount >= this.getEffectiveGlobalLimit()) {
1017
+ this.syncProcessCapacityRecheck();
1018
+ return;
1019
+ }
1020
+ continue;
1021
+ }
1022
+ index++;
1023
+ }
1024
+ }
1025
+ this.syncProcessCapacityRecheck();
1026
+ }
1027
+ /**
1028
+ * Sort queue based on fairness mode
1029
+ */
1030
+ sortQueueByFairness() {
1031
+ switch (this.fairnessMode) {
1032
+ case "fifo":
1033
+ break;
1034
+ case "weighted-fair": {
1035
+ this.queue.sort((a, b) => {
1036
+ const weightDiff = (a.weight ?? 0) - (b.weight ?? 0);
1037
+ if (weightDiff !== 0) return weightDiff;
1038
+ return a.queuedAt - b.queuedAt;
1039
+ });
1040
+ break;
1041
+ }
1042
+ case "strict-fair": {
1043
+ if (this.lastProviderServiced) {
1044
+ const lastProviderEntries = this.queue.filter(
1045
+ (e) => e.provider === this.lastProviderServiced
1046
+ );
1047
+ const otherEntries = this.queue.filter((e) => e.provider !== this.lastProviderServiced);
1048
+ this.queue.length = 0;
1049
+ this.queue.push(...otherEntries, ...lastProviderEntries);
1050
+ }
1051
+ break;
1052
+ }
1053
+ }
1054
+ }
1055
+ /**
1056
+ * Calculate weight for weighted-fair scheduling
1057
+ *
1058
+ * Lower weight = higher priority
1059
+ * Providers with less recent usage get lower weights (higher priority)
1060
+ */
1061
+ calculateWeight(provider) {
1062
+ const usage = this.providerUsageHistory.get(provider) ?? 0;
1063
+ const totalUsage = Array.from(this.providerUsageHistory.values()).reduce(
1064
+ (sum, count) => sum + count,
1065
+ 0
1066
+ );
1067
+ if (totalUsage === 0) return 0;
1068
+ return Math.round(usage / totalUsage * 100);
1069
+ }
1070
+ /**
1071
+ * Update usage history for weighted-fair mode
1072
+ */
1073
+ updateUsageHistory(provider) {
1074
+ const current = this.providerUsageHistory.get(provider) ?? 0;
1075
+ this.providerUsageHistory.set(provider, current + 1);
1076
+ this.lastProviderServiced = provider;
1077
+ const usageCounts = Array.from(this.providerUsageHistory.values());
1078
+ const totalUsage = usageCounts.reduce((sum, count) => sum + count, 0);
1079
+ if (totalUsage > this.usageHistoryWindow) {
1080
+ const providerIds = Array.from(this.providerUsageHistory.keys());
1081
+ for (const p of providerIds) {
1082
+ const count = this.providerUsageHistory.get(p) ?? 0;
1083
+ this.providerUsageHistory.set(
1084
+ p,
1085
+ Math.floor(count * this.usageHistoryWindow / totalUsage)
1086
+ );
1087
+ }
1088
+ }
1089
+ }
1090
+ /**
1091
+ * Emit telemetry event to registered hooks
1092
+ */
1093
+ emitTelemetry(event) {
1094
+ if (!this.enableTelemetry) return;
1095
+ for (const hook of this.telemetryHooks) {
1096
+ try {
1097
+ hook(event);
1098
+ } catch (error) {
1099
+ console.error("[ProviderAwareResourceManager] Telemetry hook error:", error);
1100
+ }
1101
+ }
1102
+ }
1103
+ };
1104
+ function getDynamicGlobalConcurrency() {
1105
+ return resolveMemoryTierConcurrency(totalmem() / 1024 ** 3, process.env.BUILD_RESOURCE_TIER);
1106
+ }
1107
+ function createProviderAwareResourceManager(config) {
1108
+ return new ProviderAwareResourceManager(config);
1109
+ }
1110
+ function createDynamicResourceManager(configOverrides) {
1111
+ const dynamicGlobalLimit = getDynamicGlobalConcurrency();
1112
+ const config = {
1113
+ globalMaxConcurrent: configOverrides?.globalMaxConcurrent ?? dynamicGlobalLimit,
1114
+ fairnessMode: configOverrides?.fairnessMode ?? "weighted-fair",
1115
+ enableTelemetry: configOverrides?.enableTelemetry ?? true,
1116
+ providerLimits: configOverrides?.providerLimits,
1117
+ // Correctness ceilings must never be silently dropped on the way through a
1118
+ // factory: providerLimits is authoritative, so losing the caps here would
1119
+ // let an override raise a provider past a safety boundary.
1120
+ providerHardCaps: configOverrides?.providerHardCaps
1121
+ };
1122
+ return new ProviderAwareResourceManager(config);
1123
+ }
1124
+ var DEFAULT_GLOBAL_CONCURRENCY = getDynamicGlobalConcurrency();
1125
+
1126
+ export {
1127
+ captureConcurrencyBackpressureSnapshot,
1128
+ ProviderAwareResourceManager,
1129
+ createProviderAwareResourceManager,
1130
+ createDynamicResourceManager,
1131
+ DEFAULT_GLOBAL_CONCURRENCY
1132
+ };
1133
+ //# sourceMappingURL=chunk-LULOGMMM.js.map