@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.
- package/.build-project/providers/catalog.json +13951 -0
- package/.build-project/providers/pricing.json +1978 -0
- package/.build-project/providers/registry.json +4103 -0
- package/.github/SECURITY.md +75 -0
- package/.nvmrc +1 -0
- package/CHANGELOG.md +661 -0
- package/CODE_OF_CONDUCT.md +44 -0
- package/CONTRIBUTING.md +24 -0
- package/INSTALL.md +623 -0
- package/LICENSE +21 -0
- package/README.md +118 -2
- package/THIRD_PARTY_NOTICES.txt +26 -0
- package/dist/ai-judge-UE5UOYOO.js +191 -0
- package/dist/allowlist-grounding-KPLN6NC5.js +16 -0
- package/dist/allowlist-utils-MZZKKXRD.js +31 -0
- package/dist/apply-completion-mode-EM37UZHB.js +110 -0
- package/dist/artifact-migrator-WPACNSEP.js +276 -0
- package/dist/ask-2OZ4JFQR.js +176 -0
- package/dist/auth-6UKBTJUQ.js +185 -0
- package/dist/auth-H5KJL6HL.js +165 -0
- package/dist/auth-LVJRJDMU.js +12 -0
- package/dist/auth-NHZOCNRR.js +94 -0
- package/dist/auth-PBXHWXGW.js +95 -0
- package/dist/auth-T7Y5DCAH.js +91 -0
- package/dist/auth-TVVKCHQW.js +13 -0
- package/dist/auth-UHB2UCSS.js +97 -0
- package/dist/auth-VACA3VUL.js +98 -0
- package/dist/auth-VVLC77S3.js +44 -0
- package/dist/auth-liveness-XO4AGDDD.js +53 -0
- package/dist/autoloop-cleanup-SI3VGAAR.js +106 -0
- package/dist/autoloop-evidence-gates-J5GG5YQB.js +39 -0
- package/dist/autoloop-gate-policy-SUNAEP6Q.js +169 -0
- package/dist/autoloop-helpers-VQGQNTT6.js +52 -0
- package/dist/autoloop-ledger-P6TIDP7C.js +96 -0
- package/dist/autoloop-ledger-subscriber-HFAGOZXH.js +161 -0
- package/dist/autoloop-run-defaults-GWGZBNT7.js +27 -0
- package/dist/autoloop-run-lock-GBWRM5A2.js +197 -0
- package/dist/autoloop-success-C32QVWOP.js +93 -0
- package/dist/autoloop-termination-summary-GI6IBQWD.js +58 -0
- package/dist/autoloop-trajectory-AMKSQISD.js +70 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/automatic-branch-cleanup-R62X2C5O.js +49 -0
- package/dist/autonomous-loop-controller-2WL363LW.js +4386 -0
- package/dist/backend-YUTFDZXZ.js +30 -0
- package/dist/background-executor-Z3ODTMD7.js +260 -0
- package/dist/backlog-75QPEAMW.js +403 -0
- package/dist/backlog-execution-intent-GWUV5TUK.js +19 -0
- package/dist/backup-active-store-XHWLN34M.js +16 -0
- package/dist/backup-machine-stores-UI4LTJOY.js +251 -0
- package/dist/backup-telemetry-db-Z4ICYCNW.js +26 -0
- package/dist/branch-archive-manager-FMSQ7YJF.js +18 -0
- package/dist/branch-cleanup-manager-ST6FJGND.js +35 -0
- package/dist/build-gate-7NKWPY62.js +68 -0
- package/dist/build-root-S7DINODY.js +18 -0
- package/dist/change-summary-R6CB6VXJ.js +50 -0
- package/dist/chunk-24MNKKOM.js +173 -0
- package/dist/chunk-2H6VZFIO.js +235 -0
- package/dist/chunk-2JIX3EKV.js +39 -0
- package/dist/chunk-2KO7HVZM.js +106 -0
- package/dist/chunk-2L36U25O.js +100 -0
- package/dist/chunk-2NMNFUQA.js +475 -0
- package/dist/chunk-2OUAEH67.js +83 -0
- package/dist/chunk-2VLJUXJU.js +115 -0
- package/dist/chunk-2VUEDIUM.js +77 -0
- package/dist/chunk-2Y2IIHPI.js +430 -0
- package/dist/chunk-2YRG3LHZ.js +220 -0
- package/dist/chunk-2Z5Q3SUY.js +65 -0
- package/dist/chunk-32IYXIE5.js +873 -0
- package/dist/chunk-33IGPPUI.js +292 -0
- package/dist/chunk-352PCJLK.js +283 -0
- package/dist/chunk-35J4NE6S.js +226 -0
- package/dist/chunk-3C7WBIVK.js +1016 -0
- package/dist/chunk-3H3EY6U7.js +1225 -0
- package/dist/chunk-3H4MWYIC.js +198 -0
- package/dist/chunk-3HHWQR3N.js +2479 -0
- package/dist/chunk-3JKNRYEE.js +14 -0
- package/dist/chunk-3LECCYZY.js +128 -0
- package/dist/chunk-3LOY6YZI.js +852 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3NOTLVLG.js +3803 -0
- package/dist/chunk-3OPP2OZB.js +1480 -0
- package/dist/chunk-3P5IN5E7.js +9 -0
- package/dist/chunk-3PL22IYZ.js +20 -0
- package/dist/chunk-3REDAJUJ.js +14 -0
- package/dist/chunk-3S2R4XJI.js +203 -0
- package/dist/chunk-3UBZI5DW.js +61 -0
- package/dist/chunk-3VV5OBGG.js +308 -0
- package/dist/chunk-3WY5TU2O.js +823 -0
- package/dist/chunk-43OKHTW4.js +82 -0
- package/dist/chunk-45KUJBDI.js +112 -0
- package/dist/chunk-47X5LM7B.js +224 -0
- package/dist/chunk-4B6FQJ77.js +268 -0
- package/dist/chunk-4BTDUT2S.js +42 -0
- package/dist/chunk-4DJL2VXA.js +24 -0
- package/dist/chunk-4EBSXZ73.js +48 -0
- package/dist/chunk-4QKP6I4C.js +294 -0
- package/dist/chunk-4U6XK2DG.js +300 -0
- package/dist/chunk-4UMRUFBD.js +132 -0
- package/dist/chunk-4US4SYJ4.js +569 -0
- package/dist/chunk-4ZPLWEZO.js +154 -0
- package/dist/chunk-56WPYDJH.js +624 -0
- package/dist/chunk-57WRCJJW.js +50 -0
- package/dist/chunk-5AW4RMNG.js +24 -0
- package/dist/chunk-5EQN56OZ.js +155 -0
- package/dist/chunk-5F43TUIN.js +38 -0
- package/dist/chunk-5FKHIKTS.js +115 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5KQETTNS.js +152 -0
- package/dist/chunk-5PDVN2KO.js +498 -0
- package/dist/chunk-5UBIFVRD.js +509 -0
- package/dist/chunk-5YDE3Q62.js +46 -0
- package/dist/chunk-626AJVMU.js +302 -0
- package/dist/chunk-633XZ7UF.js +3583 -0
- package/dist/chunk-63DHNHGA.js +236 -0
- package/dist/chunk-666656AR.js +568 -0
- package/dist/chunk-67YRJPJO.js +19 -0
- package/dist/chunk-6CAU7VBA.js +20 -0
- package/dist/chunk-6CB3KJRY.js +21 -0
- package/dist/chunk-6DBMALXL.js +29 -0
- package/dist/chunk-6E25C4IA.js +269 -0
- package/dist/chunk-6FIBNIQU.js +73 -0
- package/dist/chunk-6G57FYBV.js +189 -0
- package/dist/chunk-6KZKRTG3.js +4885 -0
- package/dist/chunk-6LAH2UV2.js +525 -0
- package/dist/chunk-6PZY2TTU.js +921 -0
- package/dist/chunk-6T6NHXK4.js +230 -0
- package/dist/chunk-6TBEX4R4.js +432 -0
- package/dist/chunk-6TRD7TEE.js +911 -0
- package/dist/chunk-6XCP2RAI.js +47 -0
- package/dist/chunk-726G6WDL.js +351 -0
- package/dist/chunk-75EMT7BF.js +616 -0
- package/dist/chunk-762ACDZJ.js +4696 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7DJ6SQH3.js +510 -0
- package/dist/chunk-7HPCIOMA.js +1383 -0
- package/dist/chunk-7HYBSRPZ.js +17503 -0
- package/dist/chunk-7KBEOPVB.js +73 -0
- package/dist/chunk-7LHJDJB3.js +2222 -0
- package/dist/chunk-7NVJMH52.js +306 -0
- package/dist/chunk-7RMARDVH.js +33 -0
- package/dist/chunk-7SEWU4QG.js +36 -0
- package/dist/chunk-7TUTZTI2.js +911 -0
- package/dist/chunk-7VBDFPUM.js +340 -0
- package/dist/chunk-7VRJHTGZ.js +6406 -0
- package/dist/chunk-7YAOUUKK.js +493 -0
- package/dist/chunk-AAAODV76.js +860 -0
- package/dist/chunk-AB4HUJVQ.js +339 -0
- package/dist/chunk-AEQWV746.js +611 -0
- package/dist/chunk-AHU3FKPA.js +11639 -0
- package/dist/chunk-AISTV5XU.js +226 -0
- package/dist/chunk-AJBTKGJZ.js +48 -0
- package/dist/chunk-AJJNW7XT.js +248 -0
- package/dist/chunk-AJN5Y5YZ.js +160 -0
- package/dist/chunk-ALDTFNZ3.js +150 -0
- package/dist/chunk-ARARVIZK.js +281 -0
- package/dist/chunk-ATBM6AW5.js +53 -0
- package/dist/chunk-ATKEKM3E.js +206 -0
- package/dist/chunk-AUJLW6JZ.js +92 -0
- package/dist/chunk-AY3MHEFM.js +24 -0
- package/dist/chunk-B7PYTV72.js +236 -0
- package/dist/chunk-B7YRSULE.js +1423 -0
- package/dist/chunk-BAWJNMWF.js +339 -0
- package/dist/chunk-BBPIILO2.js +88 -0
- package/dist/chunk-BD3PGW6A.js +957 -0
- package/dist/chunk-BDPYFAB4.js +44 -0
- package/dist/chunk-BIUV23HH.js +729 -0
- package/dist/chunk-BQ3VAGXH.js +243 -0
- package/dist/chunk-BQJOGAWT.js +31 -0
- package/dist/chunk-BT7EG7CO.js +68 -0
- package/dist/chunk-BV3XQQLU.js +27 -0
- package/dist/chunk-BY6ODHNZ.js +78 -0
- package/dist/chunk-BZRLSZNV.js +79 -0
- package/dist/chunk-C3DH3NCY.js +2773 -0
- package/dist/chunk-C3KCMAJP.js +756 -0
- package/dist/chunk-C7AGUJ5K.js +267 -0
- package/dist/chunk-CBSWKQCX.js +342 -0
- package/dist/chunk-CE5OZBYY.js +21 -0
- package/dist/chunk-CFCVYHSW.js +373 -0
- package/dist/chunk-CHA2HDE5.js +126 -0
- package/dist/chunk-CIHWPGS5.js +146 -0
- package/dist/chunk-CJBSZX3F.js +127 -0
- package/dist/chunk-CLA6QIJM.js +43 -0
- package/dist/chunk-CPSVQR2I.js +365 -0
- package/dist/chunk-CRPRVNQ4.js +254 -0
- package/dist/chunk-CSIE4Y7C.js +1093 -0
- package/dist/chunk-CSOPSYDY.js +142 -0
- package/dist/chunk-CSXLLEGB.js +205 -0
- package/dist/chunk-CTDLERWU.js +293 -0
- package/dist/chunk-CULBXMSK.js +110 -0
- package/dist/chunk-D2M2Y5ID.js +21 -0
- package/dist/chunk-D37WY7SH.js +1060 -0
- package/dist/chunk-D4VJFCGZ.js +89 -0
- package/dist/chunk-D6WTZMZB.js +48 -0
- package/dist/chunk-DBHOWDUH.js +976 -0
- package/dist/chunk-DCACX7BV.js +19364 -0
- package/dist/chunk-DFHX4XYA.js +128 -0
- package/dist/chunk-DIKBRRKE.js +176 -0
- package/dist/chunk-DJG5RIOR.js +9 -0
- package/dist/chunk-DNIOIISW.js +616 -0
- package/dist/chunk-DOA5G7IA.js +315 -0
- package/dist/chunk-DP7FKP6W.js +855 -0
- package/dist/chunk-DS2JZ677.js +79 -0
- package/dist/chunk-DSRLVYBS.js +82 -0
- package/dist/chunk-EAEVKNJA.js +209 -0
- package/dist/chunk-EEUESN3T.js +575 -0
- package/dist/chunk-EJ4LUU5Y.js +73 -0
- package/dist/chunk-EJIWTPSZ.js +1063 -0
- package/dist/chunk-EJVCDTAN.js +116 -0
- package/dist/chunk-EKLUBDBQ.js +627 -0
- package/dist/chunk-EN62WLFD.js +849 -0
- package/dist/chunk-ENYRCL43.js +26 -0
- package/dist/chunk-EP22ZMFO.js +273 -0
- package/dist/chunk-EP4SVAVI.js +87 -0
- package/dist/chunk-EPAMVGI3.js +1562 -0
- package/dist/chunk-EPRMH6HO.js +24 -0
- package/dist/chunk-ES6NWJ36.js +4057 -0
- package/dist/chunk-ETA2K4KI.js +30 -0
- package/dist/chunk-ETAD4NKD.js +31 -0
- package/dist/chunk-EUWIIDQ7.js +93 -0
- package/dist/chunk-EVE3OD2W.js +141 -0
- package/dist/chunk-EXA26FFC.js +459 -0
- package/dist/chunk-EXSPAA35.js +244 -0
- package/dist/chunk-F55YABKV.js +258 -0
- package/dist/chunk-F5DNGU5W.js +27 -0
- package/dist/chunk-F622MJYV.js +103 -0
- package/dist/chunk-F6NIQD74.js +5111 -0
- package/dist/chunk-FAWJTC34.js +43 -0
- package/dist/chunk-FAZBRHGG.js +47 -0
- package/dist/chunk-FIEUSGNJ.js +39 -0
- package/dist/chunk-FKCG7K6H.js +1146 -0
- package/dist/chunk-FOVVXV45.js +229 -0
- package/dist/chunk-FRBPKBFE.js +30 -0
- package/dist/chunk-FSA5BPFI.js +268 -0
- package/dist/chunk-FSJ5TTZ3.js +29 -0
- package/dist/chunk-FT7SGLXT.js +193 -0
- package/dist/chunk-FUUVZZUB.js +62 -0
- package/dist/chunk-FYMRVUNZ.js +1697 -0
- package/dist/chunk-FYTAA5FG.js +162 -0
- package/dist/chunk-G3VB2UCZ.js +3892 -0
- package/dist/chunk-G6OIMVXH.js +405 -0
- package/dist/chunk-G7PQCXVH.js +228 -0
- package/dist/chunk-GAB6UW52.js +1087 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GC4CRMTS.js +642 -0
- package/dist/chunk-GFHSIWHL.js +5297 -0
- package/dist/chunk-GI5M67YA.js +735 -0
- package/dist/chunk-GIJWHUWF.js +191 -0
- package/dist/chunk-GO6DRECI.js +1 -0
- package/dist/chunk-GOFVBTMN.js +314 -0
- package/dist/chunk-GQIP72ZJ.js +13 -0
- package/dist/chunk-GQXLXRFA.js +28 -0
- package/dist/chunk-GT6HFKJB.js +48 -0
- package/dist/chunk-GVJGSSKM.js +174 -0
- package/dist/chunk-GWHGTG37.js +36 -0
- package/dist/chunk-GZAJHLKO.js +18 -0
- package/dist/chunk-GZK62I3N.js +314 -0
- package/dist/chunk-H3HGMISG.js +483 -0
- package/dist/chunk-H3ISZJMJ.js +403 -0
- package/dist/chunk-H4HXVWEC.js +9 -0
- package/dist/chunk-H6MJGKAW.js +120 -0
- package/dist/chunk-HBTTGVR5.js +353 -0
- package/dist/chunk-HBZ322WZ.js +35 -0
- package/dist/chunk-HEP3ILP4.js +34 -0
- package/dist/chunk-HGFXODKO.js +106 -0
- package/dist/chunk-HHWDTB6S.js +59 -0
- package/dist/chunk-HKO45NLZ.js +286 -0
- package/dist/chunk-HLVTEA6A.js +89 -0
- package/dist/chunk-HS3SY6HN.js +160 -0
- package/dist/chunk-HT5OCGKN.js +899 -0
- package/dist/chunk-HXIIEMGF.js +78 -0
- package/dist/chunk-I56TH7VM.js +46 -0
- package/dist/chunk-I6FN3R5D.js +352 -0
- package/dist/chunk-I7SCBHJN.js +655 -0
- package/dist/chunk-IJM4GKAT.js +529 -0
- package/dist/chunk-IMEYU36R.js +344 -0
- package/dist/chunk-INJ3SS6A.js +936 -0
- package/dist/chunk-IUKOPCCE.js +441 -0
- package/dist/chunk-IVEPZQJO.js +33 -0
- package/dist/chunk-IVZEONFC.js +43 -0
- package/dist/chunk-IWBHRSG7.js +936 -0
- package/dist/chunk-IYY3HQAD.js +484 -0
- package/dist/chunk-J2ICMYDA.js +48 -0
- package/dist/chunk-J2QCFLUN.js +505 -0
- package/dist/chunk-J5HM6V5P.js +1039 -0
- package/dist/chunk-J6NZX6QH.js +398 -0
- package/dist/chunk-JBBB2Y47.js +432 -0
- package/dist/chunk-JDCZQZU7.js +42 -0
- package/dist/chunk-JEDNXGSS.js +169 -0
- package/dist/chunk-JHP7OT6K.js +89 -0
- package/dist/chunk-JLS65NUQ.js +14 -0
- package/dist/chunk-JNMWYMC6.js +38 -0
- package/dist/chunk-JNSTWNNW.js +25 -0
- package/dist/chunk-JOSK6GEU.js +9564 -0
- package/dist/chunk-JQUMSIGC.js +100 -0
- package/dist/chunk-JVHGMURQ.js +1106 -0
- package/dist/chunk-JYXS47FQ.js +951 -0
- package/dist/chunk-K2ZMW2Z5.js +2147 -0
- package/dist/chunk-K7FAFORM.js +14 -0
- package/dist/chunk-KBJXX3ON.js +333 -0
- package/dist/chunk-KHFKVQWY.js +486 -0
- package/dist/chunk-KHMEI3DQ.js +173 -0
- package/dist/chunk-KHW3UD7B.js +69 -0
- package/dist/chunk-KKQKWAMF.js +365 -0
- package/dist/chunk-KOKXJV2U.js +455 -0
- package/dist/chunk-KQ4NGOJI.js +14 -0
- package/dist/chunk-KQYQOXMS.js +342 -0
- package/dist/chunk-KTMW65UX.js +14 -0
- package/dist/chunk-KUEWV2JH.js +593 -0
- package/dist/chunk-KXYDV3HP.js +1523 -0
- package/dist/chunk-KZ4JMGZ5.js +96 -0
- package/dist/chunk-KZWGBUIO.js +2659 -0
- package/dist/chunk-L2CBG5IX.js +1892 -0
- package/dist/chunk-L2S235CU.js +314 -0
- package/dist/chunk-L32WD57F.js +98 -0
- package/dist/chunk-LDJCKAJP.js +123 -0
- package/dist/chunk-LDWNBEN7.js +541 -0
- package/dist/chunk-LJVH57G2.js +241 -0
- package/dist/chunk-LPQ7NZEN.js +209 -0
- package/dist/chunk-LRGH3CCV.js +148 -0
- package/dist/chunk-LULOGMMM.js +1133 -0
- package/dist/chunk-LWGKN2GY.js +8284 -0
- package/dist/chunk-LX4F24ZH.js +157 -0
- package/dist/chunk-M4BUEXXF.js +839 -0
- package/dist/chunk-M6UHOC4I.js +553 -0
- package/dist/chunk-MCBNWZNO.js +657 -0
- package/dist/chunk-MEMSY6VY.js +223 -0
- package/dist/chunk-MHLEZQQI.js +145 -0
- package/dist/chunk-MJ6WNSIX.js +192 -0
- package/dist/chunk-MKASIKWZ.js +442 -0
- package/dist/chunk-MNOVBYFU.js +60 -0
- package/dist/chunk-MO2BYAAF.js +2896 -0
- package/dist/chunk-MP6P7Y2A.js +180 -0
- package/dist/chunk-MQ4TFJAG.js +3365 -0
- package/dist/chunk-MT2WAIR3.js +131 -0
- package/dist/chunk-MTU7VTNN.js +1122 -0
- package/dist/chunk-MULMXX4V.js +150 -0
- package/dist/chunk-MW2DWWVA.js +147 -0
- package/dist/chunk-MY3ZPUN4.js +151 -0
- package/dist/chunk-MYLH2S4G.js +64 -0
- package/dist/chunk-MZ5WYKNA.js +28 -0
- package/dist/chunk-N3Q2JNPV.js +249 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-NAINGKHF.js +35 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NHNPEZS4.js +1408 -0
- package/dist/chunk-NHTIXJCR.js +17 -0
- package/dist/chunk-NKLPMBNV.js +1154 -0
- package/dist/chunk-NMVZ5YES.js +199 -0
- package/dist/chunk-NRFRY3GE.js +256 -0
- package/dist/chunk-NTD6CSI6.js +1266 -0
- package/dist/chunk-NUO7B3SH.js +318 -0
- package/dist/chunk-NVOHIJKG.js +1319 -0
- package/dist/chunk-NXH3RX7O.js +523 -0
- package/dist/chunk-NXZ3DURF.js +257 -0
- package/dist/chunk-O26L6F7F.js +209 -0
- package/dist/chunk-O5RRIUEP.js +124 -0
- package/dist/chunk-O5X6BKAO.js +10 -0
- package/dist/chunk-O6ZQUVTR.js +31 -0
- package/dist/chunk-O7FE75QZ.js +306 -0
- package/dist/chunk-OC7Z6AJQ.js +81 -0
- package/dist/chunk-OH7IEZ63.js +307 -0
- package/dist/chunk-OI734GRS.js +115 -0
- package/dist/chunk-OJBH62DK.js +684 -0
- package/dist/chunk-OKJLVSTJ.js +247 -0
- package/dist/chunk-OMX5VL43.js +79 -0
- package/dist/chunk-ONHAMBN6.js +12 -0
- package/dist/chunk-ONYPLIVE.js +753 -0
- package/dist/chunk-OSK7QWPD.js +637 -0
- package/dist/chunk-OTXLMJKP.js +438 -0
- package/dist/chunk-OV5PKQMA.js +213 -0
- package/dist/chunk-OXK5HA4B.js +31 -0
- package/dist/chunk-OYDWFQA4.js +272 -0
- package/dist/chunk-OZAUKWHB.js +22 -0
- package/dist/chunk-P5P2EKGH.js +94 -0
- package/dist/chunk-P6SSWAKY.js +29 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-P7RVCHQV.js +197 -0
- package/dist/chunk-PEBWDYIW.js +726 -0
- package/dist/chunk-PFCXFO7A.js +9193 -0
- package/dist/chunk-PFLDWMX6.js +168 -0
- package/dist/chunk-PHZGLQSK.js +15883 -0
- package/dist/chunk-PNFTPNSR.js +20 -0
- package/dist/chunk-PPHXX4W7.js +175 -0
- package/dist/chunk-PPZESPJT.js +262 -0
- package/dist/chunk-PRDHI2L5.js +296 -0
- package/dist/chunk-PSTKWHHN.js +32 -0
- package/dist/chunk-PV53ODOT.js +555 -0
- package/dist/chunk-PVJBTI7P.js +24 -0
- package/dist/chunk-PXKERBKX.js +100 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q3DHEZA5.js +85 -0
- package/dist/chunk-Q5RZDVQK.js +204 -0
- package/dist/chunk-Q64IR2Z2.js +4933 -0
- package/dist/chunk-Q6Z5UGPL.js +398 -0
- package/dist/chunk-QAMAV4DT.js +627 -0
- package/dist/chunk-QBWF4444.js +112 -0
- package/dist/chunk-QDKYT4CI.js +22805 -0
- package/dist/chunk-QFLBRWCJ.js +126 -0
- package/dist/chunk-QILAQACE.js +107 -0
- package/dist/chunk-QJ6OEH4K.js +3683 -0
- package/dist/chunk-QK3NLYTV.js +320 -0
- package/dist/chunk-QOFLUS24.js +535 -0
- package/dist/chunk-QOIASNEJ.js +98 -0
- package/dist/chunk-QP4UTSOV.js +3587 -0
- package/dist/chunk-QP5ST7RI.js +904 -0
- package/dist/chunk-QS5AGRZN.js +167 -0
- package/dist/chunk-QTAOU53N.js +107 -0
- package/dist/chunk-QTCLJHLZ.js +351 -0
- package/dist/chunk-QTOLTG4L.js +119 -0
- package/dist/chunk-QWDV4OSL.js +142 -0
- package/dist/chunk-QWMQ74KD.js +508 -0
- package/dist/chunk-QX6LOMMH.js +158 -0
- package/dist/chunk-QXBKIHY7.js +238 -0
- package/dist/chunk-QXBKTJT6.js +270 -0
- package/dist/chunk-QYQOVOLR.js +196 -0
- package/dist/chunk-R2CKS6WT.js +73 -0
- package/dist/chunk-R2TIYG7U.js +68 -0
- package/dist/chunk-R2W3LESH.js +465 -0
- package/dist/chunk-R5EXHMUN.js +100 -0
- package/dist/chunk-RBBTBCHX.js +289 -0
- package/dist/chunk-RBKLOUXA.js +121 -0
- package/dist/chunk-RCP2Y6DQ.js +86 -0
- package/dist/chunk-RCYEJSD5.js +260 -0
- package/dist/chunk-RFDVSI4N.js +134 -0
- package/dist/chunk-RGJU63FV.js +1717 -0
- package/dist/chunk-RI4EX2QE.js +18 -0
- package/dist/chunk-RIMARPCF.js +152 -0
- package/dist/chunk-RJ6RSNT6.js +42 -0
- package/dist/chunk-RNI2GUIF.js +131 -0
- package/dist/chunk-RPHUWJ3K.js +264 -0
- package/dist/chunk-RPIMAMV7.js +361 -0
- package/dist/chunk-RQFX6YRN.js +49 -0
- package/dist/chunk-RRC5BL7B.js +285 -0
- package/dist/chunk-RSYTSBOO.js +79 -0
- package/dist/chunk-RWQQIKIC.js +35 -0
- package/dist/chunk-RZUBOZH2.js +373 -0
- package/dist/chunk-S2E632FQ.js +380 -0
- package/dist/chunk-S2VQCZO4.js +22 -0
- package/dist/chunk-S2XIMQJQ.js +681 -0
- package/dist/chunk-S47ISY27.js +183 -0
- package/dist/chunk-S6I4KISU.js +142 -0
- package/dist/chunk-S6TAFQI5.js +2403 -0
- package/dist/chunk-SBBNT5ZJ.js +27 -0
- package/dist/chunk-SDJV2DTQ.js +491 -0
- package/dist/chunk-SDPIFNLD.js +33 -0
- package/dist/chunk-SF6YK3JI.js +835 -0
- package/dist/chunk-SK3ZFONO.js +976 -0
- package/dist/chunk-SKTFRFQ7.js +1775 -0
- package/dist/chunk-SNGM452K.js +2002 -0
- package/dist/chunk-STW7OFOA.js +581 -0
- package/dist/chunk-SU6UFUQY.js +1351 -0
- package/dist/chunk-SVJM3LJA.js +27 -0
- package/dist/chunk-SVUNZOPG.js +129 -0
- package/dist/chunk-T5XLUYV3.js +34 -0
- package/dist/chunk-T7E5JS6N.js +57 -0
- package/dist/chunk-TA3N5MMO.js +450 -0
- package/dist/chunk-TAJPCXSB.js +13 -0
- package/dist/chunk-TDEMDRN2.js +1639 -0
- package/dist/chunk-TDSEX5CF.js +24 -0
- package/dist/chunk-TGCVL74Y.js +28 -0
- package/dist/chunk-TGXXYDL4.js +1012 -0
- package/dist/chunk-TIKTYUJO.js +296 -0
- package/dist/chunk-TIZAJD4M.js +6029 -0
- package/dist/chunk-TLSEZZCG.js +5549 -0
- package/dist/chunk-TMBDRHAX.js +19 -0
- package/dist/chunk-TRURQUBP.js +1217 -0
- package/dist/chunk-TSQ256N5.js +152 -0
- package/dist/chunk-TUQMMFEQ.js +2244 -0
- package/dist/chunk-U424MJLC.js +81 -0
- package/dist/chunk-U4DRS6ZW.js +11 -0
- package/dist/chunk-U5KS22IN.js +204 -0
- package/dist/chunk-UAPHFJPN.js +673 -0
- package/dist/chunk-UB7LQITD.js +1040 -0
- package/dist/chunk-UBVRHGAZ.js +237 -0
- package/dist/chunk-UDNNAQN5.js +98 -0
- package/dist/chunk-UJP3XM54.js +342 -0
- package/dist/chunk-UJYDH2MW.js +305 -0
- package/dist/chunk-UKMPASIC.js +399 -0
- package/dist/chunk-UKUL3EHK.js +763 -0
- package/dist/chunk-UPHU64NB.js +1327 -0
- package/dist/chunk-URMSZXAD.js +43 -0
- package/dist/chunk-US3RT6CY.js +525 -0
- package/dist/chunk-UTDEOPKV.js +30 -0
- package/dist/chunk-UUUDKV7N.js +13 -0
- package/dist/chunk-UVKWU3SM.js +39 -0
- package/dist/chunk-V2TVPO3X.js +521 -0
- package/dist/chunk-V3KLVK7B.js +398 -0
- package/dist/chunk-V3YFFHDR.js +17 -0
- package/dist/chunk-VAG6GUBR.js +1162 -0
- package/dist/chunk-VBENAHDA.js +1814 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VCGSWN5M.js +1300 -0
- package/dist/chunk-VE2O2I7M.js +115 -0
- package/dist/chunk-VIFHYTI5.js +31 -0
- package/dist/chunk-VJER3FUS.js +5080 -0
- package/dist/chunk-VLMDM56Q.js +268 -0
- package/dist/chunk-VMFZEVVX.js +99 -0
- package/dist/chunk-VNDPQVUZ.js +1853 -0
- package/dist/chunk-VSPJRLGA.js +4783 -0
- package/dist/chunk-VSWC5ZXI.js +103 -0
- package/dist/chunk-VYI4DSZP.js +2017 -0
- package/dist/chunk-W4BAIQ6L.js +1212 -0
- package/dist/chunk-W7VQAL2K.js +2203 -0
- package/dist/chunk-WEI3ZDZH.js +33 -0
- package/dist/chunk-WEIUS5NT.js +26 -0
- package/dist/chunk-WEW7UFWE.js +546 -0
- package/dist/chunk-WGQAXLNA.js +384 -0
- package/dist/chunk-WJAL4JL3.js +206 -0
- package/dist/chunk-WKFOJ5ZG.js +141 -0
- package/dist/chunk-WMWQEFLN.js +2177 -0
- package/dist/chunk-WNECKKO2.js +154 -0
- package/dist/chunk-WPKLYOAM.js +195 -0
- package/dist/chunk-WSH37YQN.js +243 -0
- package/dist/chunk-WV3KQDPE.js +84 -0
- package/dist/chunk-WZFC4V4U.js +389 -0
- package/dist/chunk-XCOIBNET.js +13 -0
- package/dist/chunk-XDM65LBX.js +53 -0
- package/dist/chunk-XGU6PBO5.js +645 -0
- package/dist/chunk-XHOI4V62.js +43 -0
- package/dist/chunk-XIBVFMLQ.js +6858 -0
- package/dist/chunk-XJ2E7YEJ.js +117 -0
- package/dist/chunk-XON4ZCYX.js +69 -0
- package/dist/chunk-XQPEWJPI.js +127 -0
- package/dist/chunk-XSJTIFUY.js +31 -0
- package/dist/chunk-XT7OVWM3.js +64 -0
- package/dist/chunk-XTXYIISX.js +1104 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XWIZ6B5S.js +109 -0
- package/dist/chunk-XWLIKOBX.js +240 -0
- package/dist/chunk-XZOXEIN4.js +156 -0
- package/dist/chunk-XZRS7I7W.js +3673 -0
- package/dist/chunk-Y4ZDDHB6.js +44 -0
- package/dist/chunk-Y733RB7T.js +194 -0
- package/dist/chunk-YBHUB4XR.js +14931 -0
- package/dist/chunk-YKC75XK4.js +147 -0
- package/dist/chunk-YKMXFVK7.js +27 -0
- package/dist/chunk-YO5BAJ55.js +225 -0
- package/dist/chunk-YPDCLXNZ.js +568 -0
- package/dist/chunk-YSQPGVFK.js +116 -0
- package/dist/chunk-YTVVTIWJ.js +716 -0
- package/dist/chunk-YVCMDVBB.js +698 -0
- package/dist/chunk-YYTOA6DP.js +114 -0
- package/dist/chunk-Z5WGNULV.js +88 -0
- package/dist/chunk-Z6NGVVXG.js +66 -0
- package/dist/chunk-Z7CDQNH3.js +20 -0
- package/dist/chunk-ZH4G3FU5.js +187 -0
- package/dist/chunk-ZJB6SQPA.js +257 -0
- package/dist/chunk-ZL6E4HMY.js +42 -0
- package/dist/chunk-ZMLOC3DW.js +62 -0
- package/dist/chunk-ZORW64QH.js +101 -0
- package/dist/chunk-ZVVD2XGV.js +1369 -0
- package/dist/cli-utils-ER33ODC5.js +31 -0
- package/dist/cli-validation-6CHPTANV.js +146 -0
- package/dist/commit-utils-3STAY7C7.js +49 -0
- package/dist/compatibility-notice-IHNXR2JR.js +21 -0
- package/dist/compete-config-resolver-V3GDNJMM.js +125 -0
- package/dist/compete-results-XUM3PJHS.js +318 -0
- package/dist/competition-outcome-tracker-NWSMVUPG.js +62 -0
- package/dist/config-4HHE4OIK.js +238 -0
- package/dist/config-D6YAZASH.js +10 -0
- package/dist/config-MIPRDYYV.js +46 -0
- package/dist/config-audit-GA5DCUAI.js +371 -0
- package/dist/config-explain-4LMO556H.js +71 -0
- package/dist/config-loader-RGP634PC.js +51 -0
- package/dist/config-manager-J2UTO635.js +114 -0
- package/dist/config-merger-TVUJBZTS.js +14 -0
- package/dist/config-validator-H4ZVIE56.js +122 -0
- package/dist/cost-HSIV5U2Y.js +85 -0
- package/dist/data-migration-state-OAUL2WPQ.js +35 -0
- package/dist/db-migrator-NUOW5NKR.js +34 -0
- package/dist/default-paths-UILB62BN.js +49 -0
- package/dist/discovery-V6GYUJUC.js +53 -0
- package/dist/doctor-BBSMCDWE.js +271 -0
- package/dist/doctor-context-blocks-LPY75VZA.js +231 -0
- package/dist/doctor-instructions-import-JXHDDOE5.js +70 -0
- package/dist/doctor-purpose-6YJOXPBE.js +30 -0
- package/dist/domain-analyzer-S35ABUNA.js +48 -0
- package/dist/ensure-initialized-Q6PEU55O.js +78 -0
- package/dist/entry.js +922 -0
- package/dist/error-parser-core-MZFMFANN.js +70 -0
- package/dist/evaluation-context-GQBYDAEV.js +63 -0
- package/dist/evidence-plan-resolver-5FUAP3SA.js +111 -0
- package/dist/execution-data-writer-YCG5UH37.js +72 -0
- package/dist/execution-policy-applier-PWZM5LNA.js +63 -0
- package/dist/execution-preflight-DASJWWQF.js +223 -0
- package/dist/execution-roles-KNSNNB2D.js +112 -0
- package/dist/exit-code-error-QIY5DOKF.js +18 -0
- package/dist/external-temp-cleanup-CAW7LQ6R.js +360 -0
- package/dist/factory-YCYCB7AE.js +209 -0
- package/dist/file-utils-ZQYNBQBW.js +45 -0
- package/dist/flywheel-allowlist-revert-H22HA6JE.js +21 -0
- package/dist/flywheel-autoloop-executor-PDOASJEZ.js +316 -0
- package/dist/flywheel-autoloop-unverified-TOKYFCDC.js +36 -0
- package/dist/flywheel-competition-executor-YJUMMEJO.js +320 -0
- package/dist/flywheel-executor-JWU43KAY.js +437 -0
- package/dist/flywheel-git-isolation-FQ2TRWMB.js +56 -0
- package/dist/flywheel-manifest-HDPNMWWF.js +114 -0
- package/dist/flywheel-model-defaults-UHAKTZT3.js +110 -0
- package/dist/flywheel-preflight-III2C7TH.js +163 -0
- package/dist/flywheel-resume-2O45MS7Y.js +31 -0
- package/dist/flywheel-resume-execution-lease-P2BK257J.js +59 -0
- package/dist/flywheel-safety-AVAVFXIJ.js +19 -0
- package/dist/flywheel-scope-decision-ALJUUNGG.js +14 -0
- package/dist/get-telemetry-logger-MPDVO2JA.js +155 -0
- package/dist/git-message-style-KCXGMTDT.js +104 -0
- package/dist/guidance-profile-config-G3K5YQOO.js +113 -0
- package/dist/guidance-profile-renderer-TX4TNDFL.js +23 -0
- package/dist/identity-XLQJ4YJF.js +25 -0
- package/dist/index-query-6NUY4FKX.js +37 -0
- package/dist/index.js +85588 -0
- package/dist/indexer-DL54CM3K.js +44 -0
- package/dist/init-OUZ72344.js +245 -0
- package/dist/instructions-import-offer-NSYXSITC.js +363 -0
- package/dist/instructions-run-NBII7W36.js +114 -0
- package/dist/interrupted-work-E4TLKJLE.js +43 -0
- package/dist/invoke-provider-auth-NEWEIHCI.js +38 -0
- package/dist/judge-scoring.json +64 -0
- package/dist/lab-mode-YXQ2Y3NG.js +44 -0
- package/dist/lab-utils-5QAMDJR5.js +29 -0
- package/dist/linux-host-class-YDWQX65O.js +31 -0
- package/dist/llm-judge-executor-OJSNCTFJ.js +179 -0
- package/dist/local-ci-config-VZ4WWDT5.js +48 -0
- package/dist/local-executor-DCMDDRX2.js +280 -0
- package/dist/logger-5KNKS3O4.js +154 -0
- package/dist/matrix-prompt-builder-4ZBOGZSB.js +527 -0
- package/dist/matrix-result-parser-EZJM4YXP.js +14 -0
- package/dist/merge-batch-RTEEMVDB.js +313 -0
- package/dist/merge-batch-members-VIWGVRHP.js +24 -0
- package/dist/merge-queue-TIIUSOY6.js +126 -0
- package/dist/merge-queue-trust-DUNZ4J65.js +21 -0
- package/dist/metadata-UKSMWM6J.js +29 -0
- package/dist/model-catalog-readiness-R5KJBP5M.js +202 -0
- package/dist/model-invocations-db-XTUPPQ34.js +70 -0
- package/dist/model-resolver-JFZ2MHOJ.js +39 -0
- package/dist/model-resolver-SCQ57KAQ.js +217 -0
- package/dist/model-roles-D3OR4NAH.js +110 -0
- package/dist/monitor-F4SIU5G2.js +96 -0
- package/dist/nested-worktrees-2WUWQ75N.js +23 -0
- package/dist/next-S3IRLVER.js +96 -0
- package/dist/next-UKPFRXOO.js +148 -0
- package/dist/opportunistic-TL4S26VX.js +86 -0
- package/dist/optimization-config-resolver-NAEIYU6A.js +148 -0
- package/dist/package-HJR4QJT4.js +10 -0
- package/dist/parse-git-status-7PIYFPS2.js +21 -0
- package/dist/path-security-5WJSY56G.js +41 -0
- package/dist/paths-JUI7C4KU.js +45 -0
- package/dist/plan-backlog-list-fast-SSTQL5XP.js +89 -0
- package/dist/plan-backlog-show-fast-PFRAQ3JB.js +114 -0
- package/dist/plan-sprint-list-fast-HD2KBZSY.js +110 -0
- package/dist/plan-sprint-status-fast-YFYH7WQF.js +116 -0
- package/dist/plan-task-status-fast-JU5PNLUU.js +114 -0
- package/dist/plan-to-flywheel-PY5MSY2H.js +529 -0
- package/dist/preflight-PJHGTJNZ.js +12 -0
- package/dist/process-registry-B4ZUCN7T.js +28 -0
- package/dist/process-scanner-TU3QHWVB.js +23 -0
- package/dist/processes-6FHVGT72.js +28 -0
- package/dist/processes-json-fast-YWTMUWXB.js +72 -0
- package/dist/profile-HWTC56SG.js +209 -0
- package/dist/project-runtime-paths-2UQNG5Y4.js +41 -0
- package/dist/protected-branches-N36LDBFY.js +71 -0
- package/dist/provider-aware-resource-manager-YTFAHNGJ.js +40 -0
- package/dist/provider-matrix-2KO2V5OM.js +214 -0
- package/dist/provider-matrix-renderer-MEC3PER7.js +139 -0
- package/dist/provider-output-forwarding-2AHL7YMA.js +26 -0
- package/dist/provider-registry-WCZ65QHC.js +136 -0
- package/dist/provider-temp-cleanup-IUNPJCZF.js +14 -0
- package/dist/prune-engine-EOQVWEP6.js +448 -0
- package/dist/publication-turn-S42RZTQF.js +44 -0
- package/dist/quality-gate-JQMVCKOO.js +72 -0
- package/dist/quickstart-3O6FRCFB.js +105 -0
- package/dist/readiness-GW6ABRHB.js +139 -0
- package/dist/readiness-KFZCXDTT.js +215 -0
- package/dist/registry-7XG376SY.js +217 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-YG6MQZDW.js +28 -0
- package/dist/resolution-engine-FFEK7HQ2.js +187 -0
- package/dist/resolve-provider-cli-ZEXVZKET.js +44 -0
- package/dist/restore-telemetry-db-E7BR5PO7.js +459 -0
- package/dist/routing-events-AW6SRZ6G.js +13 -0
- package/dist/routing-history-store-FMDDQL6W.js +39 -0
- package/dist/routing-planner-C6OHO3EY.js +221 -0
- package/dist/runner-KHDNQ5KU.js +1194 -0
- package/dist/runner-PIS2BW7Y.js +1801 -0
- package/dist/safety-E3JJVSFL.js +67 -0
- package/dist/safety-stanza-HE6GXP4G.js +49 -0
- package/dist/sandbox-7LBZC5PE.js +72 -0
- package/dist/sandbox-ASWCDYZL.js +80 -0
- package/dist/schema-extensions.sql +234 -0
- package/dist/security-JI22TBEB.js +17 -0
- package/dist/setup-bb-plugin-FQXLA76Y.js +531 -0
- package/dist/setup-claude-code-NF4ZSHVE.js +197 -0
- package/dist/setup-temp-cleanup-2APZ4HMA.js +29 -0
- package/dist/shared-utils-34HJZ6JX.js +40 -0
- package/dist/simple-artifact-goal-MQLDDMMX.js +29 -0
- package/dist/sprint-N7JFTEGL.js +403 -0
- package/dist/sprint-bridge-KJXIBNRJ.js +117 -0
- package/dist/sprint-completion-dependents-34SR7JVL.js +43 -0
- package/dist/sprint-execution-service-A6JPUBWY.js +376 -0
- package/dist/sprint-manager-MU2ZUWN2.js +140 -0
- package/dist/sqlite-timeout-config-U2CT4LKU.js +13 -0
- package/dist/sqlite-wrapper-FSGJ2QEW.js +19 -0
- package/dist/stale-cleanup-orchestrator-4X6324VF.js +71 -0
- package/dist/storage-access-I3V5LER7.js +31 -0
- package/dist/store-XVG64ZR2.js +25 -0
- package/dist/task-classifier-MN2DYE5R.js +558 -0
- package/dist/task-list-fast-7AT6LTTA.js +112 -0
- package/dist/task-manager-LHPBBRRE.js +136 -0
- package/dist/task-report-OLPAWBTK.js +64 -0
- package/dist/task-type-detector-6RG3YNZF.js +27 -0
- package/dist/task-type-resolver-EQHOUIHT.js +64 -0
- package/dist/telemetry-5VYSK772.js +212 -0
- package/dist/telemetry-health-tracker-4GFW2EMP.js +12 -0
- package/dist/telemetry-path-resolver-H3NFHHQY.js +34 -0
- package/dist/telemetry-reliability-URJDTNPZ.js +76 -0
- package/dist/transports-NREZQTJK.js +106 -0
- package/dist/unified-cost-tracker-5MTBJ2CL.js +59 -0
- package/dist/unified-state-cleanup-GGAXLHXF.js +292 -0
- package/dist/universal-cost-calculator-JTFEJVWK.js +70 -0
- package/dist/user-agents-QLIGPLP2.js +30 -0
- package/dist/variant-execution-I4ZZUAWY.js +319 -0
- package/dist/variant-opt-parser-JHCXKY2K.js +251 -0
- package/dist/variant-request-input-PL37N3AN.js +11 -0
- package/dist/variant-state-cleanup-KHMXRBZN.js +287 -0
- package/dist/variant-worker-COB5YTJX.js +4517 -0
- package/dist/variant-worker.js +26 -0
- package/dist/variants-XGDSXYG3.js +267 -0
- package/dist/verification-command-YSPU4VBH.js +66 -0
- package/dist/verify-command-timeout-DQUYH33Z.js +11 -0
- package/dist/verify-commands-LOHMOFKC.js +65 -0
- package/dist/warning-JSKSFKBT.js +13 -0
- package/dist/work-edge-K65NHVWY.js +50 -0
- package/dist/work-item-writer-KY5ZWZWW.js +30 -0
- package/dist/worker-JNXXEIT6.js +1504 -0
- package/dist/worker.js +21 -0
- package/dist/workspace-tree-identity-JO5PSKTW.js +52 -0
- package/dist/worktree-environment-WTVABAQW.js +64 -0
- package/dist/worktree-metrics-VZRQI26T.js +66 -0
- package/dist/writeback-TQFQBJNU.js +50 -0
- package/docs/CLI_REFERENCE.md +8287 -0
- package/docs/PROVIDER_SETUP.md +1737 -0
- package/docs/README.md +96 -0
- package/docs/TROUBLESHOOTING.md +2209 -0
- package/docs/getting-started/QUICK_START.md +260 -0
- package/docs/getting-started/README.md +198 -0
- package/docs/getting-started/SETUP.md +25 -0
- package/docs/reference/AGENT_CONTEXT.md +84 -0
- package/docs/reference/DELIVERY_ONBOARDING.md +198 -0
- package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
- package/docs/reference/SECURITY.md +291 -0
- package/docs/reference/TELEMETRY_PRIVACY.md +259 -0
- package/integrations/bb-plugin-build/README.md +391 -0
- package/integrations/bb-plugin-build/app.css +431 -0
- package/integrations/bb-plugin-build/app.tsx +6210 -0
- package/integrations/bb-plugin-build/package.json +45 -0
- package/integrations/bb-plugin-build/server.ts +488 -0
- package/integrations/bb-plugin-build/src/adapter.ts +3672 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-model.ts +150 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-schema.ts +458 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-service.ts +467 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-view.ts +1025 -0
- package/integrations/bb-plugin-build/src/command-evidence-schema.ts +13 -0
- package/integrations/bb-plugin-build/src/competition-defaults-schema.ts +122 -0
- package/integrations/bb-plugin-build/src/competition-defaults-service.ts +105 -0
- package/integrations/bb-plugin-build/src/competition-defaults-view.ts +138 -0
- package/integrations/bb-plugin-build/src/contract.ts +718 -0
- package/integrations/bb-plugin-build/src/execution-activity-view.ts +98 -0
- package/integrations/bb-plugin-build/src/finalize-model.ts +205 -0
- package/integrations/bb-plugin-build/src/finalize-schema.ts +150 -0
- package/integrations/bb-plugin-build/src/finalize-service.ts +330 -0
- package/integrations/bb-plugin-build/src/finalize-view.ts +159 -0
- package/integrations/bb-plugin-build/src/judge-operations-readback.ts +303 -0
- package/integrations/bb-plugin-build/src/judge-operations-schema.ts +33 -0
- package/integrations/bb-plugin-build/src/judge-operations-view.ts +459 -0
- package/integrations/bb-plugin-build/src/model.ts +1318 -0
- package/integrations/bb-plugin-build/src/monitor-service.ts +233 -0
- package/integrations/bb-plugin-build/src/panel-read-ux.ts +97 -0
- package/integrations/bb-plugin-build/src/patch-preview-schema.ts +166 -0
- package/integrations/bb-plugin-build/src/patch-preview-service.ts +480 -0
- package/integrations/bb-plugin-build/src/patch-preview-view.ts +109 -0
- package/integrations/bb-plugin-build/src/planning-readback.ts +228 -0
- package/integrations/bb-plugin-build/src/planning-service.ts +647 -0
- package/integrations/bb-plugin-build/src/planning-sync-evidence.ts +37 -0
- package/integrations/bb-plugin-build/src/planning-workspace-readback.ts +33 -0
- package/integrations/bb-plugin-build/src/planning-workspace-schema.ts +131 -0
- package/integrations/bb-plugin-build/src/planning-workspace.ts +333 -0
- package/integrations/bb-plugin-build/src/poll-handoff.ts +136 -0
- package/integrations/bb-plugin-build/src/project-target-server.ts +21 -0
- package/integrations/bb-plugin-build/src/project-target.ts +45 -0
- package/integrations/bb-plugin-build/src/reference-index.ts +218 -0
- package/integrations/bb-plugin-build/src/repository-identity.ts +17 -0
- package/integrations/bb-plugin-build/src/repository-schema.ts +30 -0
- package/integrations/bb-plugin-build/src/result-explorer-view.ts +597 -0
- package/integrations/bb-plugin-build/src/result-readback-model.ts +163 -0
- package/integrations/bb-plugin-build/src/result-readback-schema.ts +319 -0
- package/integrations/bb-plugin-build/src/result-readback-service.ts +333 -0
- package/integrations/bb-plugin-build/src/run-page-view.ts +332 -0
- package/integrations/bb-plugin-build/src/setup-config-schema.ts +293 -0
- package/integrations/bb-plugin-build/src/setup-config-service.ts +620 -0
- package/integrations/bb-plugin-build/src/setup-config-view.ts +388 -0
- package/integrations/bb-plugin-build/src/sprint-close-model.ts +150 -0
- package/integrations/bb-plugin-build/src/sprint-close-schema.ts +128 -0
- package/integrations/bb-plugin-build/src/sprint-close-service.ts +293 -0
- package/integrations/bb-plugin-build/src/sprint-close-view.ts +116 -0
- package/integrations/bb-plugin-build/src/sprint-composition-model.ts +709 -0
- package/integrations/bb-plugin-build/src/sprint-composition-readback.ts +231 -0
- package/integrations/bb-plugin-build/src/sprint-composition-schema.ts +597 -0
- package/integrations/bb-plugin-build/src/sprint-composition-service.ts +773 -0
- package/integrations/bb-plugin-build/src/sprint-composition-view.ts +1221 -0
- package/integrations/bb-plugin-build/src/sprint-execution-schema.ts +188 -0
- package/integrations/bb-plugin-build/src/sprint-execution-service.ts +289 -0
- package/integrations/bb-plugin-build/src/sprint-execution-view.ts +54 -0
- package/integrations/bb-plugin-build/src/task-authoring-model.ts +563 -0
- package/integrations/bb-plugin-build/src/task-authoring-schema.ts +629 -0
- package/integrations/bb-plugin-build/src/task-authoring-service.ts +842 -0
- package/integrations/bb-plugin-build/src/task-authoring-view.ts +1227 -0
- package/integrations/bb-plugin-build/src/task-catalog-schema.ts +46 -0
- package/integrations/bb-plugin-build/src/task-catalog-service.ts +44 -0
- package/integrations/bb-plugin-build/src/task-detail-readback.ts +56 -0
- package/integrations/bb-plugin-build/src/task-detail-schema.ts +171 -0
- package/integrations/bb-plugin-build/src/task-navigation.ts +446 -0
- package/integrations/bb-plugin-build/src/workbench-route.ts +74 -0
- package/package.json +306 -4
- package/schemas/README.md +80 -0
- package/schemas/build.config.schema.json +2110 -0
- package/schemas/config-v1.schema.json +136 -0
- package/schemas/execution-config.schema.json +47 -0
- package/schemas/judge-scoring.schema.json +257 -0
- package/schemas/provider-config.schema.json +179 -0
- package/schemas/telemetry-config.schema.json +79 -0
- package/schemas/user-preferences.schema.json +141 -0
- package/scripts/assert-node-runtime.mjs +146 -0
- package/scripts/preflight-native.mjs +49 -0
- package/scripts/setup-git-hooks.mjs +39 -0
- package/scripts/sync.sh +2871 -0
- package/scripts/write-node-launcher.sh +138 -0
- package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
- package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
- package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
- package/templates/.build-project/README.md +41 -0
- package/templates/.build-project/agents/README.md +50 -0
- package/templates/.build-project/agents/architect.md +10 -0
- package/templates/.build-project/agents/code-reviewer.md +10 -0
- package/templates/.build-project/agents/debugger.md +10 -0
- package/templates/.build-project/agents/documenter.md +10 -0
- package/templates/.build-project/agents/test-automator.md +10 -0
- package/templates/.build-project/config/build.config.jsonc +64 -0
- package/templates/.build-project/config/project-context.template.json +6 -0
- package/templates/.build-project/config/task-type-aliases.presets/kanban.yaml +14 -0
- package/templates/.build-project/config/task-type-aliases.presets/scrum.yaml +17 -0
- package/templates/.build-project/config/task-type-aliases.presets/xp.yaml +12 -0
- package/templates/.build-project/config/task-type-aliases.yaml +29 -0
- package/templates/.build-project/gitignore.template +70 -0
- package/templates/.build-project/task-types/analysis.yaml +38 -0
- package/templates/.build-project/task-types/architecture.yaml +35 -0
- package/templates/.build-project/task-types/doc.yaml +34 -0
- package/templates/.build-project/task-types/feature.yaml +22 -0
- package/templates/.build-project/task-types/general.yaml +4 -0
- package/templates/.build-project/task-types/security.yaml +38 -0
- package/templates/AGENTS.template.md +85 -0
- package/templates/CLAUDE.template.md +1 -0
- package/templates/GEMINI.template.md +1 -0
- package/templates/builtin-workflows/code-review.yaml +73 -0
- package/templates/builtin-workflows/skills/code-review/SKILL.md +61 -0
- package/templates/builtin-workflows/skills/execution-contract-analysis/SKILL.md +24 -0
- package/templates/builtin-workflows/skills/execution-contract-code/SKILL.md +19 -0
- package/templates/builtin-workflows/skills/execution-contract-structured/SKILL.md +17 -0
- package/templates/ci/incident-intake.mjs +787 -0
- package/templates/ci/incidents.yml.template +103 -0
- package/templates/ci/node.yml.template +17 -0
- package/templates/ci/python.yml.template +17 -0
- package/templates/guard-kit/GUARD_SETUP.md.template +258 -0
- package/templates/guard-kit/build-guard.yml.template +189 -0
- package/templates/guard-kit/check.mjs.template +932 -0
- package/templates/guard-kit/config.json.template +7 -0
- package/templates/guard-kit/policy.json.template +1 -0
- package/templates/profiles/README.md +57 -0
- package/templates/profiles/frontier-claude.json +23 -0
- package/templates/profiles/frontier-codex.json +23 -0
|
@@ -0,0 +1,1697 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applyTaskTransitions,
|
|
3
|
+
mergeWorkflowResult
|
|
4
|
+
} from "./chunk-6KZKRTG3.js";
|
|
5
|
+
import {
|
|
6
|
+
recordExecution
|
|
7
|
+
} from "./chunk-3S2R4XJI.js";
|
|
8
|
+
import {
|
|
9
|
+
WorkflowExecutor,
|
|
10
|
+
executeWorkflowFile,
|
|
11
|
+
filterResolvedManagedRepoCleanWarnings,
|
|
12
|
+
unverifiedCountField,
|
|
13
|
+
unverifiedStageField
|
|
14
|
+
} from "./chunk-QDKYT4CI.js";
|
|
15
|
+
import {
|
|
16
|
+
describeDormantPolicyMismatch,
|
|
17
|
+
resolveTaskExecutionRoles
|
|
18
|
+
} from "./chunk-MO2BYAAF.js";
|
|
19
|
+
import {
|
|
20
|
+
resolveTaskStatusForStageOutcome
|
|
21
|
+
} from "./chunk-FSJ5TTZ3.js";
|
|
22
|
+
import {
|
|
23
|
+
describeExecutionPolicyStampMismatch,
|
|
24
|
+
isCurrentExecutionPolicyWorkflow,
|
|
25
|
+
isExecutionPolicyEngaged,
|
|
26
|
+
mapGateStagesToExecutionStages
|
|
27
|
+
} from "./chunk-YTVVTIWJ.js";
|
|
28
|
+
import {
|
|
29
|
+
validateModel
|
|
30
|
+
} from "./chunk-7HYBSRPZ.js";
|
|
31
|
+
import {
|
|
32
|
+
parsePlanArtifactEnvelope
|
|
33
|
+
} from "./chunk-CLA6QIJM.js";
|
|
34
|
+
import {
|
|
35
|
+
isDeferSyncEnabled,
|
|
36
|
+
syncPlanningFiles
|
|
37
|
+
} from "./chunk-TRURQUBP.js";
|
|
38
|
+
import {
|
|
39
|
+
activateSprint,
|
|
40
|
+
closeSprintWithSyncPaths,
|
|
41
|
+
getCurrentSprint,
|
|
42
|
+
listTasksInSprint
|
|
43
|
+
} from "./chunk-L2CBG5IX.js";
|
|
44
|
+
import {
|
|
45
|
+
applyTaskTransitionOutcome,
|
|
46
|
+
getTask,
|
|
47
|
+
updateTaskStatus
|
|
48
|
+
} from "./chunk-7LHJDJB3.js";
|
|
49
|
+
import {
|
|
50
|
+
RUNTIME_ESTIMATOR_VERSION
|
|
51
|
+
} from "./chunk-CE5OZBYY.js";
|
|
52
|
+
import {
|
|
53
|
+
runWorkflowPreflight
|
|
54
|
+
} from "./chunk-ES6NWJ36.js";
|
|
55
|
+
import {
|
|
56
|
+
CompletionContractSchema,
|
|
57
|
+
validateCompletionContracts
|
|
58
|
+
} from "./chunk-MCBNWZNO.js";
|
|
59
|
+
import {
|
|
60
|
+
withPlanningLock
|
|
61
|
+
} from "./chunk-CSXLLEGB.js";
|
|
62
|
+
import {
|
|
63
|
+
getBucketByName,
|
|
64
|
+
getBucketPathByKind
|
|
65
|
+
} from "./chunk-V3KLVK7B.js";
|
|
66
|
+
import {
|
|
67
|
+
getResultPath,
|
|
68
|
+
loadManifest,
|
|
69
|
+
updateManifest
|
|
70
|
+
} from "./chunk-6TRD7TEE.js";
|
|
71
|
+
import {
|
|
72
|
+
signalCoordinator
|
|
73
|
+
} from "./chunk-GC4CRMTS.js";
|
|
74
|
+
import {
|
|
75
|
+
resolvePlanningContextForRoot
|
|
76
|
+
} from "./chunk-BBPIILO2.js";
|
|
77
|
+
import {
|
|
78
|
+
formatManagedSyncBranchError,
|
|
79
|
+
isManagedSyncBranchError
|
|
80
|
+
} from "./chunk-I7SCBHJN.js";
|
|
81
|
+
import {
|
|
82
|
+
buildRunBranchName
|
|
83
|
+
} from "./chunk-F55YABKV.js";
|
|
84
|
+
import {
|
|
85
|
+
hasRealOutput,
|
|
86
|
+
resolveBuildSelfExecutionScope
|
|
87
|
+
} from "./chunk-AHU3FKPA.js";
|
|
88
|
+
import {
|
|
89
|
+
CLAUDE_ALIAS_TO_MODEL_ID,
|
|
90
|
+
resolveModel
|
|
91
|
+
} from "./chunk-H3HGMISG.js";
|
|
92
|
+
import {
|
|
93
|
+
getWorktreeBaseDir
|
|
94
|
+
} from "./chunk-Z5WGNULV.js";
|
|
95
|
+
import {
|
|
96
|
+
findRepoRoot,
|
|
97
|
+
getExecutionContext
|
|
98
|
+
} from "./chunk-7VRJHTGZ.js";
|
|
99
|
+
|
|
100
|
+
// src/planning/sprint-execution-service.ts
|
|
101
|
+
import fs from "fs/promises";
|
|
102
|
+
import path2 from "path";
|
|
103
|
+
import chalk2 from "chalk";
|
|
104
|
+
import { execa } from "execa";
|
|
105
|
+
|
|
106
|
+
// src/planning/decomposition-plan-artifact.ts
|
|
107
|
+
import { z as z2 } from "zod";
|
|
108
|
+
|
|
109
|
+
// src/core/build/schemas.ts
|
|
110
|
+
import { createHash } from "crypto";
|
|
111
|
+
import { z } from "zod";
|
|
112
|
+
var verifyCommandProvenanceSchema = z.enum([
|
|
113
|
+
"workflow-config",
|
|
114
|
+
"baseline-workflow-config",
|
|
115
|
+
"candidate-gate-config",
|
|
116
|
+
"repair-config",
|
|
117
|
+
"persisted-finding"
|
|
118
|
+
]);
|
|
119
|
+
var VerifyCommandResultSchema = z.object({
|
|
120
|
+
command: z.string(),
|
|
121
|
+
exitCode: z.number().int(),
|
|
122
|
+
durationMs: z.number().int().nonnegative(),
|
|
123
|
+
provenance: verifyCommandProvenanceSchema.optional(),
|
|
124
|
+
outputTail: z.string().optional(),
|
|
125
|
+
stdoutTail: z.string().optional(),
|
|
126
|
+
stderrTail: z.string().optional(),
|
|
127
|
+
baselineErrorCount: z.number().int().nonnegative().optional(),
|
|
128
|
+
currentErrorCount: z.number().int().nonnegative().optional(),
|
|
129
|
+
newErrorCount: z.number().int().nonnegative().optional(),
|
|
130
|
+
/** Failed identically on the base checkout, so reported as passing. */
|
|
131
|
+
preExistingOnBase: z.boolean().optional(),
|
|
132
|
+
/** Resolver-proven unavailable (e.g. missing toolchain); kept so readback stays unverified. */
|
|
133
|
+
unavailable: z.boolean().optional()
|
|
134
|
+
});
|
|
135
|
+
var VerificationDispositionSchema = z.object({
|
|
136
|
+
outcome: z.enum(["passed", "failed", "unverified", "not-required"]),
|
|
137
|
+
scope: z.enum(["task", "project", "unknown"]),
|
|
138
|
+
reason: z.string().optional(),
|
|
139
|
+
uncovered: z.array(z.string()).optional()
|
|
140
|
+
});
|
|
141
|
+
var GoalGapEvidenceSchema = z.union([
|
|
142
|
+
z.object({ kind: z.literal("prose"), text: z.string() }),
|
|
143
|
+
// RESERVED / NOT YET EMITTED: no producer builds this variant today (see
|
|
144
|
+
// verifyResultId). Kept in the contract for the planned per-command evidence
|
|
145
|
+
// slice; consumers must not assume it appears.
|
|
146
|
+
z.object({ kind: z.literal("verifyResult"), verifyResultId: z.string(), command: z.string() })
|
|
147
|
+
]);
|
|
148
|
+
var GoalGapSchema = z.object({
|
|
149
|
+
id: z.string().min(1),
|
|
150
|
+
criterion: z.string().min(1),
|
|
151
|
+
status: z.enum(["satisfied", "unsatisfied", "unknown"]),
|
|
152
|
+
severity: z.enum(["blocking", "advisory"]),
|
|
153
|
+
evidence: GoalGapEvidenceSchema
|
|
154
|
+
});
|
|
155
|
+
function goalGapId(criterion) {
|
|
156
|
+
return createHash("sha1").update(criterion.trim(), "utf8").digest("hex").slice(0, 12);
|
|
157
|
+
}
|
|
158
|
+
var PriorAttemptSummarySchema = z.object({
|
|
159
|
+
attempt: z.number().int().positive(),
|
|
160
|
+
summary: z.string(),
|
|
161
|
+
verifyOutcome: z.enum(["passed", "failed", "skipped"]),
|
|
162
|
+
whyFailed: z.string().optional()
|
|
163
|
+
});
|
|
164
|
+
var ChangedFileSchema = z.object({
|
|
165
|
+
path: z.string(),
|
|
166
|
+
status: z.enum(["added", "modified", "deleted"]),
|
|
167
|
+
summary: z.string().optional()
|
|
168
|
+
});
|
|
169
|
+
var BudgetStateSchema = z.object({
|
|
170
|
+
turnsRemaining: z.number().int().nonnegative(),
|
|
171
|
+
msRemaining: z.number().int().nonnegative().optional()
|
|
172
|
+
});
|
|
173
|
+
var BuildRouteSchema = z.enum(["quick", "planned"]);
|
|
174
|
+
var BuildNextActionSchema = z.enum(["retry", "repair", "replan", "stop"]);
|
|
175
|
+
var BuildProviderProvenanceSchema = z.object({
|
|
176
|
+
/** The provider (and model) that actually ran. */
|
|
177
|
+
id: z.string().min(1),
|
|
178
|
+
model: z.string().min(1).optional(),
|
|
179
|
+
/** After a provider switch: what the build started with, what failed and why. */
|
|
180
|
+
requestedProvider: z.string().min(1).optional(),
|
|
181
|
+
requestedModel: z.string().min(1).optional(),
|
|
182
|
+
failoverFromProvider: z.string().min(1).optional(),
|
|
183
|
+
failoverReason: z.string().min(1).optional()
|
|
184
|
+
});
|
|
185
|
+
var BuildContextPreparationSchema = z.object({
|
|
186
|
+
policy: z.enum(["full", "quick", "review-repair", "repair", "merge"]),
|
|
187
|
+
status: z.string(),
|
|
188
|
+
reason: z.string().optional(),
|
|
189
|
+
executionRoot: z.string(),
|
|
190
|
+
revision: z.string().nullable(),
|
|
191
|
+
sources: z.array(z.string()),
|
|
192
|
+
selectedFiles: z.array(z.string()),
|
|
193
|
+
selectedFileReasons: z.array(z.string()),
|
|
194
|
+
omitted: z.array(z.object({ item: z.string(), reason: z.string() })),
|
|
195
|
+
estimatedTokens: z.number().nullable(),
|
|
196
|
+
contextBudgetTokens: z.number().nullable(),
|
|
197
|
+
cache: z.enum(["hit", "miss", "none"]),
|
|
198
|
+
purpose: z.enum(["confirmed", "absent"]),
|
|
199
|
+
stack: z.string().nullable(),
|
|
200
|
+
promptChars: z.object({ original: z.number(), prepared: z.number() })
|
|
201
|
+
});
|
|
202
|
+
var BuildQualityGateReportSchema = z.object({
|
|
203
|
+
preset: z.string(),
|
|
204
|
+
passed: z.boolean(),
|
|
205
|
+
/** Commands the gate actually ran, in order. */
|
|
206
|
+
ranCommands: z.array(z.string()).optional(),
|
|
207
|
+
/** Checks that passed, by name (for example Tests). */
|
|
208
|
+
passedChecks: z.array(z.string()).optional(),
|
|
209
|
+
/** The `--verify` commands that stood in for a verifier the resolver could not derive. */
|
|
210
|
+
deferredToVerifyCommands: z.array(z.string()).optional(),
|
|
211
|
+
/** Why nothing could verify the change, when the gate ran no failing check. */
|
|
212
|
+
unverifiedReason: z.string().optional(),
|
|
213
|
+
/** The check that failed: name, command and the first lines of its output. */
|
|
214
|
+
failure: z.object({ check: z.string(), command: z.string().optional(), detail: z.string() }).optional(),
|
|
215
|
+
/** Where this attempt's unapplied changes were saved, relative to the repository. */
|
|
216
|
+
attemptPatch: z.string().optional()
|
|
217
|
+
});
|
|
218
|
+
var BuildGoalEvidenceSchema = z.object({
|
|
219
|
+
semanticProgress: z.object({
|
|
220
|
+
movedCloser: z.boolean(),
|
|
221
|
+
confidence: z.number(),
|
|
222
|
+
reasoning: z.string()
|
|
223
|
+
}),
|
|
224
|
+
evaluator: z.object({ provider: z.string(), model: z.string().optional() }).optional()
|
|
225
|
+
});
|
|
226
|
+
var BuildAttemptOutcomeSchema = z.object({
|
|
227
|
+
intent: z.string(),
|
|
228
|
+
acceptanceCriteria: z.array(z.string()),
|
|
229
|
+
route: BuildRouteSchema,
|
|
230
|
+
provider: BuildProviderProvenanceSchema.optional(),
|
|
231
|
+
/** Quick route only: the context the attempt's provider turn was given. */
|
|
232
|
+
contextPreparation: BuildContextPreparationSchema.optional(),
|
|
233
|
+
/** Planned execution identity used by automation to locate workflow artifacts. */
|
|
234
|
+
workflowId: z.string().min(1).optional(),
|
|
235
|
+
/** Present only when the result was kept on a review branch and not applied to the checkout. */
|
|
236
|
+
review: z.object({ branch: z.string().optional(), baseSha: z.string().optional() }).optional(),
|
|
237
|
+
/** Planned route: advisory reviews that gave no trusted result, so the build passed unreviewed. */
|
|
238
|
+
reviewUnavailable: z.array(z.object({ stageId: z.string(), reason: z.string() })).optional(),
|
|
239
|
+
// Zero is reserved for the no-attempt terminal sentinel emitted by
|
|
240
|
+
// emptyOutcome() when the loop short-circuits before any attempt runs.
|
|
241
|
+
attempt: z.number().int().nonnegative(),
|
|
242
|
+
changedFiles: z.array(ChangedFileSchema),
|
|
243
|
+
verifyResults: z.array(VerifyCommandResultSchema),
|
|
244
|
+
goalGap: z.object({
|
|
245
|
+
satisfied: z.boolean(),
|
|
246
|
+
gaps: z.array(GoalGapSchema),
|
|
247
|
+
/** Raw evaluator status from goal-satisfaction-gate; used for truthful CLI rendering. */
|
|
248
|
+
evaluatorStatus: z.enum(["satisfied", "unsatisfied", "blocked"]).optional(),
|
|
249
|
+
/** Existing goal evaluator diagnostics, when the check ran. */
|
|
250
|
+
evidence: BuildGoalEvidenceSchema.optional()
|
|
251
|
+
}),
|
|
252
|
+
/** Present only when user verification could not run: delivered unverified, never passed. */
|
|
253
|
+
verification: VerificationDispositionSchema.optional(),
|
|
254
|
+
/** Quick route only: what the quality gate ran or why it could not verify. Omitted when it only passed. */
|
|
255
|
+
qualityGate: BuildQualityGateReportSchema.optional(),
|
|
256
|
+
priorAttempts: z.array(PriorAttemptSummarySchema),
|
|
257
|
+
priorAttemptsTruncated: z.boolean(),
|
|
258
|
+
recommendedNextAction: BuildNextActionSchema,
|
|
259
|
+
budgetState: BudgetStateSchema,
|
|
260
|
+
costUsd: z.number().nonnegative().optional(),
|
|
261
|
+
durationMs: z.number().int().nonnegative()
|
|
262
|
+
});
|
|
263
|
+
var PRIOR_ATTEMPTS_RETAINED = 5;
|
|
264
|
+
var BuildTerminalReasonSchema = z.enum([
|
|
265
|
+
"satisfied",
|
|
266
|
+
"max-turns",
|
|
267
|
+
"timebox",
|
|
268
|
+
"aborted",
|
|
269
|
+
"error"
|
|
270
|
+
]);
|
|
271
|
+
var BuildResultSchema = z.object({
|
|
272
|
+
finalOutcome: BuildAttemptOutcomeSchema,
|
|
273
|
+
terminalReason: BuildTerminalReasonSchema,
|
|
274
|
+
totalDurationMs: z.number().int().nonnegative(),
|
|
275
|
+
totalCostUsd: z.number().nonnegative().optional(),
|
|
276
|
+
turnsRun: z.number().int().nonnegative()
|
|
277
|
+
});
|
|
278
|
+
function truncatePriorAttempts(attempts) {
|
|
279
|
+
if (attempts.length <= PRIOR_ATTEMPTS_RETAINED) {
|
|
280
|
+
return { attempts: [...attempts], truncated: false };
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
attempts: attempts.slice(attempts.length - PRIOR_ATTEMPTS_RETAINED),
|
|
284
|
+
truncated: true
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function structureLegacyGaps(rawGaps) {
|
|
288
|
+
return rawGaps.map((raw) => raw.trim()).filter((raw) => raw.length > 0).map((criterion) => ({
|
|
289
|
+
id: goalGapId(criterion),
|
|
290
|
+
criterion,
|
|
291
|
+
status: "unsatisfied",
|
|
292
|
+
severity: "blocking",
|
|
293
|
+
evidence: { kind: "prose", text: criterion }
|
|
294
|
+
}));
|
|
295
|
+
}
|
|
296
|
+
function removeDuplicateVerifyGaps(gaps, verifyResults) {
|
|
297
|
+
const failedVerifyResults = verifyResults.filter((result) => result.exitCode !== 0);
|
|
298
|
+
if (failedVerifyResults.length === 0) return [...gaps];
|
|
299
|
+
return gaps.filter((gap) => !isDuplicateVerifyGap(gap, failedVerifyResults));
|
|
300
|
+
}
|
|
301
|
+
function removeDuplicateVerifyReasons(reasons, verifyResults) {
|
|
302
|
+
const failedVerifyResults = verifyResults.filter((result) => result.exitCode !== 0);
|
|
303
|
+
if (failedVerifyResults.length === 0) return [...reasons];
|
|
304
|
+
return reasons.filter((reason) => {
|
|
305
|
+
const gap = {
|
|
306
|
+
id: goalGapId(reason),
|
|
307
|
+
criterion: reason,
|
|
308
|
+
status: "unsatisfied",
|
|
309
|
+
severity: "blocking",
|
|
310
|
+
evidence: { kind: "prose", text: reason }
|
|
311
|
+
};
|
|
312
|
+
return !isDuplicateVerifyGap(gap, failedVerifyResults);
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
function blockingGapsUnsatisfied(gaps) {
|
|
316
|
+
return gaps.filter((gap) => gap.severity === "blocking" && gap.status === "unsatisfied");
|
|
317
|
+
}
|
|
318
|
+
function downgradeGapsToAdvisory(gaps) {
|
|
319
|
+
return gaps.map((gap) => ({ ...gap, severity: "advisory" }));
|
|
320
|
+
}
|
|
321
|
+
var CARRYOVER_DIFF_BYTE_CAP = 2e5;
|
|
322
|
+
function capDiff(diff) {
|
|
323
|
+
if (diff.length <= CARRYOVER_DIFF_BYTE_CAP) return diff;
|
|
324
|
+
return `${diff.slice(0, CARRYOVER_DIFF_BYTE_CAP)}
|
|
325
|
+
[... diff truncated at ${CARRYOVER_DIFF_BYTE_CAP} bytes]`;
|
|
326
|
+
}
|
|
327
|
+
var GATE_EVIDENCE_BYTE_CAP = 800;
|
|
328
|
+
function verifyResultToGateCheck(result, prefix = "verify") {
|
|
329
|
+
const failed = result.exitCode !== 0;
|
|
330
|
+
const evidence = (failed ? result.outputTail || result.stderrTail || result.stdoutTail || "" : [result.stderrTail, result.stdoutTail, result.outputTail].find(hasRealOutput) ?? (result.stderrTail || result.stdoutTail || result.outputTail || "")).slice(0, GATE_EVIDENCE_BYTE_CAP);
|
|
331
|
+
return {
|
|
332
|
+
name: `${prefix}: ${result.command}`,
|
|
333
|
+
status: failed ? "failed" : "passed",
|
|
334
|
+
summary: failed ? `exit ${result.exitCode} in ${result.durationMs}ms` : `exit 0 in ${result.durationMs}ms`,
|
|
335
|
+
evidence: evidence.length > 0 ? evidence : void 0
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
var VERIFY_GAP_CONTEXT = /\b(?:verify|verification|verify command|quality gate|gate failed|command failed|failed verification|exit\s+\d+|non[- ]?zero)\b/i;
|
|
339
|
+
function isDuplicateVerifyGap(gap, failedVerifyResults) {
|
|
340
|
+
const gapText = gap.evidence.kind === "prose" ? `${gap.criterion}
|
|
341
|
+
${gap.evidence.text}` : gap.criterion;
|
|
342
|
+
const normalizedGap = normalizeForVerifyGapMatch(gapText);
|
|
343
|
+
if (!VERIFY_GAP_CONTEXT.test(gapText)) return false;
|
|
344
|
+
return failedVerifyResults.some((result) => {
|
|
345
|
+
const normalizedCommand = normalizeForVerifyGapMatch(result.command);
|
|
346
|
+
if (normalizedCommand.length >= 8 && normalizedGap.includes(normalizedCommand)) {
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
return verifyFailureFragments(result).some((fragment) => {
|
|
350
|
+
const normalizedFragment = normalizeForVerifyGapMatch(fragment);
|
|
351
|
+
return normalizedFragment.length >= 20 && normalizedGap.includes(normalizedFragment);
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
function verifyFailureFragments(result) {
|
|
356
|
+
return [result.outputTail, result.stderrTail, result.stdoutTail].flatMap((text) => (text ?? "").split(/\r?\n/)).map((line) => line.trim()).filter((line) => line.length > 0);
|
|
357
|
+
}
|
|
358
|
+
function normalizeForVerifyGapMatch(value) {
|
|
359
|
+
return value.toLowerCase().replace(/[`'"]/g, "").replace(/\s+/g, " ").trim();
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// src/planning/decomposition-plan-artifact.ts
|
|
363
|
+
var CompetitionConfigSchema = z2.object({
|
|
364
|
+
variants: z2.array(
|
|
365
|
+
z2.object({
|
|
366
|
+
provider: z2.string().min(1)
|
|
367
|
+
}).passthrough()
|
|
368
|
+
)
|
|
369
|
+
}).passthrough().transform((value) => value);
|
|
370
|
+
var AutoloopConfigSchema = z2.object({}).passthrough().transform((value) => value);
|
|
371
|
+
var StageCapabilitiesSchema = z2.object({
|
|
372
|
+
modifiesFiles: z2.boolean(),
|
|
373
|
+
readsFiles: z2.boolean().optional(),
|
|
374
|
+
producesText: z2.boolean().optional(),
|
|
375
|
+
executionIntent: z2.enum(["edit", "analysis"]).optional()
|
|
376
|
+
}).passthrough().transform((value) => value);
|
|
377
|
+
var StageValidationSchema = z2.object({
|
|
378
|
+
enabled: z2.boolean(),
|
|
379
|
+
requireChanges: z2.boolean().optional(),
|
|
380
|
+
target: z2.string().optional(),
|
|
381
|
+
threshold: z2.number().optional(),
|
|
382
|
+
maxRetries: z2.number().int().nonnegative().optional(),
|
|
383
|
+
requiredFiles: z2.array(z2.string()).optional(),
|
|
384
|
+
checks: z2.array(z2.unknown()).optional(),
|
|
385
|
+
semanticChecks: z2.array(z2.unknown()).optional(),
|
|
386
|
+
// Shape-check each contract, then apply the full set-level authoring policy
|
|
387
|
+
// (C08-R06) so individually valid llm_judge entries cannot bypass rejection
|
|
388
|
+
// of an llm_judge-only set on create/parse of decomposition artifacts.
|
|
389
|
+
completionContract: z2.union([CompletionContractSchema, z2.array(CompletionContractSchema)]).optional(),
|
|
390
|
+
extract: z2.unknown().optional()
|
|
391
|
+
}).passthrough().superRefine((value, ctx) => {
|
|
392
|
+
if (value.completionContract === void 0) {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const contractValidation = validateCompletionContracts(value.completionContract);
|
|
396
|
+
for (const error of contractValidation.errors) {
|
|
397
|
+
ctx.addIssue({
|
|
398
|
+
code: z2.ZodIssueCode.custom,
|
|
399
|
+
// Surface the shared completionContract field so create/parse errors
|
|
400
|
+
// match the actionable policy used by schema-validator / flywheel.
|
|
401
|
+
message: error.message,
|
|
402
|
+
path: ["completionContract"]
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}).transform((value) => value);
|
|
406
|
+
var SubStageExecutionTelemetrySchema = z2.object({
|
|
407
|
+
validationPassed: z2.boolean(),
|
|
408
|
+
cost: z2.number(),
|
|
409
|
+
provider: z2.string().optional(),
|
|
410
|
+
model: z2.string().optional(),
|
|
411
|
+
resolvedModel: z2.string().optional(),
|
|
412
|
+
summary: z2.string().optional(),
|
|
413
|
+
durationMs: z2.number().int().optional(),
|
|
414
|
+
changedFilesCount: z2.number().int().optional(),
|
|
415
|
+
changedFiles: z2.array(z2.string()).optional(),
|
|
416
|
+
completeness: z2.number().optional(),
|
|
417
|
+
completenessSource: z2.enum(["provider", "post-commit", "derived"]).optional(),
|
|
418
|
+
verifyCommands: z2.array(z2.unknown()).optional(),
|
|
419
|
+
requiredFiles: z2.array(z2.string()).optional(),
|
|
420
|
+
missingRequiredFiles: z2.array(z2.string()).optional(),
|
|
421
|
+
untouchedRequiredFiles: z2.array(z2.string()).optional(),
|
|
422
|
+
intentionalNoOp: z2.boolean().optional(),
|
|
423
|
+
warnings: z2.array(z2.string()).optional(),
|
|
424
|
+
verification: VerificationDispositionSchema.optional(),
|
|
425
|
+
recovery: z2.object({
|
|
426
|
+
classification: z2.enum([
|
|
427
|
+
"deliverable-miss",
|
|
428
|
+
"structural",
|
|
429
|
+
"transient",
|
|
430
|
+
"transport",
|
|
431
|
+
"provider-timeout",
|
|
432
|
+
"other"
|
|
433
|
+
]),
|
|
434
|
+
retryBudgetUsed: z2.number().int().nonnegative(),
|
|
435
|
+
retryBudgetTotal: z2.number().int().nonnegative(),
|
|
436
|
+
infrastructureRetryBudgetUsed: z2.number().int().nonnegative().optional(),
|
|
437
|
+
infrastructureRetryBudgetTotal: z2.number().int().nonnegative().optional(),
|
|
438
|
+
replanningBudgetUsed: z2.number().int().nonnegative().optional(),
|
|
439
|
+
replanningBudgetTotal: z2.number().int().nonnegative().optional(),
|
|
440
|
+
recoverable: z2.boolean(),
|
|
441
|
+
retryAttempted: z2.boolean(),
|
|
442
|
+
replanningAttempted: z2.boolean(),
|
|
443
|
+
note: z2.string().optional()
|
|
444
|
+
}).optional(),
|
|
445
|
+
modelSelectionSource: z2.enum([
|
|
446
|
+
"explicit-substage",
|
|
447
|
+
"inherited-parent",
|
|
448
|
+
"flywheel-tier-default",
|
|
449
|
+
"provider-registry-default"
|
|
450
|
+
]).optional()
|
|
451
|
+
}).passthrough();
|
|
452
|
+
var DecompositionPlanExecutionSummarySchema = z2.object({
|
|
453
|
+
workflowId: z2.string().min(1),
|
|
454
|
+
sprintId: z2.string().min(1),
|
|
455
|
+
updatedAt: z2.string().min(1),
|
|
456
|
+
validationPassed: z2.boolean(),
|
|
457
|
+
verificationPolicy: z2.enum(["findings", "blocking"]).optional(),
|
|
458
|
+
successfulSubStages: z2.number().int().nonnegative(),
|
|
459
|
+
unverifiedSubStages: z2.number().int().positive().optional(),
|
|
460
|
+
totalSubStages: z2.number().int().nonnegative(),
|
|
461
|
+
orchestrationCost: z2.number(),
|
|
462
|
+
totalCostWithOrchestration: z2.number(),
|
|
463
|
+
replanningTriggered: z2.boolean().optional(),
|
|
464
|
+
replanningAttempts: z2.number().int().nonnegative().optional(),
|
|
465
|
+
zeroOutput: z2.boolean().optional(),
|
|
466
|
+
recovery: z2.object({
|
|
467
|
+
classification: z2.enum([
|
|
468
|
+
"deliverable-miss",
|
|
469
|
+
"structural",
|
|
470
|
+
"transient",
|
|
471
|
+
"transport",
|
|
472
|
+
"provider-timeout",
|
|
473
|
+
"other"
|
|
474
|
+
]),
|
|
475
|
+
retryBudgetUsed: z2.number().int().nonnegative(),
|
|
476
|
+
retryBudgetTotal: z2.number().int().nonnegative(),
|
|
477
|
+
infrastructureRetryBudgetUsed: z2.number().int().nonnegative().optional(),
|
|
478
|
+
infrastructureRetryBudgetTotal: z2.number().int().nonnegative().optional(),
|
|
479
|
+
replanningBudgetUsed: z2.number().int().nonnegative().optional(),
|
|
480
|
+
replanningBudgetTotal: z2.number().int().nonnegative().optional(),
|
|
481
|
+
recoverable: z2.boolean(),
|
|
482
|
+
retryAttempted: z2.boolean(),
|
|
483
|
+
replanningAttempted: z2.boolean(),
|
|
484
|
+
note: z2.string().optional()
|
|
485
|
+
}).optional()
|
|
486
|
+
}).passthrough();
|
|
487
|
+
var ExecutionMetadataSchema = z2.object({
|
|
488
|
+
provider: z2.string().min(1),
|
|
489
|
+
resolvedModel: z2.string().optional(),
|
|
490
|
+
usedProviders: z2.array(z2.string().min(1)).optional(),
|
|
491
|
+
usedModels: z2.array(z2.string().min(1)).optional(),
|
|
492
|
+
durationMs: z2.number().int().nonnegative(),
|
|
493
|
+
totalCost: z2.number(),
|
|
494
|
+
success: z2.boolean(),
|
|
495
|
+
exitReason: z2.string().min(1),
|
|
496
|
+
warnings: z2.array(z2.string()).optional(),
|
|
497
|
+
errors: z2.array(z2.string()).optional(),
|
|
498
|
+
updatedAt: z2.string().min(1)
|
|
499
|
+
}).passthrough();
|
|
500
|
+
var BudgetAssessmentSchema = z2.object({
|
|
501
|
+
mode: z2.enum(["advisory"]),
|
|
502
|
+
budgetPerSubStage: z2.number(),
|
|
503
|
+
totalBudget: z2.number(),
|
|
504
|
+
estimatedTotalCost: z2.number(),
|
|
505
|
+
overBudget: z2.boolean(),
|
|
506
|
+
overBudgetStages: z2.array(
|
|
507
|
+
z2.object({
|
|
508
|
+
stageId: z2.string(),
|
|
509
|
+
estimatedCost: z2.number(),
|
|
510
|
+
advisoryCost: z2.number()
|
|
511
|
+
})
|
|
512
|
+
),
|
|
513
|
+
updatedAt: z2.string().min(1)
|
|
514
|
+
}).passthrough();
|
|
515
|
+
var SubStageSpecSchema = z2.object({
|
|
516
|
+
id: z2.string().min(1),
|
|
517
|
+
type: z2.enum(["standard", "competition", "verify", "autoloop", "refinement"]),
|
|
518
|
+
name: z2.string().max(500).optional(),
|
|
519
|
+
prompt: z2.string().max(5e4),
|
|
520
|
+
description: z2.string().max(1e4).optional(),
|
|
521
|
+
deps: z2.array(z2.string()).optional(),
|
|
522
|
+
provider: z2.string().max(50).regex(/^[a-z][a-z0-9_-]*$/i, "Provider name must be a valid identifier").optional(),
|
|
523
|
+
model: z2.string().optional(),
|
|
524
|
+
estimatedCost: z2.number().optional(),
|
|
525
|
+
actualCost: z2.number().optional(),
|
|
526
|
+
actualDurationMs: z2.number().int().optional(),
|
|
527
|
+
result: SubStageExecutionTelemetrySchema.optional(),
|
|
528
|
+
competition: CompetitionConfigSchema.optional(),
|
|
529
|
+
autoloop: AutoloopConfigSchema.optional(),
|
|
530
|
+
verify: z2.object({
|
|
531
|
+
commands: z2.array(z2.string())
|
|
532
|
+
}).optional(),
|
|
533
|
+
capabilities: StageCapabilitiesSchema.optional(),
|
|
534
|
+
validation: StageValidationSchema.optional(),
|
|
535
|
+
allowEmptyResults: z2.boolean().optional(),
|
|
536
|
+
allowlist: z2.array(z2.string()).optional(),
|
|
537
|
+
retryBudget: z2.number().int().nonnegative().optional()
|
|
538
|
+
}).passthrough();
|
|
539
|
+
var DecompositionPlanSchema = z2.object({
|
|
540
|
+
goal: z2.string().min(1),
|
|
541
|
+
subStages: z2.array(SubStageSpecSchema).min(1),
|
|
542
|
+
rationale: z2.string(),
|
|
543
|
+
estimatedTotalCost: z2.number(),
|
|
544
|
+
estimatedDurationMs: z2.number().int(),
|
|
545
|
+
hasParallelGroups: z2.boolean(),
|
|
546
|
+
parallelGroups: z2.array(z2.array(z2.string())).optional(),
|
|
547
|
+
executionSummary: DecompositionPlanExecutionSummarySchema.optional(),
|
|
548
|
+
enforcementVersion: z2.number().optional().default(0),
|
|
549
|
+
budgetAssessment: BudgetAssessmentSchema.optional()
|
|
550
|
+
}).passthrough();
|
|
551
|
+
var OrchestratorConfigSnapshotSchema = z2.object({
|
|
552
|
+
maxSubStages: z2.number().int().positive(),
|
|
553
|
+
budgetPerSubStage: z2.number(),
|
|
554
|
+
totalBudget: z2.number(),
|
|
555
|
+
budgetMode: z2.enum(["advisory"]).optional(),
|
|
556
|
+
allowedSubStageTypes: z2.array(
|
|
557
|
+
z2.enum(["standard", "competition", "verify", "autoloop", "refinement"])
|
|
558
|
+
),
|
|
559
|
+
orchestrationProvider: z2.string(),
|
|
560
|
+
orchestrationModel: z2.string(),
|
|
561
|
+
hints: z2.array(z2.string()),
|
|
562
|
+
allowReplanning: z2.boolean(),
|
|
563
|
+
maxReplanningAttempts: z2.number().int().nonnegative(),
|
|
564
|
+
retryBudgetPerSubStage: z2.number().int().nonnegative().default(1),
|
|
565
|
+
enableParallelization: z2.boolean(),
|
|
566
|
+
dryRun: z2.boolean(),
|
|
567
|
+
maxRecursionDepth: z2.number().int().nonnegative(),
|
|
568
|
+
repairOnVerifyFailure: z2.object({
|
|
569
|
+
enabled: z2.boolean(),
|
|
570
|
+
maxIterations: z2.number().int().positive().optional(),
|
|
571
|
+
timeboxMs: z2.number().int().positive().optional()
|
|
572
|
+
}).optional()
|
|
573
|
+
}).passthrough();
|
|
574
|
+
var DecompositionIntentSchema = z2.object({
|
|
575
|
+
rawIntent: z2.string().min(1),
|
|
576
|
+
source: z2.enum(["manual", "intake", "splitter"]).optional(),
|
|
577
|
+
interview: z2.object({
|
|
578
|
+
success: z2.string().optional(),
|
|
579
|
+
constraints: z2.string().optional(),
|
|
580
|
+
nonGoals: z2.string().optional(),
|
|
581
|
+
risk: z2.string().optional()
|
|
582
|
+
}).optional(),
|
|
583
|
+
configNonGoals: z2.array(z2.string()).optional(),
|
|
584
|
+
assumptions: z2.object({
|
|
585
|
+
inferred: z2.array(
|
|
586
|
+
z2.object({
|
|
587
|
+
key: z2.enum(["success", "constraints", "nonGoals", "risk"]),
|
|
588
|
+
value: z2.string(),
|
|
589
|
+
confidence: z2.enum(["high", "medium", "low"])
|
|
590
|
+
})
|
|
591
|
+
).optional(),
|
|
592
|
+
alternatives: z2.array(
|
|
593
|
+
z2.object({
|
|
594
|
+
key: z2.enum(["success", "constraints", "nonGoals", "risk"]),
|
|
595
|
+
label: z2.string(),
|
|
596
|
+
description: z2.string()
|
|
597
|
+
})
|
|
598
|
+
).optional(),
|
|
599
|
+
questionsAsked: z2.number().int().nonnegative().optional(),
|
|
600
|
+
analysisProvider: z2.string().optional(),
|
|
601
|
+
contextSignals: z2.object({
|
|
602
|
+
hadActiveSprint: z2.boolean().optional(),
|
|
603
|
+
hadBacklogItems: z2.boolean().optional(),
|
|
604
|
+
hadGitContext: z2.boolean().optional(),
|
|
605
|
+
hadModifiedFiles: z2.boolean().optional(),
|
|
606
|
+
taskTypeId: z2.string().optional()
|
|
607
|
+
}).optional()
|
|
608
|
+
}).optional()
|
|
609
|
+
}).passthrough();
|
|
610
|
+
var DecompositionPlanArtifactPayloadSchema = z2.object({
|
|
611
|
+
goal: z2.string().min(1),
|
|
612
|
+
intent: DecompositionIntentSchema.optional(),
|
|
613
|
+
orchestratorConfig: OrchestratorConfigSnapshotSchema,
|
|
614
|
+
plan: DecompositionPlanSchema,
|
|
615
|
+
executionDefaults: z2.object({
|
|
616
|
+
provider: z2.string().min(1),
|
|
617
|
+
model: z2.string().optional(),
|
|
618
|
+
providerExplicit: z2.boolean().optional()
|
|
619
|
+
}).passthrough(),
|
|
620
|
+
executionMetadata: ExecutionMetadataSchema.optional(),
|
|
621
|
+
budgetAssessment: BudgetAssessmentSchema.optional()
|
|
622
|
+
}).passthrough();
|
|
623
|
+
var SUPPORTED_VALIDATION_PROVIDERS = /* @__PURE__ */ new Set([
|
|
624
|
+
"claude",
|
|
625
|
+
"codex",
|
|
626
|
+
"copilot",
|
|
627
|
+
"cursor",
|
|
628
|
+
"gemini",
|
|
629
|
+
"openai"
|
|
630
|
+
]);
|
|
631
|
+
function normalizePersistedModel(provider, model, options = {}) {
|
|
632
|
+
if (typeof model !== "string") {
|
|
633
|
+
return model;
|
|
634
|
+
}
|
|
635
|
+
const trimmedModel = model.trim();
|
|
636
|
+
if (trimmedModel.length === 0) {
|
|
637
|
+
return options.preserveEmpty ? "" : void 0;
|
|
638
|
+
}
|
|
639
|
+
const normalizedProvider = provider?.trim().toLowerCase();
|
|
640
|
+
if (!normalizedProvider || !SUPPORTED_VALIDATION_PROVIDERS.has(normalizedProvider)) {
|
|
641
|
+
return trimmedModel;
|
|
642
|
+
}
|
|
643
|
+
if (normalizedProvider === "claude") {
|
|
644
|
+
const resolvedClaudeModel = resolveModel(trimmedModel) ?? trimmedModel;
|
|
645
|
+
return CLAUDE_ALIAS_TO_MODEL_ID[resolvedClaudeModel] ?? resolvedClaudeModel;
|
|
646
|
+
}
|
|
647
|
+
const validation = validateModel({
|
|
648
|
+
provider: normalizedProvider,
|
|
649
|
+
model: trimmedModel
|
|
650
|
+
});
|
|
651
|
+
return validation.valid ? validation.normalizedModel ?? trimmedModel : trimmedModel;
|
|
652
|
+
}
|
|
653
|
+
function normalizeDecompositionPlanArtifactPayload(payload) {
|
|
654
|
+
const executionProvider = payload.executionDefaults.provider;
|
|
655
|
+
const normalizedExecutionModel = normalizePersistedModel(
|
|
656
|
+
executionProvider,
|
|
657
|
+
payload.executionDefaults.model
|
|
658
|
+
);
|
|
659
|
+
const normalizedOrchestrationProvider = payload.orchestratorConfig.orchestrationProvider || executionProvider;
|
|
660
|
+
return {
|
|
661
|
+
...payload,
|
|
662
|
+
orchestratorConfig: {
|
|
663
|
+
...payload.orchestratorConfig,
|
|
664
|
+
orchestrationModel: normalizePersistedModel(
|
|
665
|
+
normalizedOrchestrationProvider,
|
|
666
|
+
payload.orchestratorConfig.orchestrationModel,
|
|
667
|
+
{ preserveEmpty: true }
|
|
668
|
+
) ?? ""
|
|
669
|
+
},
|
|
670
|
+
plan: {
|
|
671
|
+
...payload.plan,
|
|
672
|
+
subStages: payload.plan.subStages.map((subStage) => ({
|
|
673
|
+
...subStage,
|
|
674
|
+
model: normalizePersistedModel(subStage.provider ?? executionProvider, subStage.model)
|
|
675
|
+
}))
|
|
676
|
+
},
|
|
677
|
+
executionDefaults: {
|
|
678
|
+
...payload.executionDefaults,
|
|
679
|
+
model: normalizedExecutionModel
|
|
680
|
+
}
|
|
681
|
+
};
|
|
682
|
+
}
|
|
683
|
+
function toDecompositionPlanArtifactPayload(input) {
|
|
684
|
+
return normalizeDecompositionPlanArtifactPayload(
|
|
685
|
+
DecompositionPlanArtifactPayloadSchema.parse(input)
|
|
686
|
+
);
|
|
687
|
+
}
|
|
688
|
+
function parseDecompositionPlanArtifactPayload(value) {
|
|
689
|
+
return normalizeDecompositionPlanArtifactPayload(
|
|
690
|
+
DecompositionPlanArtifactPayloadSchema.parse(value)
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// src/planning/sprint-closeout.ts
|
|
695
|
+
import path from "path";
|
|
696
|
+
import chalk from "chalk";
|
|
697
|
+
async function closeSprintAfterApply(config, logger) {
|
|
698
|
+
try {
|
|
699
|
+
const tasks = await listTasksInSprint(config.sprintId);
|
|
700
|
+
if (!tasks.every((task) => task.status === "done")) {
|
|
701
|
+
logger.log(chalk.yellow("Sprint not ready to close (not all tasks are done)"));
|
|
702
|
+
logger.log(chalk.dim("Incomplete tasks:"));
|
|
703
|
+
for (const task of tasks.filter((task2) => task2.status !== "done")) {
|
|
704
|
+
logger.log(chalk.dim(` - ${task.id}: ${task.title} (${task.status})`));
|
|
705
|
+
}
|
|
706
|
+
return { closed: false };
|
|
707
|
+
}
|
|
708
|
+
logger.log(chalk.cyan("Closing sprint..."));
|
|
709
|
+
const closeout = await closeSprintWithSyncPaths(config.sprintId, {
|
|
710
|
+
force: false,
|
|
711
|
+
noArchive: false,
|
|
712
|
+
dryRun: false
|
|
713
|
+
});
|
|
714
|
+
const projectRoot = findRepoRoot();
|
|
715
|
+
const paths = [...closeout.touchedPaths];
|
|
716
|
+
if (config.archiveBacklog && config.archiveLinkedBacklogItems) {
|
|
717
|
+
const linked = await config.archiveLinkedBacklogItems(config.sprintId, {
|
|
718
|
+
dryRun: false
|
|
719
|
+
}).catch((error) => {
|
|
720
|
+
logger.log(chalk.yellow(`Failed to archive linked backlog items: ${String(error)}`));
|
|
721
|
+
return void 0;
|
|
722
|
+
});
|
|
723
|
+
if (linked?.archived.length) {
|
|
724
|
+
const backlogDir = getBucketPathByKind("backlog", projectRoot);
|
|
725
|
+
const publishArchive = resolvePlanningContextForRoot(projectRoot).backend === "git-branch" && getBucketByName("backlog", projectRoot)?.archivePublished === true;
|
|
726
|
+
for (const item of linked.archived) {
|
|
727
|
+
paths.push(path.join(backlogDir, `${item.id}.md`));
|
|
728
|
+
if (publishArchive) paths.push(item.archivedPath);
|
|
729
|
+
}
|
|
730
|
+
logger.log(chalk.green(`Archived ${linked.archived.length} linked backlog item(s)`));
|
|
731
|
+
} else if (linked) {
|
|
732
|
+
const warning = linked.warning ?? (linked.skipped.length > 0 ? `Linked backlog items were not archived: ${linked.skipped.join(", ")}` : `No linked backlog items found for sprint ${config.sprintId} (including archived tasks)`);
|
|
733
|
+
logger.log(chalk.yellow(`Warning: ${warning}`));
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
if (paths.length > 0) {
|
|
737
|
+
const publication = await syncPlanningFiles(
|
|
738
|
+
projectRoot,
|
|
739
|
+
[...new Set(paths)],
|
|
740
|
+
`sprint: close ${config.sprintId}`,
|
|
741
|
+
{ strict: true, allowPushFailure: true, deferPublication: isDeferSyncEnabled() }
|
|
742
|
+
).catch((error) => {
|
|
743
|
+
if (!isManagedSyncBranchError(error) || resolvePlanningContextForRoot(projectRoot).backend !== "checkout") {
|
|
744
|
+
throw error;
|
|
745
|
+
}
|
|
746
|
+
logger.log(chalk.yellow(` Warning: ${formatManagedSyncBranchError(error)}`));
|
|
747
|
+
return { synced: false, status: "skipped" };
|
|
748
|
+
});
|
|
749
|
+
if (!publication.synced && !publication.noRemote && publication.status !== "skipped") {
|
|
750
|
+
throw new Error(`Sprint closeout publication is incomplete (${publication.status})`);
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
logger.log(chalk.green(`Sprint ${config.sprintId} closed (${tasks.length} done)`));
|
|
754
|
+
return { closed: true };
|
|
755
|
+
} catch (error) {
|
|
756
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
757
|
+
logger.log(chalk.yellow("Failed to close sprint:"));
|
|
758
|
+
logger.log(chalk.yellow(` ${message}`));
|
|
759
|
+
return { closed: false, error: message };
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// src/planning/sprint-execution-service.ts
|
|
764
|
+
async function captureCallerCheckoutSnapshot() {
|
|
765
|
+
const repoRoot = findRepoRoot();
|
|
766
|
+
try {
|
|
767
|
+
const branchResult = await execa("git", ["branch", "--show-current"], {
|
|
768
|
+
cwd: repoRoot,
|
|
769
|
+
stdio: "pipe",
|
|
770
|
+
timeout: 3e4
|
|
771
|
+
});
|
|
772
|
+
const branch = branchResult.stdout.trim();
|
|
773
|
+
return { repoRoot, branch: branch || null };
|
|
774
|
+
} catch {
|
|
775
|
+
return { repoRoot, branch: null };
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
async function restoreCallerCheckoutIfNeeded(snapshot) {
|
|
779
|
+
if (!snapshot.branch) {
|
|
780
|
+
return null;
|
|
781
|
+
}
|
|
782
|
+
let currentBranch = "";
|
|
783
|
+
try {
|
|
784
|
+
const currentResult = await execa("git", ["branch", "--show-current"], {
|
|
785
|
+
cwd: snapshot.repoRoot,
|
|
786
|
+
stdio: "pipe",
|
|
787
|
+
timeout: 3e4
|
|
788
|
+
});
|
|
789
|
+
currentBranch = currentResult.stdout.trim();
|
|
790
|
+
} catch (error) {
|
|
791
|
+
return `Failed to inspect caller checkout before sprint status sync: ${error instanceof Error ? error.message : String(error)}`;
|
|
792
|
+
}
|
|
793
|
+
if (currentBranch === snapshot.branch) {
|
|
794
|
+
return null;
|
|
795
|
+
}
|
|
796
|
+
let status = "";
|
|
797
|
+
try {
|
|
798
|
+
const statusResult = await execa("git", ["status", "--porcelain"], {
|
|
799
|
+
cwd: snapshot.repoRoot,
|
|
800
|
+
stdio: "pipe",
|
|
801
|
+
timeout: 3e4
|
|
802
|
+
});
|
|
803
|
+
status = statusResult.stdout.trim();
|
|
804
|
+
} catch (error) {
|
|
805
|
+
return `Failed to inspect caller checkout cleanliness before sprint status sync: ${error instanceof Error ? error.message : String(error)}`;
|
|
806
|
+
}
|
|
807
|
+
if (status.length > 0) {
|
|
808
|
+
const currentLabel = currentBranch || "detached HEAD";
|
|
809
|
+
return `Caller checkout changed from ${snapshot.branch} to ${currentLabel} and has local changes; refusing to sync managed task status into the wrong checkout.`;
|
|
810
|
+
}
|
|
811
|
+
try {
|
|
812
|
+
await execa("git", ["checkout", snapshot.branch], {
|
|
813
|
+
cwd: snapshot.repoRoot,
|
|
814
|
+
stdio: "pipe",
|
|
815
|
+
timeout: 3e4
|
|
816
|
+
});
|
|
817
|
+
return null;
|
|
818
|
+
} catch (error) {
|
|
819
|
+
return `Failed to restore caller checkout to ${snapshot.branch} before sprint status sync: ${error instanceof Error ? error.message : String(error)}`;
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
function buildFailedExecutionResult(summary) {
|
|
823
|
+
return {
|
|
824
|
+
workflowId: "preflight-failed",
|
|
825
|
+
workflowName: summary.workflowName,
|
|
826
|
+
stageCount: summary.stageCount,
|
|
827
|
+
plannedStageCount: summary.plannedStageCount,
|
|
828
|
+
success: false,
|
|
829
|
+
degraded: false,
|
|
830
|
+
stageResults: [],
|
|
831
|
+
totalCost: 0,
|
|
832
|
+
totalDuration: 0,
|
|
833
|
+
budgetSummary: "Preflight failed before execution",
|
|
834
|
+
errors: summary.errors,
|
|
835
|
+
warnings: summary.warnings
|
|
836
|
+
};
|
|
837
|
+
}
|
|
838
|
+
async function enforceExecutionPolicyStamp(config, logger) {
|
|
839
|
+
let workflow;
|
|
840
|
+
try {
|
|
841
|
+
const executor = new WorkflowExecutor();
|
|
842
|
+
workflow = await executor.loadWorkflow(config.yamlPath);
|
|
843
|
+
} catch (error) {
|
|
844
|
+
return {
|
|
845
|
+
passed: false,
|
|
846
|
+
error: `Unable to validate the execution-policy workflow: ${error instanceof Error ? error.message : String(error)}`
|
|
847
|
+
};
|
|
848
|
+
}
|
|
849
|
+
const stamp = workflow.metadata?.executionPolicy;
|
|
850
|
+
if (stamp !== void 0) {
|
|
851
|
+
if (isCurrentExecutionPolicyWorkflow(workflow)) return { passed: true };
|
|
852
|
+
return {
|
|
853
|
+
passed: false,
|
|
854
|
+
error: `Refusing to execute a generated workflow with a stale or malformed execution-policy stamp (${describeExecutionPolicyStampMismatch(stamp, workflow)}). Regenerate the workflow through the current Build version.`
|
|
855
|
+
};
|
|
856
|
+
}
|
|
857
|
+
if (config.allowUnstampedWorkflow === true) {
|
|
858
|
+
logger.log(chalk2.yellow("running hand-authored workflow without execution policy"));
|
|
859
|
+
return { passed: true };
|
|
860
|
+
}
|
|
861
|
+
if (!workflowHasTaskExecutionStages(workflow)) {
|
|
862
|
+
return { passed: true };
|
|
863
|
+
}
|
|
864
|
+
if (config.reviewPolicy === "off") {
|
|
865
|
+
return { passed: true };
|
|
866
|
+
}
|
|
867
|
+
let dormantMismatch;
|
|
868
|
+
if (workflow.metadata?.executionPolicyDormant !== void 0) {
|
|
869
|
+
try {
|
|
870
|
+
dormantMismatch = describeDormantPolicyMismatch(workflow, {
|
|
871
|
+
cwd: process.cwd(),
|
|
872
|
+
reviewPolicy: config.reviewPolicy
|
|
873
|
+
});
|
|
874
|
+
} catch (error) {
|
|
875
|
+
dormantMismatch = `it could not be evaluated: ${error instanceof Error ? error.message : String(error)}`;
|
|
876
|
+
}
|
|
877
|
+
if (dormantMismatch === void 0) return { passed: true };
|
|
878
|
+
}
|
|
879
|
+
let gate = "off";
|
|
880
|
+
try {
|
|
881
|
+
const roles = resolveTaskExecutionRoles(workflow, {
|
|
882
|
+
cwd: process.cwd(),
|
|
883
|
+
reviewPolicy: config.reviewPolicy
|
|
884
|
+
});
|
|
885
|
+
if (roles.reviewer.gate.value === "off" || !isExecutionPolicyEngaged(roles) && dormantMismatch === void 0) {
|
|
886
|
+
return { passed: true };
|
|
887
|
+
}
|
|
888
|
+
gate = roles.reviewer.gate.value;
|
|
889
|
+
} catch (error) {
|
|
890
|
+
return {
|
|
891
|
+
passed: false,
|
|
892
|
+
error: `Refusing to execute with invalid role configuration: ${error instanceof Error ? error.message : String(error)}`
|
|
893
|
+
};
|
|
894
|
+
}
|
|
895
|
+
return {
|
|
896
|
+
passed: false,
|
|
897
|
+
error: `Refusing to execute an unstamped generated workflow: it contains task-execution stages but is missing the execution-policy stamp while the reviewer gate is '${gate}'. Regenerate the workflow through \`build plan sprint run\` / \`build plan approve --to-sprint\` (which apply the execution policy), set \`roles.reviewer.gate = off\` to disable review, or pass the explicit escape hatch for hand-authored/resumed workflows.` + (dormantMismatch ? ` The workflow's recorded dormant policy no longer applies: ${dormantMismatch}.` : "")
|
|
898
|
+
};
|
|
899
|
+
}
|
|
900
|
+
function workflowHasTaskExecutionStages(workflow) {
|
|
901
|
+
const isExec = (type) => (type ?? "standard") === "standard" || type === "competition";
|
|
902
|
+
for (const stage of workflow.stages) {
|
|
903
|
+
if (stage.type === "orchestrator" && stage.seededPlan) {
|
|
904
|
+
if (stage.seededPlan.subStages.some((sub) => isExec(sub.type))) return true;
|
|
905
|
+
continue;
|
|
906
|
+
}
|
|
907
|
+
if (isExec(stage.type)) return true;
|
|
908
|
+
}
|
|
909
|
+
return false;
|
|
910
|
+
}
|
|
911
|
+
async function runSprintWorkflowPreflight(config) {
|
|
912
|
+
const { runExecutionPreflight, formatExecutionPreflightWarning } = await import("./execution-preflight-DASJWWQF.js");
|
|
913
|
+
const preflightWarning = formatExecutionPreflightWarning(
|
|
914
|
+
await runExecutionPreflight({ verbose: config.verbose })
|
|
915
|
+
);
|
|
916
|
+
if (preflightWarning) console.warn(preflightWarning);
|
|
917
|
+
const executor = new WorkflowExecutor();
|
|
918
|
+
try {
|
|
919
|
+
const workflow = await executor.loadWorkflow(config.yamlPath);
|
|
920
|
+
const workflowName = workflow.name ?? "Unnamed Workflow";
|
|
921
|
+
const stageCount = workflow.stages.length;
|
|
922
|
+
const projectRoot = findRepoRoot();
|
|
923
|
+
const worktreeRoot = config.preflight?.worktreeHygiene?.baseDir ?? getWorktreeBaseDir();
|
|
924
|
+
const preflight = await runWorkflowPreflight(workflow, {
|
|
925
|
+
authProbeEnv: { ...process.env, ...getExecutionContext().envOverrides },
|
|
926
|
+
...config.preflight ?? {},
|
|
927
|
+
verbose: config.verbose,
|
|
928
|
+
cwd: projectRoot,
|
|
929
|
+
worktreeHygiene: {
|
|
930
|
+
...config.preflight?.worktreeHygiene ?? {},
|
|
931
|
+
baseDir: worktreeRoot
|
|
932
|
+
}
|
|
933
|
+
});
|
|
934
|
+
return {
|
|
935
|
+
passed: preflight.passed,
|
|
936
|
+
workflowName,
|
|
937
|
+
stageCount,
|
|
938
|
+
plannedStageCount: stageCount,
|
|
939
|
+
warnings: [...filterResolvedManagedRepoCleanWarnings(preflight.warnings, void 0)],
|
|
940
|
+
errors: [...preflight.errors],
|
|
941
|
+
executionContext: {
|
|
942
|
+
projectRoot,
|
|
943
|
+
worktreeRoot,
|
|
944
|
+
preflight: { result: preflight, source: "caller" }
|
|
945
|
+
}
|
|
946
|
+
};
|
|
947
|
+
} catch (error) {
|
|
948
|
+
return {
|
|
949
|
+
passed: false,
|
|
950
|
+
workflowName: "Unnamed Workflow",
|
|
951
|
+
stageCount: 0,
|
|
952
|
+
plannedStageCount: 0,
|
|
953
|
+
warnings: [],
|
|
954
|
+
errors: [
|
|
955
|
+
`Preflight execution failed: ${error instanceof Error ? error.message : String(error)}`
|
|
956
|
+
]
|
|
957
|
+
};
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
async function loadGateMapFromWorkflowYaml(yamlPath) {
|
|
961
|
+
if (!yamlPath) return /* @__PURE__ */ new Map();
|
|
962
|
+
try {
|
|
963
|
+
const { default: yaml } = await import("js-yaml");
|
|
964
|
+
const parsed = yaml.load(await fs.readFile(yamlPath, "utf-8"));
|
|
965
|
+
if (!parsed || !Array.isArray(parsed.stages)) return /* @__PURE__ */ new Map();
|
|
966
|
+
return mapGateStagesToExecutionStages(parsed);
|
|
967
|
+
} catch {
|
|
968
|
+
return /* @__PURE__ */ new Map();
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
async function buildFallbackTaskTransitions(sprintId, stageResults, apply, stageToTaskMap, yamlPath) {
|
|
972
|
+
if (signalCoordinator.isShuttingDown) {
|
|
973
|
+
return [];
|
|
974
|
+
}
|
|
975
|
+
const gateToExecution = await loadGateMapFromWorkflowYaml(yamlPath);
|
|
976
|
+
const gateByExecution = new Map(
|
|
977
|
+
[...gateToExecution.entries()].map(([gateId, executionId]) => [executionId, gateId])
|
|
978
|
+
);
|
|
979
|
+
const targetStatus = resolveTaskStatusForStageOutcome({
|
|
980
|
+
kind: "stage-result",
|
|
981
|
+
validationPassed: true,
|
|
982
|
+
apply
|
|
983
|
+
});
|
|
984
|
+
if (!targetStatus) {
|
|
985
|
+
return [];
|
|
986
|
+
}
|
|
987
|
+
let sprintTasks;
|
|
988
|
+
try {
|
|
989
|
+
sprintTasks = await listTasksInSprint(sprintId);
|
|
990
|
+
} catch (error) {
|
|
991
|
+
if (signalCoordinator.isShuttingDown && isMissingSprintMetadataError(error)) {
|
|
992
|
+
return [];
|
|
993
|
+
}
|
|
994
|
+
throw error;
|
|
995
|
+
}
|
|
996
|
+
const sprintTaskIds = new Set(sprintTasks.map((task) => task.id));
|
|
997
|
+
const transitions = [];
|
|
998
|
+
const maybeTaskIdForStage = (stageId) => {
|
|
999
|
+
const mappedTaskId = stageToTaskMap?.get(stageId);
|
|
1000
|
+
if (mappedTaskId && sprintTaskIds.has(mappedTaskId)) return mappedTaskId;
|
|
1001
|
+
if (sprintTaskIds.has(stageId)) return stageId;
|
|
1002
|
+
return void 0;
|
|
1003
|
+
};
|
|
1004
|
+
const flattened = flattenStageResultEntries(stageResults);
|
|
1005
|
+
const passedStageIds = new Set(
|
|
1006
|
+
flattened.filter((result) => result.validationPassed === true).map((result) => result.stageId)
|
|
1007
|
+
);
|
|
1008
|
+
for (const stageResult of flattened) {
|
|
1009
|
+
const taskId = maybeTaskIdForStage(stageResult.stageId);
|
|
1010
|
+
if (!taskId || stageResult.validationPassed !== true) continue;
|
|
1011
|
+
const gateId = gateByExecution.get(stageResult.stageId);
|
|
1012
|
+
if (gateId && !passedStageIds.has(gateId)) continue;
|
|
1013
|
+
transitions.push({ taskId, targetStatus });
|
|
1014
|
+
}
|
|
1015
|
+
return Array.from(new Map(transitions.map((entry) => [entry.taskId, entry])).values());
|
|
1016
|
+
}
|
|
1017
|
+
function flattenStageResultEntries(stageResults) {
|
|
1018
|
+
const entries = [];
|
|
1019
|
+
const visit = (stageResult) => {
|
|
1020
|
+
entries.push({
|
|
1021
|
+
stageId: stageResult.stageId,
|
|
1022
|
+
validationPassed: stageResult.validationPassed === true
|
|
1023
|
+
});
|
|
1024
|
+
if (!isOrchestratorStageResult(stageResult)) return;
|
|
1025
|
+
for (const subStage of stageResult.subStageResults) {
|
|
1026
|
+
entries.push({
|
|
1027
|
+
stageId: subStage.spec.id,
|
|
1028
|
+
validationPassed: subStage.result.validationPassed === true
|
|
1029
|
+
});
|
|
1030
|
+
if (isOrchestratorStageResult(subStage.result)) {
|
|
1031
|
+
visit(subStage.result);
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
};
|
|
1035
|
+
for (const stageResult of stageResults) visit(stageResult);
|
|
1036
|
+
return entries;
|
|
1037
|
+
}
|
|
1038
|
+
function attachResultArtifactPath(transitions, resultArtifactPath) {
|
|
1039
|
+
if (transitions.length === 0) return transitions;
|
|
1040
|
+
return transitions.map((transition) => ({
|
|
1041
|
+
...transition,
|
|
1042
|
+
resultArtifactPath: transition.resultArtifactPath ?? resultArtifactPath
|
|
1043
|
+
}));
|
|
1044
|
+
}
|
|
1045
|
+
function isMissingSprintMetadataError(error) {
|
|
1046
|
+
const maybeCode = error?.code;
|
|
1047
|
+
if (maybeCode === "ENOENT") return true;
|
|
1048
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1049
|
+
const normalized = message.toLowerCase();
|
|
1050
|
+
return normalized.includes("no such file") || normalized.includes("not found");
|
|
1051
|
+
}
|
|
1052
|
+
var FAILED_APPLY_REVIEW_REASON = "Apply failed; task returned to review";
|
|
1053
|
+
async function reconcileTasksAfterFailedApply(stageResults, logger, stageToTaskMap) {
|
|
1054
|
+
let reconciledCount = 0;
|
|
1055
|
+
const seenTaskIds = /* @__PURE__ */ new Set();
|
|
1056
|
+
for (const stageResult of flattenStageResultEntries(stageResults)) {
|
|
1057
|
+
const taskId = stageToTaskMap?.get(stageResult.stageId) ?? stageResult.stageId;
|
|
1058
|
+
if (seenTaskIds.has(taskId)) continue;
|
|
1059
|
+
seenTaskIds.add(taskId);
|
|
1060
|
+
try {
|
|
1061
|
+
const { yaml: task } = await getTask(taskId);
|
|
1062
|
+
if (task.status === "done" || task.status === "in_progress") {
|
|
1063
|
+
await updateTaskStatus(taskId, "review");
|
|
1064
|
+
await applyTaskTransitionOutcome(taskId, {
|
|
1065
|
+
targetStatus: "review",
|
|
1066
|
+
reason: FAILED_APPLY_REVIEW_REASON
|
|
1067
|
+
});
|
|
1068
|
+
reconciledCount++;
|
|
1069
|
+
}
|
|
1070
|
+
} catch (error) {
|
|
1071
|
+
logger.log(
|
|
1072
|
+
chalk2.yellow(
|
|
1073
|
+
`Failed to reconcile task ${taskId} after merge failure: ${error instanceof Error ? error.message : String(error)}`
|
|
1074
|
+
)
|
|
1075
|
+
);
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
return reconciledCount;
|
|
1079
|
+
}
|
|
1080
|
+
async function executeSprintWorkflow(config, logger = console) {
|
|
1081
|
+
const integrationBranch = buildRunBranchName("sprint", config.workflowId);
|
|
1082
|
+
if (config.mergeOptions?.repairBiome !== void 0 || config.mergeOptions?.repairBiomeMaxIterations !== void 0 || config.mergeOptions?.repairBiomeTimeboxMs !== void 0) {
|
|
1083
|
+
logger.log(
|
|
1084
|
+
chalk2.yellow(
|
|
1085
|
+
"Warning: merge-time Biome repair options are deprecated and have no effect; repair runs before application."
|
|
1086
|
+
)
|
|
1087
|
+
);
|
|
1088
|
+
}
|
|
1089
|
+
const preflightSummary = await runSprintWorkflowPreflight(config);
|
|
1090
|
+
if (!preflightSummary.passed) {
|
|
1091
|
+
return {
|
|
1092
|
+
status: "error",
|
|
1093
|
+
executionResult: buildFailedExecutionResult(preflightSummary)
|
|
1094
|
+
};
|
|
1095
|
+
}
|
|
1096
|
+
const invariant = await enforceExecutionPolicyStamp(config, logger);
|
|
1097
|
+
if (!invariant.passed) {
|
|
1098
|
+
return {
|
|
1099
|
+
status: "error",
|
|
1100
|
+
executionResult: buildFailedExecutionResult({
|
|
1101
|
+
passed: false,
|
|
1102
|
+
workflowName: preflightSummary.workflowName,
|
|
1103
|
+
stageCount: preflightSummary.stageCount,
|
|
1104
|
+
plannedStageCount: preflightSummary.plannedStageCount,
|
|
1105
|
+
warnings: preflightSummary.warnings,
|
|
1106
|
+
errors: [invariant.error ?? "Execution policy stamp invariant failed"]
|
|
1107
|
+
})
|
|
1108
|
+
};
|
|
1109
|
+
}
|
|
1110
|
+
if (config.apply) {
|
|
1111
|
+
try {
|
|
1112
|
+
await activateSprint(config.sprintId);
|
|
1113
|
+
} catch (error) {
|
|
1114
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1115
|
+
let sprintIsActive = false;
|
|
1116
|
+
try {
|
|
1117
|
+
const currentSprint = await getCurrentSprint();
|
|
1118
|
+
sprintIsActive = currentSprint?.yaml?.id === config.sprintId && currentSprint.yaml.status === "active";
|
|
1119
|
+
} catch {
|
|
1120
|
+
}
|
|
1121
|
+
if (!sprintIsActive) {
|
|
1122
|
+
logger.error(
|
|
1123
|
+
chalk2.red(
|
|
1124
|
+
`[sprint-execution] WARN: activateSprint(${config.sprintId}) failed and sprint is not active \u2014 sprint status may be stale: ${message}`
|
|
1125
|
+
)
|
|
1126
|
+
);
|
|
1127
|
+
} else {
|
|
1128
|
+
logger.log(chalk2.yellow(`Failed to activate sprint ${config.sprintId}: ${message}`));
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
const lifecycleAwaitDrain = config.lifecycleAwaitDrain ?? config.lifecycleCallbacks?.awaitDrain;
|
|
1133
|
+
const awaitDrain = typeof lifecycleAwaitDrain === "function" ? lifecycleAwaitDrain : void 0;
|
|
1134
|
+
const callerCheckout = await captureCallerCheckoutSnapshot();
|
|
1135
|
+
let executionResult;
|
|
1136
|
+
try {
|
|
1137
|
+
executionResult = await executeWorkflowFile(config.yamlPath, {
|
|
1138
|
+
verbose: config.verbose,
|
|
1139
|
+
dryRun: false,
|
|
1140
|
+
allowMain: config.mergeOptions?.allowMain,
|
|
1141
|
+
allowProtected: config.mergeOptions?.allowProtected,
|
|
1142
|
+
currentBranch: config.applyTargetBranch,
|
|
1143
|
+
workflowId: config.workflowId,
|
|
1144
|
+
resumeWorkflowId: config.resumeWorkflowId,
|
|
1145
|
+
admittedResume: config.admittedResume,
|
|
1146
|
+
executionContext: preflightSummary.executionContext,
|
|
1147
|
+
preflight: {
|
|
1148
|
+
authProbeEnv: { ...process.env, ...getExecutionContext().envOverrides },
|
|
1149
|
+
...config.preflight ?? {},
|
|
1150
|
+
skip: {
|
|
1151
|
+
...config.preflight?.skip ?? {},
|
|
1152
|
+
repoClean: true
|
|
1153
|
+
}
|
|
1154
|
+
},
|
|
1155
|
+
skipPreflight: false,
|
|
1156
|
+
manifest: {
|
|
1157
|
+
sourceType: "sprint",
|
|
1158
|
+
sprintId: config.sprintId,
|
|
1159
|
+
taskIds: config.taskIds,
|
|
1160
|
+
generatedYamlPath: config.yamlPath,
|
|
1161
|
+
originalCommand: process.argv.slice(2),
|
|
1162
|
+
planArtifactPath: config.planArtifactPath
|
|
1163
|
+
},
|
|
1164
|
+
lifecycleCallbacks: config.lifecycleCallbacks,
|
|
1165
|
+
blockerAnswers: config.blockerAnswers,
|
|
1166
|
+
repairOnVerifyFailure: config.repairOnVerifyFailure,
|
|
1167
|
+
competitionPerVariantTimeoutMinutes: config.competitionPerVariantTimeoutMinutes,
|
|
1168
|
+
preserveFailedStageWork: config.mergeOptions?.keepArtifacts === true,
|
|
1169
|
+
keepWorkOnProviderFailure: config.keepWorkOnProviderFailure,
|
|
1170
|
+
onProviderOutput: config.onProviderOutput,
|
|
1171
|
+
signal: config.signal
|
|
1172
|
+
});
|
|
1173
|
+
} finally {
|
|
1174
|
+
if (typeof awaitDrain === "function") {
|
|
1175
|
+
await awaitDrain();
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
const callerCheckoutRestoreError = await restoreCallerCheckoutIfNeeded(callerCheckout);
|
|
1179
|
+
if (callerCheckoutRestoreError) {
|
|
1180
|
+
logger.error(chalk2.red(callerCheckoutRestoreError));
|
|
1181
|
+
return {
|
|
1182
|
+
status: "error",
|
|
1183
|
+
executionResult: {
|
|
1184
|
+
...executionResult,
|
|
1185
|
+
success: false,
|
|
1186
|
+
errors: [...executionResult.errors, callerCheckoutRestoreError]
|
|
1187
|
+
}
|
|
1188
|
+
};
|
|
1189
|
+
}
|
|
1190
|
+
if (preflightSummary.warnings.length > 0) {
|
|
1191
|
+
executionResult.warnings = [...preflightSummary.warnings, ...executionResult.warnings];
|
|
1192
|
+
}
|
|
1193
|
+
const effectiveVerificationPolicy = config.verificationPolicy ?? "blocking";
|
|
1194
|
+
executionResult.verificationPolicy = effectiveVerificationPolicy;
|
|
1195
|
+
const rawInjectedTransitions = config.recordedTransitions && config.recordedTransitions.size > 0 ? Array.from(config.recordedTransitions.values()) : await buildFallbackTaskTransitions(
|
|
1196
|
+
config.sprintId,
|
|
1197
|
+
executionResult.stageResults,
|
|
1198
|
+
config.apply,
|
|
1199
|
+
config.stageToTaskMap,
|
|
1200
|
+
config.yamlPath
|
|
1201
|
+
);
|
|
1202
|
+
const resultPath = getResultPath(config.workflowId);
|
|
1203
|
+
const resultArtifactPath = path2.relative(findRepoRoot(), resultPath) || resultPath;
|
|
1204
|
+
const injectedTransitions = config.mergeOptions?.keepArtifacts === true ? attachResultArtifactPath(rawInjectedTransitions, resultArtifactPath) : rawInjectedTransitions;
|
|
1205
|
+
if (injectedTransitions.length > 0) {
|
|
1206
|
+
executionResult.taskTransitions = injectedTransitions;
|
|
1207
|
+
if (executionResult.stageResults.length > 0) {
|
|
1208
|
+
const firstResult = executionResult.stageResults[0];
|
|
1209
|
+
if (firstResult) {
|
|
1210
|
+
firstResult.taskTransitions = injectedTransitions;
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
try {
|
|
1215
|
+
const tmpPath = `${resultPath}.tmp.${process.pid}.${Date.now()}`;
|
|
1216
|
+
await fs.writeFile(tmpPath, JSON.stringify(executionResult, null, 2), "utf-8");
|
|
1217
|
+
await fs.rename(tmpPath, resultPath);
|
|
1218
|
+
} catch (error) {
|
|
1219
|
+
logger.log(
|
|
1220
|
+
chalk2.yellow(
|
|
1221
|
+
`Failed to persist workflow result: ${error instanceof Error ? error.message : String(error)}`
|
|
1222
|
+
)
|
|
1223
|
+
);
|
|
1224
|
+
}
|
|
1225
|
+
let manifest;
|
|
1226
|
+
try {
|
|
1227
|
+
manifest = await updateManifest(config.workflowId, (currentManifest) => {
|
|
1228
|
+
currentManifest.verificationPolicy = effectiveVerificationPolicy;
|
|
1229
|
+
});
|
|
1230
|
+
} catch (error) {
|
|
1231
|
+
logger.log(
|
|
1232
|
+
chalk2.yellow(
|
|
1233
|
+
`Failed to persist workflow manifest policy for ${config.workflowId}: ${error instanceof Error ? error.message : String(error)}`
|
|
1234
|
+
)
|
|
1235
|
+
);
|
|
1236
|
+
manifest = await loadManifest(config.workflowId).catch((loadError) => {
|
|
1237
|
+
logger.log(
|
|
1238
|
+
chalk2.yellow(
|
|
1239
|
+
`Failed to load workflow manifest metadata for ${config.workflowId}: ${loadError instanceof Error ? loadError.message : String(loadError)}`
|
|
1240
|
+
)
|
|
1241
|
+
);
|
|
1242
|
+
return null;
|
|
1243
|
+
});
|
|
1244
|
+
}
|
|
1245
|
+
const reviewBaseSha = manifest?.baseSha ?? "HEAD";
|
|
1246
|
+
const reviewBranch = manifest?.integrationBranch ?? integrationBranch;
|
|
1247
|
+
if (!config.apply && executionResult.success && config.mergeOptions?.keepArtifacts === true && injectedTransitions.length > 0) {
|
|
1248
|
+
const syncResult = await applyTaskTransitions(config.sprintId, injectedTransitions, {
|
|
1249
|
+
promoteToDone: true
|
|
1250
|
+
});
|
|
1251
|
+
if (syncResult.tasksFailed > 0 || syncResult.tasksEphemeral > 0) {
|
|
1252
|
+
const message = `Task status sync failed after preserved no-apply run: ${syncResult.tasksFailed} failed, ${syncResult.tasksEphemeral} ephemeral`;
|
|
1253
|
+
logger.error(chalk2.red(message));
|
|
1254
|
+
return {
|
|
1255
|
+
status: "error",
|
|
1256
|
+
executionResult: {
|
|
1257
|
+
...executionResult,
|
|
1258
|
+
success: false,
|
|
1259
|
+
errors: [...executionResult.errors, message]
|
|
1260
|
+
},
|
|
1261
|
+
reviewBaseSha,
|
|
1262
|
+
reviewBranch
|
|
1263
|
+
};
|
|
1264
|
+
}
|
|
1265
|
+
} else if (!config.apply && executionResult.success) {
|
|
1266
|
+
logger.log(
|
|
1267
|
+
chalk2.yellow(
|
|
1268
|
+
"Warning: --no-apply completed without --keep-artifacts; task status and result artifact provenance were not synced."
|
|
1269
|
+
)
|
|
1270
|
+
);
|
|
1271
|
+
}
|
|
1272
|
+
if (config.apply && executionResult.success) {
|
|
1273
|
+
if (config.mergeOptions?.noRepairOnFindings) {
|
|
1274
|
+
const failingStages = executionResult.stageResults.filter(
|
|
1275
|
+
(r) => r.validationPassed === false
|
|
1276
|
+
);
|
|
1277
|
+
if (failingStages.length > 0) {
|
|
1278
|
+
logger.error(chalk2.red("\nVerification failures detected"));
|
|
1279
|
+
logger.log(chalk2.red("--no-repair-on-findings is set. Blocking --apply."));
|
|
1280
|
+
await persistExecutionTelemetryIfConfigured({
|
|
1281
|
+
config,
|
|
1282
|
+
executionResult: {
|
|
1283
|
+
...executionResult,
|
|
1284
|
+
success: false,
|
|
1285
|
+
errors: [
|
|
1286
|
+
...executionResult.errors,
|
|
1287
|
+
"--no-repair-on-findings blocked apply because verification failures were present."
|
|
1288
|
+
]
|
|
1289
|
+
},
|
|
1290
|
+
verificationPolicy: effectiveVerificationPolicy,
|
|
1291
|
+
logger
|
|
1292
|
+
});
|
|
1293
|
+
return {
|
|
1294
|
+
status: "error",
|
|
1295
|
+
executionResult,
|
|
1296
|
+
reviewBaseSha,
|
|
1297
|
+
reviewBranch
|
|
1298
|
+
};
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
await persistExecutionTelemetryIfConfigured({
|
|
1302
|
+
config,
|
|
1303
|
+
executionResult,
|
|
1304
|
+
verificationPolicy: effectiveVerificationPolicy,
|
|
1305
|
+
logger
|
|
1306
|
+
});
|
|
1307
|
+
const shouldCleanupAfterApply = config.mergeOptions?.cleanup === true || config.closeSprint && config.mergeOptions?.keepArtifacts !== true;
|
|
1308
|
+
const mergeResult = await mergeWorkflowResult({
|
|
1309
|
+
workflowId: config.workflowId,
|
|
1310
|
+
force: false,
|
|
1311
|
+
applyOnly: config.mergeOptions?.applyOnly,
|
|
1312
|
+
keepArtifacts: config.mergeOptions?.keepArtifacts,
|
|
1313
|
+
allowMain: config.mergeOptions?.allowMain,
|
|
1314
|
+
allowProtected: config.mergeOptions?.allowProtected,
|
|
1315
|
+
taskStatus: "apply",
|
|
1316
|
+
cleanup: shouldCleanupAfterApply
|
|
1317
|
+
});
|
|
1318
|
+
if (!mergeResult.success) {
|
|
1319
|
+
if (executionResult.success) {
|
|
1320
|
+
const reconciledCount = await reconcileTasksAfterFailedApply(
|
|
1321
|
+
executionResult.stageResults,
|
|
1322
|
+
logger,
|
|
1323
|
+
config.stageToTaskMap
|
|
1324
|
+
);
|
|
1325
|
+
if (reconciledCount > 0) {
|
|
1326
|
+
logger.log(
|
|
1327
|
+
chalk2.yellow(
|
|
1328
|
+
`Reconciled ${reconciledCount} task status(es) back to review after merge failure`
|
|
1329
|
+
)
|
|
1330
|
+
);
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
logger.error(chalk2.red("\nMerge failed"));
|
|
1334
|
+
if (mergeResult.error) {
|
|
1335
|
+
logger.log(chalk2.red(` ${mergeResult.error}`));
|
|
1336
|
+
}
|
|
1337
|
+
await persistExecutionTelemetryIfConfigured({
|
|
1338
|
+
config,
|
|
1339
|
+
executionResult: {
|
|
1340
|
+
...executionResult,
|
|
1341
|
+
success: false,
|
|
1342
|
+
errors: [
|
|
1343
|
+
...executionResult.errors,
|
|
1344
|
+
`Merge failed${mergeResult.error ? `: ${mergeResult.error}` : ""}`
|
|
1345
|
+
]
|
|
1346
|
+
},
|
|
1347
|
+
verificationPolicy: effectiveVerificationPolicy,
|
|
1348
|
+
logger
|
|
1349
|
+
});
|
|
1350
|
+
return {
|
|
1351
|
+
status: "error",
|
|
1352
|
+
executionResult,
|
|
1353
|
+
mergeResult,
|
|
1354
|
+
reviewBaseSha,
|
|
1355
|
+
reviewBranch
|
|
1356
|
+
};
|
|
1357
|
+
}
|
|
1358
|
+
logger.log(chalk2.green("Results merged into current branch"));
|
|
1359
|
+
if (mergeResult.postApplyError) {
|
|
1360
|
+
logger.log(chalk2.yellow(`Post-apply cleanup warning: ${mergeResult.postApplyError}`));
|
|
1361
|
+
}
|
|
1362
|
+
let distStale = false;
|
|
1363
|
+
const selfScope = resolveBuildSelfExecutionScope({ root: process.cwd() });
|
|
1364
|
+
if (selfScope.status === "pass") {
|
|
1365
|
+
try {
|
|
1366
|
+
const distIndex = path2.join(process.cwd(), "dist", "index.js");
|
|
1367
|
+
await import("fs/promises").then((fs2) => fs2.access(distIndex));
|
|
1368
|
+
const srcCheck = await execa(
|
|
1369
|
+
"find",
|
|
1370
|
+
["src", "-name", "*.ts", "-newer", distIndex, "-print", "-quit"],
|
|
1371
|
+
{ stdio: "pipe", timeout: 5e3, reject: false }
|
|
1372
|
+
);
|
|
1373
|
+
if (srcCheck.stdout?.trim()) {
|
|
1374
|
+
distStale = true;
|
|
1375
|
+
logger.log("");
|
|
1376
|
+
logger.log(chalk2.yellow("Source files are newer than dist/ \u2014 CLI may be stale"));
|
|
1377
|
+
logger.log(
|
|
1378
|
+
chalk2.dim(" Run `npm run build` to update the CLI after this command exits.")
|
|
1379
|
+
);
|
|
1380
|
+
}
|
|
1381
|
+
} catch {
|
|
1382
|
+
}
|
|
1383
|
+
}
|
|
1384
|
+
let closeout = { closed: false };
|
|
1385
|
+
if (config.closeSprint) {
|
|
1386
|
+
closeout = await closeSprintAfterApply(config, logger);
|
|
1387
|
+
}
|
|
1388
|
+
return {
|
|
1389
|
+
status: closeout.error ? "error" : "success",
|
|
1390
|
+
executionResult,
|
|
1391
|
+
mergeResult,
|
|
1392
|
+
sprintClosed: closeout.closed,
|
|
1393
|
+
reviewBaseSha,
|
|
1394
|
+
reviewBranch,
|
|
1395
|
+
distStale
|
|
1396
|
+
};
|
|
1397
|
+
}
|
|
1398
|
+
if (config.apply && !executionResult.success) {
|
|
1399
|
+
const reconciledCount = await reconcileTasksAfterFailedApply(
|
|
1400
|
+
executionResult.stageResults,
|
|
1401
|
+
logger,
|
|
1402
|
+
config.stageToTaskMap
|
|
1403
|
+
);
|
|
1404
|
+
if (reconciledCount > 0) {
|
|
1405
|
+
logger.log(
|
|
1406
|
+
chalk2.yellow(
|
|
1407
|
+
`Reconciled ${reconciledCount} task status(es) back to review after failed apply`
|
|
1408
|
+
)
|
|
1409
|
+
);
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
await persistExecutionTelemetryIfConfigured({
|
|
1413
|
+
config,
|
|
1414
|
+
executionResult,
|
|
1415
|
+
verificationPolicy: effectiveVerificationPolicy,
|
|
1416
|
+
logger
|
|
1417
|
+
});
|
|
1418
|
+
return {
|
|
1419
|
+
status: executionResult.success ? "success" : "error",
|
|
1420
|
+
executionResult,
|
|
1421
|
+
reviewBaseSha,
|
|
1422
|
+
reviewBranch
|
|
1423
|
+
};
|
|
1424
|
+
}
|
|
1425
|
+
function isOrchestratorStageResult(result) {
|
|
1426
|
+
return typeof result === "object" && result !== null && result.stageType === "orchestrator" && Array.isArray(result.subStageResults);
|
|
1427
|
+
}
|
|
1428
|
+
function buildSubStageTelemetry(result) {
|
|
1429
|
+
return {
|
|
1430
|
+
validationPassed: result.result.validationPassed,
|
|
1431
|
+
cost: result.result.cost,
|
|
1432
|
+
provider: result.result.provider,
|
|
1433
|
+
model: result.result.model,
|
|
1434
|
+
resolvedModel: result.result.resolvedModel,
|
|
1435
|
+
summary: result.result.summary,
|
|
1436
|
+
durationMs: result.result.durationMs,
|
|
1437
|
+
changedFilesCount: result.result.changedFilesCount ?? result.result.changedFiles?.length,
|
|
1438
|
+
changedFiles: result.result.changedFiles,
|
|
1439
|
+
completeness: result.result.completeness,
|
|
1440
|
+
completenessSource: result.result.completenessSource,
|
|
1441
|
+
verifyCommands: result.result.verifyCommands,
|
|
1442
|
+
requiredFiles: result.result.requiredFiles,
|
|
1443
|
+
missingRequiredFiles: result.result.missingRequiredFiles,
|
|
1444
|
+
untouchedRequiredFiles: result.result.untouchedRequiredFiles,
|
|
1445
|
+
intentionalNoOp: result.result.intentionalNoOp,
|
|
1446
|
+
warnings: result.result.warnings,
|
|
1447
|
+
recovery: result.result.recovery,
|
|
1448
|
+
provenance: result.result.provenance,
|
|
1449
|
+
modelSelectionSource: result.result.modelSelectionSource,
|
|
1450
|
+
...unverifiedStageField(result.result)
|
|
1451
|
+
};
|
|
1452
|
+
}
|
|
1453
|
+
function deriveExecutionExitReason(result) {
|
|
1454
|
+
if (result.success && result.degraded) {
|
|
1455
|
+
return "success-degraded";
|
|
1456
|
+
}
|
|
1457
|
+
if (result.success) {
|
|
1458
|
+
return "success";
|
|
1459
|
+
}
|
|
1460
|
+
if (result.errors.length > 0) {
|
|
1461
|
+
return result.errors[0] ?? "workflow-error";
|
|
1462
|
+
}
|
|
1463
|
+
if (result.stageResults.some((stage) => !stage.validationPassed)) {
|
|
1464
|
+
return "stage-validation-failed";
|
|
1465
|
+
}
|
|
1466
|
+
return "workflow-failed";
|
|
1467
|
+
}
|
|
1468
|
+
function deriveExecutionMetadata(payload, executionResult, updatedAt) {
|
|
1469
|
+
const stageExecutionDetails = executionResult.stageResults.flatMap((stage) => {
|
|
1470
|
+
if (isOrchestratorStageResult(stage)) {
|
|
1471
|
+
return stage.subStageResults.map((subStage) => ({
|
|
1472
|
+
provider: subStage.result.provider,
|
|
1473
|
+
model: subStage.result.model,
|
|
1474
|
+
resolvedModel: subStage.result.resolvedModel
|
|
1475
|
+
}));
|
|
1476
|
+
}
|
|
1477
|
+
return [
|
|
1478
|
+
{
|
|
1479
|
+
provider: stage.provider,
|
|
1480
|
+
model: stage.model,
|
|
1481
|
+
resolvedModel: stage.resolvedModel
|
|
1482
|
+
}
|
|
1483
|
+
];
|
|
1484
|
+
});
|
|
1485
|
+
const usedProviders = Array.from(
|
|
1486
|
+
new Set(
|
|
1487
|
+
stageExecutionDetails.map((stage) => stage.provider).filter(
|
|
1488
|
+
(provider) => typeof provider === "string" && provider.length > 0
|
|
1489
|
+
)
|
|
1490
|
+
)
|
|
1491
|
+
);
|
|
1492
|
+
const resolvedModels = Array.from(
|
|
1493
|
+
new Set(
|
|
1494
|
+
stageExecutionDetails.map((stage) => stage.resolvedModel).filter((model) => typeof model === "string" && model.length > 0)
|
|
1495
|
+
)
|
|
1496
|
+
);
|
|
1497
|
+
const usedModels = Array.from(
|
|
1498
|
+
new Set(
|
|
1499
|
+
stageExecutionDetails.map((stage) => stage.resolvedModel ?? stage.model).filter((model) => typeof model === "string" && model.length > 0)
|
|
1500
|
+
)
|
|
1501
|
+
);
|
|
1502
|
+
return {
|
|
1503
|
+
provider: payload.executionDefaults.provider,
|
|
1504
|
+
resolvedModel: (resolvedModels.length === 1 ? resolvedModels[0] : void 0) || payload.executionDefaults.model || (usedModels.length === 1 ? usedModels[0] : void 0) || payload.orchestratorConfig.orchestrationModel || void 0,
|
|
1505
|
+
usedProviders: usedProviders.length > 0 ? usedProviders : void 0,
|
|
1506
|
+
usedModels: usedModels.length > 0 ? usedModels : void 0,
|
|
1507
|
+
durationMs: executionResult.totalDuration,
|
|
1508
|
+
totalCost: executionResult.totalCost,
|
|
1509
|
+
success: executionResult.success,
|
|
1510
|
+
exitReason: deriveExecutionExitReason(executionResult),
|
|
1511
|
+
warnings: executionResult.warnings.length > 0 ? executionResult.warnings : void 0,
|
|
1512
|
+
errors: executionResult.errors.length > 0 ? executionResult.errors : void 0,
|
|
1513
|
+
updatedAt
|
|
1514
|
+
};
|
|
1515
|
+
}
|
|
1516
|
+
function recordPlanExecutionHistory(params) {
|
|
1517
|
+
const provider = params.payload.orchestratorConfig.orchestrationProvider?.trim() || params.payload.executionDefaults.provider?.trim();
|
|
1518
|
+
const estimatedDurationMs = params.payload.plan.estimatedDurationMs;
|
|
1519
|
+
const actualDurationMs = params.executionResult.totalDuration;
|
|
1520
|
+
if (!provider || estimatedDurationMs <= 0 || actualDurationMs <= 0) {
|
|
1521
|
+
return;
|
|
1522
|
+
}
|
|
1523
|
+
const stageRetryCount = params.orchestratorResult?.subStageResults.reduce(
|
|
1524
|
+
(sum, subStageResult) => sum + (subStageResult.result.recovery?.retryBudgetUsed ?? 0) + (subStageResult.result.recovery?.infrastructureRetryBudgetUsed ?? 0),
|
|
1525
|
+
0
|
|
1526
|
+
) ?? 0;
|
|
1527
|
+
const retryCount = stageRetryCount + (params.orchestratorResult?.replanningAttempts ?? 0);
|
|
1528
|
+
const isCompetitive = params.payload.plan.subStages.some(
|
|
1529
|
+
(subStage) => subStage.type === "competition"
|
|
1530
|
+
);
|
|
1531
|
+
const model = params.payload.executionDefaults.model?.trim() || params.payload.orchestratorConfig.orchestrationModel?.trim() || void 0;
|
|
1532
|
+
recordExecution({
|
|
1533
|
+
provider,
|
|
1534
|
+
model,
|
|
1535
|
+
executionMode: "orchestrator",
|
|
1536
|
+
parallelism: params.payload.plan.subStages.length,
|
|
1537
|
+
outcome: deriveSprintOutcome(params.executionResult),
|
|
1538
|
+
estimatorVersion: RUNTIME_ESTIMATOR_VERSION,
|
|
1539
|
+
expectedRuntimeMs: estimatedDurationMs,
|
|
1540
|
+
stageCount: params.payload.plan.subStages.length,
|
|
1541
|
+
retryCount,
|
|
1542
|
+
isCompetitive,
|
|
1543
|
+
actualDurationMs,
|
|
1544
|
+
estimatedDurationMs,
|
|
1545
|
+
completedAt: Date.now()
|
|
1546
|
+
});
|
|
1547
|
+
}
|
|
1548
|
+
function deriveSprintOutcome(executionResult) {
|
|
1549
|
+
if (!executionResult.success) return "failed";
|
|
1550
|
+
return executionResult.degraded ? "degraded" : "success";
|
|
1551
|
+
}
|
|
1552
|
+
async function persistExecutionTelemetryIfConfigured(params) {
|
|
1553
|
+
if (!params.config.planArtifactPath) {
|
|
1554
|
+
return;
|
|
1555
|
+
}
|
|
1556
|
+
await persistPlanExecutionTelemetry({
|
|
1557
|
+
planArtifactPath: params.config.planArtifactPath,
|
|
1558
|
+
workflowId: params.config.workflowId,
|
|
1559
|
+
sprintId: params.config.sprintId,
|
|
1560
|
+
executionResult: params.executionResult,
|
|
1561
|
+
verificationPolicy: params.verificationPolicy,
|
|
1562
|
+
logger: params.logger
|
|
1563
|
+
});
|
|
1564
|
+
}
|
|
1565
|
+
async function persistPlanExecutionTelemetry(params) {
|
|
1566
|
+
try {
|
|
1567
|
+
const rootDir = findRepoRoot();
|
|
1568
|
+
await withPlanningLock(rootDir, async () => {
|
|
1569
|
+
const absolutePath = path2.resolve(rootDir, params.planArtifactPath);
|
|
1570
|
+
const raw = await fs.readFile(absolutePath, "utf-8");
|
|
1571
|
+
const envelope = parsePlanArtifactEnvelope(JSON.parse(raw));
|
|
1572
|
+
const payload = parseDecompositionPlanArtifactPayload(envelope.payload);
|
|
1573
|
+
const updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
1574
|
+
const orchestratorResult = params.executionResult.stageResults.find(isOrchestratorStageResult);
|
|
1575
|
+
if (orchestratorResult) {
|
|
1576
|
+
const subStageTelemetryById = new Map(
|
|
1577
|
+
orchestratorResult.subStageResults.map((subStageResult) => [
|
|
1578
|
+
subStageResult.spec.id,
|
|
1579
|
+
buildSubStageTelemetry(subStageResult)
|
|
1580
|
+
])
|
|
1581
|
+
);
|
|
1582
|
+
payload.plan.subStages = payload.plan.subStages.map((subStage) => {
|
|
1583
|
+
const telemetry = subStageTelemetryById.get(subStage.id);
|
|
1584
|
+
if (!telemetry) {
|
|
1585
|
+
return subStage;
|
|
1586
|
+
}
|
|
1587
|
+
return {
|
|
1588
|
+
...subStage,
|
|
1589
|
+
actualCost: telemetry.cost,
|
|
1590
|
+
actualDurationMs: telemetry.durationMs,
|
|
1591
|
+
result: telemetry
|
|
1592
|
+
};
|
|
1593
|
+
});
|
|
1594
|
+
payload.plan.executionSummary = {
|
|
1595
|
+
workflowId: params.workflowId,
|
|
1596
|
+
sprintId: params.sprintId,
|
|
1597
|
+
updatedAt,
|
|
1598
|
+
validationPassed: orchestratorResult.validationPassed,
|
|
1599
|
+
verificationPolicy: params.verificationPolicy,
|
|
1600
|
+
successfulSubStages: orchestratorResult.successfulSubStages,
|
|
1601
|
+
...unverifiedCountField(orchestratorResult.subStageResults.map((sub) => sub.result)),
|
|
1602
|
+
totalSubStages: orchestratorResult.totalSubStages,
|
|
1603
|
+
orchestrationCost: orchestratorResult.orchestrationCost,
|
|
1604
|
+
totalCostWithOrchestration: orchestratorResult.totalCostWithOrchestration,
|
|
1605
|
+
replanningTriggered: orchestratorResult.replanningTriggered,
|
|
1606
|
+
replanningAttempts: orchestratorResult.replanningAttempts,
|
|
1607
|
+
zeroOutput: orchestratorResult.zeroOutput,
|
|
1608
|
+
recovery: orchestratorResult.recovery
|
|
1609
|
+
};
|
|
1610
|
+
} else {
|
|
1611
|
+
const stageResultById = new Map(
|
|
1612
|
+
params.executionResult.stageResults.map((sr) => [sr.stageId, sr])
|
|
1613
|
+
);
|
|
1614
|
+
payload.plan.subStages = payload.plan.subStages.map((subStage) => {
|
|
1615
|
+
const sr = stageResultById.get(subStage.id);
|
|
1616
|
+
if (!sr) {
|
|
1617
|
+
return subStage;
|
|
1618
|
+
}
|
|
1619
|
+
const telemetry = buildSubStageTelemetry({ result: sr });
|
|
1620
|
+
return {
|
|
1621
|
+
...subStage,
|
|
1622
|
+
actualCost: sr.cost,
|
|
1623
|
+
actualDurationMs: sr.durationMs,
|
|
1624
|
+
result: telemetry
|
|
1625
|
+
};
|
|
1626
|
+
});
|
|
1627
|
+
const stageResults = params.executionResult.stageResults;
|
|
1628
|
+
const successCount = stageResults.filter((r) => r.validationPassed).length;
|
|
1629
|
+
const totalCost = stageResults.reduce((sum, r) => sum + r.cost, 0);
|
|
1630
|
+
payload.plan.executionSummary = {
|
|
1631
|
+
workflowId: params.workflowId,
|
|
1632
|
+
sprintId: params.sprintId,
|
|
1633
|
+
updatedAt,
|
|
1634
|
+
validationPassed: params.executionResult.success,
|
|
1635
|
+
verificationPolicy: params.verificationPolicy,
|
|
1636
|
+
successfulSubStages: successCount,
|
|
1637
|
+
...unverifiedCountField(stageResults),
|
|
1638
|
+
totalSubStages: stageResults.length,
|
|
1639
|
+
orchestrationCost: 0,
|
|
1640
|
+
totalCostWithOrchestration: totalCost
|
|
1641
|
+
};
|
|
1642
|
+
}
|
|
1643
|
+
payload.executionMetadata = deriveExecutionMetadata(
|
|
1644
|
+
payload,
|
|
1645
|
+
params.executionResult,
|
|
1646
|
+
updatedAt
|
|
1647
|
+
);
|
|
1648
|
+
const tmpPath = `${absolutePath}.tmp-${process.pid}-${Date.now()}`;
|
|
1649
|
+
await fs.writeFile(
|
|
1650
|
+
tmpPath,
|
|
1651
|
+
JSON.stringify(
|
|
1652
|
+
{
|
|
1653
|
+
...envelope,
|
|
1654
|
+
payload
|
|
1655
|
+
},
|
|
1656
|
+
null,
|
|
1657
|
+
2
|
|
1658
|
+
),
|
|
1659
|
+
"utf-8"
|
|
1660
|
+
);
|
|
1661
|
+
await fs.rename(tmpPath, absolutePath);
|
|
1662
|
+
try {
|
|
1663
|
+
recordPlanExecutionHistory({
|
|
1664
|
+
payload,
|
|
1665
|
+
executionResult: params.executionResult,
|
|
1666
|
+
orchestratorResult
|
|
1667
|
+
});
|
|
1668
|
+
} catch {
|
|
1669
|
+
}
|
|
1670
|
+
});
|
|
1671
|
+
} catch (error) {
|
|
1672
|
+
params.logger.log(
|
|
1673
|
+
chalk2.yellow(
|
|
1674
|
+
`Failed to persist plan execution telemetry: ${error instanceof Error ? error.message : String(error)}`
|
|
1675
|
+
)
|
|
1676
|
+
);
|
|
1677
|
+
}
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1680
|
+
export {
|
|
1681
|
+
goalGapId,
|
|
1682
|
+
PRIOR_ATTEMPTS_RETAINED,
|
|
1683
|
+
truncatePriorAttempts,
|
|
1684
|
+
structureLegacyGaps,
|
|
1685
|
+
removeDuplicateVerifyGaps,
|
|
1686
|
+
removeDuplicateVerifyReasons,
|
|
1687
|
+
blockingGapsUnsatisfied,
|
|
1688
|
+
downgradeGapsToAdvisory,
|
|
1689
|
+
capDiff,
|
|
1690
|
+
verifyResultToGateCheck,
|
|
1691
|
+
toDecompositionPlanArtifactPayload,
|
|
1692
|
+
parseDecompositionPlanArtifactPayload,
|
|
1693
|
+
enforceExecutionPolicyStamp,
|
|
1694
|
+
workflowHasTaskExecutionStages,
|
|
1695
|
+
executeSprintWorkflow
|
|
1696
|
+
};
|
|
1697
|
+
//# sourceMappingURL=chunk-FYMRVUNZ.js.map
|