@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.
Files changed (782) hide show
  1. package/.github/SECURITY.md +47 -0
  2. package/.nvmrc +1 -0
  3. package/.poetic/README.md +37 -0
  4. package/.poetic/providers/catalog.json +12051 -0
  5. package/.poetic/providers/pricing.json +1272 -0
  6. package/.poetic/providers/registry.json +3369 -0
  7. package/CHANGELOG.md +552 -0
  8. package/CODE_OF_CONDUCT.md +40 -0
  9. package/CONTRIBUTING.md +23 -0
  10. package/INSTALL.md +454 -0
  11. package/LICENSE +21 -0
  12. package/README.md +474 -0
  13. package/dist/BasicOptimizationCompetitionRunner-5H5TBYO4.js +153 -0
  14. package/dist/ExecutionTracker-UVONC4C6.js +16 -0
  15. package/dist/OptimizationConfig-7DFY2TST.js +17 -0
  16. package/dist/OptimizationEngine-JIMGP3LY.js +1597 -0
  17. package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
  18. package/dist/actions-LUJPINLJ.js +322 -0
  19. package/dist/agent-ingest-3DJUJ7FU.js +53 -0
  20. package/dist/aggregator-DNCBINFO.js +12 -0
  21. package/dist/ai-judge-5QT5QJVU.js +156 -0
  22. package/dist/allowlist-grounding-RO6HKUFI.js +16 -0
  23. package/dist/allowlist-utils-23V7TJ3G.js +28 -0
  24. package/dist/anchored-turn-service-JULUCUIK.js +489 -0
  25. package/dist/api-transport-4TYTNLTJ.js +1087 -0
  26. package/dist/apply-completion-mode-AW2MOS3R.js +89 -0
  27. package/dist/artifact-migrator-23L45ISD.js +267 -0
  28. package/dist/ask-HWVV6QFR.js +135 -0
  29. package/dist/auth-5KEDKAPP.js +67 -0
  30. package/dist/auth-7TT3JINV.js +78 -0
  31. package/dist/auth-E6XUNZ5M.js +68 -0
  32. package/dist/auth-H3XDZE22.js +134 -0
  33. package/dist/auth-OC4E6633.js +71 -0
  34. package/dist/auth-S4CTX4GQ.js +44 -0
  35. package/dist/auth-YLH3S7EY.js +69 -0
  36. package/dist/auth-liveness-TDDEZY3T.js +46 -0
  37. package/dist/auto-optimizer-VPRWOWGU.js +80 -0
  38. package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
  39. package/dist/autoloop-evidence-gates-PCDALGVJ.js +38 -0
  40. package/dist/autoloop-gate-policy-Z7FVJVXV.js +175 -0
  41. package/dist/autoloop-helpers-2KTK43GL.js +22 -0
  42. package/dist/autoloop-ledger-W7QO62PX.js +96 -0
  43. package/dist/autoloop-ledger-subscriber-Z5RW5EIE.js +162 -0
  44. package/dist/autoloop-run-defaults-FERGRZGP.js +19 -0
  45. package/dist/autoloop-run-lock-CT2NWSV3.js +197 -0
  46. package/dist/autoloop-success-J2VKKBXQ.js +85 -0
  47. package/dist/autoloop-termination-summary-RN75F422.js +58 -0
  48. package/dist/autoloop-trajectory-XFIEXP5Z.js +282 -0
  49. package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
  50. package/dist/autonomous-loop-controller-PW4XVFGQ.js +4120 -0
  51. package/dist/backend-P3DAYRP7.js +29 -0
  52. package/dist/background-executor-CBN552V4.js +257 -0
  53. package/dist/backlog-execution-intent-U4XYPTV6.js +15 -0
  54. package/dist/backup-active-store-5WXG6SXT.js +17 -0
  55. package/dist/backup-telemetry-db-XGLXAA3N.js +254 -0
  56. package/dist/basic-competition-master-VCSBJVRN.js +344 -0
  57. package/dist/branch-archive-manager-RP6FP3ZC.js +254 -0
  58. package/dist/branch-cleanup-manager-RSHAI7YR.js +20 -0
  59. package/dist/build-gate-YHGRB4QB.js +71 -0
  60. package/dist/change-summary-WY7J5TOX.js +33 -0
  61. package/dist/chunk-23A26CSN.js +123 -0
  62. package/dist/chunk-27UTJD3M.js +265 -0
  63. package/dist/chunk-2A5CILN3.js +310 -0
  64. package/dist/chunk-2AQUWJPW.js +225 -0
  65. package/dist/chunk-2BZ53J6J.js +2344 -0
  66. package/dist/chunk-2DY5KNVM.js +276 -0
  67. package/dist/chunk-2EIA4RBE.js +659 -0
  68. package/dist/chunk-2IUXIGQD.js +1064 -0
  69. package/dist/chunk-2N42MS2Z.js +2193 -0
  70. package/dist/chunk-2QJ3H3L7.js +42 -0
  71. package/dist/chunk-2QLYTVYX.js +791 -0
  72. package/dist/chunk-2VSQMRCB.js +18 -0
  73. package/dist/chunk-2XQXYBM2.js +130 -0
  74. package/dist/chunk-2YFUIER7.js +426 -0
  75. package/dist/chunk-34CNP2HB.js +148 -0
  76. package/dist/chunk-35P3W3JX.js +456 -0
  77. package/dist/chunk-36PEBZAF.js +18 -0
  78. package/dist/chunk-3AOKYKA7.js +22 -0
  79. package/dist/chunk-3BCUNHKF.js +475 -0
  80. package/dist/chunk-3FLXLLB7.js +26 -0
  81. package/dist/chunk-3FOZ2VHV.js +100 -0
  82. package/dist/chunk-3G6FZCRF.js +106 -0
  83. package/dist/chunk-3M57DADF.js +44 -0
  84. package/dist/chunk-3S62LLWJ.js +543 -0
  85. package/dist/chunk-3ZPQLGV7.js +2904 -0
  86. package/dist/chunk-44N5WZZH.js +45 -0
  87. package/dist/chunk-45FPSA3B.js +125 -0
  88. package/dist/chunk-4BJ3O4RQ.js +929 -0
  89. package/dist/chunk-4BOP7T6L.js +2321 -0
  90. package/dist/chunk-4BTDUT2S.js +42 -0
  91. package/dist/chunk-4CSS7WVI.js +143 -0
  92. package/dist/chunk-4CUY7AFY.js +247 -0
  93. package/dist/chunk-4GSN5O5J.js +62 -0
  94. package/dist/chunk-4HN6DF7V.js +1027 -0
  95. package/dist/chunk-4IAPOG5V.js +415 -0
  96. package/dist/chunk-4IYIZQWV.js +48 -0
  97. package/dist/chunk-4NXPXE62.js +84 -0
  98. package/dist/chunk-4RCCF5BR.js +712 -0
  99. package/dist/chunk-4V7NAQ4R.js +19527 -0
  100. package/dist/chunk-4VJITV4P.js +445 -0
  101. package/dist/chunk-4YX7J6QL.js +1859 -0
  102. package/dist/chunk-527OBWQB.js +338 -0
  103. package/dist/chunk-5D4A7E3D.js +448 -0
  104. package/dist/chunk-5DLKYTQX.js +4003 -0
  105. package/dist/chunk-5EERLVZB.js +139 -0
  106. package/dist/chunk-5H72XE4H.js +256 -0
  107. package/dist/chunk-5HDP7XZG.js +91 -0
  108. package/dist/chunk-5LAMRH4X.js +969 -0
  109. package/dist/chunk-5LTN43AS.js +1972 -0
  110. package/dist/chunk-5RBHQYDB.js +2206 -0
  111. package/dist/chunk-5WCQRDRB.js +588 -0
  112. package/dist/chunk-5WRLK5KW.js +700 -0
  113. package/dist/chunk-5ZCXC23G.js +595 -0
  114. package/dist/chunk-6BM72ZMG.js +31 -0
  115. package/dist/chunk-6EDAJH2I.js +68 -0
  116. package/dist/chunk-6EQKFDBH.js +457 -0
  117. package/dist/chunk-6MFRHTRI.js +115 -0
  118. package/dist/chunk-6TZJRKNW.js +321 -0
  119. package/dist/chunk-6V7HGQFZ.js +20 -0
  120. package/dist/chunk-6VWVO2TU.js +3746 -0
  121. package/dist/chunk-6Y5TWI7H.js +146 -0
  122. package/dist/chunk-6Y5U7UFY.js +91 -0
  123. package/dist/chunk-6ZLAK3XG.js +14 -0
  124. package/dist/chunk-72XCRQED.js +34 -0
  125. package/dist/chunk-72YTZMAM.js +589 -0
  126. package/dist/chunk-73BBJOKA.js +263 -0
  127. package/dist/chunk-73NCTWKL.js +188 -0
  128. package/dist/chunk-77I6G4CO.js +1 -0
  129. package/dist/chunk-7DHRDWFS.js +3104 -0
  130. package/dist/chunk-7DNSNKJV.js +78 -0
  131. package/dist/chunk-7FMJVYBS.js +307 -0
  132. package/dist/chunk-7GDRQBQC.js +419 -0
  133. package/dist/chunk-7GPCEFUV.js +270 -0
  134. package/dist/chunk-7IL4A2PP.js +948 -0
  135. package/dist/chunk-7MMLMXO6.js +3679 -0
  136. package/dist/chunk-7QCZSLBH.js +1 -0
  137. package/dist/chunk-7R2WLDOS.js +62 -0
  138. package/dist/chunk-7T7RUJI7.js +949 -0
  139. package/dist/chunk-A2WKSVX7.js +43 -0
  140. package/dist/chunk-A3YGID55.js +133 -0
  141. package/dist/chunk-A722DEVA.js +14 -0
  142. package/dist/chunk-ACDIT7OP.js +1376 -0
  143. package/dist/chunk-ACKIPAOJ.js +302 -0
  144. package/dist/chunk-APPNGGN7.js +365 -0
  145. package/dist/chunk-APV6MK5E.js +137 -0
  146. package/dist/chunk-ASEP3M2W.js +968 -0
  147. package/dist/chunk-AT4TNPWW.js +2931 -0
  148. package/dist/chunk-ATVKCSGT.js +250 -0
  149. package/dist/chunk-AURFMVCD.js +899 -0
  150. package/dist/chunk-AX6GWE7V.js +47 -0
  151. package/dist/chunk-AY5EWJPF.js +385 -0
  152. package/dist/chunk-BAV2HJXS.js +194 -0
  153. package/dist/chunk-BBHRN366.js +89 -0
  154. package/dist/chunk-BBPSTTPA.js +1004 -0
  155. package/dist/chunk-BDATUDDJ.js +992 -0
  156. package/dist/chunk-BKE5PG5L.js +20414 -0
  157. package/dist/chunk-BLPHWMDK.js +797 -0
  158. package/dist/chunk-BSE4R6XD.js +322 -0
  159. package/dist/chunk-BXGMAU4A.js +396 -0
  160. package/dist/chunk-BXI4NXL3.js +507 -0
  161. package/dist/chunk-BZU2O43F.js +1125 -0
  162. package/dist/chunk-C3L6YQ7P.js +147 -0
  163. package/dist/chunk-C57KJOUQ.js +121 -0
  164. package/dist/chunk-CCV7BPSY.js +118 -0
  165. package/dist/chunk-CD7ISXA4.js +826 -0
  166. package/dist/chunk-CE5OZBYY.js +21 -0
  167. package/dist/chunk-CFBIG37O.js +154 -0
  168. package/dist/chunk-CJC6GZ46.js +457 -0
  169. package/dist/chunk-CKCDGXIV.js +408 -0
  170. package/dist/chunk-CKNX3TTP.js +10338 -0
  171. package/dist/chunk-CLKSETWE.js +10 -0
  172. package/dist/chunk-CP7H3HSP.js +1552 -0
  173. package/dist/chunk-CPLEWXNZ.js +66 -0
  174. package/dist/chunk-CQM3A35X.js +844 -0
  175. package/dist/chunk-CS6P76D3.js +103 -0
  176. package/dist/chunk-CTLUBNCW.js +622 -0
  177. package/dist/chunk-CUSRN6RJ.js +632 -0
  178. package/dist/chunk-D5EP5D2W.js +26 -0
  179. package/dist/chunk-D5RYINO7.js +412 -0
  180. package/dist/chunk-DBFS4HMH.js +751 -0
  181. package/dist/chunk-DC4ZYMXJ.js +115 -0
  182. package/dist/chunk-DCBZP442.js +9243 -0
  183. package/dist/chunk-DCYF7EKG.js +26 -0
  184. package/dist/chunk-DDMAFNUK.js +5351 -0
  185. package/dist/chunk-DF5SLDE4.js +966 -0
  186. package/dist/chunk-DJFW7SMX.js +348 -0
  187. package/dist/chunk-DQFLLBJW.js +121 -0
  188. package/dist/chunk-DSFM56OA.js +1203 -0
  189. package/dist/chunk-DTY4APYV.js +218 -0
  190. package/dist/chunk-DXH5JBRS.js +437 -0
  191. package/dist/chunk-E3NTPHEO.js +194 -0
  192. package/dist/chunk-E74LUIID.js +302 -0
  193. package/dist/chunk-EI57M5BI.js +194 -0
  194. package/dist/chunk-EJ4ZAWLV.js +305 -0
  195. package/dist/chunk-EJGCZGUF.js +1483 -0
  196. package/dist/chunk-EK2U3YEG.js +486 -0
  197. package/dist/chunk-ELMFYNV7.js +109 -0
  198. package/dist/chunk-ENRGKNR5.js +25 -0
  199. package/dist/chunk-ETYDXCK7.js +679 -0
  200. package/dist/chunk-EYRH3W74.js +239 -0
  201. package/dist/chunk-F23DIWNN.js +1024 -0
  202. package/dist/chunk-F5JO7HAS.js +94 -0
  203. package/dist/chunk-F7ER6ANO.js +174 -0
  204. package/dist/chunk-FATUVIIN.js +374 -0
  205. package/dist/chunk-FC23CTXV.js +322 -0
  206. package/dist/chunk-FD4ERYEG.js +22 -0
  207. package/dist/chunk-FH7WOJAE.js +79 -0
  208. package/dist/chunk-FHOWVDF5.js +1342 -0
  209. package/dist/chunk-FKAUPHMR.js +96 -0
  210. package/dist/chunk-FONNFJXA.js +137 -0
  211. package/dist/chunk-FQ7FSZRW.js +75 -0
  212. package/dist/chunk-FRG57FPM.js +240 -0
  213. package/dist/chunk-FUVP64ER.js +31 -0
  214. package/dist/chunk-FYOILAN5.js +6818 -0
  215. package/dist/chunk-G35UYQ6Z.js +69 -0
  216. package/dist/chunk-G36W2T2S.js +1143 -0
  217. package/dist/chunk-G3L2L5XZ.js +49 -0
  218. package/dist/chunk-G4THLFV3.js +148 -0
  219. package/dist/chunk-GAFJEYLK.js +29 -0
  220. package/dist/chunk-GFGYB2ZU.js +1689 -0
  221. package/dist/chunk-GG6KJYW6.js +85 -0
  222. package/dist/chunk-GHHFDU2U.js +55 -0
  223. package/dist/chunk-GHTZSQB7.js +57 -0
  224. package/dist/chunk-GK37ILCX.js +1231 -0
  225. package/dist/chunk-GKN3HMN4.js +2809 -0
  226. package/dist/chunk-GNVDBVJP.js +156 -0
  227. package/dist/chunk-GPEL3FBM.js +924 -0
  228. package/dist/chunk-GPSNGPZS.js +1604 -0
  229. package/dist/chunk-GSGD5E4C.js +30 -0
  230. package/dist/chunk-GSUQJJXQ.js +331 -0
  231. package/dist/chunk-GSV226X6.js +110 -0
  232. package/dist/chunk-H2AYQIHW.js +224 -0
  233. package/dist/chunk-H66DXFS5.js +1374 -0
  234. package/dist/chunk-H6G7QRMQ.js +35 -0
  235. package/dist/chunk-H7JAGHZT.js +59 -0
  236. package/dist/chunk-H7ZEFECA.js +316 -0
  237. package/dist/chunk-HAC6EHZZ.js +79 -0
  238. package/dist/chunk-HIO33P3G.js +19 -0
  239. package/dist/chunk-HMVQIPH3.js +547 -0
  240. package/dist/chunk-HOYBYAOA.js +257 -0
  241. package/dist/chunk-HX5P3CSP.js +1784 -0
  242. package/dist/chunk-I46EG2XQ.js +65 -0
  243. package/dist/chunk-I4NPDSCB.js +279 -0
  244. package/dist/chunk-I5WRT7ZR.js +514 -0
  245. package/dist/chunk-IC7I6YIJ.js +301 -0
  246. package/dist/chunk-IDCSOZVN.js +78 -0
  247. package/dist/chunk-IFCBYECK.js +112 -0
  248. package/dist/chunk-IFZCPEY2.js +66 -0
  249. package/dist/chunk-IKFP2KUR.js +48 -0
  250. package/dist/chunk-IRFBN336.js +878 -0
  251. package/dist/chunk-IUXNGKA6.js +152 -0
  252. package/dist/chunk-IV2RVAN7.js +1356 -0
  253. package/dist/chunk-IZYIQQ7X.js +53 -0
  254. package/dist/chunk-J3UUR7DE.js +210 -0
  255. package/dist/chunk-J54VUAY2.js +566 -0
  256. package/dist/chunk-J62KPGII.js +464 -0
  257. package/dist/chunk-J6P3FWWW.js +130 -0
  258. package/dist/chunk-JKBHJQMT.js +434 -0
  259. package/dist/chunk-JLS65NUQ.js +14 -0
  260. package/dist/chunk-JOSYEJKY.js +141 -0
  261. package/dist/chunk-JPKSXKNB.js +94 -0
  262. package/dist/chunk-JQNJB2BB.js +2440 -0
  263. package/dist/chunk-JRVNSWSQ.js +2626 -0
  264. package/dist/chunk-JSWMRQYG.js +28 -0
  265. package/dist/chunk-JZKNBBIB.js +152 -0
  266. package/dist/chunk-K54Y7MLK.js +160 -0
  267. package/dist/chunk-K65546RE.js +183 -0
  268. package/dist/chunk-KM3F7SYE.js +702 -0
  269. package/dist/chunk-KNDYMVWN.js +102 -0
  270. package/dist/chunk-KNT72VR6.js +132 -0
  271. package/dist/chunk-KP6YILMU.js +482 -0
  272. package/dist/chunk-KQEBSK3T.js +274 -0
  273. package/dist/chunk-KT6VHSPF.js +84 -0
  274. package/dist/chunk-KTMW65UX.js +14 -0
  275. package/dist/chunk-KZ5CJVBP.js +1813 -0
  276. package/dist/chunk-L4427KOE.js +26 -0
  277. package/dist/chunk-L6OM4A22.js +189 -0
  278. package/dist/chunk-L7E6XCRA.js +1042 -0
  279. package/dist/chunk-L7JZLXQL.js +173 -0
  280. package/dist/chunk-LAMKBTXX.js +40 -0
  281. package/dist/chunk-LDCF2MKN.js +132 -0
  282. package/dist/chunk-LEIIWPWQ.js +78 -0
  283. package/dist/chunk-LFTQVYBB.js +31 -0
  284. package/dist/chunk-LG3PDRTR.js +2872 -0
  285. package/dist/chunk-LGHII5ET.js +23 -0
  286. package/dist/chunk-LH5QY22X.js +1205 -0
  287. package/dist/chunk-LIVJ6266.js +438 -0
  288. package/dist/chunk-LKRAR3IH.js +276 -0
  289. package/dist/chunk-LO23NABI.js +3063 -0
  290. package/dist/chunk-LO3X5NLS.js +326 -0
  291. package/dist/chunk-LPITVM7M.js +339 -0
  292. package/dist/chunk-LR5IJIGV.js +810 -0
  293. package/dist/chunk-LRGMHROI.js +79 -0
  294. package/dist/chunk-LUVKFFWR.js +315 -0
  295. package/dist/chunk-LWCBNGH6.js +35 -0
  296. package/dist/chunk-LWTN3WRV.js +260 -0
  297. package/dist/chunk-M3HQYKQX.js +308 -0
  298. package/dist/chunk-M6GVSPEH.js +1016 -0
  299. package/dist/chunk-MF5HP6XV.js +221 -0
  300. package/dist/chunk-MHLCBZJB.js +328 -0
  301. package/dist/chunk-MN6PL4AN.js +120 -0
  302. package/dist/chunk-MOEY65Z6.js +5678 -0
  303. package/dist/chunk-MQ4WA34C.js +206 -0
  304. package/dist/chunk-MWHF5V7U.js +223 -0
  305. package/dist/chunk-MWHLBPNU.js +211 -0
  306. package/dist/chunk-MWK5UZQ3.js +1068 -0
  307. package/dist/chunk-MYLH2S4G.js +64 -0
  308. package/dist/chunk-MZ5WYKNA.js +28 -0
  309. package/dist/chunk-N4VTRA7K.js +131 -0
  310. package/dist/chunk-N5DX4JAK.js +12 -0
  311. package/dist/chunk-N65O4XTH.js +5011 -0
  312. package/dist/chunk-NEQUQHOX.js +223 -0
  313. package/dist/chunk-NGK6PEOG.js +25 -0
  314. package/dist/chunk-NJVD4PWE.js +1033 -0
  315. package/dist/chunk-NM6PMYY4.js +768 -0
  316. package/dist/chunk-NN4PJDHP.js +708 -0
  317. package/dist/chunk-NP2V3L7K.js +226 -0
  318. package/dist/chunk-NRLY536M.js +260 -0
  319. package/dist/chunk-NRNE225N.js +1270 -0
  320. package/dist/chunk-NS2K2GTP.js +605 -0
  321. package/dist/chunk-NS33V3IM.js +51 -0
  322. package/dist/chunk-NSHASMZZ.js +71 -0
  323. package/dist/chunk-NWOYOA6H.js +378 -0
  324. package/dist/chunk-NWRUSEXG.js +322 -0
  325. package/dist/chunk-NZGDAWIP.js +1905 -0
  326. package/dist/chunk-O47UOKU3.js +395 -0
  327. package/dist/chunk-O4G2W3ST.js +9831 -0
  328. package/dist/chunk-O6V4PNLO.js +63 -0
  329. package/dist/chunk-OA4GPILI.js +624 -0
  330. package/dist/chunk-OGMSYL6J.js +227 -0
  331. package/dist/chunk-OIS7J26S.js +319 -0
  332. package/dist/chunk-OMX5VL43.js +79 -0
  333. package/dist/chunk-ON3G73BU.js +264 -0
  334. package/dist/chunk-OPYFYTWQ.js +220 -0
  335. package/dist/chunk-OQ6K46CK.js +1734 -0
  336. package/dist/chunk-OYZYO7TV.js +47 -0
  337. package/dist/chunk-OZ4REHIN.js +4386 -0
  338. package/dist/chunk-P47VN5F4.js +282 -0
  339. package/dist/chunk-P5I4X7A7.js +353 -0
  340. package/dist/chunk-P6VQROCO.js +594 -0
  341. package/dist/chunk-P7CQGPLS.js +30 -0
  342. package/dist/chunk-PCAGC5MR.js +1763 -0
  343. package/dist/chunk-PFTQBXS6.js +5181 -0
  344. package/dist/chunk-PGSPX4SU.js +15 -0
  345. package/dist/chunk-PIKLF7BM.js +432 -0
  346. package/dist/chunk-PJWJ3SAV.js +22 -0
  347. package/dist/chunk-PKIFMV72.js +100 -0
  348. package/dist/chunk-PL37JDNA.js +189 -0
  349. package/dist/chunk-PTH5E5XO.js +195 -0
  350. package/dist/chunk-PW6AXLQC.js +4128 -0
  351. package/dist/chunk-PYITM4N2.js +79 -0
  352. package/dist/chunk-PZ5AY32C.js +10 -0
  353. package/dist/chunk-Q3RO7N35.js +45 -0
  354. package/dist/chunk-Q3WIC6GQ.js +2670 -0
  355. package/dist/chunk-Q5XIXSHX.js +271 -0
  356. package/dist/chunk-QGJDMEOV.js +34 -0
  357. package/dist/chunk-QNOB37UH.js +58 -0
  358. package/dist/chunk-QOCOVLUH.js +462 -0
  359. package/dist/chunk-QTCJ5CC5.js +172 -0
  360. package/dist/chunk-QVFV5IP2.js +232 -0
  361. package/dist/chunk-QVZMFDYG.js +29 -0
  362. package/dist/chunk-R35PEUKH.js +511 -0
  363. package/dist/chunk-R4UWBC35.js +200 -0
  364. package/dist/chunk-R6MLCREW.js +44 -0
  365. package/dist/chunk-R6W23LKN.js +254 -0
  366. package/dist/chunk-R7XDDX2A.js +4007 -0
  367. package/dist/chunk-RDFRCT64.js +168 -0
  368. package/dist/chunk-RE5VZDFQ.js +58 -0
  369. package/dist/chunk-RGROYC2G.js +638 -0
  370. package/dist/chunk-RGWHUI5E.js +68 -0
  371. package/dist/chunk-RHVG6UNL.js +205 -0
  372. package/dist/chunk-RI4EX2QE.js +18 -0
  373. package/dist/chunk-RJAAKDRX.js +17 -0
  374. package/dist/chunk-ROMHOSMQ.js +185 -0
  375. package/dist/chunk-RWREC3KJ.js +517 -0
  376. package/dist/chunk-RYNETRDJ.js +118 -0
  377. package/dist/chunk-RZY7RKM5.js +500 -0
  378. package/dist/chunk-S2MNWFAG.js +52 -0
  379. package/dist/chunk-S2VQCZO4.js +22 -0
  380. package/dist/chunk-S54MKU6V.js +117 -0
  381. package/dist/chunk-S5OIDFRM.js +302 -0
  382. package/dist/chunk-SCW4ZF6R.js +150 -0
  383. package/dist/chunk-SLS2N4PH.js +2213 -0
  384. package/dist/chunk-SNLBO4BF.js +247 -0
  385. package/dist/chunk-SP3LFU6B.js +60 -0
  386. package/dist/chunk-SQQTDDQA.js +537 -0
  387. package/dist/chunk-STV6LYYE.js +45 -0
  388. package/dist/chunk-SURZ2WFE.js +326 -0
  389. package/dist/chunk-SZ7DL357.js +1047 -0
  390. package/dist/chunk-T5E4NQCM.js +5742 -0
  391. package/dist/chunk-TAJPCXSB.js +13 -0
  392. package/dist/chunk-TAOOYK3P.js +358 -0
  393. package/dist/chunk-TDSEX5CF.js +24 -0
  394. package/dist/chunk-TFTGP7Z7.js +174 -0
  395. package/dist/chunk-TGON4N4O.js +197 -0
  396. package/dist/chunk-TGQZHDY2.js +2373 -0
  397. package/dist/chunk-TJJZ2OKV.js +6783 -0
  398. package/dist/chunk-TRSVUPCX.js +25 -0
  399. package/dist/chunk-TSXGRLPR.js +107 -0
  400. package/dist/chunk-U2S3YEX3.js +224 -0
  401. package/dist/chunk-U45RTRGY.js +818 -0
  402. package/dist/chunk-U6C3VVWS.js +13 -0
  403. package/dist/chunk-UDMS5AD3.js +307 -0
  404. package/dist/chunk-UGX7GI37.js +94 -0
  405. package/dist/chunk-UH3JJSHK.js +1 -0
  406. package/dist/chunk-UHRBTZYY.js +208 -0
  407. package/dist/chunk-UHT2KRG5.js +193 -0
  408. package/dist/chunk-UI2F6DJ5.js +118 -0
  409. package/dist/chunk-UMAKSB4Z.js +284 -0
  410. package/dist/chunk-UR2IBGIM.js +521 -0
  411. package/dist/chunk-UUH2RVKS.js +585 -0
  412. package/dist/chunk-UVJ4PJDK.js +4533 -0
  413. package/dist/chunk-V53UG2OT.js +9924 -0
  414. package/dist/chunk-V72RMBM4.js +48 -0
  415. package/dist/chunk-VBNCKCCI.js +16 -0
  416. package/dist/chunk-VNSYKC25.js +24 -0
  417. package/dist/chunk-VPHVFK4A.js +1984 -0
  418. package/dist/chunk-VTLNJQ44.js +133 -0
  419. package/dist/chunk-VTW7HP3R.js +100 -0
  420. package/dist/chunk-VVGEPBPS.js +218 -0
  421. package/dist/chunk-VVLLL7I4.js +166 -0
  422. package/dist/chunk-VX3UMWB7.js +483 -0
  423. package/dist/chunk-VXF4Q3FW.js +20 -0
  424. package/dist/chunk-W3JMT2YY.js +712 -0
  425. package/dist/chunk-WDUORIHF.js +877 -0
  426. package/dist/chunk-WDVTY4U6.js +148 -0
  427. package/dist/chunk-WIFZCHEG.js +12566 -0
  428. package/dist/chunk-WIRN3F75.js +736 -0
  429. package/dist/chunk-WMPU2UOV.js +82 -0
  430. package/dist/chunk-WTOKKE2V.js +784 -0
  431. package/dist/chunk-WX5IRLF6.js +740 -0
  432. package/dist/chunk-WZ6U3O7I.js +1581 -0
  433. package/dist/chunk-XAONGNST.js +57 -0
  434. package/dist/chunk-XB5YLCLB.js +13 -0
  435. package/dist/chunk-XEP5NQ5Y.js +688 -0
  436. package/dist/chunk-XGYF2QMZ.js +351 -0
  437. package/dist/chunk-XHEKQENB.js +255 -0
  438. package/dist/chunk-XNO4FM6X.js +1124 -0
  439. package/dist/chunk-XPHKYHO4.js +878 -0
  440. package/dist/chunk-XPK2I4NC.js +405 -0
  441. package/dist/chunk-XPU2XADL.js +2175 -0
  442. package/dist/chunk-XQD2B6BB.js +507 -0
  443. package/dist/chunk-XT2ZQVTC.js +558 -0
  444. package/dist/chunk-XTXJGGUV.js +351 -0
  445. package/dist/chunk-XUXVDPSZ.js +50 -0
  446. package/dist/chunk-XV7NZL4B.js +57 -0
  447. package/dist/chunk-XZE4XARH.js +563 -0
  448. package/dist/chunk-XZYR5EDO.js +152 -0
  449. package/dist/chunk-Y3J4JMTU.js +61 -0
  450. package/dist/chunk-Y55LZN5U.js +52 -0
  451. package/dist/chunk-Y5VN7DMP.js +112 -0
  452. package/dist/chunk-Y67VAHN4.js +459 -0
  453. package/dist/chunk-YAXSKEUH.js +3544 -0
  454. package/dist/chunk-YB3JD4E6.js +975 -0
  455. package/dist/chunk-YESZJFK6.js +220 -0
  456. package/dist/chunk-YGXKOBQQ.js +292 -0
  457. package/dist/chunk-YMX76IOS.js +31 -0
  458. package/dist/chunk-YOTXESEH.js +257 -0
  459. package/dist/chunk-YTYIEZQY.js +119 -0
  460. package/dist/chunk-YVORHQ2S.js +579 -0
  461. package/dist/chunk-Z2CUQDAR.js +3429 -0
  462. package/dist/chunk-Z2KYOFHS.js +7000 -0
  463. package/dist/chunk-Z6PC7QX6.js +161 -0
  464. package/dist/chunk-ZDTGECTN.js +235 -0
  465. package/dist/chunk-ZIPWI2LY.js +151 -0
  466. package/dist/chunk-ZSKKMTQJ.js +554 -0
  467. package/dist/chunk-ZTT5IVPY.js +1160 -0
  468. package/dist/chunk-ZX65UI5W.js +78 -0
  469. package/dist/chunk-ZYG7GGKO.js +218 -0
  470. package/dist/chunk-ZZZUL4OF.js +38 -0
  471. package/dist/cli-utils-IXL26KJT.js +40 -0
  472. package/dist/cli-validation-WLXWLUJL.js +111 -0
  473. package/dist/commit-utils-P7CRJF5N.js +202 -0
  474. package/dist/compete-config-resolver-R5ULXMYH.js +76 -0
  475. package/dist/compete-request-62JESVET.js +364 -0
  476. package/dist/compete-results-QEPG6FZX.js +208 -0
  477. package/dist/competition-outcome-tracker-R32OOZ43.js +38 -0
  478. package/dist/config-JCOKXOQT.js +166 -0
  479. package/dist/config-audit-EL3GHXS7.js +360 -0
  480. package/dist/config-explain-TNILDEVJ.js +12 -0
  481. package/dist/config-loader-VPFPFO4B.js +38 -0
  482. package/dist/config-manager-7T4E2BQO.js +67 -0
  483. package/dist/config-validator-KKOHOW7O.js +72 -0
  484. package/dist/cost-YC42XUF3.js +53 -0
  485. package/dist/coverage-orchestrator-CISNKJC2.js +772 -0
  486. package/dist/coverage-scanner-YVD62MLH.js +12 -0
  487. package/dist/createCompetitionRunner-LJG6ZQSO.js +46 -0
  488. package/dist/data-migration-state-VJK64DLT.js +31 -0
  489. package/dist/db-migrator-XSEIOGWY.js +34 -0
  490. package/dist/discovery-JGYGDD25.js +25 -0
  491. package/dist/doctor-GJOYE7AE.js +186 -0
  492. package/dist/domain-analyzer-AWF3RP6E.js +29 -0
  493. package/dist/ensure-initialized-744DIZEZ.js +52 -0
  494. package/dist/entry.js +940 -0
  495. package/dist/environment-YS45U5ZI.js +81 -0
  496. package/dist/error-parser-core-PPZ36A4S.js +50 -0
  497. package/dist/escalation-ladder-MKTCEGSA.js +130 -0
  498. package/dist/evaluation-context-KV4GZNN7.js +35 -0
  499. package/dist/evidence-plan-resolver-GBSYSAPX.js +85 -0
  500. package/dist/execution-data-writer-3ODTBDLH.js +53 -0
  501. package/dist/execution-policy-applier-ZHD3DCF3.js +31 -0
  502. package/dist/execution-preflight-Z4Y64V3I.js +209 -0
  503. package/dist/execution-roles-R3DPPMD3.js +66 -0
  504. package/dist/exit-code-error-Z4SW2DVK.js +14 -0
  505. package/dist/external-temp-cleanup-N2RZH4QP.js +311 -0
  506. package/dist/factory-XBN7DFIM.js +149 -0
  507. package/dist/file-utils-XIVR2ZMA.js +47 -0
  508. package/dist/flywheel-autoloop-executor-UILGOFFK.js +249 -0
  509. package/dist/flywheel-competition-executor-JOBEXTRB.js +259 -0
  510. package/dist/flywheel-executor-6JFLA6J5.js +369 -0
  511. package/dist/flywheel-git-isolation-UC5NIEVU.js +48 -0
  512. package/dist/flywheel-manifest-5UC4VBMA.js +108 -0
  513. package/dist/flywheel-model-defaults-7CVKP53V.js +27 -0
  514. package/dist/flywheel-preflight-XEY5SHM6.js +104 -0
  515. package/dist/flywheel-resume-7HELH7QS.js +23 -0
  516. package/dist/flywheel-safety-7U7DPOAP.js +28 -0
  517. package/dist/flywheel-scope-decision-ZHKF6ZIN.js +11 -0
  518. package/dist/get-telemetry-logger-DPVWWIYY.js +73 -0
  519. package/dist/git-worktree-IY6V6DUO.js +18 -0
  520. package/dist/github-pr-manager-4LXEKJTA.js +211 -0
  521. package/dist/guidance-profile-config-E7XJL2VP.js +117 -0
  522. package/dist/guidance-profile-renderer-QK2YMAAP.js +21 -0
  523. package/dist/index-query-4JEUKA44.js +31 -0
  524. package/dist/index.js +108661 -0
  525. package/dist/instructions-6BURLQJC.js +64 -0
  526. package/dist/invoke-provider-auth-GRUYP44M.js +223 -0
  527. package/dist/judge-scoring.json +80 -0
  528. package/dist/judge-test.js +555 -0
  529. package/dist/lab-mode-OTWVHN63.js +39 -0
  530. package/dist/lab-utils-BJRFLGK4.js +23 -0
  531. package/dist/linux-host-class-UY4KVLFD.js +29 -0
  532. package/dist/llm-judge-executor-F7Z3HO77.js +133 -0
  533. package/dist/local-executor-CEHWE2PL.js +223 -0
  534. package/dist/logger-33TR6EE5.js +72 -0
  535. package/dist/loop-spec-XTLQAVZ7.js +191 -0
  536. package/dist/manager-2HJG5CLT.js +25 -0
  537. package/dist/matrix-prompt-builder-6UDN5X3F.js +497 -0
  538. package/dist/matrix-result-parser-7W35EUOV.js +15 -0
  539. package/dist/metadata-HQ43NDEK.js +22 -0
  540. package/dist/model-invocations-db-QBO4Y7WZ.js +38 -0
  541. package/dist/monitor-XGYBG2DW.js +72 -0
  542. package/dist/next-PB5ZXZKB.js +90 -0
  543. package/dist/next-ZBDK725T.js +69 -0
  544. package/dist/optimization-config-resolver-O6WKR47U.js +75 -0
  545. package/dist/package-3YCWIQQ5.js +10 -0
  546. package/dist/parallel-orchestrator-NL7YJJU2.js +297 -0
  547. package/dist/parallel-worker.js +279 -0
  548. package/dist/parse-git-status-PIAF3OTP.js +10 -0
  549. package/dist/path-security-ETTH6TZL.js +39 -0
  550. package/dist/pattern-bank-UNJR5ADV.js +15 -0
  551. package/dist/plan-backlog-list-fast-VAGYBV3J.js +270 -0
  552. package/dist/plan-backlog-show-fast-SG2CZPW3.js +406 -0
  553. package/dist/plan-sprint-list-fast-LURAX47V.js +162 -0
  554. package/dist/plan-sprint-status-fast-FJAODCHD.js +208 -0
  555. package/dist/plan-task-status-fast-HNYBMQI4.js +349 -0
  556. package/dist/plan-to-flywheel-Z4U3GWPN.js +456 -0
  557. package/dist/planning-backlog-3CQ5QQBQ.js +319 -0
  558. package/dist/poetic-root-V5DNXEAE.js +17 -0
  559. package/dist/preflight-OPANWMME.js +12 -0
  560. package/dist/process-registry-PDZJPTAS.js +27 -0
  561. package/dist/process-scanner-C22SYXYD.js +22 -0
  562. package/dist/processes-KMQUD7HY.js +29 -0
  563. package/dist/processes-json-fast-IBDXZ6WW.js +135 -0
  564. package/dist/profile-SE5EVXAP.js +149 -0
  565. package/dist/prompts-WZZPGWBX.js +168 -0
  566. package/dist/protected-branches-RNTEX7ET.js +57 -0
  567. package/dist/provider-aware-resource-manager-QBTZJMNP.js +18 -0
  568. package/dist/provider-matrix-N5X57V3Y.js +154 -0
  569. package/dist/provider-matrix-renderer-MZDWKKID.js +139 -0
  570. package/dist/provider-output-forwarding-DERID3TP.js +30 -0
  571. package/dist/provider-registry-J5NRBJKI.js +128 -0
  572. package/dist/provider-temp-cleanup-KYGLF6YU.js +14 -0
  573. package/dist/prune-engine-Q6E2DXBN.js +451 -0
  574. package/dist/quality-gate-YRHMQAEI.js +70 -0
  575. package/dist/quickstart-FIRLKGJI.js +62 -0
  576. package/dist/readiness-VZTMSG6J.js +96 -0
  577. package/dist/registry-YODFY77A.js +153 -0
  578. package/dist/repair-helpers-TTV5FEF4.js +117 -0
  579. package/dist/repo-root-2IGD4H7X.js +22 -0
  580. package/dist/resolution-engine-D6TX6FRG.js +127 -0
  581. package/dist/resolve-provider-cli-O2P6XZBZ.js +35 -0
  582. package/dist/restore-telemetry-db-BQL6DTQF.js +360 -0
  583. package/dist/result-streamer-WEHW476R.js +19 -0
  584. package/dist/routing-events-DHPUZDDF.js +27 -0
  585. package/dist/routing-history-store-UWCEXAP3.js +46 -0
  586. package/dist/routing-planner-F5WQEUOM.js +160 -0
  587. package/dist/run-poetic-tui-J6LWRJUP.js +13517 -0
  588. package/dist/run-simulation.js +376 -0
  589. package/dist/runner-CS2TNGHA.js +1092 -0
  590. package/dist/runner-HHH7ZN2Z.js +1571 -0
  591. package/dist/safety-OCC4KJJR.js +64 -0
  592. package/dist/safety-stanza-7SV3HGG3.js +60 -0
  593. package/dist/sandbox-32QXJEMV.js +81 -0
  594. package/dist/sandbox-RSO7VP6V.js +94 -0
  595. package/dist/schema-extensions.sql +234 -0
  596. package/dist/security-2KI5XNDG.js +17 -0
  597. package/dist/setup-bb-plugin-QAQWZCV5.js +738 -0
  598. package/dist/setup-claude-code-P7BTTSPO.js +317 -0
  599. package/dist/setup-temp-cleanup-GASCWZ2I.js +20 -0
  600. package/dist/shared-utils-D6U6UREP.js +37 -0
  601. package/dist/simple-artifact-goal-OTXNGZY6.js +25 -0
  602. package/dist/sprint-UIXPYOXQ.js +338 -0
  603. package/dist/sprint-bridge-4BHMSC3M.js +68 -0
  604. package/dist/sprint-execution-service-2B7WHL5L.js +311 -0
  605. package/dist/sprint-manager-IDQUDNQI.js +91 -0
  606. package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
  607. package/dist/stale-cleanup-orchestrator-XWXV7KCZ.js +62 -0
  608. package/dist/storage-access-F6ALDN4S.js +22 -0
  609. package/dist/synthesis-XD6EDVHF.js +185 -0
  610. package/dist/task-classifier-LNLXSHOM.js +494 -0
  611. package/dist/task-list-fast-PTMA4LUC.js +147 -0
  612. package/dist/task-manager-XAT7GOWB.js +93 -0
  613. package/dist/task-splitter-U7DJ7W6A.js +79 -0
  614. package/dist/task-type-detector-OLVOMXZO.js +21 -0
  615. package/dist/task-type-resolver-KKNQYSB4.js +42 -0
  616. package/dist/telemetry-5HWBBXLX.js +131 -0
  617. package/dist/telemetry-health-tracker-DMSSGBZ2.js +11 -0
  618. package/dist/telemetry-path-resolver-7ICSG276.js +28 -0
  619. package/dist/telemetry-reliability-XUOZNZZ6.js +125 -0
  620. package/dist/token-estimator-MEQUL3EJ.js +37 -0
  621. package/dist/transports-KNSSV2V4.js +255 -0
  622. package/dist/unified-cost-tracker-4TFRBVPR.js +35 -0
  623. package/dist/unified-state-cleanup-LJPF2BOW.js +276 -0
  624. package/dist/universal-cost-calculator-BAJV35GA.js +42 -0
  625. package/dist/user-agents-GHUGCSKN.js +22 -0
  626. package/dist/variant-delivery-state-KLRNG6XA.js +33 -0
  627. package/dist/variant-state-cleanup-MZGGLQAJ.js +280 -0
  628. package/dist/variant-success-PJXWE3ZV.js +12 -0
  629. package/dist/variant-worker-KUWKBLAH.js +4196 -0
  630. package/dist/variant-worker.js +24 -0
  631. package/dist/variants-JE2FSAQS.js +233 -0
  632. package/dist/verification-toolchains-V24UHW6Q.js +28 -0
  633. package/dist/verify-commands-H3DTCSGI.js +37 -0
  634. package/dist/warning-EGQGUUIO.js +12 -0
  635. package/dist/work-edge-RWEDWJZF.js +49 -0
  636. package/dist/work-item-writer-WHAVZXAY.js +19 -0
  637. package/dist/worker-7SA2VS2Y.js +1435 -0
  638. package/dist/worker.js +19 -0
  639. package/dist/worktree-metrics-3DFUYVYE.js +26 -0
  640. package/dist/writeback-VZKHYHSN.js +44 -0
  641. package/docs/CLI_REFERENCE.md +7042 -0
  642. package/docs/PROVIDER_SETUP.md +1570 -0
  643. package/docs/README.md +96 -0
  644. package/docs/TROUBLESHOOTING.md +2232 -0
  645. package/docs/getting-started/QUICK_START.md +294 -0
  646. package/docs/getting-started/README.md +188 -0
  647. package/docs/getting-started/SETUP.md +52 -0
  648. package/docs/reference/AGENT_CONTEXT.md +38 -0
  649. package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
  650. package/docs/reference/README.md +381 -0
  651. package/docs/reference/SECURITY.md +262 -0
  652. package/integrations/bb-plugin-poetic/README.md +362 -0
  653. package/integrations/bb-plugin-poetic/app.css +341 -0
  654. package/integrations/bb-plugin-poetic/app.tsx +5059 -0
  655. package/integrations/bb-plugin-poetic/package.json +45 -0
  656. package/integrations/bb-plugin-poetic/server.ts +444 -0
  657. package/integrations/bb-plugin-poetic/src/adapter.ts +3312 -0
  658. package/integrations/bb-plugin-poetic/src/backlog-authoring-model.ts +150 -0
  659. package/integrations/bb-plugin-poetic/src/backlog-authoring-schema.ts +355 -0
  660. package/integrations/bb-plugin-poetic/src/backlog-authoring-service.ts +419 -0
  661. package/integrations/bb-plugin-poetic/src/backlog-authoring-view.ts +1026 -0
  662. package/integrations/bb-plugin-poetic/src/competition-defaults-schema.ts +122 -0
  663. package/integrations/bb-plugin-poetic/src/competition-defaults-service.ts +105 -0
  664. package/integrations/bb-plugin-poetic/src/competition-defaults-view.ts +138 -0
  665. package/integrations/bb-plugin-poetic/src/contract.ts +615 -0
  666. package/integrations/bb-plugin-poetic/src/finalize-model.ts +205 -0
  667. package/integrations/bb-plugin-poetic/src/finalize-schema.ts +158 -0
  668. package/integrations/bb-plugin-poetic/src/finalize-service.ts +382 -0
  669. package/integrations/bb-plugin-poetic/src/finalize-view.ts +159 -0
  670. package/integrations/bb-plugin-poetic/src/judge-operations-readback.ts +303 -0
  671. package/integrations/bb-plugin-poetic/src/judge-operations-schema.ts +33 -0
  672. package/integrations/bb-plugin-poetic/src/judge-operations-view.ts +459 -0
  673. package/integrations/bb-plugin-poetic/src/model.ts +1302 -0
  674. package/integrations/bb-plugin-poetic/src/monitor-service.ts +233 -0
  675. package/integrations/bb-plugin-poetic/src/panel-read-ux.ts +97 -0
  676. package/integrations/bb-plugin-poetic/src/patch-preview-schema.ts +166 -0
  677. package/integrations/bb-plugin-poetic/src/patch-preview-service.ts +480 -0
  678. package/integrations/bb-plugin-poetic/src/patch-preview-view.ts +109 -0
  679. package/integrations/bb-plugin-poetic/src/planning-readback.ts +204 -0
  680. package/integrations/bb-plugin-poetic/src/planning-service.ts +594 -0
  681. package/integrations/bb-plugin-poetic/src/planning-workspace-schema.ts +95 -0
  682. package/integrations/bb-plugin-poetic/src/planning-workspace.ts +323 -0
  683. package/integrations/bb-plugin-poetic/src/poll-handoff.ts +136 -0
  684. package/integrations/bb-plugin-poetic/src/project-target-server.ts +21 -0
  685. package/integrations/bb-plugin-poetic/src/project-target.ts +45 -0
  686. package/integrations/bb-plugin-poetic/src/reference-index.ts +192 -0
  687. package/integrations/bb-plugin-poetic/src/repository-schema.ts +30 -0
  688. package/integrations/bb-plugin-poetic/src/result-explorer-view.ts +597 -0
  689. package/integrations/bb-plugin-poetic/src/result-readback-model.ts +163 -0
  690. package/integrations/bb-plugin-poetic/src/result-readback-schema.ts +319 -0
  691. package/integrations/bb-plugin-poetic/src/result-readback-service.ts +333 -0
  692. package/integrations/bb-plugin-poetic/src/run-page-view.ts +177 -0
  693. package/integrations/bb-plugin-poetic/src/setup-config-schema.ts +291 -0
  694. package/integrations/bb-plugin-poetic/src/setup-config-service.ts +590 -0
  695. package/integrations/bb-plugin-poetic/src/setup-config-view.ts +413 -0
  696. package/integrations/bb-plugin-poetic/src/sprint-close-model.ts +150 -0
  697. package/integrations/bb-plugin-poetic/src/sprint-close-schema.ts +136 -0
  698. package/integrations/bb-plugin-poetic/src/sprint-close-service.ts +341 -0
  699. package/integrations/bb-plugin-poetic/src/sprint-close-view.ts +116 -0
  700. package/integrations/bb-plugin-poetic/src/sprint-composition-model.ts +714 -0
  701. package/integrations/bb-plugin-poetic/src/sprint-composition-readback.ts +231 -0
  702. package/integrations/bb-plugin-poetic/src/sprint-composition-schema.ts +601 -0
  703. package/integrations/bb-plugin-poetic/src/sprint-composition-service.ts +775 -0
  704. package/integrations/bb-plugin-poetic/src/sprint-composition-view.ts +1221 -0
  705. package/integrations/bb-plugin-poetic/src/task-authoring-model.ts +567 -0
  706. package/integrations/bb-plugin-poetic/src/task-authoring-schema.ts +635 -0
  707. package/integrations/bb-plugin-poetic/src/task-authoring-service.ts +842 -0
  708. package/integrations/bb-plugin-poetic/src/task-authoring-view.ts +1227 -0
  709. package/integrations/bb-plugin-poetic/src/task-detail-readback.ts +56 -0
  710. package/integrations/bb-plugin-poetic/src/task-detail-schema.ts +144 -0
  711. package/integrations/bb-plugin-poetic/src/task-navigation.ts +446 -0
  712. package/integrations/bb-plugin-poetic/src/workbench-route.ts +74 -0
  713. package/integrations/bb-plugin-poetic/tests/host-contract.test.ts +773 -0
  714. package/integrations/bb-plugin-poetic/tsconfig.json +18 -0
  715. package/integrations/bb-plugin-poetic/types/PROVENANCE.json +52 -0
  716. package/integrations/bb-plugin-poetic/types/bb-plugin-sdk-app.d.ts +1444 -0
  717. package/integrations/bb-plugin-poetic/types/bb-plugin-sdk.d.ts +13030 -0
  718. package/integrations/bb-plugin-poetic/vitest.host.config.ts +71 -0
  719. package/npm-shrinkwrap.json +4950 -0
  720. package/package.json +331 -0
  721. package/schemas/README.md +80 -0
  722. package/schemas/config-v1.schema.json +136 -0
  723. package/schemas/execution-config.schema.json +47 -0
  724. package/schemas/judge-scoring.schema.json +370 -0
  725. package/schemas/poetic.config.schema.json +2214 -0
  726. package/schemas/provider-config.schema.json +203 -0
  727. package/schemas/telemetry-config.schema.json +79 -0
  728. package/schemas/user-preferences.schema.json +141 -0
  729. package/scripts/assert-node-runtime.mjs +140 -0
  730. package/scripts/preflight-native.mjs +49 -0
  731. package/scripts/preinstall-node-check.mjs +78 -0
  732. package/scripts/setup-git-hooks.mjs +24 -0
  733. package/scripts/sync.sh +2722 -0
  734. package/scripts/write-node-launcher.sh +108 -0
  735. package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
  736. package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
  737. package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
  738. package/templates/.poetic/README.md +37 -0
  739. package/templates/.poetic/agents/README.md +296 -0
  740. package/templates/.poetic/agents/api-documenter.md +147 -0
  741. package/templates/.poetic/agents/backend-architect.md +31 -0
  742. package/templates/.poetic/agents/code-reviewer.md +157 -0
  743. package/templates/.poetic/agents/data-scientist.md +179 -0
  744. package/templates/.poetic/agents/database-optimizer.md +145 -0
  745. package/templates/.poetic/agents/debugger.md +31 -0
  746. package/templates/.poetic/agents/deployment-engineer.md +164 -0
  747. package/templates/.poetic/agents/devops-troubleshooter.md +139 -0
  748. package/templates/.poetic/agents/frontend-developer.md +150 -0
  749. package/templates/.poetic/agents/javascript-pro.md +36 -0
  750. package/templates/.poetic/agents/performance-engineer.md +151 -0
  751. package/templates/.poetic/agents/python-pro.md +137 -0
  752. package/templates/.poetic/agents/test-automator.md +147 -0
  753. package/templates/.poetic/agents/typescript-pro.md +34 -0
  754. package/templates/.poetic/config/poetic.config.jsonc +69 -0
  755. package/templates/.poetic/config/project-context.template.json +6 -0
  756. package/templates/.poetic/config/task-type-aliases.presets/kanban.yaml +14 -0
  757. package/templates/.poetic/config/task-type-aliases.presets/scrum.yaml +17 -0
  758. package/templates/.poetic/config/task-type-aliases.presets/xp.yaml +12 -0
  759. package/templates/.poetic/config/task-type-aliases.yaml +28 -0
  760. package/templates/.poetic/gitignore.template +55 -0
  761. package/templates/.poetic/task-types/analysis.yaml +40 -0
  762. package/templates/.poetic/task-types/architecture.yaml +38 -0
  763. package/templates/.poetic/task-types/doc.yaml +35 -0
  764. package/templates/.poetic/task-types/feature.yaml +23 -0
  765. package/templates/.poetic/task-types/general.yaml +6 -0
  766. package/templates/.poetic/task-types/security.yaml +39 -0
  767. package/templates/AGENTS.template.md +99 -0
  768. package/templates/CLAUDE.template.md +1 -0
  769. package/templates/GEMINI.template.md +1 -0
  770. package/templates/builtin-workflows/code-review.yaml +73 -0
  771. package/templates/builtin-workflows/compete-streak.yaml +78 -0
  772. package/templates/builtin-workflows/hello-verify.yaml +10 -0
  773. package/templates/builtin-workflows/judge-regression.yaml +114 -0
  774. package/templates/builtin-workflows/skills/code-review/SKILL.md +60 -0
  775. package/templates/builtin-workflows/skills/hello-verify/SKILL.md +6 -0
  776. package/templates/guard-kit/GUARD_SETUP.md.template +255 -0
  777. package/templates/guard-kit/check.mjs.template +777 -0
  778. package/templates/guard-kit/config.json.template +6 -0
  779. package/templates/guard-kit/poetic-guard.yml.template +189 -0
  780. package/templates/profiles/README.md +56 -0
  781. package/templates/profiles/frontier-claude.json +27 -0
  782. 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