@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,1374 @@
|
|
|
1
|
+
import {
|
|
2
|
+
redactSensitiveConfig
|
|
3
|
+
} from "./chunk-3M57DADF.js";
|
|
4
|
+
import {
|
|
5
|
+
autoFixConfig,
|
|
6
|
+
isFirstTimeDefaultsInitialized,
|
|
7
|
+
validatePoeticConfig
|
|
8
|
+
} from "./chunk-CUSRN6RJ.js";
|
|
9
|
+
import {
|
|
10
|
+
resolveConfig
|
|
11
|
+
} from "./chunk-XPU2XADL.js";
|
|
12
|
+
import {
|
|
13
|
+
getActiveProfilePath,
|
|
14
|
+
loadAllConfigSources,
|
|
15
|
+
loadProjectConfig,
|
|
16
|
+
mutateUserState,
|
|
17
|
+
normalizeLegacyIntoCanonical,
|
|
18
|
+
normalizeMergedConfigTree,
|
|
19
|
+
readUserState
|
|
20
|
+
} from "./chunk-SZ7DL357.js";
|
|
21
|
+
import {
|
|
22
|
+
atomicWrite
|
|
23
|
+
} from "./chunk-J6P3FWWW.js";
|
|
24
|
+
import {
|
|
25
|
+
DEFAULT_CONFIG,
|
|
26
|
+
DEFAULT_USER_PREFERENCES,
|
|
27
|
+
KNOWN_POETIC_CONFIG_ROOTS,
|
|
28
|
+
PoeticConfigSchema,
|
|
29
|
+
UserPreferencesSchema,
|
|
30
|
+
isPoeticConfigReadError,
|
|
31
|
+
poeticConfigCandidates
|
|
32
|
+
} from "./chunk-G36W2T2S.js";
|
|
33
|
+
import {
|
|
34
|
+
InvalidExplicitConfigError,
|
|
35
|
+
ProviderRegistry,
|
|
36
|
+
combineCacheFingerprints,
|
|
37
|
+
fingerprintEnvironment,
|
|
38
|
+
fingerprintFiles,
|
|
39
|
+
getConfiguredProviderRegistryPaths,
|
|
40
|
+
getProviderRegistryInputPaths
|
|
41
|
+
} from "./chunk-AT4TNPWW.js";
|
|
42
|
+
import {
|
|
43
|
+
configDirWritable,
|
|
44
|
+
configExists,
|
|
45
|
+
ensureConfigDir,
|
|
46
|
+
getConfigPaths
|
|
47
|
+
} from "./chunk-L6OM4A22.js";
|
|
48
|
+
import {
|
|
49
|
+
emitWarning
|
|
50
|
+
} from "./chunk-EJGCZGUF.js";
|
|
51
|
+
import {
|
|
52
|
+
POETIC_CONFIG_ALLOW_DEFAULT_FALLBACK,
|
|
53
|
+
readEnv
|
|
54
|
+
} from "./chunk-5DLKYTQX.js";
|
|
55
|
+
|
|
56
|
+
// src/core/config/config-manager.ts
|
|
57
|
+
import { existsSync, readFileSync, unlinkSync } from "fs";
|
|
58
|
+
import { applyEdits, modify } from "jsonc-parser";
|
|
59
|
+
import { z } from "zod";
|
|
60
|
+
|
|
61
|
+
// src/core/config/config-merger.ts
|
|
62
|
+
function isPlainObject(value) {
|
|
63
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
|
|
64
|
+
}
|
|
65
|
+
function isUnsafeMergeKey(key) {
|
|
66
|
+
return key === "__proto__" || key === "constructor" || key === "prototype";
|
|
67
|
+
}
|
|
68
|
+
function deepMerge(target, source, keyPath = "", conflicts = []) {
|
|
69
|
+
if (source === null || source === void 0) {
|
|
70
|
+
return target;
|
|
71
|
+
}
|
|
72
|
+
if (target === null || target === void 0) {
|
|
73
|
+
return source;
|
|
74
|
+
}
|
|
75
|
+
if (typeof target !== "object" || typeof source !== "object" || Array.isArray(target) !== Array.isArray(source)) {
|
|
76
|
+
return source;
|
|
77
|
+
}
|
|
78
|
+
const isArray = Array.isArray(target);
|
|
79
|
+
const result = isArray ? Object.create(Array.prototype) : /* @__PURE__ */ Object.create(null);
|
|
80
|
+
const allKeys = /* @__PURE__ */ new Set([...Object.keys(target), ...Object.keys(source)]);
|
|
81
|
+
for (const key of allKeys) {
|
|
82
|
+
if (isUnsafeMergeKey(key)) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const currentKeyPath = keyPath ? `${keyPath}.${key}` : key;
|
|
86
|
+
const targetValue = target[key];
|
|
87
|
+
const sourceValue = source[key];
|
|
88
|
+
if (!(key in source)) {
|
|
89
|
+
result[key] = targetValue;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (!(key in target)) {
|
|
93
|
+
result[key] = sourceValue;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (isPlainObject(targetValue) && isPlainObject(sourceValue)) {
|
|
97
|
+
result[key] = deepMerge(targetValue, sourceValue, currentKeyPath, conflicts);
|
|
98
|
+
} else {
|
|
99
|
+
if (JSON.stringify(targetValue) !== JSON.stringify(sourceValue)) {
|
|
100
|
+
conflicts.push({
|
|
101
|
+
key: currentKeyPath,
|
|
102
|
+
source1: targetValue,
|
|
103
|
+
source2: sourceValue,
|
|
104
|
+
resolvedWith: "high-priority-wins"
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
result[key] = sourceValue;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
function mergeProviderConfigs(target = {}, source = {}, conflicts = []) {
|
|
113
|
+
const result = {};
|
|
114
|
+
const handledProviders = /* @__PURE__ */ new Set();
|
|
115
|
+
const resultRecord = result;
|
|
116
|
+
const targetRecord = target;
|
|
117
|
+
const sourceRecord = source;
|
|
118
|
+
for (const provider of ["claude", "codex", "cursor", "copilot"]) {
|
|
119
|
+
handledProviders.add(provider);
|
|
120
|
+
const targetProvider = target[provider];
|
|
121
|
+
const sourceProvider = source[provider];
|
|
122
|
+
if (!sourceProvider) {
|
|
123
|
+
if (targetProvider) {
|
|
124
|
+
result[provider] = targetProvider;
|
|
125
|
+
}
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (!targetProvider) {
|
|
129
|
+
result[provider] = sourceProvider;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
result[provider] = { ...targetProvider };
|
|
133
|
+
for (const [key, sourceValue] of Object.entries(sourceProvider)) {
|
|
134
|
+
if (sourceValue === void 0) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const targetValue = targetProvider[key];
|
|
138
|
+
if (key === "preferences" && isPlainObject(sourceValue) && isPlainObject(targetValue)) {
|
|
139
|
+
const currentProvider = result[provider];
|
|
140
|
+
if (currentProvider && typeof currentProvider === "object" && currentProvider !== null && "preferences" in currentProvider) {
|
|
141
|
+
currentProvider.preferences = deepMerge(
|
|
142
|
+
targetValue,
|
|
143
|
+
sourceValue,
|
|
144
|
+
`providers.${provider}.preferences`,
|
|
145
|
+
conflicts
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
} else {
|
|
149
|
+
if (targetValue !== void 0 && JSON.stringify(targetValue) !== JSON.stringify(sourceValue)) {
|
|
150
|
+
conflicts.push({
|
|
151
|
+
key: `providers.${provider}.${key}`,
|
|
152
|
+
source1: targetValue,
|
|
153
|
+
source2: sourceValue,
|
|
154
|
+
resolvedWith: "high-priority-wins"
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
result[provider][key] = sourceValue;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
for (const provider of ["gemini", "opencode"]) {
|
|
162
|
+
handledProviders.add(provider);
|
|
163
|
+
const targetProvider = target[provider];
|
|
164
|
+
const sourceProvider = source[provider];
|
|
165
|
+
if (!sourceProvider) {
|
|
166
|
+
if (targetProvider) result[provider] = targetProvider;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (!targetProvider) {
|
|
170
|
+
result[provider] = sourceProvider;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (isPlainObject(targetProvider) && isPlainObject(sourceProvider)) {
|
|
174
|
+
result[provider] = deepMerge(
|
|
175
|
+
targetProvider,
|
|
176
|
+
sourceProvider,
|
|
177
|
+
`providers.${provider}`,
|
|
178
|
+
conflicts
|
|
179
|
+
);
|
|
180
|
+
} else {
|
|
181
|
+
result[provider] = sourceProvider;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const dynamicProviders = /* @__PURE__ */ new Set([...Object.keys(target), ...Object.keys(source)]);
|
|
185
|
+
for (const provider of dynamicProviders) {
|
|
186
|
+
if (handledProviders.has(provider) || isUnsafeMergeKey(provider)) {
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const targetProvider = targetRecord[provider];
|
|
190
|
+
const sourceProvider = sourceRecord[provider];
|
|
191
|
+
if (sourceProvider === void 0) {
|
|
192
|
+
if (targetProvider !== void 0) {
|
|
193
|
+
resultRecord[provider] = targetProvider;
|
|
194
|
+
}
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (targetProvider === void 0) {
|
|
198
|
+
resultRecord[provider] = sourceProvider;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (isPlainObject(targetProvider) && isPlainObject(sourceProvider)) {
|
|
202
|
+
resultRecord[provider] = deepMerge(
|
|
203
|
+
targetProvider,
|
|
204
|
+
sourceProvider,
|
|
205
|
+
`providers.${provider}`,
|
|
206
|
+
conflicts
|
|
207
|
+
);
|
|
208
|
+
} else {
|
|
209
|
+
if (JSON.stringify(targetProvider) !== JSON.stringify(sourceProvider)) {
|
|
210
|
+
conflicts.push({
|
|
211
|
+
key: `providers.${provider}`,
|
|
212
|
+
source1: targetProvider,
|
|
213
|
+
source2: sourceProvider,
|
|
214
|
+
resolvedWith: "high-priority-wins"
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
resultRecord[provider] = sourceProvider;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
function mergeQualityConfigs(target = {}, source = {}, conflicts = []) {
|
|
223
|
+
const resultRecord = {};
|
|
224
|
+
for (const [key, value] of Object.entries(target)) {
|
|
225
|
+
resultRecord[key] = value;
|
|
226
|
+
}
|
|
227
|
+
for (const [section, sourceValue] of Object.entries(source)) {
|
|
228
|
+
const targetValue = target[section];
|
|
229
|
+
if (targetValue === void 0) {
|
|
230
|
+
resultRecord[section] = sourceValue;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
if (isPlainObject(sourceValue) && isPlainObject(targetValue)) {
|
|
234
|
+
resultRecord[section] = deepMerge(targetValue, sourceValue, `quality.${section}`, conflicts);
|
|
235
|
+
} else {
|
|
236
|
+
if (JSON.stringify(targetValue) !== JSON.stringify(sourceValue)) {
|
|
237
|
+
conflicts.push({
|
|
238
|
+
key: `quality.${section}`,
|
|
239
|
+
source1: targetValue,
|
|
240
|
+
source2: sourceValue,
|
|
241
|
+
resolvedWith: "high-priority-wins"
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
resultRecord[section] = sourceValue;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return resultRecord;
|
|
248
|
+
}
|
|
249
|
+
function mergeConfigSources(sources, options = {}) {
|
|
250
|
+
const startTime = Date.now();
|
|
251
|
+
const {
|
|
252
|
+
validate = true,
|
|
253
|
+
preserveMetadata: _preserveMetadata = true,
|
|
254
|
+
conflictStrategy: _conflictStrategy = "high-priority-wins"
|
|
255
|
+
} = options;
|
|
256
|
+
const sortedSources = [...sources].sort((a, b) => a.priority - b.priority);
|
|
257
|
+
if (sortedSources.length === 0) {
|
|
258
|
+
return {
|
|
259
|
+
mergedConfig: {},
|
|
260
|
+
sources: [],
|
|
261
|
+
conflicts: [],
|
|
262
|
+
metadata: {
|
|
263
|
+
mergeTime: Date.now() - startTime,
|
|
264
|
+
sourcesUsed: 0,
|
|
265
|
+
conflictsResolved: 0
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
const firstSource = sortedSources[0];
|
|
270
|
+
if (!firstSource?.data) {
|
|
271
|
+
return {
|
|
272
|
+
mergedConfig: {},
|
|
273
|
+
sources: sortedSources,
|
|
274
|
+
conflicts: [],
|
|
275
|
+
metadata: {
|
|
276
|
+
mergeTime: Date.now() - startTime,
|
|
277
|
+
sourcesUsed: 0,
|
|
278
|
+
conflictsResolved: 0
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
const mergedConfig = structuredClone(
|
|
283
|
+
normalizeLegacyIntoCanonical(firstSource.data)
|
|
284
|
+
);
|
|
285
|
+
const conflicts = [];
|
|
286
|
+
for (let i = 1; i < sortedSources.length; i++) {
|
|
287
|
+
const source = sortedSources[i];
|
|
288
|
+
if (!source) continue;
|
|
289
|
+
const rawSourceData = source.data;
|
|
290
|
+
if (!rawSourceData) continue;
|
|
291
|
+
const sourceData = normalizeLegacyIntoCanonical(rawSourceData);
|
|
292
|
+
if (sourceData.providers) {
|
|
293
|
+
mergedConfig.providers = mergeProviderConfigs(
|
|
294
|
+
mergedConfig.providers ?? {},
|
|
295
|
+
sourceData.providers,
|
|
296
|
+
conflicts
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
if (sourceData.quality) {
|
|
300
|
+
mergedConfig.quality = mergeQualityConfigs(
|
|
301
|
+
mergedConfig.quality ?? {},
|
|
302
|
+
sourceData.quality,
|
|
303
|
+
conflicts
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
for (const [key, value] of Object.entries(sourceData)) {
|
|
307
|
+
if (key === "providers" || key === "quality") continue;
|
|
308
|
+
const mergedValue = mergedConfig[key];
|
|
309
|
+
if (isPlainObject(value) && isPlainObject(mergedValue)) {
|
|
310
|
+
mergedConfig[key] = deepMerge(
|
|
311
|
+
mergedValue,
|
|
312
|
+
value,
|
|
313
|
+
key,
|
|
314
|
+
conflicts
|
|
315
|
+
);
|
|
316
|
+
} else {
|
|
317
|
+
if (mergedValue !== void 0 && JSON.stringify(mergedValue) !== JSON.stringify(value)) {
|
|
318
|
+
const owningSource = [...sortedSources.slice(0, i)].reverse().find((s) => {
|
|
319
|
+
if (!s.data) return false;
|
|
320
|
+
return key in s.data;
|
|
321
|
+
}) ?? sortedSources[0];
|
|
322
|
+
conflicts.push({
|
|
323
|
+
key,
|
|
324
|
+
source1: owningSource,
|
|
325
|
+
source2: source,
|
|
326
|
+
resolvedWith: "high-priority-wins"
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
mergedConfig[key] = value;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const mergeTime = Date.now() - startTime;
|
|
334
|
+
if (validate) {
|
|
335
|
+
}
|
|
336
|
+
const normalizedMergedConfig = normalizeMergedConfigTree(mergedConfig);
|
|
337
|
+
return {
|
|
338
|
+
mergedConfig: normalizedMergedConfig,
|
|
339
|
+
sources: sortedSources,
|
|
340
|
+
conflicts,
|
|
341
|
+
metadata: {
|
|
342
|
+
mergeTime,
|
|
343
|
+
sourcesUsed: sortedSources.filter((s) => s.data).length,
|
|
344
|
+
conflictsResolved: conflicts.length
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
function extractEffectiveCursorModel(config) {
|
|
349
|
+
if (config.providers?.cursor?.enabled === false) {
|
|
350
|
+
return void 0;
|
|
351
|
+
}
|
|
352
|
+
if (config.providers?.cursor?.model) {
|
|
353
|
+
return config.providers.cursor.model;
|
|
354
|
+
}
|
|
355
|
+
if (config.defaultProvider === "cursor" && config.providers?.cursor) {
|
|
356
|
+
return config.providers.cursor.model;
|
|
357
|
+
}
|
|
358
|
+
return void 0;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// src/core/config/user-preferences-state.ts
|
|
362
|
+
var USER_PREFERENCE_ROOT_KEYS = [
|
|
363
|
+
"version",
|
|
364
|
+
"userId",
|
|
365
|
+
"modelRouting",
|
|
366
|
+
"preferences",
|
|
367
|
+
"globalDefaults",
|
|
368
|
+
"migrations",
|
|
369
|
+
"firstTimeSetup"
|
|
370
|
+
];
|
|
371
|
+
function clone(value) {
|
|
372
|
+
return structuredClone(value);
|
|
373
|
+
}
|
|
374
|
+
function isPlainObject2(value) {
|
|
375
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
376
|
+
}
|
|
377
|
+
function mergePreferenceValues(existing, incoming) {
|
|
378
|
+
if (!isPlainObject2(existing) || !isPlainObject2(incoming)) return clone(incoming);
|
|
379
|
+
const merged = clone(existing);
|
|
380
|
+
for (const [key, value] of Object.entries(incoming)) {
|
|
381
|
+
merged[key] = mergePreferenceValues(merged[key], value);
|
|
382
|
+
}
|
|
383
|
+
return merged;
|
|
384
|
+
}
|
|
385
|
+
function preferencesFromUserState(state) {
|
|
386
|
+
const defaults = clone(DEFAULT_USER_PREFERENCES);
|
|
387
|
+
const stored = {};
|
|
388
|
+
for (const key of USER_PREFERENCE_ROOT_KEYS) {
|
|
389
|
+
if (key in state) stored[key] = state[key];
|
|
390
|
+
}
|
|
391
|
+
const candidate = mergePreferenceValues(defaults, stored);
|
|
392
|
+
UserPreferencesSchema.parse(candidate);
|
|
393
|
+
return candidate;
|
|
394
|
+
}
|
|
395
|
+
function replacePreferencesInUserState(state, preferences) {
|
|
396
|
+
const source = preferences;
|
|
397
|
+
for (const key of USER_PREFERENCE_ROOT_KEYS) {
|
|
398
|
+
if (key in source) {
|
|
399
|
+
state[key] = clone(source[key]);
|
|
400
|
+
} else {
|
|
401
|
+
delete state[key];
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
function recoverValidPreferenceRoots(state) {
|
|
406
|
+
const recovered = clone(state);
|
|
407
|
+
for (const key of USER_PREFERENCE_ROOT_KEYS) delete recovered[key];
|
|
408
|
+
let candidate = clone(DEFAULT_USER_PREFERENCES);
|
|
409
|
+
for (const key of USER_PREFERENCE_ROOT_KEYS) {
|
|
410
|
+
if (!(key in state)) continue;
|
|
411
|
+
const trial = { ...candidate, [key]: clone(state[key]) };
|
|
412
|
+
if (UserPreferencesSchema.safeParse(trial).success) {
|
|
413
|
+
candidate = trial;
|
|
414
|
+
recovered[key] = clone(state[key]);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return recovered;
|
|
418
|
+
}
|
|
419
|
+
function preferenceMutationOptions(filePath) {
|
|
420
|
+
return {
|
|
421
|
+
...filePath ? { filePath } : {},
|
|
422
|
+
validateExisting: (state) => {
|
|
423
|
+
preferencesFromUserState(state);
|
|
424
|
+
},
|
|
425
|
+
recoverInvalidExisting: recoverValidPreferenceRoots
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
function readUserPreferencesState(filePath) {
|
|
429
|
+
const result = readUserState(filePath ? { filePath } : {});
|
|
430
|
+
return result.status === "valid" ? preferencesFromUserState(result.data) : null;
|
|
431
|
+
}
|
|
432
|
+
function snapshotUserPreferencesState(filePath) {
|
|
433
|
+
const result = readUserState(filePath ? { filePath } : {});
|
|
434
|
+
if (result.status !== "valid") return { status: result.status };
|
|
435
|
+
try {
|
|
436
|
+
return { status: "valid", preferences: preferencesFromUserState(result.data) };
|
|
437
|
+
} catch {
|
|
438
|
+
return { status: "corrupt" };
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
function restoreUserPreferencesState(snapshot, filePath) {
|
|
442
|
+
if (snapshot.status === "valid") {
|
|
443
|
+
return replaceUserPreferencesState(snapshot.preferences, filePath);
|
|
444
|
+
}
|
|
445
|
+
return mutateUserState(
|
|
446
|
+
(state) => {
|
|
447
|
+
for (const key of USER_PREFERENCE_ROOT_KEYS) delete state[key];
|
|
448
|
+
return null;
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
...filePath ? { filePath } : {},
|
|
452
|
+
deleteIfEmpty: true
|
|
453
|
+
}
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
function mutateUserPreferencesState(mutator, filePath) {
|
|
457
|
+
return mutateUserState((state) => {
|
|
458
|
+
const preferences = preferencesFromUserState(state);
|
|
459
|
+
const value = mutator(preferences);
|
|
460
|
+
UserPreferencesSchema.parse(preferences);
|
|
461
|
+
replacePreferencesInUserState(state, preferences);
|
|
462
|
+
return { preferences, value };
|
|
463
|
+
}, preferenceMutationOptions(filePath));
|
|
464
|
+
}
|
|
465
|
+
function writeUserPreferencesState(preferences, filePath) {
|
|
466
|
+
return mutateUserState((state) => {
|
|
467
|
+
const existing = preferencesFromUserState(state);
|
|
468
|
+
const merged = mergePreferenceValues(existing, preferences);
|
|
469
|
+
UserPreferencesSchema.parse(merged);
|
|
470
|
+
replacePreferencesInUserState(state, merged);
|
|
471
|
+
return merged;
|
|
472
|
+
}, preferenceMutationOptions(filePath));
|
|
473
|
+
}
|
|
474
|
+
function replaceUserPreferencesState(preferences, filePath) {
|
|
475
|
+
return mutateUserState((state) => {
|
|
476
|
+
UserPreferencesSchema.parse(preferences);
|
|
477
|
+
const replacement = clone(preferences);
|
|
478
|
+
replacePreferencesInUserState(state, replacement);
|
|
479
|
+
return replacement;
|
|
480
|
+
}, preferenceMutationOptions(filePath));
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// src/core/config/config-manager.ts
|
|
484
|
+
function hasExplicitConfigSource(sources) {
|
|
485
|
+
return sources.some((source) => source.exists && source.type !== "default");
|
|
486
|
+
}
|
|
487
|
+
function allowInvalidConfigFallback() {
|
|
488
|
+
try {
|
|
489
|
+
return readEnv(POETIC_CONFIG_ALLOW_DEFAULT_FALLBACK).value === true;
|
|
490
|
+
} catch (error) {
|
|
491
|
+
throw new InvalidExplicitConfigError(
|
|
492
|
+
`Invalid POETIC_CONFIG_ALLOW_DEFAULT_FALLBACK value: ${error instanceof Error ? error.message : String(error)}`,
|
|
493
|
+
error
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
function cloneConfigValue(value) {
|
|
498
|
+
return structuredClone(value);
|
|
499
|
+
}
|
|
500
|
+
function cloneMergedConfigResult(config) {
|
|
501
|
+
return cloneConfigValue(config);
|
|
502
|
+
}
|
|
503
|
+
function snapshotFile(filePath) {
|
|
504
|
+
return existsSync(filePath) ? { status: "present", content: readFileSync(filePath, "utf8") } : { status: "missing" };
|
|
505
|
+
}
|
|
506
|
+
function restoreFileSnapshot(filePath, snapshot, baseDir) {
|
|
507
|
+
if (snapshot.status === "present") {
|
|
508
|
+
const result = atomicWrite(filePath, snapshot.content, { baseDir });
|
|
509
|
+
if (!result.success) throw result.error ?? new Error(`Could not restore ${filePath}`);
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
try {
|
|
513
|
+
unlinkSync(filePath);
|
|
514
|
+
} catch (error) {
|
|
515
|
+
if (error.code !== "ENOENT") throw error;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
function isPlaceholderModelDefault(registryDefault) {
|
|
519
|
+
const unqualified = registryDefault.trim().toLowerCase().split("/").pop() ?? "";
|
|
520
|
+
return unqualified === "auto" || unqualified === "default";
|
|
521
|
+
}
|
|
522
|
+
var ConfigManager = class {
|
|
523
|
+
cache = /* @__PURE__ */ new Map();
|
|
524
|
+
cacheHits = 0;
|
|
525
|
+
cacheMisses = 0;
|
|
526
|
+
options;
|
|
527
|
+
updateCursorModelQueue = Promise.resolve();
|
|
528
|
+
constructor(options = {}) {
|
|
529
|
+
this.options = {
|
|
530
|
+
enableCache: options.enableCache ?? true,
|
|
531
|
+
cacheTTL: options.cacheTTL ?? 5 * 60 * 1e3,
|
|
532
|
+
// 5 minutes
|
|
533
|
+
autoFix: options.autoFix ?? false,
|
|
534
|
+
cwd: options.cwd ?? process.cwd()
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
get paths() {
|
|
538
|
+
return getConfigPaths(this.options.cwd);
|
|
539
|
+
}
|
|
540
|
+
buildLoadCacheKey(cliFlags) {
|
|
541
|
+
const paths = this.paths;
|
|
542
|
+
const filePaths = [
|
|
543
|
+
...poeticConfigCandidates(paths.projectConfigFile),
|
|
544
|
+
...poeticConfigCandidates(paths.userConfigFile),
|
|
545
|
+
paths.userPreferencesFile,
|
|
546
|
+
getActiveProfilePath(),
|
|
547
|
+
...getProviderRegistryInputPaths(this.options.cwd)
|
|
548
|
+
].filter((value) => value !== void 0);
|
|
549
|
+
return JSON.stringify({
|
|
550
|
+
cliFlags,
|
|
551
|
+
cwd: this.options.cwd,
|
|
552
|
+
fingerprint: combineCacheFingerprints(
|
|
553
|
+
fingerprintEnvironment(process.env, () => true),
|
|
554
|
+
fingerprintFiles(filePaths)
|
|
555
|
+
)
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Load configuration from all sources with precedence
|
|
560
|
+
*
|
|
561
|
+
* @param cliFlags - CLI flag overrides
|
|
562
|
+
* @param forceReload - Skip cache and reload
|
|
563
|
+
* @returns Resolved configuration with metadata
|
|
564
|
+
*/
|
|
565
|
+
async loadConfig(cliFlags = {}, forceReload = false) {
|
|
566
|
+
const startTime = Date.now();
|
|
567
|
+
const cacheKey = this.buildLoadCacheKey(cliFlags);
|
|
568
|
+
try {
|
|
569
|
+
if (!forceReload && this.options.enableCache) {
|
|
570
|
+
const cached = this.getFromCache(cacheKey);
|
|
571
|
+
if (cached) {
|
|
572
|
+
return cached;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
const allowDefaultFallback = allowInvalidConfigFallback();
|
|
576
|
+
const explicitProviderRegistryPaths = getConfiguredProviderRegistryPaths(
|
|
577
|
+
this.options.cwd
|
|
578
|
+
).filter((path) => existsSync(path));
|
|
579
|
+
if (explicitProviderRegistryPaths.length > 0) {
|
|
580
|
+
try {
|
|
581
|
+
ProviderRegistry.load(void 0, this.options.cwd);
|
|
582
|
+
} catch (error) {
|
|
583
|
+
if (!allowDefaultFallback) {
|
|
584
|
+
throw new InvalidExplicitConfigError(
|
|
585
|
+
`Invalid explicit provider registry: ${error instanceof Error ? error.message : String(error)}`,
|
|
586
|
+
error
|
|
587
|
+
);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
const sources = await loadAllConfigSources(this.options.cwd, cliFlags);
|
|
592
|
+
const mergeResult = mergeConfigSources(sources);
|
|
593
|
+
const validationResult = validatePoeticConfig(mergeResult.mergedConfig, {
|
|
594
|
+
includeWarnings: true,
|
|
595
|
+
includeSuggestions: true,
|
|
596
|
+
cwd: this.options.cwd
|
|
597
|
+
});
|
|
598
|
+
let finalConfig = mergeResult.mergedConfig;
|
|
599
|
+
if (this.options.autoFix && !validationResult.isValid) {
|
|
600
|
+
const autoFixResult = autoFixConfig(mergeResult.mergedConfig);
|
|
601
|
+
if (autoFixResult.changes.length > 0) {
|
|
602
|
+
finalConfig = autoFixResult.fixedConfig;
|
|
603
|
+
emitWarning(
|
|
604
|
+
"CFG-002",
|
|
605
|
+
{
|
|
606
|
+
taskId: "config-manager",
|
|
607
|
+
subsystem: "config",
|
|
608
|
+
executionPhase: "setup"
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
severity: "INFO" /* INFO */,
|
|
612
|
+
metadata: {
|
|
613
|
+
changes: autoFixResult.changes,
|
|
614
|
+
operation: "loadConfig"
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
const finalValidationResult = finalConfig === mergeResult.mergedConfig ? validationResult : validatePoeticConfig(finalConfig, {
|
|
621
|
+
includeWarnings: true,
|
|
622
|
+
includeSuggestions: true,
|
|
623
|
+
cwd: this.options.cwd
|
|
624
|
+
});
|
|
625
|
+
if (!finalValidationResult.isValid) {
|
|
626
|
+
const explicitConfigInvalid = hasExplicitConfigSource(sources) || getConfiguredProviderRegistryPaths(this.options.cwd).some((path) => existsSync(path));
|
|
627
|
+
emitWarning(
|
|
628
|
+
"CFG-003",
|
|
629
|
+
{
|
|
630
|
+
taskId: "config-manager",
|
|
631
|
+
subsystem: "config",
|
|
632
|
+
executionPhase: "setup"
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
severity: "ERROR" /* ERROR */,
|
|
636
|
+
metadata: {
|
|
637
|
+
operation: "loadConfig",
|
|
638
|
+
errors: finalValidationResult.errors,
|
|
639
|
+
sourceTypes: sources.filter((source) => source.exists).map((source) => source.type),
|
|
640
|
+
fallback: explicitConfigInvalid && !allowDefaultFallback ? "blocked-invalid-explicit-config" : "default-config"
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
);
|
|
644
|
+
if (explicitConfigInvalid && !allowDefaultFallback) {
|
|
645
|
+
throw new InvalidExplicitConfigError(
|
|
646
|
+
`Invalid explicit Poetic configuration: ${finalValidationResult.errors.map((err) => err.message).join("; ")}`
|
|
647
|
+
);
|
|
648
|
+
}
|
|
649
|
+
finalConfig = cloneConfigValue(DEFAULT_CONFIG);
|
|
650
|
+
}
|
|
651
|
+
const isFirstTimeUser = await this.detectFirstTimeUser();
|
|
652
|
+
const effectiveModel = extractEffectiveCursorModel(finalConfig);
|
|
653
|
+
const resolvedConfig = {
|
|
654
|
+
config: finalConfig,
|
|
655
|
+
sources,
|
|
656
|
+
effectiveModel,
|
|
657
|
+
isFirstTimeUser,
|
|
658
|
+
loadTime: Date.now() - startTime
|
|
659
|
+
};
|
|
660
|
+
this.validateProviderDefaultsConsistency(resolvedConfig.config);
|
|
661
|
+
if (this.options.enableCache) {
|
|
662
|
+
this.setCache(cacheKey, resolvedConfig);
|
|
663
|
+
}
|
|
664
|
+
return cloneMergedConfigResult(resolvedConfig);
|
|
665
|
+
} catch (error) {
|
|
666
|
+
if (error instanceof InvalidExplicitConfigError) {
|
|
667
|
+
throw error;
|
|
668
|
+
}
|
|
669
|
+
if (isPoeticConfigReadError(error)) {
|
|
670
|
+
throw error;
|
|
671
|
+
}
|
|
672
|
+
throw error;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
/** Registry-first execution defaults with source attribution. */
|
|
676
|
+
resolveExecutionConfig(cli = {}) {
|
|
677
|
+
return resolveConfig(cli, this.options.cwd, { strictSynthesisModel: false });
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Write user preferences atomically
|
|
681
|
+
*
|
|
682
|
+
* @param preferences - User preferences to write
|
|
683
|
+
* @returns Success status
|
|
684
|
+
*/
|
|
685
|
+
async writeUserPreferences(preferences) {
|
|
686
|
+
try {
|
|
687
|
+
const result = writeUserPreferencesState(preferences, this.paths.userPreferencesFile);
|
|
688
|
+
this.emitUserStateWarnings(result.warnings);
|
|
689
|
+
this.invalidateCache();
|
|
690
|
+
return { success: true };
|
|
691
|
+
} catch (error) {
|
|
692
|
+
return {
|
|
693
|
+
success: false,
|
|
694
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
695
|
+
};
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Load user preferences
|
|
700
|
+
*
|
|
701
|
+
* @returns User preferences or null
|
|
702
|
+
*/
|
|
703
|
+
async loadUserPreferences() {
|
|
704
|
+
try {
|
|
705
|
+
const preferences = readUserPreferencesState(this.paths.userPreferencesFile);
|
|
706
|
+
return preferences ? cloneConfigValue(preferences) : null;
|
|
707
|
+
} catch {
|
|
708
|
+
return null;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Update project configuration atomically
|
|
713
|
+
*
|
|
714
|
+
* @param config - Configuration to write
|
|
715
|
+
* @returns Success status
|
|
716
|
+
*/
|
|
717
|
+
async writeProjectConfig(config) {
|
|
718
|
+
try {
|
|
719
|
+
if (!ensureConfigDir(this.paths.projectConfigDir)) {
|
|
720
|
+
return {
|
|
721
|
+
success: false,
|
|
722
|
+
error: "Cannot create project config directory"
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
const configContent = this.generateConfigFileContent(config);
|
|
726
|
+
const result = atomicWrite(this.paths.projectConfigFile, configContent, {
|
|
727
|
+
baseDir: this.options.cwd
|
|
728
|
+
});
|
|
729
|
+
if (!result.success) {
|
|
730
|
+
return { success: false, error: result.error?.message };
|
|
731
|
+
}
|
|
732
|
+
this.invalidateCache();
|
|
733
|
+
return { success: true };
|
|
734
|
+
} catch (error) {
|
|
735
|
+
return {
|
|
736
|
+
success: false,
|
|
737
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
738
|
+
};
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Update user configuration atomically (~/.config/poetic/poetic.config.jsonc)
|
|
743
|
+
*
|
|
744
|
+
* @param config - User configuration to write
|
|
745
|
+
* @returns Success status
|
|
746
|
+
*/
|
|
747
|
+
async writeUserConfig(config) {
|
|
748
|
+
try {
|
|
749
|
+
if (!ensureConfigDir(this.paths.userConfigDir)) {
|
|
750
|
+
return {
|
|
751
|
+
success: false,
|
|
752
|
+
error: "Cannot create user config directory"
|
|
753
|
+
};
|
|
754
|
+
}
|
|
755
|
+
const configContent = this.generateConfigFileContent(config);
|
|
756
|
+
const result = atomicWrite(this.paths.userConfigFile, configContent, {
|
|
757
|
+
baseDir: this.options.cwd
|
|
758
|
+
});
|
|
759
|
+
if (!result.success) {
|
|
760
|
+
return { success: false, error: result.error?.message };
|
|
761
|
+
}
|
|
762
|
+
this.invalidateCache();
|
|
763
|
+
return { success: true };
|
|
764
|
+
} catch (error) {
|
|
765
|
+
return {
|
|
766
|
+
success: false,
|
|
767
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
768
|
+
};
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
/**
|
|
772
|
+
* Load project configuration
|
|
773
|
+
*
|
|
774
|
+
* @returns Project configuration or null
|
|
775
|
+
*/
|
|
776
|
+
async loadProjectConfig() {
|
|
777
|
+
return loadProjectConfig(this.paths.projectConfigFile, this.options.cwd);
|
|
778
|
+
}
|
|
779
|
+
/**
|
|
780
|
+
* Update cursor model preference
|
|
781
|
+
*
|
|
782
|
+
* @param model - New cursor model
|
|
783
|
+
* @param context - Change context
|
|
784
|
+
* @returns Success status
|
|
785
|
+
*/
|
|
786
|
+
async updateCursorModel(model, context) {
|
|
787
|
+
return this.runSerializedCursorModelUpdate(async () => {
|
|
788
|
+
try {
|
|
789
|
+
const result = mutateUserPreferencesState((preferences) => {
|
|
790
|
+
const cursor = preferences.preferences.cursor;
|
|
791
|
+
const previousModel = cursor.usageHistory.lastUsed;
|
|
792
|
+
cursor.userChosenDefault = model;
|
|
793
|
+
cursor.usageHistory.lastUsed = model;
|
|
794
|
+
cursor.usageHistory.usageCount += 1;
|
|
795
|
+
cursor.usageHistory.modelChanges ??= [];
|
|
796
|
+
cursor.usageHistory.modelChanges.push({
|
|
797
|
+
from: previousModel ?? "",
|
|
798
|
+
to: model,
|
|
799
|
+
timestamp: context.timestamp || (/* @__PURE__ */ new Date()).toISOString(),
|
|
800
|
+
context: context.type
|
|
801
|
+
});
|
|
802
|
+
}, this.paths.userPreferencesFile);
|
|
803
|
+
this.emitUserStateWarnings(result.warnings);
|
|
804
|
+
this.invalidateCache();
|
|
805
|
+
return { success: true };
|
|
806
|
+
} catch (error) {
|
|
807
|
+
return {
|
|
808
|
+
success: false,
|
|
809
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* Detect if this is a first-time user
|
|
816
|
+
*
|
|
817
|
+
* @returns True if first-time user
|
|
818
|
+
*/
|
|
819
|
+
async detectFirstTimeUser() {
|
|
820
|
+
try {
|
|
821
|
+
const userPrefs = await this.loadUserPreferences();
|
|
822
|
+
return !isFirstTimeDefaultsInitialized(userPrefs);
|
|
823
|
+
} catch {
|
|
824
|
+
return true;
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Get configuration diagnostics
|
|
829
|
+
*
|
|
830
|
+
* @returns Diagnostic information
|
|
831
|
+
*/
|
|
832
|
+
async getDiagnostics() {
|
|
833
|
+
const paths = {
|
|
834
|
+
projectConfigFile: {
|
|
835
|
+
exists: poeticConfigCandidates(this.paths.projectConfigFile).some(configExists)
|
|
836
|
+
},
|
|
837
|
+
userConfigFile: {
|
|
838
|
+
exists: poeticConfigCandidates(this.paths.userConfigFile).some(configExists)
|
|
839
|
+
},
|
|
840
|
+
userPreferencesFile: {
|
|
841
|
+
exists: configExists(this.paths.userPreferencesFile)
|
|
842
|
+
},
|
|
843
|
+
userConfigDir: {
|
|
844
|
+
exists: configExists(this.paths.userConfigDir),
|
|
845
|
+
writable: configDirWritable(this.paths.userConfigDir, { createIfMissing: false })
|
|
846
|
+
},
|
|
847
|
+
projectConfigDir: {
|
|
848
|
+
exists: configExists(this.paths.projectConfigDir),
|
|
849
|
+
writable: configDirWritable(this.paths.projectConfigDir, { createIfMissing: false })
|
|
850
|
+
}
|
|
851
|
+
};
|
|
852
|
+
const cache = {
|
|
853
|
+
enabled: this.options.enableCache,
|
|
854
|
+
size: this.cache.size,
|
|
855
|
+
entries: Array.from(this.cache.entries()).map(([key, entry]) => ({
|
|
856
|
+
key: `${key.substring(0, 50)}...`,
|
|
857
|
+
age: Date.now() - entry.timestamp
|
|
858
|
+
}))
|
|
859
|
+
};
|
|
860
|
+
const config = await this.loadConfig();
|
|
861
|
+
const validationResult = validatePoeticConfig(config.config, { cwd: this.options.cwd });
|
|
862
|
+
const validation = {
|
|
863
|
+
isValid: validationResult.isValid,
|
|
864
|
+
errors: validationResult.errors.map((e) => e.message),
|
|
865
|
+
warnings: validationResult.warnings.map((w) => w.message),
|
|
866
|
+
autoFixed: validationResult.autoFixed
|
|
867
|
+
};
|
|
868
|
+
const performance = {
|
|
869
|
+
avgLoadTime: config.loadTime,
|
|
870
|
+
cacheHitRate: this.calculateCacheHitRate()
|
|
871
|
+
};
|
|
872
|
+
return { paths, cache, validation, performance };
|
|
873
|
+
}
|
|
874
|
+
/**
|
|
875
|
+
* Clear configuration cache
|
|
876
|
+
*/
|
|
877
|
+
clearCache() {
|
|
878
|
+
this.cache.clear();
|
|
879
|
+
this.cacheHits = 0;
|
|
880
|
+
this.cacheMisses = 0;
|
|
881
|
+
}
|
|
882
|
+
/**
|
|
883
|
+
* Invalidate cache for current working directory
|
|
884
|
+
*
|
|
885
|
+
* CRITICAL FIX: Atomic cache invalidation to prevent race conditions.
|
|
886
|
+
* Collect all keys first, then delete them atomically to ensure
|
|
887
|
+
* consistent cache state during concurrent access.
|
|
888
|
+
*/
|
|
889
|
+
invalidateCache() {
|
|
890
|
+
const keysToDelete = [];
|
|
891
|
+
for (const [key] of this.cache) {
|
|
892
|
+
if (key.includes(this.options.cwd)) {
|
|
893
|
+
keysToDelete.push(key);
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
for (const key of keysToDelete) {
|
|
897
|
+
this.cache.delete(key);
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
/**
|
|
901
|
+
* Get configuration from cache
|
|
902
|
+
*
|
|
903
|
+
* @param key - Cache key
|
|
904
|
+
* @returns Cached configuration or null
|
|
905
|
+
*/
|
|
906
|
+
getFromCache(key) {
|
|
907
|
+
const entry = this.cache.get(key);
|
|
908
|
+
if (!entry) {
|
|
909
|
+
this.cacheMisses += 1;
|
|
910
|
+
return null;
|
|
911
|
+
}
|
|
912
|
+
if (Date.now() - entry.timestamp > this.options.cacheTTL) {
|
|
913
|
+
this.cache.delete(key);
|
|
914
|
+
this.cacheMisses += 1;
|
|
915
|
+
return null;
|
|
916
|
+
}
|
|
917
|
+
this.cacheHits += 1;
|
|
918
|
+
return cloneMergedConfigResult(entry.config);
|
|
919
|
+
}
|
|
920
|
+
/**
|
|
921
|
+
* Set configuration in cache
|
|
922
|
+
*
|
|
923
|
+
* @param key - Cache key
|
|
924
|
+
* @param config - Configuration to cache
|
|
925
|
+
*/
|
|
926
|
+
setCache(key, config) {
|
|
927
|
+
this.cache.set(key, {
|
|
928
|
+
config: cloneMergedConfigResult(config),
|
|
929
|
+
timestamp: Date.now(),
|
|
930
|
+
sources: config.sources.map((s) => s.type)
|
|
931
|
+
});
|
|
932
|
+
}
|
|
933
|
+
async runSerializedCursorModelUpdate(operation) {
|
|
934
|
+
let release = () => {
|
|
935
|
+
};
|
|
936
|
+
const previous = this.updateCursorModelQueue;
|
|
937
|
+
this.updateCursorModelQueue = new Promise((resolve) => {
|
|
938
|
+
release = resolve;
|
|
939
|
+
});
|
|
940
|
+
await previous;
|
|
941
|
+
try {
|
|
942
|
+
return await operation();
|
|
943
|
+
} finally {
|
|
944
|
+
release?.();
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
/**
|
|
948
|
+
* Calculate cache hit rate
|
|
949
|
+
*
|
|
950
|
+
* @returns Cache hit rate as percentage
|
|
951
|
+
*/
|
|
952
|
+
calculateCacheHitRate() {
|
|
953
|
+
const totalLookups = this.cacheHits + this.cacheMisses;
|
|
954
|
+
if (totalLookups === 0) {
|
|
955
|
+
return 0;
|
|
956
|
+
}
|
|
957
|
+
return Math.round(this.cacheHits / totalLookups * 1e3) / 10;
|
|
958
|
+
}
|
|
959
|
+
emitUserStateWarnings(warnings) {
|
|
960
|
+
for (const warning of warnings) {
|
|
961
|
+
emitWarning(
|
|
962
|
+
"CFG-001",
|
|
963
|
+
{ taskId: "config-manager", subsystem: "config", executionPhase: "setup" },
|
|
964
|
+
{
|
|
965
|
+
severity: "WARN" /* WARN */,
|
|
966
|
+
metadata: { operation: "writeUserPreferences", ...warning }
|
|
967
|
+
}
|
|
968
|
+
);
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
/**
|
|
972
|
+
* Detect and warn about provider default drift (all providers with model defaults).
|
|
973
|
+
*/
|
|
974
|
+
validateProviderDefaultsConsistency(config) {
|
|
975
|
+
try {
|
|
976
|
+
const registry = ProviderRegistry.load(void 0, this.options.cwd);
|
|
977
|
+
const providersWithModels = Object.values(registry.providers).filter(
|
|
978
|
+
(p) => p.models?.default
|
|
979
|
+
);
|
|
980
|
+
for (const providerConfig of providersWithModels) {
|
|
981
|
+
const providerId = providerConfig.id;
|
|
982
|
+
const registryDefault = providerConfig.models.default;
|
|
983
|
+
const providerEntry = config.providers?.[providerId];
|
|
984
|
+
const configured = providerEntry && typeof providerEntry === "object" && "model" in providerEntry && typeof providerEntry.model === "string" ? providerEntry.model : void 0;
|
|
985
|
+
if (configured && configured !== registryDefault && !isPlaceholderModelDefault(registryDefault)) {
|
|
986
|
+
emitWarning(
|
|
987
|
+
"CFG-007",
|
|
988
|
+
{
|
|
989
|
+
taskId: "config-manager",
|
|
990
|
+
subsystem: "config",
|
|
991
|
+
executionPhase: "setup"
|
|
992
|
+
},
|
|
993
|
+
{
|
|
994
|
+
severity: "WARN" /* WARN */,
|
|
995
|
+
metadata: {
|
|
996
|
+
provider: providerId,
|
|
997
|
+
configuredDefault: configured,
|
|
998
|
+
registryDefault,
|
|
999
|
+
recommendation: "Remove the model override or align it with providers.yaml"
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
);
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
} catch (error) {
|
|
1006
|
+
emitWarning(
|
|
1007
|
+
"CFG-002",
|
|
1008
|
+
{
|
|
1009
|
+
taskId: "config-manager",
|
|
1010
|
+
subsystem: "config",
|
|
1011
|
+
executionPhase: "setup"
|
|
1012
|
+
},
|
|
1013
|
+
{
|
|
1014
|
+
severity: "INFO" /* INFO */,
|
|
1015
|
+
metadata: {
|
|
1016
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1017
|
+
recommendation: "Ensure provider registry is valid to compare defaults"
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
);
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
/**
|
|
1024
|
+
* Set a configuration value using dot-notation path
|
|
1025
|
+
*
|
|
1026
|
+
* @param path - Dot-notation path (e.g., 'defaults.provider', 'automation.flywheel.merge.biomeRepair')
|
|
1027
|
+
* @param value - Value to set
|
|
1028
|
+
* @param scope - Configuration scope ('user' or 'project')
|
|
1029
|
+
* @returns Success status with previous value
|
|
1030
|
+
*/
|
|
1031
|
+
async setConfigValue(path, value, scope = "project") {
|
|
1032
|
+
try {
|
|
1033
|
+
const pathSegments = path.split(".").filter(Boolean);
|
|
1034
|
+
if (pathSegments.length === 0) {
|
|
1035
|
+
return { success: false, error: "Invalid configuration path" };
|
|
1036
|
+
}
|
|
1037
|
+
if (!this.isValidConfigPath(pathSegments)) {
|
|
1038
|
+
return {
|
|
1039
|
+
success: false,
|
|
1040
|
+
error: `Unknown configuration path: ${path}. Use 'poetic config show' to see valid paths.`
|
|
1041
|
+
};
|
|
1042
|
+
}
|
|
1043
|
+
let config;
|
|
1044
|
+
if (scope === "project") {
|
|
1045
|
+
config = await this.loadProjectConfig() || {};
|
|
1046
|
+
} else {
|
|
1047
|
+
const resolved = await this.loadConfig();
|
|
1048
|
+
const userSource = resolved.sources.find((s) => s.type === "user");
|
|
1049
|
+
config = userSource?.data || {};
|
|
1050
|
+
}
|
|
1051
|
+
const previousValue = this.getNestedValue(config, pathSegments);
|
|
1052
|
+
const parsedValue = this.parseConfigValue(value);
|
|
1053
|
+
const updatedConfig = this.setNestedValue(config, pathSegments, parsedValue);
|
|
1054
|
+
const validationResult = PoeticConfigSchema.safeParse(updatedConfig);
|
|
1055
|
+
if (!validationResult.success) {
|
|
1056
|
+
return {
|
|
1057
|
+
success: false,
|
|
1058
|
+
error: `Invalid configuration: ${validationResult.error.issues.map((issue) => issue.message).join(", ")}`
|
|
1059
|
+
};
|
|
1060
|
+
}
|
|
1061
|
+
const writeResult = await this.writeConfigValuePreservingJsonc(
|
|
1062
|
+
scope,
|
|
1063
|
+
pathSegments,
|
|
1064
|
+
parsedValue,
|
|
1065
|
+
validationResult.data
|
|
1066
|
+
);
|
|
1067
|
+
if (!writeResult.success) {
|
|
1068
|
+
return writeResult;
|
|
1069
|
+
}
|
|
1070
|
+
return { success: true, previousValue };
|
|
1071
|
+
} catch (error) {
|
|
1072
|
+
return {
|
|
1073
|
+
success: false,
|
|
1074
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
1075
|
+
};
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
/**
|
|
1079
|
+
* Get a configuration value using dot-notation path
|
|
1080
|
+
*
|
|
1081
|
+
* @param path - Dot-notation path
|
|
1082
|
+
* @param scope - Configuration scope ('user' or 'project')
|
|
1083
|
+
* @returns The value at the path or undefined
|
|
1084
|
+
*/
|
|
1085
|
+
async getConfigValue(path, scope = "project") {
|
|
1086
|
+
const pathSegments = path.split(".").filter(Boolean);
|
|
1087
|
+
let config;
|
|
1088
|
+
if (scope === "project") {
|
|
1089
|
+
config = await this.loadProjectConfig() || {};
|
|
1090
|
+
} else {
|
|
1091
|
+
const resolved = await this.loadConfig();
|
|
1092
|
+
const userSource = resolved.sources.find((s) => s.type === "user");
|
|
1093
|
+
config = userSource?.data || {};
|
|
1094
|
+
}
|
|
1095
|
+
return this.getNestedValue(config, pathSegments);
|
|
1096
|
+
}
|
|
1097
|
+
/**
|
|
1098
|
+
* Validate a configuration path against allowed paths
|
|
1099
|
+
*/
|
|
1100
|
+
isValidConfigPath(pathSegments) {
|
|
1101
|
+
const rootNamespace = pathSegments[0];
|
|
1102
|
+
if (!rootNamespace || !KNOWN_POETIC_CONFIG_ROOTS.includes(rootNamespace)) {
|
|
1103
|
+
return false;
|
|
1104
|
+
}
|
|
1105
|
+
return true;
|
|
1106
|
+
}
|
|
1107
|
+
/**
|
|
1108
|
+
* Get nested value from object using path segments
|
|
1109
|
+
*/
|
|
1110
|
+
getNestedValue(obj, path) {
|
|
1111
|
+
let current = obj;
|
|
1112
|
+
for (const segment of path) {
|
|
1113
|
+
if (current == null || typeof current !== "object") {
|
|
1114
|
+
return void 0;
|
|
1115
|
+
}
|
|
1116
|
+
current = current[segment];
|
|
1117
|
+
}
|
|
1118
|
+
return current;
|
|
1119
|
+
}
|
|
1120
|
+
/**
|
|
1121
|
+
* Set nested value in object using path segments (immutable)
|
|
1122
|
+
*/
|
|
1123
|
+
setNestedValue(obj, path, value) {
|
|
1124
|
+
const result = structuredClone(obj);
|
|
1125
|
+
let current = result;
|
|
1126
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
1127
|
+
const segment = path[i];
|
|
1128
|
+
if (!segment) {
|
|
1129
|
+
continue;
|
|
1130
|
+
}
|
|
1131
|
+
if (!(segment in current) || typeof current[segment] !== "object" || current[segment] === null) {
|
|
1132
|
+
current[segment] = {};
|
|
1133
|
+
}
|
|
1134
|
+
current = current[segment];
|
|
1135
|
+
}
|
|
1136
|
+
const lastSegment = path[path.length - 1];
|
|
1137
|
+
if (lastSegment) {
|
|
1138
|
+
current[lastSegment] = value;
|
|
1139
|
+
}
|
|
1140
|
+
return result;
|
|
1141
|
+
}
|
|
1142
|
+
/**
|
|
1143
|
+
* Parse config value from string to appropriate type
|
|
1144
|
+
*/
|
|
1145
|
+
parseConfigValue(value) {
|
|
1146
|
+
if (typeof value !== "string") {
|
|
1147
|
+
return value;
|
|
1148
|
+
}
|
|
1149
|
+
const trimmed = value.trim();
|
|
1150
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]") || trimmed.startsWith("{") && trimmed.endsWith("}")) {
|
|
1151
|
+
try {
|
|
1152
|
+
return JSON.parse(trimmed);
|
|
1153
|
+
} catch {
|
|
1154
|
+
return value;
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
if (value.toLowerCase() === "true") return true;
|
|
1158
|
+
if (value.toLowerCase() === "false") return false;
|
|
1159
|
+
const num = Number(value);
|
|
1160
|
+
if (!Number.isNaN(num) && value.trim() !== "") {
|
|
1161
|
+
return num;
|
|
1162
|
+
}
|
|
1163
|
+
if (value.toLowerCase() === "null") return null;
|
|
1164
|
+
if (value.toLowerCase() === "undefined") return void 0;
|
|
1165
|
+
return value;
|
|
1166
|
+
}
|
|
1167
|
+
/**
|
|
1168
|
+
* Generate JSONC configuration file content
|
|
1169
|
+
*
|
|
1170
|
+
* @param config - Configuration object
|
|
1171
|
+
* @returns JSONC file content
|
|
1172
|
+
*/
|
|
1173
|
+
generateConfigFileContent(config) {
|
|
1174
|
+
return `{
|
|
1175
|
+
// Poetic configuration.
|
|
1176
|
+
// JSONC is JSON with comments and trailing commas; use "poetic config set/get"
|
|
1177
|
+
// to edit this safely, or hand-edit it with a JSONC-aware editor.
|
|
1178
|
+
${JSON.stringify(config, null, 2).split("\n").map((line, index) => index === 0 ? line.slice(1) : ` ${line}`).join("\n")}
|
|
1179
|
+
`;
|
|
1180
|
+
}
|
|
1181
|
+
async writeConfigValuePreservingJsonc(scope, pathSegments, value, validatedConfig) {
|
|
1182
|
+
const filePath = scope === "project" ? this.paths.projectConfigFile : this.paths.userConfigFile;
|
|
1183
|
+
if (!existsSync(filePath)) {
|
|
1184
|
+
return scope === "project" ? this.writeProjectConfig(validatedConfig) : this.writeUserConfig(validatedConfig);
|
|
1185
|
+
}
|
|
1186
|
+
try {
|
|
1187
|
+
const original = readFileSync(filePath, "utf8");
|
|
1188
|
+
const edits = modify(original, pathSegments, value, {
|
|
1189
|
+
formattingOptions: {
|
|
1190
|
+
insertSpaces: true,
|
|
1191
|
+
tabSize: 2
|
|
1192
|
+
}
|
|
1193
|
+
});
|
|
1194
|
+
const updated = applyEdits(original, edits);
|
|
1195
|
+
const result = atomicWrite(filePath, updated.endsWith("\n") ? updated : `${updated}
|
|
1196
|
+
`, {
|
|
1197
|
+
baseDir: this.options.cwd
|
|
1198
|
+
});
|
|
1199
|
+
if (!result.success) {
|
|
1200
|
+
return { success: false, error: result.error?.message };
|
|
1201
|
+
}
|
|
1202
|
+
this.invalidateCache();
|
|
1203
|
+
return { success: true };
|
|
1204
|
+
} catch (error) {
|
|
1205
|
+
return {
|
|
1206
|
+
success: false,
|
|
1207
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
1208
|
+
};
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
/**
|
|
1212
|
+
* Reset configuration to defaults
|
|
1213
|
+
*
|
|
1214
|
+
* @param level - Reset level ('user', 'project', or 'all')
|
|
1215
|
+
* @returns Success status
|
|
1216
|
+
*/
|
|
1217
|
+
async resetToDefaults(level = "project") {
|
|
1218
|
+
try {
|
|
1219
|
+
if (level === "user" || level === "all") {
|
|
1220
|
+
const userConfigSnapshot = snapshotFile(this.paths.userConfigFile);
|
|
1221
|
+
const userResult = await this.writeUserConfig({});
|
|
1222
|
+
if (!userResult.success) return userResult;
|
|
1223
|
+
if (level === "all") {
|
|
1224
|
+
const projectResult = await this.writeProjectConfig({});
|
|
1225
|
+
if (!projectResult.success) {
|
|
1226
|
+
const rollbackErrors = [];
|
|
1227
|
+
try {
|
|
1228
|
+
restoreFileSnapshot(this.paths.userConfigFile, userConfigSnapshot, this.options.cwd);
|
|
1229
|
+
} catch (error) {
|
|
1230
|
+
rollbackErrors.push(
|
|
1231
|
+
`user config rollback failed: ${error instanceof Error ? error.message : String(error)}`
|
|
1232
|
+
);
|
|
1233
|
+
}
|
|
1234
|
+
return rollbackErrors.length === 0 ? projectResult : {
|
|
1235
|
+
success: false,
|
|
1236
|
+
error: `${projectResult.error ?? "Project config write failed"}; ${rollbackErrors.join("; ")}`
|
|
1237
|
+
};
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
} else if (level === "project") {
|
|
1241
|
+
const result = await this.writeProjectConfig({});
|
|
1242
|
+
if (!result.success) return result;
|
|
1243
|
+
}
|
|
1244
|
+
this.clearCache();
|
|
1245
|
+
return { success: true };
|
|
1246
|
+
} catch (error) {
|
|
1247
|
+
return {
|
|
1248
|
+
success: false,
|
|
1249
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
1250
|
+
};
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
/**
|
|
1254
|
+
* Export configuration for backup or sharing
|
|
1255
|
+
*
|
|
1256
|
+
* @param includeUserPreferences - Whether to include user preferences
|
|
1257
|
+
* @returns Export data
|
|
1258
|
+
*/
|
|
1259
|
+
async exportConfig(includeUserPreferences = false) {
|
|
1260
|
+
const config = await this.loadConfig();
|
|
1261
|
+
const result = {
|
|
1262
|
+
config: redactSensitiveConfig(config.config),
|
|
1263
|
+
metadata: {
|
|
1264
|
+
exportedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1265
|
+
version: "1.0",
|
|
1266
|
+
cwd: this.options.cwd
|
|
1267
|
+
}
|
|
1268
|
+
};
|
|
1269
|
+
if (includeUserPreferences) {
|
|
1270
|
+
const prefs = await this.loadUserPreferences();
|
|
1271
|
+
if (prefs) {
|
|
1272
|
+
result.preferences = redactSensitiveConfig(prefs);
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
return result;
|
|
1276
|
+
}
|
|
1277
|
+
/**
|
|
1278
|
+
* Import configuration from exported data
|
|
1279
|
+
*
|
|
1280
|
+
* @param exportData - Exported configuration data
|
|
1281
|
+
* @param importPreferences - Whether to import user preferences
|
|
1282
|
+
* @returns Success status
|
|
1283
|
+
*/
|
|
1284
|
+
async importConfig(exportData, importPreferences = false) {
|
|
1285
|
+
try {
|
|
1286
|
+
if (!exportData || typeof exportData !== "object" || !("config" in exportData) || !("metadata" in exportData)) {
|
|
1287
|
+
return { success: false, error: "Invalid export data format" };
|
|
1288
|
+
}
|
|
1289
|
+
const metadataResult = z.object({
|
|
1290
|
+
exportedAt: z.string().min(1),
|
|
1291
|
+
version: z.string().min(1),
|
|
1292
|
+
cwd: z.string()
|
|
1293
|
+
}).strict().safeParse(exportData.metadata);
|
|
1294
|
+
if (!metadataResult.success) {
|
|
1295
|
+
return {
|
|
1296
|
+
success: false,
|
|
1297
|
+
error: `Invalid export data format: ${metadataResult.error.issues.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`).join("; ")}`
|
|
1298
|
+
};
|
|
1299
|
+
}
|
|
1300
|
+
const unknownConfigRoots = exportData.config && typeof exportData.config === "object" && !Array.isArray(exportData.config) ? Object.keys(exportData.config).filter((key) => !KNOWN_POETIC_CONFIG_ROOTS.includes(key)) : [];
|
|
1301
|
+
if (unknownConfigRoots.length > 0) {
|
|
1302
|
+
return {
|
|
1303
|
+
success: false,
|
|
1304
|
+
error: `Invalid imported configuration: Unknown top-level configuration key(s): ${unknownConfigRoots.join(", ")}`
|
|
1305
|
+
};
|
|
1306
|
+
}
|
|
1307
|
+
const configResult = PoeticConfigSchema.safeParse(exportData.config);
|
|
1308
|
+
if (!configResult.success) {
|
|
1309
|
+
return {
|
|
1310
|
+
success: false,
|
|
1311
|
+
error: `Invalid imported configuration: ${configResult.error.issues.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`).join("; ")}`
|
|
1312
|
+
};
|
|
1313
|
+
}
|
|
1314
|
+
let validatedPreferences;
|
|
1315
|
+
let previousPreferences;
|
|
1316
|
+
if (importPreferences && exportData.preferences !== void 0) {
|
|
1317
|
+
const preferencesResult = UserPreferencesSchema.safeParse(exportData.preferences);
|
|
1318
|
+
if (!preferencesResult.success) {
|
|
1319
|
+
return {
|
|
1320
|
+
success: false,
|
|
1321
|
+
error: `Invalid imported preferences: ${preferencesResult.error.issues.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`).join("; ")}`
|
|
1322
|
+
};
|
|
1323
|
+
}
|
|
1324
|
+
validatedPreferences = preferencesResult.data;
|
|
1325
|
+
previousPreferences = snapshotUserPreferencesState(this.paths.userPreferencesFile);
|
|
1326
|
+
}
|
|
1327
|
+
if (validatedPreferences) {
|
|
1328
|
+
try {
|
|
1329
|
+
const prefResult = replaceUserPreferencesState(
|
|
1330
|
+
validatedPreferences,
|
|
1331
|
+
this.paths.userPreferencesFile
|
|
1332
|
+
);
|
|
1333
|
+
this.emitUserStateWarnings(prefResult.warnings);
|
|
1334
|
+
} catch (error) {
|
|
1335
|
+
return {
|
|
1336
|
+
success: false,
|
|
1337
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
1338
|
+
};
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
const result = await this.writeProjectConfig(configResult.data);
|
|
1342
|
+
if (!result.success) {
|
|
1343
|
+
if (previousPreferences) {
|
|
1344
|
+
try {
|
|
1345
|
+
restoreUserPreferencesState(previousPreferences, this.paths.userPreferencesFile);
|
|
1346
|
+
} catch (rollbackError) {
|
|
1347
|
+
return {
|
|
1348
|
+
success: false,
|
|
1349
|
+
error: `${result.error ?? "Project config write failed"}; preference rollback also failed: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`
|
|
1350
|
+
};
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
return result;
|
|
1354
|
+
}
|
|
1355
|
+
this.clearCache();
|
|
1356
|
+
return { success: true };
|
|
1357
|
+
} catch (error) {
|
|
1358
|
+
return {
|
|
1359
|
+
success: false,
|
|
1360
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
1361
|
+
};
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
};
|
|
1365
|
+
|
|
1366
|
+
export {
|
|
1367
|
+
preferencesFromUserState,
|
|
1368
|
+
mutateUserPreferencesState,
|
|
1369
|
+
writeUserPreferencesState,
|
|
1370
|
+
replaceUserPreferencesState,
|
|
1371
|
+
isPlaceholderModelDefault,
|
|
1372
|
+
ConfigManager
|
|
1373
|
+
};
|
|
1374
|
+
//# sourceMappingURL=chunk-H66DXFS5.js.map
|