@poetic-ai/poetic 1.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/SECURITY.md +47 -0
- package/.nvmrc +1 -0
- package/.poetic/README.md +37 -0
- package/.poetic/providers/catalog.json +12051 -0
- package/.poetic/providers/pricing.json +1272 -0
- package/.poetic/providers/registry.json +3369 -0
- package/CHANGELOG.md +552 -0
- package/CODE_OF_CONDUCT.md +40 -0
- package/CONTRIBUTING.md +23 -0
- package/INSTALL.md +454 -0
- package/LICENSE +21 -0
- package/README.md +474 -0
- package/dist/BasicOptimizationCompetitionRunner-5H5TBYO4.js +153 -0
- package/dist/ExecutionTracker-UVONC4C6.js +16 -0
- package/dist/OptimizationConfig-7DFY2TST.js +17 -0
- package/dist/OptimizationEngine-JIMGP3LY.js +1597 -0
- package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
- package/dist/actions-LUJPINLJ.js +322 -0
- package/dist/agent-ingest-3DJUJ7FU.js +53 -0
- package/dist/aggregator-DNCBINFO.js +12 -0
- package/dist/ai-judge-5QT5QJVU.js +156 -0
- package/dist/allowlist-grounding-RO6HKUFI.js +16 -0
- package/dist/allowlist-utils-23V7TJ3G.js +28 -0
- package/dist/anchored-turn-service-JULUCUIK.js +489 -0
- package/dist/api-transport-4TYTNLTJ.js +1087 -0
- package/dist/apply-completion-mode-AW2MOS3R.js +89 -0
- package/dist/artifact-migrator-23L45ISD.js +267 -0
- package/dist/ask-HWVV6QFR.js +135 -0
- package/dist/auth-5KEDKAPP.js +67 -0
- package/dist/auth-7TT3JINV.js +78 -0
- package/dist/auth-E6XUNZ5M.js +68 -0
- package/dist/auth-H3XDZE22.js +134 -0
- package/dist/auth-OC4E6633.js +71 -0
- package/dist/auth-S4CTX4GQ.js +44 -0
- package/dist/auth-YLH3S7EY.js +69 -0
- package/dist/auth-liveness-TDDEZY3T.js +46 -0
- package/dist/auto-optimizer-VPRWOWGU.js +80 -0
- package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
- package/dist/autoloop-evidence-gates-PCDALGVJ.js +38 -0
- package/dist/autoloop-gate-policy-Z7FVJVXV.js +175 -0
- package/dist/autoloop-helpers-2KTK43GL.js +22 -0
- package/dist/autoloop-ledger-W7QO62PX.js +96 -0
- package/dist/autoloop-ledger-subscriber-Z5RW5EIE.js +162 -0
- package/dist/autoloop-run-defaults-FERGRZGP.js +19 -0
- package/dist/autoloop-run-lock-CT2NWSV3.js +197 -0
- package/dist/autoloop-success-J2VKKBXQ.js +85 -0
- package/dist/autoloop-termination-summary-RN75F422.js +58 -0
- package/dist/autoloop-trajectory-XFIEXP5Z.js +282 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/autonomous-loop-controller-PW4XVFGQ.js +4120 -0
- package/dist/backend-P3DAYRP7.js +29 -0
- package/dist/background-executor-CBN552V4.js +257 -0
- package/dist/backlog-execution-intent-U4XYPTV6.js +15 -0
- package/dist/backup-active-store-5WXG6SXT.js +17 -0
- package/dist/backup-telemetry-db-XGLXAA3N.js +254 -0
- package/dist/basic-competition-master-VCSBJVRN.js +344 -0
- package/dist/branch-archive-manager-RP6FP3ZC.js +254 -0
- package/dist/branch-cleanup-manager-RSHAI7YR.js +20 -0
- package/dist/build-gate-YHGRB4QB.js +71 -0
- package/dist/change-summary-WY7J5TOX.js +33 -0
- package/dist/chunk-23A26CSN.js +123 -0
- package/dist/chunk-27UTJD3M.js +265 -0
- package/dist/chunk-2A5CILN3.js +310 -0
- package/dist/chunk-2AQUWJPW.js +225 -0
- package/dist/chunk-2BZ53J6J.js +2344 -0
- package/dist/chunk-2DY5KNVM.js +276 -0
- package/dist/chunk-2EIA4RBE.js +659 -0
- package/dist/chunk-2IUXIGQD.js +1064 -0
- package/dist/chunk-2N42MS2Z.js +2193 -0
- package/dist/chunk-2QJ3H3L7.js +42 -0
- package/dist/chunk-2QLYTVYX.js +791 -0
- package/dist/chunk-2VSQMRCB.js +18 -0
- package/dist/chunk-2XQXYBM2.js +130 -0
- package/dist/chunk-2YFUIER7.js +426 -0
- package/dist/chunk-34CNP2HB.js +148 -0
- package/dist/chunk-35P3W3JX.js +456 -0
- package/dist/chunk-36PEBZAF.js +18 -0
- package/dist/chunk-3AOKYKA7.js +22 -0
- package/dist/chunk-3BCUNHKF.js +475 -0
- package/dist/chunk-3FLXLLB7.js +26 -0
- package/dist/chunk-3FOZ2VHV.js +100 -0
- package/dist/chunk-3G6FZCRF.js +106 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3S62LLWJ.js +543 -0
- package/dist/chunk-3ZPQLGV7.js +2904 -0
- package/dist/chunk-44N5WZZH.js +45 -0
- package/dist/chunk-45FPSA3B.js +125 -0
- package/dist/chunk-4BJ3O4RQ.js +929 -0
- package/dist/chunk-4BOP7T6L.js +2321 -0
- package/dist/chunk-4BTDUT2S.js +42 -0
- package/dist/chunk-4CSS7WVI.js +143 -0
- package/dist/chunk-4CUY7AFY.js +247 -0
- package/dist/chunk-4GSN5O5J.js +62 -0
- package/dist/chunk-4HN6DF7V.js +1027 -0
- package/dist/chunk-4IAPOG5V.js +415 -0
- package/dist/chunk-4IYIZQWV.js +48 -0
- package/dist/chunk-4NXPXE62.js +84 -0
- package/dist/chunk-4RCCF5BR.js +712 -0
- package/dist/chunk-4V7NAQ4R.js +19527 -0
- package/dist/chunk-4VJITV4P.js +445 -0
- package/dist/chunk-4YX7J6QL.js +1859 -0
- package/dist/chunk-527OBWQB.js +338 -0
- package/dist/chunk-5D4A7E3D.js +448 -0
- package/dist/chunk-5DLKYTQX.js +4003 -0
- package/dist/chunk-5EERLVZB.js +139 -0
- package/dist/chunk-5H72XE4H.js +256 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5LAMRH4X.js +969 -0
- package/dist/chunk-5LTN43AS.js +1972 -0
- package/dist/chunk-5RBHQYDB.js +2206 -0
- package/dist/chunk-5WCQRDRB.js +588 -0
- package/dist/chunk-5WRLK5KW.js +700 -0
- package/dist/chunk-5ZCXC23G.js +595 -0
- package/dist/chunk-6BM72ZMG.js +31 -0
- package/dist/chunk-6EDAJH2I.js +68 -0
- package/dist/chunk-6EQKFDBH.js +457 -0
- package/dist/chunk-6MFRHTRI.js +115 -0
- package/dist/chunk-6TZJRKNW.js +321 -0
- package/dist/chunk-6V7HGQFZ.js +20 -0
- package/dist/chunk-6VWVO2TU.js +3746 -0
- package/dist/chunk-6Y5TWI7H.js +146 -0
- package/dist/chunk-6Y5U7UFY.js +91 -0
- package/dist/chunk-6ZLAK3XG.js +14 -0
- package/dist/chunk-72XCRQED.js +34 -0
- package/dist/chunk-72YTZMAM.js +589 -0
- package/dist/chunk-73BBJOKA.js +263 -0
- package/dist/chunk-73NCTWKL.js +188 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7DHRDWFS.js +3104 -0
- package/dist/chunk-7DNSNKJV.js +78 -0
- package/dist/chunk-7FMJVYBS.js +307 -0
- package/dist/chunk-7GDRQBQC.js +419 -0
- package/dist/chunk-7GPCEFUV.js +270 -0
- package/dist/chunk-7IL4A2PP.js +948 -0
- package/dist/chunk-7MMLMXO6.js +3679 -0
- package/dist/chunk-7QCZSLBH.js +1 -0
- package/dist/chunk-7R2WLDOS.js +62 -0
- package/dist/chunk-7T7RUJI7.js +949 -0
- package/dist/chunk-A2WKSVX7.js +43 -0
- package/dist/chunk-A3YGID55.js +133 -0
- package/dist/chunk-A722DEVA.js +14 -0
- package/dist/chunk-ACDIT7OP.js +1376 -0
- package/dist/chunk-ACKIPAOJ.js +302 -0
- package/dist/chunk-APPNGGN7.js +365 -0
- package/dist/chunk-APV6MK5E.js +137 -0
- package/dist/chunk-ASEP3M2W.js +968 -0
- package/dist/chunk-AT4TNPWW.js +2931 -0
- package/dist/chunk-ATVKCSGT.js +250 -0
- package/dist/chunk-AURFMVCD.js +899 -0
- package/dist/chunk-AX6GWE7V.js +47 -0
- package/dist/chunk-AY5EWJPF.js +385 -0
- package/dist/chunk-BAV2HJXS.js +194 -0
- package/dist/chunk-BBHRN366.js +89 -0
- package/dist/chunk-BBPSTTPA.js +1004 -0
- package/dist/chunk-BDATUDDJ.js +992 -0
- package/dist/chunk-BKE5PG5L.js +20414 -0
- package/dist/chunk-BLPHWMDK.js +797 -0
- package/dist/chunk-BSE4R6XD.js +322 -0
- package/dist/chunk-BXGMAU4A.js +396 -0
- package/dist/chunk-BXI4NXL3.js +507 -0
- package/dist/chunk-BZU2O43F.js +1125 -0
- package/dist/chunk-C3L6YQ7P.js +147 -0
- package/dist/chunk-C57KJOUQ.js +121 -0
- package/dist/chunk-CCV7BPSY.js +118 -0
- package/dist/chunk-CD7ISXA4.js +826 -0
- package/dist/chunk-CE5OZBYY.js +21 -0
- package/dist/chunk-CFBIG37O.js +154 -0
- package/dist/chunk-CJC6GZ46.js +457 -0
- package/dist/chunk-CKCDGXIV.js +408 -0
- package/dist/chunk-CKNX3TTP.js +10338 -0
- package/dist/chunk-CLKSETWE.js +10 -0
- package/dist/chunk-CP7H3HSP.js +1552 -0
- package/dist/chunk-CPLEWXNZ.js +66 -0
- package/dist/chunk-CQM3A35X.js +844 -0
- package/dist/chunk-CS6P76D3.js +103 -0
- package/dist/chunk-CTLUBNCW.js +622 -0
- package/dist/chunk-CUSRN6RJ.js +632 -0
- package/dist/chunk-D5EP5D2W.js +26 -0
- package/dist/chunk-D5RYINO7.js +412 -0
- package/dist/chunk-DBFS4HMH.js +751 -0
- package/dist/chunk-DC4ZYMXJ.js +115 -0
- package/dist/chunk-DCBZP442.js +9243 -0
- package/dist/chunk-DCYF7EKG.js +26 -0
- package/dist/chunk-DDMAFNUK.js +5351 -0
- package/dist/chunk-DF5SLDE4.js +966 -0
- package/dist/chunk-DJFW7SMX.js +348 -0
- package/dist/chunk-DQFLLBJW.js +121 -0
- package/dist/chunk-DSFM56OA.js +1203 -0
- package/dist/chunk-DTY4APYV.js +218 -0
- package/dist/chunk-DXH5JBRS.js +437 -0
- package/dist/chunk-E3NTPHEO.js +194 -0
- package/dist/chunk-E74LUIID.js +302 -0
- package/dist/chunk-EI57M5BI.js +194 -0
- package/dist/chunk-EJ4ZAWLV.js +305 -0
- package/dist/chunk-EJGCZGUF.js +1483 -0
- package/dist/chunk-EK2U3YEG.js +486 -0
- package/dist/chunk-ELMFYNV7.js +109 -0
- package/dist/chunk-ENRGKNR5.js +25 -0
- package/dist/chunk-ETYDXCK7.js +679 -0
- package/dist/chunk-EYRH3W74.js +239 -0
- package/dist/chunk-F23DIWNN.js +1024 -0
- package/dist/chunk-F5JO7HAS.js +94 -0
- package/dist/chunk-F7ER6ANO.js +174 -0
- package/dist/chunk-FATUVIIN.js +374 -0
- package/dist/chunk-FC23CTXV.js +322 -0
- package/dist/chunk-FD4ERYEG.js +22 -0
- package/dist/chunk-FH7WOJAE.js +79 -0
- package/dist/chunk-FHOWVDF5.js +1342 -0
- package/dist/chunk-FKAUPHMR.js +96 -0
- package/dist/chunk-FONNFJXA.js +137 -0
- package/dist/chunk-FQ7FSZRW.js +75 -0
- package/dist/chunk-FRG57FPM.js +240 -0
- package/dist/chunk-FUVP64ER.js +31 -0
- package/dist/chunk-FYOILAN5.js +6818 -0
- package/dist/chunk-G35UYQ6Z.js +69 -0
- package/dist/chunk-G36W2T2S.js +1143 -0
- package/dist/chunk-G3L2L5XZ.js +49 -0
- package/dist/chunk-G4THLFV3.js +148 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GFGYB2ZU.js +1689 -0
- package/dist/chunk-GG6KJYW6.js +85 -0
- package/dist/chunk-GHHFDU2U.js +55 -0
- package/dist/chunk-GHTZSQB7.js +57 -0
- package/dist/chunk-GK37ILCX.js +1231 -0
- package/dist/chunk-GKN3HMN4.js +2809 -0
- package/dist/chunk-GNVDBVJP.js +156 -0
- package/dist/chunk-GPEL3FBM.js +924 -0
- package/dist/chunk-GPSNGPZS.js +1604 -0
- package/dist/chunk-GSGD5E4C.js +30 -0
- package/dist/chunk-GSUQJJXQ.js +331 -0
- package/dist/chunk-GSV226X6.js +110 -0
- package/dist/chunk-H2AYQIHW.js +224 -0
- package/dist/chunk-H66DXFS5.js +1374 -0
- package/dist/chunk-H6G7QRMQ.js +35 -0
- package/dist/chunk-H7JAGHZT.js +59 -0
- package/dist/chunk-H7ZEFECA.js +316 -0
- package/dist/chunk-HAC6EHZZ.js +79 -0
- package/dist/chunk-HIO33P3G.js +19 -0
- package/dist/chunk-HMVQIPH3.js +547 -0
- package/dist/chunk-HOYBYAOA.js +257 -0
- package/dist/chunk-HX5P3CSP.js +1784 -0
- package/dist/chunk-I46EG2XQ.js +65 -0
- package/dist/chunk-I4NPDSCB.js +279 -0
- package/dist/chunk-I5WRT7ZR.js +514 -0
- package/dist/chunk-IC7I6YIJ.js +301 -0
- package/dist/chunk-IDCSOZVN.js +78 -0
- package/dist/chunk-IFCBYECK.js +112 -0
- package/dist/chunk-IFZCPEY2.js +66 -0
- package/dist/chunk-IKFP2KUR.js +48 -0
- package/dist/chunk-IRFBN336.js +878 -0
- package/dist/chunk-IUXNGKA6.js +152 -0
- package/dist/chunk-IV2RVAN7.js +1356 -0
- package/dist/chunk-IZYIQQ7X.js +53 -0
- package/dist/chunk-J3UUR7DE.js +210 -0
- package/dist/chunk-J54VUAY2.js +566 -0
- package/dist/chunk-J62KPGII.js +464 -0
- package/dist/chunk-J6P3FWWW.js +130 -0
- package/dist/chunk-JKBHJQMT.js +434 -0
- package/dist/chunk-JLS65NUQ.js +14 -0
- package/dist/chunk-JOSYEJKY.js +141 -0
- package/dist/chunk-JPKSXKNB.js +94 -0
- package/dist/chunk-JQNJB2BB.js +2440 -0
- package/dist/chunk-JRVNSWSQ.js +2626 -0
- package/dist/chunk-JSWMRQYG.js +28 -0
- package/dist/chunk-JZKNBBIB.js +152 -0
- package/dist/chunk-K54Y7MLK.js +160 -0
- package/dist/chunk-K65546RE.js +183 -0
- package/dist/chunk-KM3F7SYE.js +702 -0
- package/dist/chunk-KNDYMVWN.js +102 -0
- package/dist/chunk-KNT72VR6.js +132 -0
- package/dist/chunk-KP6YILMU.js +482 -0
- package/dist/chunk-KQEBSK3T.js +274 -0
- package/dist/chunk-KT6VHSPF.js +84 -0
- package/dist/chunk-KTMW65UX.js +14 -0
- package/dist/chunk-KZ5CJVBP.js +1813 -0
- package/dist/chunk-L4427KOE.js +26 -0
- package/dist/chunk-L6OM4A22.js +189 -0
- package/dist/chunk-L7E6XCRA.js +1042 -0
- package/dist/chunk-L7JZLXQL.js +173 -0
- package/dist/chunk-LAMKBTXX.js +40 -0
- package/dist/chunk-LDCF2MKN.js +132 -0
- package/dist/chunk-LEIIWPWQ.js +78 -0
- package/dist/chunk-LFTQVYBB.js +31 -0
- package/dist/chunk-LG3PDRTR.js +2872 -0
- package/dist/chunk-LGHII5ET.js +23 -0
- package/dist/chunk-LH5QY22X.js +1205 -0
- package/dist/chunk-LIVJ6266.js +438 -0
- package/dist/chunk-LKRAR3IH.js +276 -0
- package/dist/chunk-LO23NABI.js +3063 -0
- package/dist/chunk-LO3X5NLS.js +326 -0
- package/dist/chunk-LPITVM7M.js +339 -0
- package/dist/chunk-LR5IJIGV.js +810 -0
- package/dist/chunk-LRGMHROI.js +79 -0
- package/dist/chunk-LUVKFFWR.js +315 -0
- package/dist/chunk-LWCBNGH6.js +35 -0
- package/dist/chunk-LWTN3WRV.js +260 -0
- package/dist/chunk-M3HQYKQX.js +308 -0
- package/dist/chunk-M6GVSPEH.js +1016 -0
- package/dist/chunk-MF5HP6XV.js +221 -0
- package/dist/chunk-MHLCBZJB.js +328 -0
- package/dist/chunk-MN6PL4AN.js +120 -0
- package/dist/chunk-MOEY65Z6.js +5678 -0
- package/dist/chunk-MQ4WA34C.js +206 -0
- package/dist/chunk-MWHF5V7U.js +223 -0
- package/dist/chunk-MWHLBPNU.js +211 -0
- package/dist/chunk-MWK5UZQ3.js +1068 -0
- package/dist/chunk-MYLH2S4G.js +64 -0
- package/dist/chunk-MZ5WYKNA.js +28 -0
- package/dist/chunk-N4VTRA7K.js +131 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-N65O4XTH.js +5011 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NGK6PEOG.js +25 -0
- package/dist/chunk-NJVD4PWE.js +1033 -0
- package/dist/chunk-NM6PMYY4.js +768 -0
- package/dist/chunk-NN4PJDHP.js +708 -0
- package/dist/chunk-NP2V3L7K.js +226 -0
- package/dist/chunk-NRLY536M.js +260 -0
- package/dist/chunk-NRNE225N.js +1270 -0
- package/dist/chunk-NS2K2GTP.js +605 -0
- package/dist/chunk-NS33V3IM.js +51 -0
- package/dist/chunk-NSHASMZZ.js +71 -0
- package/dist/chunk-NWOYOA6H.js +378 -0
- package/dist/chunk-NWRUSEXG.js +322 -0
- package/dist/chunk-NZGDAWIP.js +1905 -0
- package/dist/chunk-O47UOKU3.js +395 -0
- package/dist/chunk-O4G2W3ST.js +9831 -0
- package/dist/chunk-O6V4PNLO.js +63 -0
- package/dist/chunk-OA4GPILI.js +624 -0
- package/dist/chunk-OGMSYL6J.js +227 -0
- package/dist/chunk-OIS7J26S.js +319 -0
- package/dist/chunk-OMX5VL43.js +79 -0
- package/dist/chunk-ON3G73BU.js +264 -0
- package/dist/chunk-OPYFYTWQ.js +220 -0
- package/dist/chunk-OQ6K46CK.js +1734 -0
- package/dist/chunk-OYZYO7TV.js +47 -0
- package/dist/chunk-OZ4REHIN.js +4386 -0
- package/dist/chunk-P47VN5F4.js +282 -0
- package/dist/chunk-P5I4X7A7.js +353 -0
- package/dist/chunk-P6VQROCO.js +594 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-PCAGC5MR.js +1763 -0
- package/dist/chunk-PFTQBXS6.js +5181 -0
- package/dist/chunk-PGSPX4SU.js +15 -0
- package/dist/chunk-PIKLF7BM.js +432 -0
- package/dist/chunk-PJWJ3SAV.js +22 -0
- package/dist/chunk-PKIFMV72.js +100 -0
- package/dist/chunk-PL37JDNA.js +189 -0
- package/dist/chunk-PTH5E5XO.js +195 -0
- package/dist/chunk-PW6AXLQC.js +4128 -0
- package/dist/chunk-PYITM4N2.js +79 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q3RO7N35.js +45 -0
- package/dist/chunk-Q3WIC6GQ.js +2670 -0
- package/dist/chunk-Q5XIXSHX.js +271 -0
- package/dist/chunk-QGJDMEOV.js +34 -0
- package/dist/chunk-QNOB37UH.js +58 -0
- package/dist/chunk-QOCOVLUH.js +462 -0
- package/dist/chunk-QTCJ5CC5.js +172 -0
- package/dist/chunk-QVFV5IP2.js +232 -0
- package/dist/chunk-QVZMFDYG.js +29 -0
- package/dist/chunk-R35PEUKH.js +511 -0
- package/dist/chunk-R4UWBC35.js +200 -0
- package/dist/chunk-R6MLCREW.js +44 -0
- package/dist/chunk-R6W23LKN.js +254 -0
- package/dist/chunk-R7XDDX2A.js +4007 -0
- package/dist/chunk-RDFRCT64.js +168 -0
- package/dist/chunk-RE5VZDFQ.js +58 -0
- package/dist/chunk-RGROYC2G.js +638 -0
- package/dist/chunk-RGWHUI5E.js +68 -0
- package/dist/chunk-RHVG6UNL.js +205 -0
- package/dist/chunk-RI4EX2QE.js +18 -0
- package/dist/chunk-RJAAKDRX.js +17 -0
- package/dist/chunk-ROMHOSMQ.js +185 -0
- package/dist/chunk-RWREC3KJ.js +517 -0
- package/dist/chunk-RYNETRDJ.js +118 -0
- package/dist/chunk-RZY7RKM5.js +500 -0
- package/dist/chunk-S2MNWFAG.js +52 -0
- package/dist/chunk-S2VQCZO4.js +22 -0
- package/dist/chunk-S54MKU6V.js +117 -0
- package/dist/chunk-S5OIDFRM.js +302 -0
- package/dist/chunk-SCW4ZF6R.js +150 -0
- package/dist/chunk-SLS2N4PH.js +2213 -0
- package/dist/chunk-SNLBO4BF.js +247 -0
- package/dist/chunk-SP3LFU6B.js +60 -0
- package/dist/chunk-SQQTDDQA.js +537 -0
- package/dist/chunk-STV6LYYE.js +45 -0
- package/dist/chunk-SURZ2WFE.js +326 -0
- package/dist/chunk-SZ7DL357.js +1047 -0
- package/dist/chunk-T5E4NQCM.js +5742 -0
- package/dist/chunk-TAJPCXSB.js +13 -0
- package/dist/chunk-TAOOYK3P.js +358 -0
- package/dist/chunk-TDSEX5CF.js +24 -0
- package/dist/chunk-TFTGP7Z7.js +174 -0
- package/dist/chunk-TGON4N4O.js +197 -0
- package/dist/chunk-TGQZHDY2.js +2373 -0
- package/dist/chunk-TJJZ2OKV.js +6783 -0
- package/dist/chunk-TRSVUPCX.js +25 -0
- package/dist/chunk-TSXGRLPR.js +107 -0
- package/dist/chunk-U2S3YEX3.js +224 -0
- package/dist/chunk-U45RTRGY.js +818 -0
- package/dist/chunk-U6C3VVWS.js +13 -0
- package/dist/chunk-UDMS5AD3.js +307 -0
- package/dist/chunk-UGX7GI37.js +94 -0
- package/dist/chunk-UH3JJSHK.js +1 -0
- package/dist/chunk-UHRBTZYY.js +208 -0
- package/dist/chunk-UHT2KRG5.js +193 -0
- package/dist/chunk-UI2F6DJ5.js +118 -0
- package/dist/chunk-UMAKSB4Z.js +284 -0
- package/dist/chunk-UR2IBGIM.js +521 -0
- package/dist/chunk-UUH2RVKS.js +585 -0
- package/dist/chunk-UVJ4PJDK.js +4533 -0
- package/dist/chunk-V53UG2OT.js +9924 -0
- package/dist/chunk-V72RMBM4.js +48 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VNSYKC25.js +24 -0
- package/dist/chunk-VPHVFK4A.js +1984 -0
- package/dist/chunk-VTLNJQ44.js +133 -0
- package/dist/chunk-VTW7HP3R.js +100 -0
- package/dist/chunk-VVGEPBPS.js +218 -0
- package/dist/chunk-VVLLL7I4.js +166 -0
- package/dist/chunk-VX3UMWB7.js +483 -0
- package/dist/chunk-VXF4Q3FW.js +20 -0
- package/dist/chunk-W3JMT2YY.js +712 -0
- package/dist/chunk-WDUORIHF.js +877 -0
- package/dist/chunk-WDVTY4U6.js +148 -0
- package/dist/chunk-WIFZCHEG.js +12566 -0
- package/dist/chunk-WIRN3F75.js +736 -0
- package/dist/chunk-WMPU2UOV.js +82 -0
- package/dist/chunk-WTOKKE2V.js +784 -0
- package/dist/chunk-WX5IRLF6.js +740 -0
- package/dist/chunk-WZ6U3O7I.js +1581 -0
- package/dist/chunk-XAONGNST.js +57 -0
- package/dist/chunk-XB5YLCLB.js +13 -0
- package/dist/chunk-XEP5NQ5Y.js +688 -0
- package/dist/chunk-XGYF2QMZ.js +351 -0
- package/dist/chunk-XHEKQENB.js +255 -0
- package/dist/chunk-XNO4FM6X.js +1124 -0
- package/dist/chunk-XPHKYHO4.js +878 -0
- package/dist/chunk-XPK2I4NC.js +405 -0
- package/dist/chunk-XPU2XADL.js +2175 -0
- package/dist/chunk-XQD2B6BB.js +507 -0
- package/dist/chunk-XT2ZQVTC.js +558 -0
- package/dist/chunk-XTXJGGUV.js +351 -0
- package/dist/chunk-XUXVDPSZ.js +50 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XZE4XARH.js +563 -0
- package/dist/chunk-XZYR5EDO.js +152 -0
- package/dist/chunk-Y3J4JMTU.js +61 -0
- package/dist/chunk-Y55LZN5U.js +52 -0
- package/dist/chunk-Y5VN7DMP.js +112 -0
- package/dist/chunk-Y67VAHN4.js +459 -0
- package/dist/chunk-YAXSKEUH.js +3544 -0
- package/dist/chunk-YB3JD4E6.js +975 -0
- package/dist/chunk-YESZJFK6.js +220 -0
- package/dist/chunk-YGXKOBQQ.js +292 -0
- package/dist/chunk-YMX76IOS.js +31 -0
- package/dist/chunk-YOTXESEH.js +257 -0
- package/dist/chunk-YTYIEZQY.js +119 -0
- package/dist/chunk-YVORHQ2S.js +579 -0
- package/dist/chunk-Z2CUQDAR.js +3429 -0
- package/dist/chunk-Z2KYOFHS.js +7000 -0
- package/dist/chunk-Z6PC7QX6.js +161 -0
- package/dist/chunk-ZDTGECTN.js +235 -0
- package/dist/chunk-ZIPWI2LY.js +151 -0
- package/dist/chunk-ZSKKMTQJ.js +554 -0
- package/dist/chunk-ZTT5IVPY.js +1160 -0
- package/dist/chunk-ZX65UI5W.js +78 -0
- package/dist/chunk-ZYG7GGKO.js +218 -0
- package/dist/chunk-ZZZUL4OF.js +38 -0
- package/dist/cli-utils-IXL26KJT.js +40 -0
- package/dist/cli-validation-WLXWLUJL.js +111 -0
- package/dist/commit-utils-P7CRJF5N.js +202 -0
- package/dist/compete-config-resolver-R5ULXMYH.js +76 -0
- package/dist/compete-request-62JESVET.js +364 -0
- package/dist/compete-results-QEPG6FZX.js +208 -0
- package/dist/competition-outcome-tracker-R32OOZ43.js +38 -0
- package/dist/config-JCOKXOQT.js +166 -0
- package/dist/config-audit-EL3GHXS7.js +360 -0
- package/dist/config-explain-TNILDEVJ.js +12 -0
- package/dist/config-loader-VPFPFO4B.js +38 -0
- package/dist/config-manager-7T4E2BQO.js +67 -0
- package/dist/config-validator-KKOHOW7O.js +72 -0
- package/dist/cost-YC42XUF3.js +53 -0
- package/dist/coverage-orchestrator-CISNKJC2.js +772 -0
- package/dist/coverage-scanner-YVD62MLH.js +12 -0
- package/dist/createCompetitionRunner-LJG6ZQSO.js +46 -0
- package/dist/data-migration-state-VJK64DLT.js +31 -0
- package/dist/db-migrator-XSEIOGWY.js +34 -0
- package/dist/discovery-JGYGDD25.js +25 -0
- package/dist/doctor-GJOYE7AE.js +186 -0
- package/dist/domain-analyzer-AWF3RP6E.js +29 -0
- package/dist/ensure-initialized-744DIZEZ.js +52 -0
- package/dist/entry.js +940 -0
- package/dist/environment-YS45U5ZI.js +81 -0
- package/dist/error-parser-core-PPZ36A4S.js +50 -0
- package/dist/escalation-ladder-MKTCEGSA.js +130 -0
- package/dist/evaluation-context-KV4GZNN7.js +35 -0
- package/dist/evidence-plan-resolver-GBSYSAPX.js +85 -0
- package/dist/execution-data-writer-3ODTBDLH.js +53 -0
- package/dist/execution-policy-applier-ZHD3DCF3.js +31 -0
- package/dist/execution-preflight-Z4Y64V3I.js +209 -0
- package/dist/execution-roles-R3DPPMD3.js +66 -0
- package/dist/exit-code-error-Z4SW2DVK.js +14 -0
- package/dist/external-temp-cleanup-N2RZH4QP.js +311 -0
- package/dist/factory-XBN7DFIM.js +149 -0
- package/dist/file-utils-XIVR2ZMA.js +47 -0
- package/dist/flywheel-autoloop-executor-UILGOFFK.js +249 -0
- package/dist/flywheel-competition-executor-JOBEXTRB.js +259 -0
- package/dist/flywheel-executor-6JFLA6J5.js +369 -0
- package/dist/flywheel-git-isolation-UC5NIEVU.js +48 -0
- package/dist/flywheel-manifest-5UC4VBMA.js +108 -0
- package/dist/flywheel-model-defaults-7CVKP53V.js +27 -0
- package/dist/flywheel-preflight-XEY5SHM6.js +104 -0
- package/dist/flywheel-resume-7HELH7QS.js +23 -0
- package/dist/flywheel-safety-7U7DPOAP.js +28 -0
- package/dist/flywheel-scope-decision-ZHKF6ZIN.js +11 -0
- package/dist/get-telemetry-logger-DPVWWIYY.js +73 -0
- package/dist/git-worktree-IY6V6DUO.js +18 -0
- package/dist/github-pr-manager-4LXEKJTA.js +211 -0
- package/dist/guidance-profile-config-E7XJL2VP.js +117 -0
- package/dist/guidance-profile-renderer-QK2YMAAP.js +21 -0
- package/dist/index-query-4JEUKA44.js +31 -0
- package/dist/index.js +108661 -0
- package/dist/instructions-6BURLQJC.js +64 -0
- package/dist/invoke-provider-auth-GRUYP44M.js +223 -0
- package/dist/judge-scoring.json +80 -0
- package/dist/judge-test.js +555 -0
- package/dist/lab-mode-OTWVHN63.js +39 -0
- package/dist/lab-utils-BJRFLGK4.js +23 -0
- package/dist/linux-host-class-UY4KVLFD.js +29 -0
- package/dist/llm-judge-executor-F7Z3HO77.js +133 -0
- package/dist/local-executor-CEHWE2PL.js +223 -0
- package/dist/logger-33TR6EE5.js +72 -0
- package/dist/loop-spec-XTLQAVZ7.js +191 -0
- package/dist/manager-2HJG5CLT.js +25 -0
- package/dist/matrix-prompt-builder-6UDN5X3F.js +497 -0
- package/dist/matrix-result-parser-7W35EUOV.js +15 -0
- package/dist/metadata-HQ43NDEK.js +22 -0
- package/dist/model-invocations-db-QBO4Y7WZ.js +38 -0
- package/dist/monitor-XGYBG2DW.js +72 -0
- package/dist/next-PB5ZXZKB.js +90 -0
- package/dist/next-ZBDK725T.js +69 -0
- package/dist/optimization-config-resolver-O6WKR47U.js +75 -0
- package/dist/package-3YCWIQQ5.js +10 -0
- package/dist/parallel-orchestrator-NL7YJJU2.js +297 -0
- package/dist/parallel-worker.js +279 -0
- package/dist/parse-git-status-PIAF3OTP.js +10 -0
- package/dist/path-security-ETTH6TZL.js +39 -0
- package/dist/pattern-bank-UNJR5ADV.js +15 -0
- package/dist/plan-backlog-list-fast-VAGYBV3J.js +270 -0
- package/dist/plan-backlog-show-fast-SG2CZPW3.js +406 -0
- package/dist/plan-sprint-list-fast-LURAX47V.js +162 -0
- package/dist/plan-sprint-status-fast-FJAODCHD.js +208 -0
- package/dist/plan-task-status-fast-HNYBMQI4.js +349 -0
- package/dist/plan-to-flywheel-Z4U3GWPN.js +456 -0
- package/dist/planning-backlog-3CQ5QQBQ.js +319 -0
- package/dist/poetic-root-V5DNXEAE.js +17 -0
- package/dist/preflight-OPANWMME.js +12 -0
- package/dist/process-registry-PDZJPTAS.js +27 -0
- package/dist/process-scanner-C22SYXYD.js +22 -0
- package/dist/processes-KMQUD7HY.js +29 -0
- package/dist/processes-json-fast-IBDXZ6WW.js +135 -0
- package/dist/profile-SE5EVXAP.js +149 -0
- package/dist/prompts-WZZPGWBX.js +168 -0
- package/dist/protected-branches-RNTEX7ET.js +57 -0
- package/dist/provider-aware-resource-manager-QBTZJMNP.js +18 -0
- package/dist/provider-matrix-N5X57V3Y.js +154 -0
- package/dist/provider-matrix-renderer-MZDWKKID.js +139 -0
- package/dist/provider-output-forwarding-DERID3TP.js +30 -0
- package/dist/provider-registry-J5NRBJKI.js +128 -0
- package/dist/provider-temp-cleanup-KYGLF6YU.js +14 -0
- package/dist/prune-engine-Q6E2DXBN.js +451 -0
- package/dist/quality-gate-YRHMQAEI.js +70 -0
- package/dist/quickstart-FIRLKGJI.js +62 -0
- package/dist/readiness-VZTMSG6J.js +96 -0
- package/dist/registry-YODFY77A.js +153 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-2IGD4H7X.js +22 -0
- package/dist/resolution-engine-D6TX6FRG.js +127 -0
- package/dist/resolve-provider-cli-O2P6XZBZ.js +35 -0
- package/dist/restore-telemetry-db-BQL6DTQF.js +360 -0
- package/dist/result-streamer-WEHW476R.js +19 -0
- package/dist/routing-events-DHPUZDDF.js +27 -0
- package/dist/routing-history-store-UWCEXAP3.js +46 -0
- package/dist/routing-planner-F5WQEUOM.js +160 -0
- package/dist/run-poetic-tui-J6LWRJUP.js +13517 -0
- package/dist/run-simulation.js +376 -0
- package/dist/runner-CS2TNGHA.js +1092 -0
- package/dist/runner-HHH7ZN2Z.js +1571 -0
- package/dist/safety-OCC4KJJR.js +64 -0
- package/dist/safety-stanza-7SV3HGG3.js +60 -0
- package/dist/sandbox-32QXJEMV.js +81 -0
- package/dist/sandbox-RSO7VP6V.js +94 -0
- package/dist/schema-extensions.sql +234 -0
- package/dist/security-2KI5XNDG.js +17 -0
- package/dist/setup-bb-plugin-QAQWZCV5.js +738 -0
- package/dist/setup-claude-code-P7BTTSPO.js +317 -0
- package/dist/setup-temp-cleanup-GASCWZ2I.js +20 -0
- package/dist/shared-utils-D6U6UREP.js +37 -0
- package/dist/simple-artifact-goal-OTXNGZY6.js +25 -0
- package/dist/sprint-UIXPYOXQ.js +338 -0
- package/dist/sprint-bridge-4BHMSC3M.js +68 -0
- package/dist/sprint-execution-service-2B7WHL5L.js +311 -0
- package/dist/sprint-manager-IDQUDNQI.js +91 -0
- package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
- package/dist/stale-cleanup-orchestrator-XWXV7KCZ.js +62 -0
- package/dist/storage-access-F6ALDN4S.js +22 -0
- package/dist/synthesis-XD6EDVHF.js +185 -0
- package/dist/task-classifier-LNLXSHOM.js +494 -0
- package/dist/task-list-fast-PTMA4LUC.js +147 -0
- package/dist/task-manager-XAT7GOWB.js +93 -0
- package/dist/task-splitter-U7DJ7W6A.js +79 -0
- package/dist/task-type-detector-OLVOMXZO.js +21 -0
- package/dist/task-type-resolver-KKNQYSB4.js +42 -0
- package/dist/telemetry-5HWBBXLX.js +131 -0
- package/dist/telemetry-health-tracker-DMSSGBZ2.js +11 -0
- package/dist/telemetry-path-resolver-7ICSG276.js +28 -0
- package/dist/telemetry-reliability-XUOZNZZ6.js +125 -0
- package/dist/token-estimator-MEQUL3EJ.js +37 -0
- package/dist/transports-KNSSV2V4.js +255 -0
- package/dist/unified-cost-tracker-4TFRBVPR.js +35 -0
- package/dist/unified-state-cleanup-LJPF2BOW.js +276 -0
- package/dist/universal-cost-calculator-BAJV35GA.js +42 -0
- package/dist/user-agents-GHUGCSKN.js +22 -0
- package/dist/variant-delivery-state-KLRNG6XA.js +33 -0
- package/dist/variant-state-cleanup-MZGGLQAJ.js +280 -0
- package/dist/variant-success-PJXWE3ZV.js +12 -0
- package/dist/variant-worker-KUWKBLAH.js +4196 -0
- package/dist/variant-worker.js +24 -0
- package/dist/variants-JE2FSAQS.js +233 -0
- package/dist/verification-toolchains-V24UHW6Q.js +28 -0
- package/dist/verify-commands-H3DTCSGI.js +37 -0
- package/dist/warning-EGQGUUIO.js +12 -0
- package/dist/work-edge-RWEDWJZF.js +49 -0
- package/dist/work-item-writer-WHAVZXAY.js +19 -0
- package/dist/worker-7SA2VS2Y.js +1435 -0
- package/dist/worker.js +19 -0
- package/dist/worktree-metrics-3DFUYVYE.js +26 -0
- package/dist/writeback-VZKHYHSN.js +44 -0
- package/docs/CLI_REFERENCE.md +7042 -0
- package/docs/PROVIDER_SETUP.md +1570 -0
- package/docs/README.md +96 -0
- package/docs/TROUBLESHOOTING.md +2232 -0
- package/docs/getting-started/QUICK_START.md +294 -0
- package/docs/getting-started/README.md +188 -0
- package/docs/getting-started/SETUP.md +52 -0
- package/docs/reference/AGENT_CONTEXT.md +38 -0
- package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
- package/docs/reference/README.md +381 -0
- package/docs/reference/SECURITY.md +262 -0
- package/integrations/bb-plugin-poetic/README.md +362 -0
- package/integrations/bb-plugin-poetic/app.css +341 -0
- package/integrations/bb-plugin-poetic/app.tsx +5059 -0
- package/integrations/bb-plugin-poetic/package.json +45 -0
- package/integrations/bb-plugin-poetic/server.ts +444 -0
- package/integrations/bb-plugin-poetic/src/adapter.ts +3312 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-model.ts +150 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-schema.ts +355 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-service.ts +419 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-view.ts +1026 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-schema.ts +122 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-service.ts +105 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-view.ts +138 -0
- package/integrations/bb-plugin-poetic/src/contract.ts +615 -0
- package/integrations/bb-plugin-poetic/src/finalize-model.ts +205 -0
- package/integrations/bb-plugin-poetic/src/finalize-schema.ts +158 -0
- package/integrations/bb-plugin-poetic/src/finalize-service.ts +382 -0
- package/integrations/bb-plugin-poetic/src/finalize-view.ts +159 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-readback.ts +303 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-schema.ts +33 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-view.ts +459 -0
- package/integrations/bb-plugin-poetic/src/model.ts +1302 -0
- package/integrations/bb-plugin-poetic/src/monitor-service.ts +233 -0
- package/integrations/bb-plugin-poetic/src/panel-read-ux.ts +97 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-schema.ts +166 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-service.ts +480 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-view.ts +109 -0
- package/integrations/bb-plugin-poetic/src/planning-readback.ts +204 -0
- package/integrations/bb-plugin-poetic/src/planning-service.ts +594 -0
- package/integrations/bb-plugin-poetic/src/planning-workspace-schema.ts +95 -0
- package/integrations/bb-plugin-poetic/src/planning-workspace.ts +323 -0
- package/integrations/bb-plugin-poetic/src/poll-handoff.ts +136 -0
- package/integrations/bb-plugin-poetic/src/project-target-server.ts +21 -0
- package/integrations/bb-plugin-poetic/src/project-target.ts +45 -0
- package/integrations/bb-plugin-poetic/src/reference-index.ts +192 -0
- package/integrations/bb-plugin-poetic/src/repository-schema.ts +30 -0
- package/integrations/bb-plugin-poetic/src/result-explorer-view.ts +597 -0
- package/integrations/bb-plugin-poetic/src/result-readback-model.ts +163 -0
- package/integrations/bb-plugin-poetic/src/result-readback-schema.ts +319 -0
- package/integrations/bb-plugin-poetic/src/result-readback-service.ts +333 -0
- package/integrations/bb-plugin-poetic/src/run-page-view.ts +177 -0
- package/integrations/bb-plugin-poetic/src/setup-config-schema.ts +291 -0
- package/integrations/bb-plugin-poetic/src/setup-config-service.ts +590 -0
- package/integrations/bb-plugin-poetic/src/setup-config-view.ts +413 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-model.ts +150 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-schema.ts +136 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-service.ts +341 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-view.ts +116 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-model.ts +714 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-readback.ts +231 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-schema.ts +601 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-service.ts +775 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-view.ts +1221 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-model.ts +567 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-schema.ts +635 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-service.ts +842 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-view.ts +1227 -0
- package/integrations/bb-plugin-poetic/src/task-detail-readback.ts +56 -0
- package/integrations/bb-plugin-poetic/src/task-detail-schema.ts +144 -0
- package/integrations/bb-plugin-poetic/src/task-navigation.ts +446 -0
- package/integrations/bb-plugin-poetic/src/workbench-route.ts +74 -0
- package/integrations/bb-plugin-poetic/tests/host-contract.test.ts +773 -0
- package/integrations/bb-plugin-poetic/tsconfig.json +18 -0
- package/integrations/bb-plugin-poetic/types/PROVENANCE.json +52 -0
- package/integrations/bb-plugin-poetic/types/bb-plugin-sdk-app.d.ts +1444 -0
- package/integrations/bb-plugin-poetic/types/bb-plugin-sdk.d.ts +13030 -0
- package/integrations/bb-plugin-poetic/vitest.host.config.ts +71 -0
- package/npm-shrinkwrap.json +4950 -0
- package/package.json +331 -0
- package/schemas/README.md +80 -0
- package/schemas/config-v1.schema.json +136 -0
- package/schemas/execution-config.schema.json +47 -0
- package/schemas/judge-scoring.schema.json +370 -0
- package/schemas/poetic.config.schema.json +2214 -0
- package/schemas/provider-config.schema.json +203 -0
- package/schemas/telemetry-config.schema.json +79 -0
- package/schemas/user-preferences.schema.json +141 -0
- package/scripts/assert-node-runtime.mjs +140 -0
- package/scripts/preflight-native.mjs +49 -0
- package/scripts/preinstall-node-check.mjs +78 -0
- package/scripts/setup-git-hooks.mjs +24 -0
- package/scripts/sync.sh +2722 -0
- package/scripts/write-node-launcher.sh +108 -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/.poetic/README.md +37 -0
- package/templates/.poetic/agents/README.md +296 -0
- package/templates/.poetic/agents/api-documenter.md +147 -0
- package/templates/.poetic/agents/backend-architect.md +31 -0
- package/templates/.poetic/agents/code-reviewer.md +157 -0
- package/templates/.poetic/agents/data-scientist.md +179 -0
- package/templates/.poetic/agents/database-optimizer.md +145 -0
- package/templates/.poetic/agents/debugger.md +31 -0
- package/templates/.poetic/agents/deployment-engineer.md +164 -0
- package/templates/.poetic/agents/devops-troubleshooter.md +139 -0
- package/templates/.poetic/agents/frontend-developer.md +150 -0
- package/templates/.poetic/agents/javascript-pro.md +36 -0
- package/templates/.poetic/agents/performance-engineer.md +151 -0
- package/templates/.poetic/agents/python-pro.md +137 -0
- package/templates/.poetic/agents/test-automator.md +147 -0
- package/templates/.poetic/agents/typescript-pro.md +34 -0
- package/templates/.poetic/config/poetic.config.jsonc +69 -0
- package/templates/.poetic/config/project-context.template.json +6 -0
- package/templates/.poetic/config/task-type-aliases.presets/kanban.yaml +14 -0
- package/templates/.poetic/config/task-type-aliases.presets/scrum.yaml +17 -0
- package/templates/.poetic/config/task-type-aliases.presets/xp.yaml +12 -0
- package/templates/.poetic/config/task-type-aliases.yaml +28 -0
- package/templates/.poetic/gitignore.template +55 -0
- package/templates/.poetic/task-types/analysis.yaml +40 -0
- package/templates/.poetic/task-types/architecture.yaml +38 -0
- package/templates/.poetic/task-types/doc.yaml +35 -0
- package/templates/.poetic/task-types/feature.yaml +23 -0
- package/templates/.poetic/task-types/general.yaml +6 -0
- package/templates/.poetic/task-types/security.yaml +39 -0
- package/templates/AGENTS.template.md +99 -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/compete-streak.yaml +78 -0
- package/templates/builtin-workflows/hello-verify.yaml +10 -0
- package/templates/builtin-workflows/judge-regression.yaml +114 -0
- package/templates/builtin-workflows/skills/code-review/SKILL.md +60 -0
- package/templates/builtin-workflows/skills/hello-verify/SKILL.md +6 -0
- package/templates/guard-kit/GUARD_SETUP.md.template +255 -0
- package/templates/guard-kit/check.mjs.template +777 -0
- package/templates/guard-kit/config.json.template +6 -0
- package/templates/guard-kit/poetic-guard.yml.template +189 -0
- package/templates/profiles/README.md +56 -0
- package/templates/profiles/frontier-claude.json +27 -0
- package/templates/profiles/frontier-codex.json +26 -0
|
@@ -0,0 +1,1027 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getArtifactDir
|
|
3
|
+
} from "./chunk-CQM3A35X.js";
|
|
4
|
+
import {
|
|
5
|
+
resolveContainedPath
|
|
6
|
+
} from "./chunk-WMPU2UOV.js";
|
|
7
|
+
import {
|
|
8
|
+
atomicWriteJson,
|
|
9
|
+
atomicWriteText
|
|
10
|
+
} from "./chunk-A3YGID55.js";
|
|
11
|
+
import {
|
|
12
|
+
emitCustomWarning
|
|
13
|
+
} from "./chunk-EJGCZGUF.js";
|
|
14
|
+
import {
|
|
15
|
+
PROVIDER_SECRET_PATTERNS
|
|
16
|
+
} from "./chunk-LPITVM7M.js";
|
|
17
|
+
|
|
18
|
+
// src/automation/flywheel-security.ts
|
|
19
|
+
var PROVIDER_REPLACEMENT_BY_ID = {
|
|
20
|
+
"anthropic-api-key": "[REDACTED_API_KEY]",
|
|
21
|
+
"openai-project-api-key": "[REDACTED_API_KEY]",
|
|
22
|
+
"openai-service-account-key": "[REDACTED_API_KEY]",
|
|
23
|
+
"openai-admin-api-key": "[REDACTED_API_KEY]",
|
|
24
|
+
"openrouter-api-key": "[REDACTED_API_KEY]",
|
|
25
|
+
"google-api-key": "[REDACTED_API_KEY]",
|
|
26
|
+
"xai-api-key": "[REDACTED_API_KEY]",
|
|
27
|
+
"slack-token": "[REDACTED_SLACK_TOKEN]"
|
|
28
|
+
};
|
|
29
|
+
var REDACTION_RULES = [
|
|
30
|
+
// Shared F1–F5 provider-prefix inventory (same sources/min lengths as error-sanitizer).
|
|
31
|
+
...PROVIDER_SECRET_PATTERNS.map((pattern) => ({
|
|
32
|
+
source: pattern.source,
|
|
33
|
+
replacement: PROVIDER_REPLACEMENT_BY_ID[pattern.id],
|
|
34
|
+
name: pattern.id
|
|
35
|
+
})),
|
|
36
|
+
// Broader / flywheel-local API key forms (not part of the shared inventory).
|
|
37
|
+
{
|
|
38
|
+
source: "sk-[a-zA-Z0-9]{32,}",
|
|
39
|
+
replacement: "[REDACTED_API_KEY]",
|
|
40
|
+
name: "openai-api-key"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
source: "ya29\\.[a-zA-Z0-9._-]+",
|
|
44
|
+
replacement: "[REDACTED_OAUTH_TOKEN]",
|
|
45
|
+
name: "google-oauth-token"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
source: "ghp_[a-zA-Z0-9]{36}",
|
|
49
|
+
replacement: "[REDACTED_GITHUB_TOKEN]",
|
|
50
|
+
name: "github-pat"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
source: "gho_[a-zA-Z0-9]{36}",
|
|
54
|
+
replacement: "[REDACTED_GITHUB_TOKEN]",
|
|
55
|
+
name: "github-oauth"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
source: "AKIA[0-9A-Z]{16}",
|
|
59
|
+
replacement: "[REDACTED_AWS_KEY]",
|
|
60
|
+
name: "aws-access-key"
|
|
61
|
+
},
|
|
62
|
+
// Credentials in assignments/configurations
|
|
63
|
+
// Use negative lookahead (?!\[) to avoid matching our own [REDACTED] placeholders
|
|
64
|
+
{
|
|
65
|
+
source: 'password["\\s:=]+(?!\\[)[^\\s"]+',
|
|
66
|
+
replacement: "password=[REDACTED]",
|
|
67
|
+
name: "password"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
source: 'token["\\s:=]+(?!\\[)[^\\s"]+',
|
|
71
|
+
replacement: "token=[REDACTED]",
|
|
72
|
+
name: "token"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
source: 'secret["\\s:=]+(?!\\[)[^\\s"]+',
|
|
76
|
+
replacement: "secret=[REDACTED]",
|
|
77
|
+
name: "secret"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
source: 'api[_-]?key["\\s:=]+(?!\\[)[^\\s"]+',
|
|
81
|
+
replacement: "api_key=[REDACTED]",
|
|
82
|
+
name: "api-key"
|
|
83
|
+
},
|
|
84
|
+
// Authorization headers
|
|
85
|
+
{
|
|
86
|
+
source: "Bearer\\s+[a-zA-Z0-9\\-._~+/]+=*",
|
|
87
|
+
replacement: "Bearer [REDACTED]",
|
|
88
|
+
name: "bearer-token"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
source: "Authorization:\\s*[^\\n]+",
|
|
92
|
+
replacement: "Authorization: [REDACTED]",
|
|
93
|
+
name: "auth-header"
|
|
94
|
+
},
|
|
95
|
+
// PII patterns
|
|
96
|
+
{
|
|
97
|
+
source: "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b",
|
|
98
|
+
replacement: "[REDACTED_EMAIL]",
|
|
99
|
+
name: "email"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
source: "\\b\\d{3}-\\d{2}-\\d{4}\\b",
|
|
103
|
+
replacement: "[REDACTED_SSN]",
|
|
104
|
+
name: "ssn"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
source: "\\b\\d{4}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}\\b",
|
|
108
|
+
replacement: "[REDACTED_CARD]",
|
|
109
|
+
name: "credit-card"
|
|
110
|
+
},
|
|
111
|
+
// Database connection strings
|
|
112
|
+
{
|
|
113
|
+
source: 'postgres:\\/\\/[^@]+@[^\\s"]+',
|
|
114
|
+
replacement: "postgres://[REDACTED]@[REDACTED]",
|
|
115
|
+
name: "postgres-url"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
source: 'mongodb(\\+srv)?:\\/\\/[^@]+@[^\\s"]+',
|
|
119
|
+
replacement: "mongodb://[REDACTED]",
|
|
120
|
+
name: "mongo-url"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
source: 'mysql:\\/\\/[^@]+@[^\\s"]+',
|
|
124
|
+
replacement: "mysql://[REDACTED]",
|
|
125
|
+
name: "mysql-url"
|
|
126
|
+
},
|
|
127
|
+
// Private keys (PEM format)
|
|
128
|
+
{
|
|
129
|
+
source: "-----BEGIN [A-Z ]+-----[\\s\\S]*?-----END [A-Z ]+-----",
|
|
130
|
+
replacement: "[REDACTED_PRIVATE_KEY]",
|
|
131
|
+
name: "private-key"
|
|
132
|
+
},
|
|
133
|
+
// JWT tokens
|
|
134
|
+
{
|
|
135
|
+
source: "eyJ[a-zA-Z0-9_-]{10,}\\.eyJ[a-zA-Z0-9_-]{10,}\\.[a-zA-Z0-9_-]{10,}",
|
|
136
|
+
replacement: "[REDACTED_JWT]",
|
|
137
|
+
name: "jwt-token"
|
|
138
|
+
},
|
|
139
|
+
// Azure patterns
|
|
140
|
+
{
|
|
141
|
+
source: "AccountKey=[a-zA-Z0-9+/=]{32,}",
|
|
142
|
+
replacement: "AccountKey=[REDACTED]",
|
|
143
|
+
name: "azure-account-key"
|
|
144
|
+
},
|
|
145
|
+
// IP addresses — note: this pattern also matches 4-segment version strings (e.g. "1.2.3.4").
|
|
146
|
+
// A boundary-only fix risks masking real IPs that appear in version-like contexts, so the
|
|
147
|
+
// tradeoff is accepted: redact conservatively and let callers strip [REDACTED_IP] from
|
|
148
|
+
// non-sensitive outputs if needed.
|
|
149
|
+
{
|
|
150
|
+
source: "\\b(?:\\d{1,3}\\.){3}\\d{1,3}(?::\\d+)?\\b",
|
|
151
|
+
replacement: "[REDACTED_IP]",
|
|
152
|
+
name: "ip-address"
|
|
153
|
+
}
|
|
154
|
+
];
|
|
155
|
+
function emitRedactionDiagnostic(ruleName, count) {
|
|
156
|
+
emitCustomWarning(
|
|
157
|
+
"INFO" /* INFO */,
|
|
158
|
+
"validation" /* VALIDATION */,
|
|
159
|
+
"Sensitive content was redacted before prompt use",
|
|
160
|
+
{ subsystem: "flywheel-security", executionPhase: "validation" },
|
|
161
|
+
{
|
|
162
|
+
metadata: { ruleName, count },
|
|
163
|
+
skipConsole: true
|
|
164
|
+
}
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
function emitHighSensitiveContentDiagnostic(entry) {
|
|
168
|
+
emitCustomWarning(
|
|
169
|
+
"WARN" /* WARN */,
|
|
170
|
+
"validation" /* VALIDATION */,
|
|
171
|
+
"High sensitive content volume detected during prompt sanitization",
|
|
172
|
+
{
|
|
173
|
+
subsystem: "flywheel-security",
|
|
174
|
+
executionPhase: "validation"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
metadata: {
|
|
178
|
+
workflowId: entry.workflowId,
|
|
179
|
+
source: entry.source,
|
|
180
|
+
stageId: entry.stageId,
|
|
181
|
+
patternsFound: entry.patternsFound
|
|
182
|
+
},
|
|
183
|
+
skipConsole: true
|
|
184
|
+
}
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
var Redactor = class {
|
|
188
|
+
lastRedactionCount = 0;
|
|
189
|
+
lastRedactedPatterns = [];
|
|
190
|
+
/**
|
|
191
|
+
* Redact sensitive patterns from text
|
|
192
|
+
*
|
|
193
|
+
* @param text - Text to redact
|
|
194
|
+
* @returns Redacted text
|
|
195
|
+
*/
|
|
196
|
+
redactSensitive(text) {
|
|
197
|
+
let redacted = text;
|
|
198
|
+
this.lastRedactionCount = 0;
|
|
199
|
+
this.lastRedactedPatterns = [];
|
|
200
|
+
for (const rule of REDACTION_RULES) {
|
|
201
|
+
const pattern = new RegExp(rule.source, "gi");
|
|
202
|
+
const matches = redacted.match(pattern);
|
|
203
|
+
if (matches) {
|
|
204
|
+
this.lastRedactionCount += matches.length;
|
|
205
|
+
this.lastRedactedPatterns.push(rule.name);
|
|
206
|
+
emitRedactionDiagnostic(rule.name, matches.length);
|
|
207
|
+
}
|
|
208
|
+
redacted = redacted.replace(pattern, rule.replacement);
|
|
209
|
+
}
|
|
210
|
+
return redacted;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Check if text contains sensitive patterns
|
|
214
|
+
*
|
|
215
|
+
* Excludes already-redacted placeholders from detection to avoid
|
|
216
|
+
* false positives after redaction has been applied.
|
|
217
|
+
*
|
|
218
|
+
* @param text - Text to check
|
|
219
|
+
* @returns True if sensitive patterns found (excluding redacted placeholders)
|
|
220
|
+
*/
|
|
221
|
+
containsSensitivePatterns(text) {
|
|
222
|
+
const textWithoutPlaceholders = text.replace(/\[REDACTED(?:_[A-Z_]+)?\]/gi, "");
|
|
223
|
+
for (const rule of REDACTION_RULES) {
|
|
224
|
+
const pattern = new RegExp(rule.source, "gi");
|
|
225
|
+
if (pattern.test(textWithoutPlaceholders)) {
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get count of patterns redacted in last call
|
|
233
|
+
*/
|
|
234
|
+
getLastRedactionCount() {
|
|
235
|
+
return this.lastRedactionCount;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get names of patterns redacted in last call
|
|
239
|
+
*/
|
|
240
|
+
getLastRedactedPatterns() {
|
|
241
|
+
return [...this.lastRedactedPatterns];
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
var SecurityBoundary = class {
|
|
245
|
+
redactor;
|
|
246
|
+
auditLog = [];
|
|
247
|
+
workflowId;
|
|
248
|
+
constructor(workflowId) {
|
|
249
|
+
this.redactor = new Redactor();
|
|
250
|
+
this.workflowId = workflowId;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Sanitize text before prompt injection
|
|
254
|
+
*
|
|
255
|
+
* **CRITICAL**: This MUST be called for ALL text entering prompts,
|
|
256
|
+
* regardless of source. Even "already processed" text must be re-redacted
|
|
257
|
+
* because it might have been modified or contain reflected secrets.
|
|
258
|
+
*
|
|
259
|
+
* @param text - Text to sanitize
|
|
260
|
+
* @param source - Where the text came from (for audit)
|
|
261
|
+
* @param stageId - Current stage ID (for audit)
|
|
262
|
+
* @returns Sanitized text
|
|
263
|
+
* @throws Error if redaction fails (text still contains sensitive patterns)
|
|
264
|
+
*/
|
|
265
|
+
async sanitizeForPromptInjection(text, source, stageId) {
|
|
266
|
+
const redacted = this.redactor.redactSensitive(text);
|
|
267
|
+
const entry = {
|
|
268
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
269
|
+
source,
|
|
270
|
+
originalLength: text.length,
|
|
271
|
+
redactedLength: redacted.length,
|
|
272
|
+
patternsFound: this.redactor.getLastRedactionCount(),
|
|
273
|
+
workflowId: this.workflowId,
|
|
274
|
+
stageId
|
|
275
|
+
};
|
|
276
|
+
this.auditLog.push(entry);
|
|
277
|
+
if (entry.patternsFound > 5) {
|
|
278
|
+
emitHighSensitiveContentDiagnostic(entry);
|
|
279
|
+
}
|
|
280
|
+
if (this.redactor.containsSensitivePatterns(redacted)) {
|
|
281
|
+
throw new Error(
|
|
282
|
+
`Redaction verification failed for ${source}: sensitive content remains after redaction`
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
return redacted;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Build retry prompt with mandatory re-redaction
|
|
289
|
+
*
|
|
290
|
+
* Constructs a retry prompt that includes judge feedback and context,
|
|
291
|
+
* with all components sanitized through the security boundary.
|
|
292
|
+
*
|
|
293
|
+
* @param stage - Stage configuration
|
|
294
|
+
* @param failure - Validation failure details
|
|
295
|
+
* @param context - Additional context to include
|
|
296
|
+
* @returns Sanitized retry prompt
|
|
297
|
+
*/
|
|
298
|
+
async buildRetryPrompt(stage, failure, context) {
|
|
299
|
+
const safeJudgeFeedback = await this.sanitizeForPromptInjection(
|
|
300
|
+
failure.judgeFeedback,
|
|
301
|
+
"judge-feedback",
|
|
302
|
+
stage.id
|
|
303
|
+
);
|
|
304
|
+
let safeContext = "";
|
|
305
|
+
if (context) {
|
|
306
|
+
safeContext = await this.sanitizeForPromptInjection(context, "context-retrieval", stage.id);
|
|
307
|
+
}
|
|
308
|
+
const parts = [
|
|
309
|
+
stage.prompt ?? "",
|
|
310
|
+
"",
|
|
311
|
+
`Previous attempt scored ${failure.score}% (threshold: ${failure.threshold}%).`,
|
|
312
|
+
"",
|
|
313
|
+
"Issues to address:",
|
|
314
|
+
safeJudgeFeedback
|
|
315
|
+
];
|
|
316
|
+
if (safeContext) {
|
|
317
|
+
parts.push("", "Relevant context:", safeContext);
|
|
318
|
+
}
|
|
319
|
+
const retryPrompt = parts.join("\n").trim();
|
|
320
|
+
return this.sanitizeForPromptInjection(retryPrompt, "retry-prompt", stage.id);
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Sanitize stage output before storing or forwarding
|
|
324
|
+
*
|
|
325
|
+
* @param output - Stage output content
|
|
326
|
+
* @param stageId - Stage that produced the output
|
|
327
|
+
* @returns Sanitized output
|
|
328
|
+
*/
|
|
329
|
+
async sanitizeStageOutput(output, stageId) {
|
|
330
|
+
return this.sanitizeForPromptInjection(output, "stage-output", stageId);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Sanitize template variable before interpolation
|
|
334
|
+
*
|
|
335
|
+
* @param value - Variable value
|
|
336
|
+
* @param stageId - Stage using the variable
|
|
337
|
+
* @returns Sanitized value
|
|
338
|
+
*/
|
|
339
|
+
async sanitizeTemplateVariable(value, stageId) {
|
|
340
|
+
return this.sanitizeForPromptInjection(value, "template-variable", stageId);
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Get audit log for security review
|
|
344
|
+
*/
|
|
345
|
+
getAuditLog() {
|
|
346
|
+
return [...this.auditLog];
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Get summary statistics from audit log
|
|
350
|
+
*/
|
|
351
|
+
getAuditSummary() {
|
|
352
|
+
const bySource = {
|
|
353
|
+
"user-input": 0,
|
|
354
|
+
"judge-feedback": 0,
|
|
355
|
+
"context-retrieval": 0,
|
|
356
|
+
"stage-output": 0,
|
|
357
|
+
"template-variable": 0,
|
|
358
|
+
"retry-prompt": 0
|
|
359
|
+
};
|
|
360
|
+
let totalRedactions = 0;
|
|
361
|
+
let highRiskEvents = 0;
|
|
362
|
+
for (const entry of this.auditLog) {
|
|
363
|
+
totalRedactions += entry.patternsFound;
|
|
364
|
+
bySource[entry.source] += entry.patternsFound;
|
|
365
|
+
if (entry.patternsFound > 5) {
|
|
366
|
+
highRiskEvents++;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return {
|
|
370
|
+
totalRedactions,
|
|
371
|
+
bySource,
|
|
372
|
+
highRiskEvents
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Clear audit log (for testing or after review)
|
|
377
|
+
*/
|
|
378
|
+
clearAuditLog() {
|
|
379
|
+
this.auditLog = [];
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
function createSecurityBoundary(workflowId) {
|
|
383
|
+
return new SecurityBoundary(workflowId);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// src/automation/flywheel-artifact-store.ts
|
|
387
|
+
import * as fs from "fs/promises";
|
|
388
|
+
import * as path from "path";
|
|
389
|
+
import lockfile from "proper-lockfile";
|
|
390
|
+
var ArtifactNotFoundError = class extends Error {
|
|
391
|
+
constructor(ref, stageId, reason) {
|
|
392
|
+
super(
|
|
393
|
+
`Stage '${stageId}' references missing artifact '${ref}'. ${reason}
|
|
394
|
+
Hint: Ensure the dependency stage completed successfully and produced the expected output.`
|
|
395
|
+
);
|
|
396
|
+
this.ref = ref;
|
|
397
|
+
this.stageId = stageId;
|
|
398
|
+
this.reason = reason;
|
|
399
|
+
this.name = "ArtifactNotFoundError";
|
|
400
|
+
}
|
|
401
|
+
ref;
|
|
402
|
+
stageId;
|
|
403
|
+
reason;
|
|
404
|
+
};
|
|
405
|
+
var ArtifactValidationError = class extends Error {
|
|
406
|
+
constructor(ref, reason) {
|
|
407
|
+
super(`Invalid artifact '${ref}': ${reason}`);
|
|
408
|
+
this.ref = ref;
|
|
409
|
+
this.reason = reason;
|
|
410
|
+
this.name = "ArtifactValidationError";
|
|
411
|
+
}
|
|
412
|
+
ref;
|
|
413
|
+
reason;
|
|
414
|
+
};
|
|
415
|
+
var ArtifactPathEscapeError = class extends Error {
|
|
416
|
+
constructor(stageId, outputName, reason) {
|
|
417
|
+
super(
|
|
418
|
+
`Refusing to write artifact '${stageId}.${outputName}': ${reason}. Stage ids and output names must match ^[A-Za-z0-9_-]+$ and resolve inside the artifact store.`
|
|
419
|
+
);
|
|
420
|
+
this.stageId = stageId;
|
|
421
|
+
this.outputName = outputName;
|
|
422
|
+
this.name = "ArtifactPathEscapeError";
|
|
423
|
+
}
|
|
424
|
+
stageId;
|
|
425
|
+
outputName;
|
|
426
|
+
};
|
|
427
|
+
var ARTIFACT_EXTENSIONS = {
|
|
428
|
+
text: "txt",
|
|
429
|
+
json: "json",
|
|
430
|
+
diff: "diff",
|
|
431
|
+
files: "txt",
|
|
432
|
+
// List of files as text
|
|
433
|
+
testResults: "json"
|
|
434
|
+
// Test results as structured JSON
|
|
435
|
+
};
|
|
436
|
+
var VALID_ARTIFACT_TYPES = new Set(Object.keys(ARTIFACT_EXTENSIONS));
|
|
437
|
+
function isStageOutputType(value) {
|
|
438
|
+
return typeof value === "string" && VALID_ARTIFACT_TYPES.has(value);
|
|
439
|
+
}
|
|
440
|
+
function parseStoredTimestamp(value) {
|
|
441
|
+
if (value instanceof Date) {
|
|
442
|
+
return Number.isNaN(value.getTime()) ? void 0 : value;
|
|
443
|
+
}
|
|
444
|
+
if (typeof value !== "string" && typeof value !== "number") {
|
|
445
|
+
return void 0;
|
|
446
|
+
}
|
|
447
|
+
const parsed = new Date(value);
|
|
448
|
+
return Number.isNaN(parsed.getTime()) ? void 0 : parsed;
|
|
449
|
+
}
|
|
450
|
+
var METADATA_LOCK_DISABLE_ENV = "POETIC_FLYWHEEL_ARTIFACT_METADATA_LOCK_DISABLE";
|
|
451
|
+
function isMetadataFileLockDisabled() {
|
|
452
|
+
const raw = process.env[METADATA_LOCK_DISABLE_ENV]?.trim().toLowerCase() ?? "";
|
|
453
|
+
return raw === "1" || raw === "true" || raw === "yes" || raw === "on";
|
|
454
|
+
}
|
|
455
|
+
async function writeFileWithParentRetry(filePath, content) {
|
|
456
|
+
await atomicWriteText(filePath, content, { ensureDir: true });
|
|
457
|
+
}
|
|
458
|
+
function findPathComponentViolation(value) {
|
|
459
|
+
if (value.length === 0) return "component is empty";
|
|
460
|
+
if (value.includes("\0")) return "component contains a null byte";
|
|
461
|
+
if (value.includes("/") || value.includes("\\")) {
|
|
462
|
+
return "component contains a path separator";
|
|
463
|
+
}
|
|
464
|
+
if (value === "." || value === "..") return "component is a relative path segment";
|
|
465
|
+
if (path.isAbsolute(value)) return "component is an absolute path";
|
|
466
|
+
if (path.basename(value) !== value) return "component is not a single path component";
|
|
467
|
+
return void 0;
|
|
468
|
+
}
|
|
469
|
+
function resolveArtifactWritePath(basePath, stageId, name, filename) {
|
|
470
|
+
const stageIdViolation = findPathComponentViolation(stageId);
|
|
471
|
+
if (stageIdViolation) {
|
|
472
|
+
throw new ArtifactPathEscapeError(stageId, name, `stage id ${stageIdViolation}`);
|
|
473
|
+
}
|
|
474
|
+
const nameViolation = findPathComponentViolation(name);
|
|
475
|
+
if (nameViolation) {
|
|
476
|
+
throw new ArtifactPathEscapeError(stageId, name, `output name ${nameViolation}`);
|
|
477
|
+
}
|
|
478
|
+
const stageDir = path.join(basePath, stageId);
|
|
479
|
+
const artifactPath = path.join(stageDir, filename);
|
|
480
|
+
const contained = resolveContainedPath(basePath, containmentCandidate(basePath, artifactPath));
|
|
481
|
+
if (!contained.contained) {
|
|
482
|
+
throw new ArtifactPathEscapeError(
|
|
483
|
+
stageId,
|
|
484
|
+
name,
|
|
485
|
+
`resolved path escapes the artifact store (${contained.reason})`
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
return { stageDir, artifactPath };
|
|
489
|
+
}
|
|
490
|
+
function validateArtifactIdentity(entry) {
|
|
491
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) return void 0;
|
|
492
|
+
const { stageId, name, type, size, createdAt } = entry;
|
|
493
|
+
if (typeof stageId !== "string" || findPathComponentViolation(stageId)) return void 0;
|
|
494
|
+
if (typeof name !== "string" || findPathComponentViolation(name)) return void 0;
|
|
495
|
+
if (!isStageOutputType(type)) return void 0;
|
|
496
|
+
if (typeof size !== "number" || !Number.isFinite(size) || size < 0) return void 0;
|
|
497
|
+
const created = parseStoredTimestamp(createdAt);
|
|
498
|
+
if (!created) return void 0;
|
|
499
|
+
return { stageId, name, type, size, createdAt: created };
|
|
500
|
+
}
|
|
501
|
+
function parsePersistedMetadata(content, basePath) {
|
|
502
|
+
const parsed = JSON.parse(content);
|
|
503
|
+
if (!Array.isArray(parsed)) {
|
|
504
|
+
throw new Error("artifact metadata is not an array");
|
|
505
|
+
}
|
|
506
|
+
const entries = /* @__PURE__ */ new Map();
|
|
507
|
+
let malformed = 0;
|
|
508
|
+
let uncontained = 0;
|
|
509
|
+
for (const raw of parsed) {
|
|
510
|
+
const identity = validateArtifactIdentity(raw);
|
|
511
|
+
if (!identity) {
|
|
512
|
+
malformed += 1;
|
|
513
|
+
continue;
|
|
514
|
+
}
|
|
515
|
+
let artifactPath;
|
|
516
|
+
try {
|
|
517
|
+
artifactPath = resolveArtifactWritePath(
|
|
518
|
+
basePath,
|
|
519
|
+
identity.stageId,
|
|
520
|
+
identity.name,
|
|
521
|
+
`${identity.name}.${ARTIFACT_EXTENSIONS[identity.type]}`
|
|
522
|
+
).artifactPath;
|
|
523
|
+
} catch {
|
|
524
|
+
uncontained += 1;
|
|
525
|
+
continue;
|
|
526
|
+
}
|
|
527
|
+
entries.set(`${identity.stageId}.${identity.name}`, {
|
|
528
|
+
stageId: identity.stageId,
|
|
529
|
+
name: identity.name,
|
|
530
|
+
type: identity.type,
|
|
531
|
+
path: artifactPath,
|
|
532
|
+
size: identity.size,
|
|
533
|
+
createdAt: identity.createdAt
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
return { entries, malformed, uncontained };
|
|
537
|
+
}
|
|
538
|
+
function containmentCandidate(root, candidate) {
|
|
539
|
+
const relative2 = path.relative(root, candidate);
|
|
540
|
+
if (relative2 === "" || relative2.startsWith("..") || path.isAbsolute(relative2)) {
|
|
541
|
+
return candidate;
|
|
542
|
+
}
|
|
543
|
+
return relative2;
|
|
544
|
+
}
|
|
545
|
+
async function acquireMetadataFileLock(lockTargetPath) {
|
|
546
|
+
if (isMetadataFileLockDisabled()) {
|
|
547
|
+
return async () => {
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
await fs.mkdir(path.dirname(lockTargetPath), { recursive: true });
|
|
551
|
+
try {
|
|
552
|
+
const handle = await fs.open(lockTargetPath, "a");
|
|
553
|
+
await handle.close();
|
|
554
|
+
} catch {
|
|
555
|
+
}
|
|
556
|
+
return lockfile.lock(lockTargetPath, {
|
|
557
|
+
stale: 3e4,
|
|
558
|
+
realpath: false,
|
|
559
|
+
retries: { retries: 200, minTimeout: 25, maxTimeout: 250, factor: 1.5 }
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
function parseArtifactRef(ref) {
|
|
563
|
+
const dotIndex = ref.indexOf(".");
|
|
564
|
+
if (dotIndex === -1 || dotIndex === 0 || dotIndex === ref.length - 1) {
|
|
565
|
+
throw new Error(
|
|
566
|
+
`Invalid artifact reference format: '${ref}'. Expected 'stageId.outputName' (e.g., 'p1-scan.assignment')`
|
|
567
|
+
);
|
|
568
|
+
}
|
|
569
|
+
return {
|
|
570
|
+
stageId: ref.slice(0, dotIndex),
|
|
571
|
+
outputName: ref.slice(dotIndex + 1)
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
var ArtifactStore = class {
|
|
575
|
+
workflowId;
|
|
576
|
+
basePath;
|
|
577
|
+
metadataPath;
|
|
578
|
+
metadata = /* @__PURE__ */ new Map();
|
|
579
|
+
initialized = false;
|
|
580
|
+
/**
|
|
581
|
+
* In-process promise-chain lock. Serialises concurrent save() calls on this
|
|
582
|
+
* instance so they do not race inside saveMetadata().
|
|
583
|
+
*/
|
|
584
|
+
metadataWriteLock = Promise.resolve();
|
|
585
|
+
constructor(workflowId) {
|
|
586
|
+
this.workflowId = workflowId;
|
|
587
|
+
this.basePath = path.join(getArtifactDir(workflowId), "artifacts");
|
|
588
|
+
this.metadataPath = path.join(this.basePath, "_metadata.json");
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Initialize the artifact store
|
|
592
|
+
*
|
|
593
|
+
* Creates the artifacts directory and loads existing metadata if present.
|
|
594
|
+
* Must be called before any save/load operations.
|
|
595
|
+
*
|
|
596
|
+
* Persisted metadata is treated as untrusted input: each entry's shape is
|
|
597
|
+
* validated and its filesystem path is re-derived from `stageId`/`name`/`type`
|
|
598
|
+
* against this store's current base path. A `path` field written into
|
|
599
|
+
* `_metadata.json` by anything other than this store is ignored, so it cannot
|
|
600
|
+
* redirect a later `load()` at a file outside the workflow. Entries whose
|
|
601
|
+
* re-derived file no longer exists simply fail `load()` through the existing
|
|
602
|
+
* ArtifactNotFoundError path.
|
|
603
|
+
*/
|
|
604
|
+
async initialize() {
|
|
605
|
+
if (this.initialized) return;
|
|
606
|
+
await fs.mkdir(this.basePath, { recursive: true });
|
|
607
|
+
try {
|
|
608
|
+
const metadataContent = await fs.readFile(this.metadataPath, "utf-8");
|
|
609
|
+
const { entries, malformed, uncontained } = parsePersistedMetadata(
|
|
610
|
+
metadataContent,
|
|
611
|
+
this.basePath
|
|
612
|
+
);
|
|
613
|
+
for (const [key, artifact] of entries) {
|
|
614
|
+
this.metadata.set(key, artifact);
|
|
615
|
+
}
|
|
616
|
+
if (malformed > 0) {
|
|
617
|
+
console.warn(`Warning: Skipped ${malformed} malformed artifact metadata entries`);
|
|
618
|
+
}
|
|
619
|
+
if (uncontained > 0) {
|
|
620
|
+
console.warn(
|
|
621
|
+
`Warning: Skipped ${uncontained} artifact metadata entries that resolve outside the artifact store`
|
|
622
|
+
);
|
|
623
|
+
}
|
|
624
|
+
} catch (error) {
|
|
625
|
+
if (error.code !== "ENOENT") {
|
|
626
|
+
console.warn(`Warning: Failed to load artifact metadata: ${error}`);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
this.initialized = true;
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* Save an artifact to the store
|
|
633
|
+
*
|
|
634
|
+
* @param stageId - ID of the stage producing the artifact
|
|
635
|
+
* @param name - Output name (from stage.outputs configuration)
|
|
636
|
+
* @param type - Artifact type (determines file extension and validation)
|
|
637
|
+
* @param content - Artifact content (string or object for JSON types)
|
|
638
|
+
* @returns Stored artifact metadata
|
|
639
|
+
*/
|
|
640
|
+
async save(stageId, name, type, content) {
|
|
641
|
+
this.ensureInitialized();
|
|
642
|
+
const extension = ARTIFACT_EXTENSIONS[type];
|
|
643
|
+
const filename = `${name}.${extension}`;
|
|
644
|
+
const { stageDir, artifactPath } = resolveArtifactWritePath(
|
|
645
|
+
this.basePath,
|
|
646
|
+
stageId,
|
|
647
|
+
name,
|
|
648
|
+
filename
|
|
649
|
+
);
|
|
650
|
+
await fs.mkdir(stageDir, { recursive: true });
|
|
651
|
+
let serializedContent;
|
|
652
|
+
if (type === "json" || type === "testResults") {
|
|
653
|
+
serializedContent = typeof content === "string" ? content : JSON.stringify(content, null, 2);
|
|
654
|
+
try {
|
|
655
|
+
JSON.parse(serializedContent);
|
|
656
|
+
} catch {
|
|
657
|
+
throw new ArtifactValidationError(
|
|
658
|
+
`${stageId}.${name}`,
|
|
659
|
+
`Content is not valid JSON: ${serializedContent.slice(0, 100)}...`
|
|
660
|
+
);
|
|
661
|
+
}
|
|
662
|
+
} else {
|
|
663
|
+
serializedContent = typeof content === "string" ? content : JSON.stringify(content);
|
|
664
|
+
}
|
|
665
|
+
await writeFileWithParentRetry(artifactPath, serializedContent);
|
|
666
|
+
const artifact = {
|
|
667
|
+
stageId,
|
|
668
|
+
name,
|
|
669
|
+
type,
|
|
670
|
+
path: artifactPath,
|
|
671
|
+
size: Buffer.byteLength(serializedContent, "utf-8"),
|
|
672
|
+
createdAt: /* @__PURE__ */ new Date()
|
|
673
|
+
};
|
|
674
|
+
const key = `${stageId}.${name}`;
|
|
675
|
+
this.metadata.set(key, artifact);
|
|
676
|
+
await this.saveMetadata(key, artifact);
|
|
677
|
+
return artifact;
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Load an artifact from the store
|
|
681
|
+
*
|
|
682
|
+
* @param ref - Artifact reference in format 'stageId.outputName'
|
|
683
|
+
* @param requestingStageId - ID of the stage requesting the artifact (for error messages)
|
|
684
|
+
* @returns Artifact content as string
|
|
685
|
+
* @throws ArtifactNotFoundError if artifact doesn't exist or escapes the store root
|
|
686
|
+
*/
|
|
687
|
+
async load(ref, requestingStageId) {
|
|
688
|
+
this.ensureInitialized();
|
|
689
|
+
const { stageId, outputName } = parseArtifactRef(ref);
|
|
690
|
+
const key = `${stageId}.${outputName}`;
|
|
691
|
+
const artifact = this.metadata.get(key);
|
|
692
|
+
if (!artifact) {
|
|
693
|
+
throw new ArtifactNotFoundError(
|
|
694
|
+
ref,
|
|
695
|
+
requestingStageId ?? "unknown",
|
|
696
|
+
`No artifact found for reference '${ref}'. Available artifacts: [${Array.from(this.metadata.keys()).join(", ") || "none"}]`
|
|
697
|
+
);
|
|
698
|
+
}
|
|
699
|
+
const containment = resolveContainedPath(
|
|
700
|
+
this.basePath,
|
|
701
|
+
containmentCandidate(this.basePath, artifact.path)
|
|
702
|
+
);
|
|
703
|
+
if (!containment.contained) {
|
|
704
|
+
throw new ArtifactNotFoundError(
|
|
705
|
+
ref,
|
|
706
|
+
requestingStageId ?? "unknown",
|
|
707
|
+
`Artifact path escapes the workflow artifact directory (${containment.reason}).`
|
|
708
|
+
);
|
|
709
|
+
}
|
|
710
|
+
try {
|
|
711
|
+
return await fs.readFile(containment.canonicalPath, "utf-8");
|
|
712
|
+
} catch (_error) {
|
|
713
|
+
throw new ArtifactNotFoundError(
|
|
714
|
+
ref,
|
|
715
|
+
requestingStageId ?? "unknown",
|
|
716
|
+
`Artifact file not found at '${artifact.path}'. The file may have been deleted.`
|
|
717
|
+
);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
/**
|
|
721
|
+
* Load an artifact and parse as JSON
|
|
722
|
+
*
|
|
723
|
+
* @param ref - Artifact reference
|
|
724
|
+
* @param requestingStageId - ID of the stage requesting the artifact
|
|
725
|
+
* @returns Parsed JSON content
|
|
726
|
+
*/
|
|
727
|
+
async loadJson(ref, requestingStageId) {
|
|
728
|
+
const content = await this.load(ref, requestingStageId);
|
|
729
|
+
try {
|
|
730
|
+
return JSON.parse(content);
|
|
731
|
+
} catch {
|
|
732
|
+
throw new ArtifactValidationError(ref, "Artifact content is not valid JSON");
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
/**
|
|
736
|
+
* Check if an artifact exists
|
|
737
|
+
*
|
|
738
|
+
* @param ref - Artifact reference
|
|
739
|
+
* @returns true if artifact exists
|
|
740
|
+
*/
|
|
741
|
+
has(ref) {
|
|
742
|
+
this.ensureInitialized();
|
|
743
|
+
const { stageId, outputName } = parseArtifactRef(ref);
|
|
744
|
+
return this.metadata.has(`${stageId}.${outputName}`);
|
|
745
|
+
}
|
|
746
|
+
/**
|
|
747
|
+
* Get metadata for an artifact
|
|
748
|
+
*
|
|
749
|
+
* @param ref - Artifact reference
|
|
750
|
+
* @returns Artifact metadata or undefined if not found
|
|
751
|
+
*/
|
|
752
|
+
getMetadata(ref) {
|
|
753
|
+
this.ensureInitialized();
|
|
754
|
+
const { stageId, outputName } = parseArtifactRef(ref);
|
|
755
|
+
return this.metadata.get(`${stageId}.${outputName}`);
|
|
756
|
+
}
|
|
757
|
+
/**
|
|
758
|
+
* List all artifacts in the store
|
|
759
|
+
*
|
|
760
|
+
* @returns Array of all stored artifact metadata
|
|
761
|
+
*/
|
|
762
|
+
list() {
|
|
763
|
+
this.ensureInitialized();
|
|
764
|
+
return Array.from(this.metadata.values());
|
|
765
|
+
}
|
|
766
|
+
/**
|
|
767
|
+
* List artifacts for a specific stage
|
|
768
|
+
*
|
|
769
|
+
* @param stageId - Stage ID to filter by
|
|
770
|
+
* @returns Array of artifacts from the specified stage
|
|
771
|
+
*/
|
|
772
|
+
listByStage(stageId) {
|
|
773
|
+
this.ensureInitialized();
|
|
774
|
+
return Array.from(this.metadata.values()).filter((a) => a.stageId === stageId);
|
|
775
|
+
}
|
|
776
|
+
/**
|
|
777
|
+
* Resolve multiple artifact inputs and format for prompt injection
|
|
778
|
+
*
|
|
779
|
+
* @param inputs - Array of artifact references
|
|
780
|
+
* @param requestingStageId - ID of the stage requesting the artifacts
|
|
781
|
+
* @returns Formatted string with all artifact contents
|
|
782
|
+
*/
|
|
783
|
+
async resolveInputs(inputs, requestingStageId) {
|
|
784
|
+
if (!inputs || inputs.length === 0) {
|
|
785
|
+
return "";
|
|
786
|
+
}
|
|
787
|
+
const resolvedArtifacts = [];
|
|
788
|
+
for (const ref of inputs) {
|
|
789
|
+
const content = await this.load(ref, requestingStageId);
|
|
790
|
+
const metadata = this.getMetadata(ref);
|
|
791
|
+
const header = `--- Artifact: ${ref} (${metadata?.type ?? "unknown"}) ---`;
|
|
792
|
+
resolvedArtifacts.push(`${header}
|
|
793
|
+
${content}
|
|
794
|
+
`);
|
|
795
|
+
}
|
|
796
|
+
return resolvedArtifacts.join("\n");
|
|
797
|
+
}
|
|
798
|
+
/**
|
|
799
|
+
* Get the base path for this store
|
|
800
|
+
*/
|
|
801
|
+
getBasePath() {
|
|
802
|
+
return this.basePath;
|
|
803
|
+
}
|
|
804
|
+
/**
|
|
805
|
+
* Get the workflow ID
|
|
806
|
+
*/
|
|
807
|
+
getWorkflowId() {
|
|
808
|
+
return this.workflowId;
|
|
809
|
+
}
|
|
810
|
+
/**
|
|
811
|
+
* Ensure store is initialized
|
|
812
|
+
*/
|
|
813
|
+
ensureInitialized() {
|
|
814
|
+
if (!this.initialized) {
|
|
815
|
+
throw new Error("ArtifactStore not initialized. Call initialize() before using the store.");
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
/**
|
|
819
|
+
* Persist a single new or updated artifact entry to _metadata.json.
|
|
820
|
+
*
|
|
821
|
+
* Correctness guarantees:
|
|
822
|
+
* 1. In-process serialisation: chained onto metadataWriteLock so rapid
|
|
823
|
+
* concurrent save() calls on this instance are sequenced.
|
|
824
|
+
* 2. Cross-process serialisation: acquires a proper-lockfile exclusive lock
|
|
825
|
+
* on the metadata file before performing the read-merge-write cycle so
|
|
826
|
+
* concurrent saves from parallel stages in the same or separate processes
|
|
827
|
+
* cannot overwrite each other's entries.
|
|
828
|
+
* 3. Read-merge-write under lock: re-reads _metadata.json from disk while
|
|
829
|
+
* holding the lock, merges the new entry into the on-disk state, then
|
|
830
|
+
* writes back. This prevents the snapshot-then-write problem where a
|
|
831
|
+
* concurrent writer's entries are clobbered by an older in-memory snapshot.
|
|
832
|
+
* 4. Crash safety: uses atomicWriteJson (temp + rename) so a mid-write crash
|
|
833
|
+
* cannot leave a partially-written metadata file.
|
|
834
|
+
*
|
|
835
|
+
* @param newKey - The metadata map key for the entry just written (stageId.name)
|
|
836
|
+
* @param newArtifact - The artifact metadata to persist
|
|
837
|
+
*/
|
|
838
|
+
saveMetadata(newKey, newArtifact) {
|
|
839
|
+
this.metadataWriteLock = this.metadataWriteLock.catch(() => {
|
|
840
|
+
}).then(async () => {
|
|
841
|
+
let releaseFileLock;
|
|
842
|
+
try {
|
|
843
|
+
releaseFileLock = await acquireMetadataFileLock(this.metadataPath);
|
|
844
|
+
let onDisk = /* @__PURE__ */ new Map();
|
|
845
|
+
try {
|
|
846
|
+
const raw = await fs.readFile(this.metadataPath, "utf-8");
|
|
847
|
+
onDisk = parsePersistedMetadata(raw, this.basePath).entries;
|
|
848
|
+
} catch (err) {
|
|
849
|
+
if (err.code !== "ENOENT") {
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
const merged = new Map(onDisk);
|
|
853
|
+
for (const [k, v] of this.metadata) {
|
|
854
|
+
merged.set(k, v);
|
|
855
|
+
}
|
|
856
|
+
merged.set(newKey, newArtifact);
|
|
857
|
+
for (const [k, v] of merged) {
|
|
858
|
+
this.metadata.set(k, v);
|
|
859
|
+
}
|
|
860
|
+
await atomicWriteJson(this.metadataPath, Array.from(merged.values()));
|
|
861
|
+
} finally {
|
|
862
|
+
if (releaseFileLock) {
|
|
863
|
+
try {
|
|
864
|
+
await releaseFileLock();
|
|
865
|
+
} catch {
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
});
|
|
870
|
+
return this.metadataWriteLock;
|
|
871
|
+
}
|
|
872
|
+
};
|
|
873
|
+
async function resolvePromptArtifacts(prompt, inputs, store, stageId, securityBoundary) {
|
|
874
|
+
const boundary = securityBoundary ?? createSecurityBoundary(store.getWorkflowId());
|
|
875
|
+
let resolvedPrompt = prompt;
|
|
876
|
+
const placeholderPattern = /\{\{artifact:([^}]+)\}\}/g;
|
|
877
|
+
const matches = [...prompt.matchAll(placeholderPattern)];
|
|
878
|
+
for (const match of matches) {
|
|
879
|
+
const ref = match[1] ?? "";
|
|
880
|
+
let content = await store.load(ref, stageId);
|
|
881
|
+
content = await boundary.sanitizeForPromptInjection(content, "stage-output", stageId);
|
|
882
|
+
resolvedPrompt = resolvedPrompt.split(match[0]).join(content);
|
|
883
|
+
}
|
|
884
|
+
if (inputs && inputs.length > 0) {
|
|
885
|
+
let inputsContext = await store.resolveInputs(inputs, stageId);
|
|
886
|
+
if (inputsContext) {
|
|
887
|
+
inputsContext = await boundary.sanitizeForPromptInjection(
|
|
888
|
+
inputsContext,
|
|
889
|
+
"stage-output",
|
|
890
|
+
stageId
|
|
891
|
+
);
|
|
892
|
+
}
|
|
893
|
+
if (inputsContext) {
|
|
894
|
+
resolvedPrompt = `## Input Artifacts
|
|
895
|
+
|
|
896
|
+
${inputsContext}
|
|
897
|
+
|
|
898
|
+
## Task
|
|
899
|
+
|
|
900
|
+
${resolvedPrompt}`;
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
return resolvedPrompt;
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
// src/automation/flywheel-types.ts
|
|
907
|
+
function normalizeWorkflowJudgeTypeToken(token) {
|
|
908
|
+
const normalized = token.trim().toLowerCase();
|
|
909
|
+
if (normalized === "ai") return "ai";
|
|
910
|
+
if (normalized === "multi-lens" || normalized === "hybrid") return "multi-lens";
|
|
911
|
+
if (normalized === "multi-agent" || normalized === "agentic") return "multi-agent";
|
|
912
|
+
return null;
|
|
913
|
+
}
|
|
914
|
+
function deriveAiJudgeInvocationArgs(judgeConfig) {
|
|
915
|
+
if (judgeConfig?.judgeRun !== void 0) {
|
|
916
|
+
const runSet = dedupeWorkflowJudgeRunSet(judgeConfig.judgeRun);
|
|
917
|
+
const aiJudgePrimary2 = judgeConfig.judgePrimary ? normalizeWorkflowJudgeTypeToken(judgeConfig.judgePrimary) ?? runSet[0] ?? "ai" : runSet[0] ?? "ai";
|
|
918
|
+
const aiJudgeRun2 = runSet.join(",");
|
|
919
|
+
return { aiJudgeRun: aiJudgeRun2, aiJudgePrimary: aiJudgePrimary2, judgeRunRequested: runSet };
|
|
920
|
+
}
|
|
921
|
+
const judgeType = judgeConfig?.type ?? "ai";
|
|
922
|
+
const runComparison = judgeConfig?.runComparison === true;
|
|
923
|
+
const aiJudgeRun = runComparison ? judgeType === "ai" ? "ai,multi-lens" : "multi-lens" : void 0;
|
|
924
|
+
const aiJudgePrimary = !runComparison ? judgeType : judgeType === "multi-lens" ? "multi-lens" : "ai";
|
|
925
|
+
const judgeRunRequested = aiJudgeRun ? aiJudgeRun.split(",") : void 0;
|
|
926
|
+
return { aiJudgeRun, aiJudgePrimary, judgeRunRequested };
|
|
927
|
+
}
|
|
928
|
+
function dedupeWorkflowJudgeRunSet(judgeRun) {
|
|
929
|
+
const seen = /* @__PURE__ */ new Set();
|
|
930
|
+
const result = [];
|
|
931
|
+
for (const entry of judgeRun) {
|
|
932
|
+
const normalized = normalizeWorkflowJudgeTypeToken(entry);
|
|
933
|
+
if (normalized && !seen.has(normalized)) {
|
|
934
|
+
seen.add(normalized);
|
|
935
|
+
result.push(normalized);
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
return result;
|
|
939
|
+
}
|
|
940
|
+
function validateCompetitionJudgeConfig(stageId, judgeConfig) {
|
|
941
|
+
if (!judgeConfig) {
|
|
942
|
+
return { valid: true };
|
|
943
|
+
}
|
|
944
|
+
const errors = [];
|
|
945
|
+
if (judgeConfig.matrixAuthority !== void 0) {
|
|
946
|
+
if (judgeConfig.matrixAuthority !== "automatic" && judgeConfig.matrixAuthority !== "off" && judgeConfig.matrixAuthority !== "advisory") {
|
|
947
|
+
errors.push(
|
|
948
|
+
`Stage '${stageId}' competition.judgeConfig.matrixAuthority must be 'automatic', 'off', or 'advisory' (got '${String(judgeConfig.matrixAuthority)}')`
|
|
949
|
+
);
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
if (judgeConfig.judgeRun !== void 0) {
|
|
953
|
+
if (!Array.isArray(judgeConfig.judgeRun) || judgeConfig.judgeRun.length === 0) {
|
|
954
|
+
errors.push(
|
|
955
|
+
`Stage '${stageId}' competition.judgeConfig.judgeRun must be a non-empty string[]`
|
|
956
|
+
);
|
|
957
|
+
} else {
|
|
958
|
+
for (const [idx, entry] of judgeConfig.judgeRun.entries()) {
|
|
959
|
+
if (typeof entry !== "string" || entry.trim().length === 0) {
|
|
960
|
+
errors.push(
|
|
961
|
+
`Stage '${stageId}' competition.judgeConfig.judgeRun[${idx}] must be a non-empty string`
|
|
962
|
+
);
|
|
963
|
+
continue;
|
|
964
|
+
}
|
|
965
|
+
if (normalizeWorkflowJudgeTypeToken(entry) === null) {
|
|
966
|
+
errors.push(
|
|
967
|
+
`Stage '${stageId}' competition.judgeConfig.judgeRun[${idx}] has unknown judge id '${entry}'. Valid ids: ai, multi-lens, multi-agent (aliases: hybrid, agentic)`
|
|
968
|
+
);
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
if (judgeConfig.runComparison !== void 0) {
|
|
973
|
+
errors.push(
|
|
974
|
+
`Stage '${stageId}' competition.judgeConfig cannot set both judgeRun and runComparison; remove runComparison when judgeRun is present`
|
|
975
|
+
);
|
|
976
|
+
}
|
|
977
|
+
const normalizedRunSet = dedupeWorkflowJudgeRunSet(judgeConfig.judgeRun ?? []);
|
|
978
|
+
if (judgeConfig.judgePrimary !== void 0) {
|
|
979
|
+
if (typeof judgeConfig.judgePrimary !== "string" || judgeConfig.judgePrimary.trim().length === 0) {
|
|
980
|
+
errors.push(
|
|
981
|
+
`Stage '${stageId}' competition.judgeConfig.judgePrimary must be a non-empty string when provided`
|
|
982
|
+
);
|
|
983
|
+
} else if (normalizeWorkflowJudgeTypeToken(judgeConfig.judgePrimary) === null) {
|
|
984
|
+
errors.push(
|
|
985
|
+
`Stage '${stageId}' competition.judgeConfig.judgePrimary has unknown judge id '${judgeConfig.judgePrimary}'. Valid ids: ai, multi-lens, multi-agent (aliases: hybrid, agentic)`
|
|
986
|
+
);
|
|
987
|
+
} else {
|
|
988
|
+
const normalizedPrimary = normalizeWorkflowJudgeTypeToken(judgeConfig.judgePrimary);
|
|
989
|
+
if (!normalizedRunSet.includes(normalizedPrimary)) {
|
|
990
|
+
errors.push(
|
|
991
|
+
`Stage '${stageId}' competition.judgeConfig.judgePrimary '${judgeConfig.judgePrimary}' must be a member of judgeRun [${normalizedRunSet.join(", ")}]`
|
|
992
|
+
);
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
} else if (judgeConfig.judgePrimary !== void 0) {
|
|
997
|
+
errors.push(
|
|
998
|
+
`Stage '${stageId}' competition.judgeConfig.judgePrimary requires judgeRun to be set`
|
|
999
|
+
);
|
|
1000
|
+
}
|
|
1001
|
+
if (errors.length > 0) {
|
|
1002
|
+
return { valid: false, error: errors.join("; ") };
|
|
1003
|
+
}
|
|
1004
|
+
return { valid: true };
|
|
1005
|
+
}
|
|
1006
|
+
function hasStageType(result, stageType) {
|
|
1007
|
+
return result.stageType === stageType;
|
|
1008
|
+
}
|
|
1009
|
+
function isVerifyStageResult(result) {
|
|
1010
|
+
return hasStageType(result, "verify");
|
|
1011
|
+
}
|
|
1012
|
+
function isCompetitionStageResult(result) {
|
|
1013
|
+
return hasStageType(result, "competition");
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
export {
|
|
1017
|
+
createSecurityBoundary,
|
|
1018
|
+
ArtifactNotFoundError,
|
|
1019
|
+
parseArtifactRef,
|
|
1020
|
+
ArtifactStore,
|
|
1021
|
+
resolvePromptArtifacts,
|
|
1022
|
+
deriveAiJudgeInvocationArgs,
|
|
1023
|
+
validateCompetitionJudgeConfig,
|
|
1024
|
+
isVerifyStageResult,
|
|
1025
|
+
isCompetitionStageResult
|
|
1026
|
+
};
|
|
1027
|
+
//# sourceMappingURL=chunk-4HN6DF7V.js.map
|