@poetic-ai/poetic 1.42.1-bootstrap.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-MXTSOSST.js +1597 -0
- package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
- package/dist/actions-M3AESHFF.js +322 -0
- package/dist/agent-ingest-HO77TH26.js +53 -0
- package/dist/aggregator-DNCBINFO.js +12 -0
- package/dist/ai-judge-LDWHURKK.js +156 -0
- package/dist/allowlist-grounding-RO6HKUFI.js +16 -0
- package/dist/allowlist-utils-23V7TJ3G.js +28 -0
- package/dist/anchored-turn-service-GFYU6GCQ.js +489 -0
- package/dist/api-transport-FS3CQRMN.js +1087 -0
- package/dist/apply-completion-mode-JBT2CTQO.js +89 -0
- package/dist/artifact-migrator-23L45ISD.js +267 -0
- package/dist/ask-UYVZY7JH.js +135 -0
- package/dist/auth-CSQP5RHJ.js +67 -0
- package/dist/auth-E6XUNZ5M.js +68 -0
- package/dist/auth-KQLJPZ2E.js +134 -0
- package/dist/auth-OC4E6633.js +71 -0
- package/dist/auth-R3NQ2ZF5.js +78 -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-HA3T23SF.js +80 -0
- package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
- package/dist/autoloop-evidence-gates-ACB5YW5G.js +36 -0
- package/dist/autoloop-gate-policy-XZA5EQFN.js +175 -0
- package/dist/autoloop-helpers-EFJLBQUP.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-OPR74YEX.js +85 -0
- package/dist/autoloop-termination-summary-RN75F422.js +58 -0
- package/dist/autoloop-trajectory-K5I45UBR.js +282 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/autonomous-loop-controller-4QJMOIIN.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-WXZHUT42.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-YFASRB5Z.js +71 -0
- package/dist/change-summary-WY7J5TOX.js +33 -0
- package/dist/chunk-25QL3M3L.js +899 -0
- package/dist/chunk-2ABC6SEC.js +2626 -0
- package/dist/chunk-2AICM4P3.js +1763 -0
- package/dist/chunk-2AQUWJPW.js +225 -0
- package/dist/chunk-2DY5KNVM.js +276 -0
- package/dist/chunk-2QJ3H3L7.js +42 -0
- package/dist/chunk-2UH6VQRZ.js +328 -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-2YXZCZTX.js +1160 -0
- package/dist/chunk-32VLDFRT.js +797 -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-3733QTI7.js +6818 -0
- package/dist/chunk-3A5PDH5L.js +12513 -0
- package/dist/chunk-3AOKYKA7.js +22 -0
- package/dist/chunk-3BCUNHKF.js +475 -0
- package/dist/chunk-3C26DPFK.js +566 -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-3JWNRJSB.js +736 -0
- package/dist/chunk-3LUMR3D3.js +156 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3S62LLWJ.js +543 -0
- package/dist/chunk-3VABAKT2.js +1784 -0
- package/dist/chunk-44N5WZZH.js +45 -0
- package/dist/chunk-45FPSA3B.js +125 -0
- package/dist/chunk-4BIPZBT7.js +791 -0
- package/dist/chunk-4BJ3O4RQ.js +929 -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-4HN6DF7V.js +1027 -0
- package/dist/chunk-4HXKHDNH.js +1064 -0
- package/dist/chunk-4KKI477Q.js +44 -0
- package/dist/chunk-4NA7FSTV.js +595 -0
- package/dist/chunk-4NXPXE62.js +84 -0
- package/dist/chunk-4SALLK63.js +9831 -0
- package/dist/chunk-4SHKPCGK.js +110 -0
- package/dist/chunk-4VJITV4P.js +445 -0
- package/dist/chunk-4W2NRXQL.js +1205 -0
- package/dist/chunk-4XICK3HN.js +784 -0
- package/dist/chunk-55EJVV3C.js +385 -0
- package/dist/chunk-5DLKYTQX.js +4003 -0
- package/dist/chunk-5EERLVZB.js +139 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5LAMRH4X.js +969 -0
- package/dist/chunk-5REDMNLZ.js +310 -0
- package/dist/chunk-5UCJARII.js +1984 -0
- package/dist/chunk-5WCQRDRB.js +588 -0
- package/dist/chunk-5WRLK5KW.js +700 -0
- package/dist/chunk-66AGFTBQ.js +131 -0
- package/dist/chunk-66CIO2SV.js +48 -0
- package/dist/chunk-6BM72ZMG.js +31 -0
- package/dist/chunk-6BTFXYRO.js +276 -0
- package/dist/chunk-6EDAJH2I.js +68 -0
- package/dist/chunk-6EQKFDBH.js +457 -0
- package/dist/chunk-6KMJKHIQ.js +2193 -0
- package/dist/chunk-6MFRHTRI.js +115 -0
- package/dist/chunk-6QMUKUHH.js +632 -0
- package/dist/chunk-6TZJRKNW.js +321 -0
- package/dist/chunk-6V7HGQFZ.js +20 -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-73NCTWKL.js +188 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7D7QT3BE.js +688 -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-7IL4A2PP.js +948 -0
- package/dist/chunk-7NPSXSHO.js +975 -0
- package/dist/chunk-7PS6INZP.js +302 -0
- package/dist/chunk-7QCZSLBH.js +1 -0
- package/dist/chunk-7R2WLDOS.js +62 -0
- package/dist/chunk-7XV3QXLT.js +878 -0
- package/dist/chunk-A2WKSVX7.js +43 -0
- package/dist/chunk-A3YGID55.js +133 -0
- package/dist/chunk-A5MRWHMI.js +1604 -0
- package/dist/chunk-A722DEVA.js +14 -0
- package/dist/chunk-AG2Z2SUZ.js +554 -0
- package/dist/chunk-AHWAZ2MU.js +137 -0
- package/dist/chunk-AIAQ3HS3.js +119 -0
- package/dist/chunk-ALAB3PBR.js +2206 -0
- package/dist/chunk-APPNGGN7.js +365 -0
- package/dist/chunk-APV6MK5E.js +137 -0
- package/dist/chunk-AQNPGRWS.js +395 -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-AX6GWE7V.js +47 -0
- package/dist/chunk-AZQILSNQ.js +1376 -0
- package/dist/chunk-B76KHLX6.js +13 -0
- package/dist/chunk-BAV2HJXS.js +194 -0
- package/dist/chunk-BBHRN366.js +89 -0
- package/dist/chunk-BCZAENOH.js +448 -0
- package/dist/chunk-BIGSACCY.js +19527 -0
- package/dist/chunk-BPYMCIVD.js +9243 -0
- package/dist/chunk-BSE4R6XD.js +322 -0
- package/dist/chunk-BVPWRDCO.js +2321 -0
- package/dist/chunk-BXI4NXL3.js +507 -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-CHQV73H5.js +408 -0
- package/dist/chunk-CJC6GZ46.js +457 -0
- package/dist/chunk-CJHRFSNY.js +924 -0
- package/dist/chunk-CKP2Q3TP.js +1905 -0
- package/dist/chunk-CLKSETWE.js +10 -0
- package/dist/chunk-CQM3A35X.js +844 -0
- package/dist/chunk-CSLAS5GW.js +4007 -0
- package/dist/chunk-CTLUBNCW.js +622 -0
- package/dist/chunk-CVMVZWG4.js +3544 -0
- package/dist/chunk-CYB6QDCT.js +263 -0
- package/dist/chunk-D5EP5D2W.js +26 -0
- package/dist/chunk-DC4ZYMXJ.js +115 -0
- package/dist/chunk-DCAVAABI.js +348 -0
- package/dist/chunk-DCYF7EKG.js +26 -0
- package/dist/chunk-DF5SLDE4.js +966 -0
- package/dist/chunk-DN7UMLF7.js +5678 -0
- package/dist/chunk-DSFM56OA.js +1203 -0
- package/dist/chunk-DTY4APYV.js +218 -0
- package/dist/chunk-E3NTPHEO.js +194 -0
- package/dist/chunk-E74LUIID.js +302 -0
- package/dist/chunk-EJ42BNGY.js +2904 -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-EQGIDAUF.js +62 -0
- package/dist/chunk-EX3OM35G.js +20414 -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-FCNAS3W2.js +1033 -0
- package/dist/chunk-FD4ERYEG.js +22 -0
- package/dist/chunk-FDVZLG6Z.js +3104 -0
- package/dist/chunk-FEPIFY7D.js +511 -0
- package/dist/chunk-FEQ4HXL7.js +412 -0
- package/dist/chunk-FFH5HHJU.js +5351 -0
- package/dist/chunk-FH7WOJAE.js +79 -0
- package/dist/chunk-FKAUPHMR.js +96 -0
- package/dist/chunk-FRG57FPM.js +240 -0
- package/dist/chunk-FUVP64ER.js +31 -0
- package/dist/chunk-G2PTLLEL.js +284 -0
- package/dist/chunk-G35UYQ6Z.js +69 -0
- package/dist/chunk-G36W2T2S.js +1143 -0
- package/dist/chunk-G4THLFV3.js +148 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GCCAPO3S.js +118 -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-GJTWJNLV.js +1374 -0
- package/dist/chunk-GKN3HMN4.js +2809 -0
- package/dist/chunk-GNH3QGTL.js +1342 -0
- package/dist/chunk-GOAQ2I7Y.js +7000 -0
- package/dist/chunk-GSGD5E4C.js +30 -0
- package/dist/chunk-GXWAJQOJ.js +5011 -0
- package/dist/chunk-H2AYQIHW.js +224 -0
- package/dist/chunk-H6G7QRMQ.js +35 -0
- package/dist/chunk-H7JAGHZT.js +59 -0
- package/dist/chunk-HAC6EHZZ.js +79 -0
- package/dist/chunk-HE2KH6EQ.js +161 -0
- package/dist/chunk-HIHENQDX.js +66 -0
- package/dist/chunk-HIO33P3G.js +19 -0
- package/dist/chunk-HK4AQZSR.js +438 -0
- package/dist/chunk-HMVQIPH3.js +547 -0
- package/dist/chunk-HOYBYAOA.js +257 -0
- package/dist/chunk-HQLGXODD.js +123 -0
- package/dist/chunk-HQXYYUNY.js +1231 -0
- package/dist/chunk-HY3ESWCA.js +708 -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-I6BL3PDH.js +1024 -0
- package/dist/chunk-IATQ7NBI.js +679 -0
- package/dist/chunk-IC7I6YIJ.js +301 -0
- package/dist/chunk-IDCSOZVN.js +78 -0
- package/dist/chunk-IEXU4RR6.js +5742 -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-IP7BYVUV.js +338 -0
- package/dist/chunk-IRJ2I6KH.js +166 -0
- package/dist/chunk-IUXNGKA6.js +152 -0
- package/dist/chunk-IZYIQQ7X.js +53 -0
- package/dist/chunk-IZZK3H6I.js +2175 -0
- package/dist/chunk-J3J4P7RW.js +353 -0
- package/dist/chunk-J62KPGII.js +464 -0
- package/dist/chunk-J6P3FWWW.js +130 -0
- package/dist/chunk-JD6SIZED.js +712 -0
- package/dist/chunk-JEV6UI7H.js +537 -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-JQD5VYKR.js +483 -0
- package/dist/chunk-JSOWEFEQ.js +351 -0
- package/dist/chunk-JSWMRQYG.js +28 -0
- package/dist/chunk-K4XK7SGB.js +6783 -0
- package/dist/chunk-K54Y7MLK.js +160 -0
- package/dist/chunk-KAT4RXUT.js +521 -0
- package/dist/chunk-KDMKKIRK.js +103 -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-KQEBSK3T.js +274 -0
- package/dist/chunk-KT6VHSPF.js +84 -0
- package/dist/chunk-KTMW65UX.js +14 -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-LGHII5ET.js +23 -0
- package/dist/chunk-LH34OGSB.js +265 -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-LUVKFFWR.js +315 -0
- package/dist/chunk-LWCBNGH6.js +35 -0
- package/dist/chunk-LWTN3WRV.js +260 -0
- package/dist/chunk-LZBBXYWF.js +1004 -0
- package/dist/chunk-M34PS4NE.js +2213 -0
- package/dist/chunk-M3HQYKQX.js +308 -0
- package/dist/chunk-MCPQNJMK.js +482 -0
- package/dist/chunk-MF5HP6XV.js +221 -0
- package/dist/chunk-MFADRRTR.js +112 -0
- package/dist/chunk-MN6PL4AN.js +120 -0
- package/dist/chunk-MQ4WA34C.js +206 -0
- package/dist/chunk-MTVZITQ2.js +185 -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-N5DX4JAK.js +12 -0
- package/dist/chunk-NEDCMN7E.js +415 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NGK6PEOG.js +25 -0
- package/dist/chunk-NM6PMYY4.js +768 -0
- package/dist/chunk-NOZGR2QO.js +2373 -0
- package/dist/chunk-NP2V3L7K.js +226 -0
- package/dist/chunk-NPZJMUZ4.js +194 -0
- package/dist/chunk-NRLY536M.js +260 -0
- package/dist/chunk-NS33V3IM.js +51 -0
- package/dist/chunk-NWOYOA6H.js +378 -0
- package/dist/chunk-NWRUSEXG.js +322 -0
- package/dist/chunk-O6V4PNLO.js +63 -0
- package/dist/chunk-OGMSYL6J.js +227 -0
- package/dist/chunk-OIS7J26S.js +319 -0
- package/dist/chunk-OKBTRSZI.js +205 -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-OSDYVKHW.js +2440 -0
- package/dist/chunk-OUM5S64R.js +3429 -0
- package/dist/chunk-OWB7JXUS.js +751 -0
- package/dist/chunk-OYZYO7TV.js +47 -0
- package/dist/chunk-P47VN5F4.js +282 -0
- package/dist/chunk-P6VQROCO.js +594 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-PA6BCSOX.js +2872 -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-PTH5E5XO.js +195 -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-QGJDMEOV.js +34 -0
- package/dist/chunk-QJYIHVXT.js +100 -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-QU6JQJMH.js +3063 -0
- package/dist/chunk-QVFV5IP2.js +232 -0
- package/dist/chunk-QVZMFDYG.js +29 -0
- package/dist/chunk-R2ZYWNW3.js +1581 -0
- package/dist/chunk-R4UWBC35.js +200 -0
- package/dist/chunk-R6W23LKN.js +254 -0
- package/dist/chunk-RAK5HOIJ.js +459 -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-RIKFAWZF.js +71 -0
- package/dist/chunk-RJAAKDRX.js +17 -0
- package/dist/chunk-RSXSD4MH.js +1016 -0
- package/dist/chunk-RW7RVSDV.js +79 -0
- package/dist/chunk-RWREC3KJ.js +517 -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-S77XPALC.js +239 -0
- package/dist/chunk-SCW4ZF6R.js +150 -0
- package/dist/chunk-SKHGYQ7W.js +405 -0
- package/dist/chunk-SNLBO4BF.js +247 -0
- package/dist/chunk-SP3LFU6B.js +60 -0
- package/dist/chunk-SQZRPY23.js +5181 -0
- package/dist/chunk-SSB5UQHA.js +4128 -0
- package/dist/chunk-STJOHHSF.js +605 -0
- package/dist/chunk-STV6LYYE.js +45 -0
- package/dist/chunk-SUN4OFTW.js +740 -0
- package/dist/chunk-SURZ2WFE.js +326 -0
- package/dist/chunk-SUZ7UYZH.js +1972 -0
- package/dist/chunk-SZ7DL357.js +1047 -0
- package/dist/chunk-T2SZELJL.js +624 -0
- package/dist/chunk-T6VPI2XP.js +10338 -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-TIBZPAD2.js +9924 -0
- package/dist/chunk-TK644IOG.js +1813 -0
- package/dist/chunk-TRSVUPCX.js +25 -0
- package/dist/chunk-TSPQONRT.js +4533 -0
- package/dist/chunk-TSXGRLPR.js +107 -0
- package/dist/chunk-TWYLVAS2.js +152 -0
- package/dist/chunk-U2S3YEX3.js +224 -0
- package/dist/chunk-U32HWI76.js +437 -0
- package/dist/chunk-U45RTRGY.js +818 -0
- package/dist/chunk-U62VCQGR.js +49 -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-UKMAFG7A.js +189 -0
- package/dist/chunk-UUH2RVKS.js +585 -0
- package/dist/chunk-UVBBFDFQ.js +270 -0
- package/dist/chunk-UXZF3B7T.js +75 -0
- package/dist/chunk-V6YLL5WA.js +3746 -0
- package/dist/chunk-V72RMBM4.js +48 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VCAUV5XQ.js +3679 -0
- package/dist/chunk-VDSH7O4Y.js +152 -0
- package/dist/chunk-VNSYKC25.js +24 -0
- package/dist/chunk-VTLNJQ44.js +133 -0
- package/dist/chunk-VV6HOXRC.js +302 -0
- package/dist/chunk-VVGEPBPS.js +218 -0
- package/dist/chunk-VXF4Q3FW.js +20 -0
- package/dist/chunk-W3ZGW3C5.js +331 -0
- package/dist/chunk-W4OMESPG.js +271 -0
- package/dist/chunk-WDUORIHF.js +877 -0
- package/dist/chunk-WDVTY4U6.js +148 -0
- package/dist/chunk-WGXYDLMX.js +4386 -0
- package/dist/chunk-WMPU2UOV.js +82 -0
- package/dist/chunk-WOEVVPDP.js +1125 -0
- package/dist/chunk-WTLMSPBQ.js +256 -0
- package/dist/chunk-X43NMU4Z.js +1124 -0
- package/dist/chunk-X5NTI5U5.js +368 -0
- package/dist/chunk-X6UIEADS.js +949 -0
- package/dist/chunk-XAONGNST.js +57 -0
- package/dist/chunk-XB5YLCLB.js +13 -0
- package/dist/chunk-XGYF2QMZ.js +351 -0
- package/dist/chunk-XHEKQENB.js +255 -0
- package/dist/chunk-XPHKYHO4.js +878 -0
- package/dist/chunk-XQD2B6BB.js +507 -0
- package/dist/chunk-XT2ZQVTC.js +558 -0
- package/dist/chunk-XUSRFFA7.js +1859 -0
- package/dist/chunk-XUXVDPSZ.js +50 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XXCGJGSQ.js +121 -0
- package/dist/chunk-XYGDZCB5.js +659 -0
- package/dist/chunk-XZAMZUX5.js +992 -0
- package/dist/chunk-XZE4XARH.js +563 -0
- package/dist/chunk-Y34DUC4A.js +1356 -0
- package/dist/chunk-Y3J4JMTU.js +61 -0
- package/dist/chunk-Y4RC2YFX.js +1270 -0
- package/dist/chunk-Y55LZN5U.js +52 -0
- package/dist/chunk-Y5677NDO.js +183 -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-YQAAKTVH.js +712 -0
- package/dist/chunk-YVORHQ2S.js +579 -0
- package/dist/chunk-YWNAHW24.js +1552 -0
- package/dist/chunk-Z476RATD.js +1689 -0
- package/dist/chunk-ZDTGECTN.js +235 -0
- package/dist/chunk-ZDTMICNY.js +316 -0
- package/dist/chunk-ZIPWI2LY.js +151 -0
- package/dist/chunk-ZIVYXF7A.js +2344 -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-HUOTBRM3.js +40 -0
- package/dist/cli-validation-WLXWLUJL.js +111 -0
- package/dist/commit-utils-3QV2P6RA.js +202 -0
- package/dist/compete-config-resolver-SNH3TT2Q.js +76 -0
- package/dist/compete-request-XWNPOARL.js +364 -0
- package/dist/compete-results-PAP67LDR.js +208 -0
- package/dist/competition-outcome-tracker-GOZXNAQU.js +38 -0
- package/dist/config-HWHUNA72.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-L3VRNTSG.js +67 -0
- package/dist/config-validator-SIIQEOFQ.js +72 -0
- package/dist/cost-7CX37DU3.js +53 -0
- package/dist/coverage-orchestrator-MNKHD6YC.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-CGBCD7IQ.js +186 -0
- package/dist/domain-analyzer-DL6BDR2N.js +29 -0
- package/dist/ensure-initialized-4BY73HLE.js +52 -0
- package/dist/entry.js +940 -0
- package/dist/environment-IGVH5X53.js +81 -0
- package/dist/error-parser-core-PPZ36A4S.js +50 -0
- package/dist/escalation-ladder-NWY5BJ57.js +130 -0
- package/dist/evaluation-context-KMWDSDYD.js +35 -0
- package/dist/evidence-plan-resolver-YIVH76PU.js +85 -0
- package/dist/execution-data-writer-OHAQ7G5H.js +53 -0
- package/dist/execution-policy-applier-ZHD3DCF3.js +31 -0
- package/dist/execution-preflight-Z4Y64V3I.js +209 -0
- package/dist/execution-roles-KBH2MC3M.js +66 -0
- package/dist/exit-code-error-Z4SW2DVK.js +14 -0
- package/dist/external-temp-cleanup-N2RZH4QP.js +311 -0
- package/dist/factory-IYBMCZG7.js +149 -0
- package/dist/file-utils-XIVR2ZMA.js +47 -0
- package/dist/flywheel-autoloop-executor-R3KD2G4D.js +249 -0
- package/dist/flywheel-competition-executor-XCFGVJSK.js +259 -0
- package/dist/flywheel-executor-LTSIZN2L.js +369 -0
- package/dist/flywheel-git-isolation-CZ5YVVZY.js +48 -0
- package/dist/flywheel-manifest-5UC4VBMA.js +108 -0
- package/dist/flywheel-model-defaults-7CVKP53V.js +27 -0
- package/dist/flywheel-preflight-6E33DJDK.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-AZ46EPRP.js +73 -0
- package/dist/git-worktree-IY6V6DUO.js +18 -0
- package/dist/github-pr-manager-4XUO2YTM.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 +108644 -0
- package/dist/instructions-CM6THDV7.js +64 -0
- package/dist/invoke-provider-auth-V5TC5UDS.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-VA6VXNOV.js +23 -0
- package/dist/linux-host-class-UY4KVLFD.js +29 -0
- package/dist/llm-judge-executor-34YPIRJ7.js +133 -0
- package/dist/local-executor-LJJSCWZX.js +223 -0
- package/dist/logger-6PRYM56M.js +72 -0
- package/dist/loop-spec-XTLQAVZ7.js +191 -0
- package/dist/manager-2HJG5CLT.js +25 -0
- package/dist/matrix-prompt-builder-LHDTJ4TY.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-MCI3F4PX.js +72 -0
- package/dist/next-HQKDXIIR.js +90 -0
- package/dist/next-JC3V2UCS.js +69 -0
- package/dist/optimization-config-resolver-QPSFLCJU.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-DZK24LSZ.js +270 -0
- package/dist/plan-backlog-show-fast-63GBBH6Q.js +406 -0
- package/dist/plan-sprint-list-fast-TJ6ZUF5E.js +162 -0
- package/dist/plan-sprint-status-fast-YWE5X3NG.js +208 -0
- package/dist/plan-task-status-fast-K22BTTBW.js +349 -0
- package/dist/plan-to-flywheel-VFGCPINA.js +456 -0
- package/dist/planning-backlog-Y6TIJYWU.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-2XP3FWH2.js +149 -0
- package/dist/prompts-EPAAAMMF.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-KWTYA5QV.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-33SHK43X.js +70 -0
- package/dist/quickstart-E32SODTA.js +62 -0
- package/dist/readiness-REWW7OSV.js +96 -0
- package/dist/registry-N6L36RE2.js +153 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-2IGD4H7X.js +22 -0
- package/dist/resolution-engine-LXQYDSKS.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-VGQU35QM.js +160 -0
- package/dist/run-poetic-tui-ZZXFDOQ4.js +13517 -0
- package/dist/run-simulation.js +376 -0
- package/dist/runner-2YPKOJ6A.js +1092 -0
- package/dist/runner-HEJJ65AJ.js +1571 -0
- package/dist/safety-OCC4KJJR.js +64 -0
- package/dist/safety-stanza-BSVE6OJU.js +60 -0
- package/dist/sandbox-3AG2WJLM.js +94 -0
- package/dist/sandbox-5JOFBS75.js +81 -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-QGXLN3SO.js +338 -0
- package/dist/sprint-bridge-FNKQCJGL.js +68 -0
- package/dist/sprint-execution-service-4ELKNJDS.js +311 -0
- package/dist/sprint-manager-7TNCXCIX.js +91 -0
- package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
- package/dist/stale-cleanup-orchestrator-H5XKGZP2.js +62 -0
- package/dist/storage-access-F6ALDN4S.js +22 -0
- package/dist/synthesis-TGQUVAW3.js +185 -0
- package/dist/task-classifier-DZIRBSS2.js +494 -0
- package/dist/task-list-fast-PJ2EXVZE.js +147 -0
- package/dist/task-manager-5742GMJK.js +93 -0
- package/dist/task-splitter-6MBXSWF6.js +79 -0
- package/dist/task-type-detector-OLVOMXZO.js +21 -0
- package/dist/task-type-resolver-4HG6TXFV.js +42 -0
- package/dist/telemetry-JX7EMNOZ.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-2MLJ4J6B.js +125 -0
- package/dist/token-estimator-PDU345YE.js +37 -0
- package/dist/transports-3UEO6C5Y.js +255 -0
- package/dist/unified-cost-tracker-F3W5NMPG.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-XCOYVCM4.js +33 -0
- package/dist/variant-state-cleanup-QIEKRULB.js +280 -0
- package/dist/variant-success-PJXWE3ZV.js +12 -0
- package/dist/variant-worker-HPTUA37Z.js +4196 -0
- package/dist/variant-worker.js +24 -0
- package/dist/variants-2HDYZOCG.js +233 -0
- package/dist/verification-toolchains-VVKT3GBF.js +28 -0
- package/dist/verify-commands-5F6CJV4B.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-AGWHD4D2.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 +7040 -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/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,924 @@
|
|
|
1
|
+
import {
|
|
2
|
+
metadata
|
|
3
|
+
} from "./chunk-3FLXLLB7.js";
|
|
4
|
+
import {
|
|
5
|
+
reportTransportDecision,
|
|
6
|
+
selectProviderExecutor
|
|
7
|
+
} from "./chunk-R2ZYWNW3.js";
|
|
8
|
+
import {
|
|
9
|
+
resolveConfiguredProviderExecutionTransport
|
|
10
|
+
} from "./chunk-IZZK3H6I.js";
|
|
11
|
+
import {
|
|
12
|
+
resolveProviderStreamingEnabled
|
|
13
|
+
} from "./chunk-HIO33P3G.js";
|
|
14
|
+
import {
|
|
15
|
+
TMUX_COMPLETION_SIGNAL_GRACE_MS,
|
|
16
|
+
createLineDelimitedTmuxCompletionSignal,
|
|
17
|
+
executeProviderCommand
|
|
18
|
+
} from "./chunk-SQZRPY23.js";
|
|
19
|
+
import {
|
|
20
|
+
writeFileAtomic
|
|
21
|
+
} from "./chunk-36PEBZAF.js";
|
|
22
|
+
import {
|
|
23
|
+
createRetryOptions,
|
|
24
|
+
withRetry
|
|
25
|
+
} from "./chunk-T6VPI2XP.js";
|
|
26
|
+
import {
|
|
27
|
+
deriveOpencodePrefixes
|
|
28
|
+
} from "./chunk-XT2ZQVTC.js";
|
|
29
|
+
import {
|
|
30
|
+
safeJsonParse
|
|
31
|
+
} from "./chunk-S54MKU6V.js";
|
|
32
|
+
import {
|
|
33
|
+
ProviderExecutionError
|
|
34
|
+
} from "./chunk-LUVKFFWR.js";
|
|
35
|
+
import {
|
|
36
|
+
PROVIDER_CATALOG_SHA256,
|
|
37
|
+
ProviderRegistry,
|
|
38
|
+
getRefreshOverlayOperatorNotice,
|
|
39
|
+
resolveRefreshOverlayDisposition
|
|
40
|
+
} from "./chunk-AT4TNPWW.js";
|
|
41
|
+
import {
|
|
42
|
+
findProjectRoot,
|
|
43
|
+
resolveProvidersConfigPath
|
|
44
|
+
} from "./chunk-L6OM4A22.js";
|
|
45
|
+
import {
|
|
46
|
+
debugLog,
|
|
47
|
+
isDebugMode
|
|
48
|
+
} from "./chunk-EJGCZGUF.js";
|
|
49
|
+
|
|
50
|
+
// src/core/providers/opencode/output-adapter.ts
|
|
51
|
+
function asRecord(value) {
|
|
52
|
+
return value && typeof value === "object" ? value : void 0;
|
|
53
|
+
}
|
|
54
|
+
function readNumberField(record, keys) {
|
|
55
|
+
for (const key of keys) {
|
|
56
|
+
const value = record?.[key];
|
|
57
|
+
if (typeof value === "number") return value;
|
|
58
|
+
if (typeof value === "string") {
|
|
59
|
+
const parsed = Number(value);
|
|
60
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return void 0;
|
|
64
|
+
}
|
|
65
|
+
function parseJsonObjectsFromStream(stream) {
|
|
66
|
+
const objects = [];
|
|
67
|
+
let start = -1;
|
|
68
|
+
let depth = 0;
|
|
69
|
+
let inString = false;
|
|
70
|
+
let escaping = false;
|
|
71
|
+
for (let index = 0; index < stream.length; index++) {
|
|
72
|
+
const char = stream[index];
|
|
73
|
+
if (start === -1) {
|
|
74
|
+
if (char === "{") {
|
|
75
|
+
start = index;
|
|
76
|
+
depth = 1;
|
|
77
|
+
inString = false;
|
|
78
|
+
escaping = false;
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (inString) {
|
|
83
|
+
if (escaping) {
|
|
84
|
+
escaping = false;
|
|
85
|
+
} else if (char === "\\") {
|
|
86
|
+
escaping = true;
|
|
87
|
+
} else if (char === '"') {
|
|
88
|
+
inString = false;
|
|
89
|
+
}
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (char === '"') {
|
|
93
|
+
inString = true;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (char === "{") {
|
|
97
|
+
depth++;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (char === "}") {
|
|
101
|
+
depth--;
|
|
102
|
+
if (depth === 0) {
|
|
103
|
+
objects.push(stream.slice(start, index + 1));
|
|
104
|
+
start = -1;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return objects;
|
|
109
|
+
}
|
|
110
|
+
function extractTextFromContent(content) {
|
|
111
|
+
if (typeof content === "string") return content;
|
|
112
|
+
if (!Array.isArray(content)) return "";
|
|
113
|
+
let aggregate = "";
|
|
114
|
+
for (const item of content) {
|
|
115
|
+
if (typeof item === "string") {
|
|
116
|
+
aggregate += item;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const record = asRecord(item);
|
|
120
|
+
if (!record) continue;
|
|
121
|
+
if (typeof record.text === "string") {
|
|
122
|
+
aggregate += record.text;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (typeof record.content === "string") {
|
|
126
|
+
aggregate += record.content;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (typeof record.value === "string") {
|
|
130
|
+
aggregate += record.value;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return aggregate;
|
|
134
|
+
}
|
|
135
|
+
function extractTextFromEvent(evt) {
|
|
136
|
+
if (typeof evt.text === "string") return evt.text;
|
|
137
|
+
if (typeof evt.delta === "string") return evt.delta;
|
|
138
|
+
if (typeof evt.message === "string") return evt.message;
|
|
139
|
+
if (typeof evt.output === "string") return evt.output;
|
|
140
|
+
if (typeof evt.content === "string") return evt.content;
|
|
141
|
+
const contentText = extractTextFromContent(evt.content);
|
|
142
|
+
if (contentText) return contentText;
|
|
143
|
+
const part = asRecord(evt.part);
|
|
144
|
+
if (typeof part?.text === "string") return part.text;
|
|
145
|
+
if (typeof part?.content === "string") return part.content;
|
|
146
|
+
const partContentText = extractTextFromContent(part?.content);
|
|
147
|
+
if (partContentText) return partContentText;
|
|
148
|
+
const data = asRecord(evt.data);
|
|
149
|
+
if (!data) return "";
|
|
150
|
+
if (typeof data.text === "string") return data.text;
|
|
151
|
+
if (typeof data.message === "string") return data.message;
|
|
152
|
+
if (typeof data.content === "string") return data.content;
|
|
153
|
+
if (typeof data.output === "string") return data.output;
|
|
154
|
+
return extractTextFromContent(data.content);
|
|
155
|
+
}
|
|
156
|
+
function readStringField(record, keys) {
|
|
157
|
+
for (const key of keys) {
|
|
158
|
+
const value = record?.[key];
|
|
159
|
+
if (typeof value === "string" && value.trim().length > 0) {
|
|
160
|
+
return value.trim();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return void 0;
|
|
164
|
+
}
|
|
165
|
+
function extractErrorMessage(errorRecord) {
|
|
166
|
+
if (!errorRecord) return void 0;
|
|
167
|
+
const direct = readStringField(errorRecord, ["message", "error", "detail", "description"]) ?? readStringField(asRecord(errorRecord.data), ["message", "error", "detail", "description"]);
|
|
168
|
+
if (direct) return direct;
|
|
169
|
+
const ownKeys = Object.keys(errorRecord);
|
|
170
|
+
const informativeKeys = ownKeys.filter((k) => k !== "type");
|
|
171
|
+
if (informativeKeys.length === 0) return void 0;
|
|
172
|
+
try {
|
|
173
|
+
const encoded = JSON.stringify(errorRecord);
|
|
174
|
+
return encoded === "{}" ? void 0 : encoded;
|
|
175
|
+
} catch {
|
|
176
|
+
return void 0;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function isStepFinishEvent(evt) {
|
|
180
|
+
const evtType = typeof evt.type === "string" ? evt.type : void 0;
|
|
181
|
+
const evtEvent = typeof evt.event === "string" ? evt.event : void 0;
|
|
182
|
+
const part = asRecord(evt.part);
|
|
183
|
+
const partType = typeof part?.type === "string" ? part.type : void 0;
|
|
184
|
+
return evtType === "step_finish" || evtType === "step-finish" || evtEvent === "step_finish" || evtEvent === "step-finish" || partType === "step-finish" || partType === "step_finish";
|
|
185
|
+
}
|
|
186
|
+
function extractStepFinishReason(evt) {
|
|
187
|
+
if (!isStepFinishEvent(evt)) return void 0;
|
|
188
|
+
const part = asRecord(evt.part);
|
|
189
|
+
return readStringField(evt, ["reason", "finish_reason", "finishReason"]) ?? readStringField(part, ["reason", "finish_reason", "finishReason"]) ?? readStringField(asRecord(evt.data), ["reason", "finish_reason", "finishReason"]);
|
|
190
|
+
}
|
|
191
|
+
var OPENCODE_CONTINUATION_FINISH_REASONS = /* @__PURE__ */ new Set([
|
|
192
|
+
"tool-calls",
|
|
193
|
+
"tool_calls",
|
|
194
|
+
"tool-call",
|
|
195
|
+
"tool_call",
|
|
196
|
+
"tool_use",
|
|
197
|
+
"tool-use"
|
|
198
|
+
]);
|
|
199
|
+
function isOpencodeTerminalEvent(evt) {
|
|
200
|
+
const record = asRecord(evt);
|
|
201
|
+
if (!record) return false;
|
|
202
|
+
if (!isStepFinishEvent(record)) return false;
|
|
203
|
+
const reason = extractStepFinishReason(record);
|
|
204
|
+
if (reason === void 0) return true;
|
|
205
|
+
return !OPENCODE_CONTINUATION_FINISH_REASONS.has(reason.trim().toLowerCase());
|
|
206
|
+
}
|
|
207
|
+
function opencodeLineConcludes(line) {
|
|
208
|
+
const trimmed = line.trim();
|
|
209
|
+
if (trimmed[0] !== "{") return false;
|
|
210
|
+
const evt = safeJsonParse(trimmed, {
|
|
211
|
+
context: "OpenCode tmux completion-signal event",
|
|
212
|
+
debug: false
|
|
213
|
+
});
|
|
214
|
+
return isOpencodeTerminalEvent(evt);
|
|
215
|
+
}
|
|
216
|
+
function createOpencodeTmuxCompletionSignal() {
|
|
217
|
+
return createLineDelimitedTmuxCompletionSignal(opencodeLineConcludes);
|
|
218
|
+
}
|
|
219
|
+
function classifyRetryableError(message, errorType) {
|
|
220
|
+
const text = `${errorType ?? ""}
|
|
221
|
+
${message}`.toLowerCase();
|
|
222
|
+
if (/auth|unauthorized|forbidden|invalid[_ -]?api[_ -]?key|not[_ -]?found/.test(text)) {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
return /timeout|temporar|unavailable|overload|rate[_ -]?limit|serviceunavailable|gateway|provider_unavailable/.test(
|
|
226
|
+
text
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
function extractErrorEvent(evt) {
|
|
230
|
+
const stepFinishReason = extractStepFinishReason(evt);
|
|
231
|
+
if (stepFinishReason === "length") {
|
|
232
|
+
return {
|
|
233
|
+
message: "OpenCode stopped because the model context length was exhausted.",
|
|
234
|
+
type: "step_finish",
|
|
235
|
+
errorType: "length",
|
|
236
|
+
retryable: false,
|
|
237
|
+
raw: evt
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const evtType = typeof evt.type === "string" ? evt.type : void 0;
|
|
241
|
+
const errorRecord = asRecord(evt.error) ?? asRecord(evt.data) ?? (evtType === "error" ? evt : void 0);
|
|
242
|
+
const message = extractErrorMessage(errorRecord) ?? (evtType === "error" ? extractTextFromEvent(evt) : void 0);
|
|
243
|
+
if (evtType !== "error" && !message) return void 0;
|
|
244
|
+
const errorType = readStringField(errorRecord, ["error_type", "errorType", "type", "code", "status"]) ?? readStringField(asRecord(errorRecord?.data), [
|
|
245
|
+
"error_type",
|
|
246
|
+
"errorType",
|
|
247
|
+
"type",
|
|
248
|
+
"code",
|
|
249
|
+
"status"
|
|
250
|
+
]) ?? readStringField(asRecord(errorRecord?.metadata), [
|
|
251
|
+
"error_type",
|
|
252
|
+
"errorType",
|
|
253
|
+
"type",
|
|
254
|
+
"code",
|
|
255
|
+
"status"
|
|
256
|
+
]) ?? readStringField(asRecord(asRecord(errorRecord?.data)?.metadata), [
|
|
257
|
+
"error_type",
|
|
258
|
+
"errorType",
|
|
259
|
+
"type",
|
|
260
|
+
"code",
|
|
261
|
+
"status"
|
|
262
|
+
]);
|
|
263
|
+
if (evtType === "error" && !message && (!errorType || errorType === evtType)) return void 0;
|
|
264
|
+
const normalizedMessage = message ?? "OpenCode reported an error event";
|
|
265
|
+
return {
|
|
266
|
+
message: normalizedMessage,
|
|
267
|
+
...evtType ? { type: evtType } : {},
|
|
268
|
+
...errorType ? { errorType } : {},
|
|
269
|
+
retryable: classifyRetryableError(normalizedMessage, errorType),
|
|
270
|
+
raw: evt
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function parseOpencodeProviderOutput(stdout, stderr) {
|
|
274
|
+
let text = "";
|
|
275
|
+
let structuredEventCount = 0;
|
|
276
|
+
let tokenUsage;
|
|
277
|
+
let totalCostUsd;
|
|
278
|
+
let resolvedModel;
|
|
279
|
+
const errorEvents = [];
|
|
280
|
+
const detectedSubAgentTypes = /* @__PURE__ */ new Set();
|
|
281
|
+
let subAgentInvocationCount = 0;
|
|
282
|
+
let firstAgentUsed;
|
|
283
|
+
const seenJsonEvents = /* @__PURE__ */ new Set();
|
|
284
|
+
for (const stream of [stdout, stderr]) {
|
|
285
|
+
for (const candidate of parseJsonObjectsFromStream(stream)) {
|
|
286
|
+
const trimmed = candidate.trim();
|
|
287
|
+
if (!trimmed.startsWith("{")) continue;
|
|
288
|
+
try {
|
|
289
|
+
const evt = safeJsonParse(trimmed, {
|
|
290
|
+
context: "OpenCode JSONL event",
|
|
291
|
+
debug: false
|
|
292
|
+
});
|
|
293
|
+
const canonicalEvent = JSON.stringify(evt);
|
|
294
|
+
if (seenJsonEvents.has(canonicalEvent)) continue;
|
|
295
|
+
seenJsonEvents.add(canonicalEvent);
|
|
296
|
+
structuredEventCount++;
|
|
297
|
+
const eventText = extractTextFromEvent(evt);
|
|
298
|
+
if (eventText) {
|
|
299
|
+
text += eventText;
|
|
300
|
+
}
|
|
301
|
+
const evtType = evt.type;
|
|
302
|
+
const evtEvent = evt.event;
|
|
303
|
+
const trustedTelemetryEvent = evtType === "message" || evtType === "step_finish" || evtType === "step-finish" || evtType === "result" || evtType === "usage" || evtEvent === "step_finish" || evtEvent === "step-finish";
|
|
304
|
+
const errorEvent = extractErrorEvent(evt);
|
|
305
|
+
if (errorEvent) {
|
|
306
|
+
errorEvents.push(errorEvent);
|
|
307
|
+
}
|
|
308
|
+
const part = asRecord(evt.part);
|
|
309
|
+
if (evtType === "tool_use" && part?.tool === "task") {
|
|
310
|
+
const state = asRecord(part?.state);
|
|
311
|
+
const input = asRecord(state?.input);
|
|
312
|
+
const agentType = (typeof input?.subagent_type === "string" ? input.subagent_type : void 0) ?? (typeof input?.agent_type === "string" ? input.agent_type : void 0) ?? (typeof input?.agent === "string" ? input.agent : void 0);
|
|
313
|
+
if (agentType) {
|
|
314
|
+
detectedSubAgentTypes.add(agentType);
|
|
315
|
+
subAgentInvocationCount++;
|
|
316
|
+
firstAgentUsed ??= agentType;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (trustedTelemetryEvent && !resolvedModel) {
|
|
320
|
+
const data = asRecord(evt.data);
|
|
321
|
+
const usageRecord = asRecord(evt.usage);
|
|
322
|
+
const providerId = (typeof evt.providerID === "string" ? evt.providerID : void 0) ?? (typeof data?.providerID === "string" ? data.providerID : void 0) ?? (typeof usageRecord?.providerID === "string" ? usageRecord.providerID : void 0);
|
|
323
|
+
const candidateModel = (typeof evt.model === "string" ? evt.model : void 0) ?? (typeof data?.model === "string" ? data.model : void 0) ?? (typeof usageRecord?.model === "string" ? usageRecord.model : void 0) ?? (typeof evt.modelID === "string" ? evt.modelID : void 0) ?? (typeof data?.modelID === "string" ? data.modelID : void 0) ?? (typeof usageRecord?.modelID === "string" ? usageRecord.modelID : void 0);
|
|
324
|
+
if (candidateModel) {
|
|
325
|
+
resolvedModel = providerId && !candidateModel.includes("/") ? `${providerId}/${candidateModel}` : candidateModel;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const usage = trustedTelemetryEvent ? asRecord(evt.usage) ?? asRecord(evt.tokens) ?? asRecord(part?.usage) ?? asRecord(part?.tokens) ?? asRecord(asRecord(evt.data)?.usage) ?? asRecord(asRecord(evt.data)?.tokens) : void 0;
|
|
329
|
+
if (usage) {
|
|
330
|
+
const inputTokens = readNumberField(usage, [
|
|
331
|
+
"input_tokens",
|
|
332
|
+
"inputTokens",
|
|
333
|
+
"prompt_tokens",
|
|
334
|
+
"input"
|
|
335
|
+
]);
|
|
336
|
+
const outputTokens = readNumberField(usage, [
|
|
337
|
+
"output_tokens",
|
|
338
|
+
"outputTokens",
|
|
339
|
+
"completion_tokens",
|
|
340
|
+
"output"
|
|
341
|
+
]);
|
|
342
|
+
if (inputTokens !== void 0 || outputTokens !== void 0) {
|
|
343
|
+
tokenUsage = {
|
|
344
|
+
inputTokens: (tokenUsage?.inputTokens ?? 0) + (inputTokens ?? 0),
|
|
345
|
+
outputTokens: (tokenUsage?.outputTokens ?? 0) + (outputTokens ?? 0)
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const cost = trustedTelemetryEvent ? readNumberField(evt, ["cost", "total_cost", "cost_usd", "totalCostUsd"]) ?? readNumberField(part, ["cost", "total_cost", "cost_usd", "totalCostUsd"]) ?? readNumberField(usage, ["cost", "total_cost", "cost_usd", "totalCostUsd"]) : void 0;
|
|
350
|
+
if (cost !== void 0) {
|
|
351
|
+
totalCostUsd = (totalCostUsd ?? 0) + cost;
|
|
352
|
+
}
|
|
353
|
+
} catch {
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return {
|
|
358
|
+
text,
|
|
359
|
+
tokenUsage,
|
|
360
|
+
totalCostUsd,
|
|
361
|
+
resolvedModel,
|
|
362
|
+
agentUsed: firstAgentUsed,
|
|
363
|
+
subAgentInvocations: subAgentInvocationCount || void 0,
|
|
364
|
+
subAgentTypes: detectedSubAgentTypes.size > 0 ? [...detectedSubAgentTypes] : void 0,
|
|
365
|
+
structuredEventCount,
|
|
366
|
+
...errorEvents.length > 0 ? { errorEvents } : {}
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// src/core/providers/opencode/bootstrap.ts
|
|
371
|
+
import { readFileSync as readFileSync2, statSync } from "fs";
|
|
372
|
+
import * as fs2 from "fs/promises";
|
|
373
|
+
import { homedir } from "os";
|
|
374
|
+
import * as path2 from "path";
|
|
375
|
+
|
|
376
|
+
// src/core/providers/refresh/freshness.ts
|
|
377
|
+
import * as fs from "fs";
|
|
378
|
+
import * as path from "path";
|
|
379
|
+
function resolveProjectRoot(configPath) {
|
|
380
|
+
const configDir = path.dirname(configPath);
|
|
381
|
+
return path.basename(configDir) === "config" && path.basename(path.dirname(configDir)) === ".poetic" ? path.dirname(path.dirname(configDir)) : path.dirname(configPath);
|
|
382
|
+
}
|
|
383
|
+
function latestCommittedRefreshEvidence(providerId, auditPath) {
|
|
384
|
+
try {
|
|
385
|
+
const lines = fs.readFileSync(auditPath, "utf8").trim().split("\n").filter(Boolean);
|
|
386
|
+
for (let index = lines.length - 1; index >= 0; index--) {
|
|
387
|
+
const entry = JSON.parse(lines[index]);
|
|
388
|
+
if (entry.kind === "overlay") continue;
|
|
389
|
+
const provider = entry.providers?.find(
|
|
390
|
+
(candidate) => candidate.providerId === providerId && candidate.ok && candidate.source
|
|
391
|
+
);
|
|
392
|
+
if (!provider?.source) continue;
|
|
393
|
+
const timestamp = Date.parse(entry.timestamp ?? "");
|
|
394
|
+
if (Number.isFinite(timestamp)) return { timestamp, source: provider.source };
|
|
395
|
+
}
|
|
396
|
+
} catch {
|
|
397
|
+
}
|
|
398
|
+
return void 0;
|
|
399
|
+
}
|
|
400
|
+
function acceptedOverlayRefreshEvidence(providerId, overlayPath) {
|
|
401
|
+
try {
|
|
402
|
+
const disposition = resolveRefreshOverlayDisposition(fs.readFileSync(overlayPath, "utf8"), {
|
|
403
|
+
expectedBaseCatalogDigest: PROVIDER_CATALOG_SHA256
|
|
404
|
+
});
|
|
405
|
+
if (disposition.status !== "ready") return void 0;
|
|
406
|
+
const slices = disposition.overlay.providers[providerId]?.slices;
|
|
407
|
+
const candidates = [slices?.models, slices?.pricing].flatMap((slice) => {
|
|
408
|
+
if (!slice) return [];
|
|
409
|
+
const timestamp = Date.parse(slice.fetchedAt);
|
|
410
|
+
return Number.isFinite(timestamp) ? [{ timestamp, source: slice.source }] : [];
|
|
411
|
+
});
|
|
412
|
+
return candidates.sort((left, right) => right.timestamp - left.timestamp)[0];
|
|
413
|
+
} catch {
|
|
414
|
+
return void 0;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
function getProviderRefreshEvidence(providerId, options = {}) {
|
|
418
|
+
const configPath = path.resolve(
|
|
419
|
+
options.configPath ?? resolveProvidersConfigPath({ cwd: options.projectRoot ?? process.cwd() })
|
|
420
|
+
);
|
|
421
|
+
const projectRoot = options.projectRoot ?? resolveProjectRoot(configPath);
|
|
422
|
+
const overlayEvidence = acceptedOverlayRefreshEvidence(
|
|
423
|
+
providerId,
|
|
424
|
+
path.join(projectRoot, ".poetic", "cache", "model-update", "refresh-overlay.json")
|
|
425
|
+
);
|
|
426
|
+
if (overlayEvidence) return overlayEvidence;
|
|
427
|
+
const auditEvidence = latestCommittedRefreshEvidence(
|
|
428
|
+
providerId,
|
|
429
|
+
path.join(projectRoot, ".poetic", "logs", "provider-refresh.jsonl")
|
|
430
|
+
);
|
|
431
|
+
if (auditEvidence) return auditEvidence;
|
|
432
|
+
try {
|
|
433
|
+
const registry = ProviderRegistry.load(configPath, projectRoot);
|
|
434
|
+
const config = ProviderRegistry.getProviderConfig(providerId, registry);
|
|
435
|
+
const meta = config.pricing?._meta;
|
|
436
|
+
const lastUpdate = meta?.last_pricing_update;
|
|
437
|
+
if (typeof lastUpdate === "string") {
|
|
438
|
+
const parsed = Date.parse(lastUpdate);
|
|
439
|
+
if (Number.isFinite(parsed)) return { timestamp: parsed, source: "pricing-only" };
|
|
440
|
+
}
|
|
441
|
+
} catch {
|
|
442
|
+
}
|
|
443
|
+
return void 0;
|
|
444
|
+
}
|
|
445
|
+
function getProviderSliceAgeMs(providerId, options = {}) {
|
|
446
|
+
const evidence = getProviderRefreshEvidence(providerId, options);
|
|
447
|
+
return evidence ? Math.max(0, (options.now ?? Date.now()) - evidence.timestamp) : void 0;
|
|
448
|
+
}
|
|
449
|
+
function formatCacheAge(ageMs) {
|
|
450
|
+
const hours = ageMs / 36e5;
|
|
451
|
+
if (hours < 1) return "<1h";
|
|
452
|
+
if (hours < 48) return `${Math.round(hours)}h`;
|
|
453
|
+
return `${Math.round(hours / 24)}d`;
|
|
454
|
+
}
|
|
455
|
+
function isFetchedAtFresh(fetchedAt, ttlMs, now = Date.now()) {
|
|
456
|
+
return typeof fetchedAt === "number" && Number.isFinite(fetchedAt) && Number.isFinite(ttlMs) && ttlMs >= 0 && now - fetchedAt < ttlMs;
|
|
457
|
+
}
|
|
458
|
+
function getFetchedAtAgeMs(fetchedAt, now = Date.now()) {
|
|
459
|
+
if (typeof fetchedAt !== "number" || !Number.isFinite(fetchedAt)) return void 0;
|
|
460
|
+
return Math.max(0, now - fetchedAt);
|
|
461
|
+
}
|
|
462
|
+
function getProjectRefreshOverlayNotice(projectRoot) {
|
|
463
|
+
const root = projectRoot ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
464
|
+
return getRefreshOverlayOperatorNotice(
|
|
465
|
+
path.join(root, ".poetic", "cache", "model-update", "refresh-overlay.json"),
|
|
466
|
+
PROVIDER_CATALOG_SHA256
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// src/core/providers/opencode/bootstrap.ts
|
|
471
|
+
var OPENCODE_MODELS_CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
472
|
+
var OPENCODE_MODEL_ID_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._/:-]*$/;
|
|
473
|
+
function isOpencodeBunInstallFailure(error) {
|
|
474
|
+
const haystack = `${error.message}
|
|
475
|
+
${error.stderr ?? ""}
|
|
476
|
+
${error.stdout ?? ""}`;
|
|
477
|
+
return /BunInstallFailedError/i.test(haystack) || /\bbun\b.*\binstall\b/i.test(haystack);
|
|
478
|
+
}
|
|
479
|
+
function makeRetryableBootstrapError(error, providerName, operation) {
|
|
480
|
+
return new ProviderExecutionError(`${providerName} ${operation} failed (bootstrap race)`, {
|
|
481
|
+
retryable: true,
|
|
482
|
+
exitCode: error.exitCode,
|
|
483
|
+
reason: error.reason ?? "bootstrap_install",
|
|
484
|
+
stderr: error.stderr,
|
|
485
|
+
stdout: error.stdout,
|
|
486
|
+
// The public fields above may already be truncated, and a stream size must
|
|
487
|
+
// never be re-derived from a truncated string. Forward the structured sizes.
|
|
488
|
+
streamBytes: { stdout: error.stdoutBytes, stderr: error.stderrBytes }
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
var LOCK_HEARTBEAT_INTERVAL_MS = 3e4;
|
|
492
|
+
var OPENCODE_BOOTSTRAP_DEADLINE_SAFETY_BUFFER_MS = 5e3;
|
|
493
|
+
function resolveOpencodeBootstrapAttemptTimeoutMs(timeoutMs, deadlineMs) {
|
|
494
|
+
if (deadlineMs == null) {
|
|
495
|
+
return timeoutMs;
|
|
496
|
+
}
|
|
497
|
+
const remainingMs = deadlineMs - Date.now() - OPENCODE_BOOTSTRAP_DEADLINE_SAFETY_BUFFER_MS;
|
|
498
|
+
if (remainingMs <= 0) {
|
|
499
|
+
throw new ProviderExecutionError("OpenCode bootstrap deadline exceeded before attempt start.", {
|
|
500
|
+
retryable: false,
|
|
501
|
+
reason: "deadline_exhausted"
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
return Math.max(1, Math.min(timeoutMs, remainingMs));
|
|
505
|
+
}
|
|
506
|
+
function sanitizeVersionForFilename(version) {
|
|
507
|
+
const sanitized = version.trim().replace(/[^A-Za-z0-9._-]+/g, "-").replace(/\.\.+/g, ".").replace(/^-+|-+$/g, "").replace(/^\.+/, "").slice(0, 80);
|
|
508
|
+
return sanitized || "unknown";
|
|
509
|
+
}
|
|
510
|
+
function startLockHeartbeat(lockFile) {
|
|
511
|
+
return setInterval(() => {
|
|
512
|
+
const now = /* @__PURE__ */ new Date();
|
|
513
|
+
void fs2.utimes(lockFile, now, now).catch(() => {
|
|
514
|
+
});
|
|
515
|
+
}, LOCK_HEARTBEAT_INTERVAL_MS);
|
|
516
|
+
}
|
|
517
|
+
function parseWarmupLockPayload(raw) {
|
|
518
|
+
try {
|
|
519
|
+
const parsed = JSON.parse(raw);
|
|
520
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
521
|
+
} catch {
|
|
522
|
+
return null;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
function isProcessAlive(pid) {
|
|
526
|
+
if (!Number.isInteger(pid) || (pid ?? 0) <= 0) return false;
|
|
527
|
+
try {
|
|
528
|
+
process.kill(pid, 0);
|
|
529
|
+
return true;
|
|
530
|
+
} catch (error) {
|
|
531
|
+
if (error.code === "EPERM") {
|
|
532
|
+
return true;
|
|
533
|
+
}
|
|
534
|
+
return false;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
async function acquireLockFile(lockFile, options) {
|
|
538
|
+
const start = Date.now();
|
|
539
|
+
await fs2.mkdir(path2.dirname(lockFile), { recursive: true });
|
|
540
|
+
while (Date.now() - start < options.timeoutMs) {
|
|
541
|
+
try {
|
|
542
|
+
await fs2.writeFile(
|
|
543
|
+
lockFile,
|
|
544
|
+
JSON.stringify({
|
|
545
|
+
pid: process.pid,
|
|
546
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
547
|
+
host: process.env.HOSTNAME ?? process.env.COMPUTERNAME ?? "unknown"
|
|
548
|
+
}),
|
|
549
|
+
{ flag: "wx" }
|
|
550
|
+
);
|
|
551
|
+
return;
|
|
552
|
+
} catch (error) {
|
|
553
|
+
const code = error.code;
|
|
554
|
+
if (code !== "EEXIST") throw error;
|
|
555
|
+
try {
|
|
556
|
+
const stat2 = await fs2.stat(lockFile);
|
|
557
|
+
if (Date.now() - stat2.mtimeMs > options.staleMs) {
|
|
558
|
+
const payload = parseWarmupLockPayload(
|
|
559
|
+
await fs2.readFile(lockFile, "utf8").catch(() => "")
|
|
560
|
+
);
|
|
561
|
+
const sameHost = payload?.host === void 0 || payload.host === (process.env.HOSTNAME ?? process.env.COMPUTERNAME ?? "unknown");
|
|
562
|
+
if (!sameHost || !isProcessAlive(payload?.pid)) {
|
|
563
|
+
await fs2.unlink(lockFile).catch(() => {
|
|
564
|
+
});
|
|
565
|
+
continue;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
} catch {
|
|
569
|
+
}
|
|
570
|
+
await new Promise((resolve2) => setTimeout(resolve2, 100));
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
throw new Error(
|
|
574
|
+
`Failed to acquire OpenCode warmup lock within ${options.timeoutMs}ms: ${lockFile}`
|
|
575
|
+
);
|
|
576
|
+
}
|
|
577
|
+
async function releaseLockFile(lockFile) {
|
|
578
|
+
await fs2.unlink(lockFile).catch(() => {
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
var MODELS_CACHE_FILENAME = "models.json";
|
|
582
|
+
var cachedModelsSnapshot = null;
|
|
583
|
+
function resolveOpencodeModelsCacheDir(cacheDir) {
|
|
584
|
+
return cacheDir ?? path2.join(homedir(), ".poetic", "cache", "opencode");
|
|
585
|
+
}
|
|
586
|
+
function sanitizeOpencodeModelIds(modelIds) {
|
|
587
|
+
const seen = /* @__PURE__ */ new Set();
|
|
588
|
+
const sanitized = [];
|
|
589
|
+
for (const raw of modelIds) {
|
|
590
|
+
if (typeof raw !== "string") continue;
|
|
591
|
+
const id = raw.trim();
|
|
592
|
+
if (id.length >= 2 && id.length <= 128 && OPENCODE_MODEL_ID_PATTERN.test(id) && /[/-]/.test(id) && !seen.has(id)) {
|
|
593
|
+
seen.add(id);
|
|
594
|
+
sanitized.push(id);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
return sanitized;
|
|
598
|
+
}
|
|
599
|
+
function rememberModelsSnapshot(cachePath, mtimeMs, modelIds, fetchedAt) {
|
|
600
|
+
cachedModelsSnapshot = { cachePath, mtimeMs, modelIds, fetchedAt };
|
|
601
|
+
}
|
|
602
|
+
function readModelsCacheFromDisk(cachePath) {
|
|
603
|
+
try {
|
|
604
|
+
const stat2 = statSync(cachePath);
|
|
605
|
+
if (cachedModelsSnapshot && cachedModelsSnapshot.cachePath === cachePath && cachedModelsSnapshot.mtimeMs === stat2.mtimeMs) {
|
|
606
|
+
return {
|
|
607
|
+
modelIds: cachedModelsSnapshot.modelIds,
|
|
608
|
+
fetchedAt: cachedModelsSnapshot.fetchedAt,
|
|
609
|
+
mtimeMs: stat2.mtimeMs
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
const raw = readFileSync2(cachePath, "utf-8");
|
|
613
|
+
const entry = JSON.parse(raw);
|
|
614
|
+
if (!Array.isArray(entry?.modelIds)) {
|
|
615
|
+
return null;
|
|
616
|
+
}
|
|
617
|
+
const modelIds = sanitizeOpencodeModelIds(entry.modelIds);
|
|
618
|
+
const fetchedAt = typeof entry.fetchedAt === "number" && Number.isFinite(entry.fetchedAt) ? entry.fetchedAt : void 0;
|
|
619
|
+
rememberModelsSnapshot(cachePath, stat2.mtimeMs, modelIds, fetchedAt);
|
|
620
|
+
return { modelIds, fetchedAt, mtimeMs: stat2.mtimeMs };
|
|
621
|
+
} catch {
|
|
622
|
+
return null;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
function getCachedOpencodeModelIds(cacheDir) {
|
|
626
|
+
const cachePath = path2.join(resolveOpencodeModelsCacheDir(cacheDir), MODELS_CACHE_FILENAME);
|
|
627
|
+
const cached = readModelsCacheFromDisk(cachePath);
|
|
628
|
+
if (cached) return cached.modelIds;
|
|
629
|
+
if (cachedModelsSnapshot?.cachePath === cachePath) {
|
|
630
|
+
cachedModelsSnapshot = null;
|
|
631
|
+
}
|
|
632
|
+
return [];
|
|
633
|
+
}
|
|
634
|
+
function getOpencodeModelsCacheInfo(cacheDir, now = Date.now()) {
|
|
635
|
+
const cachePath = path2.join(resolveOpencodeModelsCacheDir(cacheDir), MODELS_CACHE_FILENAME);
|
|
636
|
+
const cached = readModelsCacheFromDisk(cachePath);
|
|
637
|
+
const fetchedAt = cached?.fetchedAt;
|
|
638
|
+
const ageMs = getFetchedAtAgeMs(fetchedAt, now);
|
|
639
|
+
return {
|
|
640
|
+
cachePath,
|
|
641
|
+
modelIds: cached?.modelIds ?? [],
|
|
642
|
+
fetchedAt,
|
|
643
|
+
ageMs,
|
|
644
|
+
stale: !isFetchedAtFresh(fetchedAt, OPENCODE_MODELS_CACHE_TTL_MS, now)
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
async function persistOpencodeModelsCache(modelIds, options) {
|
|
648
|
+
const sanitized = sanitizeOpencodeModelIds(modelIds);
|
|
649
|
+
const cacheDir = resolveOpencodeModelsCacheDir(options?.cacheDir);
|
|
650
|
+
await fs2.mkdir(cacheDir, { recursive: true });
|
|
651
|
+
const cachePath = path2.join(cacheDir, MODELS_CACHE_FILENAME);
|
|
652
|
+
const lockFile = path2.join(cacheDir, "warmup.lock");
|
|
653
|
+
const fetchedAt = options?.fetchedAt ?? Date.now();
|
|
654
|
+
const cacheEntry = { modelIds: sanitized, fetchedAt };
|
|
655
|
+
let heartbeat;
|
|
656
|
+
if (!options?.alreadyLocked) {
|
|
657
|
+
await acquireLockFile(lockFile, { timeoutMs: 6e4, staleMs: 10 * 6e4 });
|
|
658
|
+
heartbeat = startLockHeartbeat(lockFile);
|
|
659
|
+
}
|
|
660
|
+
try {
|
|
661
|
+
await writeFileAtomic(cachePath, JSON.stringify(cacheEntry, null, 2));
|
|
662
|
+
const stat2 = await fs2.stat(cachePath);
|
|
663
|
+
rememberModelsSnapshot(cachePath, stat2.mtimeMs, sanitized, fetchedAt);
|
|
664
|
+
return sanitized;
|
|
665
|
+
} finally {
|
|
666
|
+
if (heartbeat) clearInterval(heartbeat);
|
|
667
|
+
if (!options?.alreadyLocked) {
|
|
668
|
+
await releaseLockFile(lockFile);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
async function ensureOpencodeWarm(options) {
|
|
673
|
+
const runningUnderVitest = Boolean(process.env.VITEST || process.env.VITEST_WORKER_ID) || process.env.NODE_ENV === "test" || process.argv.some((arg) => arg.includes("vitest"));
|
|
674
|
+
if (runningUnderVitest && process.env.POETIC_OPENCODE_WARMUP_FORCE !== "1") return;
|
|
675
|
+
const cacheDir = resolveOpencodeModelsCacheDir(options.cacheDir);
|
|
676
|
+
await fs2.mkdir(cacheDir, { recursive: true });
|
|
677
|
+
const lockFile = path2.join(cacheDir, "warmup.lock");
|
|
678
|
+
const versionFile = path2.join(cacheDir, "version.txt");
|
|
679
|
+
let cachedVersion = "";
|
|
680
|
+
try {
|
|
681
|
+
const raw = await fs2.readFile(versionFile, "utf-8");
|
|
682
|
+
cachedVersion = raw.trim();
|
|
683
|
+
} catch {
|
|
684
|
+
}
|
|
685
|
+
let version = "";
|
|
686
|
+
try {
|
|
687
|
+
const result = await executeProviderCommand({
|
|
688
|
+
command: options.command,
|
|
689
|
+
args: [...options.prefixArgs ?? [], "--version"],
|
|
690
|
+
workingDir: options.workingDir,
|
|
691
|
+
stdinMode: "ignore",
|
|
692
|
+
timeout: Math.min(options.timeoutMs ?? 1e4, 1e4),
|
|
693
|
+
metadata: {
|
|
694
|
+
id: metadata.id,
|
|
695
|
+
name: metadata.name,
|
|
696
|
+
installCommand: metadata.installCommand,
|
|
697
|
+
authHint: metadata.authHint,
|
|
698
|
+
docsPath: metadata.docsPath,
|
|
699
|
+
docsAnchor: metadata.docsAnchor
|
|
700
|
+
}
|
|
701
|
+
});
|
|
702
|
+
version = (result.stdout ?? "").trim();
|
|
703
|
+
if (version && version !== cachedVersion) {
|
|
704
|
+
await writeFileAtomic(versionFile, version).catch(() => {
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
} catch {
|
|
708
|
+
version = cachedVersion;
|
|
709
|
+
}
|
|
710
|
+
if (!version) {
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
const sentinel = path2.join(cacheDir, `warm-${sanitizeVersionForFilename(version)}.json`);
|
|
714
|
+
const sentinelReady = await fs2.access(sentinel).then(() => true).catch(() => false);
|
|
715
|
+
if (sentinelReady) {
|
|
716
|
+
return;
|
|
717
|
+
}
|
|
718
|
+
await acquireLockFile(lockFile, { timeoutMs: 6e4, staleMs: 10 * 6e4 });
|
|
719
|
+
const heartbeat = startLockHeartbeat(lockFile);
|
|
720
|
+
try {
|
|
721
|
+
const sentinelReadyAfterLock = await fs2.access(sentinel).then(() => true).catch(() => false);
|
|
722
|
+
if (!sentinelReadyAfterLock) {
|
|
723
|
+
await executeProviderCommand({
|
|
724
|
+
command: options.command,
|
|
725
|
+
args: [...options.prefixArgs ?? [], "auth", "list"],
|
|
726
|
+
workingDir: options.workingDir,
|
|
727
|
+
stdinMode: "ignore",
|
|
728
|
+
timeout: Math.min(options.timeoutMs ?? 2e4, 2e4),
|
|
729
|
+
metadata: {
|
|
730
|
+
id: metadata.id,
|
|
731
|
+
name: metadata.name,
|
|
732
|
+
installCommand: metadata.installCommand,
|
|
733
|
+
authHint: metadata.authHint,
|
|
734
|
+
docsPath: metadata.docsPath,
|
|
735
|
+
docsAnchor: metadata.docsAnchor
|
|
736
|
+
}
|
|
737
|
+
});
|
|
738
|
+
await writeFileAtomic(
|
|
739
|
+
sentinel,
|
|
740
|
+
JSON.stringify({ version, warmedAt: (/* @__PURE__ */ new Date()).toISOString() }, null, 2)
|
|
741
|
+
).catch(() => {
|
|
742
|
+
});
|
|
743
|
+
}
|
|
744
|
+
} finally {
|
|
745
|
+
clearInterval(heartbeat);
|
|
746
|
+
await releaseLockFile(lockFile);
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
async function executeOpencodeCommandWithBootstrapRetry(options) {
|
|
750
|
+
const runningUnderVitest = Boolean(process.env.VITEST || process.env.VITEST_WORKER_ID) || process.env.NODE_ENV === "test" || process.argv.some((arg) => arg.includes("vitest"));
|
|
751
|
+
const budgetRemaining = options.retryBudget?.remaining;
|
|
752
|
+
const defaultMaxAttempts = budgetRemaining !== void 0 ? Math.max(1, Math.min(3, budgetRemaining)) : 3;
|
|
753
|
+
const maxAttempts = typeof options.maxAttempts === "number" && Number.isFinite(options.maxAttempts) ? Math.max(1, Math.min(3, Math.floor(options.maxAttempts))) : defaultMaxAttempts;
|
|
754
|
+
let pendingRetryError;
|
|
755
|
+
const retry = createRetryOptions({
|
|
756
|
+
providerName: options.metadata.name,
|
|
757
|
+
operation: options.operation,
|
|
758
|
+
maxAttempts,
|
|
759
|
+
initialDelayMs: runningUnderVitest ? 10 : 1e3,
|
|
760
|
+
maxDelayMs: 15e3,
|
|
761
|
+
backoffMultiplier: 2,
|
|
762
|
+
retryBudget: options.retryBudget,
|
|
763
|
+
abortSignal: options.abortSignal,
|
|
764
|
+
deadlineMs: options.deadlineMs,
|
|
765
|
+
minimumAttemptTimeMs: Math.min(options.timeout, 3e4),
|
|
766
|
+
onRetry: (attempt2, error) => {
|
|
767
|
+
pendingRetryError = error;
|
|
768
|
+
if (!runningUnderVitest && attempt2 >= 1 && error instanceof ProviderExecutionError) {
|
|
769
|
+
debugLog(
|
|
770
|
+
`[OpenCode] ${options.operation} retry ${attempt2 + 1}/${retry.maxAttempts}: ${error.message}`
|
|
771
|
+
);
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
});
|
|
775
|
+
const providerId = options.metadata.id ?? metadata.id;
|
|
776
|
+
const { execute, decision } = await selectProviderExecutor({
|
|
777
|
+
provider: providerId,
|
|
778
|
+
requested: options.executionTransport,
|
|
779
|
+
configured: resolveConfiguredProviderExecutionTransport(providerId, options.workingDir).value,
|
|
780
|
+
env: options.env,
|
|
781
|
+
executionIntent: options.executionIntent,
|
|
782
|
+
readOnlyWorkingDir: options.readOnlyWorkingDir,
|
|
783
|
+
headless: executeProviderCommand,
|
|
784
|
+
onDecision: (decision2) => reportTransportDecision(providerId, decision2, debugLog)
|
|
785
|
+
});
|
|
786
|
+
const wantsTmuxCompletionSignal = decision.resolved === "tmux-exec";
|
|
787
|
+
let attempt = 0;
|
|
788
|
+
const result = await withRetry(async () => {
|
|
789
|
+
attempt++;
|
|
790
|
+
if (attempt > 1 && options.beforeRetryAttempt) {
|
|
791
|
+
await options.beforeRetryAttempt(pendingRetryError);
|
|
792
|
+
}
|
|
793
|
+
const args = attempt > 1 ? [...options.args, "--print-logs", "--log-level", "ERROR"] : [...options.args];
|
|
794
|
+
const runnerMetadata = {
|
|
795
|
+
...options.metadata,
|
|
796
|
+
installCommand: options.metadata.installCommand ?? metadata.installCommand
|
|
797
|
+
};
|
|
798
|
+
try {
|
|
799
|
+
const streamOutput = resolveProviderStreamingEnabled(options.env);
|
|
800
|
+
const tmuxCompletionSignal = wantsTmuxCompletionSignal ? createOpencodeTmuxCompletionSignal() : void 0;
|
|
801
|
+
return await execute({
|
|
802
|
+
command: options.command,
|
|
803
|
+
args,
|
|
804
|
+
workingDir: options.workingDir,
|
|
805
|
+
env: options.env,
|
|
806
|
+
input: options.input,
|
|
807
|
+
stdinMode: options.input === void 0 ? "ignore" : "pipe",
|
|
808
|
+
timeout: resolveOpencodeBootstrapAttemptTimeoutMs(options.timeout, options.deadlineMs),
|
|
809
|
+
extraWritePaths: options.extraWritePaths,
|
|
810
|
+
readOnlyWorkingDir: options.readOnlyWorkingDir,
|
|
811
|
+
providerInternalSandboxBypass: options.providerInternalSandboxBypass,
|
|
812
|
+
idleWarnMs: options.idleWarnMs,
|
|
813
|
+
idleKillMs: options.idleKillMs,
|
|
814
|
+
onData: options.onData,
|
|
815
|
+
onErrorData: options.onErrorData,
|
|
816
|
+
onStdoutChunk: options.onStdoutChunk,
|
|
817
|
+
onStderrChunk: options.onStderrChunk,
|
|
818
|
+
onActivity: options.onActivity,
|
|
819
|
+
onFirstOutput: options.onFirstOutput,
|
|
820
|
+
abortSignal: options.abortSignal,
|
|
821
|
+
metadata: runnerMetadata,
|
|
822
|
+
...streamOutput ? { streamOutput: true } : {},
|
|
823
|
+
...tmuxCompletionSignal ? {
|
|
824
|
+
completionSignal: tmuxCompletionSignal,
|
|
825
|
+
completionSignalGraceMs: TMUX_COMPLETION_SIGNAL_GRACE_MS
|
|
826
|
+
} : {}
|
|
827
|
+
});
|
|
828
|
+
} catch (error) {
|
|
829
|
+
if (error instanceof ProviderExecutionError && isOpencodeBunInstallFailure(error)) {
|
|
830
|
+
throw makeRetryableBootstrapError(error, options.metadata.name, options.operation);
|
|
831
|
+
}
|
|
832
|
+
throw error;
|
|
833
|
+
}
|
|
834
|
+
}, retry);
|
|
835
|
+
return result.result;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
// src/core/providers/opencode/model-canonicalizer.ts
|
|
839
|
+
var KNOWN_OPENCODE_PREFIXES = /* @__PURE__ */ new Set([
|
|
840
|
+
"openrouter",
|
|
841
|
+
"opencode",
|
|
842
|
+
"opencode-go",
|
|
843
|
+
"amazon-bedrock",
|
|
844
|
+
"zai-coding-plan",
|
|
845
|
+
"zai-coding",
|
|
846
|
+
"anthropic",
|
|
847
|
+
"openai",
|
|
848
|
+
"google",
|
|
849
|
+
"fireworks",
|
|
850
|
+
"deepseek",
|
|
851
|
+
"mistral",
|
|
852
|
+
"groq",
|
|
853
|
+
"together",
|
|
854
|
+
"xai",
|
|
855
|
+
"perplexity",
|
|
856
|
+
"cohere"
|
|
857
|
+
]);
|
|
858
|
+
function buildEffectivePrefixes(cachedModelIds) {
|
|
859
|
+
if (!cachedModelIds || cachedModelIds.length === 0) {
|
|
860
|
+
return KNOWN_OPENCODE_PREFIXES;
|
|
861
|
+
}
|
|
862
|
+
const effective = new Set(KNOWN_OPENCODE_PREFIXES);
|
|
863
|
+
for (const prefix of deriveOpencodePrefixes(cachedModelIds)) {
|
|
864
|
+
effective.add(prefix);
|
|
865
|
+
}
|
|
866
|
+
return effective;
|
|
867
|
+
}
|
|
868
|
+
function canonicalizeOpencodeModelId(model, cachedModelIds) {
|
|
869
|
+
const slashCount = (model.match(/\//g) || []).length;
|
|
870
|
+
if (slashCount === 0) return model;
|
|
871
|
+
const openrouterCandidate = slashCount === 1 && cachedModelIds?.includes(`openrouter/${model}`) ? `openrouter/${model}` : void 0;
|
|
872
|
+
const exactCachedMatch = cachedModelIds?.includes(model);
|
|
873
|
+
const effectivePrefixes = buildEffectivePrefixes(cachedModelIds);
|
|
874
|
+
const firstSegment = model.split("/")[0]?.toLowerCase();
|
|
875
|
+
if (firstSegment && effectivePrefixes.has(firstSegment)) {
|
|
876
|
+
if (exactCachedMatch) {
|
|
877
|
+
return model;
|
|
878
|
+
}
|
|
879
|
+
if (firstSegment !== "openrouter" && openrouterCandidate) {
|
|
880
|
+
if (isDebugMode()) {
|
|
881
|
+
console.debug(
|
|
882
|
+
`[opencode-model] Preferring canonical OpenRouter model: ${model} \u2192 ${openrouterCandidate}`
|
|
883
|
+
);
|
|
884
|
+
}
|
|
885
|
+
return openrouterCandidate;
|
|
886
|
+
}
|
|
887
|
+
if (slashCount === 1 && firstSegment === "openrouter" && cachedModelIds && cachedModelIds.length > 0) {
|
|
888
|
+
const isInCache = cachedModelIds.includes(model);
|
|
889
|
+
const has3SegmentVariant = cachedModelIds.some((id) => id.startsWith(`${model}/`));
|
|
890
|
+
if (!isInCache && !has3SegmentVariant) {
|
|
891
|
+
if (isDebugMode()) {
|
|
892
|
+
debugLog(
|
|
893
|
+
`[opencode-model] WARNING: Model '${model}' may fail OpenCode resolution due to upstream bug. OpenCode splits 2-segment IDs and looks up just '${model.split("/")[1]}' in the provider dict. If the model is keyed by the full ID '${model}' in OpenCode's catalog, this will fail. Consider using a 3-segment form if available, or report this to OpenCode maintainers.`
|
|
894
|
+
);
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
return model;
|
|
899
|
+
}
|
|
900
|
+
if (cachedModelIds?.includes(model)) return model;
|
|
901
|
+
if (slashCount >= 2) return model;
|
|
902
|
+
if (openrouterCandidate) {
|
|
903
|
+
if (isDebugMode()) {
|
|
904
|
+
console.debug(`[opencode-model] Auto-prefixing model: ${model} \u2192 ${openrouterCandidate}`);
|
|
905
|
+
}
|
|
906
|
+
return openrouterCandidate;
|
|
907
|
+
}
|
|
908
|
+
return model;
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
export {
|
|
912
|
+
getProviderRefreshEvidence,
|
|
913
|
+
getProviderSliceAgeMs,
|
|
914
|
+
formatCacheAge,
|
|
915
|
+
getProjectRefreshOverlayNotice,
|
|
916
|
+
parseOpencodeProviderOutput,
|
|
917
|
+
getCachedOpencodeModelIds,
|
|
918
|
+
getOpencodeModelsCacheInfo,
|
|
919
|
+
persistOpencodeModelsCache,
|
|
920
|
+
ensureOpencodeWarm,
|
|
921
|
+
executeOpencodeCommandWithBootstrapRetry,
|
|
922
|
+
canonicalizeOpencodeModelId
|
|
923
|
+
};
|
|
924
|
+
//# sourceMappingURL=chunk-CJHRFSNY.js.map
|