@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,2147 @@
1
+ import {
2
+ moveToMonthlyArchive
3
+ } from "./chunk-2JIX3EKV.js";
4
+ import {
5
+ processRemoteBranchCleanupQueue
6
+ } from "./chunk-SDJV2DTQ.js";
7
+ import {
8
+ processScanner
9
+ } from "./chunk-47X5LM7B.js";
10
+ import {
11
+ getProcessRegistryStateDirectory,
12
+ isSignalEligible,
13
+ processRegistry
14
+ } from "./chunk-QP5ST7RI.js";
15
+ import {
16
+ reapOrphanedTmuxSessions
17
+ } from "./chunk-B7PYTV72.js";
18
+ import {
19
+ cleanupCompetitionStateFiles,
20
+ createBranchCleanupManager,
21
+ resolveCleanupBuildDir
22
+ } from "./chunk-ZVVD2XGV.js";
23
+ import {
24
+ WORKFLOW_HEARTBEAT_STALE_AFTER_MS,
25
+ getWorkflowExecutionStatus,
26
+ getWorkflowLastActivityMs
27
+ } from "./chunk-6TRD7TEE.js";
28
+ import {
29
+ DbSizeManager,
30
+ resolveRetentionConfig
31
+ } from "./chunk-QWMQ74KD.js";
32
+ import {
33
+ WorktreeCleanupManager,
34
+ cleanupSessionsCategory
35
+ } from "./chunk-UPHU64NB.js";
36
+ import {
37
+ formatBytes
38
+ } from "./chunk-JLS65NUQ.js";
39
+ import {
40
+ collectActiveRunPids
41
+ } from "./chunk-2NMNFUQA.js";
42
+ import {
43
+ parseJsonWithContext
44
+ } from "./chunk-P6SSWAKY.js";
45
+ import {
46
+ isDualContainedInManagedRoots
47
+ } from "./chunk-ALDTFNZ3.js";
48
+ import {
49
+ LabPathResolver,
50
+ TelemetryPathResolver
51
+ } from "./chunk-C3KCMAJP.js";
52
+ import {
53
+ resolveRunStateDir
54
+ } from "./chunk-AJN5Y5YZ.js";
55
+ import {
56
+ findProjectRoot
57
+ } from "./chunk-35J4NE6S.js";
58
+ import {
59
+ getDataDir,
60
+ getStableRepoIdentity,
61
+ resolveWorktreeBase
62
+ } from "./chunk-56WPYDJH.js";
63
+ import {
64
+ visibleWorktreeBase
65
+ } from "./chunk-RSYTSBOO.js";
66
+ import {
67
+ getRuntimeEnv,
68
+ resolveBuildDirFromContext
69
+ } from "./chunk-7VRJHTGZ.js";
70
+
71
+ // src/core/cleanup/stale-cleanup-orchestrator.ts
72
+ import { appendFile, mkdir, readdir as readdir4, readFile as readFile6, stat as stat7, writeFile as writeFile2 } from "fs/promises";
73
+ import { tmpdir } from "os";
74
+ import { basename, dirname as dirname3, resolve as resolve5 } from "path";
75
+ import { execa } from "execa";
76
+
77
+ // src/telemetry/cleanup.ts
78
+ import * as fs from "fs";
79
+ import { readFile, rename, writeFile } from "fs/promises";
80
+ import * as path from "path";
81
+ import { promisify } from "util";
82
+ var stat2 = promisify(fs.stat);
83
+ var readdir2 = promisify(fs.readdir);
84
+ var unlink2 = promisify(fs.unlink);
85
+ var rm2 = promisify(fs.rm);
86
+ function cleanupActionLabel(action, dryRun) {
87
+ if (!dryRun) {
88
+ return action;
89
+ }
90
+ switch (action) {
91
+ case "DELETED":
92
+ return "WOULD DELETE";
93
+ case "ARCHIVED":
94
+ return "WOULD ARCHIVE";
95
+ case "SIZE-CAP":
96
+ return "WOULD SIZE-CAP";
97
+ default:
98
+ return `WOULD ${action}`;
99
+ }
100
+ }
101
+ async function getPathSize(filePath, stats) {
102
+ const entryStats = stats ?? await stat2(filePath);
103
+ if (!entryStats.isDirectory()) {
104
+ return entryStats.size;
105
+ }
106
+ let total = 0;
107
+ const entries = await readdir2(filePath, { withFileTypes: true });
108
+ for (const entry of entries) {
109
+ const childPath = path.join(filePath, entry.name);
110
+ if (entry.isDirectory()) {
111
+ total += await getPathSize(childPath);
112
+ } else if (entry.isFile()) {
113
+ const childStats = await stat2(childPath);
114
+ total += childStats.size;
115
+ }
116
+ }
117
+ return total;
118
+ }
119
+ function monthKeyFromBackupName(name) {
120
+ const isoMatch = name.match(/^(\d{4})-(\d{2})/);
121
+ if (isoMatch?.[1] && isoMatch[2]) {
122
+ return `${isoMatch[1]}${isoMatch[2]}`;
123
+ }
124
+ const compactMatch = name.match(/(\d{6})/);
125
+ if (compactMatch?.[1]) {
126
+ return compactMatch[1];
127
+ }
128
+ return "unknown";
129
+ }
130
+ var TelemetryCleanup = class _TelemetryCleanup {
131
+ config;
132
+ telemetryDir;
133
+ dbLayout;
134
+ constructor(config, telemetryDir) {
135
+ this.config = config;
136
+ const legacyRoot = getRuntimeEnv("BUILD_TELEMETRY_DIR");
137
+ const buildDir = legacyRoot || resolveBuildDirFromContext();
138
+ this.telemetryDir = telemetryDir || path.join(buildDir, "telemetry");
139
+ this.dbLayout = telemetryDir || legacyRoot ? { telemetryDir: this.telemetryDir, dbDir: path.join(this.telemetryDir, "db") } : TelemetryPathResolver.getInstance().resolveDbLayout(buildDir);
140
+ }
141
+ async cleanup(options = {}) {
142
+ const result = {
143
+ deletedBackups: 0,
144
+ deletedLogs: 0,
145
+ deletedSignalFiles: 0,
146
+ deletedMergeLedgerLines: 0,
147
+ freedSpaceBytes: 0,
148
+ vacuumExecuted: false
149
+ };
150
+ try {
151
+ const backupsDir = path.join(this.telemetryDir, "backups");
152
+ if (fs.existsSync(backupsDir)) {
153
+ const backupResult = await this.cleanupBackups(backupsDir, options);
154
+ result.deletedBackups = backupResult.deleted;
155
+ result.freedSpaceBytes += backupResult.freedBytes;
156
+ }
157
+ const logsDir = path.join(this.dbLayout.telemetryDir, "logs");
158
+ if (fs.existsSync(logsDir)) {
159
+ const effectiveLogsDays = options.logsDaysOverride ?? this.config.logs_days;
160
+ const logResult = await this.cleanupLogs(logsDir, effectiveLogsDays, options);
161
+ result.deletedLogs = logResult.deleted;
162
+ result.freedSpaceBytes += logResult.freedBytes;
163
+ }
164
+ const signalDirs = /* @__PURE__ */ new Set([this.telemetryDir]);
165
+ if (!LabPathResolver.getInstance().isLabMode()) {
166
+ signalDirs.add(
167
+ TelemetryPathResolver.getInstance().resolveTelemetryDir(path.dirname(this.telemetryDir))
168
+ );
169
+ }
170
+ for (const signalDir of signalDirs) {
171
+ const signalResult = await this.cleanupSignalFiles(
172
+ signalDir,
173
+ this.config.signal_files_retention_days,
174
+ options
175
+ );
176
+ result.deletedSignalFiles += signalResult.deleted;
177
+ result.freedSpaceBytes += signalResult.freedBytes;
178
+ }
179
+ const mergeLedgerResult = await this.cleanupMergeLedger(
180
+ this.telemetryDir,
181
+ this.config.signal_files_retention_days,
182
+ options
183
+ );
184
+ result.deletedMergeLedgerLines = mergeLedgerResult.deleted;
185
+ result.freedSpaceBytes += mergeLedgerResult.freedBytes;
186
+ const effectiveVacuum = options.vacuumOverride ?? this.config.vacuum_on_cleanup;
187
+ if (effectiveVacuum && !options.dryRun) {
188
+ const vacuumResult = await this.vacuumDatabase(options);
189
+ result.vacuumExecuted = vacuumResult;
190
+ }
191
+ } catch (error) {
192
+ console.error("Cleanup error:", error);
193
+ throw error;
194
+ }
195
+ return result;
196
+ }
197
+ async cleanupBackups(backupsDir, options) {
198
+ const files = await readdir2(backupsDir);
199
+ const now = Date.now();
200
+ const retentionMs = this.config.backups_days * 24 * 60 * 60 * 1e3;
201
+ const maxBackupBytes = this.config.backups_max_bytes ?? Number.POSITIVE_INFINITY;
202
+ const filesByMonth = /* @__PURE__ */ new Map();
203
+ const entries = [];
204
+ const deletedFiles = /* @__PURE__ */ new Set();
205
+ let deleted = 0;
206
+ let freedBytes = 0;
207
+ const deleteEntry = async (entry, label) => {
208
+ if (deletedFiles.has(entry.name)) return;
209
+ if (!options.dryRun) {
210
+ if (entry.isDirectory) {
211
+ await rm2(entry.path, { recursive: true, force: true });
212
+ } else {
213
+ await unlink2(entry.path);
214
+ }
215
+ }
216
+ deletedFiles.add(entry.name);
217
+ deleted++;
218
+ freedBytes += entry.size;
219
+ if (options.verbose) {
220
+ console.log(
221
+ ` [${cleanupActionLabel(label, options.dryRun ?? false)}] ${entry.name} (${formatBytes(entry.size)})`
222
+ );
223
+ }
224
+ };
225
+ for (const file of files) {
226
+ const filePath = path.join(backupsDir, file);
227
+ const stats = await stat2(filePath);
228
+ const size = await getPathSize(filePath, stats);
229
+ const month = monthKeyFromBackupName(file);
230
+ const entry = {
231
+ name: file,
232
+ path: filePath,
233
+ month,
234
+ mtime: stats.mtimeMs,
235
+ size,
236
+ isDirectory: stats.isDirectory()
237
+ };
238
+ entries.push(entry);
239
+ if (!filesByMonth.has(month)) {
240
+ filesByMonth.set(month, []);
241
+ }
242
+ filesByMonth.get(month)?.push(entry);
243
+ }
244
+ const monthsToKeep = Array.from(filesByMonth.keys()).sort().reverse().slice(0, this.config.backups_monthly_count);
245
+ for (const [month, monthFiles] of filesByMonth) {
246
+ const newestMonthlyArchive = [...monthFiles].sort((a, b) => b.mtime - a.mtime)[0];
247
+ for (const entry of monthFiles) {
248
+ const ageMs = now - entry.mtime;
249
+ if (ageMs <= retentionMs) continue;
250
+ if (!monthsToKeep.includes(month)) {
251
+ await deleteEntry(entry, "DELETED");
252
+ continue;
253
+ }
254
+ if (entry.name !== newestMonthlyArchive?.name) {
255
+ await deleteEntry(entry, "ARCHIVED");
256
+ }
257
+ }
258
+ }
259
+ const remaining = entries.filter((entry) => !deletedFiles.has(entry.name));
260
+ let remainingBytes = remaining.reduce((sum, entry) => sum + entry.size, 0);
261
+ const oldestFirst = [...remaining].sort((a, b) => a.mtime - b.mtime);
262
+ while (remainingBytes > maxBackupBytes && oldestFirst.length > 1) {
263
+ const entry = oldestFirst.shift();
264
+ if (!entry) break;
265
+ await deleteEntry(entry, "SIZE-CAP");
266
+ remainingBytes -= entry.size;
267
+ }
268
+ return { deleted, freedBytes };
269
+ }
270
+ async cleanupLogs(logsDir, logsDays, options) {
271
+ const files = await readdir2(logsDir);
272
+ const now = Date.now();
273
+ const retentionMs = logsDays * 24 * 60 * 60 * 1e3;
274
+ let deleted = 0;
275
+ let freedBytes = 0;
276
+ for (const file of files) {
277
+ const filePath = path.join(logsDir, file);
278
+ let stats;
279
+ try {
280
+ stats = await stat2(filePath);
281
+ } catch (error) {
282
+ const err = error;
283
+ if (err.code === "ENOENT") {
284
+ continue;
285
+ }
286
+ throw error;
287
+ }
288
+ const ageMs = now - stats.mtimeMs;
289
+ if (ageMs > retentionMs) {
290
+ let deleteStats = stats;
291
+ let freedBytesForEntry = await getPathSize(filePath, deleteStats);
292
+ if (!options.dryRun) {
293
+ try {
294
+ const latest = await stat2(filePath);
295
+ if (latest.mtimeMs !== stats.mtimeMs || latest.size !== stats.size) {
296
+ if (options.verbose) {
297
+ console.log(` [SKIP] ${file} changed during cleanup`);
298
+ }
299
+ continue;
300
+ }
301
+ deleteStats = latest;
302
+ freedBytesForEntry = await getPathSize(filePath, deleteStats);
303
+ } catch (error) {
304
+ const err = error;
305
+ if (err.code === "ENOENT") {
306
+ continue;
307
+ }
308
+ throw error;
309
+ }
310
+ if (deleteStats.isDirectory()) {
311
+ await rm2(filePath, { recursive: true, force: true });
312
+ } else {
313
+ await unlink2(filePath);
314
+ }
315
+ }
316
+ deleted++;
317
+ freedBytes += freedBytesForEntry;
318
+ if (options.verbose) {
319
+ console.log(
320
+ ` [${cleanupActionLabel("DELETED", options.dryRun ?? false)}] ${file} (${formatBytes(freedBytesForEntry)})`
321
+ );
322
+ }
323
+ }
324
+ }
325
+ return { deleted, freedBytes };
326
+ }
327
+ async cleanupSignalFiles(telemetryDir, retentionDays, options) {
328
+ let deleted = 0;
329
+ let freedBytes = 0;
330
+ if (!fs.existsSync(telemetryDir)) {
331
+ return { deleted, freedBytes };
332
+ }
333
+ let files;
334
+ try {
335
+ files = await readdir2(telemetryDir);
336
+ } catch {
337
+ return { deleted, freedBytes };
338
+ }
339
+ const now = Date.now();
340
+ const retentionMs = retentionDays * 24 * 60 * 60 * 1e3;
341
+ for (const file of files) {
342
+ if (!/^signals-.*\.jsonl$/.test(file)) continue;
343
+ const filePath = path.join(telemetryDir, file);
344
+ let stats;
345
+ try {
346
+ stats = await stat2(filePath);
347
+ } catch (error) {
348
+ const err = error;
349
+ if (err.code === "ENOENT") continue;
350
+ throw error;
351
+ }
352
+ if (!stats.isFile()) continue;
353
+ const ageMs = now - stats.mtimeMs;
354
+ if (ageMs <= retentionMs) continue;
355
+ if (!options.dryRun) {
356
+ try {
357
+ const latest = await stat2(filePath);
358
+ if (latest.mtimeMs !== stats.mtimeMs || latest.size !== stats.size) {
359
+ if (options.verbose) {
360
+ console.log(` [SKIP] ${file} changed during cleanup`);
361
+ }
362
+ continue;
363
+ }
364
+ } catch (error) {
365
+ const err = error;
366
+ if (err.code === "ENOENT") continue;
367
+ throw error;
368
+ }
369
+ await unlink2(filePath);
370
+ }
371
+ deleted++;
372
+ freedBytes += stats.size;
373
+ if (options.verbose) {
374
+ console.log(
375
+ ` [${cleanupActionLabel("DELETED", options.dryRun ?? false)}] ${file} (${formatBytes(stats.size)})`
376
+ );
377
+ }
378
+ }
379
+ return { deleted, freedBytes };
380
+ }
381
+ async cleanupMergeLedger(telemetryDir, retentionDays, options) {
382
+ let deleted = 0;
383
+ let freedBytes = 0;
384
+ const ledgerPath = path.join(telemetryDir, "merge-ledger.jsonl");
385
+ if (!fs.existsSync(ledgerPath)) {
386
+ return { deleted, freedBytes };
387
+ }
388
+ let stats;
389
+ try {
390
+ stats = await stat2(ledgerPath);
391
+ } catch (error) {
392
+ const err = error;
393
+ if (err.code === "ENOENT") {
394
+ return { deleted, freedBytes };
395
+ }
396
+ throw error;
397
+ }
398
+ if (!stats.isFile()) {
399
+ return { deleted, freedBytes };
400
+ }
401
+ const originalContent = await readFile(ledgerPath, "utf8");
402
+ const now = Date.now();
403
+ const retentionMs = retentionDays * 24 * 60 * 60 * 1e3;
404
+ const keptLines = [];
405
+ for (const line of originalContent.split("\n")) {
406
+ const trimmed = line.trim();
407
+ if (!trimmed) {
408
+ continue;
409
+ }
410
+ try {
411
+ const record = JSON.parse(trimmed);
412
+ const mergedAtMs = record.mergedAt ? Date.parse(record.mergedAt) : Number.NaN;
413
+ if (!Number.isFinite(mergedAtMs) || now - mergedAtMs <= retentionMs) {
414
+ keptLines.push(trimmed);
415
+ continue;
416
+ }
417
+ deleted++;
418
+ } catch {
419
+ keptLines.push(trimmed);
420
+ }
421
+ }
422
+ if (deleted === 0) {
423
+ return { deleted, freedBytes };
424
+ }
425
+ const newContent = keptLines.length > 0 ? `${keptLines.join("\n")}
426
+ ` : "";
427
+ freedBytes = Math.max(0, stats.size - Buffer.byteLength(newContent, "utf8"));
428
+ if (!options.dryRun) {
429
+ if (newContent) {
430
+ const tmpPath = `${ledgerPath}.${process.pid}.tmp`;
431
+ try {
432
+ await writeFile(tmpPath, newContent, "utf8");
433
+ await rename(tmpPath, ledgerPath);
434
+ } catch (writeError) {
435
+ try {
436
+ await unlink2(tmpPath);
437
+ } catch {
438
+ }
439
+ throw writeError;
440
+ }
441
+ } else {
442
+ await unlink2(ledgerPath);
443
+ }
444
+ }
445
+ if (options.verbose && deleted > 0) {
446
+ console.log(` [TRIMMED] merge-ledger.jsonl (${deleted} stale lines)`);
447
+ }
448
+ return { deleted, freedBytes };
449
+ }
450
+ async vacuumDatabase(options) {
451
+ try {
452
+ const sqlite3 = await import("better-sqlite3").catch(() => null);
453
+ if (!sqlite3) {
454
+ if (options.verbose) {
455
+ console.log(" [SKIP] SQLite not available for VACUUM");
456
+ }
457
+ return false;
458
+ }
459
+ const dbPaths = [
460
+ { label: "variants.db", path: path.join(this.dbLayout.dbDir, "variants.db") },
461
+ { label: "validations.db", path: path.join(this.dbLayout.dbDir, "validations.db") },
462
+ { label: "invocations.db", path: path.join(this.dbLayout.telemetryDir, "invocations.db") }
463
+ ];
464
+ const existing = dbPaths.filter((entry) => fs.existsSync(entry.path));
465
+ if (existing.length === 0) {
466
+ if (options.verbose) {
467
+ console.log(" [SKIP] No telemetry databases found to VACUUM");
468
+ }
469
+ return false;
470
+ }
471
+ let vacuumedAny = false;
472
+ for (const entry of existing) {
473
+ try {
474
+ const db = sqlite3.default(entry.path);
475
+ db.exec("VACUUM");
476
+ db.close();
477
+ vacuumedAny = true;
478
+ if (options.verbose) {
479
+ console.log(` [VACUUMED] ${entry.label}`);
480
+ }
481
+ } catch (error) {
482
+ if (options.verbose) {
483
+ console.error(` [ERROR] VACUUM failed for ${entry.label}:`, error);
484
+ }
485
+ }
486
+ }
487
+ return vacuumedAny;
488
+ } catch (error) {
489
+ if (options.verbose) {
490
+ console.error(" [ERROR] VACUUM operation failed:", error);
491
+ }
492
+ return false;
493
+ }
494
+ }
495
+ static async fromConfig(configPath, telemetryDir) {
496
+ const resolved = resolveRetentionConfig({ configFilePath: configPath ?? void 0 });
497
+ const config = {
498
+ backups_days: resolved.backupsDays,
499
+ backups_monthly_count: resolved.backupsMonthlyCount,
500
+ backups_max_bytes: resolved.backupsMaxBytes,
501
+ logs_days: resolved.logsDays,
502
+ vacuum_on_cleanup: resolved.vacuumOnCleanup,
503
+ signal_files_retention_days: resolved.signalFilesRetentionDays
504
+ };
505
+ return new _TelemetryCleanup(config, telemetryDir);
506
+ }
507
+ };
508
+
509
+ // src/core/cleanup/background-state-cleanup.ts
510
+ import { opendir, readFile as readFile2, stat as stat3 } from "fs/promises";
511
+ import { resolve } from "path";
512
+ function parseIsoDateMs(value) {
513
+ if (!value) return null;
514
+ const ms = new Date(value).getTime();
515
+ if (!Number.isFinite(ms)) return null;
516
+ return ms;
517
+ }
518
+ function isBackgroundHandle(value) {
519
+ return typeof value.taskId === "string" && value.taskId.trim().length > 0 && typeof value.status === "string" && value.status.trim().length > 0;
520
+ }
521
+ function isActiveBackgroundRun(handle) {
522
+ return handle.status === "running";
523
+ }
524
+ function isLivePid(pid) {
525
+ if (typeof pid !== "number" || !Number.isInteger(pid) || pid <= 0) return false;
526
+ try {
527
+ process.kill(pid, 0);
528
+ return true;
529
+ } catch (error) {
530
+ const code = error.code;
531
+ if (code === "ESRCH") return false;
532
+ return "unknown";
533
+ }
534
+ }
535
+ async function cleanupBackgroundStateFiles(options) {
536
+ const now = options.now ?? /* @__PURE__ */ new Date();
537
+ const stateDir = resolveRunStateDir(resolveCleanupBuildDir(options.cwd));
538
+ const rootDir = resolve(stateDir, "background");
539
+ const archiveDir = options.archiveDir ?? resolve(stateDir, "background-archive");
540
+ const maxAgeMs = options.maxAgeDays * 24 * 60 * 60 * 1e3;
541
+ const report = {
542
+ mode: options.dryRun ? "dry-run" : "executed",
543
+ rootDir,
544
+ archiveDir,
545
+ scanned: 0,
546
+ eligible: 0,
547
+ archived: 0,
548
+ kept: 0,
549
+ freedBytes: 0,
550
+ keptBecause: {},
551
+ archivedBecause: {},
552
+ items: [],
553
+ errors: []
554
+ };
555
+ const bump = (map, key) => {
556
+ map[key] = (map[key] ?? 0) + 1;
557
+ };
558
+ try {
559
+ const dir = await opendir(rootDir);
560
+ try {
561
+ for await (const d of dir) {
562
+ if (!d.isFile()) continue;
563
+ if (!d.name.endsWith(".json")) continue;
564
+ const fullPath = resolve(rootDir, d.name);
565
+ report.scanned++;
566
+ let sizeBytes = 0;
567
+ let timestampMs = 0;
568
+ let archiveDeadActiveRun = false;
569
+ try {
570
+ const st = await stat3(fullPath);
571
+ sizeBytes = st.size;
572
+ timestampMs = st.mtimeMs;
573
+ const raw = await readFile2(fullPath, "utf8");
574
+ let parsed;
575
+ try {
576
+ parsed = parseJsonWithContext(
577
+ raw,
578
+ `Background state (${d.name})`
579
+ );
580
+ } catch {
581
+ const ageDays2 = Math.floor((now.getTime() - timestampMs) / (24 * 60 * 60 * 1e3));
582
+ bump(report.keptBecause, "invalid_json");
583
+ report.kept++;
584
+ report.items.push({
585
+ path: fullPath,
586
+ sizeBytes,
587
+ ageDays: ageDays2,
588
+ decision: "keep",
589
+ reason: "invalid_json"
590
+ });
591
+ continue;
592
+ }
593
+ if (!isBackgroundHandle(parsed)) {
594
+ const ageDays2 = Math.floor((now.getTime() - timestampMs) / (24 * 60 * 60 * 1e3));
595
+ bump(report.keptBecause, "not_background_handle");
596
+ report.kept++;
597
+ report.items.push({
598
+ path: fullPath,
599
+ sizeBytes,
600
+ ageDays: ageDays2,
601
+ decision: "keep",
602
+ reason: "not_background_handle"
603
+ });
604
+ continue;
605
+ }
606
+ timestampMs = parseIsoDateMs(parsed.updatedAt) ?? parseIsoDateMs(parsed.startedAt) ?? parseIsoDateMs(parsed.createdAt) ?? timestampMs;
607
+ if (isActiveBackgroundRun(parsed)) {
608
+ const ageDays2 = Math.floor((now.getTime() - timestampMs) / (24 * 60 * 60 * 1e3));
609
+ const live = isLivePid(parsed.pid);
610
+ if (live === true || live === "unknown") {
611
+ bump(report.keptBecause, "active_run");
612
+ report.kept++;
613
+ report.items.push({
614
+ path: fullPath,
615
+ sizeBytes,
616
+ ageDays: ageDays2,
617
+ decision: "keep",
618
+ reason: "active_run"
619
+ });
620
+ continue;
621
+ }
622
+ archiveDeadActiveRun = true;
623
+ }
624
+ } catch (error) {
625
+ const msg = error instanceof Error ? error.message : String(error);
626
+ report.errors.push(`${d.name}: stat/read failed: ${msg}`);
627
+ bump(report.keptBecause, "read_error");
628
+ report.kept++;
629
+ report.items.push({
630
+ path: fullPath,
631
+ sizeBytes: 0,
632
+ ageDays: 0,
633
+ decision: "keep",
634
+ reason: "read_error"
635
+ });
636
+ continue;
637
+ }
638
+ const ageMs = now.getTime() - timestampMs;
639
+ const ageDays = Math.floor(ageMs / (24 * 60 * 60 * 1e3));
640
+ if (ageMs <= maxAgeMs && !archiveDeadActiveRun) {
641
+ bump(report.keptBecause, "too_recent");
642
+ report.kept++;
643
+ report.items.push({
644
+ path: fullPath,
645
+ sizeBytes,
646
+ ageDays,
647
+ decision: "keep",
648
+ reason: "too_recent"
649
+ });
650
+ continue;
651
+ }
652
+ report.eligible++;
653
+ const item = {
654
+ path: fullPath,
655
+ sizeBytes,
656
+ ageDays,
657
+ decision: "archive",
658
+ reason: "stale_background"
659
+ };
660
+ if (options.dryRun) {
661
+ bump(report.archivedBecause, "stale_background");
662
+ report.freedBytes += sizeBytes;
663
+ } else {
664
+ try {
665
+ item.archivePath = await moveToMonthlyArchive(
666
+ fullPath,
667
+ archiveDir,
668
+ d.name,
669
+ timestampMs
670
+ );
671
+ report.archived++;
672
+ bump(report.archivedBecause, "stale_background");
673
+ report.freedBytes += sizeBytes;
674
+ } catch (error) {
675
+ const msg = error instanceof Error ? error.message : String(error);
676
+ report.errors.push(`${d.name}: archive failed: ${msg}`);
677
+ item.decision = "keep";
678
+ item.reason = "read_error";
679
+ report.kept++;
680
+ bump(report.keptBecause, "read_error");
681
+ report.items.push(item);
682
+ continue;
683
+ }
684
+ }
685
+ report.items.push(item);
686
+ }
687
+ } finally {
688
+ await dir.close().catch(() => {
689
+ });
690
+ }
691
+ } catch {
692
+ return report;
693
+ }
694
+ if (options.dryRun) {
695
+ report.archived = report.eligible;
696
+ }
697
+ if (!options.verbose) {
698
+ report.items = report.items.slice(0, 200);
699
+ }
700
+ return report;
701
+ }
702
+
703
+ // src/core/cleanup/flywheel-tmp-cleanup.ts
704
+ import { opendir as opendir2, readFile as readFile3, stat as stat4 } from "fs/promises";
705
+ import { resolve as resolve2 } from "path";
706
+ var RESERVED_ENTRIES = /* @__PURE__ */ new Set(["legacy-archive", "detached", "cache"]);
707
+ async function collectDirectoryInfo(dir) {
708
+ let sizeBytes = 0;
709
+ let newestMtimeMs = null;
710
+ async function walk(current) {
711
+ const entries = await opendir2(current);
712
+ try {
713
+ for await (const entry of entries) {
714
+ const fullPath = resolve2(current, entry.name);
715
+ if (entry.isDirectory()) {
716
+ await walk(fullPath);
717
+ continue;
718
+ }
719
+ if (!entry.isFile()) continue;
720
+ const fileStats = await stat4(fullPath);
721
+ sizeBytes += fileStats.size;
722
+ newestMtimeMs = newestMtimeMs === null ? fileStats.mtimeMs : Math.max(newestMtimeMs, fileStats.mtimeMs);
723
+ }
724
+ } finally {
725
+ await entries.close().catch(() => {
726
+ });
727
+ }
728
+ }
729
+ await walk(dir);
730
+ if (newestMtimeMs === null) {
731
+ const rootStats = await stat4(dir);
732
+ newestMtimeMs = rootStats.mtimeMs;
733
+ }
734
+ return { sizeBytes, newestMtimeMs };
735
+ }
736
+ async function readWorkflowManifest(workflowDir) {
737
+ const manifestPath = resolve2(workflowDir, "manifest.json");
738
+ try {
739
+ const raw = await readFile3(manifestPath, "utf8");
740
+ const manifest = parseJsonWithContext(
741
+ raw,
742
+ `Flywheel manifest (${manifestPath})`
743
+ );
744
+ return { manifest };
745
+ } catch (error) {
746
+ const msg = error instanceof Error ? error.message : String(error);
747
+ return { manifest: null, readError: msg };
748
+ }
749
+ }
750
+ function isActiveWorkflow(manifest, now) {
751
+ if (getWorkflowExecutionStatus({ manifest, now, branchExists: true }) === "running") {
752
+ return true;
753
+ }
754
+ if (manifest.appliedAt || manifest.stagedAt || manifest.applyError) {
755
+ return false;
756
+ }
757
+ const lastActivityMs = getWorkflowLastActivityMs(manifest);
758
+ if (lastActivityMs === void 0) {
759
+ return false;
760
+ }
761
+ return now - lastActivityMs <= WORKFLOW_HEARTBEAT_STALE_AFTER_MS;
762
+ }
763
+ async function cleanupFlywheelTmpEntries(options) {
764
+ const now = options.now ?? /* @__PURE__ */ new Date();
765
+ const nowMs = now.getTime();
766
+ const rootDir = resolve2(resolveCleanupBuildDir(options.cwd), "tmp/flywheel");
767
+ const archiveDir = options.archiveDir ?? resolve2(rootDir, "legacy-archive");
768
+ const maxAgeMs = options.maxAgeDays * 24 * 60 * 60 * 1e3;
769
+ const report = {
770
+ mode: options.dryRun ? "dry-run" : "executed",
771
+ rootDir,
772
+ archiveDir,
773
+ scanned: 0,
774
+ eligible: 0,
775
+ archived: 0,
776
+ kept: 0,
777
+ freedBytes: 0,
778
+ keptBecause: {},
779
+ archivedBecause: {},
780
+ items: [],
781
+ errors: []
782
+ };
783
+ const bump = (map, key) => {
784
+ map[key] = (map[key] ?? 0) + 1;
785
+ };
786
+ try {
787
+ const dir = await opendir2(rootDir);
788
+ try {
789
+ for await (const d of dir) {
790
+ if (!d.isDirectory()) continue;
791
+ const fullPath = resolve2(rootDir, d.name);
792
+ report.scanned++;
793
+ if (RESERVED_ENTRIES.has(d.name)) {
794
+ bump(report.keptBecause, "reserved_entry");
795
+ report.kept++;
796
+ report.items.push({
797
+ path: fullPath,
798
+ sizeBytes: 0,
799
+ ageDays: 0,
800
+ decision: "keep",
801
+ reason: "reserved_entry"
802
+ });
803
+ continue;
804
+ }
805
+ let sizeBytes = 0;
806
+ let timestampMs = 0;
807
+ try {
808
+ const info = await collectDirectoryInfo(fullPath);
809
+ sizeBytes = info.sizeBytes;
810
+ timestampMs = info.newestMtimeMs ?? 0;
811
+ const { manifest } = await readWorkflowManifest(fullPath);
812
+ if (manifest && isActiveWorkflow(manifest, nowMs)) {
813
+ bump(report.keptBecause, "active_run");
814
+ report.kept++;
815
+ report.items.push({
816
+ path: fullPath,
817
+ sizeBytes,
818
+ ageDays: Math.floor((nowMs - timestampMs) / (24 * 60 * 60 * 1e3)),
819
+ decision: "keep",
820
+ reason: "active_run"
821
+ });
822
+ continue;
823
+ }
824
+ if (!manifest) {
825
+ bump(report.keptBecause, "not_workflow_dir");
826
+ report.kept++;
827
+ report.items.push({
828
+ path: fullPath,
829
+ sizeBytes,
830
+ ageDays: Math.floor((nowMs - timestampMs) / (24 * 60 * 60 * 1e3)),
831
+ decision: "keep",
832
+ reason: "not_workflow_dir"
833
+ });
834
+ continue;
835
+ }
836
+ } catch (error) {
837
+ const msg = error instanceof Error ? error.message : String(error);
838
+ report.errors.push(`${d.name}: stat/read failed: ${msg}`);
839
+ bump(report.keptBecause, "read_error");
840
+ report.kept++;
841
+ report.items.push({
842
+ path: fullPath,
843
+ sizeBytes: 0,
844
+ ageDays: 0,
845
+ decision: "keep",
846
+ reason: "read_error"
847
+ });
848
+ continue;
849
+ }
850
+ const ageMs = nowMs - timestampMs;
851
+ const ageDays = Math.floor(ageMs / (24 * 60 * 60 * 1e3));
852
+ if (ageMs <= maxAgeMs) {
853
+ bump(report.keptBecause, "too_recent");
854
+ report.kept++;
855
+ report.items.push({
856
+ path: fullPath,
857
+ sizeBytes,
858
+ ageDays,
859
+ decision: "keep",
860
+ reason: "too_recent"
861
+ });
862
+ continue;
863
+ }
864
+ report.eligible++;
865
+ const item = {
866
+ path: fullPath,
867
+ sizeBytes,
868
+ ageDays,
869
+ decision: "archive",
870
+ reason: "stale_workflow"
871
+ };
872
+ if (options.dryRun) {
873
+ bump(report.archivedBecause, "stale_workflow");
874
+ report.freedBytes += sizeBytes;
875
+ } else {
876
+ try {
877
+ item.archivePath = await moveToMonthlyArchive(
878
+ fullPath,
879
+ archiveDir,
880
+ d.name,
881
+ timestampMs
882
+ );
883
+ report.archived++;
884
+ bump(report.archivedBecause, "stale_workflow");
885
+ report.freedBytes += sizeBytes;
886
+ } catch (error) {
887
+ const msg = error instanceof Error ? error.message : String(error);
888
+ report.errors.push(`${d.name}: archive failed: ${msg}`);
889
+ item.decision = "keep";
890
+ item.reason = "read_error";
891
+ report.kept++;
892
+ bump(report.keptBecause, "read_error");
893
+ report.items.push(item);
894
+ continue;
895
+ }
896
+ }
897
+ report.items.push(item);
898
+ }
899
+ } finally {
900
+ await dir.close().catch(() => {
901
+ });
902
+ }
903
+ } catch {
904
+ return report;
905
+ }
906
+ if (options.dryRun) {
907
+ report.archived = report.eligible;
908
+ }
909
+ if (!options.verbose) {
910
+ report.items = report.items.slice(0, 200);
911
+ }
912
+ return report;
913
+ }
914
+
915
+ // src/core/cleanup/tui-session-state-cleanup.ts
916
+ import { opendir as opendir3, readFile as readFile4, rm as rm3, stat as stat5 } from "fs/promises";
917
+ import { resolve as resolve3 } from "path";
918
+ function parseIsoDateMs2(value) {
919
+ if (!value) return null;
920
+ const ms = new Date(value).getTime();
921
+ if (!Number.isFinite(ms)) return null;
922
+ return ms;
923
+ }
924
+ function isTuiSession(value) {
925
+ return value.version === 1 && typeof value.sessionId === "string" && value.sessionId.trim().length > 0 && Array.isArray(value.turns);
926
+ }
927
+ async function cleanupTuiSessionStateFiles(options) {
928
+ const now = options.now ?? /* @__PURE__ */ new Date();
929
+ const rootDir = resolve3(resolveRunStateDir(resolveCleanupBuildDir(options.cwd)), "tui-sessions");
930
+ const maxAgeMs = options.maxAgeDays * 24 * 60 * 60 * 1e3;
931
+ const report = {
932
+ mode: options.dryRun ? "dry-run" : "executed",
933
+ rootDir,
934
+ scanned: 0,
935
+ eligible: 0,
936
+ deleted: 0,
937
+ kept: 0,
938
+ freedBytes: 0,
939
+ keptBecause: {},
940
+ deletedBecause: {},
941
+ items: [],
942
+ errors: []
943
+ };
944
+ const bump = (map, key) => {
945
+ map[key] = (map[key] ?? 0) + 1;
946
+ };
947
+ try {
948
+ const dir = await opendir3(rootDir);
949
+ try {
950
+ for await (const d of dir) {
951
+ if (!d.isFile()) continue;
952
+ if (!d.name.endsWith(".json")) continue;
953
+ const fullPath = resolve3(rootDir, d.name);
954
+ report.scanned++;
955
+ let sizeBytes = 0;
956
+ let timestampMs = 0;
957
+ try {
958
+ const st = await stat5(fullPath);
959
+ sizeBytes = st.size;
960
+ timestampMs = st.mtimeMs;
961
+ const raw = await readFile4(fullPath, "utf8");
962
+ let parsed;
963
+ try {
964
+ parsed = parseJsonWithContext(raw, `TUI session state (${d.name})`);
965
+ } catch {
966
+ const ageDays2 = Math.floor((now.getTime() - timestampMs) / (24 * 60 * 60 * 1e3));
967
+ bump(report.keptBecause, "invalid_json");
968
+ report.kept++;
969
+ report.items.push({
970
+ path: fullPath,
971
+ sizeBytes,
972
+ ageDays: ageDays2,
973
+ decision: "keep",
974
+ reason: "invalid_json"
975
+ });
976
+ continue;
977
+ }
978
+ if (!isTuiSession(parsed)) {
979
+ const ageDays2 = Math.floor((now.getTime() - timestampMs) / (24 * 60 * 60 * 1e3));
980
+ bump(report.keptBecause, "not_tui_session");
981
+ report.kept++;
982
+ report.items.push({
983
+ path: fullPath,
984
+ sizeBytes,
985
+ ageDays: ageDays2,
986
+ decision: "keep",
987
+ reason: "not_tui_session"
988
+ });
989
+ continue;
990
+ }
991
+ timestampMs = parseIsoDateMs2(parsed.updatedAt) ?? parseIsoDateMs2(parsed.createdAt) ?? timestampMs;
992
+ } catch (error) {
993
+ const msg = error instanceof Error ? error.message : String(error);
994
+ report.errors.push(`${d.name}: stat/read failed: ${msg}`);
995
+ bump(report.keptBecause, "read_error");
996
+ report.kept++;
997
+ report.items.push({
998
+ path: fullPath,
999
+ sizeBytes: 0,
1000
+ ageDays: 0,
1001
+ decision: "keep",
1002
+ reason: "read_error"
1003
+ });
1004
+ continue;
1005
+ }
1006
+ const ageMs = now.getTime() - timestampMs;
1007
+ const ageDays = Math.floor(ageMs / (24 * 60 * 60 * 1e3));
1008
+ if (ageMs <= maxAgeMs) {
1009
+ bump(report.keptBecause, "too_recent");
1010
+ report.kept++;
1011
+ report.items.push({
1012
+ path: fullPath,
1013
+ sizeBytes,
1014
+ ageDays,
1015
+ decision: "keep",
1016
+ reason: "too_recent"
1017
+ });
1018
+ continue;
1019
+ }
1020
+ report.eligible++;
1021
+ if (options.dryRun) {
1022
+ bump(report.deletedBecause, "stale_session");
1023
+ report.freedBytes += sizeBytes;
1024
+ } else {
1025
+ try {
1026
+ await rm3(fullPath, { force: true });
1027
+ report.deleted++;
1028
+ bump(report.deletedBecause, "stale_session");
1029
+ report.freedBytes += sizeBytes;
1030
+ } catch (error) {
1031
+ const msg = error instanceof Error ? error.message : String(error);
1032
+ report.errors.push(`${d.name}: delete failed: ${msg}`);
1033
+ report.kept++;
1034
+ bump(report.keptBecause, "read_error");
1035
+ continue;
1036
+ }
1037
+ }
1038
+ report.items.push({
1039
+ path: fullPath,
1040
+ sizeBytes,
1041
+ ageDays,
1042
+ decision: "delete",
1043
+ reason: "stale_session"
1044
+ });
1045
+ }
1046
+ } finally {
1047
+ await dir.close().catch(() => {
1048
+ });
1049
+ }
1050
+ } catch {
1051
+ return report;
1052
+ }
1053
+ if (options.dryRun) {
1054
+ report.deleted = report.eligible;
1055
+ }
1056
+ if (!options.verbose) {
1057
+ report.items = report.items.slice(0, 200);
1058
+ }
1059
+ return report;
1060
+ }
1061
+
1062
+ // src/core/cleanup/user-data-cleanup.ts
1063
+ import { lstat, readdir as readdir3, rmdir, unlink as unlink3 } from "fs/promises";
1064
+ import * as path2 from "path";
1065
+ var DEFAULT_PROJECT_DATA_AGE_DAYS = 30;
1066
+ var MS_PER_DAY = 24 * 60 * 60 * 1e3;
1067
+ var REGISTRY_TEMP_MAX_AGE_MS = MS_PER_DAY;
1068
+ var PROJECT_ID_PATTERN = /^[0-9a-f]{12}$/;
1069
+ var REGISTRY_TEMP_PATTERN = /^processes\.json\.tmp\./;
1070
+ var GENERATED_EMPTY_FILES = /* @__PURE__ */ new Set(["initialization.lock", ".cleanup.lock"]);
1071
+ var MAX_ENTRIES_PER_PROJECT = 64;
1072
+ async function scanProjectDir(dir) {
1073
+ let newestMtimeMs = (await lstat(dir)).mtimeMs;
1074
+ let seen = 0;
1075
+ const dirs = [dir];
1076
+ const files = [];
1077
+ const notGenerated = { generatedOnly: false, dirs, files };
1078
+ const pending = [dir];
1079
+ while (pending.length > 0) {
1080
+ const current = pending.pop();
1081
+ const entries = await readdir3(current, { withFileTypes: true });
1082
+ for (const entry of entries) {
1083
+ seen += 1;
1084
+ if (seen > MAX_ENTRIES_PER_PROJECT) return { ...notGenerated, newestMtimeMs };
1085
+ const entryPath = path2.join(current, entry.name);
1086
+ if (entry.isDirectory() && !entry.name.endsWith(".lock")) {
1087
+ pending.push(entryPath);
1088
+ dirs.push(entryPath);
1089
+ continue;
1090
+ }
1091
+ if (entry.isFile() && GENERATED_EMPTY_FILES.has(entry.name)) {
1092
+ const stat8 = await lstat(entryPath);
1093
+ if (stat8.size === 0) {
1094
+ newestMtimeMs = Math.max(newestMtimeMs, stat8.mtimeMs);
1095
+ files.push(entryPath);
1096
+ continue;
1097
+ }
1098
+ }
1099
+ return { ...notGenerated, newestMtimeMs };
1100
+ }
1101
+ }
1102
+ return { generatedOnly: true, newestMtimeMs, dirs, files };
1103
+ }
1104
+ async function removeVerifiedSkeleton(scan, projectsDir) {
1105
+ const root = scan.dirs[0];
1106
+ if (path2.dirname(root) !== projectsDir || !isDualContainedInManagedRoots(root, [projectsDir])) {
1107
+ throw new Error(`Refusing to delete ${root}: not a project folder under ${projectsDir}`);
1108
+ }
1109
+ try {
1110
+ for (const file of scan.files) {
1111
+ const stat8 = await lstat(file);
1112
+ if (stat8.isFile() && stat8.size === 0) await unlink3(file);
1113
+ }
1114
+ for (const d of [...scan.dirs].reverse()) await rmdir(d);
1115
+ } catch (error) {
1116
+ const code = error.code;
1117
+ if (code === "ENOTEMPTY" || code === "ENOENT" || code === "EEXIST" || code === "ENOTDIR") {
1118
+ return false;
1119
+ }
1120
+ throw error;
1121
+ }
1122
+ return true;
1123
+ }
1124
+ function currentProjectId() {
1125
+ try {
1126
+ return getStableRepoIdentity(process.cwd());
1127
+ } catch {
1128
+ return void 0;
1129
+ }
1130
+ }
1131
+ async function cleanupGeneratedOnlyProjectDirs(options) {
1132
+ const projectsDir = path2.join(options.dataDir ?? getDataDir(), "projects");
1133
+ const cutoff = (options.now ?? Date.now()) - (options.maxAgeDays ?? DEFAULT_PROJECT_DATA_AGE_DAYS) * MS_PER_DAY;
1134
+ const keepId = currentProjectId();
1135
+ const result = {
1136
+ scanned: 0,
1137
+ candidates: [],
1138
+ removed: [],
1139
+ keptWithContent: 0,
1140
+ keptRecent: 0,
1141
+ errors: []
1142
+ };
1143
+ let names;
1144
+ try {
1145
+ names = await readdir3(projectsDir);
1146
+ } catch (error) {
1147
+ if (error.code === "ENOENT") return result;
1148
+ throw error;
1149
+ }
1150
+ for (const name of names) {
1151
+ if (!PROJECT_ID_PATTERN.test(name) || name === keepId) continue;
1152
+ const dir = path2.join(projectsDir, name);
1153
+ try {
1154
+ if (!(await lstat(dir)).isDirectory()) continue;
1155
+ result.scanned += 1;
1156
+ const scan = await scanProjectDir(dir);
1157
+ if (!scan.generatedOnly) {
1158
+ result.keptWithContent += 1;
1159
+ continue;
1160
+ }
1161
+ if (scan.newestMtimeMs >= cutoff) {
1162
+ result.keptRecent += 1;
1163
+ continue;
1164
+ }
1165
+ result.candidates.push(dir);
1166
+ if (options.dryRun) continue;
1167
+ if (await removeVerifiedSkeleton(scan, projectsDir)) {
1168
+ result.removed.push(dir);
1169
+ } else {
1170
+ result.keptWithContent += 1;
1171
+ }
1172
+ } catch (error) {
1173
+ result.errors.push({
1174
+ path: dir,
1175
+ error: error instanceof Error ? error.message : String(error)
1176
+ });
1177
+ }
1178
+ }
1179
+ return result;
1180
+ }
1181
+ async function cleanupStaleRegistryTempFiles(options) {
1182
+ const stateDir = options.stateDir ?? getProcessRegistryStateDirectory();
1183
+ const cutoff = (options.now ?? Date.now()) - REGISTRY_TEMP_MAX_AGE_MS;
1184
+ const result = { candidates: [], removed: 0 };
1185
+ let names;
1186
+ try {
1187
+ names = await readdir3(stateDir);
1188
+ } catch (error) {
1189
+ if (error.code === "ENOENT") return result;
1190
+ throw error;
1191
+ }
1192
+ for (const name of names) {
1193
+ if (!REGISTRY_TEMP_PATTERN.test(name)) continue;
1194
+ const filePath = path2.join(stateDir, name);
1195
+ try {
1196
+ const stat8 = await lstat(filePath);
1197
+ if (!stat8.isFile() || stat8.mtimeMs >= cutoff) continue;
1198
+ result.candidates.push(filePath);
1199
+ if (!options.dryRun) {
1200
+ await unlink3(filePath);
1201
+ result.removed += 1;
1202
+ }
1203
+ } catch {
1204
+ }
1205
+ }
1206
+ return result;
1207
+ }
1208
+
1209
+ // src/core/cleanup/variant-telemetry-state-cleanup.ts
1210
+ import { opendir as opendir4, readFile as readFile5, stat as stat6 } from "fs/promises";
1211
+ import { resolve as resolve4 } from "path";
1212
+ function parseIsoDateMs3(value) {
1213
+ if (!value) return null;
1214
+ const ms = new Date(value).getTime();
1215
+ if (!Number.isFinite(ms)) return null;
1216
+ return ms;
1217
+ }
1218
+ function isActiveVariantArtifact(fileName) {
1219
+ return fileName.endsWith(".partial.json") || fileName.endsWith(".partial.json.pid") || fileName.endsWith(".partial.json.sigterm");
1220
+ }
1221
+ function isVariantState(value) {
1222
+ return typeof value.taskId === "string" && value.taskId.trim().length > 0 || typeof value.variant === "string" && value.variant.trim().length > 0 || typeof value.provider === "string" && value.provider.trim().length > 0 && typeof value.strategy === "string" && value.strategy.trim().length > 0;
1223
+ }
1224
+ async function cleanupVariantTelemetryStateFiles(options) {
1225
+ const buildDir = resolveCleanupBuildDir(options.cwd);
1226
+ const now = options.now ?? /* @__PURE__ */ new Date();
1227
+ const stateDir = resolveRunStateDir(buildDir);
1228
+ const rootDir = resolve4(stateDir, "variants");
1229
+ const archiveDir = options.archiveDir ?? resolve4(stateDir, "variants-archive");
1230
+ const maxAgeMs = options.maxAgeDays * 24 * 60 * 60 * 1e3;
1231
+ const report = {
1232
+ mode: options.dryRun ? "dry-run" : "executed",
1233
+ rootDir,
1234
+ archiveDir,
1235
+ scanned: 0,
1236
+ eligible: 0,
1237
+ archived: 0,
1238
+ kept: 0,
1239
+ freedBytes: 0,
1240
+ keptBecause: {},
1241
+ archivedBecause: {},
1242
+ items: [],
1243
+ errors: []
1244
+ };
1245
+ const bump = (map, key) => {
1246
+ map[key] = (map[key] ?? 0) + 1;
1247
+ };
1248
+ try {
1249
+ const dir = await opendir4(rootDir);
1250
+ try {
1251
+ for await (const d of dir) {
1252
+ if (!d.isFile()) continue;
1253
+ const fullPath = resolve4(rootDir, d.name);
1254
+ report.scanned++;
1255
+ if (isActiveVariantArtifact(d.name)) {
1256
+ let sizeBytes2 = 0;
1257
+ let timestampMs2 = 0;
1258
+ try {
1259
+ const st = await stat6(fullPath);
1260
+ sizeBytes2 = st.size;
1261
+ timestampMs2 = st.mtimeMs;
1262
+ } catch {
1263
+ bump(report.keptBecause, "read_error");
1264
+ report.kept++;
1265
+ report.items.push({
1266
+ path: fullPath,
1267
+ sizeBytes: 0,
1268
+ ageDays: 0,
1269
+ decision: "keep",
1270
+ reason: "read_error"
1271
+ });
1272
+ continue;
1273
+ }
1274
+ bump(report.keptBecause, "active_run");
1275
+ report.kept++;
1276
+ report.items.push({
1277
+ path: fullPath,
1278
+ sizeBytes: sizeBytes2,
1279
+ ageDays: Math.floor((now.getTime() - timestampMs2) / (24 * 60 * 60 * 1e3)),
1280
+ decision: "keep",
1281
+ reason: "active_run"
1282
+ });
1283
+ continue;
1284
+ }
1285
+ if (!d.name.endsWith(".json")) {
1286
+ bump(report.keptBecause, "not_variant_state");
1287
+ report.kept++;
1288
+ continue;
1289
+ }
1290
+ let sizeBytes = 0;
1291
+ let timestampMs = 0;
1292
+ let parsedTaskId = null;
1293
+ try {
1294
+ const st = await stat6(fullPath);
1295
+ sizeBytes = st.size;
1296
+ timestampMs = st.mtimeMs;
1297
+ const raw = await readFile5(fullPath, "utf8");
1298
+ let parsed;
1299
+ try {
1300
+ parsed = parseJsonWithContext(raw, `Variant state (${d.name})`);
1301
+ } catch {
1302
+ const ageDays2 = Math.floor((now.getTime() - timestampMs) / (24 * 60 * 60 * 1e3));
1303
+ bump(report.keptBecause, "invalid_json");
1304
+ report.kept++;
1305
+ report.items.push({
1306
+ path: fullPath,
1307
+ sizeBytes,
1308
+ ageDays: ageDays2,
1309
+ decision: "keep",
1310
+ reason: "invalid_json"
1311
+ });
1312
+ continue;
1313
+ }
1314
+ if (!isVariantState(parsed)) {
1315
+ const ageDays2 = Math.floor((now.getTime() - timestampMs) / (24 * 60 * 60 * 1e3));
1316
+ bump(report.keptBecause, "not_variant_state");
1317
+ report.kept++;
1318
+ report.items.push({
1319
+ path: fullPath,
1320
+ sizeBytes,
1321
+ ageDays: ageDays2,
1322
+ decision: "keep",
1323
+ reason: "not_variant_state"
1324
+ });
1325
+ continue;
1326
+ }
1327
+ timestampMs = parseIsoDateMs3(parsed.updatedAt) ?? parseIsoDateMs3(parsed.createdAt) ?? timestampMs;
1328
+ parsedTaskId = typeof parsed.taskId === "string" ? parsed.taskId : null;
1329
+ } catch (error) {
1330
+ const msg = error instanceof Error ? error.message : String(error);
1331
+ report.errors.push(`${d.name}: stat/read failed: ${msg}`);
1332
+ bump(report.keptBecause, "read_error");
1333
+ report.kept++;
1334
+ report.items.push({
1335
+ path: fullPath,
1336
+ sizeBytes: 0,
1337
+ ageDays: 0,
1338
+ decision: "keep",
1339
+ reason: "read_error"
1340
+ });
1341
+ continue;
1342
+ }
1343
+ const ageMs = now.getTime() - timestampMs;
1344
+ const ageDays = Math.floor(ageMs / (24 * 60 * 60 * 1e3));
1345
+ if (ageMs <= maxAgeMs) {
1346
+ bump(report.keptBecause, "too_recent");
1347
+ report.kept++;
1348
+ report.items.push({
1349
+ path: fullPath,
1350
+ sizeBytes,
1351
+ ageDays,
1352
+ decision: "keep",
1353
+ reason: "too_recent"
1354
+ });
1355
+ continue;
1356
+ }
1357
+ if (options.synthesisTaskIdsUnavailable) {
1358
+ bump(report.keptBecause, "synthesis_retention_unknown");
1359
+ report.kept++;
1360
+ report.items.push({
1361
+ path: fullPath,
1362
+ sizeBytes,
1363
+ ageDays,
1364
+ decision: "keep",
1365
+ reason: "synthesis_retention_unknown"
1366
+ });
1367
+ continue;
1368
+ }
1369
+ if (options.keepJudgedTaskIds && parsedTaskId && options.keepJudgedTaskIds.has(parsedTaskId) && ageMs <= maxAgeMs * (options.judgedRetentionMultiplier ?? 3)) {
1370
+ bump(report.keptBecause, "judged_retention");
1371
+ report.kept++;
1372
+ report.items.push({
1373
+ path: fullPath,
1374
+ sizeBytes,
1375
+ ageDays,
1376
+ decision: "keep",
1377
+ reason: "judged_retention"
1378
+ });
1379
+ continue;
1380
+ }
1381
+ if (options.keepSynthesisTaskIds && parsedTaskId && options.keepSynthesisTaskIds.has(parsedTaskId) && ageMs <= maxAgeMs * (options.judgedRetentionMultiplier ?? 3)) {
1382
+ bump(report.keptBecause, "synthesis_retention");
1383
+ report.kept++;
1384
+ report.items.push({
1385
+ path: fullPath,
1386
+ sizeBytes,
1387
+ ageDays,
1388
+ decision: "keep",
1389
+ reason: "synthesis_retention"
1390
+ });
1391
+ continue;
1392
+ }
1393
+ report.eligible++;
1394
+ const item = {
1395
+ path: fullPath,
1396
+ sizeBytes,
1397
+ ageDays,
1398
+ decision: "archive",
1399
+ reason: "stale_variant"
1400
+ };
1401
+ if (options.dryRun) {
1402
+ bump(report.archivedBecause, "stale_variant");
1403
+ report.freedBytes += sizeBytes;
1404
+ } else {
1405
+ try {
1406
+ item.archivePath = await moveToMonthlyArchive(
1407
+ fullPath,
1408
+ archiveDir,
1409
+ d.name,
1410
+ timestampMs
1411
+ );
1412
+ report.archived++;
1413
+ bump(report.archivedBecause, "stale_variant");
1414
+ report.freedBytes += sizeBytes;
1415
+ } catch (error) {
1416
+ const msg = error instanceof Error ? error.message : String(error);
1417
+ report.errors.push(`${d.name}: archive failed: ${msg}`);
1418
+ item.decision = "keep";
1419
+ item.reason = "read_error";
1420
+ report.kept++;
1421
+ bump(report.keptBecause, "read_error");
1422
+ report.items.push(item);
1423
+ continue;
1424
+ }
1425
+ }
1426
+ report.items.push(item);
1427
+ }
1428
+ } finally {
1429
+ await dir.close().catch(() => {
1430
+ });
1431
+ }
1432
+ } catch {
1433
+ return report;
1434
+ }
1435
+ if (options.dryRun) {
1436
+ report.archived = report.eligible;
1437
+ }
1438
+ if (!options.verbose) {
1439
+ report.items = report.items.slice(0, 200);
1440
+ }
1441
+ return report;
1442
+ }
1443
+
1444
+ // src/core/cleanup/stale-cleanup-orchestrator.ts
1445
+ var DEFAULT_STALE_CLEANUP_LOG_AGE_DAYS = 7;
1446
+ var DEFAULT_STALE_CLEANUP_BRANCH_AGE_DAYS = 7;
1447
+ var DEFAULT_STALE_CLEANUP_STATE_AGE_DAYS = 30;
1448
+ var DEFAULT_STALE_CLEANUP_AUTOLOOP_AGE_DAYS = 14;
1449
+ var DEFAULT_STALE_CLEANUP_UNIFIED_STATE_AGE_DAYS = 14;
1450
+ var CLEANUP_METRICS_RELATIVE_PATH = ".build-project/tmp/cleanup-metrics.jsonl";
1451
+ var CLEANUP_METRICS_MAX_BYTES = 1e6;
1452
+ var CLEANUP_METRICS_MAX_LINES = 2e3;
1453
+ function getActiveRunSentinelRoots() {
1454
+ const repoRoot = findProjectRoot(process.cwd()) ?? process.cwd();
1455
+ return Array.from(
1456
+ /* @__PURE__ */ new Set([
1457
+ resolveWorktreeBase(),
1458
+ resolve5(visibleWorktreeBase()),
1459
+ resolve5(tmpdir(), "build-worktrees"),
1460
+ resolve5(repoRoot, ".build-project/labs")
1461
+ ])
1462
+ );
1463
+ }
1464
+ async function loadJudgedTaskIdsBestEffort() {
1465
+ try {
1466
+ const { openConfiguredTelemetryDb } = await import("./storage-access-I3V5LER7.js");
1467
+ const { listJudgedTaskIds } = await import("./competition-outcome-tracker-NWSMVUPG.js");
1468
+ const { TelemetryPathResolver: TelemetryPathResolver2 } = await import("./telemetry-path-resolver-H3NFHHQY.js");
1469
+ const buildDir = resolveBuildDirFromContext();
1470
+ const projectId = TelemetryPathResolver2.getInstance().getProjectId(buildDir, {
1471
+ register: false
1472
+ });
1473
+ const { db } = openConfiguredTelemetryDb();
1474
+ if (!db) return void 0;
1475
+ try {
1476
+ return listJudgedTaskIds(db, { projectId });
1477
+ } finally {
1478
+ db.close();
1479
+ }
1480
+ } catch {
1481
+ return void 0;
1482
+ }
1483
+ }
1484
+ async function loadSynthesisTaskIds() {
1485
+ const { TelemetryPathResolver: TelemetryPathResolver2 } = await import("./telemetry-path-resolver-H3NFHHQY.js");
1486
+ const buildDir = resolveBuildDirFromContext();
1487
+ const dbDir = TelemetryPathResolver2.getInstance().resolveDbDir(buildDir);
1488
+ const telemetryDir = basename(dbDir) === "db" ? dirname3(dbDir) : dbDir;
1489
+ const synthesisDir = resolve5(telemetryDir, "synthesis");
1490
+ const ids = /* @__PURE__ */ new Set();
1491
+ try {
1492
+ for (const entry of await readdir4(synthesisDir, { withFileTypes: true })) {
1493
+ if (!entry.isFile() || !entry.name.endsWith(".json")) continue;
1494
+ ids.add(basename(entry.name, ".json"));
1495
+ }
1496
+ } catch (error) {
1497
+ if (error?.code === "ENOENT") return void 0;
1498
+ throw error;
1499
+ }
1500
+ return ids.size > 0 ? ids : void 0;
1501
+ }
1502
+ var StaleCleanupOrchestrator = class {
1503
+ worktreeManager;
1504
+ dbSizeManager = null;
1505
+ constructor() {
1506
+ this.worktreeManager = new WorktreeCleanupManager();
1507
+ }
1508
+ async cleanup(options) {
1509
+ const report = {
1510
+ mode: options.dryRun ? "dry-run" : "executed",
1511
+ categories: [],
1512
+ totals: { freedBytes: 0, itemsCleaned: 0 }
1513
+ };
1514
+ if (options.categories.includes("worktrees")) {
1515
+ const result = await this.cleanupWorktrees(options);
1516
+ report.categories.push(result);
1517
+ report.totals.freedBytes += result.summary.freedBytes;
1518
+ report.totals.itemsCleaned += result.summary.cleaned;
1519
+ }
1520
+ if (options.categories.includes("telemetry")) {
1521
+ const result = await this.cleanupTelemetry(options);
1522
+ report.categories.push(result);
1523
+ report.totals.freedBytes += result.summary.freedBytes;
1524
+ report.totals.itemsCleaned += result.summary.cleaned;
1525
+ }
1526
+ if (options.categories.includes("processes")) {
1527
+ const result = await this.cleanupProcesses(options);
1528
+ report.categories.push(result);
1529
+ report.totals.itemsCleaned += result.summary.cleaned;
1530
+ }
1531
+ if (options.categories.includes("db")) {
1532
+ const result = await this.cleanupDatabase(options);
1533
+ report.categories.push(result);
1534
+ report.totals.freedBytes += result.summary.freedBytes;
1535
+ report.totals.itemsCleaned += result.summary.cleaned;
1536
+ }
1537
+ if (options.categories.includes("branches")) {
1538
+ const result = await this.cleanupBranches(options);
1539
+ report.categories.push(result);
1540
+ report.totals.itemsCleaned += result.summary.cleaned;
1541
+ }
1542
+ if (options.categories.includes("state")) {
1543
+ const result = await this.cleanupState(options);
1544
+ report.categories.push(result);
1545
+ report.totals.freedBytes += result.summary.freedBytes;
1546
+ report.totals.itemsCleaned += result.summary.cleaned;
1547
+ }
1548
+ if (options.categories.includes("autoloop")) {
1549
+ const result = await this.cleanupAutoloop(options);
1550
+ report.categories.push(result);
1551
+ report.totals.freedBytes += result.summary.freedBytes;
1552
+ report.totals.itemsCleaned += result.summary.cleaned;
1553
+ }
1554
+ if (options.categories.includes("unified-state")) {
1555
+ const result = await this.cleanupUnifiedState(options);
1556
+ report.categories.push(result);
1557
+ report.totals.freedBytes += result.summary.freedBytes;
1558
+ report.totals.itemsCleaned += result.summary.cleaned;
1559
+ }
1560
+ if (options.categories.includes("sessions")) {
1561
+ const result = await cleanupSessionsCategory(
1562
+ findProjectRoot(process.cwd()) ?? process.cwd(),
1563
+ { dryRun: options.dryRun }
1564
+ );
1565
+ report.categories.push(result);
1566
+ report.totals.itemsCleaned += result.summary.cleaned;
1567
+ }
1568
+ if (options.categories.includes("projects")) {
1569
+ const result = await this.cleanupProjects(options);
1570
+ report.categories.push(result);
1571
+ report.totals.itemsCleaned += result.summary.cleaned;
1572
+ }
1573
+ if (!options.dryRun) {
1574
+ await trackCleanupMetrics(report, options);
1575
+ }
1576
+ return report;
1577
+ }
1578
+ async cleanupWorktrees(options) {
1579
+ try {
1580
+ const result = await this.worktreeManager.cleanup({
1581
+ maxAgeMs: options.worktreeAgeMs,
1582
+ dryRun: options.dryRun,
1583
+ includeLabs: options.includeLabWorktrees,
1584
+ verbose: options.verbose,
1585
+ limit: options.worktreeLimit,
1586
+ estimateSize: options.worktreeEstimateSize,
1587
+ includeBrokenMetadata: options.worktreeIncludeBrokenMetadata
1588
+ });
1589
+ return {
1590
+ name: "worktrees",
1591
+ enabled: true,
1592
+ summary: {
1593
+ found: result.deletedWorktrees.length,
1594
+ // In dry-run, these are "would delete"
1595
+ cleaned: options.dryRun ? result.deletedWorktrees.length : result.deleted,
1596
+ freedBytes: result.freedBytes
1597
+ },
1598
+ details: {
1599
+ paths: result.deletedWorktrees,
1600
+ labCleaned: result.deletedLabWorktrees,
1601
+ labSkipped: result.skippedLabWorktrees,
1602
+ dirtySkipped: result.skippedDirtyWorktrees ?? [],
1603
+ uninspectableSkipped: result.skippedUninspectableWorktrees ?? [],
1604
+ brokenMetadataCleaned: result.deletedBrokenMetadataWorktrees ?? [],
1605
+ prunedGitWorktreeEntries: result.prunedGitWorktreeEntries ?? 0,
1606
+ preservedWorktrees: result.preservedWorktrees ?? [],
1607
+ retentionMaxAgeMs: result.retentionMaxAgeMs,
1608
+ lockPreviewDegraded: result.lockPreviewDegraded ?? false,
1609
+ lockDiagnostics: result.lockDiagnostics
1610
+ }
1611
+ };
1612
+ } catch (error) {
1613
+ return {
1614
+ name: "worktrees",
1615
+ enabled: true,
1616
+ skipped: {
1617
+ reason: error instanceof Error ? error.message : String(error)
1618
+ },
1619
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
1620
+ details: {}
1621
+ };
1622
+ }
1623
+ }
1624
+ async cleanupTelemetry(options) {
1625
+ try {
1626
+ const cleanup = await TelemetryCleanup.fromConfig();
1627
+ const result = await cleanup.cleanup({
1628
+ dryRun: options.dryRun,
1629
+ verbose: options.verbose,
1630
+ logsDaysOverride: options.logAgeDays,
1631
+ vacuumOverride: options.vacuum
1632
+ });
1633
+ return {
1634
+ name: "telemetry",
1635
+ enabled: true,
1636
+ summary: {
1637
+ found: result.deletedBackups + result.deletedLogs + result.deletedSignalFiles + result.deletedMergeLedgerLines,
1638
+ cleaned: result.deletedBackups + result.deletedLogs + result.deletedSignalFiles + result.deletedMergeLedgerLines,
1639
+ freedBytes: result.freedSpaceBytes
1640
+ },
1641
+ details: {
1642
+ deletedBackups: result.deletedBackups,
1643
+ deletedLogs: result.deletedLogs,
1644
+ deletedSignalFiles: result.deletedSignalFiles,
1645
+ deletedMergeLedgerLines: result.deletedMergeLedgerLines,
1646
+ vacuumExecuted: result.vacuumExecuted
1647
+ }
1648
+ };
1649
+ } catch (error) {
1650
+ return {
1651
+ name: "telemetry",
1652
+ enabled: true,
1653
+ skipped: {
1654
+ reason: error instanceof Error ? error.message : String(error)
1655
+ },
1656
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
1657
+ details: {}
1658
+ };
1659
+ }
1660
+ }
1661
+ async cleanupProcesses(options) {
1662
+ try {
1663
+ await processScanner.scan({ includeAll: true });
1664
+ const scanResult = await processRegistry.scan();
1665
+ const reapedTmuxSessions = await reapOrphanedTmuxSessions({ dryRun: options.dryRun });
1666
+ const registryTemp = await cleanupStaleRegistryTempFiles({ dryRun: options.dryRun });
1667
+ const registryTempCleaned = options.dryRun ? registryTemp.candidates.length : registryTemp.removed;
1668
+ const unhealthyCount = scanResult.staleCount + scanResult.orphanedCount + scanResult.zombieCount;
1669
+ const protectedActiveRunPids = unhealthyCount > 0 ? await collectActiveRunPids(getActiveRunSentinelRoots()) : /* @__PURE__ */ new Set();
1670
+ const unhealthyProcessEntries = unhealthyCount > 0 ? (await processRegistry.getAll()).filter(
1671
+ (entry) => isSignalEligible(entry) && (entry.health === "stale" || entry.health === "orphaned" || entry.health === "zombie")
1672
+ ) : [];
1673
+ const processTargets = unhealthyProcessEntries.filter(
1674
+ (entry) => !protectedActiveRunPids.has(entry.pid)
1675
+ );
1676
+ const skippedActiveRunPids = unhealthyProcessEntries.filter((entry) => protectedActiveRunPids.has(entry.pid)).map((entry) => entry.pid);
1677
+ const staleCount = processTargets.length;
1678
+ if (staleCount === 0 && reapedTmuxSessions.length === 0) {
1679
+ return {
1680
+ name: "processes",
1681
+ enabled: true,
1682
+ summary: {
1683
+ found: registryTemp.candidates.length,
1684
+ cleaned: registryTempCleaned,
1685
+ freedBytes: 0
1686
+ },
1687
+ details: {
1688
+ pids: [],
1689
+ errors: [],
1690
+ tmuxSessions: [],
1691
+ skippedActiveRunPids,
1692
+ registryTempFiles: registryTemp.candidates
1693
+ }
1694
+ };
1695
+ }
1696
+ const result = staleCount > 0 ? await processRegistry.cleanup({
1697
+ health: ["stale", "orphaned", "zombie"],
1698
+ pids: processTargets.map((entry) => entry.pid),
1699
+ dryRun: options.dryRun
1700
+ }) : { attempted: 0, killed: 0, failed: 0, pids: [], errors: [] };
1701
+ const tmuxCleaned = options.dryRun ? reapedTmuxSessions.length : reapedTmuxSessions.length;
1702
+ return {
1703
+ name: "processes",
1704
+ enabled: true,
1705
+ summary: {
1706
+ found: result.attempted + reapedTmuxSessions.length + registryTemp.candidates.length,
1707
+ cleaned: (options.dryRun ? result.attempted : result.killed) + tmuxCleaned + registryTempCleaned,
1708
+ freedBytes: 0
1709
+ // Processes don't have a size
1710
+ },
1711
+ details: {
1712
+ pids: result.pids,
1713
+ tmuxSessions: reapedTmuxSessions,
1714
+ errors: result.errors,
1715
+ killed: result.killed,
1716
+ failed: result.failed,
1717
+ skippedActiveRunPids,
1718
+ registryTempFiles: registryTemp.candidates
1719
+ }
1720
+ };
1721
+ } catch (error) {
1722
+ return {
1723
+ name: "processes",
1724
+ enabled: true,
1725
+ skipped: {
1726
+ reason: error instanceof Error ? error.message : String(error)
1727
+ },
1728
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
1729
+ details: {}
1730
+ };
1731
+ }
1732
+ }
1733
+ async cleanupProjects(options) {
1734
+ try {
1735
+ const result = await cleanupGeneratedOnlyProjectDirs({
1736
+ dryRun: options.dryRun,
1737
+ maxAgeDays: options.projectDataAgeDays
1738
+ });
1739
+ return {
1740
+ name: "projects",
1741
+ enabled: true,
1742
+ summary: {
1743
+ found: result.candidates.length,
1744
+ cleaned: options.dryRun ? result.candidates.length : result.removed.length,
1745
+ freedBytes: 0
1746
+ },
1747
+ details: result
1748
+ };
1749
+ } catch (error) {
1750
+ return {
1751
+ name: "projects",
1752
+ enabled: true,
1753
+ skipped: { reason: error instanceof Error ? error.message : String(error) },
1754
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
1755
+ details: {}
1756
+ };
1757
+ }
1758
+ }
1759
+ async cleanupBranches(options) {
1760
+ try {
1761
+ const repoRoot = findProjectRoot(process.cwd()) ?? process.cwd();
1762
+ const branchManager = createBranchCleanupManager(repoRoot);
1763
+ const result = await branchManager.archive({
1764
+ includeBranches: true,
1765
+ // Already gated by category check
1766
+ includeTestBranches: options.includeTestBranches ?? false,
1767
+ dryRun: options.dryRun,
1768
+ allowUnmerged: options.allowUnmerged ?? false,
1769
+ confirm: options.branchConfirm,
1770
+ minAgeDays: options.branchAgeDays ?? DEFAULT_STALE_CLEANUP_BRANCH_AGE_DAYS,
1771
+ maxArchiveCount: 100,
1772
+ verbose: options.verbose
1773
+ });
1774
+ const archiveCandidates = result.branches.filter((b) => b.action === "archive");
1775
+ const archiveCount = archiveCandidates.length;
1776
+ const localCleanedCount = options.dryRun || result.mode === "executed" ? archiveCount : 0;
1777
+ const skipReasons = result.branches.filter((b) => b.action === "skip").slice(0, 10).map((b) => ({ name: b.name, reason: b.reason }));
1778
+ let remoteQueue = await processRemoteBranchCleanupQueue({
1779
+ dryRun: true,
1780
+ verbose: options.verbose,
1781
+ cwd: repoRoot
1782
+ });
1783
+ const remoteDeleteCandidates = remoteQueue.wouldDelete ?? 0;
1784
+ const remoteConfirmMatches = options.remoteBranchConfirm !== void 0 && options.remoteBranchConfirm === remoteDeleteCandidates;
1785
+ let remoteQueueErrors = [...remoteQueue.errors];
1786
+ if (!options.dryRun && result.mode === "executed" && options.remoteBranchConfirm !== void 0 && !remoteConfirmMatches) {
1787
+ remoteQueueErrors.push(
1788
+ `Remote branch cleanup queue confirmation mismatch: expected --confirm-remote ${remoteDeleteCandidates}, got ${options.remoteBranchConfirm}`
1789
+ );
1790
+ }
1791
+ if (!options.dryRun && result.mode === "executed" && remoteConfirmMatches) {
1792
+ remoteQueue = await processRemoteBranchCleanupQueue({
1793
+ dryRun: false,
1794
+ verbose: options.verbose,
1795
+ cwd: repoRoot
1796
+ });
1797
+ remoteQueueErrors = [...remoteQueueErrors, ...remoteQueue.errors];
1798
+ }
1799
+ const remoteCleanedCount = options.dryRun ? remoteDeleteCandidates : remoteQueue.mode === "executed" ? remoteQueue.deleted : 0;
1800
+ const shouldPrune = options.pruneRemoteRefs === true && !options.dryRun && remoteQueue.mode === "executed";
1801
+ const remotePrune = shouldPrune ? await execa("git", ["fetch", "--prune", "origin"], { cwd: repoRoot, reject: false }) : null;
1802
+ return {
1803
+ name: "branches",
1804
+ enabled: true,
1805
+ summary: {
1806
+ found: archiveCount + remoteQueue.found,
1807
+ cleaned: localCleanedCount + remoteCleanedCount,
1808
+ // Local branch "cleanup" is a move-aside rename (git branch -m into
1809
+ // build/removed/<date>/<name>), so it does not reduce the local ref
1810
+ // count. Reported separately because `cleaned` alone reads as deletion:
1811
+ // an operator running cleanup to shed refs would otherwise see a
1812
+ // non-zero cleaned count next to an unchanged `git branch` listing.
1813
+ archived: localCleanedCount,
1814
+ freedBytes: 0
1815
+ // Branches don't have a size
1816
+ },
1817
+ details: {
1818
+ mode: result.mode,
1819
+ defaultBranch: result.defaultBranch,
1820
+ patternsUsed: result.patternsUsed,
1821
+ scanned: result.scanned,
1822
+ archived: archiveCount,
1823
+ skipped: result.skipped,
1824
+ cleaned: localCleanedCount,
1825
+ skipReasons,
1826
+ circuitBreakerTriggered: result.circuitBreakerTriggered,
1827
+ errors: result.errors,
1828
+ unbornRepository: result.unbornRepository === true,
1829
+ remoteBranchCleanupQueue: {
1830
+ ...remoteQueue,
1831
+ errors: remoteQueueErrors,
1832
+ confirmationRequired: !options.dryRun && result.mode === "executed" && remoteQueue.mode !== "executed" && remoteDeleteCandidates > 0 ? remoteDeleteCandidates : void 0,
1833
+ confirmationProvided: options.remoteBranchConfirm
1834
+ },
1835
+ remotePrune: remotePrune === null ? { attempted: false } : {
1836
+ attempted: true,
1837
+ exitCode: remotePrune.exitCode,
1838
+ stderr: (remotePrune.stderr ?? "").trim()
1839
+ }
1840
+ }
1841
+ };
1842
+ } catch (error) {
1843
+ return {
1844
+ name: "branches",
1845
+ enabled: true,
1846
+ skipped: {
1847
+ reason: error instanceof Error ? error.message : String(error)
1848
+ },
1849
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
1850
+ details: {}
1851
+ };
1852
+ }
1853
+ }
1854
+ async cleanupState(options) {
1855
+ try {
1856
+ const nonTerminalPolicy = options.nonTerminalPolicy ?? (options.keepNonTerminalState === void 0 ? "smart" : options.keepNonTerminalState ? "strict" : "smart");
1857
+ const maxAgeDays = options.stateAgeDays ?? DEFAULT_STALE_CLEANUP_STATE_AGE_DAYS;
1858
+ const cleanupOptions = {
1859
+ dryRun: options.dryRun,
1860
+ verbose: options.verbose,
1861
+ maxAgeDays
1862
+ };
1863
+ const keepJudgedTaskIds = await loadJudgedTaskIdsBestEffort();
1864
+ let keepSynthesisTaskIds;
1865
+ let synthesisTaskIdsUnavailable = false;
1866
+ try {
1867
+ keepSynthesisTaskIds = await loadSynthesisTaskIds();
1868
+ } catch {
1869
+ synthesisTaskIdsUnavailable = true;
1870
+ }
1871
+ const result = await cleanupCompetitionStateFiles({
1872
+ ...cleanupOptions,
1873
+ keepNonTerminal: options.keepNonTerminalState ?? false,
1874
+ keepLast: options.keepLastState ?? 0,
1875
+ nonTerminalPolicy
1876
+ });
1877
+ const tuiSessions = await cleanupTuiSessionStateFiles(cleanupOptions);
1878
+ const background = await cleanupBackgroundStateFiles(cleanupOptions);
1879
+ const variants = await cleanupVariantTelemetryStateFiles({
1880
+ ...cleanupOptions,
1881
+ keepJudgedTaskIds,
1882
+ keepSynthesisTaskIds,
1883
+ synthesisTaskIdsUnavailable
1884
+ });
1885
+ const flywheel = await cleanupFlywheelTmpEntries(cleanupOptions);
1886
+ const keptBecause = { ...result.keptBecause };
1887
+ const deletedBecause = { ...result.deletedBecause };
1888
+ const mergeKept = (prefix, map) => {
1889
+ for (const [reason, count] of Object.entries(map)) {
1890
+ keptBecause[`${prefix}_${reason}`] = (keptBecause[`${prefix}_${reason}`] ?? 0) + count;
1891
+ }
1892
+ };
1893
+ const mergeArchived = (prefix, map) => {
1894
+ for (const [reason, count] of Object.entries(map)) {
1895
+ deletedBecause[`${prefix}_${reason}`] = (deletedBecause[`${prefix}_${reason}`] ?? 0) + count;
1896
+ }
1897
+ };
1898
+ mergeKept("tui", tuiSessions.keptBecause);
1899
+ mergeKept("background", background.keptBecause);
1900
+ mergeKept("variants", variants.keptBecause);
1901
+ mergeKept("flywheel", flywheel.keptBecause);
1902
+ mergeArchived("tui", tuiSessions.deletedBecause);
1903
+ mergeArchived("background", background.archivedBecause);
1904
+ mergeArchived("variants", variants.archivedBecause);
1905
+ mergeArchived("flywheel", flywheel.archivedBecause);
1906
+ const found = result.eligible + tuiSessions.eligible + background.eligible + variants.eligible + flywheel.eligible;
1907
+ const cleaned = options.dryRun ? found : result.deleted + tuiSessions.deleted + background.archived + variants.archived + flywheel.archived;
1908
+ const freedBytes = result.freedBytes + tuiSessions.freedBytes + background.freedBytes + variants.freedBytes + flywheel.freedBytes;
1909
+ return {
1910
+ name: "state",
1911
+ enabled: true,
1912
+ summary: {
1913
+ found,
1914
+ cleaned,
1915
+ freedBytes
1916
+ },
1917
+ details: {
1918
+ ...result,
1919
+ keptBecause,
1920
+ deletedBecause,
1921
+ tuiSessions,
1922
+ background,
1923
+ variants,
1924
+ flywheel
1925
+ }
1926
+ };
1927
+ } catch (error) {
1928
+ return {
1929
+ name: "state",
1930
+ enabled: true,
1931
+ skipped: {
1932
+ reason: error instanceof Error ? error.message : String(error)
1933
+ },
1934
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
1935
+ details: {}
1936
+ };
1937
+ }
1938
+ }
1939
+ async cleanupAutoloop(options) {
1940
+ try {
1941
+ const { cleanupAutoloopArtifacts } = await import("./autoloop-cleanup-SI3VGAAR.js");
1942
+ const result = await cleanupAutoloopArtifacts({
1943
+ dryRun: options.dryRun,
1944
+ maxAgeDays: options.autoloopAgeDays ?? DEFAULT_STALE_CLEANUP_AUTOLOOP_AGE_DAYS,
1945
+ verbose: options.verbose
1946
+ });
1947
+ return {
1948
+ name: "autoloop",
1949
+ enabled: true,
1950
+ summary: {
1951
+ found: result.eligible,
1952
+ cleaned: options.dryRun ? result.eligible : result.deleted,
1953
+ freedBytes: result.freedBytes
1954
+ },
1955
+ details: result
1956
+ };
1957
+ } catch (error) {
1958
+ return {
1959
+ name: "autoloop",
1960
+ enabled: true,
1961
+ skipped: {
1962
+ reason: error instanceof Error ? error.message : String(error)
1963
+ },
1964
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
1965
+ details: {}
1966
+ };
1967
+ }
1968
+ }
1969
+ async cleanupUnifiedState(options) {
1970
+ try {
1971
+ const { cleanupUnifiedStateFiles } = await import("./unified-state-cleanup-GGAXLHXF.js");
1972
+ const result = await cleanupUnifiedStateFiles({
1973
+ dryRun: options.dryRun,
1974
+ maxAgeDays: options.unifiedStateAgeDays ?? DEFAULT_STALE_CLEANUP_UNIFIED_STATE_AGE_DAYS,
1975
+ verbose: options.verbose
1976
+ });
1977
+ return {
1978
+ name: "unified-state",
1979
+ enabled: true,
1980
+ summary: {
1981
+ found: result.eligible,
1982
+ cleaned: options.dryRun ? result.eligible : result.deleted,
1983
+ freedBytes: result.freedBytes
1984
+ },
1985
+ details: result
1986
+ };
1987
+ } catch (error) {
1988
+ return {
1989
+ name: "unified-state",
1990
+ enabled: true,
1991
+ skipped: {
1992
+ reason: error instanceof Error ? error.message : String(error)
1993
+ },
1994
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
1995
+ details: {}
1996
+ };
1997
+ }
1998
+ }
1999
+ async cleanupDatabase(options) {
2000
+ try {
2001
+ const dbManager = await this.getDbSizeManager();
2002
+ if (!dbManager) {
2003
+ return {
2004
+ name: "db",
2005
+ enabled: true,
2006
+ skipped: {
2007
+ reason: "Database manager unavailable (better-sqlite3 or DB path missing)"
2008
+ },
2009
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
2010
+ details: {}
2011
+ };
2012
+ }
2013
+ const stats = await dbManager.getStats();
2014
+ if (stats.level === "ok" || !options.vacuum) {
2015
+ return {
2016
+ name: "db",
2017
+ enabled: true,
2018
+ skipped: stats.level === "ok" ? {
2019
+ reason: `Database under threshold (${stats.sizeFormatted})`,
2020
+ blocking: false
2021
+ } : { reason: "Vacuum not requested", blocking: false },
2022
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
2023
+ details: { level: stats.level, size: stats.sizeFormatted }
2024
+ };
2025
+ }
2026
+ const result = await dbManager.cleanup({
2027
+ olderThan: stats.level === "warning" ? 90 : 180,
2028
+ // More aggressive for warning level
2029
+ vacuum: true,
2030
+ dryRun: options.dryRun
2031
+ });
2032
+ return {
2033
+ name: "db",
2034
+ enabled: true,
2035
+ summary: {
2036
+ found: result.deletedRecords ?? 0,
2037
+ cleaned: result.deletedRecords ?? 0,
2038
+ freedBytes: result.freedBytes ?? 0
2039
+ },
2040
+ details: {
2041
+ level: stats.level,
2042
+ deletedRecords: result.deletedRecords,
2043
+ vacuumed: !options.dryRun
2044
+ }
2045
+ };
2046
+ } catch (error) {
2047
+ return {
2048
+ name: "db",
2049
+ enabled: true,
2050
+ skipped: {
2051
+ reason: error instanceof Error ? error.message : String(error)
2052
+ },
2053
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
2054
+ details: {}
2055
+ };
2056
+ }
2057
+ }
2058
+ /**
2059
+ * Lazily create a DbSizeManager with the canonical telemetry DB path.
2060
+ * Returns null if better-sqlite3 is unavailable or the DB cannot be opened.
2061
+ *
2062
+ * The directory follows the resolved telemetry layout, including explicit overrides.
2063
+ * We target `variants.db` as it's the primary/largest database.
2064
+ */
2065
+ async getDbSizeManager() {
2066
+ if (this.dbSizeManager) {
2067
+ return this.dbSizeManager;
2068
+ }
2069
+ try {
2070
+ const sqlite = await import("better-sqlite3").catch(() => null);
2071
+ if (!sqlite) {
2072
+ return null;
2073
+ }
2074
+ const { TelemetryPathResolver: TelemetryPathResolver2 } = await import("./telemetry-path-resolver-H3NFHHQY.js");
2075
+ const dbPath = resolve5(
2076
+ TelemetryPathResolver2.getInstance().resolveDbDir(resolveBuildDirFromContext()),
2077
+ "variants.db"
2078
+ );
2079
+ const { existsSync: existsSync2 } = await import("fs");
2080
+ if (!existsSync2(dbPath)) {
2081
+ return null;
2082
+ }
2083
+ const DatabaseCtor = sqlite.default;
2084
+ const dbInstance = new DatabaseCtor(dbPath);
2085
+ this.dbSizeManager = new DbSizeManager(dbPath, dbInstance);
2086
+ return this.dbSizeManager;
2087
+ } catch {
2088
+ return null;
2089
+ }
2090
+ }
2091
+ };
2092
+ function createStaleCleanupOrchestrator() {
2093
+ return new StaleCleanupOrchestrator();
2094
+ }
2095
+ async function trackCleanupMetrics(report, options) {
2096
+ const repoRoot = findProjectRoot(process.cwd()) ?? process.cwd();
2097
+ const metricsPath = resolve5(repoRoot, CLEANUP_METRICS_RELATIVE_PATH);
2098
+ const payload = {
2099
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
2100
+ mode: report.mode,
2101
+ categories: report.categories.map((category) => ({
2102
+ name: category.name,
2103
+ cleaned: category.summary.cleaned,
2104
+ found: category.summary.found
2105
+ })),
2106
+ totals: report.totals,
2107
+ options: {
2108
+ categories: options.categories,
2109
+ includeLabWorktrees: options.includeLabWorktrees ?? false
2110
+ }
2111
+ };
2112
+ try {
2113
+ await mkdir(dirname3(metricsPath), { recursive: true });
2114
+ await appendFile(metricsPath, `${JSON.stringify(payload)}
2115
+ `, "utf8");
2116
+ await compactCleanupMetrics(metricsPath);
2117
+ } catch (error) {
2118
+ console.debug("Failed to record cleanup metrics", error);
2119
+ }
2120
+ }
2121
+ async function compactCleanupMetrics(metricsPath) {
2122
+ let stats;
2123
+ try {
2124
+ stats = await stat7(metricsPath);
2125
+ } catch {
2126
+ return;
2127
+ }
2128
+ const content = await readFile6(metricsPath, "utf8");
2129
+ const lines = content.split("\n").filter((line) => line.length > 0);
2130
+ if (stats.size <= CLEANUP_METRICS_MAX_BYTES && lines.length <= CLEANUP_METRICS_MAX_LINES) {
2131
+ return;
2132
+ }
2133
+ const retained = lines.slice(-CLEANUP_METRICS_MAX_LINES);
2134
+ await writeFile2(metricsPath, `${retained.join("\n")}
2135
+ `, "utf8");
2136
+ }
2137
+
2138
+ export {
2139
+ DEFAULT_STALE_CLEANUP_LOG_AGE_DAYS,
2140
+ DEFAULT_STALE_CLEANUP_BRANCH_AGE_DAYS,
2141
+ DEFAULT_STALE_CLEANUP_STATE_AGE_DAYS,
2142
+ DEFAULT_STALE_CLEANUP_AUTOLOOP_AGE_DAYS,
2143
+ DEFAULT_STALE_CLEANUP_UNIFIED_STATE_AGE_DAYS,
2144
+ StaleCleanupOrchestrator,
2145
+ createStaleCleanupOrchestrator
2146
+ };
2147
+ //# sourceMappingURL=chunk-K2ZMW2Z5.js.map