@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,1571 @@
|
|
|
1
|
+
import {
|
|
2
|
+
canonicalizeOpencodeModelId,
|
|
3
|
+
ensureOpencodeWarm,
|
|
4
|
+
executeOpencodeCommandWithBootstrapRetry,
|
|
5
|
+
formatCacheAge,
|
|
6
|
+
getCachedOpencodeModelIds,
|
|
7
|
+
getOpencodeModelsCacheInfo,
|
|
8
|
+
parseOpencodeProviderOutput
|
|
9
|
+
} from "./chunk-GPEL3FBM.js";
|
|
10
|
+
import {
|
|
11
|
+
aggregateCredentialResidueErrors,
|
|
12
|
+
contextualizeCredentialCleanupError,
|
|
13
|
+
markRunOwnedRoot,
|
|
14
|
+
normalizeProviderCliVersion,
|
|
15
|
+
removeAndVerifyRunOwnedRoot,
|
|
16
|
+
resolveCallerOwnedPath
|
|
17
|
+
} from "./chunk-XZYR5EDO.js";
|
|
18
|
+
import {
|
|
19
|
+
metadata
|
|
20
|
+
} from "./chunk-3FLXLLB7.js";
|
|
21
|
+
import {
|
|
22
|
+
reportOutputDrift,
|
|
23
|
+
resolveSettings
|
|
24
|
+
} from "./chunk-QTCJ5CC5.js";
|
|
25
|
+
import {
|
|
26
|
+
assembleSteering
|
|
27
|
+
} from "./chunk-MWHF5V7U.js";
|
|
28
|
+
import "./chunk-3FOZ2VHV.js";
|
|
29
|
+
import {
|
|
30
|
+
runMockNative
|
|
31
|
+
} from "./chunk-P47VN5F4.js";
|
|
32
|
+
import {
|
|
33
|
+
DEFAULT_PROVIDER_CIRCUIT_BREAKER_OPTIONS,
|
|
34
|
+
RetryBudget,
|
|
35
|
+
assertWorkspaceRetryIsSafe,
|
|
36
|
+
captureRetryWorktreeState,
|
|
37
|
+
captureWorkspaceRetryState,
|
|
38
|
+
executeWithResilience,
|
|
39
|
+
recordInvocationTiming,
|
|
40
|
+
rejectUnsafeFullPromptRetry,
|
|
41
|
+
resolveProviderTimeoutMs
|
|
42
|
+
} from "./chunk-WZ6U3O7I.js";
|
|
43
|
+
import {
|
|
44
|
+
detectGitChangedFiles,
|
|
45
|
+
getGitHead,
|
|
46
|
+
getGitStatusPaths,
|
|
47
|
+
stripAnsiSequences
|
|
48
|
+
} from "./chunk-VTW7HP3R.js";
|
|
49
|
+
import "./chunk-4CUY7AFY.js";
|
|
50
|
+
import {
|
|
51
|
+
acquireRateLimitToken
|
|
52
|
+
} from "./chunk-MWK5UZQ3.js";
|
|
53
|
+
import "./chunk-MN6PL4AN.js";
|
|
54
|
+
import "./chunk-NS33V3IM.js";
|
|
55
|
+
import {
|
|
56
|
+
inferProviderFailurePhase,
|
|
57
|
+
recordProviderRunFailure,
|
|
58
|
+
recordProviderRunSuccess
|
|
59
|
+
} from "./chunk-UHRBTZYY.js";
|
|
60
|
+
import "./chunk-H2AYQIHW.js";
|
|
61
|
+
import {
|
|
62
|
+
detectTaskType
|
|
63
|
+
} from "./chunk-FATUVIIN.js";
|
|
64
|
+
import "./chunk-XPU2XADL.js";
|
|
65
|
+
import "./chunk-AURFMVCD.js";
|
|
66
|
+
import "./chunk-VBNCKCCI.js";
|
|
67
|
+
import "./chunk-SZ7DL357.js";
|
|
68
|
+
import "./chunk-HIO33P3G.js";
|
|
69
|
+
import {
|
|
70
|
+
buildProviderExecutionEnv
|
|
71
|
+
} from "./chunk-APV6MK5E.js";
|
|
72
|
+
import "./chunk-ZYG7GGKO.js";
|
|
73
|
+
import {
|
|
74
|
+
providerOutputTail,
|
|
75
|
+
redactProviderArgv,
|
|
76
|
+
sanitizeDiagnosticOutput
|
|
77
|
+
} from "./chunk-PFTQBXS6.js";
|
|
78
|
+
import "./chunk-E3NTPHEO.js";
|
|
79
|
+
import "./chunk-4NXPXE62.js";
|
|
80
|
+
import "./chunk-4VJITV4P.js";
|
|
81
|
+
import "./chunk-GHHFDU2U.js";
|
|
82
|
+
import {
|
|
83
|
+
getProviderRuntimeQuirks
|
|
84
|
+
} from "./chunk-FC23CTXV.js";
|
|
85
|
+
import "./chunk-36PEBZAF.js";
|
|
86
|
+
import {
|
|
87
|
+
resolveProviderCliCommand
|
|
88
|
+
} from "./chunk-SURZ2WFE.js";
|
|
89
|
+
import "./chunk-SP3LFU6B.js";
|
|
90
|
+
import "./chunk-R4UWBC35.js";
|
|
91
|
+
import "./chunk-2YFUIER7.js";
|
|
92
|
+
import "./chunk-CKNX3TTP.js";
|
|
93
|
+
import "./chunk-FYOILAN5.js";
|
|
94
|
+
import "./chunk-J62KPGII.js";
|
|
95
|
+
import "./chunk-XAONGNST.js";
|
|
96
|
+
import "./chunk-GAFJEYLK.js";
|
|
97
|
+
import "./chunk-H6G7QRMQ.js";
|
|
98
|
+
import "./chunk-J6P3FWWW.js";
|
|
99
|
+
import "./chunk-CP7H3HSP.js";
|
|
100
|
+
import "./chunk-ETYDXCK7.js";
|
|
101
|
+
import "./chunk-BSE4R6XD.js";
|
|
102
|
+
import {
|
|
103
|
+
applyWorkspaceMode,
|
|
104
|
+
resolveEffectiveMode
|
|
105
|
+
} from "./chunk-UR2IBGIM.js";
|
|
106
|
+
import "./chunk-JSWMRQYG.js";
|
|
107
|
+
import "./chunk-XGYF2QMZ.js";
|
|
108
|
+
import "./chunk-72YTZMAM.js";
|
|
109
|
+
import "./chunk-S2VQCZO4.js";
|
|
110
|
+
import "./chunk-WMPU2UOV.js";
|
|
111
|
+
import "./chunk-VX3UMWB7.js";
|
|
112
|
+
import {
|
|
113
|
+
deriveOpencodePrefixes
|
|
114
|
+
} from "./chunk-XT2ZQVTC.js";
|
|
115
|
+
import "./chunk-YGXKOBQQ.js";
|
|
116
|
+
import "./chunk-V72RMBM4.js";
|
|
117
|
+
import "./chunk-ZDTGECTN.js";
|
|
118
|
+
import "./chunk-G36W2T2S.js";
|
|
119
|
+
import "./chunk-GKN3HMN4.js";
|
|
120
|
+
import "./chunk-QVZMFDYG.js";
|
|
121
|
+
import "./chunk-S54MKU6V.js";
|
|
122
|
+
import "./chunk-3S62LLWJ.js";
|
|
123
|
+
import "./chunk-45FPSA3B.js";
|
|
124
|
+
import {
|
|
125
|
+
emitTelemetryFallbackWarning
|
|
126
|
+
} from "./chunk-YMX76IOS.js";
|
|
127
|
+
import "./chunk-6Y5U7UFY.js";
|
|
128
|
+
import "./chunk-XV7NZL4B.js";
|
|
129
|
+
import "./chunk-CD7ISXA4.js";
|
|
130
|
+
import "./chunk-QGJDMEOV.js";
|
|
131
|
+
import "./chunk-6TZJRKNW.js";
|
|
132
|
+
import {
|
|
133
|
+
requireActivePolicyBoundary,
|
|
134
|
+
requireActiveSandboxBoundary
|
|
135
|
+
} from "./chunk-PCAGC5MR.js";
|
|
136
|
+
import "./chunk-5WCQRDRB.js";
|
|
137
|
+
import "./chunk-5WRLK5KW.js";
|
|
138
|
+
import {
|
|
139
|
+
mkPoeticTempDir
|
|
140
|
+
} from "./chunk-C57KJOUQ.js";
|
|
141
|
+
import "./chunk-DF5SLDE4.js";
|
|
142
|
+
import "./chunk-TGON4N4O.js";
|
|
143
|
+
import "./chunk-I5WRT7ZR.js";
|
|
144
|
+
import "./chunk-A3YGID55.js";
|
|
145
|
+
import "./chunk-5EERLVZB.js";
|
|
146
|
+
import "./chunk-XQD2B6BB.js";
|
|
147
|
+
import "./chunk-34CNP2HB.js";
|
|
148
|
+
import "./chunk-KNDYMVWN.js";
|
|
149
|
+
import "./chunk-RWREC3KJ.js";
|
|
150
|
+
import "./chunk-7R2WLDOS.js";
|
|
151
|
+
import "./chunk-LAMKBTXX.js";
|
|
152
|
+
import "./chunk-FD4ERYEG.js";
|
|
153
|
+
import "./chunk-KTMW65UX.js";
|
|
154
|
+
import "./chunk-FHOWVDF5.js";
|
|
155
|
+
import "./chunk-UDMS5AD3.js";
|
|
156
|
+
import "./chunk-MWHLBPNU.js";
|
|
157
|
+
import "./chunk-JLS65NUQ.js";
|
|
158
|
+
import "./chunk-TRSVUPCX.js";
|
|
159
|
+
import "./chunk-FKAUPHMR.js";
|
|
160
|
+
import "./chunk-TSXGRLPR.js";
|
|
161
|
+
import {
|
|
162
|
+
CredentialResidueError,
|
|
163
|
+
ProviderExecutionError
|
|
164
|
+
} from "./chunk-LUVKFFWR.js";
|
|
165
|
+
import "./chunk-ENRGKNR5.js";
|
|
166
|
+
import "./chunk-XB5YLCLB.js";
|
|
167
|
+
import "./chunk-QOCOVLUH.js";
|
|
168
|
+
import "./chunk-2VSQMRCB.js";
|
|
169
|
+
import {
|
|
170
|
+
logReasoningEffortResolution,
|
|
171
|
+
resolveReasoningEffort
|
|
172
|
+
} from "./chunk-ON3G73BU.js";
|
|
173
|
+
import "./chunk-3G6FZCRF.js";
|
|
174
|
+
import "./chunk-N5DX4JAK.js";
|
|
175
|
+
import "./chunk-2QLYTVYX.js";
|
|
176
|
+
import "./chunk-7GDRQBQC.js";
|
|
177
|
+
import "./chunk-PGSPX4SU.js";
|
|
178
|
+
import "./chunk-AT4TNPWW.js";
|
|
179
|
+
import "./chunk-GSGD5E4C.js";
|
|
180
|
+
import {
|
|
181
|
+
getExecutionContext
|
|
182
|
+
} from "./chunk-UI2F6DJ5.js";
|
|
183
|
+
import "./chunk-4BTDUT2S.js";
|
|
184
|
+
import "./chunk-L6OM4A22.js";
|
|
185
|
+
import "./chunk-G4THLFV3.js";
|
|
186
|
+
import "./chunk-RGWHUI5E.js";
|
|
187
|
+
import "./chunk-UUH2RVKS.js";
|
|
188
|
+
import "./chunk-LEIIWPWQ.js";
|
|
189
|
+
import "./chunk-L7JZLXQL.js";
|
|
190
|
+
import "./chunk-IZYIQQ7X.js";
|
|
191
|
+
import "./chunk-JPKSXKNB.js";
|
|
192
|
+
import "./chunk-TAJPCXSB.js";
|
|
193
|
+
import "./chunk-XZE4XARH.js";
|
|
194
|
+
import {
|
|
195
|
+
debugLog,
|
|
196
|
+
isDebugMode
|
|
197
|
+
} from "./chunk-EJGCZGUF.js";
|
|
198
|
+
import "./chunk-LPITVM7M.js";
|
|
199
|
+
import {
|
|
200
|
+
POETIC_ALLOW_MOCK_PROVIDERS,
|
|
201
|
+
POETIC_MOCK_PROVIDERS,
|
|
202
|
+
POETIC_OPENCODE_TRANSIENT_AGENT,
|
|
203
|
+
POETIC_OPENCODE_XDG_CACHE_HOME,
|
|
204
|
+
POETIC_OPENCODE_XDG_CONFIG_HOME,
|
|
205
|
+
POETIC_OPENCODE_XDG_DATA_HOME,
|
|
206
|
+
POETIC_OPENCODE_XDG_STATE_HOME,
|
|
207
|
+
POETIC_TEST_FAST_RETRY,
|
|
208
|
+
readEnv,
|
|
209
|
+
readRawEnv
|
|
210
|
+
} from "./chunk-5DLKYTQX.js";
|
|
211
|
+
import "./chunk-PZ5AY32C.js";
|
|
212
|
+
|
|
213
|
+
// src/core/providers/opencode/execution/runner.ts
|
|
214
|
+
import * as fs2 from "fs/promises";
|
|
215
|
+
import { homedir, tmpdir } from "os";
|
|
216
|
+
import * as path2 from "path";
|
|
217
|
+
|
|
218
|
+
// src/core/steering/transport/opencode.ts
|
|
219
|
+
import { randomBytes } from "crypto";
|
|
220
|
+
function buildOpencodeSteering(options) {
|
|
221
|
+
return assembleSteering({
|
|
222
|
+
provider: "opencode",
|
|
223
|
+
guidance: options.guidance
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
function planOpencodeTransientAgent(payload, options = {}) {
|
|
227
|
+
if (!payload.systemChannel) return void 0;
|
|
228
|
+
const suffix = options.randomSuffix ?? randomBytes(8).toString("hex");
|
|
229
|
+
const agentName = `poetic-steering-${suffix}`;
|
|
230
|
+
const config = {
|
|
231
|
+
$schema: "https://opencode.ai/config.json",
|
|
232
|
+
agent: {
|
|
233
|
+
[agentName]: {
|
|
234
|
+
description: "Poetic runtime steering (transient, per-invocation).",
|
|
235
|
+
mode: "primary",
|
|
236
|
+
prompt: payload.systemChannel
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
return {
|
|
241
|
+
agentName,
|
|
242
|
+
configContent: JSON.stringify(config)
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function applyOpencodePreambleFallback(payload, userPrompt) {
|
|
246
|
+
if (!payload.systemChannel) return userPrompt;
|
|
247
|
+
return `${payload.systemChannel}
|
|
248
|
+
|
|
249
|
+
${userPrompt}`;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// src/core/providers/opencode/capabilities.ts
|
|
253
|
+
var capabilityCache = null;
|
|
254
|
+
var capabilityCacheValidatedAt = 0;
|
|
255
|
+
var capabilityProbePromise = null;
|
|
256
|
+
var capabilityCacheKey = null;
|
|
257
|
+
function hasHelpTextShape(text) {
|
|
258
|
+
return /\b(usage|options|positionals)\b/i.test(text);
|
|
259
|
+
}
|
|
260
|
+
function hasCliFlag(text, longFlag) {
|
|
261
|
+
const escaped = longFlag.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
262
|
+
return new RegExp(`(^|[\\s,])${escaped}(?=$|[\\s,])`).test(text);
|
|
263
|
+
}
|
|
264
|
+
function defaultCapabilities() {
|
|
265
|
+
return {
|
|
266
|
+
supportsFormatJson: false,
|
|
267
|
+
supportsTitle: false,
|
|
268
|
+
supportsVariant: false,
|
|
269
|
+
supportsFile: false,
|
|
270
|
+
supportsAgent: false,
|
|
271
|
+
supportsDir: false,
|
|
272
|
+
supportsDangerouslySkipPermissions: false,
|
|
273
|
+
supportsPure: false
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
async function getOpencodeRunCapabilities(env) {
|
|
277
|
+
const now = Date.now();
|
|
278
|
+
if (capabilityProbePromise) {
|
|
279
|
+
return capabilityProbePromise;
|
|
280
|
+
}
|
|
281
|
+
capabilityProbePromise = (async () => {
|
|
282
|
+
const capabilities = defaultCapabilities();
|
|
283
|
+
try {
|
|
284
|
+
const { execa } = await import("execa");
|
|
285
|
+
const { command, prefixArgs } = resolveProviderCliCommand("opencode");
|
|
286
|
+
const mergedEnv = {
|
|
287
|
+
...process.env,
|
|
288
|
+
...env ?? {}
|
|
289
|
+
};
|
|
290
|
+
const version = await execa(command, [...prefixArgs, "--version"], {
|
|
291
|
+
reject: false,
|
|
292
|
+
timeout: 5e3,
|
|
293
|
+
env: mergedEnv
|
|
294
|
+
});
|
|
295
|
+
const cacheKey = `${command} ${prefixArgs.join(" ")}::${(version.stdout ?? "").trim()}`;
|
|
296
|
+
const cliVersion = normalizeProviderCliVersion(version.stdout);
|
|
297
|
+
if (version.exitCode === 0 && cliVersion) {
|
|
298
|
+
capabilities.cliVersion = cliVersion;
|
|
299
|
+
}
|
|
300
|
+
if (capabilityCache && capabilityCacheValidatedAt && capabilityCacheKey === cacheKey && now - capabilityCacheValidatedAt < 6e4) {
|
|
301
|
+
return capabilityCache;
|
|
302
|
+
}
|
|
303
|
+
const help = await execa(command, [...prefixArgs, "run", "--help"], {
|
|
304
|
+
reject: false,
|
|
305
|
+
timeout: 5e3,
|
|
306
|
+
env: mergedEnv
|
|
307
|
+
});
|
|
308
|
+
const text = `${help.stdout ?? ""}
|
|
309
|
+
${help.stderr ?? ""}`;
|
|
310
|
+
if (hasHelpTextShape(text)) {
|
|
311
|
+
capabilities.supportsFormatJson = hasCliFlag(text, "--format") && /\bjson\b/.test(text);
|
|
312
|
+
capabilities.supportsTitle = hasCliFlag(text, "--title");
|
|
313
|
+
capabilities.supportsVariant = hasCliFlag(text, "--variant");
|
|
314
|
+
capabilities.supportsFile = hasCliFlag(text, "--file");
|
|
315
|
+
capabilities.supportsAgent = hasCliFlag(text, "--agent");
|
|
316
|
+
capabilities.supportsDir = hasCliFlag(text, "--dir");
|
|
317
|
+
capabilities.supportsDangerouslySkipPermissions = hasCliFlag(
|
|
318
|
+
text,
|
|
319
|
+
"--dangerously-skip-permissions"
|
|
320
|
+
);
|
|
321
|
+
capabilities.supportsPure = hasCliFlag(text, "--pure");
|
|
322
|
+
}
|
|
323
|
+
capabilityCacheKey = cacheKey;
|
|
324
|
+
} catch (error) {
|
|
325
|
+
debugLog(
|
|
326
|
+
`[OpenCode] CLI capability probe failed; falling back to conservative flags. Error: ${error instanceof Error ? error.message : String(error)}`
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
capabilityCache = capabilities;
|
|
330
|
+
capabilityCacheValidatedAt = Date.now();
|
|
331
|
+
return capabilities;
|
|
332
|
+
})();
|
|
333
|
+
try {
|
|
334
|
+
return await capabilityProbePromise;
|
|
335
|
+
} finally {
|
|
336
|
+
capabilityProbePromise = null;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// src/core/providers/opencode/error-parser.ts
|
|
341
|
+
var MODEL_NOT_FOUND_PATTERN = /\bmodel_not_found\b|providermodelnotfound|\bmodel not found\b|\bunknown model\b|no such model|model\s+["'`][^"'`]+["'`]\s+not found/i;
|
|
342
|
+
function extractRequestedModelId(...texts) {
|
|
343
|
+
const combined = texts.filter(Boolean).join("\n");
|
|
344
|
+
const patterns = [
|
|
345
|
+
/model[_\s-]?not[_\s-]?found[:\s]+["'`]?([A-Za-z0-9._/:-]+)/i,
|
|
346
|
+
/unknown model[:\s]+["'`]?([A-Za-z0-9._/:-]+)/i,
|
|
347
|
+
/model ["'`]([^"'`]+)["'`]/i,
|
|
348
|
+
/--model\s+([A-Za-z0-9._/:-]+)/i
|
|
349
|
+
];
|
|
350
|
+
for (const pattern of patterns) {
|
|
351
|
+
const match = combined.match(pattern);
|
|
352
|
+
const id = match?.[1]?.trim();
|
|
353
|
+
if (id) return id;
|
|
354
|
+
}
|
|
355
|
+
return void 0;
|
|
356
|
+
}
|
|
357
|
+
function buildOpencodeModelNotFoundUserMessage(context = {}) {
|
|
358
|
+
const requested = context.requestedModel?.trim() || "unknown";
|
|
359
|
+
const cliVersion = context.cliVersion?.trim() || "unknown";
|
|
360
|
+
const inventoryAge = context.inventoryAgeMs === void 0 ? "unknown" : formatCacheAge(context.inventoryAgeMs);
|
|
361
|
+
const parts = [
|
|
362
|
+
`OpenCode could not resolve model "${requested}".`,
|
|
363
|
+
`CLI version: ${cliVersion}. Inventory age: ${inventoryAge}.`
|
|
364
|
+
];
|
|
365
|
+
const inventory = context.inventoryModelIds;
|
|
366
|
+
if (inventory === void 0) {
|
|
367
|
+
parts.push(
|
|
368
|
+
"The local OpenCode model inventory is unavailable, so Poetic could not compare the requested model with it."
|
|
369
|
+
);
|
|
370
|
+
} else if (inventory.length === 0) {
|
|
371
|
+
parts.push("The local OpenCode model inventory is available but empty.");
|
|
372
|
+
} else {
|
|
373
|
+
const canonicalRequested = canonicalizeOpencodeModelId(requested, [...inventory]);
|
|
374
|
+
if (canonicalRequested !== requested) {
|
|
375
|
+
parts.push(`Canonical inventory model: "${canonicalRequested}".`);
|
|
376
|
+
}
|
|
377
|
+
if (inventory.includes(canonicalRequested)) {
|
|
378
|
+
parts.push(
|
|
379
|
+
"The local inventory lists that model; the OpenCode execution error remains authoritative."
|
|
380
|
+
);
|
|
381
|
+
} else {
|
|
382
|
+
const [requestedPrefix] = deriveOpencodePrefixes([canonicalRequested]);
|
|
383
|
+
const inventoryPrefixes = deriveOpencodePrefixes(inventory);
|
|
384
|
+
if (requestedPrefix && !inventoryPrefixes.has(requestedPrefix)) {
|
|
385
|
+
parts.push(
|
|
386
|
+
`The local inventory does not list models for provider prefix "${requestedPrefix}".`
|
|
387
|
+
);
|
|
388
|
+
} else if (requestedPrefix) {
|
|
389
|
+
parts.push(
|
|
390
|
+
`The local inventory lists provider prefix "${requestedPrefix}" but does not list model "${canonicalRequested}".`
|
|
391
|
+
);
|
|
392
|
+
} else {
|
|
393
|
+
parts.push(`The local inventory does not list model "${canonicalRequested}".`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
parts.push("Refresh the local inventory with `opencode models --refresh`.");
|
|
398
|
+
return parts.join(" ");
|
|
399
|
+
}
|
|
400
|
+
function parseOpencodeError(error, context = {}) {
|
|
401
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
402
|
+
const providerError = error instanceof ProviderExecutionError ? error : void 0;
|
|
403
|
+
const stderr = providerError?.stderr ?? "";
|
|
404
|
+
const stdout = providerError?.stdout ?? "";
|
|
405
|
+
const exitCode = providerError?.exitCode;
|
|
406
|
+
const reason = providerError?.reason;
|
|
407
|
+
const combined = `${message}
|
|
408
|
+
${stderr}
|
|
409
|
+
${stdout}`.toLowerCase();
|
|
410
|
+
const hasHttpStatusContext = /\b(?:http|status|response|error|code)\s*(?:[:=]|\bis\b)?\s*(401|403|429|500|502|503|504|400)\b/i.test(
|
|
411
|
+
combined
|
|
412
|
+
);
|
|
413
|
+
const hasAuthSignal = /unauthorized|unauthenticated|authentication required|login required|invalid api key|api key has been revoked|(?:api|access|authorization|account).*permission denied|permission denied.*(?:api|key|token|account)|forbidden|not authenticated|session expired|credentials invalid|could not load credentials|load credentials/i.test(
|
|
414
|
+
combined
|
|
415
|
+
);
|
|
416
|
+
const isFilesystemPermissionError = /(?:eacces|eperm|operation not permitted|read-only file system|permission denied)/i.test(
|
|
417
|
+
combined
|
|
418
|
+
) && /(?:file|directory|path|mkdir|open|write|rename|unlink|chmod|stat)\b/i.test(combined);
|
|
419
|
+
if (reason === "command_not_found" || /\bcommand not found\b/i.test(combined) || /spawn .* enoent/i.test(combined)) {
|
|
420
|
+
return {
|
|
421
|
+
type: "command_not_found",
|
|
422
|
+
retryable: false,
|
|
423
|
+
userMessage: "OpenCode CLI not found. Install with `curl -fsSL https://opencode.ai/install | bash` or `npm install -g opencode-ai`, then run `opencode auth login`.",
|
|
424
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
if ((hasAuthSignal || hasHttpStatusContext && /\b401\b|\b403\b/.test(combined)) && !isFilesystemPermissionError) {
|
|
428
|
+
return {
|
|
429
|
+
type: "auth",
|
|
430
|
+
retryable: false,
|
|
431
|
+
userMessage: "OpenCode authentication failed. Run `opencode auth login` to re-authenticate.",
|
|
432
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
if (/\brate limit\b|\btoo many requests\b|\bquota exceeded\b|resource_exhausted/i.test(combined) || hasHttpStatusContext && /\b429\b/.test(combined)) {
|
|
436
|
+
return {
|
|
437
|
+
type: "rate_limit",
|
|
438
|
+
retryable: true,
|
|
439
|
+
userMessage: "OpenCode rate limit or quota exceeded. Retrying may succeed after backoff.",
|
|
440
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
if (/service unavailable|temporarily unavailable|server is overloaded|overloaded/i.test(combined) || hasHttpStatusContext && /\b503\b|\b502\b|\b500\b|\b504\b/.test(combined)) {
|
|
444
|
+
return {
|
|
445
|
+
type: "capacity",
|
|
446
|
+
retryable: true,
|
|
447
|
+
userMessage: "OpenCode service temporarily unavailable. Retrying may succeed.",
|
|
448
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
if (/performing one time database migration/i.test(combined)) {
|
|
452
|
+
return {
|
|
453
|
+
type: "bootstrap",
|
|
454
|
+
retryable: true,
|
|
455
|
+
userMessage: "OpenCode is performing first-run setup. Retrying may succeed.",
|
|
456
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
if (reason === "timeout" || /execution timed out/i.test(combined)) {
|
|
460
|
+
return {
|
|
461
|
+
type: "timeout",
|
|
462
|
+
retryable: false,
|
|
463
|
+
userMessage: "OpenCode execution timed out. Consider increasing timeout or simplifying the task.",
|
|
464
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
if (/econnreset|econnrefused|enotfound|enetunreach|etimedout|eai_again|socket hang up|fetch failed|network error|getaddrinfo|connection.*timeout/i.test(
|
|
468
|
+
combined
|
|
469
|
+
)) {
|
|
470
|
+
return {
|
|
471
|
+
type: "network",
|
|
472
|
+
retryable: true,
|
|
473
|
+
userMessage: "Network error connecting to OpenCode. Retrying may succeed.",
|
|
474
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
if (MODEL_NOT_FOUND_PATTERN.test(combined)) {
|
|
478
|
+
const requestedModel = context.requestedModel?.trim() || extractRequestedModelId(message, stderr, stdout) || void 0;
|
|
479
|
+
return {
|
|
480
|
+
type: "model_not_found",
|
|
481
|
+
retryable: false,
|
|
482
|
+
userMessage: buildOpencodeModelNotFoundUserMessage({
|
|
483
|
+
requestedModel,
|
|
484
|
+
cliVersion: context.cliVersion,
|
|
485
|
+
inventoryModelIds: context.inventoryModelIds,
|
|
486
|
+
inventoryAgeMs: context.inventoryAgeMs
|
|
487
|
+
}),
|
|
488
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
if (/maximum context length|context window|token limit|too many tokens|prompt too long|input is too long|request exceeds/i.test(
|
|
492
|
+
combined
|
|
493
|
+
)) {
|
|
494
|
+
return {
|
|
495
|
+
type: "validation",
|
|
496
|
+
retryable: false,
|
|
497
|
+
userMessage: "OpenCode request is too large for the model context window.",
|
|
498
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
if (/invalid arguments|unknown option|unrecognized|usage:|bad request/i.test(combined) || hasHttpStatusContext && /\b400\b/.test(combined)) {
|
|
502
|
+
return {
|
|
503
|
+
type: "validation",
|
|
504
|
+
retryable: false,
|
|
505
|
+
userMessage: "Invalid request to OpenCode CLI. This may be a Poetic configuration bug.",
|
|
506
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
return {
|
|
510
|
+
type: "unknown",
|
|
511
|
+
retryable: false,
|
|
512
|
+
userMessage: "OpenCode execution failed with an unknown error.",
|
|
513
|
+
original: { message, stderr, stdout, exitCode, reason }
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// src/core/providers/opencode/log-diagnostics.ts
|
|
518
|
+
import * as fs from "fs/promises";
|
|
519
|
+
import * as path from "path";
|
|
520
|
+
var MAX_OPENCODE_LOG_ERRORS = 5;
|
|
521
|
+
var MAX_OPENCODE_LOG_BYTES = 256 * 1024;
|
|
522
|
+
var LOG_FIELD_PATTERN = /(?:^|\s)(providerID|modelID|message|error(?:\.error)?)=("(?:\\.|[^"])*"|[^\s]+)/g;
|
|
523
|
+
function decodeLogValue(raw) {
|
|
524
|
+
if (!raw.startsWith('"')) return raw;
|
|
525
|
+
try {
|
|
526
|
+
return JSON.parse(raw);
|
|
527
|
+
} catch {
|
|
528
|
+
return raw.slice(1, -1);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
function extractOpencodeLogErrors(logText) {
|
|
532
|
+
const summaries = [];
|
|
533
|
+
const seen = /* @__PURE__ */ new Set();
|
|
534
|
+
for (const line of logText.split(/\r?\n/)) {
|
|
535
|
+
if (!/\blevel=ERROR\b/.test(line)) continue;
|
|
536
|
+
const fields = /* @__PURE__ */ new Map();
|
|
537
|
+
for (const match of line.matchAll(LOG_FIELD_PATTERN)) {
|
|
538
|
+
const key = match[1];
|
|
539
|
+
const value = match[2];
|
|
540
|
+
if (key && value) fields.set(key, decodeLogValue(value));
|
|
541
|
+
}
|
|
542
|
+
const error = fields.get("error.error") ?? fields.get("error");
|
|
543
|
+
const parts = [
|
|
544
|
+
fields.get("providerID") ? `provider=${fields.get("providerID")}` : void 0,
|
|
545
|
+
fields.get("modelID") ? `model=${fields.get("modelID")}` : void 0,
|
|
546
|
+
fields.get("message") ? `message=${fields.get("message")}` : void 0,
|
|
547
|
+
error ? `error=${error}` : void 0
|
|
548
|
+
].filter(Boolean);
|
|
549
|
+
if (parts.length === 0) continue;
|
|
550
|
+
const summary = sanitizeDiagnosticOutput(`OpenCode log error: ${parts.join(" ")}`, 500);
|
|
551
|
+
if (!summary || seen.has(summary)) continue;
|
|
552
|
+
seen.add(summary);
|
|
553
|
+
summaries.push(summary);
|
|
554
|
+
}
|
|
555
|
+
return summaries.slice(-MAX_OPENCODE_LOG_ERRORS);
|
|
556
|
+
}
|
|
557
|
+
async function captureOpencodeLogCheckpoint(dataHome) {
|
|
558
|
+
const logPath = path.join(dataHome, "opencode", "log", "opencode.log");
|
|
559
|
+
try {
|
|
560
|
+
const stat2 = await fs.stat(logPath);
|
|
561
|
+
return { path: logPath, offset: stat2.size };
|
|
562
|
+
} catch {
|
|
563
|
+
return { path: logPath, offset: 0 };
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
async function readOpencodeLogErrorsSince(checkpoint) {
|
|
567
|
+
let handle;
|
|
568
|
+
try {
|
|
569
|
+
const stat2 = await fs.stat(checkpoint.path);
|
|
570
|
+
if (stat2.size <= checkpoint.offset) return [];
|
|
571
|
+
const start = Math.max(checkpoint.offset, stat2.size - MAX_OPENCODE_LOG_BYTES);
|
|
572
|
+
const length = stat2.size - start;
|
|
573
|
+
const buffer = Buffer.alloc(length);
|
|
574
|
+
handle = await fs.open(checkpoint.path, "r");
|
|
575
|
+
const { bytesRead } = await handle.read(buffer, 0, length, start);
|
|
576
|
+
return extractOpencodeLogErrors(buffer.subarray(0, bytesRead).toString("utf8"));
|
|
577
|
+
} catch {
|
|
578
|
+
return [];
|
|
579
|
+
} finally {
|
|
580
|
+
await handle?.close().catch(() => {
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// src/core/providers/opencode/prompt-adapter.ts
|
|
586
|
+
function adaptPromptForOpencode(prompt, options = {}) {
|
|
587
|
+
const effectiveMode = resolveEffectiveMode(
|
|
588
|
+
options.promptMode ?? null,
|
|
589
|
+
options.globalWorkspaceMode ?? null,
|
|
590
|
+
"opencode"
|
|
591
|
+
);
|
|
592
|
+
if (effectiveMode === "passthrough") {
|
|
593
|
+
return {
|
|
594
|
+
original: prompt,
|
|
595
|
+
adapted: prompt,
|
|
596
|
+
adaptations: ["Passthrough prompt for native OpenCode CLI parity"],
|
|
597
|
+
promptMode: effectiveMode
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
const strategy = (options.strategy ?? "conservative").trim().toLowerCase();
|
|
601
|
+
const composed = applyWorkspaceMode(prompt, {
|
|
602
|
+
mode: effectiveMode,
|
|
603
|
+
provider: "OPENCODE",
|
|
604
|
+
executionIntent: options.executionIntent ?? "mixed",
|
|
605
|
+
strategy: strategy === "innovative" ? "innovative" : strategy === "hybrid" ? "hybrid" : "conservative",
|
|
606
|
+
targetFiles: options.files,
|
|
607
|
+
projectRoot: options.projectRoot
|
|
608
|
+
});
|
|
609
|
+
return {
|
|
610
|
+
original: prompt,
|
|
611
|
+
adapted: composed.adapted,
|
|
612
|
+
adaptations: composed.operations,
|
|
613
|
+
promptMode: composed.mode,
|
|
614
|
+
completionSignalVariant: composed.completionSignalVariant
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
function formatAdaptations(adaptation) {
|
|
618
|
+
const lines = [];
|
|
619
|
+
lines.push("[PromptAdapter] OpenCode prompt adapted");
|
|
620
|
+
lines.push(` - Mode: ${adaptation.promptMode}`);
|
|
621
|
+
lines.push(` - Original length: ${adaptation.original.length} chars`);
|
|
622
|
+
lines.push(` - Adapted length: ${adaptation.adapted.length} chars`);
|
|
623
|
+
lines.push(` - Transformations applied: ${adaptation.adaptations.length}`);
|
|
624
|
+
if (adaptation.adaptations.length > 0) {
|
|
625
|
+
lines.push(" - Applied:");
|
|
626
|
+
for (const item of adaptation.adaptations) {
|
|
627
|
+
lines.push(` - ${item}`);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
if (isDebugMode()) {
|
|
631
|
+
lines.push(` - Size delta: ${adaptation.adapted.length - adaptation.original.length} chars`);
|
|
632
|
+
}
|
|
633
|
+
return lines.join("\n");
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// src/core/providers/opencode/reasoning-variant.ts
|
|
637
|
+
function normalizeOpencodeReasoningEffort(value) {
|
|
638
|
+
if (typeof value !== "string") return void 0;
|
|
639
|
+
const normalized = value.trim().toLowerCase().replace(/[_\s]/g, "-");
|
|
640
|
+
if (normalized === "low" || normalized === "medium" || normalized === "high") {
|
|
641
|
+
return normalized;
|
|
642
|
+
}
|
|
643
|
+
if (normalized === "xhigh" || normalized === "x-high" || normalized === "extra-high") {
|
|
644
|
+
return "xhigh";
|
|
645
|
+
}
|
|
646
|
+
if (normalized === "max") return "max";
|
|
647
|
+
return void 0;
|
|
648
|
+
}
|
|
649
|
+
function mapReasoningEffortToOpencodeVariant(effort) {
|
|
650
|
+
return resolveReasoningEffort("opencode", effort, false).variantMapping;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// src/core/providers/opencode/execution/runner.ts
|
|
654
|
+
var OPENCODE_CIRCUIT_BREAKER_OPTIONS = DEFAULT_PROVIDER_CIRCUIT_BREAKER_OPTIONS;
|
|
655
|
+
var OPENCODE_DEADLINE_SAFETY_BUFFER_MS = 5e3;
|
|
656
|
+
function readOpencodeRuntimeEnv(env, spec) {
|
|
657
|
+
const envValue = env?.[spec.name]?.trim();
|
|
658
|
+
if (envValue) {
|
|
659
|
+
return envValue;
|
|
660
|
+
}
|
|
661
|
+
const contextValue = getExecutionContext().envOverrides[spec.name]?.trim();
|
|
662
|
+
if (contextValue) {
|
|
663
|
+
return contextValue;
|
|
664
|
+
}
|
|
665
|
+
return readRawEnv(spec)?.trim();
|
|
666
|
+
}
|
|
667
|
+
function isOpencodeRuntimeEnvEnabled(env, spec) {
|
|
668
|
+
const raw = readOpencodeRuntimeEnv(env, spec);
|
|
669
|
+
if (raw === void 0) {
|
|
670
|
+
return spec.default ?? false;
|
|
671
|
+
}
|
|
672
|
+
const normalized = raw.toLowerCase();
|
|
673
|
+
if (["1", "true", "yes", "on"].includes(normalized)) return true;
|
|
674
|
+
if (["0", "false", "no", "off"].includes(normalized)) return false;
|
|
675
|
+
throw new Error(
|
|
676
|
+
`Invalid boolean value for ${spec.name}: "${raw}". Expected one of: 1, true, yes, on, 0, false, no, off`
|
|
677
|
+
);
|
|
678
|
+
}
|
|
679
|
+
function resolveOpencodeAttemptTimeoutMs(timeoutMs, deadlineMs) {
|
|
680
|
+
if (deadlineMs == null) {
|
|
681
|
+
return timeoutMs;
|
|
682
|
+
}
|
|
683
|
+
const remainingMs = deadlineMs - Date.now() - OPENCODE_DEADLINE_SAFETY_BUFFER_MS;
|
|
684
|
+
if (remainingMs <= 0) {
|
|
685
|
+
throw new ProviderExecutionError("OpenCode deadline exceeded before attempt start.", {
|
|
686
|
+
providerName: metadata.id,
|
|
687
|
+
retryable: false,
|
|
688
|
+
reason: "deadline_exhausted"
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
return Math.max(1, Math.min(timeoutMs, remainingMs));
|
|
692
|
+
}
|
|
693
|
+
function resolveOpencodeIdleTimeout(requested, providerDefault, allowAboveProviderDefault) {
|
|
694
|
+
if (requested == null) return providerDefault;
|
|
695
|
+
if (providerDefault == null || allowAboveProviderDefault) return requested;
|
|
696
|
+
return Math.min(requested, providerDefault);
|
|
697
|
+
}
|
|
698
|
+
function resolveTaskAwareVariant(prompt) {
|
|
699
|
+
const taskType = detectTaskType(prompt);
|
|
700
|
+
const generationSettings = resolveSettings(taskType, "opencode");
|
|
701
|
+
const taskEffort = normalizeOpencodeReasoningEffort(generationSettings.reasoningEffort);
|
|
702
|
+
if (!taskEffort) {
|
|
703
|
+
return void 0;
|
|
704
|
+
}
|
|
705
|
+
const resolution = resolveReasoningEffort("opencode", taskEffort, false);
|
|
706
|
+
logReasoningEffortResolution(resolution, "opencode");
|
|
707
|
+
if (resolution.variantMapping) {
|
|
708
|
+
debugLog(
|
|
709
|
+
`[OpenCode] Task-aware variant selected: ${resolution.variantMapping} (taskType=${taskType})`
|
|
710
|
+
);
|
|
711
|
+
}
|
|
712
|
+
return resolution.variantMapping;
|
|
713
|
+
}
|
|
714
|
+
function formatResolvedOpencodeModel(providerId, modelId) {
|
|
715
|
+
if (typeof modelId !== "string" || modelId.trim().length === 0) {
|
|
716
|
+
return void 0;
|
|
717
|
+
}
|
|
718
|
+
const trimmedModel = modelId.trim();
|
|
719
|
+
if (trimmedModel.includes("/")) {
|
|
720
|
+
return trimmedModel;
|
|
721
|
+
}
|
|
722
|
+
return typeof providerId === "string" && providerId.trim().length > 0 ? `${providerId.trim()}/${trimmedModel}` : trimmedModel;
|
|
723
|
+
}
|
|
724
|
+
function extractUsefulOpencodeRawOutput(stdout, stderr) {
|
|
725
|
+
return stripAnsiSequences(`${stdout}
|
|
726
|
+
${stderr}`).split(/\r?\n/).map((line) => line.trim()).filter((line) => {
|
|
727
|
+
if (!line) return false;
|
|
728
|
+
if (line === "Performing one time database migration, may take a few minutes...") {
|
|
729
|
+
return false;
|
|
730
|
+
}
|
|
731
|
+
if (line === "sqlite-migration:done") return false;
|
|
732
|
+
if (line === "Database migration complete.") return false;
|
|
733
|
+
if (/^>\s+build\s+·\s+/i.test(line)) return false;
|
|
734
|
+
return true;
|
|
735
|
+
}).join("\n").trim();
|
|
736
|
+
}
|
|
737
|
+
function hasOpencodeReportedToolFailure(output) {
|
|
738
|
+
return output.split(/\r?\n/).some((line) => /^\u2717\s+.+\s+failed\b/i.test(line.trim()));
|
|
739
|
+
}
|
|
740
|
+
function summarizeOpencodeErrorEvents(errorEvents) {
|
|
741
|
+
return errorEvents.slice(0, 3).map((event) => {
|
|
742
|
+
const type = event.errorType ? ` (${event.errorType})` : "";
|
|
743
|
+
const retryable = event.retryable === false ? "hard" : "retryable/degraded";
|
|
744
|
+
return `OpenCode error event${type} [${retryable}]: ${event.message}`;
|
|
745
|
+
}).join("\n");
|
|
746
|
+
}
|
|
747
|
+
function resolveUserOpencodeDataHome() {
|
|
748
|
+
return process.env.XDG_DATA_HOME?.trim() || path2.join(homedir(), ".local", "share");
|
|
749
|
+
}
|
|
750
|
+
function resolveUserOpencodeConfigHome() {
|
|
751
|
+
return process.env.XDG_CONFIG_HOME?.trim() || path2.join(homedir(), ".config");
|
|
752
|
+
}
|
|
753
|
+
var OPENCODE_USER_CONFIG_FILES = ["opencode.json", "config.json"];
|
|
754
|
+
var OPENCODE_USER_CONFIG_DIRS = ["agent"];
|
|
755
|
+
async function seedOpencodeUserConfig(sourceConfigHome, destinationConfigHome) {
|
|
756
|
+
if (path2.resolve(sourceConfigHome) === path2.resolve(destinationConfigHome)) {
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
759
|
+
const sourceDir = path2.join(sourceConfigHome, "opencode");
|
|
760
|
+
const destinationDir = path2.join(destinationConfigHome, "opencode");
|
|
761
|
+
try {
|
|
762
|
+
await fs2.access(sourceDir);
|
|
763
|
+
} catch {
|
|
764
|
+
return;
|
|
765
|
+
}
|
|
766
|
+
try {
|
|
767
|
+
await fs2.mkdir(destinationDir, { recursive: true });
|
|
768
|
+
} catch (error) {
|
|
769
|
+
throw new Error(
|
|
770
|
+
`Failed to create isolated OpenCode config directory: ${error instanceof Error ? error.message : String(error)}`
|
|
771
|
+
);
|
|
772
|
+
}
|
|
773
|
+
for (const fileName of OPENCODE_USER_CONFIG_FILES) {
|
|
774
|
+
const src = path2.join(sourceDir, fileName);
|
|
775
|
+
const dst = path2.join(destinationDir, fileName);
|
|
776
|
+
try {
|
|
777
|
+
await fs2.copyFile(src, dst);
|
|
778
|
+
} catch (error) {
|
|
779
|
+
const code = error.code;
|
|
780
|
+
if (code !== "ENOENT") {
|
|
781
|
+
throw new Error(
|
|
782
|
+
`Failed to seed OpenCode ${fileName} into isolated XDG_CONFIG_HOME: ${error instanceof Error ? error.message : String(error)}`
|
|
783
|
+
);
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
for (const dirName of OPENCODE_USER_CONFIG_DIRS) {
|
|
788
|
+
const src = path2.join(sourceDir, dirName);
|
|
789
|
+
const dst = path2.join(destinationDir, dirName);
|
|
790
|
+
try {
|
|
791
|
+
await fs2.cp(src, dst, { recursive: true, errorOnExist: false, force: true });
|
|
792
|
+
} catch (error) {
|
|
793
|
+
const code = error.code;
|
|
794
|
+
if (code !== "ENOENT") {
|
|
795
|
+
throw new Error(
|
|
796
|
+
`Failed to seed OpenCode ${dirName}/ into isolated XDG_CONFIG_HOME: ${error instanceof Error ? error.message : String(error)}`
|
|
797
|
+
);
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
async function seedOpencodeCredentials(sourceDataHome, destinationDataHome) {
|
|
803
|
+
if (path2.resolve(sourceDataHome) === path2.resolve(destinationDataHome)) {
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
const sourceAuthPath = path2.join(sourceDataHome, "opencode", "auth.json");
|
|
807
|
+
const destinationDir = path2.join(destinationDataHome, "opencode");
|
|
808
|
+
const destinationAuthPath = path2.join(destinationDir, "auth.json");
|
|
809
|
+
try {
|
|
810
|
+
await fs2.mkdir(destinationDir, { recursive: true });
|
|
811
|
+
await fs2.copyFile(sourceAuthPath, destinationAuthPath);
|
|
812
|
+
} catch (error) {
|
|
813
|
+
const code = error.code;
|
|
814
|
+
if (code !== "ENOENT") {
|
|
815
|
+
debugLog(
|
|
816
|
+
`[OpenCode] Failed to seed auth.json into isolated XDG_DATA_HOME: ${error instanceof Error ? error.message : String(error)}`
|
|
817
|
+
);
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
async function resolveOpencodeDataHome(env) {
|
|
822
|
+
const caller = resolveCallerOwnedPath(
|
|
823
|
+
env?.XDG_DATA_HOME,
|
|
824
|
+
readOpencodeRuntimeEnv(env, POETIC_OPENCODE_XDG_DATA_HOME)
|
|
825
|
+
);
|
|
826
|
+
if (caller) return { dataHome: caller.path };
|
|
827
|
+
const dataHome = await mkPoeticTempDir("opencode-xdg");
|
|
828
|
+
await seedOpencodeCredentials(resolveUserOpencodeDataHome(), dataHome);
|
|
829
|
+
const owned = markRunOwnedRoot(dataHome);
|
|
830
|
+
return {
|
|
831
|
+
dataHome,
|
|
832
|
+
cleanup: async () => {
|
|
833
|
+
await removeAndVerifyRunOwnedRoot(owned, { role: "opencode-xdg-data" });
|
|
834
|
+
}
|
|
835
|
+
};
|
|
836
|
+
}
|
|
837
|
+
async function resolveOpencodeStateHome(env) {
|
|
838
|
+
const caller = resolveCallerOwnedPath(
|
|
839
|
+
env?.XDG_STATE_HOME,
|
|
840
|
+
readOpencodeRuntimeEnv(env, POETIC_OPENCODE_XDG_STATE_HOME)
|
|
841
|
+
);
|
|
842
|
+
if (caller) return { stateHome: caller.path };
|
|
843
|
+
const stateHome = await mkPoeticTempDir("opencode-state");
|
|
844
|
+
const owned = markRunOwnedRoot(stateHome);
|
|
845
|
+
return {
|
|
846
|
+
stateHome,
|
|
847
|
+
cleanup: async () => {
|
|
848
|
+
await removeAndVerifyRunOwnedRoot(owned, { role: "opencode-xdg-state" });
|
|
849
|
+
}
|
|
850
|
+
};
|
|
851
|
+
}
|
|
852
|
+
async function resolveOpencodeConfigHome(env) {
|
|
853
|
+
const caller = resolveCallerOwnedPath(
|
|
854
|
+
env?.XDG_CONFIG_HOME,
|
|
855
|
+
readOpencodeRuntimeEnv(env, POETIC_OPENCODE_XDG_CONFIG_HOME)
|
|
856
|
+
);
|
|
857
|
+
if (caller) return { configHome: caller.path };
|
|
858
|
+
const configHome = await mkPoeticTempDir("opencode-config");
|
|
859
|
+
const owned = markRunOwnedRoot(configHome);
|
|
860
|
+
try {
|
|
861
|
+
await seedOpencodeUserConfig(resolveUserOpencodeConfigHome(), configHome);
|
|
862
|
+
} catch (error) {
|
|
863
|
+
try {
|
|
864
|
+
await removeAndVerifyRunOwnedRoot(owned, { role: "opencode-xdg-config-seed-abort" });
|
|
865
|
+
} catch (cleanupError) {
|
|
866
|
+
if (cleanupError instanceof CredentialResidueError) {
|
|
867
|
+
throw contextualizeCredentialCleanupError(
|
|
868
|
+
cleanupError,
|
|
869
|
+
error,
|
|
870
|
+
"opencode-xdg-config-seed-abort"
|
|
871
|
+
);
|
|
872
|
+
}
|
|
873
|
+
throw cleanupError;
|
|
874
|
+
}
|
|
875
|
+
throw error;
|
|
876
|
+
}
|
|
877
|
+
return {
|
|
878
|
+
configHome,
|
|
879
|
+
cleanup: async () => {
|
|
880
|
+
await removeAndVerifyRunOwnedRoot(owned, { role: "opencode-xdg-config" });
|
|
881
|
+
}
|
|
882
|
+
};
|
|
883
|
+
}
|
|
884
|
+
async function resolveOpencodeCacheHome(env) {
|
|
885
|
+
const caller = resolveCallerOwnedPath(
|
|
886
|
+
env?.XDG_CACHE_HOME,
|
|
887
|
+
readOpencodeRuntimeEnv(env, POETIC_OPENCODE_XDG_CACHE_HOME)
|
|
888
|
+
);
|
|
889
|
+
if (caller) return { cacheHome: caller.path };
|
|
890
|
+
const cacheHome = await mkPoeticTempDir("opencode-cache");
|
|
891
|
+
const owned = markRunOwnedRoot(cacheHome);
|
|
892
|
+
return {
|
|
893
|
+
cacheHome,
|
|
894
|
+
cleanup: async () => {
|
|
895
|
+
await removeAndVerifyRunOwnedRoot(owned, { role: "opencode-xdg-cache" });
|
|
896
|
+
}
|
|
897
|
+
};
|
|
898
|
+
}
|
|
899
|
+
async function hasOpenrouterCredential(childEnv, dataHome) {
|
|
900
|
+
if (childEnv.OPENROUTER_API_KEY?.trim() || childEnv.OPENROUTER_KEY?.trim()) {
|
|
901
|
+
return true;
|
|
902
|
+
}
|
|
903
|
+
try {
|
|
904
|
+
const authJson = await fs2.readFile(path2.join(dataHome, "opencode", "auth.json"), "utf8");
|
|
905
|
+
return /"openrouter"\s*:/.test(authJson);
|
|
906
|
+
} catch {
|
|
907
|
+
return false;
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
async function resolveOpencodeSessionFromDb(workingDir, dataHome) {
|
|
911
|
+
try {
|
|
912
|
+
const dbPath = path2.join(dataHome, "opencode", "opencode.db");
|
|
913
|
+
const { default: Database } = await import("better-sqlite3");
|
|
914
|
+
const db = new Database(dbPath, { readonly: true, fileMustExist: true });
|
|
915
|
+
try {
|
|
916
|
+
const session = db.prepare(
|
|
917
|
+
`
|
|
918
|
+
SELECT id
|
|
919
|
+
FROM session
|
|
920
|
+
WHERE directory = ?
|
|
921
|
+
ORDER BY time_updated DESC
|
|
922
|
+
LIMIT 1
|
|
923
|
+
`
|
|
924
|
+
).get(workingDir);
|
|
925
|
+
if (typeof session?.id !== "string") {
|
|
926
|
+
return {};
|
|
927
|
+
}
|
|
928
|
+
const modelRow = db.prepare(
|
|
929
|
+
`
|
|
930
|
+
SELECT
|
|
931
|
+
json_extract(data, '$.providerID') AS providerID,
|
|
932
|
+
json_extract(data, '$.modelID') AS modelID,
|
|
933
|
+
json_extract(data, '$.model') AS model
|
|
934
|
+
FROM message
|
|
935
|
+
WHERE session_id = ?
|
|
936
|
+
AND json_extract(data, '$.role') = 'assistant'
|
|
937
|
+
AND (
|
|
938
|
+
json_extract(data, '$.modelID') IS NOT NULL
|
|
939
|
+
OR json_extract(data, '$.model') IS NOT NULL
|
|
940
|
+
)
|
|
941
|
+
ORDER BY time_created DESC
|
|
942
|
+
LIMIT 1
|
|
943
|
+
`
|
|
944
|
+
).get(session.id);
|
|
945
|
+
return {
|
|
946
|
+
sessionId: session.id,
|
|
947
|
+
resolvedModel: formatResolvedOpencodeModel(modelRow?.providerID, modelRow?.modelID) ?? formatResolvedOpencodeModel(void 0, modelRow?.model)
|
|
948
|
+
};
|
|
949
|
+
} finally {
|
|
950
|
+
db.close();
|
|
951
|
+
}
|
|
952
|
+
} catch {
|
|
953
|
+
return {};
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
async function resolveAttachedFilePaths(workingDir, files, attachments) {
|
|
957
|
+
const candidates = [...files ?? [], ...attachments ?? []].map((entry) => entry.trim()).filter((entry) => entry.length > 0);
|
|
958
|
+
const deduped = /* @__PURE__ */ new Set();
|
|
959
|
+
const root = path2.resolve(workingDir);
|
|
960
|
+
for (const candidate of candidates) {
|
|
961
|
+
const resolved = path2.isAbsolute(candidate) ? candidate : path2.resolve(workingDir, candidate);
|
|
962
|
+
if (resolved !== root && !resolved.startsWith(root + path2.sep)) {
|
|
963
|
+
throw new Error(`OpenCode attachment must be within working directory: ${candidate}`);
|
|
964
|
+
}
|
|
965
|
+
try {
|
|
966
|
+
await fs2.access(resolved);
|
|
967
|
+
deduped.add(resolved);
|
|
968
|
+
} catch {
|
|
969
|
+
debugLog(`[OpenCode] Skipping missing attachment path: ${candidate}`);
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
return [...deduped];
|
|
973
|
+
}
|
|
974
|
+
async function writePromptAttachment(prompt) {
|
|
975
|
+
const dir = await mkPoeticTempDir("opencode-prompt");
|
|
976
|
+
const filePath = path2.join(dir, "prompt.md");
|
|
977
|
+
try {
|
|
978
|
+
await fs2.writeFile(filePath, prompt, "utf8");
|
|
979
|
+
} catch (error) {
|
|
980
|
+
await fs2.rm(dir, { recursive: true, force: true }).catch((cleanupError) => {
|
|
981
|
+
debugLog(
|
|
982
|
+
`[OpenCode] Failed to clean prompt attachment ${dir} after write failure: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`
|
|
983
|
+
);
|
|
984
|
+
});
|
|
985
|
+
throw error;
|
|
986
|
+
}
|
|
987
|
+
return {
|
|
988
|
+
filePath,
|
|
989
|
+
cleanup: async () => {
|
|
990
|
+
try {
|
|
991
|
+
await fs2.rm(dir, { recursive: true, force: true });
|
|
992
|
+
} catch (error) {
|
|
993
|
+
debugLog(
|
|
994
|
+
`[OpenCode] Failed to clean prompt attachment ${dir}: ${error instanceof Error ? error.message : String(error)}`
|
|
995
|
+
);
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
};
|
|
999
|
+
}
|
|
1000
|
+
async function clearMacProvenanceAttributes(filePaths) {
|
|
1001
|
+
if (process.platform !== "darwin" || filePaths.length === 0) {
|
|
1002
|
+
return;
|
|
1003
|
+
}
|
|
1004
|
+
try {
|
|
1005
|
+
const { execa } = await import("execa");
|
|
1006
|
+
for (const filePath of filePaths) {
|
|
1007
|
+
try {
|
|
1008
|
+
await execa("xattr", ["-d", "com.apple.provenance", filePath], {
|
|
1009
|
+
reject: false,
|
|
1010
|
+
timeout: 5e3
|
|
1011
|
+
});
|
|
1012
|
+
} catch (error) {
|
|
1013
|
+
debugLog(
|
|
1014
|
+
`[OpenCode] Failed to clear com.apple.provenance from ${filePath}: ${error instanceof Error ? error.message : String(error)}`
|
|
1015
|
+
);
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
} catch (error) {
|
|
1019
|
+
debugLog(
|
|
1020
|
+
`[OpenCode] Unable to prepare macOS provenance cleanup: ${error instanceof Error ? error.message : String(error)}`
|
|
1021
|
+
);
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
function attachOpencodeInvocationDiagnostics(error, diagnostics) {
|
|
1025
|
+
if (!error || typeof error !== "object") {
|
|
1026
|
+
return;
|
|
1027
|
+
}
|
|
1028
|
+
const diagnosticError = error;
|
|
1029
|
+
diagnosticError.commandPath ??= diagnostics.commandPath;
|
|
1030
|
+
diagnosticError.argvRedacted ??= diagnostics.argvRedacted;
|
|
1031
|
+
diagnosticError.stdoutTail ??= providerOutputTail(diagnostics.stdout ?? "");
|
|
1032
|
+
diagnosticError.stderrTail ??= providerOutputTail(diagnostics.stderr ?? "");
|
|
1033
|
+
diagnosticError.providerDiagnostics ??= diagnostics.providerDiagnostics;
|
|
1034
|
+
diagnosticError.filesModified ??= diagnostics.filesModified;
|
|
1035
|
+
}
|
|
1036
|
+
async function runOpencodeNative(options) {
|
|
1037
|
+
const {
|
|
1038
|
+
prompt,
|
|
1039
|
+
workingDir,
|
|
1040
|
+
env,
|
|
1041
|
+
onData,
|
|
1042
|
+
onErrorData,
|
|
1043
|
+
model,
|
|
1044
|
+
modelReasoningEffort,
|
|
1045
|
+
generationSettings,
|
|
1046
|
+
files,
|
|
1047
|
+
attachments,
|
|
1048
|
+
abortSignal,
|
|
1049
|
+
strategy,
|
|
1050
|
+
executionIntent
|
|
1051
|
+
} = options;
|
|
1052
|
+
const mockProvidersEnabled = env?.POETIC_MOCK_PROVIDERS === "1" || process.env.NODE_ENV !== "test" && readEnv(POETIC_MOCK_PROVIDERS).value === "1";
|
|
1053
|
+
if (mockProvidersEnabled) {
|
|
1054
|
+
if (process.env.NODE_ENV === "production" && !readEnv(POETIC_ALLOW_MOCK_PROVIDERS).value) {
|
|
1055
|
+
throw new Error(
|
|
1056
|
+
"POETIC_MOCK_PROVIDERS is enabled in production without explicit allow; aborting to prevent synthetic responses."
|
|
1057
|
+
);
|
|
1058
|
+
}
|
|
1059
|
+
emitTelemetryFallbackWarning(
|
|
1060
|
+
"POETIC_MOCK_PROVIDERS enabled for OpenCode; responses are synthetic"
|
|
1061
|
+
);
|
|
1062
|
+
return runMockNative({
|
|
1063
|
+
...options,
|
|
1064
|
+
provider: metadata.id
|
|
1065
|
+
});
|
|
1066
|
+
}
|
|
1067
|
+
await acquireRateLimitToken(metadata.id, model);
|
|
1068
|
+
const baselineHead = await getGitHead(workingDir);
|
|
1069
|
+
const baselineStatusPaths = await getGitStatusPaths(workingDir).catch(() => /* @__PURE__ */ new Set());
|
|
1070
|
+
const timeout = resolveProviderTimeoutMs(metadata.id, options.timeout);
|
|
1071
|
+
const { command, prefixArgs } = resolveProviderCliCommand(metadata.id);
|
|
1072
|
+
const runtimeQuirks = getProviderRuntimeQuirks(metadata.id);
|
|
1073
|
+
try {
|
|
1074
|
+
await ensureOpencodeWarm({ command, prefixArgs, workingDir });
|
|
1075
|
+
} catch (error) {
|
|
1076
|
+
debugLog(
|
|
1077
|
+
`[OpenCode] Warmup failed; continuing without warmup: ${error instanceof Error ? error.message : String(error)}`
|
|
1078
|
+
);
|
|
1079
|
+
}
|
|
1080
|
+
const capabilities = await getOpencodeRunCapabilities(env);
|
|
1081
|
+
const capabilityWarnings = [];
|
|
1082
|
+
let effectiveModel = model;
|
|
1083
|
+
if (model && options.modelExecutionPolicy !== "exact") {
|
|
1084
|
+
const cachedModels = getCachedOpencodeModelIds();
|
|
1085
|
+
const canonicalizedModel = canonicalizeOpencodeModelId(model, cachedModels);
|
|
1086
|
+
effectiveModel = canonicalizedModel;
|
|
1087
|
+
if (cachedModels.length > 0 && !cachedModels.includes(canonicalizedModel)) {
|
|
1088
|
+
const suggestion = `openrouter/${model}`;
|
|
1089
|
+
const suggestionHint = model.split("/").length === 2 && cachedModels.includes(suggestion) ? ` Did you mean "${suggestion}"?` : "";
|
|
1090
|
+
const warning = `[OpenCode] Model "${model}" not found in cached model list.${suggestionHint}`;
|
|
1091
|
+
capabilityWarnings.push(warning);
|
|
1092
|
+
debugLog(warning);
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
const requestedWorkspaceMode = options.workspaceMode ?? options.promptMode;
|
|
1096
|
+
const adaptation = adaptPromptForOpencode(prompt, {
|
|
1097
|
+
executionIntent: executionIntent ?? "mixed",
|
|
1098
|
+
files,
|
|
1099
|
+
strategy,
|
|
1100
|
+
promptMode: requestedWorkspaceMode,
|
|
1101
|
+
projectRoot: workingDir
|
|
1102
|
+
});
|
|
1103
|
+
let adaptedPrompt = adaptation.adapted;
|
|
1104
|
+
debugLog(formatAdaptations(adaptation));
|
|
1105
|
+
const transientAgentEnabled = isOpencodeRuntimeEnvEnabled(env, POETIC_OPENCODE_TRANSIENT_AGENT);
|
|
1106
|
+
const shouldApplyOpencodeSteering = adaptation.promptMode !== "passthrough" || transientAgentEnabled && capabilities.supportsAgent;
|
|
1107
|
+
const opencodeSteeringPayload = shouldApplyOpencodeSteering ? buildOpencodeSteering({
|
|
1108
|
+
guidance: {
|
|
1109
|
+
strategy,
|
|
1110
|
+
recentContext: options.recentContext,
|
|
1111
|
+
subagents: Boolean(options.delegatedSubagents)
|
|
1112
|
+
}
|
|
1113
|
+
}) : void 0;
|
|
1114
|
+
let steeringAgentName;
|
|
1115
|
+
let steeringConfigContent;
|
|
1116
|
+
if (opencodeSteeringPayload && capabilities.supportsAgent && transientAgentEnabled) {
|
|
1117
|
+
try {
|
|
1118
|
+
const plan = planOpencodeTransientAgent(opencodeSteeringPayload);
|
|
1119
|
+
if (plan) {
|
|
1120
|
+
steeringAgentName = plan.agentName;
|
|
1121
|
+
steeringConfigContent = plan.configContent;
|
|
1122
|
+
}
|
|
1123
|
+
} catch (error) {
|
|
1124
|
+
debugLog(
|
|
1125
|
+
`[OpenCode] Transient steering-agent planning failed; preamble fallback is used only outside passthrough mode. Error: ${error instanceof Error ? error.message : String(error)}`
|
|
1126
|
+
);
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
if (opencodeSteeringPayload && !steeringAgentName && adaptation.promptMode !== "passthrough") {
|
|
1130
|
+
adaptedPrompt = applyOpencodePreambleFallback(opencodeSteeringPayload, adaptedPrompt);
|
|
1131
|
+
}
|
|
1132
|
+
const explicitEffort = normalizeOpencodeReasoningEffort(modelReasoningEffort) ?? normalizeOpencodeReasoningEffort(generationSettings?.reasoningEffort);
|
|
1133
|
+
const effectiveVariant = explicitEffort ? mapReasoningEffortToOpencodeVariant(explicitEffort) : resolveTaskAwareVariant(prompt);
|
|
1134
|
+
const attachedFiles = await resolveAttachedFilePaths(workingDir, files, attachments);
|
|
1135
|
+
await clearMacProvenanceAttributes(attachedFiles);
|
|
1136
|
+
requireActiveSandboxBoundary(
|
|
1137
|
+
"OpenCode",
|
|
1138
|
+
"OpenCode automation bypass (OPENCODE_PERMISSION allow-all)",
|
|
1139
|
+
"opencode"
|
|
1140
|
+
);
|
|
1141
|
+
let opencodeDataHome;
|
|
1142
|
+
let opencodeStateHome;
|
|
1143
|
+
let opencodeConfigHome;
|
|
1144
|
+
let opencodeCacheHome;
|
|
1145
|
+
let promptAttachmentCleanup;
|
|
1146
|
+
let runError;
|
|
1147
|
+
try {
|
|
1148
|
+
opencodeDataHome = await resolveOpencodeDataHome(env);
|
|
1149
|
+
opencodeStateHome = await resolveOpencodeStateHome(env);
|
|
1150
|
+
opencodeConfigHome = await resolveOpencodeConfigHome(env);
|
|
1151
|
+
opencodeCacheHome = await resolveOpencodeCacheHome(env);
|
|
1152
|
+
debugLog(
|
|
1153
|
+
`[OpenCode] Runtime directories: TMPDIR=${env?.TMPDIR ?? process.env.TMPDIR ?? tmpdir()} XDG_STATE_HOME=${opencodeStateHome.stateHome}`
|
|
1154
|
+
);
|
|
1155
|
+
const headlessEnv = {
|
|
1156
|
+
OPENCODE_PERMISSION: JSON.stringify({ "*": { "*": "allow" } }),
|
|
1157
|
+
XDG_CACHE_HOME: opencodeCacheHome.cacheHome,
|
|
1158
|
+
XDG_CONFIG_HOME: opencodeConfigHome.configHome,
|
|
1159
|
+
XDG_DATA_HOME: opencodeDataHome.dataHome,
|
|
1160
|
+
XDG_STATE_HOME: opencodeStateHome.stateHome
|
|
1161
|
+
};
|
|
1162
|
+
if (steeringConfigContent) {
|
|
1163
|
+
headlessEnv.OPENCODE_CONFIG_CONTENT = steeringConfigContent;
|
|
1164
|
+
}
|
|
1165
|
+
const childEnv = buildProviderExecutionEnv("opencode", { ...env ?? {}, ...headlessEnv });
|
|
1166
|
+
const opencodeLogCheckpoint = await captureOpencodeLogCheckpoint(opencodeDataHome.dataHome);
|
|
1167
|
+
const opencodeWorkspaceStateDir = path2.join(workingDir, ".opencode");
|
|
1168
|
+
const opencodeRuntimeWritePaths = [
|
|
1169
|
+
opencodeCacheHome.cacheHome,
|
|
1170
|
+
opencodeConfigHome.configHome,
|
|
1171
|
+
opencodeDataHome.dataHome,
|
|
1172
|
+
opencodeStateHome.stateHome,
|
|
1173
|
+
opencodeWorkspaceStateDir
|
|
1174
|
+
];
|
|
1175
|
+
requireActivePolicyBoundary(
|
|
1176
|
+
"OpenCode",
|
|
1177
|
+
"OpenCode automation bypass (OPENCODE_PERMISSION allow-all)",
|
|
1178
|
+
"opencode",
|
|
1179
|
+
{ env: childEnv }
|
|
1180
|
+
);
|
|
1181
|
+
if (effectiveModel?.toLowerCase().startsWith("openrouter/") && !await hasOpenrouterCredential(childEnv, opencodeDataHome.dataHome)) {
|
|
1182
|
+
const stderr = "OpenCode OpenRouter credentials missing. Set OPENROUTER_API_KEY or run `opencode auth login` before using OpenRouter models.";
|
|
1183
|
+
return {
|
|
1184
|
+
stdout: "",
|
|
1185
|
+
stderr,
|
|
1186
|
+
exitCode: 1,
|
|
1187
|
+
commandPath: command,
|
|
1188
|
+
argvRedacted: redactProviderArgv([...prefixArgs, "run"]),
|
|
1189
|
+
stdoutTail: "",
|
|
1190
|
+
stderrTail: providerOutputTail(stderr),
|
|
1191
|
+
workspaceMode: options.workspaceMode ?? options.promptMode,
|
|
1192
|
+
workspaceModeRequested: options.workspaceMode ?? options.promptMode,
|
|
1193
|
+
promptMode: options.workspaceMode ?? options.promptMode,
|
|
1194
|
+
promptModeRequested: options.workspaceMode ?? options.promptMode
|
|
1195
|
+
};
|
|
1196
|
+
}
|
|
1197
|
+
const args = [...prefixArgs, "run"];
|
|
1198
|
+
if (capabilities.supportsPure) {
|
|
1199
|
+
args.push("--pure");
|
|
1200
|
+
}
|
|
1201
|
+
if (capabilities.supportsDir) {
|
|
1202
|
+
args.push("--dir", workingDir);
|
|
1203
|
+
}
|
|
1204
|
+
if (steeringAgentName) {
|
|
1205
|
+
args.push("--agent", steeringAgentName);
|
|
1206
|
+
}
|
|
1207
|
+
if (capabilities.supportsFormatJson) {
|
|
1208
|
+
args.push("--format", "json");
|
|
1209
|
+
}
|
|
1210
|
+
if (capabilities.supportsTitle) {
|
|
1211
|
+
args.push("--title", `Poetic (${metadata.id}) - ${path2.basename(workingDir)}`);
|
|
1212
|
+
}
|
|
1213
|
+
if (capabilities.supportsDangerouslySkipPermissions) {
|
|
1214
|
+
args.push("--dangerously-skip-permissions");
|
|
1215
|
+
}
|
|
1216
|
+
if (effectiveModel && effectiveModel !== "auto") {
|
|
1217
|
+
args.push("--model", effectiveModel);
|
|
1218
|
+
}
|
|
1219
|
+
if (effectiveVariant) {
|
|
1220
|
+
if (capabilities.supportsVariant) {
|
|
1221
|
+
args.push("--variant", effectiveVariant);
|
|
1222
|
+
} else if (isDebugMode()) {
|
|
1223
|
+
const warning = `[OpenCode] Variant "${effectiveVariant}" requested but this CLI version does not support --variant.`;
|
|
1224
|
+
capabilityWarnings.push(warning);
|
|
1225
|
+
debugLog(warning);
|
|
1226
|
+
} else {
|
|
1227
|
+
capabilityWarnings.push(
|
|
1228
|
+
`[OpenCode] Variant "${effectiveVariant}" requested but this CLI version does not support --variant.`
|
|
1229
|
+
);
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
if (attachedFiles.length > 0) {
|
|
1233
|
+
if (capabilities.supportsFile) {
|
|
1234
|
+
for (const filePath of attachedFiles) {
|
|
1235
|
+
args.push("--file", filePath);
|
|
1236
|
+
}
|
|
1237
|
+
} else if (isDebugMode()) {
|
|
1238
|
+
debugLog(
|
|
1239
|
+
`[OpenCode] ${attachedFiles.length} attachment(s) were provided but this CLI version does not support --file.`
|
|
1240
|
+
);
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
if (capabilities.supportsFile) {
|
|
1244
|
+
const promptAttachment = await writePromptAttachment(adaptedPrompt);
|
|
1245
|
+
promptAttachmentCleanup = promptAttachment.cleanup;
|
|
1246
|
+
args.push("--file", promptAttachment.filePath);
|
|
1247
|
+
args.push("--");
|
|
1248
|
+
args.push("Read the attached prompt file and complete the task exactly as specified.");
|
|
1249
|
+
} else {
|
|
1250
|
+
args.push("--");
|
|
1251
|
+
args.push(adaptedPrompt);
|
|
1252
|
+
}
|
|
1253
|
+
const fastRetry = process.env.NODE_ENV === "test" || process.env.VITEST === "true" || readEnv(POETIC_TEST_FAST_RETRY).value;
|
|
1254
|
+
const callerRetryBudget = options.retryBudget;
|
|
1255
|
+
const retryBudget = callerRetryBudget ?? new RetryBudget({ maxTotalAttempts: 3 });
|
|
1256
|
+
const callerConstrainedToOneAttempt = callerRetryBudget !== void 0 && callerRetryBudget.remaining <= 1;
|
|
1257
|
+
const maxAttempts = callerConstrainedToOneAttempt ? 1 : 3;
|
|
1258
|
+
const outerRetryBudget = callerConstrainedToOneAttempt ? void 0 : retryBudget;
|
|
1259
|
+
const bootstrapRetryBudget = callerConstrainedToOneAttempt ? callerRetryBudget : void 0;
|
|
1260
|
+
const bootstrapMaxAttempts = callerConstrainedToOneAttempt ? 1 : 3;
|
|
1261
|
+
const invocationTimeRequestSentMs = Date.now();
|
|
1262
|
+
let invocationTimeFirstTokenMs = null;
|
|
1263
|
+
const opencodeLivenessStartedAtMs = invocationTimeRequestSentMs;
|
|
1264
|
+
const opencodeLivenessPhasesMs = {
|
|
1265
|
+
// Anchor phase for downstream relative timings; not a measured launch duration.
|
|
1266
|
+
cliLaunch: 0
|
|
1267
|
+
};
|
|
1268
|
+
const argvRedacted = redactProviderArgv(args, { promptValues: [adaptedPrompt] });
|
|
1269
|
+
let retryResult;
|
|
1270
|
+
try {
|
|
1271
|
+
retryResult = await executeWithResilience(
|
|
1272
|
+
async () => {
|
|
1273
|
+
const bootstrapAttemptStartState = await captureRetryWorktreeState(workingDir);
|
|
1274
|
+
const attemptStartState = await captureWorkspaceRetryState(workingDir);
|
|
1275
|
+
try {
|
|
1276
|
+
return await executeOpencodeCommandWithBootstrapRetry({
|
|
1277
|
+
command,
|
|
1278
|
+
args,
|
|
1279
|
+
workingDir,
|
|
1280
|
+
// Fall back to a sanitized inherited env when the caller did not
|
|
1281
|
+
// supply one, so PATH/HOME/auth-related vars reach the subprocess.
|
|
1282
|
+
env: childEnv,
|
|
1283
|
+
timeout: resolveOpencodeAttemptTimeoutMs(timeout, options.deadlineMs),
|
|
1284
|
+
deadlineMs: options.deadlineMs,
|
|
1285
|
+
extraWritePaths: opencodeRuntimeWritePaths,
|
|
1286
|
+
readOnlyWorkingDir: options.readOnlyWorkingDir,
|
|
1287
|
+
// OPENCODE_PERMISSION disables the provider's tool-approval layer
|
|
1288
|
+
// even when capability discovery omits the equivalent argv flag.
|
|
1289
|
+
// Carry that fact to the final post-wrap proof-pair guard.
|
|
1290
|
+
providerInternalSandboxBypass: "OPENCODE_PERMISSION allow-all",
|
|
1291
|
+
executionIntent: options.executionIntent,
|
|
1292
|
+
executionTransport: options.executionTransport,
|
|
1293
|
+
idleWarnMs: resolveOpencodeIdleTimeout(
|
|
1294
|
+
options.idleWarnMs,
|
|
1295
|
+
runtimeQuirks?.idleDefaults?.idleWarnMs,
|
|
1296
|
+
options.allowIdleTimeoutAboveProviderDefault
|
|
1297
|
+
),
|
|
1298
|
+
idleKillMs: resolveOpencodeIdleTimeout(
|
|
1299
|
+
options.idleKillMs,
|
|
1300
|
+
runtimeQuirks?.idleDefaults?.idleKillMs,
|
|
1301
|
+
options.allowIdleTimeoutAboveProviderDefault
|
|
1302
|
+
),
|
|
1303
|
+
onData,
|
|
1304
|
+
onErrorData,
|
|
1305
|
+
onStdoutChunk: options.onStdoutChunk,
|
|
1306
|
+
onStderrChunk: options.onStderrChunk,
|
|
1307
|
+
onActivity: options.onActivity,
|
|
1308
|
+
onFirstOutput: () => {
|
|
1309
|
+
if (!invocationTimeFirstTokenMs) {
|
|
1310
|
+
invocationTimeFirstTokenMs = Date.now();
|
|
1311
|
+
opencodeLivenessPhasesMs.firstOutput = invocationTimeFirstTokenMs - opencodeLivenessStartedAtMs;
|
|
1312
|
+
}
|
|
1313
|
+
},
|
|
1314
|
+
abortSignal,
|
|
1315
|
+
operation: "run",
|
|
1316
|
+
// Thread caller budgets into bootstrap so BunInstall recovery cannot
|
|
1317
|
+
// outrun the invoke one-attempt contract. Omitted for ordinary runs.
|
|
1318
|
+
...bootstrapRetryBudget ? { retryBudget: bootstrapRetryBudget } : {},
|
|
1319
|
+
maxAttempts: bootstrapMaxAttempts,
|
|
1320
|
+
beforeRetryAttempt: (error) => rejectUnsafeFullPromptRetry({
|
|
1321
|
+
workingDir,
|
|
1322
|
+
attemptStartState: bootstrapAttemptStartState,
|
|
1323
|
+
error,
|
|
1324
|
+
providerName: metadata.id,
|
|
1325
|
+
requireCleanState: true
|
|
1326
|
+
}),
|
|
1327
|
+
metadata: {
|
|
1328
|
+
id: metadata.id,
|
|
1329
|
+
name: metadata.name,
|
|
1330
|
+
installCommand: metadata.installCommand,
|
|
1331
|
+
authHint: metadata.authHint,
|
|
1332
|
+
docsPath: metadata.docsPath,
|
|
1333
|
+
docsAnchor: metadata.docsAnchor
|
|
1334
|
+
}
|
|
1335
|
+
});
|
|
1336
|
+
} catch (error) {
|
|
1337
|
+
await assertWorkspaceRetryIsSafe({
|
|
1338
|
+
providerId: metadata.id,
|
|
1339
|
+
providerName: metadata.name,
|
|
1340
|
+
workingDir,
|
|
1341
|
+
attemptStartState,
|
|
1342
|
+
originalError: error,
|
|
1343
|
+
retryable: parseOpencodeError(error, {
|
|
1344
|
+
requestedModel: effectiveModel ?? model,
|
|
1345
|
+
cliVersion: capabilities.cliVersion,
|
|
1346
|
+
inventoryModelIds: getCachedOpencodeModelIds(),
|
|
1347
|
+
inventoryAgeMs: getOpencodeModelsCacheInfo().ageMs
|
|
1348
|
+
}).retryable
|
|
1349
|
+
});
|
|
1350
|
+
throw error;
|
|
1351
|
+
}
|
|
1352
|
+
},
|
|
1353
|
+
{
|
|
1354
|
+
providerName: metadata.id,
|
|
1355
|
+
providerId: metadata.id,
|
|
1356
|
+
operation: "run",
|
|
1357
|
+
maxAttempts,
|
|
1358
|
+
abortSignal,
|
|
1359
|
+
fastRetryMode: fastRetry,
|
|
1360
|
+
retryBudget: outerRetryBudget,
|
|
1361
|
+
errorParser: (error) => parseOpencodeError(error, {
|
|
1362
|
+
requestedModel: effectiveModel ?? model,
|
|
1363
|
+
cliVersion: capabilities.cliVersion,
|
|
1364
|
+
inventoryModelIds: getCachedOpencodeModelIds(),
|
|
1365
|
+
inventoryAgeMs: getOpencodeModelsCacheInfo().ageMs
|
|
1366
|
+
}),
|
|
1367
|
+
circuitBreakerOptions: OPENCODE_CIRCUIT_BREAKER_OPTIONS,
|
|
1368
|
+
circuitBreakerScope: options.circuitBreakerScope,
|
|
1369
|
+
deadlineMs: options.deadlineMs ?? Date.now() + timeout,
|
|
1370
|
+
minimumAttemptTimeMs: Math.min(timeout, 3e4),
|
|
1371
|
+
retryWorktreeDir: workingDir
|
|
1372
|
+
}
|
|
1373
|
+
);
|
|
1374
|
+
} catch (error) {
|
|
1375
|
+
const exitCode = typeof error?.exitCode === "number" ? error.exitCode ?? null : null;
|
|
1376
|
+
const stdout = typeof error?.stdout === "string" ? error.stdout : void 0;
|
|
1377
|
+
const stderr = typeof error?.stderr === "string" ? error.stderr : void 0;
|
|
1378
|
+
const logErrors = await readOpencodeLogErrorsSince(opencodeLogCheckpoint);
|
|
1379
|
+
const partialFilesModified = await detectGitChangedFiles(workingDir, {
|
|
1380
|
+
baselineHead,
|
|
1381
|
+
baselineStatusPaths
|
|
1382
|
+
}).catch(() => void 0);
|
|
1383
|
+
attachOpencodeInvocationDiagnostics(error, {
|
|
1384
|
+
commandPath: command,
|
|
1385
|
+
argvRedacted,
|
|
1386
|
+
stdout,
|
|
1387
|
+
stderr,
|
|
1388
|
+
...logErrors.length > 0 ? {
|
|
1389
|
+
providerDiagnostics: {
|
|
1390
|
+
transportErrors: logErrors,
|
|
1391
|
+
stderrSeverity: "error"
|
|
1392
|
+
}
|
|
1393
|
+
} : {},
|
|
1394
|
+
...partialFilesModified?.length ? { filesModified: partialFilesModified } : {}
|
|
1395
|
+
});
|
|
1396
|
+
await recordInvocationTiming({
|
|
1397
|
+
providerId: metadata.id,
|
|
1398
|
+
modelId: model ?? "auto",
|
|
1399
|
+
timeRequestSentMs: invocationTimeRequestSentMs,
|
|
1400
|
+
timeFirstTokenMs: invocationTimeFirstTokenMs,
|
|
1401
|
+
timeLastTokenMs: Date.now(),
|
|
1402
|
+
status: "error",
|
|
1403
|
+
errorCode: exitCode !== null ? `EXIT_${exitCode}` : "UNKNOWN",
|
|
1404
|
+
env
|
|
1405
|
+
});
|
|
1406
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
1407
|
+
const isHardFailure = errMsg.includes("auth") || errMsg.includes("unauthorized") || errMsg.includes("not_found") || errMsg.includes("aborted");
|
|
1408
|
+
recordProviderRunFailure("opencode", {
|
|
1409
|
+
severity: isHardFailure ? "hard" : "normal",
|
|
1410
|
+
phase: inferProviderFailurePhase({
|
|
1411
|
+
error,
|
|
1412
|
+
exitCode
|
|
1413
|
+
})
|
|
1414
|
+
});
|
|
1415
|
+
throw error;
|
|
1416
|
+
}
|
|
1417
|
+
const result = retryResult.result;
|
|
1418
|
+
const {
|
|
1419
|
+
text: parsedText,
|
|
1420
|
+
tokenUsage,
|
|
1421
|
+
totalCostUsd,
|
|
1422
|
+
resolvedModel,
|
|
1423
|
+
agentUsed,
|
|
1424
|
+
subAgentInvocations,
|
|
1425
|
+
subAgentTypes,
|
|
1426
|
+
structuredEventCount,
|
|
1427
|
+
errorEvents
|
|
1428
|
+
} = parseOpencodeProviderOutput(result.stdout, result.stderr);
|
|
1429
|
+
const opencodeSession = await resolveOpencodeSessionFromDb(
|
|
1430
|
+
workingDir,
|
|
1431
|
+
opencodeDataHome.dataHome
|
|
1432
|
+
);
|
|
1433
|
+
const effectiveResolvedModel = resolvedModel ?? opencodeSession.resolvedModel;
|
|
1434
|
+
const opencodeLogErrors = await readOpencodeLogErrorsSince(opencodeLogCheckpoint);
|
|
1435
|
+
let filesModified;
|
|
1436
|
+
try {
|
|
1437
|
+
filesModified = await detectGitChangedFiles(workingDir, {
|
|
1438
|
+
baselineHead,
|
|
1439
|
+
baselineStatusPaths
|
|
1440
|
+
});
|
|
1441
|
+
} catch {
|
|
1442
|
+
}
|
|
1443
|
+
const rawStdoutNonEmpty = result.stdout.trim().length > 0;
|
|
1444
|
+
const usefulRawOutput = extractUsefulOpencodeRawOutput(result.stdout, result.stderr);
|
|
1445
|
+
const reportedToolFailure = hasOpencodeReportedToolFailure(usefulRawOutput);
|
|
1446
|
+
const reportedProviderError = (errorEvents?.length ?? 0) > 0;
|
|
1447
|
+
const reportedContextLengthExhaustion = errorEvents?.some((event) => event.errorType === "length") === true;
|
|
1448
|
+
const hasMeaningfulDelivery = parsedText.trim().length > 0 || (filesModified?.length ?? 0) > 0;
|
|
1449
|
+
if (hasMeaningfulDelivery && opencodeLivenessPhasesMs.firstUsefulAction === void 0) {
|
|
1450
|
+
opencodeLivenessPhasesMs.firstUsefulAction = Date.now() - opencodeLivenessStartedAtMs;
|
|
1451
|
+
}
|
|
1452
|
+
const noContentSuccess = result.exitCode === 0 && parsedText.trim().length === 0 && usefulRawOutput.length === 0 && (filesModified?.length ?? 0) === 0;
|
|
1453
|
+
const effectiveExitCode = noContentSuccess || reportedToolFailure || reportedContextLengthExhaustion || reportedProviderError && !hasMeaningfulDelivery ? 1 : result.exitCode;
|
|
1454
|
+
const emptySuccessMessage = "OpenCode exited 0 but produced no assistant output and no file changes.";
|
|
1455
|
+
const reportedToolFailureMessage = "OpenCode exited 0 but reported a failed internal tool operation.";
|
|
1456
|
+
const reportedProviderErrorMessage = reportedProviderError ? summarizeOpencodeErrorEvents(errorEvents ?? []) : void 0;
|
|
1457
|
+
await recordInvocationTiming({
|
|
1458
|
+
providerId: metadata.id,
|
|
1459
|
+
modelId: effectiveResolvedModel ?? model ?? "auto",
|
|
1460
|
+
timeRequestSentMs: invocationTimeRequestSentMs,
|
|
1461
|
+
timeFirstTokenMs: invocationTimeFirstTokenMs,
|
|
1462
|
+
timeLastTokenMs: Date.now(),
|
|
1463
|
+
tokensIn: tokenUsage?.inputTokens,
|
|
1464
|
+
tokensOut: tokenUsage?.outputTokens,
|
|
1465
|
+
status: effectiveExitCode === 0 ? "success" : "error",
|
|
1466
|
+
errorCode: effectiveExitCode !== 0 ? `EXIT_${effectiveExitCode}` : null,
|
|
1467
|
+
env
|
|
1468
|
+
});
|
|
1469
|
+
if (effectiveExitCode !== 0 && rawStdoutNonEmpty && structuredEventCount === 0 && (filesModified?.length ?? 0) === 0) {
|
|
1470
|
+
reportOutputDrift({
|
|
1471
|
+
provider: "opencode",
|
|
1472
|
+
severity: "parse_fallback",
|
|
1473
|
+
field: "jsonlParse",
|
|
1474
|
+
detail: "stdout was non-empty but JSONL extraction produced no events and no edits",
|
|
1475
|
+
outputShapeTag: "no-jsonl-events-no-edits"
|
|
1476
|
+
});
|
|
1477
|
+
}
|
|
1478
|
+
if (effectiveExitCode === 0) {
|
|
1479
|
+
recordProviderRunSuccess("opencode");
|
|
1480
|
+
} else {
|
|
1481
|
+
recordProviderRunFailure("opencode", {
|
|
1482
|
+
severity: "normal",
|
|
1483
|
+
phase: inferProviderFailurePhase({
|
|
1484
|
+
exitCode: effectiveExitCode,
|
|
1485
|
+
stderr: result.stderr,
|
|
1486
|
+
stdout: result.stdout,
|
|
1487
|
+
filesModifiedCount: filesModified?.length ?? 0,
|
|
1488
|
+
producedOutput: Boolean((parsedText || usefulRawOutput).trim().length)
|
|
1489
|
+
})
|
|
1490
|
+
});
|
|
1491
|
+
}
|
|
1492
|
+
const appliedWorkspaceMode = adaptation.promptMode;
|
|
1493
|
+
opencodeLivenessPhasesMs.finalResponse = Date.now() - opencodeLivenessStartedAtMs;
|
|
1494
|
+
const baseStderr = noContentSuccess || reportedToolFailure || reportedProviderError ? [
|
|
1495
|
+
result.stderr.trim(),
|
|
1496
|
+
noContentSuccess ? emptySuccessMessage : void 0,
|
|
1497
|
+
reportedToolFailure ? reportedToolFailureMessage : void 0,
|
|
1498
|
+
reportedProviderErrorMessage
|
|
1499
|
+
].filter(Boolean).join("\n") : result.stderr;
|
|
1500
|
+
const finalStderr = [capabilityWarnings.join("\n"), baseStderr.trim()].filter(Boolean).join("\n");
|
|
1501
|
+
const finalResult = {
|
|
1502
|
+
stdout: parsedText || usefulRawOutput || result.stdout,
|
|
1503
|
+
stderr: finalStderr,
|
|
1504
|
+
exitCode: effectiveExitCode,
|
|
1505
|
+
commandPath: command,
|
|
1506
|
+
argvRedacted,
|
|
1507
|
+
stdoutTail: providerOutputTail(result.stdout),
|
|
1508
|
+
stderrTail: providerOutputTail(finalStderr),
|
|
1509
|
+
providerDiagnostics: {
|
|
1510
|
+
finalAnswerPresent: Boolean(parsedText.trim().length || usefulRawOutput.trim().length),
|
|
1511
|
+
...reportedToolFailure ? { toolErrors: [reportedToolFailureMessage] } : {},
|
|
1512
|
+
...reportedProviderError && reportedProviderErrorMessage ? { transportErrors: [reportedProviderErrorMessage] } : opencodeLogErrors.length > 0 && effectiveExitCode !== 0 ? { transportErrors: opencodeLogErrors } : {},
|
|
1513
|
+
...opencodeLogErrors.length > 0 && effectiveExitCode === 0 ? { retryErrors: opencodeLogErrors } : {},
|
|
1514
|
+
stderrSeverity: reportedToolFailure || reportedProviderError || noContentSuccess ? "error" : capabilityWarnings.length > 0 || opencodeLogErrors.length > 0 ? "warning" : "none"
|
|
1515
|
+
},
|
|
1516
|
+
providerLivenessPhasesMs: opencodeLivenessPhasesMs,
|
|
1517
|
+
...capabilities.cliVersion ? { providerCliVersion: capabilities.cliVersion } : {},
|
|
1518
|
+
sessionId: opencodeSession.sessionId,
|
|
1519
|
+
workspaceMode: appliedWorkspaceMode,
|
|
1520
|
+
workspaceModeRequested: requestedWorkspaceMode,
|
|
1521
|
+
// Backwards compatibility
|
|
1522
|
+
promptMode: appliedWorkspaceMode,
|
|
1523
|
+
promptModeRequested: requestedWorkspaceMode,
|
|
1524
|
+
completionSignalVariant: adaptation.completionSignalVariant,
|
|
1525
|
+
tokenUsage,
|
|
1526
|
+
totalCostUsd,
|
|
1527
|
+
filesModified,
|
|
1528
|
+
// Actual model chosen by OpenCode at runtime (only set when extracted from JSONL
|
|
1529
|
+
// output). When model='auto', the CLI selects its own default and this captures
|
|
1530
|
+
// what it actually used, allowing downstream telemetry to record the real model
|
|
1531
|
+
// instead of the placeholder 'auto'.
|
|
1532
|
+
...effectiveResolvedModel ? { resolvedModel: effectiveResolvedModel } : {},
|
|
1533
|
+
agentUsed,
|
|
1534
|
+
subAgentInvocations,
|
|
1535
|
+
subAgentTypes
|
|
1536
|
+
};
|
|
1537
|
+
return finalResult;
|
|
1538
|
+
} catch (error) {
|
|
1539
|
+
runError = error;
|
|
1540
|
+
throw error;
|
|
1541
|
+
} finally {
|
|
1542
|
+
const cleanupResults = await Promise.allSettled([
|
|
1543
|
+
promptAttachmentCleanup?.(),
|
|
1544
|
+
opencodeDataHome?.cleanup?.(),
|
|
1545
|
+
opencodeStateHome?.cleanup?.(),
|
|
1546
|
+
opencodeConfigHome?.cleanup?.(),
|
|
1547
|
+
opencodeCacheHome?.cleanup?.()
|
|
1548
|
+
]);
|
|
1549
|
+
const cleanupErrors = cleanupResults.filter((result) => result.status === "rejected").map((result) => result.reason);
|
|
1550
|
+
const residueErrors = cleanupErrors.filter(
|
|
1551
|
+
(error) => error instanceof CredentialResidueError
|
|
1552
|
+
);
|
|
1553
|
+
if (residueErrors.length > 0) {
|
|
1554
|
+
throw aggregateCredentialResidueErrors(residueErrors, {
|
|
1555
|
+
ownership: "run-owned",
|
|
1556
|
+
role: "opencode-runtime-cleanup",
|
|
1557
|
+
...runError !== void 0 ? { primaryError: runError } : {}
|
|
1558
|
+
});
|
|
1559
|
+
}
|
|
1560
|
+
if (cleanupErrors.length > 0) {
|
|
1561
|
+
const cleanupError = cleanupErrors[0];
|
|
1562
|
+
throw cleanupError;
|
|
1563
|
+
}
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1566
|
+
export {
|
|
1567
|
+
runOpencodeNative,
|
|
1568
|
+
seedOpencodeCredentials,
|
|
1569
|
+
seedOpencodeUserConfig
|
|
1570
|
+
};
|
|
1571
|
+
//# sourceMappingURL=runner-HHH7ZN2Z.js.map
|