@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,1042 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getAvailableMemoryGB,
|
|
3
|
+
getMemoryPressureLevel
|
|
4
|
+
} from "./chunk-PTH5E5XO.js";
|
|
5
|
+
import {
|
|
6
|
+
PROVIDER_CONCURRENCY,
|
|
7
|
+
applyProviderConcurrencyPenalty,
|
|
8
|
+
getProviderConcurrencyBaseline,
|
|
9
|
+
getProviderConcurrencyLimit
|
|
10
|
+
} from "./chunk-GHTZSQB7.js";
|
|
11
|
+
import {
|
|
12
|
+
RESOURCE_ACQUISITION_TIMEOUT_MS
|
|
13
|
+
} from "./chunk-LAMKBTXX.js";
|
|
14
|
+
|
|
15
|
+
// src/orchestrator/provider-aware-resource-manager.ts
|
|
16
|
+
import { totalmem } from "os";
|
|
17
|
+
|
|
18
|
+
// src/orchestrator/resource-manager-types.ts
|
|
19
|
+
import * as os from "os";
|
|
20
|
+
function clampInteger(value, min, max) {
|
|
21
|
+
if (!Number.isFinite(value)) return min;
|
|
22
|
+
return Math.max(min, Math.min(max, Math.round(value)));
|
|
23
|
+
}
|
|
24
|
+
function captureConcurrencyBackpressureSnapshot(queueDepth, activeConcurrency, currentGlobalConcurrency, configuredGlobalConcurrency, minGlobalConcurrency = 1) {
|
|
25
|
+
const cpuCount = Math.max(1, os.cpus().length);
|
|
26
|
+
const load1 = os.loadavg?.()[0] ?? 0;
|
|
27
|
+
const cpuPercent = Math.max(0, load1 / cpuCount * 100);
|
|
28
|
+
const availableMemoryGB = getAvailableMemoryGB();
|
|
29
|
+
const memoryPressure = getMemoryPressureLevel();
|
|
30
|
+
return {
|
|
31
|
+
cpuPercent,
|
|
32
|
+
availableMemoryGB,
|
|
33
|
+
memoryPressure,
|
|
34
|
+
queueDepth,
|
|
35
|
+
activeConcurrency,
|
|
36
|
+
currentGlobalConcurrency,
|
|
37
|
+
configuredGlobalConcurrency,
|
|
38
|
+
minGlobalConcurrency
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function recommendGlobalConcurrency(snapshot) {
|
|
42
|
+
const configured = Math.max(1, Math.floor(snapshot.configuredGlobalConcurrency));
|
|
43
|
+
const minGlobalConcurrency = clampInteger(snapshot.minGlobalConcurrency ?? 1, 1, configured);
|
|
44
|
+
const current = clampInteger(snapshot.currentGlobalConcurrency, minGlobalConcurrency, configured);
|
|
45
|
+
const queueDepth = Math.max(0, Math.floor(snapshot.queueDepth));
|
|
46
|
+
const activeConcurrency = Math.max(0, Math.floor(snapshot.activeConcurrency));
|
|
47
|
+
const cpuPercent = Math.max(0, snapshot.cpuPercent);
|
|
48
|
+
const availableMemoryGB = Math.max(0, snapshot.availableMemoryGB);
|
|
49
|
+
const kernelPressure = snapshot.memoryPressure ?? "unknown";
|
|
50
|
+
const memLabel = `availMem=${availableMemoryGB.toFixed(1)}GB` + (kernelPressure === "warn" || kernelPressure === "critical" ? ` kernel=${kernelPressure}` : "");
|
|
51
|
+
let recommended = current;
|
|
52
|
+
let pressureLevel = "healthy";
|
|
53
|
+
let reason = "steady concurrency";
|
|
54
|
+
let backpressureActive = false;
|
|
55
|
+
const criticalPressure = kernelPressure === "critical" || cpuPercent >= 92 || availableMemoryGB < 1;
|
|
56
|
+
const elevatedPressure = kernelPressure === "warn" || cpuPercent >= 80 || availableMemoryGB < 2;
|
|
57
|
+
const moderatePressure = cpuPercent >= 70 || availableMemoryGB < 4;
|
|
58
|
+
const healthySystem = cpuPercent <= 45 && availableMemoryGB >= 6;
|
|
59
|
+
if (criticalPressure) {
|
|
60
|
+
pressureLevel = "critical";
|
|
61
|
+
backpressureActive = true;
|
|
62
|
+
recommended = Math.max(minGlobalConcurrency, Math.floor(current / 2));
|
|
63
|
+
reason = `critical pressure cpu=${cpuPercent.toFixed(1)}% ${memLabel}`;
|
|
64
|
+
} else if (elevatedPressure) {
|
|
65
|
+
pressureLevel = "backpressure";
|
|
66
|
+
backpressureActive = true;
|
|
67
|
+
const shed = Math.max(2, Math.ceil(current * 0.25));
|
|
68
|
+
recommended = Math.max(minGlobalConcurrency, current - shed);
|
|
69
|
+
reason = `high pressure cpu=${cpuPercent.toFixed(1)}% ${memLabel}`;
|
|
70
|
+
} else if (moderatePressure) {
|
|
71
|
+
pressureLevel = "watch";
|
|
72
|
+
backpressureActive = true;
|
|
73
|
+
recommended = Math.max(minGlobalConcurrency, current - 1);
|
|
74
|
+
reason = `moderate pressure cpu=${cpuPercent.toFixed(1)}% ${memLabel}`;
|
|
75
|
+
} else if (healthySystem && queueDepth > 0 && current < configured) {
|
|
76
|
+
const queueDemand = queueDepth >= Math.max(2, current * 2) || activeConcurrency >= current * 2 ? 2 : 1;
|
|
77
|
+
recommended = Math.min(configured, current + queueDemand);
|
|
78
|
+
reason = `healthy system with queueDepth=${queueDepth}`;
|
|
79
|
+
} else if (!healthySystem && queueDepth > current && current < configured) {
|
|
80
|
+
recommended = Math.min(configured, current + 1);
|
|
81
|
+
reason = `recovering with queued work queueDepth=${queueDepth}`;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
recommendedGlobalConcurrency: recommended,
|
|
85
|
+
backpressureActive,
|
|
86
|
+
reason,
|
|
87
|
+
pressureLevel
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// src/orchestrator/provider-aware-resource-manager.ts
|
|
92
|
+
var ProviderAwareResourceManager = class {
|
|
93
|
+
configuredGlobalMaxConcurrent;
|
|
94
|
+
globalMaxConcurrent;
|
|
95
|
+
fairnessMode;
|
|
96
|
+
enableTelemetry;
|
|
97
|
+
telemetryHooks = [];
|
|
98
|
+
lastBackpressureDecision;
|
|
99
|
+
lastBackpressureUpdatedAt = Date.now();
|
|
100
|
+
// Provider-specific baselines (host overlay / CLI overrides replace the shipped default)
|
|
101
|
+
providerLimits;
|
|
102
|
+
// Correctness ceilings no override may exceed (see config.providerHardCaps)
|
|
103
|
+
providerHardCaps;
|
|
104
|
+
// Current active counts
|
|
105
|
+
globalActiveCount = 0;
|
|
106
|
+
providerActiveCounts = /* @__PURE__ */ new Map();
|
|
107
|
+
// Queue of pending acquisitions (singles and atomic groups)
|
|
108
|
+
queue = [];
|
|
109
|
+
// Round-robin state for strict-fair mode
|
|
110
|
+
lastProviderServiced = null;
|
|
111
|
+
// Provider usage statistics for weighted-fair mode
|
|
112
|
+
providerUsageHistory = /* @__PURE__ */ new Map();
|
|
113
|
+
usageHistoryWindow = 100;
|
|
114
|
+
// Track last N acquisitions
|
|
115
|
+
providerAvgHoldMs = /* @__PURE__ */ new Map();
|
|
116
|
+
globalAvgHoldMs = 6e4;
|
|
117
|
+
holdTimeEwmaAlpha = 0.2;
|
|
118
|
+
constructor(config) {
|
|
119
|
+
if (config.globalMaxConcurrent < 1) {
|
|
120
|
+
throw new Error("globalMaxConcurrent must be at least 1");
|
|
121
|
+
}
|
|
122
|
+
this.configuredGlobalMaxConcurrent = config.globalMaxConcurrent;
|
|
123
|
+
this.globalMaxConcurrent = config.globalMaxConcurrent;
|
|
124
|
+
this.fairnessMode = config.fairnessMode ?? "weighted-fair";
|
|
125
|
+
this.enableTelemetry = config.enableTelemetry ?? true;
|
|
126
|
+
this.lastBackpressureDecision = {
|
|
127
|
+
recommendedGlobalConcurrency: config.globalMaxConcurrent,
|
|
128
|
+
backpressureActive: false,
|
|
129
|
+
reason: "baseline",
|
|
130
|
+
pressureLevel: "healthy"
|
|
131
|
+
};
|
|
132
|
+
this.providerHardCaps = /* @__PURE__ */ new Map();
|
|
133
|
+
for (const [provider, cap] of Object.entries(config.providerHardCaps ?? {})) {
|
|
134
|
+
if (Number.isFinite(cap)) {
|
|
135
|
+
this.providerHardCaps.set(provider, Math.max(1, Math.floor(cap)));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
this.providerLimits = /* @__PURE__ */ new Map();
|
|
139
|
+
const providers = new Set(Object.keys(PROVIDER_CONCURRENCY));
|
|
140
|
+
for (const provider of Object.keys(config.providerLimits ?? {})) {
|
|
141
|
+
providers.add(provider);
|
|
142
|
+
}
|
|
143
|
+
for (const provider of providers) {
|
|
144
|
+
const generatedBaseline = PROVIDER_CONCURRENCY[provider]?.maxConcurrent;
|
|
145
|
+
const limit = config.providerLimits?.[provider] ?? generatedBaseline ?? getProviderConcurrencyLimit(provider);
|
|
146
|
+
this.providerLimits.set(provider, limit);
|
|
147
|
+
this.providerActiveCounts.set(provider, 0);
|
|
148
|
+
this.providerUsageHistory.set(provider, 0);
|
|
149
|
+
this.providerAvgHoldMs.set(provider, 6e4);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Acquire a resource slot (blocks if at capacity)
|
|
154
|
+
*
|
|
155
|
+
* Waits until both constraints are satisfied:
|
|
156
|
+
* 1. Provider-specific limit not exceeded
|
|
157
|
+
* 2. Global limit not exceeded
|
|
158
|
+
*
|
|
159
|
+
* @param provider - Provider ID requesting the resource
|
|
160
|
+
* @param signal - Optional AbortSignal for cancellation
|
|
161
|
+
* @param timeoutMs - Maximum time to wait (default: 60 seconds)
|
|
162
|
+
* @returns Resource handle with release callback
|
|
163
|
+
* @throws Error if timeout reached or signal aborted
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* const handle = await manager.acquire('gemini', signal);
|
|
168
|
+
* try {
|
|
169
|
+
* await executeTask();
|
|
170
|
+
* } finally {
|
|
171
|
+
* await handle.release();
|
|
172
|
+
* }
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
acquire(provider, signal, timeoutMs = RESOURCE_ACQUISITION_TIMEOUT_MS) {
|
|
176
|
+
if (signal?.aborted) {
|
|
177
|
+
return Promise.reject(new Error("Acquisition aborted before queuing"));
|
|
178
|
+
}
|
|
179
|
+
const immediate = this.tryAcquire(provider);
|
|
180
|
+
if (immediate) {
|
|
181
|
+
return Promise.resolve(immediate);
|
|
182
|
+
}
|
|
183
|
+
let pendingResolve;
|
|
184
|
+
let pendingReject;
|
|
185
|
+
const pending = new Promise((resolve, reject) => {
|
|
186
|
+
pendingResolve = resolve;
|
|
187
|
+
pendingReject = reject;
|
|
188
|
+
});
|
|
189
|
+
pending.catch(() => {
|
|
190
|
+
});
|
|
191
|
+
const queuedAt = Date.now();
|
|
192
|
+
let timeoutHandle = null;
|
|
193
|
+
let abortHandler = null;
|
|
194
|
+
const cleanup = () => {
|
|
195
|
+
if (timeoutHandle) {
|
|
196
|
+
clearTimeout(timeoutHandle);
|
|
197
|
+
}
|
|
198
|
+
if (abortHandler && signal) {
|
|
199
|
+
signal.removeEventListener("abort", abortHandler);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
const wrappedResolve = (handle) => {
|
|
203
|
+
cleanup();
|
|
204
|
+
pendingResolve(handle);
|
|
205
|
+
};
|
|
206
|
+
const wrappedReject = (error) => {
|
|
207
|
+
cleanup();
|
|
208
|
+
const index = this.queue.findIndex((e) => e.resolve === wrappedResolve);
|
|
209
|
+
if (index !== -1) {
|
|
210
|
+
this.queue.splice(index, 1);
|
|
211
|
+
}
|
|
212
|
+
queueMicrotask(() => pendingReject(error));
|
|
213
|
+
};
|
|
214
|
+
const entry = {
|
|
215
|
+
provider,
|
|
216
|
+
resolve: wrappedResolve,
|
|
217
|
+
reject: wrappedReject,
|
|
218
|
+
signal,
|
|
219
|
+
queuedAt,
|
|
220
|
+
weight: this.calculateWeight(provider)
|
|
221
|
+
};
|
|
222
|
+
this.queue.push(entry);
|
|
223
|
+
timeoutHandle = setTimeout(() => {
|
|
224
|
+
const waitTimeMs = Date.now() - queuedAt;
|
|
225
|
+
const error = new Error(
|
|
226
|
+
`Resource acquisition timeout after ${waitTimeMs}ms (limit: ${timeoutMs}ms). Provider: ${provider}, Active: ${this.globalActiveCount}/${this.globalMaxConcurrent} global, ${this.providerActiveCounts.get(provider)}/${this.getEffectiveProviderLimit(provider)} provider, Queued: ${this.queue.length}. This may indicate resource contention or a leak (release() not called).`
|
|
227
|
+
);
|
|
228
|
+
this.emitTelemetry({
|
|
229
|
+
type: "resource_timeout",
|
|
230
|
+
provider,
|
|
231
|
+
waitTimeMs,
|
|
232
|
+
status: this.getStatus(),
|
|
233
|
+
timestamp: Date.now(),
|
|
234
|
+
error
|
|
235
|
+
});
|
|
236
|
+
wrappedReject(error);
|
|
237
|
+
}, timeoutMs);
|
|
238
|
+
if (signal) {
|
|
239
|
+
abortHandler = () => {
|
|
240
|
+
const waitTimeMs = Date.now() - queuedAt;
|
|
241
|
+
const error = new Error(
|
|
242
|
+
`Resource acquisition cancelled after ${waitTimeMs}ms for provider ${provider}`
|
|
243
|
+
);
|
|
244
|
+
this.emitTelemetry({
|
|
245
|
+
type: "resource_cancelled",
|
|
246
|
+
provider,
|
|
247
|
+
waitTimeMs,
|
|
248
|
+
status: this.getStatus(),
|
|
249
|
+
timestamp: Date.now(),
|
|
250
|
+
error
|
|
251
|
+
});
|
|
252
|
+
wrappedReject(error);
|
|
253
|
+
};
|
|
254
|
+
signal.addEventListener("abort", abortHandler);
|
|
255
|
+
}
|
|
256
|
+
this.processQueue();
|
|
257
|
+
return pending;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Acquire a group of resource slots via atomic queued reservation.
|
|
261
|
+
*
|
|
262
|
+
* Charges **one slot per reserved entry** (duplicate providers each consume a
|
|
263
|
+
* slot up to baseline). The outer reservation is **capacity-aware**: the
|
|
264
|
+
* request is clamped to configured baselines so oversized competitions remain
|
|
265
|
+
* runnable (per provider min(count, baseline), total ≤ configured global max).
|
|
266
|
+
* Overflow beyond that clamp is left to the caller to serialize.
|
|
267
|
+
*
|
|
268
|
+
* The group receives **no handles** until every reserved slot fits current
|
|
269
|
+
* effective capacity; there are never partial holds. Transient effective
|
|
270
|
+
* reductions cause a wait (queue), not a hard reject.
|
|
271
|
+
*
|
|
272
|
+
* Ordering is owned by the shared manager queue (FIFO / fairness with
|
|
273
|
+
* single-slot entries).
|
|
274
|
+
*
|
|
275
|
+
* @param providers - Providers for each requested slot (order preserved)
|
|
276
|
+
* @param signal - Optional AbortSignal for cancellation while queued
|
|
277
|
+
* @param timeoutMs - Max time to wait for the full group (default: RESOURCE_ACQUISITION_TIMEOUT_MS)
|
|
278
|
+
*/
|
|
279
|
+
acquireMany(providers, signal, timeoutMs = RESOURCE_ACQUISITION_TIMEOUT_MS) {
|
|
280
|
+
if (providers.length === 0) {
|
|
281
|
+
return Promise.reject(new Error("acquireMany requires at least one provider slot"));
|
|
282
|
+
}
|
|
283
|
+
const reservedProviders = this.clampProvidersToBaselineCapacity(providers);
|
|
284
|
+
if (reservedProviders.length === 0) {
|
|
285
|
+
return Promise.reject(
|
|
286
|
+
new Error(
|
|
287
|
+
"acquireMany could not reserve any slots: all providers have zero configured baseline capacity"
|
|
288
|
+
)
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
if (signal?.aborted) {
|
|
292
|
+
return Promise.reject(new Error("Group acquisition aborted before queuing"));
|
|
293
|
+
}
|
|
294
|
+
if (this.queue.length === 0) {
|
|
295
|
+
const immediate = this.tryAcquireGroup(reservedProviders);
|
|
296
|
+
if (immediate) {
|
|
297
|
+
return Promise.resolve(immediate);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
let pendingResolve;
|
|
301
|
+
let pendingReject;
|
|
302
|
+
const pending = new Promise((resolve, reject) => {
|
|
303
|
+
pendingResolve = resolve;
|
|
304
|
+
pendingReject = reject;
|
|
305
|
+
});
|
|
306
|
+
pending.catch(() => {
|
|
307
|
+
});
|
|
308
|
+
const queuedAt = Date.now();
|
|
309
|
+
let timeoutHandle = null;
|
|
310
|
+
let abortHandler = null;
|
|
311
|
+
const cleanup = () => {
|
|
312
|
+
if (timeoutHandle) {
|
|
313
|
+
clearTimeout(timeoutHandle);
|
|
314
|
+
}
|
|
315
|
+
if (abortHandler && signal) {
|
|
316
|
+
signal.removeEventListener("abort", abortHandler);
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
const wrappedResolve = (handles) => {
|
|
320
|
+
cleanup();
|
|
321
|
+
pendingResolve(handles);
|
|
322
|
+
};
|
|
323
|
+
const wrappedReject = (error) => {
|
|
324
|
+
cleanup();
|
|
325
|
+
const index = this.queue.findIndex((e) => e.resolveGroup === wrappedResolve);
|
|
326
|
+
if (index !== -1) {
|
|
327
|
+
this.queue.splice(index, 1);
|
|
328
|
+
}
|
|
329
|
+
queueMicrotask(() => pendingReject(error));
|
|
330
|
+
};
|
|
331
|
+
const primaryProvider = reservedProviders[0];
|
|
332
|
+
const weight = reservedProviders.reduce((sum, provider) => sum + this.calculateWeight(provider), 0) / reservedProviders.length;
|
|
333
|
+
const entry = {
|
|
334
|
+
provider: primaryProvider,
|
|
335
|
+
providers: [...reservedProviders],
|
|
336
|
+
// Single resolve is unused for groups; provide a no-op to satisfy the type.
|
|
337
|
+
resolve: () => {
|
|
338
|
+
},
|
|
339
|
+
resolveGroup: wrappedResolve,
|
|
340
|
+
reject: wrappedReject,
|
|
341
|
+
signal,
|
|
342
|
+
queuedAt,
|
|
343
|
+
weight
|
|
344
|
+
};
|
|
345
|
+
this.queue.push(entry);
|
|
346
|
+
timeoutHandle = setTimeout(() => {
|
|
347
|
+
const waitTimeMs = Date.now() - queuedAt;
|
|
348
|
+
const error = new Error(
|
|
349
|
+
`Resource group acquisition timeout after ${waitTimeMs}ms (limit: ${timeoutMs}ms). Providers: [${reservedProviders.join(", ")}], Active: ${this.globalActiveCount}/${this.globalMaxConcurrent} global, Queued: ${this.queue.length}. This may indicate resource contention or a leak (release() not called).`
|
|
350
|
+
);
|
|
351
|
+
this.emitTelemetry({
|
|
352
|
+
type: "resource_timeout",
|
|
353
|
+
provider: primaryProvider,
|
|
354
|
+
waitTimeMs,
|
|
355
|
+
status: this.getStatus(),
|
|
356
|
+
timestamp: Date.now(),
|
|
357
|
+
error
|
|
358
|
+
});
|
|
359
|
+
wrappedReject(error);
|
|
360
|
+
}, timeoutMs);
|
|
361
|
+
if (signal) {
|
|
362
|
+
abortHandler = () => {
|
|
363
|
+
const waitTimeMs = Date.now() - queuedAt;
|
|
364
|
+
const error = new Error(
|
|
365
|
+
`Resource group acquisition cancelled after ${waitTimeMs}ms for providers [${reservedProviders.join(", ")}]`
|
|
366
|
+
);
|
|
367
|
+
this.emitTelemetry({
|
|
368
|
+
type: "resource_cancelled",
|
|
369
|
+
provider: primaryProvider,
|
|
370
|
+
waitTimeMs,
|
|
371
|
+
status: this.getStatus(),
|
|
372
|
+
timestamp: Date.now(),
|
|
373
|
+
error
|
|
374
|
+
});
|
|
375
|
+
wrappedReject(error);
|
|
376
|
+
};
|
|
377
|
+
signal.addEventListener("abort", abortHandler);
|
|
378
|
+
}
|
|
379
|
+
this.processQueue();
|
|
380
|
+
return pending;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Try to acquire a resource slot (non-blocking)
|
|
384
|
+
*
|
|
385
|
+
* Returns immediately with a handle if available, or null if at capacity.
|
|
386
|
+
* Useful for opportunistic acquisition without blocking.
|
|
387
|
+
*
|
|
388
|
+
* @param provider - Provider ID requesting the resource
|
|
389
|
+
* @returns Resource handle if available, null otherwise
|
|
390
|
+
*
|
|
391
|
+
* @example
|
|
392
|
+
* ```typescript
|
|
393
|
+
* const handle = manager.tryAcquire('gemini');
|
|
394
|
+
* if (handle) {
|
|
395
|
+
* try {
|
|
396
|
+
* await executeTask();
|
|
397
|
+
* } finally {
|
|
398
|
+
* await handle.release();
|
|
399
|
+
* }
|
|
400
|
+
* } else {
|
|
401
|
+
* console.log('At capacity, will queue later');
|
|
402
|
+
* }
|
|
403
|
+
* ```
|
|
404
|
+
*/
|
|
405
|
+
tryAcquire(provider) {
|
|
406
|
+
const providerLimit = this.getEffectiveProviderLimit(provider);
|
|
407
|
+
const providerActive = this.providerActiveCounts.get(provider) ?? 0;
|
|
408
|
+
const canAcquireProvider = providerActive < providerLimit;
|
|
409
|
+
const canAcquireGlobal = this.globalActiveCount < this.globalMaxConcurrent;
|
|
410
|
+
if (!canAcquireProvider || !canAcquireGlobal) {
|
|
411
|
+
if (process.env.DEBUG_ORCHESTRATOR) {
|
|
412
|
+
console.log(
|
|
413
|
+
`[DEBUG] At capacity for ${provider}: canAcquireProvider=${canAcquireProvider}, canAcquireGlobal=${canAcquireGlobal}, active=${providerActive}, limit=${providerLimit}, globalActive=${this.globalActiveCount}, globalMax=${this.globalMaxConcurrent}`
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
return null;
|
|
417
|
+
}
|
|
418
|
+
this.globalActiveCount++;
|
|
419
|
+
this.providerActiveCounts.set(provider, providerActive + 1);
|
|
420
|
+
this.updateUsageHistory(provider);
|
|
421
|
+
const acquiredAt = Date.now();
|
|
422
|
+
let released = false;
|
|
423
|
+
const release = async () => {
|
|
424
|
+
if (released) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
released = true;
|
|
428
|
+
await this.releaseInternal(provider, acquiredAt);
|
|
429
|
+
};
|
|
430
|
+
this.emitTelemetry({
|
|
431
|
+
type: "resource_acquired",
|
|
432
|
+
provider,
|
|
433
|
+
waitTimeMs: 0,
|
|
434
|
+
// Immediate acquisition
|
|
435
|
+
status: this.getStatus(),
|
|
436
|
+
timestamp: acquiredAt
|
|
437
|
+
});
|
|
438
|
+
return {
|
|
439
|
+
provider,
|
|
440
|
+
release,
|
|
441
|
+
acquiredAt
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Get current resource status
|
|
446
|
+
*
|
|
447
|
+
* @returns Current utilization across all providers
|
|
448
|
+
*/
|
|
449
|
+
getStatus() {
|
|
450
|
+
const timestamp = Date.now();
|
|
451
|
+
const providers = {};
|
|
452
|
+
const providerIds = Array.from(this.providerLimits.keys());
|
|
453
|
+
for (const provider of providerIds) {
|
|
454
|
+
const limit = this.getEffectiveProviderLimit(provider);
|
|
455
|
+
const active = this.providerActiveCounts.get(provider) ?? 0;
|
|
456
|
+
const queued = this.queue.reduce((count, entry) => {
|
|
457
|
+
if (entry.providers && entry.providers.length > 0) {
|
|
458
|
+
return count + entry.providers.filter((p) => p === provider).length;
|
|
459
|
+
}
|
|
460
|
+
return count + (entry.provider === provider ? 1 : 0);
|
|
461
|
+
}, 0);
|
|
462
|
+
const utilization = limit > 0 ? Math.round(active / limit * 100) : 0;
|
|
463
|
+
const available = Math.max(0, limit - active);
|
|
464
|
+
providers[provider] = {
|
|
465
|
+
provider,
|
|
466
|
+
active,
|
|
467
|
+
queued,
|
|
468
|
+
max: limit,
|
|
469
|
+
utilization,
|
|
470
|
+
available
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
const globalUtilization = this.globalMaxConcurrent > 0 ? Math.round(this.globalActiveCount / this.globalMaxConcurrent * 100) : 0;
|
|
474
|
+
const globalAvailable = Math.max(0, this.globalMaxConcurrent - this.globalActiveCount);
|
|
475
|
+
return {
|
|
476
|
+
global: {
|
|
477
|
+
active: this.globalActiveCount,
|
|
478
|
+
queued: this.queue.length,
|
|
479
|
+
max: this.globalMaxConcurrent,
|
|
480
|
+
utilization: globalUtilization,
|
|
481
|
+
available: globalAvailable,
|
|
482
|
+
baselineMax: this.configuredGlobalMaxConcurrent
|
|
483
|
+
},
|
|
484
|
+
backpressure: {
|
|
485
|
+
active: this.lastBackpressureDecision.backpressureActive,
|
|
486
|
+
recommendedGlobalConcurrency: this.lastBackpressureDecision.recommendedGlobalConcurrency,
|
|
487
|
+
configuredGlobalConcurrency: this.configuredGlobalMaxConcurrent,
|
|
488
|
+
evaluatedAt: this.lastBackpressureUpdatedAt,
|
|
489
|
+
reason: this.lastBackpressureDecision.reason,
|
|
490
|
+
pressureLevel: this.lastBackpressureDecision.pressureLevel
|
|
491
|
+
},
|
|
492
|
+
providers,
|
|
493
|
+
fairnessMode: this.fairnessMode,
|
|
494
|
+
timestamp
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Get queue depth and estimated wait time for a provider
|
|
499
|
+
*
|
|
500
|
+
* Estimates are best-effort and intended for fail-fast routing decisions.
|
|
501
|
+
*/
|
|
502
|
+
getQueueStatus(provider) {
|
|
503
|
+
const providerQueued = this.queue.reduce((count, entry) => {
|
|
504
|
+
if (entry.providers && entry.providers.length > 0) {
|
|
505
|
+
return count + entry.providers.filter((p) => p === provider).length;
|
|
506
|
+
}
|
|
507
|
+
return count + (entry.provider === provider ? 1 : 0);
|
|
508
|
+
}, 0);
|
|
509
|
+
const providerActive = this.providerActiveCounts.get(provider) ?? 0;
|
|
510
|
+
const providerMax = this.getEffectiveProviderLimit(provider);
|
|
511
|
+
const avgProviderHoldMs = Math.max(1e3, this.providerAvgHoldMs.get(provider) ?? 6e4);
|
|
512
|
+
const globalQueued = this.queue.length;
|
|
513
|
+
const globalActive = this.globalActiveCount;
|
|
514
|
+
const globalMax = this.globalMaxConcurrent;
|
|
515
|
+
const avgGlobalHoldMs = Math.max(1e3, this.globalAvgHoldMs);
|
|
516
|
+
const providerWaves = providerQueued <= 0 ? 0 : Math.ceil(providerQueued / Math.max(1, providerMax));
|
|
517
|
+
const providerWaitMs = providerWaves * Math.ceil(avgProviderHoldMs / Math.max(1, providerMax));
|
|
518
|
+
const globalWaves = globalQueued <= 0 ? 0 : Math.ceil(globalQueued / Math.max(1, globalMax));
|
|
519
|
+
const globalWaitMs = globalWaves * Math.ceil(avgGlobalHoldMs / Math.max(1, globalMax));
|
|
520
|
+
return {
|
|
521
|
+
provider,
|
|
522
|
+
queued: providerQueued,
|
|
523
|
+
active: providerActive,
|
|
524
|
+
max: providerMax,
|
|
525
|
+
estimatedWaitMs: Math.max(providerWaitMs, globalWaitMs),
|
|
526
|
+
globalQueued,
|
|
527
|
+
globalActive,
|
|
528
|
+
globalMax
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Update provider-specific concurrency baseline dynamically
|
|
533
|
+
*
|
|
534
|
+
* Useful for runtime tuning based on observed performance. The new value is
|
|
535
|
+
* authoritative in both directions, still bounded by any correctness ceiling
|
|
536
|
+
* (`providerHardCaps`) and by live rate-limit penalties.
|
|
537
|
+
*
|
|
538
|
+
* @param provider - Provider ID
|
|
539
|
+
* @param newLimit - New concurrency limit (must be >= 1)
|
|
540
|
+
*
|
|
541
|
+
* @example
|
|
542
|
+
* ```typescript
|
|
543
|
+
* // Raise Cursor capacity after validating host resources
|
|
544
|
+
* manager.updateProviderLimit('cursor', 3);
|
|
545
|
+
* ```
|
|
546
|
+
*/
|
|
547
|
+
updateProviderLimit(provider, newLimit) {
|
|
548
|
+
if (newLimit < 1) {
|
|
549
|
+
throw new Error(`Invalid limit for ${provider}: ${newLimit} (must be >= 1)`);
|
|
550
|
+
}
|
|
551
|
+
const previousEffective = this.getEffectiveProviderLimit(provider);
|
|
552
|
+
this.providerLimits.set(provider, newLimit);
|
|
553
|
+
if (this.getEffectiveProviderLimit(provider) > previousEffective) {
|
|
554
|
+
this.processQueue();
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Update the global concurrency limit.
|
|
559
|
+
*
|
|
560
|
+
* This is intentionally non-preemptive: active work continues, and the new
|
|
561
|
+
* limit only affects future acquisitions and queue draining.
|
|
562
|
+
*/
|
|
563
|
+
updateGlobalLimit(newLimit) {
|
|
564
|
+
if (newLimit < 1) {
|
|
565
|
+
throw new Error(`Invalid global limit: ${newLimit} (must be >= 1)`);
|
|
566
|
+
}
|
|
567
|
+
const nextLimit = Math.max(
|
|
568
|
+
1,
|
|
569
|
+
Math.min(this.configuredGlobalMaxConcurrent, Math.floor(newLimit))
|
|
570
|
+
);
|
|
571
|
+
const previousLimit = this.globalMaxConcurrent;
|
|
572
|
+
if (nextLimit === previousLimit) {
|
|
573
|
+
return;
|
|
574
|
+
}
|
|
575
|
+
this.globalMaxConcurrent = nextLimit;
|
|
576
|
+
this.lastBackpressureUpdatedAt = Date.now();
|
|
577
|
+
const decision = {
|
|
578
|
+
recommendedGlobalConcurrency: nextLimit,
|
|
579
|
+
backpressureActive: nextLimit < this.configuredGlobalMaxConcurrent,
|
|
580
|
+
reason: nextLimit < previousLimit ? "concurrency reduced by backpressure" : "concurrency increased after recovery",
|
|
581
|
+
pressureLevel: nextLimit < previousLimit ? nextLimit <= Math.max(1, Math.floor(previousLimit / 2)) ? "critical" : "backpressure" : nextLimit === this.configuredGlobalMaxConcurrent ? "healthy" : "watch"
|
|
582
|
+
};
|
|
583
|
+
this.lastBackpressureDecision = decision;
|
|
584
|
+
if (nextLimit > previousLimit) {
|
|
585
|
+
this.processQueue();
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Evaluate and apply the current backpressure policy.
|
|
590
|
+
*
|
|
591
|
+
* Returns the decision so callers can log or persist the same signal that
|
|
592
|
+
* was applied to the manager.
|
|
593
|
+
*/
|
|
594
|
+
applyBackpressure(snapshot) {
|
|
595
|
+
const decision = recommendGlobalConcurrency(snapshot);
|
|
596
|
+
const previousLimit = this.globalMaxConcurrent;
|
|
597
|
+
if (decision.recommendedGlobalConcurrency !== previousLimit) {
|
|
598
|
+
this.updateGlobalLimit(decision.recommendedGlobalConcurrency);
|
|
599
|
+
this.lastBackpressureDecision = decision;
|
|
600
|
+
this.lastBackpressureUpdatedAt = Date.now();
|
|
601
|
+
this.emitTelemetry({
|
|
602
|
+
type: decision.backpressureActive ? "backpressure_active" : decision.recommendedGlobalConcurrency === this.configuredGlobalMaxConcurrent ? "backpressure_released" : "concurrency_adjusted",
|
|
603
|
+
provider: "system",
|
|
604
|
+
status: this.getStatus(),
|
|
605
|
+
timestamp: Date.now(),
|
|
606
|
+
snapshot,
|
|
607
|
+
previousGlobalConcurrency: previousLimit,
|
|
608
|
+
recommendedGlobalConcurrency: decision.recommendedGlobalConcurrency,
|
|
609
|
+
appliedGlobalConcurrency: this.globalMaxConcurrent,
|
|
610
|
+
reason: decision.reason,
|
|
611
|
+
backpressureActive: decision.backpressureActive
|
|
612
|
+
});
|
|
613
|
+
return decision;
|
|
614
|
+
}
|
|
615
|
+
this.lastBackpressureDecision = decision;
|
|
616
|
+
this.lastBackpressureUpdatedAt = Date.now();
|
|
617
|
+
return decision;
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Register a telemetry hook
|
|
621
|
+
*
|
|
622
|
+
* @param hook - Callback function for telemetry events
|
|
623
|
+
*
|
|
624
|
+
* @example
|
|
625
|
+
* ```typescript
|
|
626
|
+
* manager.onTelemetry((event) => {
|
|
627
|
+
* console.log(`[${event.type}] ${event.provider} - wait: ${event.waitTimeMs}ms`);
|
|
628
|
+
* });
|
|
629
|
+
* ```
|
|
630
|
+
*/
|
|
631
|
+
onTelemetry(hook) {
|
|
632
|
+
this.telemetryHooks.push(hook);
|
|
633
|
+
}
|
|
634
|
+
/**
|
|
635
|
+
* Reset the manager (for testing or recovery)
|
|
636
|
+
*
|
|
637
|
+
* WARNING: Only use when you're sure no executions are running
|
|
638
|
+
*/
|
|
639
|
+
reset() {
|
|
640
|
+
if (this.globalActiveCount > 0 || this.queue.length > 0) {
|
|
641
|
+
console.warn(
|
|
642
|
+
`[ProviderAwareResourceManager] reset() called with ${this.globalActiveCount} active slots and ${this.queue.length} queued requests \u2014 potential race condition`
|
|
643
|
+
);
|
|
644
|
+
}
|
|
645
|
+
const queuedEntries = this.queue.splice(0);
|
|
646
|
+
for (const entry of queuedEntries) {
|
|
647
|
+
entry.reject(new Error("Resource acquisition cancelled by manager reset"));
|
|
648
|
+
}
|
|
649
|
+
this.globalActiveCount = 0;
|
|
650
|
+
this.globalMaxConcurrent = this.configuredGlobalMaxConcurrent;
|
|
651
|
+
this.lastBackpressureUpdatedAt = Date.now();
|
|
652
|
+
this.lastBackpressureDecision = {
|
|
653
|
+
recommendedGlobalConcurrency: this.configuredGlobalMaxConcurrent,
|
|
654
|
+
backpressureActive: false,
|
|
655
|
+
reason: "reset to baseline",
|
|
656
|
+
pressureLevel: "healthy"
|
|
657
|
+
};
|
|
658
|
+
this.globalAvgHoldMs = 6e4;
|
|
659
|
+
const providerIds = Array.from(this.providerActiveCounts.keys());
|
|
660
|
+
for (const provider of providerIds) {
|
|
661
|
+
this.providerActiveCounts.set(provider, 0);
|
|
662
|
+
this.providerUsageHistory.set(provider, 0);
|
|
663
|
+
this.providerAvgHoldMs.set(provider, 6e4);
|
|
664
|
+
}
|
|
665
|
+
this.lastProviderServiced = null;
|
|
666
|
+
}
|
|
667
|
+
// ============================================================================
|
|
668
|
+
// Private Methods
|
|
669
|
+
// ============================================================================
|
|
670
|
+
/**
|
|
671
|
+
* Configured baseline max for a provider (not temporary effective/penalty),
|
|
672
|
+
* bounded by any correctness ceiling.
|
|
673
|
+
*
|
|
674
|
+
* The hard cap is applied here — not only in getEffectiveProviderLimit — so
|
|
675
|
+
* group reservation (clampProvidersToBaselineCapacity) never reserves slots
|
|
676
|
+
* that acquisition can never grant, which would queue a group until timeout.
|
|
677
|
+
*/
|
|
678
|
+
getConfiguredProviderBaseline(provider) {
|
|
679
|
+
const baseline = this.providerLimits.get(provider) ?? getProviderConcurrencyBaseline(provider);
|
|
680
|
+
const hardCap = this.providerHardCaps.get(provider);
|
|
681
|
+
return hardCap === void 0 ? baseline : Math.min(baseline, hardCap);
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* Clamp an outer competition reservation to configured baselines so oversized
|
|
685
|
+
* variant lists remain runnable. Overflow beyond the clamp is not reserved
|
|
686
|
+
* (callers serialize that work). Never produces a group larger than baseline
|
|
687
|
+
* global or per-provider capacity.
|
|
688
|
+
*
|
|
689
|
+
* - Per provider: at most configured baseline slots (order preserved)
|
|
690
|
+
* - Total: at most configured global max
|
|
691
|
+
* - Each reserved entry keeps its actual provider association
|
|
692
|
+
*/
|
|
693
|
+
clampProvidersToBaselineCapacity(providers) {
|
|
694
|
+
const globalMax = this.configuredGlobalMaxConcurrent;
|
|
695
|
+
const perProviderTaken = /* @__PURE__ */ new Map();
|
|
696
|
+
const clamped = [];
|
|
697
|
+
for (const provider of providers) {
|
|
698
|
+
if (clamped.length >= globalMax) {
|
|
699
|
+
break;
|
|
700
|
+
}
|
|
701
|
+
const baseline = Math.max(0, this.getConfiguredProviderBaseline(provider));
|
|
702
|
+
const taken = perProviderTaken.get(provider) ?? 0;
|
|
703
|
+
if (taken >= baseline) {
|
|
704
|
+
continue;
|
|
705
|
+
}
|
|
706
|
+
clamped.push(provider);
|
|
707
|
+
perProviderTaken.set(provider, taken + 1);
|
|
708
|
+
}
|
|
709
|
+
return clamped;
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Whether the full group fits current effective capacity without taking any slots.
|
|
713
|
+
*/
|
|
714
|
+
canGrantGroup(providers) {
|
|
715
|
+
let simulatedGlobal = this.globalActiveCount;
|
|
716
|
+
const simulatedProvider = new Map(this.providerActiveCounts);
|
|
717
|
+
for (const provider of providers) {
|
|
718
|
+
const providerLimit = this.getEffectiveProviderLimit(provider);
|
|
719
|
+
const providerActive = simulatedProvider.get(provider) ?? 0;
|
|
720
|
+
if (providerActive >= providerLimit) {
|
|
721
|
+
return false;
|
|
722
|
+
}
|
|
723
|
+
if (simulatedGlobal >= this.globalMaxConcurrent) {
|
|
724
|
+
return false;
|
|
725
|
+
}
|
|
726
|
+
simulatedProvider.set(provider, providerActive + 1);
|
|
727
|
+
simulatedGlobal += 1;
|
|
728
|
+
}
|
|
729
|
+
return true;
|
|
730
|
+
}
|
|
731
|
+
/**
|
|
732
|
+
* Atomically grant every slot in the group, or return null without holding any.
|
|
733
|
+
* Never leaves partial holds.
|
|
734
|
+
*/
|
|
735
|
+
tryAcquireGroup(providers, waitTimeMs = 0) {
|
|
736
|
+
if (!this.canGrantGroup(providers)) {
|
|
737
|
+
return null;
|
|
738
|
+
}
|
|
739
|
+
const acquiredAt = Date.now();
|
|
740
|
+
const handles = [];
|
|
741
|
+
for (const provider of providers) {
|
|
742
|
+
this.globalActiveCount++;
|
|
743
|
+
const providerActive = this.providerActiveCounts.get(provider) ?? 0;
|
|
744
|
+
this.providerActiveCounts.set(provider, providerActive + 1);
|
|
745
|
+
this.updateUsageHistory(provider);
|
|
746
|
+
let released = false;
|
|
747
|
+
const release = async () => {
|
|
748
|
+
if (released) {
|
|
749
|
+
return;
|
|
750
|
+
}
|
|
751
|
+
released = true;
|
|
752
|
+
await this.releaseInternal(provider, acquiredAt);
|
|
753
|
+
};
|
|
754
|
+
handles.push({
|
|
755
|
+
provider,
|
|
756
|
+
release,
|
|
757
|
+
acquiredAt
|
|
758
|
+
});
|
|
759
|
+
this.emitTelemetry({
|
|
760
|
+
type: "resource_acquired",
|
|
761
|
+
provider,
|
|
762
|
+
waitTimeMs,
|
|
763
|
+
status: this.getStatus(),
|
|
764
|
+
timestamp: acquiredAt
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
return handles;
|
|
768
|
+
}
|
|
769
|
+
/**
|
|
770
|
+
* Internal release implementation
|
|
771
|
+
*/
|
|
772
|
+
async releaseInternal(provider, acquiredAt) {
|
|
773
|
+
const currentActive = this.providerActiveCounts.get(provider) ?? 0;
|
|
774
|
+
if (currentActive <= 0) {
|
|
775
|
+
throw new Error(
|
|
776
|
+
`Cannot release ${provider} - no active executions (possible double-release)`
|
|
777
|
+
);
|
|
778
|
+
}
|
|
779
|
+
if (this.globalActiveCount <= 0) {
|
|
780
|
+
throw new Error("Cannot release - no global active executions (possible double-release)");
|
|
781
|
+
}
|
|
782
|
+
this.globalActiveCount--;
|
|
783
|
+
this.providerActiveCounts.set(provider, currentActive - 1);
|
|
784
|
+
const holdTimeMs = Date.now() - acquiredAt;
|
|
785
|
+
this.updateHoldTimeEstimates(provider, holdTimeMs);
|
|
786
|
+
this.emitTelemetry({
|
|
787
|
+
type: "resource_released",
|
|
788
|
+
provider,
|
|
789
|
+
waitTimeMs: holdTimeMs,
|
|
790
|
+
status: this.getStatus(),
|
|
791
|
+
timestamp: Date.now()
|
|
792
|
+
});
|
|
793
|
+
this.processQueue();
|
|
794
|
+
}
|
|
795
|
+
/**
|
|
796
|
+
* Effective per-provider capacity for the next acquisition decision.
|
|
797
|
+
*
|
|
798
|
+
* Composed rather than minimum-clamped, because the three inputs answer three
|
|
799
|
+
* different questions and only one of them is an upper bound on operator
|
|
800
|
+
* intent:
|
|
801
|
+
*
|
|
802
|
+
* baseline — configured capacity for THIS host (override, else shipped
|
|
803
|
+
* default). An override replaces the default in both directions;
|
|
804
|
+
* clamping it downward against the default is what previously
|
|
805
|
+
* made every host overlay and `--provider-limit` inert.
|
|
806
|
+
* hard cap — correctness ceiling (concurrency would be unsafe, not merely
|
|
807
|
+
* expensive). Never raisable by configuration.
|
|
808
|
+
* penalty — live rate-limit throttle, one-way down, decays on its own.
|
|
809
|
+
*
|
|
810
|
+
* Penalty is applied to the capped baseline so an operator who raised capacity
|
|
811
|
+
* is still throttled proportionally by an observed 429 instead of having the
|
|
812
|
+
* override discarded outright.
|
|
813
|
+
*/
|
|
814
|
+
getEffectiveProviderLimit(provider) {
|
|
815
|
+
return applyProviderConcurrencyPenalty(provider, this.getConfiguredProviderBaseline(provider));
|
|
816
|
+
}
|
|
817
|
+
/**
|
|
818
|
+
* Compute a queue-wait ceiling for a stage that is about to be enqueued for
|
|
819
|
+
* `provider`, given the number of same-provider stages dispatched together in
|
|
820
|
+
* the same wave (`coDispatchedCount`).
|
|
821
|
+
*
|
|
822
|
+
* A flat ceiling (e.g. one variant duration) false-fails the back of a large
|
|
823
|
+
* same-provider wave: with provider limit N and W co-dispatched stages, a
|
|
824
|
+
* stage at the back waits up to ceil(W / N) variant durations before it can
|
|
825
|
+
* even start. This scales the ceiling by that batch depth so a legitimately
|
|
826
|
+
* queued stage is not failed while earlier stages are still running, while
|
|
827
|
+
* still bounding the wait so a genuine leak/deadlock is eventually surfaced.
|
|
828
|
+
*
|
|
829
|
+
* @param perVariantMs The expected upper bound on a single variant's hold time.
|
|
830
|
+
* @param coDispatchedCount Number of stages (incl. this one) dispatched together for this provider.
|
|
831
|
+
* @param totalWaveCount Total stages dispatched together across ALL providers in this wave.
|
|
832
|
+
* When omitted, defaults to coDispatchedCount (provider-only sizing).
|
|
833
|
+
*/
|
|
834
|
+
computeQueueWaitCeilingMs(provider, perVariantMs, coDispatchedCount, totalWaveCount) {
|
|
835
|
+
const providerLimit = Math.max(1, this.getEffectiveProviderLimit(provider));
|
|
836
|
+
const globalLimit = Math.max(1, this.globalMaxConcurrent);
|
|
837
|
+
const providerWidth = Math.min(providerLimit, globalLimit);
|
|
838
|
+
const providerBatches = Math.ceil(Math.max(1, coDispatchedCount) / providerWidth);
|
|
839
|
+
const waveCount = Math.max(coDispatchedCount, totalWaveCount ?? coDispatchedCount);
|
|
840
|
+
const globalBatches = Math.ceil(Math.max(1, waveCount) / globalLimit);
|
|
841
|
+
const batches = Math.max(1, providerBatches, globalBatches);
|
|
842
|
+
return perVariantMs * (batches + 1);
|
|
843
|
+
}
|
|
844
|
+
updateHoldTimeEstimates(provider, holdTimeMs) {
|
|
845
|
+
const boundedHoldMs = Math.max(250, Math.min(holdTimeMs, 30 * 60 * 1e3));
|
|
846
|
+
const currentProviderAvg = this.providerAvgHoldMs.get(provider) ?? 6e4;
|
|
847
|
+
const nextProviderAvg = Math.round(
|
|
848
|
+
currentProviderAvg + this.holdTimeEwmaAlpha * (boundedHoldMs - currentProviderAvg)
|
|
849
|
+
);
|
|
850
|
+
this.providerAvgHoldMs.set(provider, nextProviderAvg);
|
|
851
|
+
this.globalAvgHoldMs = Math.round(
|
|
852
|
+
this.globalAvgHoldMs + this.holdTimeEwmaAlpha * (boundedHoldMs - this.globalAvgHoldMs)
|
|
853
|
+
);
|
|
854
|
+
}
|
|
855
|
+
/**
|
|
856
|
+
* Process the queue based on fairness mode
|
|
857
|
+
*
|
|
858
|
+
* Attempts to satisfy queued acquisitions in priority order.
|
|
859
|
+
* Single entries use tryAcquire; group entries are granted only when the
|
|
860
|
+
* full group fits (atomic, no partial holds). Runs synchronously to prevent
|
|
861
|
+
* race conditions.
|
|
862
|
+
*/
|
|
863
|
+
processQueue() {
|
|
864
|
+
if (this.queue.length === 0) {
|
|
865
|
+
return;
|
|
866
|
+
}
|
|
867
|
+
let madeProgress = true;
|
|
868
|
+
while (madeProgress && this.queue.length > 0) {
|
|
869
|
+
madeProgress = false;
|
|
870
|
+
this.sortQueueByFairness();
|
|
871
|
+
for (let index = 0; index < this.queue.length; ) {
|
|
872
|
+
const entry = this.queue[index];
|
|
873
|
+
if (!entry) {
|
|
874
|
+
this.queue.splice(index, 1);
|
|
875
|
+
madeProgress = true;
|
|
876
|
+
continue;
|
|
877
|
+
}
|
|
878
|
+
if (entry.signal?.aborted) {
|
|
879
|
+
this.queue.splice(index, 1);
|
|
880
|
+
entry.reject(new Error("Acquisition aborted while queued"));
|
|
881
|
+
madeProgress = true;
|
|
882
|
+
continue;
|
|
883
|
+
}
|
|
884
|
+
if (entry.providers && entry.providers.length > 0 && entry.resolveGroup) {
|
|
885
|
+
const waitTimeMs = Date.now() - entry.queuedAt;
|
|
886
|
+
const handles = this.tryAcquireGroup(entry.providers, waitTimeMs);
|
|
887
|
+
if (handles) {
|
|
888
|
+
this.queue.splice(index, 1);
|
|
889
|
+
entry.resolveGroup(handles);
|
|
890
|
+
madeProgress = true;
|
|
891
|
+
if (this.globalActiveCount >= this.globalMaxConcurrent) {
|
|
892
|
+
return;
|
|
893
|
+
}
|
|
894
|
+
continue;
|
|
895
|
+
}
|
|
896
|
+
index++;
|
|
897
|
+
continue;
|
|
898
|
+
}
|
|
899
|
+
const handle = this.tryAcquire(entry.provider);
|
|
900
|
+
if (handle) {
|
|
901
|
+
this.queue.splice(index, 1);
|
|
902
|
+
entry.resolve(handle);
|
|
903
|
+
madeProgress = true;
|
|
904
|
+
if (this.globalActiveCount >= this.globalMaxConcurrent) {
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
907
|
+
continue;
|
|
908
|
+
}
|
|
909
|
+
index++;
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
/**
|
|
914
|
+
* Sort queue based on fairness mode
|
|
915
|
+
*/
|
|
916
|
+
sortQueueByFairness() {
|
|
917
|
+
switch (this.fairnessMode) {
|
|
918
|
+
case "fifo":
|
|
919
|
+
break;
|
|
920
|
+
case "weighted-fair": {
|
|
921
|
+
this.queue.sort((a, b) => {
|
|
922
|
+
const weightDiff = (a.weight ?? 0) - (b.weight ?? 0);
|
|
923
|
+
if (weightDiff !== 0) return weightDiff;
|
|
924
|
+
return a.queuedAt - b.queuedAt;
|
|
925
|
+
});
|
|
926
|
+
break;
|
|
927
|
+
}
|
|
928
|
+
case "strict-fair": {
|
|
929
|
+
if (this.lastProviderServiced) {
|
|
930
|
+
const lastProviderEntries = this.queue.filter(
|
|
931
|
+
(e) => e.provider === this.lastProviderServiced
|
|
932
|
+
);
|
|
933
|
+
const otherEntries = this.queue.filter((e) => e.provider !== this.lastProviderServiced);
|
|
934
|
+
this.queue.length = 0;
|
|
935
|
+
this.queue.push(...otherEntries, ...lastProviderEntries);
|
|
936
|
+
}
|
|
937
|
+
break;
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
/**
|
|
942
|
+
* Calculate weight for weighted-fair scheduling
|
|
943
|
+
*
|
|
944
|
+
* Lower weight = higher priority
|
|
945
|
+
* Providers with less recent usage get lower weights (higher priority)
|
|
946
|
+
*/
|
|
947
|
+
calculateWeight(provider) {
|
|
948
|
+
const usage = this.providerUsageHistory.get(provider) ?? 0;
|
|
949
|
+
const totalUsage = Array.from(this.providerUsageHistory.values()).reduce(
|
|
950
|
+
(sum, count) => sum + count,
|
|
951
|
+
0
|
|
952
|
+
);
|
|
953
|
+
if (totalUsage === 0) return 0;
|
|
954
|
+
return Math.round(usage / totalUsage * 100);
|
|
955
|
+
}
|
|
956
|
+
/**
|
|
957
|
+
* Update usage history for weighted-fair mode
|
|
958
|
+
*/
|
|
959
|
+
updateUsageHistory(provider) {
|
|
960
|
+
const current = this.providerUsageHistory.get(provider) ?? 0;
|
|
961
|
+
this.providerUsageHistory.set(provider, current + 1);
|
|
962
|
+
this.lastProviderServiced = provider;
|
|
963
|
+
const usageCounts = Array.from(this.providerUsageHistory.values());
|
|
964
|
+
const totalUsage = usageCounts.reduce((sum, count) => sum + count, 0);
|
|
965
|
+
if (totalUsage > this.usageHistoryWindow) {
|
|
966
|
+
const providerIds = Array.from(this.providerUsageHistory.keys());
|
|
967
|
+
for (const p of providerIds) {
|
|
968
|
+
const count = this.providerUsageHistory.get(p) ?? 0;
|
|
969
|
+
this.providerUsageHistory.set(
|
|
970
|
+
p,
|
|
971
|
+
Math.floor(count * this.usageHistoryWindow / totalUsage)
|
|
972
|
+
);
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
/**
|
|
977
|
+
* Emit telemetry event to registered hooks
|
|
978
|
+
*/
|
|
979
|
+
emitTelemetry(event) {
|
|
980
|
+
if (!this.enableTelemetry) return;
|
|
981
|
+
for (const hook of this.telemetryHooks) {
|
|
982
|
+
try {
|
|
983
|
+
hook(event);
|
|
984
|
+
} catch (error) {
|
|
985
|
+
console.error("[ProviderAwareResourceManager] Telemetry hook error:", error);
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
};
|
|
990
|
+
function getDynamicGlobalConcurrency() {
|
|
991
|
+
const totalMemoryGB = totalmem() / 1024 ** 3;
|
|
992
|
+
const envTier = process.env.POETIC_RESOURCE_TIER;
|
|
993
|
+
let tier;
|
|
994
|
+
if (envTier && ["minimal", "standard", "performance", "power", "ultra"].includes(envTier)) {
|
|
995
|
+
tier = envTier;
|
|
996
|
+
} else if (totalMemoryGB < 8) {
|
|
997
|
+
tier = "minimal";
|
|
998
|
+
} else if (totalMemoryGB < 16) {
|
|
999
|
+
tier = "standard";
|
|
1000
|
+
} else if (totalMemoryGB < 32) {
|
|
1001
|
+
tier = "performance";
|
|
1002
|
+
} else if (totalMemoryGB < 64) {
|
|
1003
|
+
tier = "power";
|
|
1004
|
+
} else {
|
|
1005
|
+
tier = "ultra";
|
|
1006
|
+
}
|
|
1007
|
+
const limits = {
|
|
1008
|
+
minimal: 8,
|
|
1009
|
+
standard: 15,
|
|
1010
|
+
performance: 25,
|
|
1011
|
+
power: 40,
|
|
1012
|
+
ultra: 50
|
|
1013
|
+
};
|
|
1014
|
+
return limits[tier];
|
|
1015
|
+
}
|
|
1016
|
+
function createProviderAwareResourceManager(config) {
|
|
1017
|
+
return new ProviderAwareResourceManager(config);
|
|
1018
|
+
}
|
|
1019
|
+
function createDynamicResourceManager(configOverrides) {
|
|
1020
|
+
const dynamicGlobalLimit = getDynamicGlobalConcurrency();
|
|
1021
|
+
const config = {
|
|
1022
|
+
globalMaxConcurrent: configOverrides?.globalMaxConcurrent ?? dynamicGlobalLimit,
|
|
1023
|
+
fairnessMode: configOverrides?.fairnessMode ?? "weighted-fair",
|
|
1024
|
+
enableTelemetry: configOverrides?.enableTelemetry ?? true,
|
|
1025
|
+
providerLimits: configOverrides?.providerLimits,
|
|
1026
|
+
// Correctness ceilings must never be silently dropped on the way through a
|
|
1027
|
+
// factory: providerLimits is authoritative, so losing the caps here would
|
|
1028
|
+
// let an override raise a provider past a safety boundary.
|
|
1029
|
+
providerHardCaps: configOverrides?.providerHardCaps
|
|
1030
|
+
};
|
|
1031
|
+
return new ProviderAwareResourceManager(config);
|
|
1032
|
+
}
|
|
1033
|
+
var DEFAULT_GLOBAL_CONCURRENCY = getDynamicGlobalConcurrency();
|
|
1034
|
+
|
|
1035
|
+
export {
|
|
1036
|
+
captureConcurrencyBackpressureSnapshot,
|
|
1037
|
+
ProviderAwareResourceManager,
|
|
1038
|
+
createProviderAwareResourceManager,
|
|
1039
|
+
createDynamicResourceManager,
|
|
1040
|
+
DEFAULT_GLOBAL_CONCURRENCY
|
|
1041
|
+
};
|
|
1042
|
+
//# sourceMappingURL=chunk-L7E6XCRA.js.map
|