@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,1597 @@
|
|
|
1
|
+
import {
|
|
2
|
+
OptimizationConfigManager
|
|
3
|
+
} from "./chunk-7FMJVYBS.js";
|
|
4
|
+
import {
|
|
5
|
+
PromptVersionStore
|
|
6
|
+
} from "./chunk-LR5IJIGV.js";
|
|
7
|
+
import {
|
|
8
|
+
ExecutionTracker
|
|
9
|
+
} from "./chunk-U45RTRGY.js";
|
|
10
|
+
import {
|
|
11
|
+
AutoTuningEngine,
|
|
12
|
+
AutomaticPromptOptimizer,
|
|
13
|
+
ProviderTracker,
|
|
14
|
+
TunerActivationAuthority
|
|
15
|
+
} from "./chunk-7MMLMXO6.js";
|
|
16
|
+
import {
|
|
17
|
+
VariantGenerator
|
|
18
|
+
} from "./chunk-Q3WIC6GQ.js";
|
|
19
|
+
import "./chunk-OQ6K46CK.js";
|
|
20
|
+
import "./chunk-6BM72ZMG.js";
|
|
21
|
+
import "./chunk-3AOKYKA7.js";
|
|
22
|
+
import "./chunk-7QCZSLBH.js";
|
|
23
|
+
import "./chunk-VXF4Q3FW.js";
|
|
24
|
+
import "./chunk-6Y5TWI7H.js";
|
|
25
|
+
import {
|
|
26
|
+
resolveDefaultProvider
|
|
27
|
+
} from "./chunk-XPU2XADL.js";
|
|
28
|
+
import "./chunk-AURFMVCD.js";
|
|
29
|
+
import "./chunk-VBNCKCCI.js";
|
|
30
|
+
import "./chunk-SZ7DL357.js";
|
|
31
|
+
import "./chunk-4VJITV4P.js";
|
|
32
|
+
import "./chunk-SURZ2WFE.js";
|
|
33
|
+
import "./chunk-SP3LFU6B.js";
|
|
34
|
+
import "./chunk-R4UWBC35.js";
|
|
35
|
+
import {
|
|
36
|
+
TelemetryLogger
|
|
37
|
+
} from "./chunk-CKNX3TTP.js";
|
|
38
|
+
import "./chunk-FYOILAN5.js";
|
|
39
|
+
import "./chunk-J62KPGII.js";
|
|
40
|
+
import "./chunk-XAONGNST.js";
|
|
41
|
+
import "./chunk-GAFJEYLK.js";
|
|
42
|
+
import "./chunk-H6G7QRMQ.js";
|
|
43
|
+
import "./chunk-J6P3FWWW.js";
|
|
44
|
+
import "./chunk-CP7H3HSP.js";
|
|
45
|
+
import "./chunk-ETYDXCK7.js";
|
|
46
|
+
import "./chunk-BSE4R6XD.js";
|
|
47
|
+
import "./chunk-UR2IBGIM.js";
|
|
48
|
+
import "./chunk-JSWMRQYG.js";
|
|
49
|
+
import "./chunk-XGYF2QMZ.js";
|
|
50
|
+
import "./chunk-72YTZMAM.js";
|
|
51
|
+
import "./chunk-S2VQCZO4.js";
|
|
52
|
+
import "./chunk-WMPU2UOV.js";
|
|
53
|
+
import "./chunk-VX3UMWB7.js";
|
|
54
|
+
import "./chunk-XT2ZQVTC.js";
|
|
55
|
+
import "./chunk-YGXKOBQQ.js";
|
|
56
|
+
import "./chunk-V72RMBM4.js";
|
|
57
|
+
import "./chunk-ZDTGECTN.js";
|
|
58
|
+
import "./chunk-G36W2T2S.js";
|
|
59
|
+
import "./chunk-GKN3HMN4.js";
|
|
60
|
+
import "./chunk-QVZMFDYG.js";
|
|
61
|
+
import "./chunk-S54MKU6V.js";
|
|
62
|
+
import "./chunk-3S62LLWJ.js";
|
|
63
|
+
import "./chunk-45FPSA3B.js";
|
|
64
|
+
import "./chunk-YMX76IOS.js";
|
|
65
|
+
import "./chunk-6Y5U7UFY.js";
|
|
66
|
+
import "./chunk-XV7NZL4B.js";
|
|
67
|
+
import "./chunk-CD7ISXA4.js";
|
|
68
|
+
import "./chunk-QGJDMEOV.js";
|
|
69
|
+
import "./chunk-5WCQRDRB.js";
|
|
70
|
+
import "./chunk-C57KJOUQ.js";
|
|
71
|
+
import "./chunk-DF5SLDE4.js";
|
|
72
|
+
import "./chunk-TGON4N4O.js";
|
|
73
|
+
import "./chunk-I5WRT7ZR.js";
|
|
74
|
+
import "./chunk-A3YGID55.js";
|
|
75
|
+
import "./chunk-5EERLVZB.js";
|
|
76
|
+
import "./chunk-XQD2B6BB.js";
|
|
77
|
+
import "./chunk-34CNP2HB.js";
|
|
78
|
+
import "./chunk-KNDYMVWN.js";
|
|
79
|
+
import "./chunk-RWREC3KJ.js";
|
|
80
|
+
import "./chunk-LAMKBTXX.js";
|
|
81
|
+
import "./chunk-FD4ERYEG.js";
|
|
82
|
+
import "./chunk-KTMW65UX.js";
|
|
83
|
+
import "./chunk-FHOWVDF5.js";
|
|
84
|
+
import "./chunk-UDMS5AD3.js";
|
|
85
|
+
import "./chunk-MWHLBPNU.js";
|
|
86
|
+
import "./chunk-JLS65NUQ.js";
|
|
87
|
+
import "./chunk-TRSVUPCX.js";
|
|
88
|
+
import "./chunk-FKAUPHMR.js";
|
|
89
|
+
import "./chunk-TSXGRLPR.js";
|
|
90
|
+
import "./chunk-LUVKFFWR.js";
|
|
91
|
+
import "./chunk-ENRGKNR5.js";
|
|
92
|
+
import "./chunk-XB5YLCLB.js";
|
|
93
|
+
import "./chunk-QOCOVLUH.js";
|
|
94
|
+
import "./chunk-2VSQMRCB.js";
|
|
95
|
+
import "./chunk-ON3G73BU.js";
|
|
96
|
+
import "./chunk-3G6FZCRF.js";
|
|
97
|
+
import "./chunk-N5DX4JAK.js";
|
|
98
|
+
import "./chunk-2QLYTVYX.js";
|
|
99
|
+
import "./chunk-7GDRQBQC.js";
|
|
100
|
+
import "./chunk-PGSPX4SU.js";
|
|
101
|
+
import "./chunk-AT4TNPWW.js";
|
|
102
|
+
import "./chunk-GSGD5E4C.js";
|
|
103
|
+
import {
|
|
104
|
+
resolvePoeticDirFromContext
|
|
105
|
+
} from "./chunk-UI2F6DJ5.js";
|
|
106
|
+
import "./chunk-4BTDUT2S.js";
|
|
107
|
+
import "./chunk-L6OM4A22.js";
|
|
108
|
+
import "./chunk-G4THLFV3.js";
|
|
109
|
+
import "./chunk-RGWHUI5E.js";
|
|
110
|
+
import "./chunk-UUH2RVKS.js";
|
|
111
|
+
import "./chunk-LEIIWPWQ.js";
|
|
112
|
+
import "./chunk-L7JZLXQL.js";
|
|
113
|
+
import "./chunk-IZYIQQ7X.js";
|
|
114
|
+
import "./chunk-JPKSXKNB.js";
|
|
115
|
+
import "./chunk-TAJPCXSB.js";
|
|
116
|
+
import "./chunk-XZE4XARH.js";
|
|
117
|
+
import {
|
|
118
|
+
emitWarning
|
|
119
|
+
} from "./chunk-EJGCZGUF.js";
|
|
120
|
+
import "./chunk-LPITVM7M.js";
|
|
121
|
+
import "./chunk-5DLKYTQX.js";
|
|
122
|
+
import "./chunk-PZ5AY32C.js";
|
|
123
|
+
|
|
124
|
+
// src/core/optimization/OptimizationEngine.ts
|
|
125
|
+
import crypto from "crypto";
|
|
126
|
+
import * as fs from "fs";
|
|
127
|
+
import * as path from "path";
|
|
128
|
+
|
|
129
|
+
// src/core/optimization/CompetitionRunner.ts
|
|
130
|
+
var NoopCompetitionRunner = class {
|
|
131
|
+
async run(context) {
|
|
132
|
+
return {
|
|
133
|
+
status: "deferred",
|
|
134
|
+
candidatesAttempted: context.candidates.length,
|
|
135
|
+
candidatesCompleted: 0,
|
|
136
|
+
errors: [],
|
|
137
|
+
warnings: []
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// src/core/optimization/OptimizationRecommendationAdapter.ts
|
|
143
|
+
var OptimizationRecommendationAdapter = class {
|
|
144
|
+
constructor(promptStore, executionTracker, autoOptimizer) {
|
|
145
|
+
this.promptStore = promptStore;
|
|
146
|
+
this.executionTracker = executionTracker;
|
|
147
|
+
this.autoOptimizer = autoOptimizer;
|
|
148
|
+
}
|
|
149
|
+
promptStore;
|
|
150
|
+
executionTracker;
|
|
151
|
+
autoOptimizer;
|
|
152
|
+
/**
|
|
153
|
+
* Check if prompt is ready for optimization
|
|
154
|
+
*
|
|
155
|
+
* @param promptId - Prompt to check
|
|
156
|
+
* @param versionId - Version to check
|
|
157
|
+
* @returns Readiness status with recommendation
|
|
158
|
+
*/
|
|
159
|
+
async isReadyForOptimization(promptId, versionId) {
|
|
160
|
+
const metrics = this.executionTracker.getMetrics(promptId, versionId);
|
|
161
|
+
const MIN_EXECUTIONS = 10;
|
|
162
|
+
if (!metrics || metrics.totalExecutions < MIN_EXECUTIONS) {
|
|
163
|
+
return {
|
|
164
|
+
ready: false,
|
|
165
|
+
reason: `Need ${MIN_EXECUTIONS - (metrics?.totalExecutions || 0)} more executions`,
|
|
166
|
+
recommendation: "wait_for_data",
|
|
167
|
+
executionCount: metrics?.totalExecutions || 0,
|
|
168
|
+
avgQuality: metrics?.avgCompleteness || 0,
|
|
169
|
+
confidence: 0
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
const recommendation = await this.autoOptimizer.analyzePrompt(promptId);
|
|
174
|
+
return {
|
|
175
|
+
ready: recommendation.action === "generate_variants" || recommendation.action === "activate_existing",
|
|
176
|
+
reason: recommendation.rationale,
|
|
177
|
+
recommendation: this.mapAction(recommendation.action),
|
|
178
|
+
executionCount: metrics.totalExecutions,
|
|
179
|
+
avgQuality: recommendation.currentPerformance.avgCompleteness,
|
|
180
|
+
confidence: recommendation.confidence
|
|
181
|
+
};
|
|
182
|
+
} catch (error) {
|
|
183
|
+
emitWarning(
|
|
184
|
+
"PR-001",
|
|
185
|
+
{
|
|
186
|
+
taskId: promptId,
|
|
187
|
+
subsystem: "optimization",
|
|
188
|
+
executionPhase: "execution"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
severity: "ERROR" /* ERROR */,
|
|
192
|
+
metadata: {
|
|
193
|
+
error: error.message,
|
|
194
|
+
versionId,
|
|
195
|
+
operation: "autoOptimizerAnalysis"
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
return {
|
|
200
|
+
ready: false,
|
|
201
|
+
reason: `Analysis failed: ${error.message}`,
|
|
202
|
+
recommendation: "no_action",
|
|
203
|
+
executionCount: metrics.totalExecutions,
|
|
204
|
+
avgQuality: metrics.avgCompleteness,
|
|
205
|
+
confidence: 0
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Analyze prompt and get optimization recommendations
|
|
211
|
+
*
|
|
212
|
+
* @param promptId - Prompt to analyze
|
|
213
|
+
* @returns Full optimization recommendation
|
|
214
|
+
* @throws Error if prompt not found
|
|
215
|
+
* @throws Error if insufficient data
|
|
216
|
+
*/
|
|
217
|
+
async analyze(promptId) {
|
|
218
|
+
const prompt = await this.promptStore.getPrompt(promptId);
|
|
219
|
+
if (!prompt) {
|
|
220
|
+
throw new Error(`Prompt ${promptId} not found`);
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
return await this.autoOptimizer.analyzePrompt(promptId);
|
|
224
|
+
} catch (error) {
|
|
225
|
+
throw new Error(`Failed to analyze prompt: ${error.message}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get the best performing version for a prompt
|
|
230
|
+
*
|
|
231
|
+
* @param promptId - Prompt to analyze
|
|
232
|
+
* @returns Best version ID with rationale
|
|
233
|
+
* @throws Error if no versions with sufficient data
|
|
234
|
+
*/
|
|
235
|
+
async recommendBestVersion(promptId) {
|
|
236
|
+
try {
|
|
237
|
+
const recommendation = await this.analyze(promptId);
|
|
238
|
+
if (recommendation.action === "activate_existing") {
|
|
239
|
+
const bestVariant = recommendation.proposedVariants[0];
|
|
240
|
+
if (bestVariant) {
|
|
241
|
+
return {
|
|
242
|
+
recommendedVersion: bestVariant.variantId,
|
|
243
|
+
rationale: `Better performing version found: ${bestVariant.description}`,
|
|
244
|
+
confidence: recommendation.confidence,
|
|
245
|
+
improvementPercentage: recommendation.estimatedImpact.completenessImprovement
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
recommendedVersion: recommendation.currentVersionId,
|
|
251
|
+
rationale: "Current version performs optimally",
|
|
252
|
+
confidence: recommendation.confidence
|
|
253
|
+
};
|
|
254
|
+
} catch (error) {
|
|
255
|
+
throw new Error(`Failed to recommend best version: ${error.message}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get optimization recommendation for a prompt
|
|
260
|
+
*
|
|
261
|
+
* Returns null if prompt has insufficient data. Throws on unexpected errors.
|
|
262
|
+
* Used by OptimizationEngine.analyze() for read-only analysis.
|
|
263
|
+
*
|
|
264
|
+
* @param promptId - Prompt to get recommendation for
|
|
265
|
+
* @returns Optimization recommendation or null if insufficient data
|
|
266
|
+
* @throws Error on unexpected failures (not data insufficiency)
|
|
267
|
+
*/
|
|
268
|
+
async getRecommendation(promptId) {
|
|
269
|
+
try {
|
|
270
|
+
return await this.analyze(promptId);
|
|
271
|
+
} catch (error) {
|
|
272
|
+
const message = error.message || "";
|
|
273
|
+
const normalized = message.toLowerCase();
|
|
274
|
+
const isExpectedError = normalized.includes("insufficient") || normalized.includes("no execution metrics") || normalized.includes("more executions") || normalized.includes("no performance data") || normalized.includes("prompt") && normalized.includes("not found");
|
|
275
|
+
if (isExpectedError) {
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get optimization suggestions without full analysis
|
|
283
|
+
*
|
|
284
|
+
* Lighter-weight than full analyze()
|
|
285
|
+
*/
|
|
286
|
+
async getSuggestions(promptId) {
|
|
287
|
+
try {
|
|
288
|
+
const recommendation = await this.analyze(promptId);
|
|
289
|
+
return recommendation.suggestions.map((s) => s.description);
|
|
290
|
+
} catch (error) {
|
|
291
|
+
emitWarning(
|
|
292
|
+
"PR-001",
|
|
293
|
+
{
|
|
294
|
+
taskId: promptId,
|
|
295
|
+
subsystem: "optimization",
|
|
296
|
+
executionPhase: "execution"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
severity: "WARN" /* WARN */,
|
|
300
|
+
metadata: {
|
|
301
|
+
error: error.message,
|
|
302
|
+
operation: "getSuggestions"
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
);
|
|
306
|
+
return [];
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Map AutoOptimizer action to our recommendation type
|
|
311
|
+
*/
|
|
312
|
+
mapAction(action) {
|
|
313
|
+
switch (action) {
|
|
314
|
+
case "generate_variants":
|
|
315
|
+
case "activate_existing":
|
|
316
|
+
return "optimize_now";
|
|
317
|
+
case "needs_more_data":
|
|
318
|
+
return "wait_for_data";
|
|
319
|
+
case "no_action":
|
|
320
|
+
return "no_action";
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Close resources
|
|
325
|
+
*/
|
|
326
|
+
close() {
|
|
327
|
+
this.autoOptimizer.close();
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
// src/core/optimization/PromptVariantGenerator.ts
|
|
332
|
+
var PromptVariantGenerator = class {
|
|
333
|
+
constructor(promptStore, variantGenerator) {
|
|
334
|
+
this.promptStore = promptStore;
|
|
335
|
+
this.variantGenerator = variantGenerator;
|
|
336
|
+
}
|
|
337
|
+
promptStore;
|
|
338
|
+
variantGenerator;
|
|
339
|
+
/**
|
|
340
|
+
* Generate candidate variants for optimization
|
|
341
|
+
*
|
|
342
|
+
* Creates new PromptVersion records for each variant with lineage tracking.
|
|
343
|
+
*
|
|
344
|
+
* @param promptId - Prompt to optimize
|
|
345
|
+
* @param versionId - Source version to mutate
|
|
346
|
+
* @param options - Generation options
|
|
347
|
+
* @returns Array of new PromptVersion objects saved to database
|
|
348
|
+
* @throws Error if source version not found
|
|
349
|
+
* @throws Error if all variant creations fail
|
|
350
|
+
*/
|
|
351
|
+
async generateCandidates(promptId, versionId, options = {}) {
|
|
352
|
+
const sourceVersion = await this.promptStore.getVersion(versionId);
|
|
353
|
+
if (!sourceVersion) {
|
|
354
|
+
throw new Error(`Source version ${versionId} not found`);
|
|
355
|
+
}
|
|
356
|
+
if (sourceVersion.promptId !== promptId) {
|
|
357
|
+
throw new Error(`Version ${versionId} does not belong to prompt ${promptId}`);
|
|
358
|
+
}
|
|
359
|
+
if (options.count !== void 0 && options.count <= 0) {
|
|
360
|
+
throw new Error("Variant count must be at least 1");
|
|
361
|
+
}
|
|
362
|
+
const count = options.count || 3;
|
|
363
|
+
const adaptedVersion = {
|
|
364
|
+
id: sourceVersion.id,
|
|
365
|
+
promptId: sourceVersion.promptId,
|
|
366
|
+
content: sourceVersion.content,
|
|
367
|
+
contentHash: "",
|
|
368
|
+
// Not used by variant generator
|
|
369
|
+
changelog: "",
|
|
370
|
+
// Not used
|
|
371
|
+
author: sourceVersion.createdBy,
|
|
372
|
+
isActive: sourceVersion.isActive,
|
|
373
|
+
isGenerated: false,
|
|
374
|
+
createdAt: sourceVersion.createdAt
|
|
375
|
+
};
|
|
376
|
+
const generatedVariants = await this.variantGenerator.generateVariants(adaptedVersion, count, {
|
|
377
|
+
strategies: options.strategies,
|
|
378
|
+
targetMetric: options.targetMetric || "balanced"
|
|
379
|
+
});
|
|
380
|
+
if (generatedVariants.length === 0) {
|
|
381
|
+
throw new Error("VariantGenerator produced no variants");
|
|
382
|
+
}
|
|
383
|
+
const candidates = [];
|
|
384
|
+
const errors = [];
|
|
385
|
+
for (let i = 0; i < generatedVariants.length; i++) {
|
|
386
|
+
const variant = generatedVariants[i];
|
|
387
|
+
if (!variant) continue;
|
|
388
|
+
try {
|
|
389
|
+
const goalMap = {
|
|
390
|
+
success_rate: "quality",
|
|
391
|
+
completeness: "quality",
|
|
392
|
+
duration: "speed",
|
|
393
|
+
balanced: "balanced"
|
|
394
|
+
};
|
|
395
|
+
const goal = goalMap[options.targetMetric || "balanced"] || "balanced";
|
|
396
|
+
const version = await this.promptStore.createVersion({
|
|
397
|
+
promptId,
|
|
398
|
+
content: variant.content,
|
|
399
|
+
createdBy: "variant-generator",
|
|
400
|
+
parentVersionId: versionId,
|
|
401
|
+
optimizationMetadata: {
|
|
402
|
+
strategy: variant.mutations[0]?.strategy || "hybrid",
|
|
403
|
+
goal,
|
|
404
|
+
mutations: variant.mutations.map((m) => m.description),
|
|
405
|
+
expectedImprovements: {
|
|
406
|
+
confidence: Number(variant.confidence) || 0
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
candidates.push(version);
|
|
411
|
+
} catch (error) {
|
|
412
|
+
const errorMsg = `Failed to create variant ${i + 1}: ${error.message}`;
|
|
413
|
+
errors.push(errorMsg);
|
|
414
|
+
emitWarning(
|
|
415
|
+
"PR-001",
|
|
416
|
+
{
|
|
417
|
+
taskId: promptId,
|
|
418
|
+
subsystem: "optimization",
|
|
419
|
+
executionPhase: "execution"
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
severity: "WARN" /* WARN */,
|
|
423
|
+
metadata: {
|
|
424
|
+
variantIndex: i + 1,
|
|
425
|
+
error: error.message,
|
|
426
|
+
operation: "createVariant"
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (candidates.length === 0) {
|
|
433
|
+
const errorSummary = errors.join("; ");
|
|
434
|
+
throw new Error(`Failed to create any candidate versions: ${errorSummary}`);
|
|
435
|
+
}
|
|
436
|
+
if (errors.length > 0) {
|
|
437
|
+
emitWarning(
|
|
438
|
+
"PR-001",
|
|
439
|
+
{
|
|
440
|
+
taskId: promptId,
|
|
441
|
+
subsystem: "optimization",
|
|
442
|
+
executionPhase: "execution"
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
severity: "WARN" /* WARN */,
|
|
446
|
+
metadata: {
|
|
447
|
+
successCount: candidates.length,
|
|
448
|
+
totalCount: generatedVariants.length,
|
|
449
|
+
failures: errors.join("; "),
|
|
450
|
+
operation: "generateCandidates"
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
);
|
|
454
|
+
}
|
|
455
|
+
return {
|
|
456
|
+
candidates,
|
|
457
|
+
generatedVariants
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Get mutation details for a version
|
|
462
|
+
*
|
|
463
|
+
* Retrieves the mutations that created this version from optimizationMetadata.
|
|
464
|
+
*/
|
|
465
|
+
getMutations(version) {
|
|
466
|
+
if (!version.optimizationMetadata?.mutations) {
|
|
467
|
+
return [];
|
|
468
|
+
}
|
|
469
|
+
const mutations = version.optimizationMetadata.mutations;
|
|
470
|
+
return Array.isArray(mutations) ? mutations : [];
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Get generation strategy for a version
|
|
474
|
+
*/
|
|
475
|
+
getStrategy(version) {
|
|
476
|
+
return version.optimizationMetadata?.strategy;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Get generation hypothesis for a version
|
|
480
|
+
*/
|
|
481
|
+
getHypothesis(version) {
|
|
482
|
+
const metadata = version.optimizationMetadata?.expectedImprovements;
|
|
483
|
+
if (typeof metadata === "object" && metadata !== null) {
|
|
484
|
+
return metadata.hypothesis;
|
|
485
|
+
}
|
|
486
|
+
return void 0;
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Get expected improvement for a version
|
|
490
|
+
*/
|
|
491
|
+
getExpectedImprovement(version) {
|
|
492
|
+
const metadata = version.optimizationMetadata?.expectedImprovements;
|
|
493
|
+
if (typeof metadata === "object" && metadata !== null) {
|
|
494
|
+
return metadata.expectedImprovement;
|
|
495
|
+
}
|
|
496
|
+
return void 0;
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Get confidence score for a version
|
|
500
|
+
*/
|
|
501
|
+
getConfidence(version) {
|
|
502
|
+
const metadata = version.optimizationMetadata?.expectedImprovements;
|
|
503
|
+
if (typeof metadata === "object" && metadata !== null) {
|
|
504
|
+
const confidence = metadata.confidence;
|
|
505
|
+
return typeof confidence === "number" ? confidence : 0;
|
|
506
|
+
}
|
|
507
|
+
return 0;
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Close resources
|
|
511
|
+
*/
|
|
512
|
+
close() {
|
|
513
|
+
this.variantGenerator.close();
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
// src/core/optimization/ProviderInsights.ts
|
|
518
|
+
var ProviderInsights = class {
|
|
519
|
+
constructor(providerTracker, executionTracker) {
|
|
520
|
+
this.providerTracker = providerTracker;
|
|
521
|
+
this.executionTracker = executionTracker;
|
|
522
|
+
}
|
|
523
|
+
providerTracker;
|
|
524
|
+
executionTracker;
|
|
525
|
+
/**
|
|
526
|
+
* Track all variants from optimization cycle
|
|
527
|
+
*
|
|
528
|
+
* Feeds execution data into ProviderTracker for analytics.
|
|
529
|
+
*
|
|
530
|
+
* @param promptId - Prompt being optimized
|
|
531
|
+
* @param candidateVersionIds - Versions tested in cycle
|
|
532
|
+
*/
|
|
533
|
+
async trackOptimizationCycle(promptId, candidateVersionIds) {
|
|
534
|
+
for (const versionId of candidateVersionIds) {
|
|
535
|
+
try {
|
|
536
|
+
const executions = this.executionTracker.getExecutions(promptId, versionId);
|
|
537
|
+
for (const execution of executions) {
|
|
538
|
+
const variants = this.executionTracker.getVariants(execution.id);
|
|
539
|
+
for (const variant of variants) {
|
|
540
|
+
try {
|
|
541
|
+
await this.trackVariant(promptId, versionId, variant, execution.taskComplexity);
|
|
542
|
+
} catch (error) {
|
|
543
|
+
emitWarning(
|
|
544
|
+
"PR-001",
|
|
545
|
+
{
|
|
546
|
+
taskId: promptId,
|
|
547
|
+
subsystem: "optimization",
|
|
548
|
+
provider: variant.provider,
|
|
549
|
+
executionPhase: "execution"
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
severity: "WARN" /* WARN */,
|
|
553
|
+
metadata: {
|
|
554
|
+
operation: "trackVariant",
|
|
555
|
+
versionId,
|
|
556
|
+
provider: variant.provider,
|
|
557
|
+
error: error.message,
|
|
558
|
+
reason: "Failed to track provider variant"
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
} catch (error) {
|
|
566
|
+
emitWarning(
|
|
567
|
+
"PR-001",
|
|
568
|
+
{
|
|
569
|
+
taskId: promptId,
|
|
570
|
+
subsystem: "optimization",
|
|
571
|
+
executionPhase: "execution"
|
|
572
|
+
},
|
|
573
|
+
{
|
|
574
|
+
severity: "ERROR" /* ERROR */,
|
|
575
|
+
metadata: {
|
|
576
|
+
operation: "trackOptimizationCycle",
|
|
577
|
+
versionId,
|
|
578
|
+
error: error.message,
|
|
579
|
+
reason: "Failed to track version"
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* Analyze results and recommend best provider
|
|
588
|
+
*
|
|
589
|
+
* @param promptId - Prompt to analyze
|
|
590
|
+
* @returns Provider recommendations ranked by performance
|
|
591
|
+
*/
|
|
592
|
+
async analyzeResults(promptId) {
|
|
593
|
+
try {
|
|
594
|
+
const recommendations = await this.providerTracker.getProviderRecommendations(promptId);
|
|
595
|
+
const insights = [];
|
|
596
|
+
for (const rec of recommendations.slice(0, 3)) {
|
|
597
|
+
try {
|
|
598
|
+
const providerInsights = await this.providerTracker.getProviderOptimizationInsights(
|
|
599
|
+
rec.provider,
|
|
600
|
+
promptId
|
|
601
|
+
);
|
|
602
|
+
insights.push(...providerInsights);
|
|
603
|
+
} catch (error) {
|
|
604
|
+
emitWarning(
|
|
605
|
+
"PR-001",
|
|
606
|
+
{
|
|
607
|
+
taskId: promptId,
|
|
608
|
+
subsystem: "optimization",
|
|
609
|
+
provider: rec.provider,
|
|
610
|
+
executionPhase: "execution"
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
severity: "WARN" /* WARN */,
|
|
614
|
+
metadata: {
|
|
615
|
+
operation: "getProviderOptimizationInsights",
|
|
616
|
+
provider: rec.provider,
|
|
617
|
+
error: error.message,
|
|
618
|
+
reason: "Failed to get provider insights"
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
return {
|
|
625
|
+
bestProvider: recommendations[0]?.provider ?? resolveDefaultProvider().value,
|
|
626
|
+
providerRecommendations: recommendations,
|
|
627
|
+
insights
|
|
628
|
+
};
|
|
629
|
+
} catch (error) {
|
|
630
|
+
emitWarning(
|
|
631
|
+
"PR-001",
|
|
632
|
+
{
|
|
633
|
+
taskId: promptId,
|
|
634
|
+
subsystem: "optimization",
|
|
635
|
+
executionPhase: "execution"
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
severity: "ERROR" /* ERROR */,
|
|
639
|
+
metadata: {
|
|
640
|
+
operation: "analyzeResults",
|
|
641
|
+
error: error.message,
|
|
642
|
+
reason: "Failed to analyze provider results"
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
);
|
|
646
|
+
return {
|
|
647
|
+
bestProvider: resolveDefaultProvider().value,
|
|
648
|
+
providerRecommendations: [],
|
|
649
|
+
insights: []
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
/**
|
|
654
|
+
* Get optimization insights for specific provider
|
|
655
|
+
*
|
|
656
|
+
* SWOT analysis (Strengths, Weaknesses, Opportunities, Threats)
|
|
657
|
+
*/
|
|
658
|
+
async getProviderOptimizationInsights(provider, promptId) {
|
|
659
|
+
try {
|
|
660
|
+
return await this.providerTracker.getProviderOptimizationInsights(
|
|
661
|
+
provider,
|
|
662
|
+
promptId
|
|
663
|
+
);
|
|
664
|
+
} catch (error) {
|
|
665
|
+
emitWarning(
|
|
666
|
+
"PR-001",
|
|
667
|
+
{
|
|
668
|
+
taskId: promptId,
|
|
669
|
+
subsystem: "optimization",
|
|
670
|
+
provider,
|
|
671
|
+
executionPhase: "execution"
|
|
672
|
+
},
|
|
673
|
+
{
|
|
674
|
+
severity: "WARN" /* WARN */,
|
|
675
|
+
metadata: {
|
|
676
|
+
operation: "getProviderOptimizationInsights",
|
|
677
|
+
provider,
|
|
678
|
+
error: error.message,
|
|
679
|
+
reason: "Failed to get optimization insights for provider"
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
);
|
|
683
|
+
return [];
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Get provider recommendations for a prompt
|
|
688
|
+
*/
|
|
689
|
+
async getProviderRecommendations(promptId) {
|
|
690
|
+
try {
|
|
691
|
+
return await this.providerTracker.getProviderRecommendations(promptId);
|
|
692
|
+
} catch (error) {
|
|
693
|
+
emitWarning(
|
|
694
|
+
"PR-001",
|
|
695
|
+
{
|
|
696
|
+
taskId: promptId,
|
|
697
|
+
subsystem: "optimization",
|
|
698
|
+
executionPhase: "execution"
|
|
699
|
+
},
|
|
700
|
+
{
|
|
701
|
+
severity: "WARN" /* WARN */,
|
|
702
|
+
metadata: {
|
|
703
|
+
operation: "getProviderRecommendations",
|
|
704
|
+
error: error.message,
|
|
705
|
+
reason: "Failed to get provider recommendations"
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
);
|
|
709
|
+
return [];
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
// Private helpers
|
|
713
|
+
/**
|
|
714
|
+
* Track a single variant execution
|
|
715
|
+
*/
|
|
716
|
+
async trackVariant(promptId, versionId, variant, taskComplexity) {
|
|
717
|
+
await this.providerTracker.trackProviderExecution({
|
|
718
|
+
provider: variant.provider,
|
|
719
|
+
promptId,
|
|
720
|
+
versionId,
|
|
721
|
+
variant: variant.variantName || void 0,
|
|
722
|
+
success: variant.success,
|
|
723
|
+
completeness: variant.completeness || 0,
|
|
724
|
+
duration: variant.durationSeconds || 0,
|
|
725
|
+
tokensUsed: variant.tokensUsed,
|
|
726
|
+
codeDelivered: variant.codeDelivered || false,
|
|
727
|
+
errorCount: variant.errorCount || 0,
|
|
728
|
+
warningCount: variant.warningCount || 0,
|
|
729
|
+
testsPassed: variant.testResults ? variant.testResults.passed : void 0,
|
|
730
|
+
testsFailed: variant.testResults ? variant.testResults.failed : void 0,
|
|
731
|
+
taskComplexity: taskComplexity || "medium",
|
|
732
|
+
timestamp: variant.createdAt
|
|
733
|
+
});
|
|
734
|
+
}
|
|
735
|
+
/**
|
|
736
|
+
* Close resources
|
|
737
|
+
*/
|
|
738
|
+
close() {
|
|
739
|
+
this.providerTracker.close();
|
|
740
|
+
}
|
|
741
|
+
};
|
|
742
|
+
|
|
743
|
+
// src/core/optimization/OptimizationEngine.ts
|
|
744
|
+
var OptimizationEngine = class {
|
|
745
|
+
poeticDir;
|
|
746
|
+
promptStore;
|
|
747
|
+
executionTracker;
|
|
748
|
+
configManager;
|
|
749
|
+
telemetry;
|
|
750
|
+
// Wrappers
|
|
751
|
+
variantGenerator;
|
|
752
|
+
optimizer;
|
|
753
|
+
providerInsights;
|
|
754
|
+
competitionRunner;
|
|
755
|
+
activationAuthority;
|
|
756
|
+
// Locks
|
|
757
|
+
activeLocks = /* @__PURE__ */ new Map();
|
|
758
|
+
lockDirs = /* @__PURE__ */ new Map();
|
|
759
|
+
constructor(options = {}) {
|
|
760
|
+
const poeticDir = resolvePoeticDirFromContext(options.poeticDir);
|
|
761
|
+
this.poeticDir = poeticDir;
|
|
762
|
+
this.promptStore = options.promptStore || new PromptVersionStore({ poeticDir });
|
|
763
|
+
this.executionTracker = options.executionTracker || new ExecutionTracker({ poeticDir });
|
|
764
|
+
this.configManager = new OptimizationConfigManager(poeticDir);
|
|
765
|
+
this.telemetry = options.telemetryLogger || TelemetryLogger.getInstance({ poeticDir });
|
|
766
|
+
const variantGen = new VariantGenerator();
|
|
767
|
+
const autoOptimizer = new AutomaticPromptOptimizer({ poeticDir });
|
|
768
|
+
const providerTracker = new ProviderTracker({ poeticDir });
|
|
769
|
+
this.variantGenerator = new PromptVariantGenerator(this.promptStore, variantGen);
|
|
770
|
+
this.optimizer = new OptimizationRecommendationAdapter(
|
|
771
|
+
this.promptStore,
|
|
772
|
+
this.executionTracker,
|
|
773
|
+
autoOptimizer
|
|
774
|
+
);
|
|
775
|
+
this.providerInsights = new ProviderInsights(providerTracker, this.executionTracker);
|
|
776
|
+
this.competitionRunner = options.competitionRunner ?? new NoopCompetitionRunner();
|
|
777
|
+
this.activationAuthority = options.activationAuthority ?? new TunerActivationAuthority(
|
|
778
|
+
new AutoTuningEngine({ poeticDir, enableAutoActivation: true }),
|
|
779
|
+
this.telemetry
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
/**
|
|
783
|
+
* Run complete optimization cycle
|
|
784
|
+
*
|
|
785
|
+
* Executes all 6 steps of the optimization loop.
|
|
786
|
+
*
|
|
787
|
+
* @param promptId - Prompt to optimize (name or ID)
|
|
788
|
+
* @param options - Optimization options
|
|
789
|
+
* @returns Optimization result
|
|
790
|
+
* @throws Error if lock acquisition fails
|
|
791
|
+
* @throws Error if prompt not found
|
|
792
|
+
* @throws Error if insufficient execution data
|
|
793
|
+
*/
|
|
794
|
+
async optimize(promptId, options = {}) {
|
|
795
|
+
const startTime = Date.now();
|
|
796
|
+
const cycleId = options.cycleId || this.generateCycleId();
|
|
797
|
+
let lockKey = null;
|
|
798
|
+
try {
|
|
799
|
+
this.telemetry.logCostEvent("prompt:optimize:started", {
|
|
800
|
+
promptId,
|
|
801
|
+
cycleId,
|
|
802
|
+
variantCount: options.variantCount ?? null,
|
|
803
|
+
improvementThreshold: options.improvementThreshold ?? null,
|
|
804
|
+
costBudget: options.costBudget ?? null,
|
|
805
|
+
providerStrategy: options.providerStrategy ?? null,
|
|
806
|
+
mutationStrategies: options.mutationStrategies ?? null,
|
|
807
|
+
providers: options.providers ?? null,
|
|
808
|
+
autoActivate: options.autoActivate ?? null
|
|
809
|
+
});
|
|
810
|
+
const resolvedPrompt = await this.resolvePrompt(promptId);
|
|
811
|
+
if (!resolvedPrompt) {
|
|
812
|
+
throw new Error(`Prompt ${promptId} not found`);
|
|
813
|
+
}
|
|
814
|
+
lockKey = resolvedPrompt.id;
|
|
815
|
+
await this.acquireLock(lockKey, cycleId);
|
|
816
|
+
const { prompt, activeVersion, metrics } = await this.loadActiveVersion(resolvedPrompt.id);
|
|
817
|
+
const config = this.configManager.getConfig(prompt.name, {
|
|
818
|
+
variantCount: options.variantCount,
|
|
819
|
+
improvementThreshold: options.improvementThreshold,
|
|
820
|
+
maxCostIncrease: options.costBudget,
|
|
821
|
+
providerStrategy: options.providerStrategy,
|
|
822
|
+
providersToTest: options.providers,
|
|
823
|
+
autoActivate: options.autoActivate,
|
|
824
|
+
mutationStrategies: options.mutationStrategies
|
|
825
|
+
});
|
|
826
|
+
const cycle = await this.createCycle(
|
|
827
|
+
prompt.id,
|
|
828
|
+
activeVersion.id,
|
|
829
|
+
cycleId,
|
|
830
|
+
config,
|
|
831
|
+
options.triggerReason
|
|
832
|
+
);
|
|
833
|
+
try {
|
|
834
|
+
const { candidates } = await this.variantGenerator.generateCandidates(
|
|
835
|
+
prompt.id,
|
|
836
|
+
activeVersion.id,
|
|
837
|
+
{
|
|
838
|
+
count: config.variantCount,
|
|
839
|
+
strategies: config.mutationStrategies,
|
|
840
|
+
targetMetric: config.targetMetric,
|
|
841
|
+
cycleId
|
|
842
|
+
}
|
|
843
|
+
);
|
|
844
|
+
cycle.candidateVersionIds = candidates.map((c) => c.id);
|
|
845
|
+
const competitionResult = await this.runCompetition(
|
|
846
|
+
prompt.id,
|
|
847
|
+
activeVersion,
|
|
848
|
+
candidates,
|
|
849
|
+
config,
|
|
850
|
+
cycleId
|
|
851
|
+
);
|
|
852
|
+
if (competitionResult.status === "failed") {
|
|
853
|
+
throw new Error(
|
|
854
|
+
`Competition runner failed: ${competitionResult.errors[0] || "unknown runner error"}`
|
|
855
|
+
);
|
|
856
|
+
}
|
|
857
|
+
await this.providerInsights.trackOptimizationCycle(prompt.id, cycle.candidateVersionIds);
|
|
858
|
+
const analysis = await this.analyzeCandidates(
|
|
859
|
+
prompt.id,
|
|
860
|
+
activeVersion.id,
|
|
861
|
+
candidates,
|
|
862
|
+
config
|
|
863
|
+
);
|
|
864
|
+
const bestCandidate = analysis[0];
|
|
865
|
+
if (!bestCandidate) {
|
|
866
|
+
return {
|
|
867
|
+
cycleId,
|
|
868
|
+
promptId: prompt.id,
|
|
869
|
+
success: true,
|
|
870
|
+
candidatesGenerated: candidates.length,
|
|
871
|
+
candidatesTested: 0,
|
|
872
|
+
decision: "deferred",
|
|
873
|
+
improvementFound: false,
|
|
874
|
+
safetyChecksPassed: false,
|
|
875
|
+
messages: ["No execution metrics available for candidate evaluation"],
|
|
876
|
+
warnings: [],
|
|
877
|
+
errors: [],
|
|
878
|
+
durationSeconds: (Date.now() - startTime) / 1e3,
|
|
879
|
+
completedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
880
|
+
};
|
|
881
|
+
}
|
|
882
|
+
const safetyChecks = this.runSafetyChecks(bestCandidate, metrics, config);
|
|
883
|
+
const decision = await this.makeActivationDecision(
|
|
884
|
+
prompt.id,
|
|
885
|
+
activeVersion.id,
|
|
886
|
+
bestCandidate,
|
|
887
|
+
safetyChecks,
|
|
888
|
+
config,
|
|
889
|
+
options
|
|
890
|
+
);
|
|
891
|
+
const result = await this.completeCycle(
|
|
892
|
+
cycle,
|
|
893
|
+
candidates,
|
|
894
|
+
analysis,
|
|
895
|
+
bestCandidate,
|
|
896
|
+
safetyChecks,
|
|
897
|
+
decision,
|
|
898
|
+
startTime
|
|
899
|
+
);
|
|
900
|
+
this.telemetry.logCostEvent("prompt:optimize:completed", {
|
|
901
|
+
promptId,
|
|
902
|
+
cycleId,
|
|
903
|
+
success: true,
|
|
904
|
+
improvementPercentage: result.improvementPercentage ?? null,
|
|
905
|
+
activated: result.decision === "activated"
|
|
906
|
+
});
|
|
907
|
+
return result;
|
|
908
|
+
} catch (error) {
|
|
909
|
+
this.telemetry.logCostEvent("prompt:optimize:failed", {
|
|
910
|
+
promptId,
|
|
911
|
+
cycleId,
|
|
912
|
+
error: error.message
|
|
913
|
+
});
|
|
914
|
+
cycle.status = "failed";
|
|
915
|
+
cycle.completedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
916
|
+
throw error;
|
|
917
|
+
} finally {
|
|
918
|
+
if (lockKey) {
|
|
919
|
+
this.releaseLock(lockKey);
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
} catch (error) {
|
|
923
|
+
const durationSeconds = (Date.now() - startTime) / 1e3;
|
|
924
|
+
return {
|
|
925
|
+
cycleId,
|
|
926
|
+
promptId,
|
|
927
|
+
success: false,
|
|
928
|
+
candidatesGenerated: 0,
|
|
929
|
+
candidatesTested: 0,
|
|
930
|
+
decision: "failed",
|
|
931
|
+
improvementFound: false,
|
|
932
|
+
safetyChecksPassed: false,
|
|
933
|
+
messages: [],
|
|
934
|
+
warnings: [],
|
|
935
|
+
errors: [error.message],
|
|
936
|
+
durationSeconds,
|
|
937
|
+
completedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
938
|
+
};
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
// Private methods
|
|
942
|
+
/**
|
|
943
|
+
* Resolve prompt by ID or name
|
|
944
|
+
*
|
|
945
|
+
* Supports both CLI usage (passes name) and scheduled optimization (passes ID).
|
|
946
|
+
* Tries name lookup first, then falls back to ID lookup.
|
|
947
|
+
*/
|
|
948
|
+
async resolvePrompt(promptIdOrName) {
|
|
949
|
+
let prompt = await this.promptStore.getPrompt(promptIdOrName);
|
|
950
|
+
if (!prompt) {
|
|
951
|
+
prompt = await this.promptStore.getPromptById(promptIdOrName);
|
|
952
|
+
}
|
|
953
|
+
return prompt;
|
|
954
|
+
}
|
|
955
|
+
/**
|
|
956
|
+
* Step 1: Load active version with validation
|
|
957
|
+
*/
|
|
958
|
+
async loadActiveVersion(promptIdOrName) {
|
|
959
|
+
const prompt = await this.resolvePrompt(promptIdOrName);
|
|
960
|
+
if (!prompt) {
|
|
961
|
+
throw new Error(`Prompt ${promptIdOrName} not found`);
|
|
962
|
+
}
|
|
963
|
+
if (!prompt.activeVersionId) {
|
|
964
|
+
throw new Error(`Prompt ${promptIdOrName} has no active version`);
|
|
965
|
+
}
|
|
966
|
+
const activeVersion = await this.promptStore.getVersion(prompt.activeVersionId);
|
|
967
|
+
if (!activeVersion) {
|
|
968
|
+
throw new Error(`Active version ${prompt.activeVersionId} not found`);
|
|
969
|
+
}
|
|
970
|
+
const metrics = this.executionTracker.getMetrics(prompt.id, activeVersion.id);
|
|
971
|
+
if (!metrics) {
|
|
972
|
+
throw new Error(`No execution metrics found for ${promptIdOrName}`);
|
|
973
|
+
}
|
|
974
|
+
const config = this.configManager.getConfig(prompt.name);
|
|
975
|
+
if (metrics.totalExecutions < config.minSampleSize) {
|
|
976
|
+
throw new Error(
|
|
977
|
+
`Insufficient execution data: ${metrics.totalExecutions}/${config.minSampleSize} executions`
|
|
978
|
+
);
|
|
979
|
+
}
|
|
980
|
+
return { prompt, activeVersion, metrics };
|
|
981
|
+
}
|
|
982
|
+
/**
|
|
983
|
+
* Step 2: Acquire optimization lock
|
|
984
|
+
*/
|
|
985
|
+
async acquireLock(promptId, cycleId) {
|
|
986
|
+
const SIX_HOURS = 6 * 60 * 60 * 1e3;
|
|
987
|
+
const owner = {
|
|
988
|
+
promptId,
|
|
989
|
+
cycleId,
|
|
990
|
+
pid: process.pid,
|
|
991
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
992
|
+
};
|
|
993
|
+
if (this.activeLocks.has(promptId)) {
|
|
994
|
+
const existingLock = this.activeLocks.get(promptId);
|
|
995
|
+
const lockAge = Date.now() - new Date(existingLock.startedAt).getTime();
|
|
996
|
+
if (lockAge < SIX_HOURS) {
|
|
997
|
+
throw new Error(
|
|
998
|
+
`Optimization already running for ${promptId} (started ${(lockAge / 1e3 / 60).toFixed(0)} minutes ago)`
|
|
999
|
+
);
|
|
1000
|
+
}
|
|
1001
|
+
this.activeLocks.delete(promptId);
|
|
1002
|
+
}
|
|
1003
|
+
const lockDir = this.getLockDir(promptId);
|
|
1004
|
+
try {
|
|
1005
|
+
fs.mkdirSync(path.dirname(lockDir), { recursive: true });
|
|
1006
|
+
fs.mkdirSync(lockDir);
|
|
1007
|
+
fs.writeFileSync(path.join(lockDir, "owner.json"), JSON.stringify(owner, null, 2));
|
|
1008
|
+
this.lockDirs.set(promptId, lockDir);
|
|
1009
|
+
} catch (error) {
|
|
1010
|
+
const nodeError = error;
|
|
1011
|
+
if (nodeError.code !== "EEXIST") {
|
|
1012
|
+
fs.rmSync(lockDir, { recursive: true, force: true });
|
|
1013
|
+
throw error;
|
|
1014
|
+
}
|
|
1015
|
+
const metadata = this.readLockMetadata(lockDir);
|
|
1016
|
+
const startedAt = metadata?.startedAt ? Date.parse(metadata.startedAt) : NaN;
|
|
1017
|
+
const lockAge = Number.isFinite(startedAt) ? Date.now() - startedAt : 0;
|
|
1018
|
+
if (lockAge < SIX_HOURS) {
|
|
1019
|
+
throw new Error(
|
|
1020
|
+
`Optimization already running for ${promptId} (started ${(lockAge / 1e3 / 60).toFixed(0)} minutes ago)`
|
|
1021
|
+
);
|
|
1022
|
+
}
|
|
1023
|
+
const staleLockDir = `${lockDir}.stale-${process.pid}-${Date.now()}-${crypto.randomBytes(3).toString("hex")}`;
|
|
1024
|
+
try {
|
|
1025
|
+
fs.renameSync(lockDir, staleLockDir);
|
|
1026
|
+
} catch {
|
|
1027
|
+
throw new Error(
|
|
1028
|
+
`Optimization already running for ${promptId}; stale lock was recovered by another process`
|
|
1029
|
+
);
|
|
1030
|
+
}
|
|
1031
|
+
try {
|
|
1032
|
+
fs.rmSync(staleLockDir, { recursive: true, force: true });
|
|
1033
|
+
fs.mkdirSync(lockDir);
|
|
1034
|
+
fs.writeFileSync(
|
|
1035
|
+
path.join(lockDir, "owner.json"),
|
|
1036
|
+
JSON.stringify(
|
|
1037
|
+
{
|
|
1038
|
+
...owner,
|
|
1039
|
+
recoveredExpiredLock: true
|
|
1040
|
+
},
|
|
1041
|
+
null,
|
|
1042
|
+
2
|
|
1043
|
+
)
|
|
1044
|
+
);
|
|
1045
|
+
this.lockDirs.set(promptId, lockDir);
|
|
1046
|
+
} catch (recoveryError) {
|
|
1047
|
+
fs.rmSync(lockDir, { recursive: true, force: true });
|
|
1048
|
+
throw recoveryError;
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
const lock = {
|
|
1052
|
+
id: cycleId,
|
|
1053
|
+
promptId,
|
|
1054
|
+
sourceVersionId: "",
|
|
1055
|
+
candidateVersionIds: [],
|
|
1056
|
+
cycleType: "manual",
|
|
1057
|
+
config: this.configManager.getDefaults(),
|
|
1058
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1059
|
+
status: "running",
|
|
1060
|
+
activated: false,
|
|
1061
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1062
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1063
|
+
};
|
|
1064
|
+
this.activeLocks.set(promptId, lock);
|
|
1065
|
+
}
|
|
1066
|
+
/**
|
|
1067
|
+
* Step 3: Release optimization lock
|
|
1068
|
+
*/
|
|
1069
|
+
releaseLock(promptId) {
|
|
1070
|
+
const activeLock = this.activeLocks.get(promptId);
|
|
1071
|
+
const lockDir = this.lockDirs.get(promptId);
|
|
1072
|
+
if (lockDir) {
|
|
1073
|
+
const metadata = this.readLockMetadata(lockDir);
|
|
1074
|
+
if (metadata?.cycleId === activeLock?.id && metadata?.pid === process.pid) {
|
|
1075
|
+
fs.rmSync(lockDir, { recursive: true, force: true });
|
|
1076
|
+
}
|
|
1077
|
+
this.lockDirs.delete(promptId);
|
|
1078
|
+
}
|
|
1079
|
+
this.activeLocks.delete(promptId);
|
|
1080
|
+
}
|
|
1081
|
+
/**
|
|
1082
|
+
* Step 4: Create cycle record
|
|
1083
|
+
*/
|
|
1084
|
+
async createCycle(promptId, sourceVersionId, cycleId, config, triggerReason) {
|
|
1085
|
+
const cycle = {
|
|
1086
|
+
id: cycleId,
|
|
1087
|
+
promptId,
|
|
1088
|
+
sourceVersionId,
|
|
1089
|
+
candidateVersionIds: [],
|
|
1090
|
+
cycleType: "manual",
|
|
1091
|
+
triggerReason,
|
|
1092
|
+
config,
|
|
1093
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1094
|
+
status: "running",
|
|
1095
|
+
activated: false,
|
|
1096
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1097
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1098
|
+
};
|
|
1099
|
+
this.activeLocks.set(promptId, cycle);
|
|
1100
|
+
return cycle;
|
|
1101
|
+
}
|
|
1102
|
+
/**
|
|
1103
|
+
* Step 5: Run competition for candidates.
|
|
1104
|
+
*
|
|
1105
|
+
* Delegates to the injected `OptimizationCompetitionRunner`. The default
|
|
1106
|
+
* runner (`NoopCompetitionRunner`) is intentionally a no-op so that
|
|
1107
|
+
* freshly-generated candidates carry no `ExecutionTracker` metrics; the
|
|
1108
|
+
* downstream `analyzeCandidates()` step then returns an empty array and
|
|
1109
|
+
* `optimize()` resolves to a `deferred` no-change result with the message
|
|
1110
|
+
* "No execution metrics available for candidate evaluation".
|
|
1111
|
+
*
|
|
1112
|
+
* To enable real competition, pass a non-default `competitionRunner` via
|
|
1113
|
+
* the engine constructor. The runner records per-candidate executions
|
|
1114
|
+
* through `ExecutionTracker`; analysis reads them back via
|
|
1115
|
+
* `getMetrics(promptId, candidate.versionId)`.
|
|
1116
|
+
*
|
|
1117
|
+
* Pinned by `competition-stub.test.ts` (default behavior) and
|
|
1118
|
+
* `competition-runner.test.ts` (injection seam).
|
|
1119
|
+
*/
|
|
1120
|
+
async runCompetition(promptId, sourceVersion, candidates, config, cycleId) {
|
|
1121
|
+
return this.competitionRunner.run({
|
|
1122
|
+
promptId,
|
|
1123
|
+
sourceVersion,
|
|
1124
|
+
candidates,
|
|
1125
|
+
config,
|
|
1126
|
+
cycleId,
|
|
1127
|
+
executionTracker: this.executionTracker,
|
|
1128
|
+
promptStore: this.promptStore
|
|
1129
|
+
});
|
|
1130
|
+
}
|
|
1131
|
+
/**
|
|
1132
|
+
* Step 6: Analyze candidates
|
|
1133
|
+
*/
|
|
1134
|
+
async analyzeCandidates(promptId, sourceVersionId, candidates, config) {
|
|
1135
|
+
const sourceMetrics = this.executionTracker.getMetrics(promptId, sourceVersionId);
|
|
1136
|
+
const analyses = [];
|
|
1137
|
+
for (const candidate of candidates) {
|
|
1138
|
+
const metrics = this.executionTracker.getMetrics(promptId, candidate.id);
|
|
1139
|
+
if (!metrics) continue;
|
|
1140
|
+
const score = metrics.avgSuccessRate * 0.35 + metrics.avgCompleteness / 100 * 0.35 + (1 - Math.min(metrics.avgDuration, 300) / 300) * 0.15 + 0.15;
|
|
1141
|
+
const baseScore = sourceMetrics.avgSuccessRate * 0.35 + sourceMetrics.avgCompleteness / 100 * 0.35 + (1 - Math.min(sourceMetrics.avgDuration, 300) / 300) * 0.15 + 0.15;
|
|
1142
|
+
const improvement = (score - baseScore) / baseScore * 100;
|
|
1143
|
+
const confidenceInterval = this.calculateBayesianCI(
|
|
1144
|
+
metrics.avgSuccessRate,
|
|
1145
|
+
metrics.totalExecutions,
|
|
1146
|
+
config.confidenceLevel
|
|
1147
|
+
);
|
|
1148
|
+
const analysis = {
|
|
1149
|
+
versionId: candidate.id,
|
|
1150
|
+
version: candidate,
|
|
1151
|
+
totalExecutions: metrics.totalExecutions,
|
|
1152
|
+
avgSuccessRate: metrics.avgSuccessRate,
|
|
1153
|
+
avgCompleteness: metrics.avgCompleteness,
|
|
1154
|
+
avgDuration: metrics.avgDuration,
|
|
1155
|
+
compositeScore: score,
|
|
1156
|
+
improvementPercentage: improvement,
|
|
1157
|
+
confidenceInterval,
|
|
1158
|
+
confidence: config.confidenceLevel,
|
|
1159
|
+
safetyChecks: [],
|
|
1160
|
+
safetyScore: 0,
|
|
1161
|
+
riskScore: 0
|
|
1162
|
+
};
|
|
1163
|
+
if (metrics.totalCostStatus === "complete" && metrics.totalCost !== void 0) {
|
|
1164
|
+
analysis.totalCost = metrics.totalCost;
|
|
1165
|
+
}
|
|
1166
|
+
analyses.push(analysis);
|
|
1167
|
+
}
|
|
1168
|
+
analyses.sort((a, b) => b.improvementPercentage - a.improvementPercentage);
|
|
1169
|
+
return analyses;
|
|
1170
|
+
}
|
|
1171
|
+
/**
|
|
1172
|
+
* Step 7: Run safety checks
|
|
1173
|
+
*/
|
|
1174
|
+
runSafetyChecks(candidate, currentMetrics, config) {
|
|
1175
|
+
const checks = [];
|
|
1176
|
+
checks.push({
|
|
1177
|
+
check: "sample_size",
|
|
1178
|
+
passed: candidate.totalExecutions >= config.minSampleSize,
|
|
1179
|
+
severity: "critical",
|
|
1180
|
+
message: `${candidate.totalExecutions}/${config.minSampleSize} executions`,
|
|
1181
|
+
value: candidate.totalExecutions,
|
|
1182
|
+
threshold: config.minSampleSize
|
|
1183
|
+
});
|
|
1184
|
+
checks.push({
|
|
1185
|
+
check: "improvement_threshold",
|
|
1186
|
+
passed: candidate.improvementPercentage >= config.improvementThreshold,
|
|
1187
|
+
severity: "high",
|
|
1188
|
+
message: `${candidate.improvementPercentage.toFixed(1)}% improvement`,
|
|
1189
|
+
value: candidate.improvementPercentage,
|
|
1190
|
+
threshold: config.improvementThreshold
|
|
1191
|
+
});
|
|
1192
|
+
const successDelta = (candidate.avgSuccessRate - currentMetrics.avgSuccessRate) * 100;
|
|
1193
|
+
checks.push({
|
|
1194
|
+
check: "success_rate_regression",
|
|
1195
|
+
passed: successDelta >= config.allowSuccessRateDrop,
|
|
1196
|
+
severity: "high",
|
|
1197
|
+
message: `${successDelta > 0 ? "+" : ""}${successDelta.toFixed(1)}% change`,
|
|
1198
|
+
value: successDelta,
|
|
1199
|
+
threshold: config.allowSuccessRateDrop
|
|
1200
|
+
});
|
|
1201
|
+
const currentCost = currentMetrics.totalCost;
|
|
1202
|
+
const candidateCost = candidate.totalCost;
|
|
1203
|
+
if (currentCost === void 0 || candidateCost === void 0 || !Number.isFinite(currentCost) || !Number.isFinite(candidateCost)) {
|
|
1204
|
+
checks.push({
|
|
1205
|
+
check: "cost_spike",
|
|
1206
|
+
passed: false,
|
|
1207
|
+
severity: "medium",
|
|
1208
|
+
message: "cost unavailable"
|
|
1209
|
+
});
|
|
1210
|
+
} else if (currentCost === 0 && candidateCost === 0) {
|
|
1211
|
+
checks.push({
|
|
1212
|
+
check: "cost_spike",
|
|
1213
|
+
passed: true,
|
|
1214
|
+
severity: "medium",
|
|
1215
|
+
message: "0% of current cost",
|
|
1216
|
+
value: 0,
|
|
1217
|
+
threshold: config.maxCostIncrease
|
|
1218
|
+
});
|
|
1219
|
+
} else if (currentCost === 0 && candidateCost > 0) {
|
|
1220
|
+
checks.push({
|
|
1221
|
+
check: "cost_spike",
|
|
1222
|
+
passed: false,
|
|
1223
|
+
severity: "medium",
|
|
1224
|
+
message: "positive cost from zero baseline exceeds max cost increase",
|
|
1225
|
+
threshold: config.maxCostIncrease
|
|
1226
|
+
});
|
|
1227
|
+
} else {
|
|
1228
|
+
const costRatio = candidateCost / currentCost;
|
|
1229
|
+
checks.push({
|
|
1230
|
+
check: "cost_spike",
|
|
1231
|
+
passed: costRatio <= config.maxCostIncrease,
|
|
1232
|
+
severity: "medium",
|
|
1233
|
+
message: `${(costRatio * 100).toFixed(0)}% of current cost`,
|
|
1234
|
+
value: costRatio,
|
|
1235
|
+
threshold: config.maxCostIncrease
|
|
1236
|
+
});
|
|
1237
|
+
}
|
|
1238
|
+
return checks;
|
|
1239
|
+
}
|
|
1240
|
+
/**
|
|
1241
|
+
* Step 8: Make activation decision
|
|
1242
|
+
*/
|
|
1243
|
+
async makeActivationDecision(promptId, sourceVersionId, bestCandidate, safetyChecks, config, options) {
|
|
1244
|
+
const shouldAutoActivate = options.autoActivate !== void 0 ? options.autoActivate : config.activationMode === "auto" || config.autoActivate;
|
|
1245
|
+
if (!shouldAutoActivate) {
|
|
1246
|
+
return {
|
|
1247
|
+
activated: false,
|
|
1248
|
+
kind: "disabled",
|
|
1249
|
+
reason: "Auto-activation disabled - manual review required"
|
|
1250
|
+
};
|
|
1251
|
+
}
|
|
1252
|
+
const allPassed = safetyChecks.every((c) => c.passed);
|
|
1253
|
+
if (!allPassed && !options.skipSafetyChecks) {
|
|
1254
|
+
const failed = safetyChecks.filter((c) => !c.passed).map((c) => c.check);
|
|
1255
|
+
return {
|
|
1256
|
+
activated: false,
|
|
1257
|
+
kind: "safety_failed",
|
|
1258
|
+
reason: `Safety checks failed: ${failed.join(", ")}`
|
|
1259
|
+
};
|
|
1260
|
+
}
|
|
1261
|
+
const reason = `Activated v${bestCandidate.version.versionNumber} (+${bestCandidate.improvementPercentage.toFixed(1)}%)`;
|
|
1262
|
+
try {
|
|
1263
|
+
const result = await this.activationAuthority.activate({
|
|
1264
|
+
promptId,
|
|
1265
|
+
candidateVersionId: bestCandidate.versionId,
|
|
1266
|
+
sourceVersionId,
|
|
1267
|
+
improvementPercentage: bestCandidate.improvementPercentage,
|
|
1268
|
+
confidence: bestCandidate.confidence,
|
|
1269
|
+
skipSafetyChecks: options.skipSafetyChecks,
|
|
1270
|
+
reason,
|
|
1271
|
+
// Tranche B: forward engine-side safety result so the authority
|
|
1272
|
+
// emits `prompt:activate:auto` with the same payload the engine
|
|
1273
|
+
// used to emit. The engine no longer emits this event directly.
|
|
1274
|
+
safetyChecksPassed: allPassed
|
|
1275
|
+
});
|
|
1276
|
+
if (!result.activated) {
|
|
1277
|
+
return {
|
|
1278
|
+
activated: false,
|
|
1279
|
+
kind: "declined",
|
|
1280
|
+
reason: result.reason || "Activation authority declined activation"
|
|
1281
|
+
};
|
|
1282
|
+
}
|
|
1283
|
+
const recordId = result.record?.id;
|
|
1284
|
+
if (recordId && this.activationAuthority.scheduleMonitoring) {
|
|
1285
|
+
this.activationAuthority.scheduleMonitoring(recordId);
|
|
1286
|
+
}
|
|
1287
|
+
return {
|
|
1288
|
+
activated: true,
|
|
1289
|
+
kind: "activated",
|
|
1290
|
+
record: result.record ?? void 0,
|
|
1291
|
+
reason
|
|
1292
|
+
};
|
|
1293
|
+
} catch (error) {
|
|
1294
|
+
return {
|
|
1295
|
+
activated: false,
|
|
1296
|
+
kind: "failed",
|
|
1297
|
+
reason: `Activation failed: ${error.message}`
|
|
1298
|
+
};
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
/**
|
|
1302
|
+
* Step 9: Complete cycle and return result
|
|
1303
|
+
*/
|
|
1304
|
+
async completeCycle(cycle, candidates, analysis, bestCandidate, safetyChecks, decision, startTime) {
|
|
1305
|
+
const durationSeconds = (Date.now() - startTime) / 1e3;
|
|
1306
|
+
const providerAnalysis = await this.providerInsights.analyzeResults(cycle.promptId);
|
|
1307
|
+
const activationFailure = decision.kind === "failed";
|
|
1308
|
+
const result = {
|
|
1309
|
+
cycleId: cycle.id,
|
|
1310
|
+
promptId: cycle.promptId,
|
|
1311
|
+
success: !activationFailure,
|
|
1312
|
+
candidatesGenerated: candidates.length,
|
|
1313
|
+
candidatesTested: analysis.length,
|
|
1314
|
+
bestCandidate,
|
|
1315
|
+
decision: decision.activated ? "activated" : activationFailure ? "failed" : "deferred",
|
|
1316
|
+
activatedVersionId: decision.activated ? bestCandidate.versionId : void 0,
|
|
1317
|
+
activationRecord: decision.activated ? decision.record : void 0,
|
|
1318
|
+
providerInsights: {
|
|
1319
|
+
bestProvider: providerAnalysis.bestProvider,
|
|
1320
|
+
recommendations: providerAnalysis.providerRecommendations,
|
|
1321
|
+
insights: providerAnalysis.insights
|
|
1322
|
+
},
|
|
1323
|
+
improvementFound: bestCandidate.improvementPercentage > 0,
|
|
1324
|
+
improvementPercentage: bestCandidate.improvementPercentage,
|
|
1325
|
+
safetyChecksPassed: safetyChecks.every((c) => c.passed),
|
|
1326
|
+
messages: [decision.reason],
|
|
1327
|
+
warnings: [],
|
|
1328
|
+
errors: activationFailure ? [decision.reason] : [],
|
|
1329
|
+
durationSeconds,
|
|
1330
|
+
completedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1331
|
+
};
|
|
1332
|
+
if (bestCandidate.totalCost !== void 0 && Number.isFinite(bestCandidate.totalCost)) {
|
|
1333
|
+
result.costUsd = bestCandidate.totalCost;
|
|
1334
|
+
}
|
|
1335
|
+
cycle.status = activationFailure ? "failed" : "completed";
|
|
1336
|
+
cycle.completedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
1337
|
+
cycle.durationSeconds = durationSeconds;
|
|
1338
|
+
cycle.bestCandidateId = bestCandidate.versionId;
|
|
1339
|
+
cycle.improvementScore = bestCandidate.improvementPercentage;
|
|
1340
|
+
cycle.activated = decision.activated;
|
|
1341
|
+
cycle.safetyCheckResults = safetyChecks;
|
|
1342
|
+
if (bestCandidate.totalCost !== void 0 && Number.isFinite(bestCandidate.totalCost)) {
|
|
1343
|
+
cycle.totalCostUsd = bestCandidate.totalCost;
|
|
1344
|
+
}
|
|
1345
|
+
return result;
|
|
1346
|
+
}
|
|
1347
|
+
// Utility methods
|
|
1348
|
+
generateCycleId() {
|
|
1349
|
+
return `cycle_${Date.now()}_${crypto.randomBytes(4).toString("hex")}`;
|
|
1350
|
+
}
|
|
1351
|
+
getLockDir(promptId) {
|
|
1352
|
+
const digest = crypto.createHash("sha256").update(promptId).digest("hex").slice(0, 24);
|
|
1353
|
+
return path.join(this.poeticDir, "tmp", "optimization-locks", digest);
|
|
1354
|
+
}
|
|
1355
|
+
readLockMetadata(lockDir) {
|
|
1356
|
+
try {
|
|
1357
|
+
const raw = fs.readFileSync(path.join(lockDir, "owner.json"), "utf8");
|
|
1358
|
+
const parsed = JSON.parse(raw);
|
|
1359
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
1360
|
+
} catch {
|
|
1361
|
+
return null;
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
calculateBayesianCI(successRate, sampleSize, confidenceLevel) {
|
|
1365
|
+
const z = confidenceLevel === 0.95 ? 1.96 : 1.645;
|
|
1366
|
+
const phat = successRate;
|
|
1367
|
+
const n = sampleSize;
|
|
1368
|
+
const denominator = 1 + z * z / n;
|
|
1369
|
+
const center = (phat + z * z / (2 * n)) / denominator;
|
|
1370
|
+
const margin = z * Math.sqrt(phat * (1 - phat) / n + z * z / (4 * n * n)) / denominator;
|
|
1371
|
+
return [Math.max(0, center - margin), Math.min(1, center + margin)];
|
|
1372
|
+
}
|
|
1373
|
+
// ============================================================================
|
|
1374
|
+
// SCHEDULED OPTIMIZATION API
|
|
1375
|
+
// ============================================================================
|
|
1376
|
+
/**
|
|
1377
|
+
* Run scheduled optimization for opted-in prompts
|
|
1378
|
+
*
|
|
1379
|
+
* This method is called by the scheduler (thin timing wrapper) to:
|
|
1380
|
+
* 1. Select all prompts opted into auto-optimization
|
|
1381
|
+
* 2. Apply unified policy from config
|
|
1382
|
+
* 3. Run optimization for eligible prompts
|
|
1383
|
+
* 4. Handle telemetry and logging
|
|
1384
|
+
*
|
|
1385
|
+
* @returns Summary of scheduled optimization run
|
|
1386
|
+
*/
|
|
1387
|
+
async runScheduledOptimization() {
|
|
1388
|
+
const startTime = Date.now();
|
|
1389
|
+
const results = [];
|
|
1390
|
+
const skipped = [];
|
|
1391
|
+
const errors = [];
|
|
1392
|
+
try {
|
|
1393
|
+
const optedInPrompts = await this.getOptedInPrompts();
|
|
1394
|
+
if (optedInPrompts.length === 0) {
|
|
1395
|
+
this.telemetry.logCostEvent("optimization:scheduled:empty", {
|
|
1396
|
+
message: "No prompts opted into auto-optimization"
|
|
1397
|
+
});
|
|
1398
|
+
return {
|
|
1399
|
+
success: true,
|
|
1400
|
+
totalPrompts: 0,
|
|
1401
|
+
optimized: 0,
|
|
1402
|
+
skipped: 0,
|
|
1403
|
+
failed: 0,
|
|
1404
|
+
results: [],
|
|
1405
|
+
skippedPrompts: [],
|
|
1406
|
+
errors: [],
|
|
1407
|
+
durationSeconds: (Date.now() - startTime) / 1e3,
|
|
1408
|
+
completedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1409
|
+
};
|
|
1410
|
+
}
|
|
1411
|
+
this.telemetry.logCostEvent("optimization:scheduled:started", {
|
|
1412
|
+
promptCount: optedInPrompts.length,
|
|
1413
|
+
promptIds: optedInPrompts.map((p) => p.id)
|
|
1414
|
+
});
|
|
1415
|
+
for (const prompt of optedInPrompts) {
|
|
1416
|
+
try {
|
|
1417
|
+
const eligibility = await this.checkOptimizationEligibility(prompt.id);
|
|
1418
|
+
if (!eligibility.eligible) {
|
|
1419
|
+
skipped.push({
|
|
1420
|
+
promptId: prompt.id,
|
|
1421
|
+
reason: eligibility.reason
|
|
1422
|
+
});
|
|
1423
|
+
continue;
|
|
1424
|
+
}
|
|
1425
|
+
const config = this.configManager.getConfig(prompt.name);
|
|
1426
|
+
const shouldAutoActivate = config.activationMode === "auto" || config.autoActivate;
|
|
1427
|
+
const result = await this.optimize(prompt.id, {
|
|
1428
|
+
triggerReason: "scheduled",
|
|
1429
|
+
autoActivate: shouldAutoActivate
|
|
1430
|
+
});
|
|
1431
|
+
results.push(result);
|
|
1432
|
+
} catch (error) {
|
|
1433
|
+
errors.push({
|
|
1434
|
+
promptId: prompt.id,
|
|
1435
|
+
error: error.message
|
|
1436
|
+
});
|
|
1437
|
+
this.telemetry.logCostEvent("optimization:scheduled:prompt-error", {
|
|
1438
|
+
promptId: prompt.id,
|
|
1439
|
+
error: error.message
|
|
1440
|
+
});
|
|
1441
|
+
}
|
|
1442
|
+
}
|
|
1443
|
+
const durationSeconds = (Date.now() - startTime) / 1e3;
|
|
1444
|
+
this.telemetry.logCostEvent("optimization:scheduled:completed", {
|
|
1445
|
+
totalPrompts: optedInPrompts.length,
|
|
1446
|
+
optimized: results.filter((r) => r.success).length,
|
|
1447
|
+
skipped: skipped.length,
|
|
1448
|
+
failed: errors.length,
|
|
1449
|
+
durationSeconds
|
|
1450
|
+
});
|
|
1451
|
+
return {
|
|
1452
|
+
success: true,
|
|
1453
|
+
totalPrompts: optedInPrompts.length,
|
|
1454
|
+
optimized: results.filter((r) => r.success).length,
|
|
1455
|
+
skipped: skipped.length,
|
|
1456
|
+
failed: errors.length,
|
|
1457
|
+
results,
|
|
1458
|
+
skippedPrompts: skipped,
|
|
1459
|
+
errors,
|
|
1460
|
+
durationSeconds,
|
|
1461
|
+
completedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1462
|
+
};
|
|
1463
|
+
} catch (error) {
|
|
1464
|
+
const durationSeconds = (Date.now() - startTime) / 1e3;
|
|
1465
|
+
this.telemetry.logCostEvent("optimization:scheduled:failed", {
|
|
1466
|
+
error: error.message
|
|
1467
|
+
});
|
|
1468
|
+
return {
|
|
1469
|
+
success: false,
|
|
1470
|
+
totalPrompts: 0,
|
|
1471
|
+
optimized: 0,
|
|
1472
|
+
skipped: 0,
|
|
1473
|
+
failed: 1,
|
|
1474
|
+
results: [],
|
|
1475
|
+
skippedPrompts: [],
|
|
1476
|
+
errors: [{ promptId: "unknown", error: error.message }],
|
|
1477
|
+
durationSeconds,
|
|
1478
|
+
completedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1479
|
+
};
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
/**
|
|
1483
|
+
* Get prompts opted into auto-optimization
|
|
1484
|
+
*
|
|
1485
|
+
* Checks multiple sources for opt-in (in priority order):
|
|
1486
|
+
* 1. Prompt-specific config: activationMode: 'auto'
|
|
1487
|
+
* 2. Prompt entity flag: prompt.autoOptimize (legacy)
|
|
1488
|
+
* 3. Global config: activationMode: 'auto' (applies to all prompts)
|
|
1489
|
+
* 4. Legacy flags: autoActivate: true && requireManualReview: false
|
|
1490
|
+
*/
|
|
1491
|
+
async getOptedInPrompts() {
|
|
1492
|
+
const allPrompts = await this.promptStore.listPrompts();
|
|
1493
|
+
const globalConfig = this.configManager.getConfig(void 0);
|
|
1494
|
+
const globalOptIn = globalConfig.activationMode === "auto";
|
|
1495
|
+
const optedIn = [];
|
|
1496
|
+
for (const prompt of allPrompts) {
|
|
1497
|
+
const promptConfig = this.configManager.getPromptConfig(prompt.name);
|
|
1498
|
+
const hasPromptAutoMode = promptConfig?.activationMode === "auto";
|
|
1499
|
+
const hasPromptAutoOptimize = prompt.autoOptimize === true;
|
|
1500
|
+
const hasGlobalAutoMode = globalOptIn && promptConfig?.activationMode !== "manual";
|
|
1501
|
+
const fullConfig = this.configManager.getConfig(prompt.name);
|
|
1502
|
+
const hasLegacyAutoActivate = fullConfig.autoActivate === true && fullConfig.requireManualReview === false;
|
|
1503
|
+
const isOptedIn = hasPromptAutoMode || hasPromptAutoOptimize || hasGlobalAutoMode || hasLegacyAutoActivate;
|
|
1504
|
+
if (isOptedIn) {
|
|
1505
|
+
optedIn.push({ id: prompt.id, name: prompt.name });
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
return optedIn;
|
|
1509
|
+
}
|
|
1510
|
+
/**
|
|
1511
|
+
* Check if a prompt is eligible for optimization
|
|
1512
|
+
*
|
|
1513
|
+
* @param promptIdOrName - Prompt ID or name (supports both for CLI and scheduled use)
|
|
1514
|
+
*/
|
|
1515
|
+
async checkOptimizationEligibility(promptIdOrName) {
|
|
1516
|
+
const prompt = await this.resolvePrompt(promptIdOrName);
|
|
1517
|
+
if (!prompt) {
|
|
1518
|
+
return { eligible: false, reason: "Prompt not found" };
|
|
1519
|
+
}
|
|
1520
|
+
if (!prompt.activeVersionId) {
|
|
1521
|
+
return { eligible: false, reason: "No active version" };
|
|
1522
|
+
}
|
|
1523
|
+
const metrics = this.executionTracker.getMetrics(prompt.id, prompt.activeVersionId);
|
|
1524
|
+
if (!metrics) {
|
|
1525
|
+
return { eligible: false, reason: "No execution metrics available" };
|
|
1526
|
+
}
|
|
1527
|
+
const config = this.configManager.getConfig(prompt.name);
|
|
1528
|
+
if (metrics.totalExecutions < config.minSampleSize) {
|
|
1529
|
+
return {
|
|
1530
|
+
eligible: false,
|
|
1531
|
+
reason: `Insufficient data: ${metrics.totalExecutions}/${config.minSampleSize} executions`
|
|
1532
|
+
};
|
|
1533
|
+
}
|
|
1534
|
+
if (this.activeLocks.has(prompt.id)) {
|
|
1535
|
+
return { eligible: false, reason: "Optimization already in progress" };
|
|
1536
|
+
}
|
|
1537
|
+
return { eligible: true, reason: "Eligible for optimization" };
|
|
1538
|
+
}
|
|
1539
|
+
/**
|
|
1540
|
+
* Analyze a prompt for potential optimization (dry-run)
|
|
1541
|
+
*
|
|
1542
|
+
* Returns analysis without generating variants or activating.
|
|
1543
|
+
* Does NOT hard-fail on missing metrics - returns eligible: false instead.
|
|
1544
|
+
* Useful for CLI `poetic prompt analyze` command.
|
|
1545
|
+
*
|
|
1546
|
+
* @param promptIdOrName - Prompt ID or name (supports both for CLI and scheduled use)
|
|
1547
|
+
*/
|
|
1548
|
+
async analyze(promptIdOrName) {
|
|
1549
|
+
const prompt = await this.resolvePrompt(promptIdOrName);
|
|
1550
|
+
if (!prompt) {
|
|
1551
|
+
throw new Error(`Prompt ${promptIdOrName} not found`);
|
|
1552
|
+
}
|
|
1553
|
+
if (!prompt.activeVersionId) {
|
|
1554
|
+
throw new Error(`Prompt ${promptIdOrName} has no active version`);
|
|
1555
|
+
}
|
|
1556
|
+
const activeVersion = await this.promptStore.getVersion(prompt.activeVersionId);
|
|
1557
|
+
if (!activeVersion) {
|
|
1558
|
+
throw new Error(`Active version ${prompt.activeVersionId} not found`);
|
|
1559
|
+
}
|
|
1560
|
+
const config = this.configManager.getConfig(prompt.name);
|
|
1561
|
+
const metrics = this.executionTracker.getMetrics(prompt.id, activeVersion.id);
|
|
1562
|
+
const recommendation = await this.optimizer.getRecommendation(prompt.name);
|
|
1563
|
+
const eligibility = await this.checkOptimizationEligibility(prompt.id);
|
|
1564
|
+
const costComplete = metrics?.totalCostStatus === "complete" && metrics.totalCost !== void 0;
|
|
1565
|
+
return {
|
|
1566
|
+
promptId: prompt.id,
|
|
1567
|
+
promptName: prompt.name,
|
|
1568
|
+
activeVersionId: activeVersion.id,
|
|
1569
|
+
currentPerformance: {
|
|
1570
|
+
totalExecutions: metrics?.totalExecutions ?? 0,
|
|
1571
|
+
avgSuccessRate: metrics?.avgSuccessRate ?? 0,
|
|
1572
|
+
avgCompleteness: metrics?.avgCompleteness ?? 0,
|
|
1573
|
+
avgDuration: metrics?.avgDuration ?? 0,
|
|
1574
|
+
// Do not recreate zero from missing/incomplete cost.
|
|
1575
|
+
...costComplete ? { totalCost: metrics.totalCost } : {},
|
|
1576
|
+
totalCostStatus: metrics?.totalCostStatus
|
|
1577
|
+
},
|
|
1578
|
+
eligibility,
|
|
1579
|
+
recommendation,
|
|
1580
|
+
config,
|
|
1581
|
+
analyzedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1582
|
+
};
|
|
1583
|
+
}
|
|
1584
|
+
/**
|
|
1585
|
+
* Close resources
|
|
1586
|
+
*/
|
|
1587
|
+
close() {
|
|
1588
|
+
this.variantGenerator.close();
|
|
1589
|
+
this.optimizer.close();
|
|
1590
|
+
this.providerInsights.close();
|
|
1591
|
+
this.promptStore.close();
|
|
1592
|
+
}
|
|
1593
|
+
};
|
|
1594
|
+
export {
|
|
1595
|
+
OptimizationEngine
|
|
1596
|
+
};
|
|
1597
|
+
//# sourceMappingURL=OptimizationEngine-JIMGP3LY.js.map
|