@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,1853 @@
1
+ import {
2
+ formatRunTaskMonitorHints,
3
+ hasRunTaskMonitorEvidence,
4
+ readRunTaskState
5
+ } from "./chunk-DFHX4XYA.js";
6
+ import {
7
+ findLabRunStateForTask
8
+ } from "./chunk-FT7SGLXT.js";
9
+ import {
10
+ extractTitleFromPrompt,
11
+ formatExecutionModeLabel,
12
+ formatTaskLabel
13
+ } from "./chunk-2L36U25O.js";
14
+ import {
15
+ defaultObserveProcess,
16
+ readCompetitionState,
17
+ resolveCliStateRoots,
18
+ resolveDisplayId
19
+ } from "./chunk-AAAODV76.js";
20
+ import {
21
+ resolveUnifiedStateFilePath
22
+ } from "./chunk-NHTIXJCR.js";
23
+ import {
24
+ ExitCodeError
25
+ } from "./chunk-Y4ZDDHB6.js";
26
+ import {
27
+ getPlanningRoot
28
+ } from "./chunk-CSXLLEGB.js";
29
+ import {
30
+ signalCoordinator
31
+ } from "./chunk-GC4CRMTS.js";
32
+ import {
33
+ parseVariantIdentifier
34
+ } from "./chunk-TGXXYDL4.js";
35
+ import {
36
+ parseJsonWithContext
37
+ } from "./chunk-P6SSWAKY.js";
38
+ import {
39
+ gatesAlsoFailingOnBase
40
+ } from "./chunk-R2CKS6WT.js";
41
+ import {
42
+ readVariantVerification
43
+ } from "./chunk-3OPP2OZB.js";
44
+ import {
45
+ firstDirWithFile,
46
+ resolveProjectRuntimeDir
47
+ } from "./chunk-AJN5Y5YZ.js";
48
+ import {
49
+ formatReasoningEffortLevelForUser,
50
+ normalizeReasoningEffortInput
51
+ } from "./chunk-4BTDUT2S.js";
52
+
53
+ // src/cli/commands/monitor.ts
54
+ import * as fs3 from "fs";
55
+ import * as path2 from "path";
56
+ import chalk from "chalk";
57
+ import { Command } from "commander";
58
+
59
+ // src/core/health/snapshot.ts
60
+ function buildRunHealthSnapshot(input = {}) {
61
+ return {
62
+ ...input,
63
+ status: input.status ?? "unknown",
64
+ now: input.now ?? Date.now()
65
+ };
66
+ }
67
+ function severityRank(severity) {
68
+ switch (severity) {
69
+ case "critical":
70
+ return 3;
71
+ case "warning":
72
+ return 2;
73
+ case "info":
74
+ return 1;
75
+ }
76
+ }
77
+ function summarizeRunHealth(events) {
78
+ const categories = Array.from(new Set(events.map((event) => event.category)));
79
+ const worstSeverity = events.reduce(
80
+ (worst, event) => severityRank(event.severity) > severityRank(worst) ? event.severity : worst,
81
+ "info"
82
+ );
83
+ return {
84
+ events,
85
+ worstSeverity,
86
+ categories
87
+ };
88
+ }
89
+ var AUTH_FAILURE_TEXT_PATTERN = /\bunauthori[sz]ed\b|\bnot (?:authenticated|logged in|signed in)\b|\b(?:please )?(?:log|sign) ?in (?:required|again)\b|\bauth(?:entication|orization)?[\s_-]*(?:failed|failure|required|missing|expired|error)\b|\b(?:invalid|missing|expired|revoked) (?:api[\s_-]?key|credentials?|(?:auth|access|oauth|refresh) token)\b|\b(?:credentials?|api[\s_-]?key|(?:auth|access|oauth) token) (?:is |are |has |have )?(?:missing|invalid|expired|revoked|not found|required)\b|\btoken (?:is |has )?(?:invalid|expired|revoked)\b|(?<!\()\b(?:invalid|expired|revoked) token\b|\b(?:status|http)[\s:=]*40[13]\b/i;
90
+
91
+ // src/core/health/classifier.ts
92
+ var DEFAULT_STALE_AFTER_MS = 10 * 60 * 1e3;
93
+ var DEFAULT_JUDGE_CONFIDENCE_THRESHOLD = 0.65;
94
+ var BUDGET_WARNING_RATIO = 0.9;
95
+ var HIGH_BURN_RATE_RATIO = 1.25;
96
+ var ACTIVE_STATUSES = /* @__PURE__ */ new Set([
97
+ "queued",
98
+ "pending",
99
+ "starting",
100
+ "running",
101
+ "processing",
102
+ "verifying"
103
+ ]);
104
+ var TERMINAL_STATUSES = /* @__PURE__ */ new Set(["completed", "failed", "cancelled"]);
105
+ function buildEvent(snapshot, input) {
106
+ return {
107
+ code: `RUN_HEALTH_${input.category.toUpperCase()}`,
108
+ category: input.category,
109
+ severity: input.severity,
110
+ status: input.status ?? "active",
111
+ title: input.title,
112
+ summary: input.summary,
113
+ evidence: input.evidence,
114
+ suggestedActions: input.suggestedActions ?? [],
115
+ runId: snapshot.runId,
116
+ taskId: snapshot.taskId,
117
+ provider: input.provider,
118
+ variant: input.variant,
119
+ detectedAt: snapshot.now
120
+ };
121
+ }
122
+ function statusIsActive(snapshot) {
123
+ return ACTIVE_STATUSES.has(snapshot.status);
124
+ }
125
+ function statusIsTerminal(snapshot) {
126
+ return TERMINAL_STATUSES.has(snapshot.status);
127
+ }
128
+ function hasAuthProblem(provider) {
129
+ return provider.authState === "missing" || provider.authState === "expired" || provider.authState === "invalid" || provider.lastFailurePhase === "startup" && AUTH_FAILURE_TEXT_PATTERN.test(provider.lastError ?? "");
130
+ }
131
+ function hasProviderHealthProblem(provider) {
132
+ return provider.availability === "degraded" || provider.availability === "unavailable" || provider.availability === "rate_limited" || provider.circuitState === "open" || (provider.consecutiveFailures ?? 0) >= 3;
133
+ }
134
+ function classifyProvider(snapshot, provider) {
135
+ const events = [];
136
+ if (hasAuthProblem(provider)) {
137
+ events.push(
138
+ buildEvent(snapshot, {
139
+ category: "auth_broken",
140
+ severity: "critical",
141
+ title: "Provider authentication needs attention",
142
+ summary: `${provider.provider} cannot run until authentication is repaired.`,
143
+ provider: provider.provider,
144
+ variant: provider.variant,
145
+ evidence: [
146
+ {
147
+ source: "provider_health",
148
+ message: provider.lastError ?? `Auth state is ${provider.authState ?? "not ready"}.`,
149
+ data: {
150
+ authState: provider.authState,
151
+ lastFailurePhase: provider.lastFailurePhase
152
+ }
153
+ }
154
+ ],
155
+ suggestedActions: [
156
+ {
157
+ label: "Repair provider login or credentials",
158
+ command: `build provider list --providers ${provider.provider}`
159
+ }
160
+ ]
161
+ })
162
+ );
163
+ }
164
+ if (hasProviderHealthProblem(provider) && !hasAuthProblem(provider)) {
165
+ const availability = provider.availability ?? "unknown";
166
+ const severity = provider.availability === "unavailable" || provider.circuitState === "open" ? "critical" : "warning";
167
+ events.push(
168
+ buildEvent(snapshot, {
169
+ category: "provider_unhealthy",
170
+ severity,
171
+ title: "Provider is degraded",
172
+ summary: `${provider.provider} is ${availability}; this run may need retry or rerouting.`,
173
+ provider: provider.provider,
174
+ variant: provider.variant,
175
+ evidence: [
176
+ {
177
+ source: "provider_health",
178
+ message: provider.lastError ?? `Provider availability is ${availability}.`,
179
+ data: {
180
+ availability: provider.availability,
181
+ circuitState: provider.circuitState,
182
+ consecutiveFailures: provider.consecutiveFailures
183
+ }
184
+ }
185
+ ],
186
+ suggestedActions: [
187
+ {
188
+ label: "Retry the run or choose another provider",
189
+ command: snapshot.taskId ? `build monitor ${snapshot.taskId} --detailed` : "build provider list"
190
+ }
191
+ ]
192
+ })
193
+ );
194
+ }
195
+ return events;
196
+ }
197
+ function classifyOwnerGone(snapshot, progress) {
198
+ const owner = progress.ownerPid === void 0 ? "owner process" : `owner process ${progress.ownerPid}`;
199
+ return buildEvent(snapshot, {
200
+ category: "stalled",
201
+ severity: "critical",
202
+ title: "Run owner process exited",
203
+ summary: `The run is still marked ${snapshot.status}, but its ${owner} is gone, so it will not finish or record a result.`,
204
+ evidence: [
205
+ {
206
+ source: "owner_process",
207
+ message: `${owner} is no longer running.`,
208
+ data: { ownerPid: progress.ownerPid, lastProgressAt: progress.lastProgressAt }
209
+ }
210
+ ],
211
+ suggestedActions: [
212
+ {
213
+ label: "Inspect what the run recorded before it exited, then start the run again",
214
+ command: snapshot.taskId ? `build monitor ${snapshot.taskId} --detailed` : "build monitor <taskId> --detailed"
215
+ }
216
+ ]
217
+ });
218
+ }
219
+ function classifyProgress(snapshot) {
220
+ if (!statusIsActive(snapshot)) return null;
221
+ const progress = snapshot.progress;
222
+ if (!progress) return null;
223
+ if (progress.ownerProcess === "gone") return classifyOwnerGone(snapshot, progress);
224
+ const staleAfterMs = progress.staleAfterMs ?? DEFAULT_STALE_AFTER_MS;
225
+ const lastActivityAt = progress.lastProgressAt ?? progress.lastHeartbeatAt;
226
+ const staleForMs = lastActivityAt === void 0 ? void 0 : snapshot.now - lastActivityAt;
227
+ const stalled = progress.stalled === true || staleForMs !== void 0 && staleForMs >= staleAfterMs;
228
+ if (!stalled) return null;
229
+ return buildEvent(snapshot, {
230
+ category: "stalled",
231
+ severity: "warning",
232
+ title: "Run appears stalled",
233
+ summary: staleForMs === void 0 ? "The run is marked active but has no recent progress signal." : `No progress has been observed for ${Math.round(staleForMs / 1e3)} seconds.`,
234
+ evidence: [
235
+ {
236
+ source: "progress",
237
+ message: progress.progressLabel ?? "Progress tracker reported no recent activity.",
238
+ data: {
239
+ lastProgressAt: progress.lastProgressAt,
240
+ lastHeartbeatAt: progress.lastHeartbeatAt,
241
+ staleAfterMs,
242
+ staleForMs
243
+ }
244
+ }
245
+ ],
246
+ suggestedActions: [
247
+ {
248
+ label: "Inspect the run logs",
249
+ command: snapshot.taskId ? `build monitor ${snapshot.taskId} --detailed` : "build monitor <taskId> --detailed"
250
+ }
251
+ ]
252
+ });
253
+ }
254
+ function classifyBudget(snapshot, budget) {
255
+ const limitRatio = budget.limitUsd && budget.limitUsd > 0 && budget.spentUsd !== void 0 ? budget.spentUsd / budget.limitUsd : void 0;
256
+ const projectedRatio = budget.limitUsd && budget.limitUsd > 0 && budget.projectedUsd !== void 0 ? budget.projectedUsd / budget.limitUsd : void 0;
257
+ const forecastExceeded = budget.forecastUsd && budget.forecastUsd > 0 && budget.projectedUsd !== void 0 ? budget.projectedUsd > budget.forecastUsd * HIGH_BURN_RATE_RATIO : false;
258
+ const burnRateExceeded = (budget.burnRateRatio ?? 0) > HIGH_BURN_RATE_RATIO;
259
+ if ((limitRatio ?? 0) < BUDGET_WARNING_RATIO && (projectedRatio ?? 0) < BUDGET_WARNING_RATIO && !forecastExceeded && !burnRateExceeded) {
260
+ return null;
261
+ }
262
+ const severity = "warning";
263
+ return buildEvent(snapshot, {
264
+ category: "budget_burn",
265
+ severity,
266
+ title: "Budget burn is above expectation",
267
+ summary: "Spend or projected spend is approaching the configured budget boundary.",
268
+ evidence: [
269
+ {
270
+ source: "budget",
271
+ message: "Cost telemetry indicates elevated spend.",
272
+ data: {
273
+ spentUsd: budget.spentUsd,
274
+ limitUsd: budget.limitUsd,
275
+ projectedUsd: budget.projectedUsd,
276
+ forecastUsd: budget.forecastUsd,
277
+ burnRateRatio: budget.burnRateRatio,
278
+ limitRatio,
279
+ projectedRatio
280
+ }
281
+ }
282
+ ],
283
+ suggestedActions: [
284
+ {
285
+ label: "Inspect current spend and projected cost",
286
+ command: snapshot.taskId ? `build telemetry cost history --task ${snapshot.taskId}` : "build telemetry cost status"
287
+ }
288
+ ]
289
+ });
290
+ }
291
+ function classifyJudge(snapshot, judge) {
292
+ const confidenceThreshold = judge.confidenceThreshold ?? DEFAULT_JUDGE_CONFIDENCE_THRESHOLD;
293
+ const lowConfidence = judge.confidence !== void 0 && judge.confidence < confidenceThreshold && (judge.completedVariants ?? 0) >= 2;
294
+ const disagreement = judge.status === "failed" || judge.status === "disagreement" || judge.status === "no_winner" || lowConfidence && judge.status !== "selected";
295
+ if (!disagreement) return null;
296
+ return buildEvent(snapshot, {
297
+ category: "judge_disagree",
298
+ severity: judge.status === "failed" ? "critical" : "warning",
299
+ title: "Judge needs escalation",
300
+ summary: judge.reason ?? "Completed variants did not produce a confident winner.",
301
+ evidence: [
302
+ {
303
+ source: "judge",
304
+ message: judge.reason ?? "Judge confidence is below threshold or no winner was selected.",
305
+ data: {
306
+ status: judge.status,
307
+ confidence: judge.confidence,
308
+ confidenceThreshold,
309
+ completedVariants: judge.completedVariants
310
+ }
311
+ }
312
+ ],
313
+ suggestedActions: [
314
+ {
315
+ label: "Review variant evidence and rerun judging if needed",
316
+ command: snapshot.taskId ? `build run competition results ${snapshot.taskId}` : "build run competition results <taskId>"
317
+ }
318
+ ]
319
+ });
320
+ }
321
+ function classifyOutput(snapshot, output) {
322
+ const parseErrors = output.parseErrors ?? [];
323
+ const schemaErrors = output.schemaErrors ?? [];
324
+ const hasDrift = output.unparseable === true || parseErrors.length > 0 || schemaErrors.length > 0;
325
+ if (!hasDrift) return null;
326
+ return buildEvent(snapshot, {
327
+ category: "output_drift",
328
+ severity: "warning",
329
+ title: "Provider output did not match the expected contract",
330
+ summary: "Build could not parse or validate part of the provider output.",
331
+ evidence: [
332
+ {
333
+ source: "output",
334
+ message: [...parseErrors, ...schemaErrors][0] ?? "Output was marked unparseable.",
335
+ data: {
336
+ parseErrors,
337
+ schemaErrors,
338
+ unparseable: output.unparseable,
339
+ materializedOutput: output.materializedOutput,
340
+ filesChanged: output.filesChanged
341
+ }
342
+ }
343
+ ],
344
+ suggestedActions: [
345
+ {
346
+ label: "Inspect provider output and parser diagnostics",
347
+ command: snapshot.taskId ? `build monitor ${snapshot.taskId} --detailed` : "build monitor <taskId> --detailed"
348
+ }
349
+ ]
350
+ });
351
+ }
352
+ function classifyWorktree(snapshot, worktree) {
353
+ const blocked = worktree.cleanupBlocked === true || worktree.reuseBlocked === true || worktree.dirty === true || worktree.staleLock === true || worktree.preservedForReview === true;
354
+ if (!blocked) return null;
355
+ return buildEvent(snapshot, {
356
+ category: "worktree_blocked",
357
+ severity: worktree.preservedForReview === true ? "info" : "warning",
358
+ title: "Worktree needs review before reuse",
359
+ summary: worktree.reason ?? "The worktree cannot be safely reused or cleaned automatically.",
360
+ evidence: [
361
+ {
362
+ source: "worktree",
363
+ message: worktree.reason ?? "Worktree state blocked automatic cleanup.",
364
+ data: {
365
+ cleanupBlocked: worktree.cleanupBlocked,
366
+ reuseBlocked: worktree.reuseBlocked,
367
+ dirty: worktree.dirty,
368
+ staleLock: worktree.staleLock,
369
+ preservedForReview: worktree.preservedForReview,
370
+ path: worktree.path
371
+ }
372
+ }
373
+ ],
374
+ suggestedActions: [
375
+ {
376
+ label: "Review or clean the worktree",
377
+ command: "build cleanup doctor"
378
+ }
379
+ ]
380
+ });
381
+ }
382
+ function classifyHandoff(snapshot) {
383
+ const handoff = snapshot.handoff;
384
+ if (!handoff) return null;
385
+ const terminalSuccess = handoff.runCompleted === true || statusIsTerminal(snapshot) && handoff.success === true;
386
+ const hasDurableResult = handoff.durableArtifactPresent === true || handoff.reviewArtifactPresent === true || handoff.applied === true;
387
+ if (!terminalSuccess || handoff.changesProduced !== true || hasDurableResult) return null;
388
+ return buildEvent(snapshot, {
389
+ category: "handoff_missing",
390
+ severity: "critical",
391
+ title: "Completed work has no durable handoff",
392
+ summary: "The run produced changes, but Build has no durable apply, review, or artifact record.",
393
+ evidence: [
394
+ {
395
+ source: "handoff",
396
+ message: "Completed work needs a reviewable artifact before cleanup.",
397
+ data: {
398
+ runCompleted: handoff.runCompleted,
399
+ success: handoff.success,
400
+ changesProduced: handoff.changesProduced,
401
+ durableArtifactPresent: handoff.durableArtifactPresent,
402
+ reviewArtifactPresent: handoff.reviewArtifactPresent,
403
+ applied: handoff.applied,
404
+ artifactPath: handoff.artifactPath
405
+ }
406
+ }
407
+ ],
408
+ suggestedActions: [
409
+ {
410
+ label: "Inspect worktree state and apply or discard changes",
411
+ command: "build cleanup doctor"
412
+ }
413
+ ]
414
+ });
415
+ }
416
+ function classifyNominal(snapshot) {
417
+ if (snapshot.status === "idle" || !statusIsActive(snapshot)) {
418
+ return buildEvent(snapshot, {
419
+ category: "idle",
420
+ severity: "info",
421
+ status: "active",
422
+ title: "Run is idle",
423
+ summary: "No active work is currently in progress.",
424
+ evidence: [
425
+ {
426
+ source: "run_state",
427
+ message: `Run status is ${snapshot.status}.`
428
+ }
429
+ ]
430
+ });
431
+ }
432
+ return buildEvent(snapshot, {
433
+ category: "working",
434
+ severity: "info",
435
+ status: "active",
436
+ title: "Run is working",
437
+ summary: "The run is active and no health issues are currently classified.",
438
+ evidence: [
439
+ {
440
+ source: "run_state",
441
+ message: `Run status is ${snapshot.status}.`
442
+ }
443
+ ]
444
+ });
445
+ }
446
+ function severityRank2(severity) {
447
+ switch (severity) {
448
+ case "critical":
449
+ return 3;
450
+ case "warning":
451
+ return 2;
452
+ case "info":
453
+ return 1;
454
+ }
455
+ }
456
+ function classifyRunHealth(snapshot) {
457
+ const events = [];
458
+ for (const provider of snapshot.providers ?? []) {
459
+ events.push(...classifyProvider(snapshot, provider));
460
+ }
461
+ const progressEvent = classifyProgress(snapshot);
462
+ if (progressEvent) events.push(progressEvent);
463
+ if (snapshot.budget) {
464
+ const event = classifyBudget(snapshot, snapshot.budget);
465
+ if (event) events.push(event);
466
+ }
467
+ if (snapshot.judge) {
468
+ const event = classifyJudge(snapshot, snapshot.judge);
469
+ if (event) events.push(event);
470
+ }
471
+ if (snapshot.output) {
472
+ const event = classifyOutput(snapshot, snapshot.output);
473
+ if (event) events.push(event);
474
+ }
475
+ if (snapshot.worktree) {
476
+ const event = classifyWorktree(snapshot, snapshot.worktree);
477
+ if (event) events.push(event);
478
+ }
479
+ const handoffEvent = classifyHandoff(snapshot);
480
+ if (handoffEvent) events.push(handoffEvent);
481
+ if (events.length === 0) {
482
+ events.push(classifyNominal(snapshot));
483
+ }
484
+ return events.sort((a, b) => severityRank2(b.severity) - severityRank2(a.severity));
485
+ }
486
+
487
+ // src/cli/handlers/compete/variant-gate-summary.ts
488
+ function gateLabel(verification, channel) {
489
+ return verification.gates[channel].status.replace(/_/g, "-");
490
+ }
491
+ function formatVariantHonestyGateLine(verification) {
492
+ const line = `test=${gateLabel(verification, "test")} lint=${gateLabel(verification, "lint")}`;
493
+ return verification.status === "baseline_clean" ? `${line} (baseline_clean)` : line;
494
+ }
495
+ function formatVariantGateSummary(variant) {
496
+ const verification = readVariantVerification(variant);
497
+ const build = `build=${gateLabel(verification, "build")}`;
498
+ if (verification.status === "baseline_clean") {
499
+ return `${build} ${formatVariantHonestyGateLine(verification)}`;
500
+ }
501
+ const line = `${build} lint=${gateLabel(verification, "lint")} test=${gateLabel(verification, "test")}`;
502
+ const alsoOnBase = gatesAlsoFailingOnBase(verification.gates);
503
+ return alsoOnBase.length > 0 ? `${line} (also failing on base: ${alsoOnBase.join(", ")})` : line;
504
+ }
505
+
506
+ // src/cli/utils/autoloop-task-state-reader.ts
507
+ import * as fs from "fs";
508
+ import * as path from "path";
509
+ var IN_FLIGHT_MONITORING_NOTE = "In-flight status is inferred from unified state (executionMode=autoloop, no autoloopFinal yet). Per-iteration progress is not available via monitor; run summary is written at completion.";
510
+ function sanitizeAutoloopRunFilename(taskId) {
511
+ return taskId.replace(/[^a-zA-Z0-9-_]/g, "_");
512
+ }
513
+ function sanitizeAutoloopTrajectoryFilename(taskId) {
514
+ return taskId.replace(/[^a-zA-Z0-9_.-]/g, "_");
515
+ }
516
+ function resolveAutoloopRunResultPath(cwd, taskId) {
517
+ return path.join(
518
+ cwd,
519
+ ".build-project",
520
+ "autoloop",
521
+ "runs",
522
+ `${sanitizeAutoloopRunFilename(taskId)}.json`
523
+ );
524
+ }
525
+ function resolveAutoloopTrajectoryPath(cwd, taskId) {
526
+ return path.join(
527
+ cwd,
528
+ ".build-project",
529
+ "autoloop",
530
+ "runs",
531
+ `${sanitizeAutoloopTrajectoryFilename(taskId)}.trajectory.json`
532
+ );
533
+ }
534
+ function readJsonFile(filePath, label) {
535
+ if (!fs.existsSync(filePath)) {
536
+ return void 0;
537
+ }
538
+ try {
539
+ return parseJsonWithContext(fs.readFileSync(filePath, "utf8"), label);
540
+ } catch {
541
+ return void 0;
542
+ }
543
+ }
544
+ function readUnifiedAutoloopState(unifiedStateDir, taskId) {
545
+ const filePath = resolveUnifiedStateFilePath(taskId, unifiedStateDir);
546
+ const parsed = readJsonFile(filePath, `Unified state (${taskId})`);
547
+ if (!parsed) {
548
+ return void 0;
549
+ }
550
+ if (parsed.executionMode === "autoloop" || parsed.autoloopFinal !== void 0) {
551
+ return parsed;
552
+ }
553
+ return void 0;
554
+ }
555
+ function isUnifiedAutoloopInFlight(unified) {
556
+ return unified?.executionMode === "autoloop" && unified.autoloopFinal === void 0;
557
+ }
558
+ function deriveStatusFromRunRecord(record) {
559
+ const status = String(record.status ?? "").toLowerCase();
560
+ if (status === "completed") {
561
+ return "completed";
562
+ }
563
+ if (status === "failed" || status === "not_complete") {
564
+ return "failed";
565
+ }
566
+ if (status === "running" || status === "in_progress") {
567
+ return "running";
568
+ }
569
+ if (typeof record.success === "boolean") {
570
+ return record.success ? "completed" : "failed";
571
+ }
572
+ return "unknown";
573
+ }
574
+ function deriveStatusFromTrajectory(record) {
575
+ const status = String(record.status ?? "").toLowerCase();
576
+ if (status === "completed") {
577
+ return "completed";
578
+ }
579
+ if (status === "failed" || status === "not_complete") {
580
+ return "failed";
581
+ }
582
+ if (typeof record.success === "boolean") {
583
+ return record.success ? "completed" : "failed";
584
+ }
585
+ if (record.completedAt) {
586
+ return "unknown";
587
+ }
588
+ return "unknown";
589
+ }
590
+ function iterationCountFromUnified(unified) {
591
+ const current = unified?.iteration?.current;
592
+ if (typeof current?.index === "number") {
593
+ return current.index + 1;
594
+ }
595
+ const history = unified?.iteration?.history;
596
+ if (Array.isArray(history) && history.length > 0) {
597
+ const last = history[history.length - 1];
598
+ if (typeof last?.index === "number") {
599
+ return last.index + 1;
600
+ }
601
+ }
602
+ return void 0;
603
+ }
604
+ function hasAutoloopMonitorEvidence(taskId, opts = {}) {
605
+ return readAutoloopTaskState(taskId, opts) !== null;
606
+ }
607
+ function readAutoloopTaskState(taskId, opts = {}) {
608
+ const cwd = opts.cwd ?? process.cwd();
609
+ const unifiedStateDir = opts.unifiedStateDir ?? resolveProjectRuntimeDir(path.join(cwd, ".build-project"), "state");
610
+ const runResultPath = resolveAutoloopRunResultPath(cwd, taskId);
611
+ const trajectoryPath = resolveAutoloopTrajectoryPath(cwd, taskId);
612
+ const unified = readUnifiedAutoloopState(unifiedStateDir, taskId);
613
+ const runRecord = readJsonFile(
614
+ runResultPath,
615
+ `Autoloop run result (${taskId})`
616
+ );
617
+ const trajectory = readJsonFile(
618
+ trajectoryPath,
619
+ `Autoloop trajectory (${taskId})`
620
+ );
621
+ if (!unified && !runRecord && !trajectory) {
622
+ return null;
623
+ }
624
+ const updatedAt = (typeof unified?.updatedAt === "number" ? new Date(unified.updatedAt).toISOString() : void 0) ?? runRecord?.recordedAt ?? trajectory?.completedAt ?? trajectory?.startedAt;
625
+ let status = "unknown";
626
+ let statusSource;
627
+ let liveMonitoringNote;
628
+ let success;
629
+ let terminationReason;
630
+ let totalIterations;
631
+ let provider;
632
+ let model;
633
+ let branch;
634
+ let worktree;
635
+ let startedAt;
636
+ let completedAt;
637
+ if (unified?.autoloopFinal) {
638
+ const finalMarker = unified.autoloopFinal;
639
+ success = finalMarker.success;
640
+ status = finalMarker.success ? "completed" : "failed";
641
+ statusSource = "autoloop_final";
642
+ terminationReason = finalMarker.terminationReason;
643
+ totalIterations = finalMarker.totalIterations;
644
+ provider = finalMarker.summary.provider;
645
+ model = finalMarker.summary.model;
646
+ startedAt = finalMarker.summary.startedAt;
647
+ completedAt = new Date(finalMarker.completedAt).toISOString();
648
+ } else if (runRecord) {
649
+ status = deriveStatusFromRunRecord(runRecord);
650
+ statusSource = "run_result";
651
+ success = typeof runRecord.success === "boolean" ? runRecord.success : status === "completed" ? true : status === "failed" ? false : void 0;
652
+ terminationReason = runRecord.terminationReason;
653
+ totalIterations = runRecord.totalIterations;
654
+ provider = runRecord.provider ?? void 0;
655
+ model = runRecord.model;
656
+ completedAt = runRecord.recordedAt;
657
+ } else if (trajectory) {
658
+ status = deriveStatusFromTrajectory(trajectory);
659
+ statusSource = "trajectory";
660
+ success = trajectory.success;
661
+ terminationReason = trajectory.terminationReason;
662
+ totalIterations = trajectory.totalIterations;
663
+ provider = trajectory.provider;
664
+ model = trajectory.model;
665
+ branch = trajectory.branch;
666
+ worktree = trajectory.worktree;
667
+ startedAt = trajectory.startedAt;
668
+ completedAt = trajectory.completedAt;
669
+ } else if (isUnifiedAutoloopInFlight(unified)) {
670
+ status = "running";
671
+ statusSource = "unified_state_only";
672
+ liveMonitoringNote = IN_FLIGHT_MONITORING_NOTE;
673
+ totalIterations = iterationCountFromUnified(unified);
674
+ } else if (unified?.executionMode === "autoloop") {
675
+ status = "unknown";
676
+ statusSource = "unified_state_only";
677
+ }
678
+ if (runRecord && !terminationReason) {
679
+ terminationReason = runRecord.terminationReason;
680
+ }
681
+ if (runRecord && totalIterations === void 0) {
682
+ totalIterations = runRecord.totalIterations;
683
+ }
684
+ if (trajectory) {
685
+ branch = branch ?? trajectory.branch;
686
+ worktree = worktree ?? trajectory.worktree;
687
+ provider = provider ?? trajectory.provider;
688
+ model = model ?? trajectory.model;
689
+ startedAt = startedAt ?? trajectory.startedAt;
690
+ completedAt = completedAt ?? trajectory.completedAt;
691
+ if (totalIterations === void 0) {
692
+ totalIterations = trajectory.totalIterations;
693
+ }
694
+ if (!terminationReason) {
695
+ terminationReason = trajectory.terminationReason;
696
+ }
697
+ if (success === void 0 && typeof trajectory.success === "boolean") {
698
+ success = trajectory.success;
699
+ }
700
+ }
701
+ if (status === "running" && statusSource === "unified_state_only") {
702
+ liveMonitoringNote = IN_FLIGHT_MONITORING_NOTE;
703
+ }
704
+ return {
705
+ taskId,
706
+ kind: "autoloop_task",
707
+ status,
708
+ success,
709
+ terminationReason,
710
+ totalIterations,
711
+ provider: provider && provider.length > 0 ? provider : void 0,
712
+ model,
713
+ branch,
714
+ worktree,
715
+ startedAt,
716
+ completedAt,
717
+ updatedAt,
718
+ runResultPath: fs.existsSync(runResultPath) ? runResultPath : void 0,
719
+ runResultRelativePath: fs.existsSync(runResultPath) ? path.relative(cwd, runResultPath) : void 0,
720
+ trajectoryPath: fs.existsSync(trajectoryPath) ? trajectoryPath : void 0,
721
+ trajectoryRelativePath: fs.existsSync(trajectoryPath) ? path.relative(cwd, trajectoryPath) : void 0,
722
+ statusSource,
723
+ persistence: unified?.autoloopFinal?.persistence,
724
+ liveMonitoringNote
725
+ };
726
+ }
727
+ function formatAutoloopMonitorHints(taskId, state) {
728
+ const safeRun = sanitizeAutoloopRunFilename(taskId);
729
+ const safeTrajectory = sanitizeAutoloopTrajectoryFilename(taskId);
730
+ const hints = [
731
+ "This ID may be from build run --autoloop.",
732
+ `Run summary (written at completion): .build-project/autoloop/runs/${safeRun}.json`,
733
+ `Trajectory: .build-project/autoloop/runs/${safeTrajectory}.trajectory.json`,
734
+ "For run history use: build run autoloop history",
735
+ `For iteration detail use: build loop explain ${taskId}`
736
+ ];
737
+ if (state?.branch) {
738
+ hints.push(`Review changes: git switch ${state.branch}`);
739
+ }
740
+ if (state?.status === "running") {
741
+ hints.push(IN_FLIGHT_MONITORING_NOTE);
742
+ }
743
+ return hints;
744
+ }
745
+
746
+ // src/cli/commands/monitor-health-liveness.ts
747
+ import * as fs2 from "fs";
748
+ var MONITOR_STALE_AFTER_MS = 10 * 60 * 1e3;
749
+ function defaultStatMtimeMs(filePath) {
750
+ try {
751
+ return fs2.statSync(filePath).mtimeMs;
752
+ } catch {
753
+ return void 0;
754
+ }
755
+ }
756
+ function runEventsLogPath(state) {
757
+ const handlePath = state.sources.competitionHandle.path;
758
+ return handlePath.endsWith(".json") ? `${handlePath.slice(0, -5)}.events.jsonl` : void 0;
759
+ }
760
+ function buildMonitorProgressHealth(state, handleUpdatedAt, deps = {}) {
761
+ const eventsPath = runEventsLogPath(state);
762
+ const eventsModifiedAt = eventsPath ? (deps.statMtimeMs ?? defaultStatMtimeMs)(eventsPath) : void 0;
763
+ const activity = [handleUpdatedAt, eventsModifiedAt].filter(
764
+ (value) => typeof value === "number" && Number.isFinite(value)
765
+ );
766
+ const lastProgressAt = activity.length > 0 ? Math.max(...activity) : void 0;
767
+ const ownerPid = state.ownerPid;
768
+ const ownerProcess = typeof ownerPid === "number" ? (deps.observeProcess ?? defaultObserveProcess)(ownerPid) : void 0;
769
+ if (lastProgressAt === void 0 && ownerProcess === void 0) return void 0;
770
+ return {
771
+ lastProgressAt,
772
+ staleAfterMs: MONITOR_STALE_AFTER_MS,
773
+ progressLabel: state.background?.activePhase ?? state.status,
774
+ ownerProcess,
775
+ ownerPid
776
+ };
777
+ }
778
+
779
+ // src/cli/commands/monitor-variant-label.ts
780
+ function formatMonitorVariantLabel(variant) {
781
+ const effort = normalizeReasoningEffortInput(variant.reasoningEffort) ?? (variant.variant ? normalizeReasoningEffortInput(parseVariantIdentifier(variant.variant).reasoningEffort) : void 0);
782
+ const base = `${variant.provider}${variant.model ? `:${variant.model}` : ""}`;
783
+ return effort ? `${base}:effort-${formatReasoningEffortLevelForUser(effort, variant.provider)}` : base;
784
+ }
785
+ var MONITOR_VARIANT_RAN_LABEL = "Ran";
786
+
787
+ // src/cli/commands/monitor.ts
788
+ function formatMonitorWinnerOrIdentityLine(state) {
789
+ if (!state.winner) return null;
790
+ const identityLabel = state.winner.variant?.trim() || `${state.winner.provider}${state.winner.model ? `:${state.winner.model}` : ""}`;
791
+ return state.decision?.reason === "judge_off" ? `Ungraded identity: ${identityLabel}` : `Winner: ${identityLabel}`;
792
+ }
793
+ function buildMonitorJsonPayload(rawHandle, state) {
794
+ if (!rawHandle || typeof rawHandle !== "object" || !state.winner || state.decision?.reason !== "judge_off") {
795
+ return rawHandle;
796
+ }
797
+ return {
798
+ ...rawHandle,
799
+ winner: null,
800
+ ungradedIdentity: state.winner
801
+ };
802
+ }
803
+ function formatMonitorVariantHonestyLine(variant) {
804
+ const lintStatus = "lintStatus" in variant ? variant.lintStatus : void 0;
805
+ if (!variant.outcome?.verification && variant.testStatus == null && lintStatus == null) {
806
+ return null;
807
+ }
808
+ return formatVariantHonestyGateLine(readVariantVerification(variant));
809
+ }
810
+ function formatMonitorSynthesisStatus(synthesis) {
811
+ const aiGuidedFallbackStatus = synthesis.aiGuidedFallbackAttempted === true ? (() => {
812
+ switch (synthesis.aiGuidedFallbackOutcome) {
813
+ case "donor_augmented":
814
+ return "ai fallback donor-augmented (applied)";
815
+ case "winner_equivalent":
816
+ return "ai fallback winner-equivalent (not applied)";
817
+ case "candidate_rejected":
818
+ return "ai fallback rejected by apply/gates (not applied)";
819
+ case "generation_failed":
820
+ return "ai fallback failed (winner retained)";
821
+ default:
822
+ return "ai fallback attempted";
823
+ }
824
+ })() : null;
825
+ const status = aiGuidedFallbackStatus ?? (synthesis.synthesisApplied ? "applied" : synthesis.winnerFallback ? "winner fallback" : synthesis.gatesPassed === false ? "gates failed" : synthesis.success === false ? "failed" : synthesis.success === true ? "completed" : "attempted");
826
+ const details = [];
827
+ if (typeof synthesis.deliverySucceeded === "boolean") {
828
+ details.push(`delivery=${synthesis.deliverySucceeded ? "yes" : "no"}`);
829
+ }
830
+ if (synthesis.synthesisApplied === true && synthesis.mergedVariants.length > 0) {
831
+ details.push(`donors=${synthesis.mergedVariants.length}`);
832
+ }
833
+ if (typeof synthesis.prNumber === "number") {
834
+ details.push(`PR #${synthesis.prNumber}`);
835
+ } else if (synthesis.prUrl) {
836
+ details.push(synthesis.prUrl);
837
+ }
838
+ if (synthesis.fallbackReason) {
839
+ details.push(synthesis.fallbackReason);
840
+ }
841
+ return details.length > 0 ? `${status} (${details.join(" \u2022 ")})` : status;
842
+ }
843
+ function failMonitorCommand() {
844
+ throw new ExitCodeError(1);
845
+ }
846
+ function buildAutoloopMonitorJsonPayload(state) {
847
+ return {
848
+ taskId: state.taskId,
849
+ kind: state.kind,
850
+ status: state.status,
851
+ success: state.success,
852
+ terminationReason: state.terminationReason,
853
+ totalIterations: state.totalIterations,
854
+ provider: state.provider,
855
+ model: state.model,
856
+ branch: state.branch,
857
+ worktree: state.worktree,
858
+ startedAt: state.startedAt,
859
+ completedAt: state.completedAt,
860
+ updatedAt: state.updatedAt,
861
+ statusSource: state.statusSource,
862
+ liveMonitoringNote: state.liveMonitoringNote,
863
+ runResult: state.runResultRelativePath,
864
+ trajectory: state.trajectoryRelativePath
865
+ };
866
+ }
867
+ function renderAutoloopMonitorState(state, opts) {
868
+ if (opts.json) {
869
+ const payload = buildAutoloopMonitorJsonPayload(state);
870
+ console.log(opts.follow ? JSON.stringify(payload) : JSON.stringify(payload, null, 2));
871
+ return;
872
+ }
873
+ console.log(chalk.bold.cyan(`
874
+ Monitor: ${state.taskId}`));
875
+ console.log(chalk.cyan("Mode: build run --autoloop"));
876
+ console.log(chalk.gray(`Status: ${state.status}`));
877
+ if (state.terminationReason) {
878
+ console.log(chalk.gray(`Termination: ${state.terminationReason}`));
879
+ }
880
+ if (typeof state.totalIterations === "number") {
881
+ console.log(chalk.gray(`Iterations: ${state.totalIterations}`));
882
+ }
883
+ if (state.provider) {
884
+ console.log(chalk.gray(`Provider: ${state.provider}${state.model ? `:${state.model}` : ""}`));
885
+ }
886
+ if (state.branch) {
887
+ console.log(chalk.gray(`Branch: ${state.branch}`));
888
+ }
889
+ if (state.worktree) {
890
+ console.log(chalk.gray(`Worktree: ${state.worktree}`));
891
+ }
892
+ if (state.updatedAt) {
893
+ console.log(chalk.gray(`Updated: ${state.updatedAt}`));
894
+ }
895
+ if (state.startedAt) {
896
+ console.log(chalk.gray(`Started: ${state.startedAt}`));
897
+ }
898
+ if (state.completedAt) {
899
+ console.log(chalk.gray(`Completed: ${state.completedAt}`));
900
+ }
901
+ if (typeof state.success === "boolean") {
902
+ console.log(state.success ? chalk.green("Success: yes") : chalk.red("Success: no"));
903
+ }
904
+ if (state.liveMonitoringNote) {
905
+ console.log(chalk.yellow(state.liveMonitoringNote));
906
+ }
907
+ if (state.runResultRelativePath) {
908
+ console.log(chalk.gray(`Run summary: ${state.runResultRelativePath}`));
909
+ } else if (state.status === "running") {
910
+ console.log(chalk.gray("Run summary not written yet (expected at completion)."));
911
+ }
912
+ if (state.trajectoryRelativePath) {
913
+ console.log(chalk.gray(`Trajectory: ${state.trajectoryRelativePath}`));
914
+ }
915
+ console.log();
916
+ console.log(chalk.gray("Tips:"));
917
+ for (const hint of formatAutoloopMonitorHints(state.taskId, state)) {
918
+ console.log(chalk.gray(` - ${hint}`));
919
+ }
920
+ }
921
+ function buildRunTaskMonitorJsonPayload(state) {
922
+ const artifact = state.artifact;
923
+ return {
924
+ taskId: state.taskId,
925
+ kind: state.kind,
926
+ executionMode: state.executionMode,
927
+ status: state.status,
928
+ success: state.success,
929
+ updatedAt: state.updatedAt,
930
+ provider: artifact?.provider,
931
+ model: artifact?.model,
932
+ variant: artifact?.variant,
933
+ exitCode: artifact?.exitCode,
934
+ startedAt: artifact?.startedAt,
935
+ finishedAt: artifact?.finishedAt,
936
+ providerOutputArtifact: state.providerOutputArtifactRelativePath,
937
+ artifact
938
+ };
939
+ }
940
+ function renderRunTaskMonitorState(state, opts) {
941
+ if (opts.json) {
942
+ const payload = buildRunTaskMonitorJsonPayload(state);
943
+ console.log(opts.follow ? JSON.stringify(payload) : JSON.stringify(payload, null, 2));
944
+ return;
945
+ }
946
+ console.log(chalk.bold.cyan(`
947
+ Monitor: ${state.taskId}`));
948
+ console.log(chalk.cyan("Mode: build run (single-pass)"));
949
+ if (state.executionMode) {
950
+ console.log(chalk.gray(`Execution mode: ${formatExecutionModeLabel(state.executionMode)}`));
951
+ }
952
+ console.log(chalk.gray(`Status: ${state.status}`));
953
+ if (state.updatedAt) {
954
+ console.log(chalk.gray(`Updated: ${state.updatedAt}`));
955
+ }
956
+ const artifact = state.artifact;
957
+ if (artifact) {
958
+ console.log(
959
+ chalk.gray(`Provider: ${artifact.provider}${artifact.model ? `:${artifact.model}` : ""}`)
960
+ );
961
+ if (artifact.variant) {
962
+ console.log(chalk.gray(`Variant: ${artifact.variant}`));
963
+ }
964
+ console.log(artifact.success ? chalk.green("Success: yes") : chalk.red("Success: no"));
965
+ if (typeof artifact.exitCode === "number") {
966
+ console.log(chalk.gray(`Exit code: ${artifact.exitCode}`));
967
+ }
968
+ if (artifact.finishedAt) {
969
+ console.log(chalk.gray(`Finished: ${artifact.finishedAt}`));
970
+ }
971
+ if (state.providerOutputArtifactRelativePath) {
972
+ console.log(chalk.gray(`Provider output: ${state.providerOutputArtifactRelativePath}`));
973
+ }
974
+ } else if (state.providerOutputArtifactRelativePath) {
975
+ console.log(chalk.gray("Run still in progress; provider-output artifact not written yet."));
976
+ console.log(chalk.gray(`Expected artifact: ${state.providerOutputArtifactRelativePath}`));
977
+ }
978
+ console.log();
979
+ console.log(chalk.gray("Tips:"));
980
+ for (const hint of formatRunTaskMonitorHints(state.taskId)) {
981
+ console.log(chalk.gray(` - ${hint}`));
982
+ }
983
+ }
984
+ function isSafeMonitorId(value) {
985
+ return /^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(value);
986
+ }
987
+ function isSafeLabId(value) {
988
+ return /^[A-Za-z0-9_-]+$/.test(value);
989
+ }
990
+ function isSafeRunId(value) {
991
+ return /^\d{8}-\d{6}-\d{3}$/.test(value);
992
+ }
993
+ function isTerminalMonitorState(state) {
994
+ const status = String(state.status ?? state.background?.status ?? "").toLowerCase();
995
+ const outcome = String(state.outcome ?? "").toLowerCase();
996
+ const terminalStatuses = /* @__PURE__ */ new Set(["completed", "complete", "failed", "failure", "cancelled"]);
997
+ const terminalOutcomes = /* @__PURE__ */ new Set(["completed", "failed", "no_winner", "cancelled"]);
998
+ return Boolean(state.completedAt ?? state.background?.completedAt ?? state.background?.failedAt) || terminalStatuses.has(status) || terminalOutcomes.has(outcome);
999
+ }
1000
+ function isTerminalRunTaskState(state) {
1001
+ return state.status === "completed" || state.status === "failed" || Boolean(state.artifact);
1002
+ }
1003
+ function isTerminalAutoloopState(state) {
1004
+ return state.status === "completed" || state.status === "failed";
1005
+ }
1006
+ function isRunTaskMonitorState(state) {
1007
+ return "kind" in state && state.kind === "run_task";
1008
+ }
1009
+ function isAutoloopMonitorState(state) {
1010
+ return "kind" in state && state.kind === "autoloop_task";
1011
+ }
1012
+ function isTerminalMonitorRenderState(state) {
1013
+ if (isRunTaskMonitorState(state)) {
1014
+ return isTerminalRunTaskState(state);
1015
+ }
1016
+ if (isAutoloopMonitorState(state)) {
1017
+ return isTerminalAutoloopState(state);
1018
+ }
1019
+ return isTerminalMonitorState(state);
1020
+ }
1021
+ function parseMonitorTimestamp(value) {
1022
+ if (!value) return void 0;
1023
+ const parsed = Date.parse(value);
1024
+ return Number.isFinite(parsed) ? parsed : void 0;
1025
+ }
1026
+ function normalizeRunLifecycleStatus(value) {
1027
+ const status = String(value ?? "unknown").toLowerCase();
1028
+ switch (status) {
1029
+ case "queued":
1030
+ case "pending":
1031
+ case "starting":
1032
+ case "running":
1033
+ case "processing":
1034
+ case "verifying":
1035
+ case "completed":
1036
+ case "failed":
1037
+ case "cancelled":
1038
+ case "idle":
1039
+ return status;
1040
+ case "complete":
1041
+ return "completed";
1042
+ case "canceled":
1043
+ case "cancelled_by_user":
1044
+ return "cancelled";
1045
+ case "in-progress":
1046
+ case "in_progress":
1047
+ case "submitted":
1048
+ case "executing":
1049
+ return "running";
1050
+ default:
1051
+ return "unknown";
1052
+ }
1053
+ }
1054
+ function inferProviderHealthFromVariant(variant) {
1055
+ const diagnostics = variant.providerDiagnostics;
1056
+ const execution = variant.outcome?.execution;
1057
+ const executionStatus = String(execution?.status ?? "").toLowerCase();
1058
+ const authErrors = diagnostics?.authErrors ?? [];
1059
+ const transportErrors = diagnostics?.transportErrors ?? [];
1060
+ const toolErrors = diagnostics?.toolErrors ?? [];
1061
+ const authBroken = variant.authError !== void 0 || authErrors.length > 0;
1062
+ const timedOut = variant.timedOut === true || variant.terminationReason === "timeout" || executionStatus === "timed_out";
1063
+ const outputFailure = diagnostics?.terminalResultPresent === false;
1064
+ const executionFailed = executionStatus === "failed" || executionStatus === "crashed" || variant.success === false && executionStatus === "";
1065
+ const failed = authBroken || timedOut || outputFailure || executionFailed;
1066
+ const error = variant.authError?.message ?? authErrors[0] ?? transportErrors[0] ?? toolErrors[0] ?? variant.errorMessage ?? variant.terminationReason;
1067
+ return {
1068
+ provider: variant.provider ?? "unknown",
1069
+ variant: "variant" in variant ? variant.variant : void 0,
1070
+ authState: authBroken ? "invalid" : void 0,
1071
+ availability: authBroken ? void 0 : timedOut ? "degraded" : executionFailed ? "unavailable" : void 0,
1072
+ lastError: error || void 0,
1073
+ lastFailurePhase: authBroken ? "startup" : timedOut ? "timeout" : outputFailure ? "output" : executionFailed ? "mid_execution" : void 0,
1074
+ consecutiveFailures: failed ? 1 : void 0
1075
+ };
1076
+ }
1077
+ function structuredOutputErrors(variant) {
1078
+ if (variant.providerDiagnostics?.terminalResultPresent !== false) return [];
1079
+ return [`${variant.provider ?? "unknown"} did not emit its required terminal result event.`];
1080
+ }
1081
+ function buildMonitorHealthSnapshot(state, deps) {
1082
+ const status = normalizeRunLifecycleStatus(
1083
+ state.status ?? state.background?.status ?? state.background?.activePhase
1084
+ );
1085
+ const updatedAt = parseMonitorTimestamp(state.updatedAt) ?? parseMonitorTimestamp(state.background?.completedAt) ?? parseMonitorTimestamp(state.background?.startedAt);
1086
+ const completedAt = parseMonitorTimestamp(state.completedAt) ?? parseMonitorTimestamp(state.background?.completedAt) ?? parseMonitorTimestamp(state.background?.failedAt);
1087
+ const variants = state.primarySource === "background_handle" && state.background ? state.background.variants : state.variants;
1088
+ const outputErrors = variants.flatMap((variant) => structuredOutputErrors(variant));
1089
+ const completedVariants = variants.filter((variant) => variant.success === true).length;
1090
+ const noWinner = state.outcome === "no_winner" || status === "completed" && !state.winner && variants.length > 1;
1091
+ const providers = variants.filter((variant) => variant.provider).map((variant) => inferProviderHealthFromVariant(variant));
1092
+ return buildRunHealthSnapshot({
1093
+ runId: resolveDisplayId(state),
1094
+ taskId: state.taskId,
1095
+ status,
1096
+ updatedAt,
1097
+ progress: buildMonitorProgressHealth(state, updatedAt, deps),
1098
+ providers,
1099
+ judge: noWinner || state.errorMessage ? {
1100
+ status: noWinner ? "no_winner" : "failed",
1101
+ completedVariants,
1102
+ reason: noWinner ? "No winner was selected." : state.errorMessage
1103
+ } : void 0,
1104
+ output: outputErrors.length > 0 ? {
1105
+ parseErrors: outputErrors,
1106
+ unparseable: true
1107
+ } : void 0,
1108
+ handoff: completedAt && state.synthesis ? {
1109
+ runCompleted: true,
1110
+ success: state.synthesis.success === true || state.synthesis.deliverySucceeded === true,
1111
+ changesProduced: state.synthesis.synthesisApplied === true || state.synthesis.winnerFallback === true,
1112
+ durableArtifactPresent: Boolean(
1113
+ state.synthesis.prNumber || state.synthesis.prUrl || state.synthesis.deliverySucceeded || state.synthesis.synthesisApplied
1114
+ ),
1115
+ reviewArtifactPresent: Boolean(state.synthesis.prNumber || state.synthesis.prUrl),
1116
+ applied: state.synthesis.synthesisApplied
1117
+ } : void 0
1118
+ });
1119
+ }
1120
+ function formatHealthEvent(event) {
1121
+ const provider = event.provider ? ` provider=${event.provider}` : "";
1122
+ return `${event.severity.toUpperCase()} ${event.category}${provider}: ${event.summary}`;
1123
+ }
1124
+ function renderSingleHealthEvent(event, indent = "") {
1125
+ const color = event.severity === "critical" ? chalk.red : event.severity === "warning" ? chalk.yellow : chalk.gray;
1126
+ console.log(color(`${indent}${formatHealthEvent(event)}`));
1127
+ const firstAction = event.suggestedActions[0];
1128
+ if (firstAction) {
1129
+ console.log(chalk.gray(`${indent}Action: ${firstAction.command ?? firstAction.label}`));
1130
+ }
1131
+ }
1132
+ function renderHealthEventsGrouped(events) {
1133
+ const SEVERITY_RANK = {
1134
+ critical: 3,
1135
+ warning: 2,
1136
+ info: 1
1137
+ };
1138
+ const byCategory = /* @__PURE__ */ new Map();
1139
+ for (const event of events) {
1140
+ const bucket = byCategory.get(event.category) ?? [];
1141
+ bucket.push(event);
1142
+ byCategory.set(event.category, bucket);
1143
+ }
1144
+ const groups = [...byCategory.entries()].sort(([, aEvents], [, bEvents]) => {
1145
+ const aWorst = Math.max(...aEvents.map((e) => SEVERITY_RANK[e.severity] ?? 1));
1146
+ const bWorst = Math.max(...bEvents.map((e) => SEVERITY_RANK[e.severity] ?? 1));
1147
+ return bWorst - aWorst;
1148
+ });
1149
+ for (const [category, groupEvents] of groups) {
1150
+ const worstSeverity = groupEvents.reduce(
1151
+ (w, e) => (SEVERITY_RANK[e.severity] ?? 1) > (SEVERITY_RANK[w] ?? 1) ? e.severity : w,
1152
+ "info"
1153
+ );
1154
+ const headerColor = worstSeverity === "critical" ? chalk.red.bold : worstSeverity === "warning" ? chalk.yellow.bold : chalk.gray.bold;
1155
+ const count = groupEvents.length > 1 ? ` (${groupEvents.length})` : "";
1156
+ console.log(headerColor(`
1157
+ [${category}]${count}`));
1158
+ for (const event of groupEvents) {
1159
+ renderSingleHealthEvent(event, " ");
1160
+ }
1161
+ }
1162
+ }
1163
+ function filterHealthEvents(events, category, severity) {
1164
+ let filtered = events;
1165
+ if (category) {
1166
+ filtered = filtered.filter((e) => e.category === category);
1167
+ }
1168
+ if (severity) {
1169
+ filtered = filtered.filter((e) => e.severity === severity);
1170
+ }
1171
+ return filtered;
1172
+ }
1173
+ function renderHealthEvents(events, opts = {}) {
1174
+ const filtered = filterHealthEvents(events, opts.category, opts.severity);
1175
+ const summary = summarizeRunHealth(filtered);
1176
+ console.log(chalk.bold("\nHealth:"));
1177
+ console.log(chalk.gray(`Status: ${summary.worstSeverity}`));
1178
+ if (filtered.length === 0) {
1179
+ console.log(chalk.gray(" (no events match the current filter)"));
1180
+ return;
1181
+ }
1182
+ if (opts.category) {
1183
+ for (const event of filtered) {
1184
+ renderSingleHealthEvent(event, " ");
1185
+ }
1186
+ } else {
1187
+ renderHealthEventsGrouped(filtered);
1188
+ }
1189
+ }
1190
+ var RUN_HEALTH_CATEGORIES = /* @__PURE__ */ new Set([
1191
+ "stalled",
1192
+ "auth_broken",
1193
+ "provider_unhealthy",
1194
+ "budget_burn",
1195
+ "judge_disagree",
1196
+ "output_drift",
1197
+ "worktree_blocked",
1198
+ "handoff_missing",
1199
+ "working",
1200
+ "idle"
1201
+ ]);
1202
+ var RUN_HEALTH_SEVERITIES = /* @__PURE__ */ new Set(["info", "warning", "critical"]);
1203
+ function parseHealthCategory(value) {
1204
+ if (value === void 0) return void 0;
1205
+ if (RUN_HEALTH_CATEGORIES.has(value)) {
1206
+ return value;
1207
+ }
1208
+ throw new Error(
1209
+ `Invalid health category "${value}". Expected one of: ${Array.from(RUN_HEALTH_CATEGORIES).join(", ")}`
1210
+ );
1211
+ }
1212
+ function parseHealthSeverity(value) {
1213
+ if (value === void 0) return void 0;
1214
+ if (RUN_HEALTH_SEVERITIES.has(value)) {
1215
+ return value;
1216
+ }
1217
+ throw new Error(
1218
+ `Invalid health severity "${value}". Expected one of: ${Array.from(RUN_HEALTH_SEVERITIES).join(", ")}`
1219
+ );
1220
+ }
1221
+ function createMonitorCommand() {
1222
+ const cmd = new Command("monitor").alias("m").description(
1223
+ "Monitor a competition task by taskId (handle file)\n\nExamples:\n build monitor T123456\n build monitor T123456 --follow\n build monitor T123456 --detailed --interval 10\n build monitor T123456 --lab --lab-id lab-abc123 --run-id 20251210-153042-001"
1224
+ ).argument("<taskId>", "(REQUIRED) Competition task ID (e.g., T123456)").option("--json", "(OPTIONAL) Output raw JSON handle").option("--health", "(OPTIONAL) Show operator-oriented run health").option(
1225
+ "--category <category>",
1226
+ "(OPTIONAL) Filter health output to a specific category (requires --health)\n Categories: stalled, auth_broken, provider_unhealthy, budget_burn,\n judge_disagree, output_drift, worktree_blocked, handoff_missing,\n working, idle\n Example: --health --category stalled"
1227
+ ).option(
1228
+ "--severity <severity>",
1229
+ "(OPTIONAL) Filter health output to a specific severity (requires --health)\n Values: info, warning, critical\n Example: --health --severity critical"
1230
+ ).option(
1231
+ "--follow",
1232
+ "(OPTIONAL) Refresh periodically and print updates\n Example: --follow"
1233
+ ).option(
1234
+ "--interval <seconds>",
1235
+ "(OPTIONAL) Refresh interval in seconds (default: 15)\n Example: --interval 10",
1236
+ "15"
1237
+ ).option(
1238
+ "--timeout <minutes>",
1239
+ "(OPTIONAL) Stop --follow after this many minutes\n Example: --timeout 30"
1240
+ ).option(
1241
+ "--detailed",
1242
+ "(OPTIONAL) Show additional local inspection tips\n Example: --detailed"
1243
+ ).option(
1244
+ "--lab",
1245
+ "(OPTIONAL) Monitor a lab run (uses lab-specific state directory)\n Example: --lab"
1246
+ ).option(
1247
+ "--lab-id <labId>",
1248
+ "(OPTIONAL) Specify lab ID for monitoring (requires --run-id)\n Example: --lab-id lab-abc123"
1249
+ ).option(
1250
+ "--run-id <runId>",
1251
+ "(OPTIONAL) Specify run ID for lab monitoring (requires --lab-id)\n Example: --run-id 20251210-153042-001"
1252
+ ).action(
1253
+ async (taskId, opts) => {
1254
+ const emitError = (message, extra) => {
1255
+ if (opts.json) {
1256
+ console.log(JSON.stringify({ error: message, ...extra }));
1257
+ } else {
1258
+ console.log(chalk.red(`
1259
+ Error: ${message}`));
1260
+ }
1261
+ };
1262
+ if (!isSafeMonitorId(taskId)) {
1263
+ emitError(`invalid taskId "${taskId}"`);
1264
+ failMonitorCommand();
1265
+ }
1266
+ if (opts.lab && !opts.labId && !opts.runId) {
1267
+ emitError("--lab requires --lab-id and --run-id to specify which lab run to monitor");
1268
+ if (!opts.json) {
1269
+ console.log(chalk.yellow("\nUsage:"));
1270
+ console.log(chalk.gray(" build monitor <taskId> --lab-id <labId> --run-id <runId>"));
1271
+ console.log(chalk.yellow("\nTo find available labs:"));
1272
+ console.log(chalk.gray(" ls .build-project/labs/ # List lab IDs"));
1273
+ console.log(
1274
+ chalk.gray(" ls .build-project/labs/<labId>/runs/ # List run IDs for a lab")
1275
+ );
1276
+ console.log(chalk.yellow("\nNote:"));
1277
+ console.log(
1278
+ chalk.gray(" The --lab flag is optional when using --lab-id and --run-id together")
1279
+ );
1280
+ }
1281
+ failMonitorCommand();
1282
+ }
1283
+ if (opts.labId && !opts.runId) {
1284
+ emitError("--lab-id requires --run-id");
1285
+ if (!opts.json) {
1286
+ console.log(chalk.gray("Lab runs are organized by both lab ID and run ID"));
1287
+ console.log(chalk.yellow("\nUsage:"));
1288
+ console.log(
1289
+ chalk.gray(" build monitor T123456 --lab-id lab-abc123 --run-id 20251210-153042-001")
1290
+ );
1291
+ console.log(chalk.yellow("\nTo find run IDs for a lab:"));
1292
+ console.log(
1293
+ chalk.gray(" ls .build-project/labs/<labId>/runs/ # List available runs")
1294
+ );
1295
+ }
1296
+ failMonitorCommand();
1297
+ }
1298
+ if (opts.runId && !opts.labId) {
1299
+ emitError("--run-id requires --lab-id");
1300
+ if (!opts.json) {
1301
+ console.log(chalk.gray("Lab runs are organized by both lab ID and run ID"));
1302
+ console.log(chalk.yellow("\nUsage:"));
1303
+ console.log(
1304
+ chalk.gray(" build monitor T123456 --lab-id lab-abc123 --run-id 20251210-153042-001")
1305
+ );
1306
+ console.log(chalk.yellow("\nTo find lab IDs:"));
1307
+ console.log(chalk.gray(" ls .build-project/labs/ # List available labs"));
1308
+ }
1309
+ failMonitorCommand();
1310
+ }
1311
+ if (opts.labId && !isSafeLabId(opts.labId)) {
1312
+ emitError(`invalid --lab-id "${opts.labId}"`);
1313
+ failMonitorCommand();
1314
+ }
1315
+ if (opts.runId && !isSafeRunId(opts.runId)) {
1316
+ emitError(`invalid --run-id "${opts.runId}"`);
1317
+ failMonitorCommand();
1318
+ }
1319
+ let stateDir;
1320
+ let backgroundDir;
1321
+ let unifiedStateDir;
1322
+ const isLabMode = opts.lab || opts.labId;
1323
+ const repoRoot = getPlanningRoot();
1324
+ const buildDir = path2.join(repoRoot, ".build-project");
1325
+ if (isLabMode) {
1326
+ const { LabPathResolver } = await import("./lab-mode-YXQ2Y3NG.js");
1327
+ const resolver = LabPathResolver.getInstance();
1328
+ if (opts.labId && opts.runId) {
1329
+ resolver.setContext({
1330
+ labId: opts.labId,
1331
+ runId: opts.runId,
1332
+ baseline: "HEAD",
1333
+ // Default baseline (not critical for monitoring)
1334
+ task: ""
1335
+ // Empty task (not critical for monitoring)
1336
+ });
1337
+ }
1338
+ const stateRootDir = resolver.getStateDir(buildDir);
1339
+ stateDir = path2.join(stateRootDir, "competitions");
1340
+ backgroundDir = path2.join(stateRootDir, "background");
1341
+ unifiedStateDir = stateRootDir;
1342
+ } else {
1343
+ const roots = resolveCliStateRoots(repoRoot);
1344
+ stateDir = firstDirWithFile(roots.competitionsReadDirs, `${taskId}.json`);
1345
+ backgroundDir = firstDirWithFile(roots.backgroundReadDirs, `${taskId}.json`);
1346
+ unifiedStateDir = roots.unifiedStateDir;
1347
+ }
1348
+ let handlePath = path2.join(stateDir, `${taskId}.json`);
1349
+ let backgroundHandlePath = path2.join(backgroundDir, `${taskId}.json`);
1350
+ if (!isLabMode && !fs3.existsSync(handlePath) && !fs3.existsSync(backgroundHandlePath)) {
1351
+ const labMatch = findLabRunStateForTask(taskId, buildDir);
1352
+ if (labMatch) {
1353
+ stateDir = path2.join(labMatch.stateRoot, "competitions");
1354
+ backgroundDir = path2.join(labMatch.stateRoot, "background");
1355
+ unifiedStateDir = labMatch.stateRoot;
1356
+ handlePath = path2.join(stateDir, `${taskId}.json`);
1357
+ backgroundHandlePath = path2.join(backgroundDir, `${taskId}.json`);
1358
+ }
1359
+ }
1360
+ const runTaskEvidence = hasRunTaskMonitorEvidence(taskId, {
1361
+ cwd: repoRoot,
1362
+ unifiedStateDir
1363
+ });
1364
+ const autoloopEvidence = hasAutoloopMonitorEvidence(taskId, {
1365
+ cwd: repoRoot,
1366
+ unifiedStateDir
1367
+ });
1368
+ if (!fs3.existsSync(handlePath) && !fs3.existsSync(backgroundHandlePath) && !runTaskEvidence && !autoloopEvidence) {
1369
+ emitError(`Task not found: ${taskId}`, {
1370
+ code: "task_not_found",
1371
+ taskId
1372
+ });
1373
+ if (opts.json) {
1374
+ failMonitorCommand();
1375
+ }
1376
+ console.log(chalk.gray("\nPossible reasons:"));
1377
+ console.log(chalk.gray(" - Task ID is incorrect"));
1378
+ console.log(chalk.gray(" - Task was never created"));
1379
+ console.log(chalk.gray(" - Task state file was deleted"));
1380
+ console.log(chalk.yellow("\nPost-run visibility hints:"));
1381
+ for (const hint of formatRunTaskMonitorHints(taskId)) {
1382
+ console.log(chalk.gray(` - ${hint}`));
1383
+ }
1384
+ for (const hint of formatAutoloopMonitorHints(taskId)) {
1385
+ console.log(chalk.gray(` - ${hint}`));
1386
+ }
1387
+ try {
1388
+ const taskFiles = [];
1389
+ if (fs3.existsSync(stateDir)) {
1390
+ const files = fs3.readdirSync(stateDir).filter((f) => f.endsWith(".json"));
1391
+ for (const f of files) {
1392
+ const fullPath = path2.join(stateDir, f);
1393
+ const stats = fs3.statSync(fullPath);
1394
+ let title;
1395
+ try {
1396
+ const raw = JSON.parse(fs3.readFileSync(fullPath, "utf8"));
1397
+ if (raw && typeof raw === "object") {
1398
+ const prompt = raw.prompt ?? raw.intent ?? raw.goal;
1399
+ title = typeof prompt === "string" ? extractTitleFromPrompt(prompt) : void 0;
1400
+ }
1401
+ } catch {
1402
+ }
1403
+ taskFiles.push({
1404
+ taskId: f.replace(".json", ""),
1405
+ title,
1406
+ mtime: stats.mtime
1407
+ });
1408
+ }
1409
+ }
1410
+ const bgDir = path2.dirname(backgroundHandlePath);
1411
+ if (fs3.existsSync(bgDir)) {
1412
+ const bgFiles = fs3.readdirSync(bgDir).filter((f) => f.endsWith(".json"));
1413
+ for (const f of bgFiles) {
1414
+ const fullPath = path2.join(bgDir, f);
1415
+ const stats = fs3.statSync(fullPath);
1416
+ let title;
1417
+ try {
1418
+ const raw = JSON.parse(fs3.readFileSync(fullPath, "utf8"));
1419
+ if (raw && typeof raw === "object") {
1420
+ const prompt = raw.prompt ?? raw.intent ?? raw.goal;
1421
+ title = typeof prompt === "string" ? extractTitleFromPrompt(prompt) : void 0;
1422
+ }
1423
+ } catch {
1424
+ }
1425
+ taskFiles.push({
1426
+ taskId: f.replace(".json", ""),
1427
+ title,
1428
+ mtime: stats.mtime
1429
+ });
1430
+ }
1431
+ }
1432
+ if (taskFiles.length > 0) {
1433
+ console.log(chalk.yellow(`
1434
+ Available tasks (${taskFiles.length} found):`));
1435
+ const recentTasks = taskFiles.sort((a, b) => b.mtime.getTime() - a.mtime.getTime()).slice(0, 5);
1436
+ for (const task of recentTasks) {
1437
+ const age = Math.round((Date.now() - task.mtime.getTime()) / 6e4);
1438
+ const timeStr = age < 60 ? `${age}m ago` : `${Math.round(age / 60)}h ago`;
1439
+ console.log(
1440
+ chalk.gray(
1441
+ ` - ${formatTaskLabel({ title: task.title, id: task.taskId })} (${timeStr})`
1442
+ )
1443
+ );
1444
+ }
1445
+ if (taskFiles.length > 5) {
1446
+ console.log(chalk.gray(` ... and ${taskFiles.length - 5} more`));
1447
+ }
1448
+ } else {
1449
+ console.log(chalk.gray("\nNo tasks found in state directory"));
1450
+ }
1451
+ } catch (_e) {
1452
+ }
1453
+ if (isLabMode) {
1454
+ console.log(
1455
+ chalk.gray("\nIf this is a lab run, ensure --lab-id and --run-id are correct")
1456
+ );
1457
+ console.log(
1458
+ chalk.gray(
1459
+ "Lab state location: .build-project/labs/{labId}/runs/{runId}/state/competitions/"
1460
+ )
1461
+ );
1462
+ }
1463
+ failMonitorCommand();
1464
+ }
1465
+ const render = async () => {
1466
+ const state = readCompetitionState(taskId, {
1467
+ stateDir,
1468
+ backgroundDir,
1469
+ unifiedStateDir,
1470
+ cwd: repoRoot
1471
+ });
1472
+ const parseFailure = [
1473
+ state.sources.competitionHandle,
1474
+ state.sources.backgroundHandle,
1475
+ state.sources.unifiedState
1476
+ ].find((source) => source.exists && source.parseError);
1477
+ if (parseFailure?.parseError) {
1478
+ const message = `Failed to read handle: ${parseFailure.parseError}`;
1479
+ if (opts.json) {
1480
+ console.log(JSON.stringify({ error: message }));
1481
+ } else {
1482
+ console.log(chalk.red(message));
1483
+ }
1484
+ failMonitorCommand();
1485
+ }
1486
+ if (!state.sources.competitionHandle.exists && !state.sources.backgroundHandle.exists) {
1487
+ const runTaskState = readRunTaskState(taskId, {
1488
+ cwd: repoRoot,
1489
+ unifiedStateDir
1490
+ });
1491
+ if (runTaskState) {
1492
+ if (opts.health) {
1493
+ emitError(
1494
+ "Run-task health is not available via monitor; inspect provider-output artifacts instead.",
1495
+ { code: "run_task_health_unsupported", taskId }
1496
+ );
1497
+ failMonitorCommand();
1498
+ }
1499
+ renderRunTaskMonitorState(runTaskState, {
1500
+ json: opts.json,
1501
+ follow: opts.follow
1502
+ });
1503
+ return runTaskState;
1504
+ }
1505
+ const autoloopState = readAutoloopTaskState(taskId, {
1506
+ cwd: repoRoot,
1507
+ unifiedStateDir
1508
+ });
1509
+ if (autoloopState) {
1510
+ if (opts.health) {
1511
+ emitError(
1512
+ "Autoloop health is not available via monitor; use build loop explain instead.",
1513
+ { code: "autoloop_health_unsupported", taskId }
1514
+ );
1515
+ failMonitorCommand();
1516
+ }
1517
+ renderAutoloopMonitorState(autoloopState, {
1518
+ json: opts.json,
1519
+ follow: opts.follow
1520
+ });
1521
+ return autoloopState;
1522
+ }
1523
+ console.log(chalk.yellow(`Task state file disappeared: ${taskId}`));
1524
+ return null;
1525
+ }
1526
+ if (opts.health) {
1527
+ try {
1528
+ parseHealthCategory(opts.category);
1529
+ parseHealthSeverity(opts.severity);
1530
+ } catch (error) {
1531
+ const message = error instanceof Error ? error.message : String(error);
1532
+ emitError(message);
1533
+ failMonitorCommand();
1534
+ }
1535
+ const healthSnapshot = buildMonitorHealthSnapshot(state);
1536
+ const allEvents = classifyRunHealth(healthSnapshot);
1537
+ const filteredEvents = filterHealthEvents(allEvents, opts.category, opts.severity);
1538
+ const summary = summarizeRunHealth(filteredEvents);
1539
+ if (opts.json) {
1540
+ const payload = {
1541
+ taskId,
1542
+ health: summary
1543
+ };
1544
+ console.log(opts.follow ? JSON.stringify(payload) : JSON.stringify(payload, null, 2));
1545
+ if (summary.worstSeverity === "critical") {
1546
+ failMonitorCommand();
1547
+ }
1548
+ } else {
1549
+ const events = filteredEvents;
1550
+ const headerId = resolveDisplayId(state);
1551
+ const headerTitle = extractTitleFromPrompt(state.prompt ?? state.background?.prompt);
1552
+ console.log(
1553
+ chalk.bold.cyan(
1554
+ `
1555
+ Monitor: ${formatTaskLabel({ title: headerTitle, id: headerId })}`
1556
+ )
1557
+ );
1558
+ renderHealthEvents(events, {
1559
+ category: opts.category,
1560
+ severity: opts.severity
1561
+ });
1562
+ }
1563
+ return state;
1564
+ }
1565
+ try {
1566
+ if (state.primarySource === "background_handle" && state.background) {
1567
+ if (opts.json) {
1568
+ const monitorJsonPayload = buildMonitorJsonPayload(state.rawHandle, state);
1569
+ const payload = opts.follow ? JSON.stringify(monitorJsonPayload) : JSON.stringify(monitorJsonPayload, null, 2);
1570
+ console.log(payload);
1571
+ return state;
1572
+ }
1573
+ const bgTaskId = state.rawHandle?.taskId ?? taskId;
1574
+ const bgPrompt = state.rawHandle?.prompt;
1575
+ const bgTitle = typeof bgPrompt === "string" ? extractTitleFromPrompt(bgPrompt) : void 0;
1576
+ console.log(
1577
+ chalk.bold.cyan(
1578
+ `
1579
+ Monitor: ${formatTaskLabel({ title: bgTitle, id: String(bgTaskId) })}`
1580
+ )
1581
+ );
1582
+ console.log(chalk.cyan("Mode: Background"));
1583
+ if (typeof state.background.pid === "number")
1584
+ console.log(chalk.gray(`PID: ${state.background.pid}`));
1585
+ if (state.background.label)
1586
+ console.log(chalk.gray(`Label: ${state.background.label}`));
1587
+ if (state.background.detachMethod)
1588
+ console.log(chalk.gray(`Detach: ${state.background.detachMethod}`));
1589
+ if (state.background.status)
1590
+ console.log(chalk.gray(`Status: ${state.background.status}`));
1591
+ if (state.initiatedBy) console.log(chalk.gray(`Initiated by: ${state.initiatedBy}`));
1592
+ if (state.background.activePhase)
1593
+ console.log(chalk.gray(`Phase: ${state.background.activePhase}`));
1594
+ if (typeof state.background.elapsedMs === "number")
1595
+ console.log(chalk.gray(`Elapsed: ${Math.round(state.background.elapsedMs)}ms`));
1596
+ if (typeof state.background.timeoutMinutes === "number")
1597
+ console.log(
1598
+ chalk.gray(`Timeouts: orchestrator=${state.background.timeoutMinutes}m`)
1599
+ );
1600
+ if (typeof state.background.executorTimeoutMinutes === "number")
1601
+ console.log(
1602
+ chalk.gray(
1603
+ `Executor Timeout: ${state.background.executorTimeoutMinutes}m per variant`
1604
+ )
1605
+ );
1606
+ if (state.background.signal)
1607
+ console.log(chalk.yellow(`Signal: ${state.background.signal}`));
1608
+ if (state.background.terminatedAt)
1609
+ console.log(chalk.gray(`Terminated: ${state.background.terminatedAt}`));
1610
+ if (state.background.signalDiagnostics) {
1611
+ const diagnostics = state.background.signalDiagnostics;
1612
+ const details = [
1613
+ typeof diagnostics.pid === "number" ? `pid=${diagnostics.pid}` : null,
1614
+ typeof diagnostics.parentPid === "number" ? `ppid=${diagnostics.parentPid}` : null,
1615
+ diagnostics.platform ? `platform=${diagnostics.platform}` : null,
1616
+ typeof diagnostics.uptimeMs === "number" ? `uptime=${Math.round(diagnostics.uptimeMs)}ms` : null,
1617
+ diagnostics.activePhase ? `phase=${diagnostics.activePhase}` : null
1618
+ ].filter((value) => value !== null);
1619
+ if (details.length > 0) {
1620
+ console.log(chalk.gray(`Signal Diagnostics: ${details.join(", ")}`));
1621
+ }
1622
+ }
1623
+ if (state.background.orchestratorTimeoutObserved)
1624
+ console.log(chalk.yellow("Orchestrator timeout observed: yes"));
1625
+ if (state.background.orchestratorTimeoutMessage)
1626
+ console.log(
1627
+ chalk.yellow(
1628
+ `Orchestrator timeout detail: ${state.background.orchestratorTimeoutMessage}`
1629
+ )
1630
+ );
1631
+ if (state.background.error)
1632
+ console.log(chalk.red(`Error: ${state.background.error}`));
1633
+ if (state.background.shutdownError)
1634
+ console.log(chalk.red(`Shutdown Error: ${state.background.shutdownError}`));
1635
+ const backgroundWinnerLine = formatMonitorWinnerOrIdentityLine(state);
1636
+ if (backgroundWinnerLine) {
1637
+ console.log(chalk.gray(backgroundWinnerLine));
1638
+ }
1639
+ if (state.synthesis) {
1640
+ console.log(
1641
+ chalk.gray(`Synthesis: ${formatMonitorSynthesisStatus(state.synthesis)}`)
1642
+ );
1643
+ }
1644
+ const bgVariants = state.background.variants;
1645
+ if (bgVariants.length > 0) {
1646
+ console.log(chalk.bold("\nVariants:"));
1647
+ for (const v of bgVariants) {
1648
+ const provider = v.provider ?? "unknown";
1649
+ const label = v.variant ?? provider;
1650
+ const vstatus = v.success === true ? chalk.green(MONITOR_VARIANT_RAN_LABEL) : v.success === false ? chalk.red("Error") : chalk.gray("\u2026");
1651
+ const prUrl = v.prUrl;
1652
+ const details = [];
1653
+ if (prUrl) details.push(prUrl);
1654
+ if (v.cloudTaskId) details.push(`task=${v.cloudTaskId}`);
1655
+ if (typeof v.completeness === "number")
1656
+ details.push(`complete=${v.completeness}%`);
1657
+ if (v.timedOut) details.push("timed_out");
1658
+ if (v.terminationReason) details.push(`terminated=${v.terminationReason}`);
1659
+ if (v.errorMessage) details.push(`error=${v.errorMessage}`);
1660
+ const honesty = formatMonitorVariantHonestyLine(v);
1661
+ if (honesty) details.push(honesty);
1662
+ const suffix = details.length > 0 ? chalk.gray(` ${details.join(" | ")}`) : "";
1663
+ console.log(` ${vstatus} ${label}${suffix}`);
1664
+ }
1665
+ } else {
1666
+ console.log(chalk.gray("\nNo variant status yet. Check again shortly."));
1667
+ }
1668
+ return state;
1669
+ }
1670
+ if (opts.json) {
1671
+ console.log(JSON.stringify(buildMonitorJsonPayload(state.rawHandle, state), null, 2));
1672
+ return state;
1673
+ }
1674
+ const headerId = resolveDisplayId(state);
1675
+ const headerTitle = extractTitleFromPrompt(state.prompt);
1676
+ console.log(
1677
+ chalk.bold.cyan(`
1678
+ Monitor: ${formatTaskLabel({ title: headerTitle, id: headerId })}`)
1679
+ );
1680
+ if (state.executionMode) {
1681
+ console.log(chalk.cyan(`Mode: ${formatExecutionModeLabel(state.executionMode)}`));
1682
+ }
1683
+ if (state.prompt) {
1684
+ console.log(chalk.gray(`Prompt: ${String(state.prompt).slice(0, 100)}...`));
1685
+ }
1686
+ if (state.status) {
1687
+ console.log(chalk.gray(`Status: ${state.status}`));
1688
+ }
1689
+ if (state.initiatedBy) {
1690
+ console.log(chalk.gray(`Initiated by: ${state.initiatedBy}`));
1691
+ }
1692
+ if (state.outcome) {
1693
+ console.log(chalk.gray(`Outcome: ${state.outcome}`));
1694
+ }
1695
+ console.log(chalk.gray(`Created: ${state.createdAt}`));
1696
+ console.log(chalk.gray(`Updated: ${state.updatedAt}`));
1697
+ if (state.completedAt) {
1698
+ console.log(chalk.gray(`Completed: ${state.completedAt}`));
1699
+ }
1700
+ const winnerLine = formatMonitorWinnerOrIdentityLine(state);
1701
+ if (winnerLine) {
1702
+ console.log(chalk.gray(winnerLine));
1703
+ }
1704
+ if (state.errorMessage) {
1705
+ console.log(chalk.red(`Error: ${state.errorMessage}`));
1706
+ }
1707
+ if (state.synthesis) {
1708
+ console.log(
1709
+ chalk.gray(`Synthesis: ${formatMonitorSynthesisStatus(state.synthesis)}`)
1710
+ );
1711
+ }
1712
+ console.log(chalk.bold("\nVariants/Candidates:"));
1713
+ const items = state.variants;
1714
+ if (items.length === 0) {
1715
+ console.log(chalk.gray(" (no items yet)"));
1716
+ }
1717
+ for (const v of items) {
1718
+ const mode = v.executionMode === "cloud" ? "[cloud]" : "[local]";
1719
+ const status = v.submittedOnly ? chalk.cyan("Submitted") : v.success ? chalk.green(MONITOR_VARIANT_RAN_LABEL) : v.success === false ? chalk.red("Error") : chalk.gray("?");
1720
+ console.log(chalk.gray(` - ${status} ${mode} ${formatMonitorVariantLabel(v)}`));
1721
+ const details = [];
1722
+ if (v.prNumber) details.push(`PR #${v.prNumber}`);
1723
+ if (v.prUrl) details.push(v.prUrl);
1724
+ const cursorMeta = v.cursorMetadata || v.customMetadata?.cursor;
1725
+ if (v.cloudTaskId) {
1726
+ details.push(`task=${v.cloudTaskId}`);
1727
+ } else if (cursorMeta?.detectedCloudTaskId) {
1728
+ details.push(`task=${cursorMeta.detectedCloudTaskId}`);
1729
+ }
1730
+ if (typeof v.completeness === "number") details.push(`complete=${v.completeness}%`);
1731
+ if (v.timedOut) details.push("timed_out");
1732
+ if (v.terminationReason) details.push(`terminated=${v.terminationReason}`);
1733
+ if (v.errorMessage) details.push(`error=${v.errorMessage}`);
1734
+ const honesty = formatMonitorVariantHonestyLine(v);
1735
+ if (honesty) details.push(honesty);
1736
+ if (cursorMeta?.commitCount !== void 0) {
1737
+ details.push(`commits=${cursorMeta.commitCount}`);
1738
+ }
1739
+ if (cursorMeta?.latestCommitSha) {
1740
+ details.push(`latest=${String(cursorMeta.latestCommitSha).slice(0, 7)}`);
1741
+ }
1742
+ if (details.length > 0) console.log(chalk.gray(` ${details.join(" \u2022 ")}`));
1743
+ if (cursorMeta && "lastCommentSnippet" in cursorMeta && cursorMeta.lastCommentSnippet) {
1744
+ console.log(
1745
+ chalk.gray(` ${cursorMeta.lastCommentSnippet}`)
1746
+ );
1747
+ }
1748
+ if (cursorMeta && "lastCommentTimestamp" in cursorMeta && cursorMeta.lastCommentTimestamp) {
1749
+ console.log(
1750
+ chalk.gray(
1751
+ ` Time: ${cursorMeta.lastCommentTimestamp}`
1752
+ )
1753
+ );
1754
+ }
1755
+ }
1756
+ console.log();
1757
+ console.log(chalk.gray("Tips:"));
1758
+ console.log(chalk.gray(" \u2022 Use --health for operator-oriented run health"));
1759
+ if (opts.detailed) {
1760
+ console.log(chalk.gray(" \u2022 Inspect variant worktrees for retained local output"));
1761
+ }
1762
+ return state;
1763
+ } catch (e) {
1764
+ const message = e instanceof Error ? e.message : String(e);
1765
+ if (opts.json) {
1766
+ console.log(JSON.stringify({ error: `Failed to read handle: ${message}` }));
1767
+ } else {
1768
+ console.log(chalk.red(`Failed to read handle: ${message}`));
1769
+ }
1770
+ failMonitorCommand();
1771
+ }
1772
+ };
1773
+ if (!opts.follow) {
1774
+ await render();
1775
+ if (isLabMode && opts.labId && opts.runId) {
1776
+ const { LabPathResolver } = await import("./lab-mode-YXQ2Y3NG.js");
1777
+ LabPathResolver.getInstance().clearContext();
1778
+ }
1779
+ return;
1780
+ }
1781
+ const intervalSeconds = Number.parseFloat(String(opts.interval || "15"));
1782
+ if (!Number.isFinite(intervalSeconds) || intervalSeconds <= 0) {
1783
+ emitError("--interval must be a positive number of seconds");
1784
+ failMonitorCommand();
1785
+ }
1786
+ const intervalMs = Math.max(1e3, intervalSeconds * 1e3);
1787
+ const timeoutMinutes = opts.timeout === void 0 ? void 0 : Number.parseFloat(String(opts.timeout));
1788
+ if (timeoutMinutes !== void 0 && (!Number.isFinite(timeoutMinutes) || timeoutMinutes <= 0)) {
1789
+ emitError("--timeout must be a positive number of minutes");
1790
+ failMonitorCommand();
1791
+ }
1792
+ const deadlineMs = timeoutMinutes === void 0 ? void 0 : Date.now() + timeoutMinutes * 60 * 1e3;
1793
+ const autoloopStateForWatch = readAutoloopTaskState(taskId, {
1794
+ cwd: repoRoot,
1795
+ unifiedStateDir
1796
+ });
1797
+ const watchPath = fs3.existsSync(handlePath) || fs3.existsSync(backgroundHandlePath) ? handlePath : readRunTaskState(taskId, { cwd: repoRoot, unifiedStateDir })?.providerOutputArtifactPath ?? autoloopStateForWatch?.runResultPath ?? autoloopStateForWatch?.trajectoryPath ?? resolveUnifiedStateFilePath(taskId, unifiedStateDir);
1798
+ console.log(
1799
+ chalk.gray(
1800
+ `
1801
+ Watching ${watchPath} every ${Math.round(intervalMs / 1e3)}s (Ctrl+C to stop)
1802
+ `
1803
+ )
1804
+ );
1805
+ if (isLabMode && opts.labId && opts.runId) {
1806
+ signalCoordinator.register("monitor-follow-cleanup", async () => {
1807
+ const { LabPathResolver } = await import("./lab-mode-YXQ2Y3NG.js");
1808
+ LabPathResolver.getInstance().clearContext();
1809
+ });
1810
+ }
1811
+ const followOnce = async () => {
1812
+ const state = await render();
1813
+ if (state && isTerminalMonitorRenderState(state)) {
1814
+ return state;
1815
+ }
1816
+ if (deadlineMs !== void 0 && Date.now() >= deadlineMs) {
1817
+ if (!opts.json) {
1818
+ console.log(chalk.gray(`Monitor timeout reached after ${timeoutMinutes}m`));
1819
+ }
1820
+ return state;
1821
+ }
1822
+ return state;
1823
+ };
1824
+ const initialState = await followOnce();
1825
+ if (initialState && isTerminalMonitorRenderState(initialState)) {
1826
+ return;
1827
+ }
1828
+ if (deadlineMs !== void 0 && Date.now() >= deadlineMs) {
1829
+ return;
1830
+ }
1831
+ while (true) {
1832
+ await new Promise((r) => setTimeout(r, intervalMs));
1833
+ const state = await followOnce();
1834
+ if (state && isTerminalMonitorRenderState(state)) {
1835
+ return;
1836
+ }
1837
+ if (deadlineMs !== void 0 && Date.now() >= deadlineMs) {
1838
+ return;
1839
+ }
1840
+ }
1841
+ }
1842
+ );
1843
+ return cmd;
1844
+ }
1845
+
1846
+ export {
1847
+ formatVariantGateSummary,
1848
+ formatMonitorWinnerOrIdentityLine,
1849
+ buildMonitorJsonPayload,
1850
+ buildMonitorHealthSnapshot,
1851
+ createMonitorCommand
1852
+ };
1853
+ //# sourceMappingURL=chunk-VNDPQVUZ.js.map