@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,1813 @@
1
+ import {
2
+ atomicWriteText
3
+ } from "./chunk-A3YGID55.js";
4
+ import {
5
+ PROJECT_LANGUAGES,
6
+ detectProjectCapabilities,
7
+ isIgnoredProjectPath
8
+ } from "./chunk-FHOWVDF5.js";
9
+ import {
10
+ findPoeticPackageRoot
11
+ } from "./chunk-GSGD5E4C.js";
12
+
13
+ // src/core/knowledge/detect.ts
14
+ import { createHash } from "crypto";
15
+ import { existsSync as existsSync2, readdirSync as readdirSync2, readFileSync as readFileSync4, statSync } from "fs";
16
+ import path4 from "path";
17
+
18
+ // src/core/stack/vocabulary.ts
19
+ var STACK_DIMENSIONS = ["lang", "sdk", "fw", "domain", "tool"];
20
+ var DECLARABLE_LANGUAGES = PROJECT_LANGUAGES.filter(
21
+ (language) => language !== "docs" && language !== "unknown"
22
+ );
23
+ var DECLARABLE_LANGUAGE_SET = new Set(DECLARABLE_LANGUAGES);
24
+ var JS_FRAMEWORK_DEPENDENCIES = {
25
+ react: "react",
26
+ "react-dom": "react",
27
+ next: "nextjs",
28
+ vue: "vue",
29
+ nuxt: "nuxt",
30
+ "@angular/core": "angular",
31
+ svelte: "svelte",
32
+ "@sveltejs/kit": "sveltekit",
33
+ astro: "astro",
34
+ express: "express",
35
+ fastify: "fastify",
36
+ "@nestjs/core": "nestjs",
37
+ "react-native": "react-native",
38
+ electron: "electron"
39
+ };
40
+ var TOKEN_SHAPE_PATTERN = /^[a-z][a-z0-9.+-]{0,39}$/;
41
+ var SDK_TARGET_PATTERN = /^[a-z][a-z0-9]*-\d+(?:\.\d+)*$/;
42
+ function normalizeSdkToken(token) {
43
+ const dashIndex = token.search(/-\d/);
44
+ if (dashIndex <= 0) return token;
45
+ const platform = token.slice(0, dashIndex);
46
+ let version = token.slice(dashIndex + 1);
47
+ while (version.endsWith(".0")) version = version.slice(0, -2);
48
+ return `${platform}-${version}`;
49
+ }
50
+ var CLASSIFICATION_HINTS = {
51
+ terraform: "tool",
52
+ dbt: "tool",
53
+ docker: "tool",
54
+ kubernetes: "tool",
55
+ ansible: "tool",
56
+ pulumi: "tool",
57
+ bazel: "tool",
58
+ cmake: "tool",
59
+ gradle: "tool",
60
+ maven: "tool",
61
+ aws: "domain",
62
+ gcp: "domain",
63
+ azure: "domain",
64
+ snowflake: "domain",
65
+ databricks: "domain",
66
+ // arduino/latex are ecosystems/toolchains for classification purposes:
67
+ // `lang`/`sdk` hints are FORBIDDEN here because those dimensions carry
68
+ // extra validation (canonical ProjectLanguage / <platform>-<version>) that
69
+ // a hint must never bypass — enforced again in classifyStackToken.
70
+ arduino: "tool",
71
+ latex: "tool",
72
+ openapi: "domain",
73
+ graphql: "domain"
74
+ };
75
+ var TOOL_MARKERS = {
76
+ terraform: ["*.tf"],
77
+ dbt: ["dbt_project.yml", "dbt_project.yaml"],
78
+ docker: [
79
+ "Dockerfile",
80
+ "docker-compose.yml",
81
+ "docker-compose.yaml",
82
+ "compose.yml",
83
+ "compose.yaml"
84
+ ],
85
+ kubernetes: ["kustomization.yml", "kustomization.yaml"],
86
+ ansible: ["ansible.cfg"],
87
+ pulumi: ["Pulumi.yaml", "Pulumi.yml"],
88
+ bazel: ["WORKSPACE", "MODULE.bazel"],
89
+ cmake: ["CMakeLists.txt"],
90
+ gradle: ["build.gradle", "build.gradle.kts"],
91
+ maven: ["pom.xml"],
92
+ arduino: ["*.ino"],
93
+ latex: ["*.tex"]
94
+ };
95
+ var DIMENSION_SET = new Set(STACK_DIMENSIONS);
96
+ function classifyStackToken(raw) {
97
+ const trimmed = raw.trim().toLowerCase();
98
+ if (!trimmed) return { ok: false, error: "Empty stack token." };
99
+ const colonIndex = trimmed.indexOf(":");
100
+ if (colonIndex > 0) {
101
+ const dim = trimmed.slice(0, colonIndex);
102
+ const token = trimmed.slice(colonIndex + 1);
103
+ if (!DIMENSION_SET.has(dim)) {
104
+ return {
105
+ ok: false,
106
+ error: `Unknown dimension prefix "${dim}:" in "${raw}". Valid prefixes: ${STACK_DIMENSIONS.map((d) => `${d}:`).join(" ")}`
107
+ };
108
+ }
109
+ if (!TOKEN_SHAPE_PATTERN.test(token)) {
110
+ return {
111
+ ok: false,
112
+ error: `Invalid token "${token}" in "${raw}": tokens are lowercase words of letters/digits/./+/- (max 40 chars).`
113
+ };
114
+ }
115
+ const dimension = dim;
116
+ if (dimension === "lang" && !DECLARABLE_LANGUAGE_SET.has(token)) {
117
+ return {
118
+ ok: false,
119
+ error: `"${token}" is not a known project language. Known: ${DECLARABLE_LANGUAGES.join(", ")}. For frameworks/tools/domains use fw:/tool:/domain: prefixes.`
120
+ };
121
+ }
122
+ if (dimension === "sdk" && !SDK_TARGET_PATTERN.test(token)) {
123
+ return {
124
+ ok: false,
125
+ error: `sdk: tokens must be <platform>-<version> (e.g. macos-26, ios-17, k8s-1.31); got "${token}".`
126
+ };
127
+ }
128
+ const normalized = dimension === "sdk" ? normalizeSdkToken(token) : token;
129
+ return { ok: true, token: { token: normalized, dimension, explicit: true } };
130
+ }
131
+ if (!TOKEN_SHAPE_PATTERN.test(trimmed)) {
132
+ return {
133
+ ok: false,
134
+ error: `Unrecognized stack token: "${raw}". Tokens are lowercase words of letters/digits/./+/- (max 40 chars), optionally prefixed with ${STACK_DIMENSIONS.map((d) => `${d}:`).join("/")}.`
135
+ };
136
+ }
137
+ if (DECLARABLE_LANGUAGE_SET.has(trimmed)) {
138
+ return { ok: true, token: { token: trimmed, dimension: "lang", explicit: false } };
139
+ }
140
+ if (SDK_TARGET_PATTERN.test(trimmed)) {
141
+ return {
142
+ ok: true,
143
+ token: { token: normalizeSdkToken(trimmed), dimension: "sdk", explicit: false }
144
+ };
145
+ }
146
+ const hinted = Object.hasOwn(CLASSIFICATION_HINTS, trimmed) ? CLASSIFICATION_HINTS[trimmed] : void 0;
147
+ if (hinted && hinted !== "lang" && hinted !== "sdk") {
148
+ return { ok: true, token: { token: trimmed, dimension: hinted, explicit: false } };
149
+ }
150
+ return { ok: true, token: { token: trimmed, dimension: "fw", explicit: false } };
151
+ }
152
+ function hasStrongAnchor(tokens) {
153
+ return tokens.some((t) => t.dimension === "lang" || t.dimension === "sdk" || t.explicit === true);
154
+ }
155
+ var DETECTABLE_FRAMEWORKS = /* @__PURE__ */ new Set([
156
+ ...Object.values(JS_FRAMEWORK_DEPENDENCIES),
157
+ "swiftui",
158
+ "uikit",
159
+ "appkit",
160
+ "vapor"
161
+ ]);
162
+ var DETECTABLE_SDK_PLATFORMS = /* @__PURE__ */ new Set([
163
+ "ios",
164
+ "macos",
165
+ "watchos",
166
+ "tvos",
167
+ "visionos"
168
+ ]);
169
+ function isGatingToken(token) {
170
+ switch (token.dimension) {
171
+ case "lang":
172
+ return true;
173
+ case "sdk":
174
+ return DETECTABLE_SDK_PLATFORMS.has(sdkPlatform(token.token));
175
+ case "fw":
176
+ return DETECTABLE_FRAMEWORKS.has(token.token);
177
+ case "tool":
178
+ return Object.hasOwn(TOOL_MARKERS, token.token);
179
+ case "domain":
180
+ return false;
181
+ }
182
+ }
183
+ function sdkPlatform(token) {
184
+ const dashIndex = token.search(/-\d/);
185
+ return dashIndex > 0 ? token.slice(0, dashIndex) : token;
186
+ }
187
+ function sdkVersion(token) {
188
+ const dashIndex = token.search(/-\d/);
189
+ return dashIndex > 0 ? token.slice(dashIndex + 1) : "";
190
+ }
191
+
192
+ // src/core/knowledge/manifest.ts
193
+ import { existsSync, readFileSync as readFileSync2 } from "fs";
194
+ import path2 from "path";
195
+ import { z as z2 } from "zod";
196
+
197
+ // src/core/knowledge/types.ts
198
+ import { readFileSync } from "fs";
199
+ import path from "path";
200
+ import { z } from "zod";
201
+ var KitItemKind = z.enum(["mcp", "skill", "instructions", "docs"]);
202
+ var KitItemTrust = z.enum(["official", "community", "third-party"]);
203
+ var KitItemSchema = z.object({
204
+ /** Stable identifier, unique within one offer/manifest (e.g. `docs:developer.apple.com/swiftui`). */
205
+ id: z.string().min(1),
206
+ kind: KitItemKind,
207
+ /** Canonical source URL for the resource. */
208
+ sourceUrl: z.string().url(),
209
+ trust: KitItemTrust,
210
+ /** One-line human description shown in the consolidated offer checklist. */
211
+ description: z.string().min(1),
212
+ /**
213
+ * Exact command (or short instruction) the USER can run to install/connect
214
+ * the resource. Poetic NEVER executes this itself — third-party MCP servers
215
+ * in particular are never auto-installed (spec guardrail).
216
+ */
217
+ installHint: z.string().min(1).optional()
218
+ });
219
+ var cachedPoeticVersion;
220
+ function resolvePoeticVersion() {
221
+ if (cachedPoeticVersion !== void 0) return cachedPoeticVersion;
222
+ try {
223
+ const packageRoot = findPoeticPackageRoot();
224
+ if (!packageRoot) {
225
+ cachedPoeticVersion = "0.0.0";
226
+ return cachedPoeticVersion;
227
+ }
228
+ const parsed = JSON.parse(readFileSync(path.join(packageRoot, "package.json"), "utf8"));
229
+ cachedPoeticVersion = typeof parsed.version === "string" && parsed.version.trim() ? parsed.version.trim() : "0.0.0";
230
+ } catch {
231
+ cachedPoeticVersion = "0.0.0";
232
+ }
233
+ return cachedPoeticVersion;
234
+ }
235
+
236
+ // src/core/knowledge/manifest.ts
237
+ var KNOWLEDGE_BLOCK_BEGIN = "<!-- poetic-knowledge:begin -->";
238
+ var KNOWLEDGE_BLOCK_END = "<!-- poetic-knowledge:end -->";
239
+ var CONTEXT_DIR = path2.join(".poetic", "context");
240
+ var KNOWLEDGE_DIR = path2.join(CONTEXT_DIR, "knowledge");
241
+ var KNOWLEDGE_MANIFEST_FILENAME = "manifest.json";
242
+ function knowledgeDir(root) {
243
+ return path2.join(root, KNOWLEDGE_DIR);
244
+ }
245
+ function knowledgeManifestPath(root) {
246
+ return path2.join(knowledgeDir(root), KNOWLEDGE_MANIFEST_FILENAME);
247
+ }
248
+ var KitItemMode = z2.enum(["online-ref", "local-mirror"]);
249
+ var ManifestItemSchema = z2.object({
250
+ id: z2.string().min(1),
251
+ kind: KitItemKind,
252
+ sourceUrl: z2.string().url(),
253
+ trust: KitItemTrust,
254
+ description: z2.string().min(1),
255
+ installHint: z2.string().min(1).optional(),
256
+ /** Resource version when known, else the ISO date the item was accepted. */
257
+ versionOrDate: z2.string().min(1),
258
+ /** v1 only writes `online-ref`; `local-mirror` is schema-reserved for v1.1. */
259
+ mode: KitItemMode
260
+ });
261
+ var KnowledgeManifestSchema = z2.object({
262
+ schemaVersion: z2.literal(1),
263
+ /** Poetic version that wrote the manifest. */
264
+ poeticVersion: z2.string().min(1),
265
+ /** Normalized stack fingerprint at accept time (drift detection input). */
266
+ stackFingerprint: z2.string().min(1),
267
+ /** ISO timestamp of the last apply. */
268
+ updatedAt: z2.string().min(1),
269
+ items: z2.array(ManifestItemSchema)
270
+ });
271
+ function readKnowledgeManifest(root) {
272
+ const manifestPath = knowledgeManifestPath(root);
273
+ if (!existsSync(manifestPath)) return { status: "absent" };
274
+ let raw;
275
+ try {
276
+ raw = readFileSync2(manifestPath, "utf8");
277
+ } catch (error) {
278
+ return {
279
+ status: "invalid",
280
+ error: `unreadable: ${error instanceof Error ? error.message : String(error)}`
281
+ };
282
+ }
283
+ let parsed;
284
+ try {
285
+ parsed = JSON.parse(raw);
286
+ } catch (error) {
287
+ return {
288
+ status: "invalid",
289
+ error: `not valid JSON: ${error instanceof Error ? error.message : String(error)}`
290
+ };
291
+ }
292
+ const result = KnowledgeManifestSchema.safeParse(parsed);
293
+ if (!result.success) {
294
+ return { status: "invalid", error: result.error.issues.map((i) => i.message).join("; ") };
295
+ }
296
+ return { status: "ok", manifest: result.data };
297
+ }
298
+ async function writeKnowledgeManifest(root, manifest) {
299
+ const validated = KnowledgeManifestSchema.parse(manifest);
300
+ const localMirror = validated.items.find((item) => item.mode === "local-mirror");
301
+ if (localMirror) {
302
+ throw new Error(
303
+ `Knowledge manifest item "${localMirror.id}" uses mode "local-mirror", which is not implemented in v1 (online-ref only).`
304
+ );
305
+ }
306
+ await atomicWriteText(knowledgeManifestPath(root), JSON.stringify(validated, null, 2), {
307
+ ensureDir: true,
308
+ trailingNewline: true
309
+ });
310
+ }
311
+ function createManifest(stackFingerprint, items, now = /* @__PURE__ */ new Date()) {
312
+ return {
313
+ schemaVersion: 1,
314
+ poeticVersion: resolvePoeticVersion(),
315
+ stackFingerprint,
316
+ updatedAt: now.toISOString(),
317
+ items
318
+ };
319
+ }
320
+
321
+ // src/core/knowledge/service-candidates.ts
322
+ import { readdirSync, readFileSync as readFileSync3 } from "fs";
323
+ import path3 from "path";
324
+
325
+ // src/core/knowledge/service-candidates-contract.ts
326
+ var CANDIDATE_KEY_SUFFIXES = [
327
+ "CLIENT_SECRET",
328
+ "CLIENT_ID",
329
+ "ACCOUNT_SID",
330
+ "SECRET_KEY",
331
+ // AUTH_TOKEN before TOKEN (longest-first): TWILIO_AUTH_TOKEN must extract
332
+ // `twilio` (matching the curated token), not a bogus `twilio_auth`.
333
+ "AUTH_TOKEN",
334
+ "API_KEY",
335
+ "SECRET",
336
+ "TOKEN",
337
+ "DSN"
338
+ ];
339
+ var DEMOTED_SOURCE_SUFFIXES = /* @__PURE__ */ new Set([
340
+ "TOKEN",
341
+ "AUTH_TOKEN",
342
+ "SECRET"
343
+ ]);
344
+ var STRIPPED_KEY_PREFIXES = [
345
+ "NEXT_PUBLIC_",
346
+ "REACT_APP_",
347
+ "VITE_",
348
+ "EXPO_PUBLIC_",
349
+ "NUXT_PUBLIC_"
350
+ ];
351
+ var SUPPRESSED_TOKENS = /* @__PURE__ */ new Set([
352
+ "jwt",
353
+ "session",
354
+ "csrf",
355
+ "cookie",
356
+ "encryption",
357
+ "auth",
358
+ "oauth",
359
+ "refresh",
360
+ "bearer",
361
+ "access",
362
+ "id",
363
+ "signing",
364
+ "admin",
365
+ "db",
366
+ "database",
367
+ "fake",
368
+ "example",
369
+ "mock",
370
+ "dummy",
371
+ "test",
372
+ "your",
373
+ "my",
374
+ "sample",
375
+ // App/framework-internal secret owners — APP_SECRET, DJANGO_SECRET_KEY,
376
+ // NEXTAUTH_SECRET, FLASK_SECRET_KEY, RAILS_SECRET_KEY_BASE etc. are signing
377
+ // secrets for the app itself, never an external API service.
378
+ "app",
379
+ "server",
380
+ "api",
381
+ "web",
382
+ "client",
383
+ "django",
384
+ "flask",
385
+ "rails",
386
+ "laravel",
387
+ "express",
388
+ "nextauth",
389
+ "next_auth",
390
+ "devise",
391
+ "webhook",
392
+ "deploy",
393
+ "build",
394
+ "ci"
395
+ ]);
396
+ var SUPPRESSED_TOKEN_PREFIXES = [
397
+ "fake_",
398
+ "example_",
399
+ "mock_",
400
+ "dummy_",
401
+ "test_",
402
+ "your_",
403
+ "my_",
404
+ "sample_"
405
+ ];
406
+ var LLM_PROVIDER_KEY_NAMES = /* @__PURE__ */ new Set([
407
+ "ANTHROPIC_API_KEY",
408
+ "ANTHROPIC_AUTH_TOKEN",
409
+ "CLAUDE_CODE_OAUTH_TOKEN",
410
+ "OPENAI_API_KEY",
411
+ "GEMINI_API_KEY",
412
+ "GOOGLE_API_KEY",
413
+ "XAI_API_KEY",
414
+ "OPENROUTER_API_KEY",
415
+ "KIRO_API_KEY",
416
+ "ANTIGRAVITY_API_KEY",
417
+ "CURSOR_API_KEY",
418
+ "CODEX_API_KEY",
419
+ "CODEX_TOKEN",
420
+ "ZAI_API_KEY",
421
+ "GITHUB_TOKEN"
422
+ ]);
423
+ var ENV_TEMPLATE_BASENAMES = /* @__PURE__ */ new Set([
424
+ ".env.example",
425
+ ".env.sample",
426
+ ".env.template",
427
+ ".env.dist"
428
+ ]);
429
+ var CONFIG_BASENAMES = /* @__PURE__ */ new Set([".mcp.json"]);
430
+ var CONFIG_EXTENSIONS = [".yaml", ".yml", ".toml", ".json"];
431
+ var CANDIDATE_SOURCE_EXTENSIONS = [
432
+ ".ts",
433
+ ".tsx",
434
+ ".mts",
435
+ ".cts",
436
+ ".js",
437
+ ".jsx",
438
+ ".mjs",
439
+ ".cjs",
440
+ ".swift",
441
+ ".py",
442
+ ".go",
443
+ ".rb",
444
+ ".java",
445
+ ".kt",
446
+ ".kts",
447
+ ".cs",
448
+ ".php",
449
+ ".rs",
450
+ ".c",
451
+ ".cc",
452
+ ".cpp",
453
+ ".h",
454
+ ".hpp",
455
+ ".m",
456
+ ".mm",
457
+ ".dart",
458
+ ".scala",
459
+ ".ps1",
460
+ ".r",
461
+ ".sql",
462
+ ".pl",
463
+ ".ex",
464
+ ".exs"
465
+ ];
466
+ var CANDIDATE_SCAN_EXCLUDED_DIRS = /* @__PURE__ */ new Set([
467
+ "test",
468
+ "tests",
469
+ "__tests__",
470
+ "spec",
471
+ "fixture",
472
+ "fixtures",
473
+ "mock",
474
+ "mocks",
475
+ "example",
476
+ "examples",
477
+ "sample",
478
+ "samples",
479
+ "vendor",
480
+ "third_party",
481
+ "third-party",
482
+ "docs",
483
+ "templates",
484
+ "backups"
485
+ ]);
486
+ var API_ISH_SUBDOMAINS = /* @__PURE__ */ new Set(["api", "data"]);
487
+ var MIN_PLAIN_HOST_OCCURRENCES = 3;
488
+ var HOSTNAME_NOISE_PATTERNS = [
489
+ /(^|\.)example\.(com|org|net)$/i,
490
+ /^localhost$/i,
491
+ /^127\.0\.0\.1$/,
492
+ /(^|\.)local$/i,
493
+ /^(custom|env|your|foo|bar)\.api\./i,
494
+ /\.api\.com$/i,
495
+ /^(github|raw\.githubusercontent|gist\.github)\.com$/i,
496
+ /^(en\.)?wikipedia\.org$/i,
497
+ /^json-schema\.org$/i,
498
+ /^(cdn|fonts|ajax)\./i
499
+ ];
500
+ var MAX_CANDIDATE_SCAN_FILES = 5e3;
501
+ var MAX_CANDIDATE_CONTENT_SAMPLES = 120;
502
+ var CANDIDATE_ITEM_ID_PREFIX = "docs:candidate:";
503
+ var CANDIDATE_SEARCH_PRIORITY = [
504
+ "env-template",
505
+ "package",
506
+ "source",
507
+ "config",
508
+ "script",
509
+ "hostname"
510
+ ];
511
+ var MAX_UNRESOLVED_LINES = 5;
512
+ function candidateSetSignature(candidates) {
513
+ return candidates.map((c) => {
514
+ const evidence = Array.from(new Set(c.evidence.map((ev) => `${ev.class}=${ev.matched}`))).sort().join("+");
515
+ const safety = isCandidateQuerySafe(c) ? "q1" : "q0";
516
+ return `${c.token}:${c.confidence}:${evidence}:${safety}`;
517
+ }).sort().join(",");
518
+ }
519
+ var QUERY_SAFE_EVIDENCE_CLASSES = /* @__PURE__ */ new Set([
520
+ "env-template",
521
+ "package",
522
+ "config"
523
+ ]);
524
+ var QUERY_SAFE_TLDS = /* @__PURE__ */ new Set([
525
+ "com",
526
+ "org",
527
+ "net",
528
+ "io",
529
+ "dev",
530
+ "ai",
531
+ "co",
532
+ "gov",
533
+ "edu",
534
+ "app",
535
+ "sh",
536
+ "us",
537
+ "uk",
538
+ "de",
539
+ "fr",
540
+ "jp",
541
+ "in",
542
+ "ca",
543
+ "au",
544
+ "nl",
545
+ "se",
546
+ "ch",
547
+ "eu"
548
+ ]);
549
+ function isQuerySafeHostname(host) {
550
+ const labels = host.split(".").filter(Boolean);
551
+ if (labels.length < 2 || labels.length > 3) return false;
552
+ if (labels.some((label) => ["corp", "internal", "intranet", "local", "lan"].includes(label))) {
553
+ return false;
554
+ }
555
+ const tld = labels[labels.length - 1];
556
+ return QUERY_SAFE_TLDS.has(tld);
557
+ }
558
+ function isCandidateQuerySafe(candidate) {
559
+ return candidate.evidence.some(
560
+ (ev) => QUERY_SAFE_EVIDENCE_CLASSES.has(ev.class) || ev.class === "hostname" && isQuerySafeHostname(ev.matched.toLowerCase())
561
+ );
562
+ }
563
+
564
+ // src/core/knowledge/service-signals.ts
565
+ var SERVICE_SIGNALS = [
566
+ // Payments
567
+ {
568
+ token: "stripe",
569
+ category: "Payments",
570
+ envKeys: ["STRIPE_SECRET_KEY"],
571
+ packages: [
572
+ "stripe",
573
+ "@stripe/stripe-js",
574
+ "stripe-ios",
575
+ "stripe-python",
576
+ "stripe-go",
577
+ "stripe-php"
578
+ ],
579
+ hostnames: ["api.stripe.com"],
580
+ docsUrl: "https://docs.stripe.com/api",
581
+ docDomain: "stripe.com",
582
+ description: "Stripe payments API \u2014 official API reference"
583
+ },
584
+ {
585
+ token: "paypal",
586
+ category: "Payments",
587
+ envKeys: ["PAYPAL_CLIENT_ID", "PAYPAL_CLIENT_SECRET"],
588
+ packages: ["@paypal/checkout-server-sdk", "@paypal/paypal-server-sdk"],
589
+ hostnames: ["api-m.paypal.com"],
590
+ docsUrl: "https://developer.paypal.com/api/rest/",
591
+ docDomain: "developer.paypal.com",
592
+ description: "PayPal REST API \u2014 official developer documentation"
593
+ },
594
+ // AI / LLM
595
+ {
596
+ token: "openai",
597
+ category: "AI/LLM",
598
+ envKeys: ["OPENAI_API_KEY"],
599
+ // SwiftPM repo slugs: MacPaw/OpenAI => `openai`; openai-swift community slug.
600
+ packages: ["openai", "openai-swift"],
601
+ hostnames: ["api.openai.com"],
602
+ docsUrl: "https://platform.openai.com/docs",
603
+ docDomain: "platform.openai.com",
604
+ description: "OpenAI API \u2014 official platform documentation"
605
+ },
606
+ {
607
+ token: "anthropic",
608
+ category: "AI/LLM",
609
+ envKeys: ["ANTHROPIC_API_KEY"],
610
+ // npm `@anthropic-ai/sdk`, PyPI `anthropic`; SwiftPM slugs anthropic-sdk-*.
611
+ packages: ["@anthropic-ai/sdk", "anthropic", "anthropic-sdk-swift", "swift-anthropic"],
612
+ hostnames: ["api.anthropic.com"],
613
+ docsUrl: "https://docs.anthropic.com",
614
+ docDomain: "anthropic.com",
615
+ description: "Anthropic Claude API \u2014 official documentation"
616
+ },
617
+ // Communications
618
+ {
619
+ token: "twilio",
620
+ category: "Communications",
621
+ envKeys: ["TWILIO_ACCOUNT_SID", "TWILIO_AUTH_TOKEN"],
622
+ packages: ["twilio"],
623
+ hostnames: ["api.twilio.com"],
624
+ docsUrl: "https://www.twilio.com/docs",
625
+ docDomain: "twilio.com",
626
+ description: "Twilio SMS/voice API \u2014 official documentation"
627
+ },
628
+ {
629
+ token: "sendgrid",
630
+ category: "Email",
631
+ envKeys: ["SENDGRID_API_KEY"],
632
+ packages: ["@sendgrid/mail", "@sendgrid/client"],
633
+ hostnames: ["api.sendgrid.com"],
634
+ docsUrl: "https://www.twilio.com/docs/sendgrid",
635
+ docDomain: "twilio.com",
636
+ description: "Twilio SendGrid email API \u2014 official documentation"
637
+ },
638
+ {
639
+ token: "resend",
640
+ category: "Email",
641
+ envKeys: ["RESEND_API_KEY"],
642
+ packages: ["resend"],
643
+ hostnames: ["api.resend.com"],
644
+ docsUrl: "https://resend.com/docs",
645
+ docDomain: "resend.com",
646
+ description: "Resend transactional email API \u2014 official documentation"
647
+ },
648
+ // Auth
649
+ {
650
+ token: "auth0",
651
+ category: "Authentication",
652
+ // AUTH0_DOMAIN alone is app-configurable; the secret is the strong signal.
653
+ envKeys: ["AUTH0_CLIENT_SECRET"],
654
+ packages: ["auth0", "express-openid-connect", "@auth0/auth0-react", "@auth0/nextjs-auth0"],
655
+ hostnames: [],
656
+ docsUrl: "https://auth0.com/docs",
657
+ docDomain: "auth0.com",
658
+ description: "Auth0 identity platform \u2014 official documentation"
659
+ },
660
+ {
661
+ token: "clerk",
662
+ category: "Authentication",
663
+ envKeys: ["CLERK_SECRET_KEY"],
664
+ packages: ["@clerk/nextjs", "@clerk/backend", "@clerk/clerk-sdk-node"],
665
+ hostnames: ["api.clerk.com"],
666
+ docsUrl: "https://clerk.com/docs",
667
+ docDomain: "clerk.com",
668
+ description: "Clerk authentication \u2014 official documentation"
669
+ },
670
+ // Backend / data platform
671
+ {
672
+ token: "supabase",
673
+ category: "Backend",
674
+ // Score on the service-role (secret) key, not the public anon key.
675
+ envKeys: ["SUPABASE_SERVICE_ROLE_KEY"],
676
+ packages: ["@supabase/supabase-js"],
677
+ hostnames: [],
678
+ docsUrl: "https://supabase.com/docs",
679
+ docDomain: "supabase.com",
680
+ description: "Supabase backend platform \u2014 official documentation"
681
+ },
682
+ // Fintech
683
+ {
684
+ token: "plaid",
685
+ category: "Fintech",
686
+ envKeys: ["PLAID_CLIENT_ID", "PLAID_SECRET"],
687
+ packages: ["plaid"],
688
+ hostnames: ["api.plaid.com", "sandbox.plaid.com", "production.plaid.com"],
689
+ docsUrl: "https://plaid.com/docs",
690
+ docDomain: "plaid.com",
691
+ description: "Plaid financial data API \u2014 official documentation"
692
+ },
693
+ // Datastores
694
+ {
695
+ token: "mongodb",
696
+ category: "Datastore",
697
+ envKeys: ["MONGODB_URI", "MONGO_URL"],
698
+ packages: ["mongodb", "mongoose"],
699
+ hostnames: [],
700
+ docsUrl: "https://www.mongodb.com/docs/drivers/",
701
+ docDomain: "mongodb.com",
702
+ description: "MongoDB drivers \u2014 official documentation"
703
+ },
704
+ {
705
+ token: "redis",
706
+ category: "Datastore",
707
+ envKeys: ["REDIS_URL"],
708
+ packages: ["redis", "ioredis"],
709
+ hostnames: [],
710
+ docsUrl: "https://redis.io/docs/latest/develop/",
711
+ docDomain: "redis.io",
712
+ description: "Redis \u2014 official developer documentation"
713
+ },
714
+ // Search
715
+ {
716
+ token: "algolia",
717
+ category: "Search",
718
+ envKeys: ["ALGOLIA_ADMIN_API_KEY", "ALGOLIA_API_KEY"],
719
+ packages: ["algoliasearch"],
720
+ hostnames: [],
721
+ docsUrl: "https://www.algolia.com/doc/",
722
+ docDomain: "algolia.com",
723
+ description: "Algolia search API \u2014 official documentation"
724
+ }
725
+ ];
726
+ var SERVICE_DOC_DOMAINS = Array.from(
727
+ new Set(SERVICE_SIGNALS.map((s) => s.docDomain))
728
+ );
729
+ function serviceSignalForToken(token) {
730
+ return SERVICE_SIGNALS.find((s) => s.token === token);
731
+ }
732
+
733
+ // src/core/knowledge/service-candidates.ts
734
+ var MAX_CANDIDATE_CONTENT_BYTES = 64 * 1024;
735
+ var SUFFIXES_LONGEST_FIRST = [...CANDIDATE_KEY_SUFFIXES].sort(
736
+ (a, b) => b.length - a.length
737
+ );
738
+ var GENERIC_TLDS = /* @__PURE__ */ new Set(["com", "net", "org", "io"]);
739
+ var CURATED_TOKENS = new Set(SERVICE_SIGNALS.map((s) => s.token));
740
+ var CURATED_ENV_KEY_TO_TOKEN = new Map(
741
+ SERVICE_SIGNALS.flatMap((s) => s.envKeys.map((key) => [key, s.token]))
742
+ );
743
+ function readTextSafe(filePath, maxBytes = MAX_CANDIDATE_CONTENT_BYTES) {
744
+ try {
745
+ return readFileSync3(filePath, "utf8").slice(0, maxBytes);
746
+ } catch {
747
+ return "";
748
+ }
749
+ }
750
+ function readJsonSafe(filePath) {
751
+ try {
752
+ const parsed = JSON.parse(readFileSync3(filePath, "utf8"));
753
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
754
+ } catch {
755
+ return null;
756
+ }
757
+ }
758
+ var TEST_FILE_BASENAME = /(\.test\.|\.spec\.|_test\.|^test_|^conftest\.py$|Tests?\.swift$|Spec\.swift$)/;
759
+ function classifySurface(basename) {
760
+ if (ENV_TEMPLATE_BASENAMES.has(basename)) return "env-template";
761
+ if (TEST_FILE_BASENAME.test(basename)) return null;
762
+ if (basename.endsWith(".sh")) return "script";
763
+ if (CONFIG_BASENAMES.has(basename)) return "config";
764
+ const ext = path3.extname(basename).toLowerCase();
765
+ if (CONFIG_EXTENSIONS.includes(ext)) return "config";
766
+ if (CANDIDATE_SOURCE_EXTENSIONS.includes(ext)) return "source";
767
+ return null;
768
+ }
769
+ function hasExcludedSegment(relativePath) {
770
+ return relativePath.split(path3.sep).some((segment) => CANDIDATE_SCAN_EXCLUDED_DIRS.has(segment.toLowerCase()));
771
+ }
772
+ function collectClassifiedFiles(root) {
773
+ const collected = [];
774
+ const stack = [""];
775
+ let visited = 0;
776
+ while (stack.length > 0 && visited < MAX_CANDIDATE_SCAN_FILES) {
777
+ const relativeDirectory = stack.pop() ?? "";
778
+ let entries;
779
+ try {
780
+ entries = readdirSync(path3.join(root, relativeDirectory), { withFileTypes: true });
781
+ } catch {
782
+ continue;
783
+ }
784
+ for (const entry of entries) {
785
+ const relativePath = path3.join(relativeDirectory, entry.name);
786
+ if (isIgnoredProjectPath(relativePath)) continue;
787
+ if (entry.isDirectory()) {
788
+ if (CANDIDATE_SCAN_EXCLUDED_DIRS.has(entry.name.toLowerCase())) continue;
789
+ stack.push(relativePath);
790
+ } else if (entry.isFile()) {
791
+ visited += 1;
792
+ if (hasExcludedSegment(relativePath)) continue;
793
+ const surface = classifySurface(entry.name);
794
+ if (surface && collected.length < MAX_CANDIDATE_CONTENT_SAMPLES) {
795
+ collected.push({ relativePath, surface });
796
+ }
797
+ }
798
+ if (visited >= MAX_CANDIDATE_SCAN_FILES) break;
799
+ }
800
+ }
801
+ return collected;
802
+ }
803
+ function stripKeyPrefix(upperKey) {
804
+ for (const prefix of STRIPPED_KEY_PREFIXES) {
805
+ if (upperKey.startsWith(prefix)) return upperKey.slice(prefix.length);
806
+ }
807
+ return upperKey;
808
+ }
809
+ function extractToken(upperKey) {
810
+ const name = stripKeyPrefix(upperKey);
811
+ for (const suffix of SUFFIXES_LONGEST_FIRST) {
812
+ if (name === suffix) return null;
813
+ if (name.endsWith(`_${suffix}`)) {
814
+ const remainder = name.slice(0, name.length - suffix.length - 1);
815
+ if (!remainder) return null;
816
+ return { token: remainder.toLowerCase(), suffix };
817
+ }
818
+ }
819
+ return null;
820
+ }
821
+ function envTemplateKeyNames(content) {
822
+ const keys = [];
823
+ for (const line of content.split(/\r?\n/)) {
824
+ const trimmed = line.trim();
825
+ if (!trimmed || trimmed.startsWith("#")) continue;
826
+ const withoutExport = trimmed.replace(/^export\s+/, "");
827
+ const eq = withoutExport.indexOf("=");
828
+ const key = (eq >= 0 ? withoutExport.slice(0, eq) : withoutExport).trim();
829
+ if (/^[A-Z][A-Z0-9_]*$/.test(key)) keys.push(key);
830
+ }
831
+ return keys;
832
+ }
833
+ function uppercaseKeyIdentifiers(content) {
834
+ return content.match(/\b[A-Z][A-Z0-9_]*\b/g) ?? [];
835
+ }
836
+ function configKeyIdentifiers(content) {
837
+ const keys = [];
838
+ for (const line of content.split(/\r?\n/)) {
839
+ const trimmed = line.trim();
840
+ if (!trimmed || trimmed.startsWith("#") || trimmed.startsWith("//")) continue;
841
+ const lhs = trimmed.match(/^["']?([A-Za-z][A-Za-z0-9_]*)["']?\s*[:=]/);
842
+ if (lhs?.[1]) keys.push(lhs[1]);
843
+ for (const jsonKey of trimmed.matchAll(/"([A-Za-z][A-Za-z0-9_]*)"\s*:/g)) {
844
+ if (jsonKey[1]) keys.push(jsonKey[1]);
845
+ }
846
+ for (const ref of trimmed.matchAll(/\$\{([A-Z][A-Z0-9_]*)\}/g)) {
847
+ if (ref[1]) keys.push(ref[1]);
848
+ }
849
+ }
850
+ return keys;
851
+ }
852
+ function extractHostnames(content) {
853
+ const hosts = [];
854
+ for (const match of content.toLowerCase().matchAll(/\bhttps?:\/\/([a-z0-9.-]+)/g)) {
855
+ const host = match[1];
856
+ if (host) hosts.push(host);
857
+ }
858
+ return hosts;
859
+ }
860
+ function isNoiseHost(host) {
861
+ return HOSTNAME_NOISE_PATTERNS.some((pattern) => pattern.test(host));
862
+ }
863
+ function stripHostPrefix(host) {
864
+ return host.replace(/^(?:api|data|www)\./, "");
865
+ }
866
+ function hostSlug(host) {
867
+ const labels = stripHostPrefix(host).split(".").filter(Boolean);
868
+ if (labels.length >= 2) {
869
+ const last = labels[labels.length - 1];
870
+ if (last && GENERIC_TLDS.has(last)) labels.pop();
871
+ }
872
+ return labels.join("-").toLowerCase();
873
+ }
874
+ function hostPrimaryLabel(host) {
875
+ return (stripHostPrefix(host).split(".")[0] ?? "").toLowerCase();
876
+ }
877
+ function collectDependencyNames(root) {
878
+ const names = /* @__PURE__ */ new Set();
879
+ const pkg = readJsonSafe(path3.join(root, "package.json"));
880
+ if (pkg) {
881
+ for (const bucket of [
882
+ "dependencies",
883
+ "devDependencies",
884
+ "peerDependencies",
885
+ "optionalDependencies"
886
+ ]) {
887
+ const deps = pkg[bucket];
888
+ if (deps && typeof deps === "object" && !Array.isArray(deps)) {
889
+ for (const name of Object.keys(deps)) {
890
+ const lower = name.toLowerCase();
891
+ names.add(lower);
892
+ const scoped = lower.match(/^@([^/]+)\//);
893
+ if (scoped?.[1]) names.add(scoped[1]);
894
+ }
895
+ }
896
+ }
897
+ }
898
+ const packageSwift = readTextSafe(path3.join(root, "Package.swift"), 32e3);
899
+ for (const match of packageSwift.matchAll(/\.package\([^)]*url:\s*"([^"]+)"/g)) {
900
+ const slug = (match[1] ?? "").replace(/\.git$/, "").split("/").pop();
901
+ if (slug) names.add(slug.toLowerCase());
902
+ }
903
+ const requirements = readTextSafe(path3.join(root, "requirements.txt"), 32e3);
904
+ for (const line of requirements.split(/\r?\n/)) {
905
+ const trimmed = line.trim();
906
+ if (!trimmed || trimmed.startsWith("#")) continue;
907
+ const name = trimmed.split(/[<>=!~;[\s]/)[0];
908
+ if (name) names.add(name.toLowerCase());
909
+ }
910
+ const goMod = readTextSafe(path3.join(root, "go.mod"), 32e3);
911
+ for (const match of goMod.matchAll(/^\s*(?:require\s+)?([\w.\-/]+\.[\w.\-/]+)\s+v\d/gm)) {
912
+ const modulePath = (match[1] ?? "").toLowerCase().replace(/\/v\d+$/, "");
913
+ if (!modulePath) continue;
914
+ names.add(modulePath);
915
+ const segment = modulePath.split("/").pop();
916
+ if (segment) names.add(segment);
917
+ }
918
+ const gemfile = readTextSafe(path3.join(root, "Gemfile"), 32e3);
919
+ for (const match of gemfile.matchAll(/^\s*gem\s+["']([^"']+)["']/gm)) {
920
+ const name = match[1];
921
+ if (name) names.add(name.toLowerCase());
922
+ }
923
+ const composer = readJsonSafe(path3.join(root, "composer.json"));
924
+ if (composer) {
925
+ for (const bucket of ["require", "require-dev"]) {
926
+ const deps = composer[bucket];
927
+ if (deps && typeof deps === "object" && !Array.isArray(deps)) {
928
+ for (const name of Object.keys(deps)) {
929
+ const key = name.toLowerCase();
930
+ names.add(key);
931
+ const segment = key.split("/").pop();
932
+ if (segment) names.add(segment);
933
+ }
934
+ }
935
+ }
936
+ }
937
+ return names;
938
+ }
939
+ function newAccumulator() {
940
+ return {
941
+ evidence: /* @__PURE__ */ new Map(),
942
+ hasEnvTemplate: false,
943
+ hasCuratedEnvKey: false,
944
+ hasSourceNonDemoted: false,
945
+ hasSourceDemoted: false,
946
+ hasScript: false,
947
+ hasConfig: false,
948
+ hasHostname: false,
949
+ hasApiIshHostname: false,
950
+ hasRepeatedHostname: false
951
+ };
952
+ }
953
+ function addEvidence(acc, cls, matched) {
954
+ const key = `${cls}|${matched}`;
955
+ if (!acc.evidence.has(key)) acc.evidence.set(key, { class: cls, matched });
956
+ }
957
+ function isSuppressedToken(token) {
958
+ if (SUPPRESSED_TOKENS.has(token)) return true;
959
+ return SUPPRESSED_TOKEN_PREFIXES.some(
960
+ (prefix) => token.startsWith(prefix)
961
+ );
962
+ }
963
+ function detectServiceCandidates(root) {
964
+ const accumulators = /* @__PURE__ */ new Map();
965
+ const getAcc = (token) => {
966
+ let acc = accumulators.get(token);
967
+ if (!acc) {
968
+ acc = newAccumulator();
969
+ accumulators.set(token, acc);
970
+ }
971
+ return acc;
972
+ };
973
+ const files = collectClassifiedFiles(root);
974
+ const hostCounts = /* @__PURE__ */ new Map();
975
+ for (const { relativePath, surface } of files) {
976
+ const content = readTextSafe(path3.join(root, relativePath));
977
+ if (!content) continue;
978
+ if (surface === "source" || surface === "script") {
979
+ for (const host of extractHostnames(content)) {
980
+ hostCounts.set(host, (hostCounts.get(host) ?? 0) + 1);
981
+ }
982
+ }
983
+ let keyNames;
984
+ if (surface === "env-template") keyNames = envTemplateKeyNames(content);
985
+ else if (surface === "config") keyNames = configKeyIdentifiers(content);
986
+ else keyNames = uppercaseKeyIdentifiers(content);
987
+ for (const rawKey of keyNames) {
988
+ const upperKey = rawKey.toUpperCase();
989
+ const extracted = extractToken(upperKey);
990
+ if (!extracted) continue;
991
+ const strippedKey = stripKeyPrefix(upperKey);
992
+ const curatedToken = CURATED_ENV_KEY_TO_TOKEN.get(upperKey) ?? CURATED_ENV_KEY_TO_TOKEN.get(strippedKey);
993
+ const token = curatedToken ?? extracted.token;
994
+ const suffix = extracted.suffix;
995
+ if (isSuppressedToken(token)) continue;
996
+ if (LLM_PROVIDER_KEY_NAMES.has(upperKey) && surface !== "source" && surface !== "env-template") {
997
+ continue;
998
+ }
999
+ const acc = getAcc(token);
1000
+ const cls = surface;
1001
+ const evidenceText = surface === "source" || surface === "script" ? `*_${suffix} (redacted)` : rawKey;
1002
+ addEvidence(acc, cls, evidenceText);
1003
+ if (surface === "env-template") {
1004
+ acc.hasEnvTemplate = true;
1005
+ if (CURATED_ENV_KEY_TO_TOKEN.has(upperKey)) acc.hasCuratedEnvKey = true;
1006
+ } else if (surface === "script") acc.hasScript = true;
1007
+ else if (surface === "config") acc.hasConfig = true;
1008
+ else if (DEMOTED_SOURCE_SUFFIXES.has(suffix)) acc.hasSourceDemoted = true;
1009
+ else acc.hasSourceNonDemoted = true;
1010
+ }
1011
+ }
1012
+ const squash = (s) => s.replace(/[-_.]/g, "");
1013
+ const existingTokens = Array.from(accumulators.keys());
1014
+ for (const [host, count] of hostCounts) {
1015
+ if (isNoiseHost(host)) continue;
1016
+ const firstLabel = host.split(".")[0] ?? "";
1017
+ const apiIsh = API_ISH_SUBDOMAINS.has(firstLabel);
1018
+ const primary = hostPrimaryLabel(host);
1019
+ const squashedHost = squash(host);
1020
+ const matchingTokens = existingTokens.filter((token) => {
1021
+ const squashedToken = squash(token);
1022
+ return squashedToken.length > 0 && (squashedHost.includes(squashedToken) || primary.length > 0 && squashedToken.includes(squash(primary)));
1023
+ });
1024
+ const containsExistingToken = matchingTokens.length > 0;
1025
+ const repeated = count >= MIN_PLAIN_HOST_OCCURRENCES;
1026
+ const qualifies = apiIsh || repeated || containsExistingToken;
1027
+ if (!qualifies) continue;
1028
+ const attach = (acc) => {
1029
+ addEvidence(acc, "hostname", host);
1030
+ acc.hasHostname = true;
1031
+ if (apiIsh) acc.hasApiIshHostname = true;
1032
+ if (repeated) acc.hasRepeatedHostname = true;
1033
+ };
1034
+ if (matchingTokens.length > 0) {
1035
+ for (const token of matchingTokens) attach(getAcc(token));
1036
+ } else {
1037
+ const token = hostSlug(host);
1038
+ if (!token || isSuppressedToken(token)) continue;
1039
+ attach(getAcc(token));
1040
+ }
1041
+ }
1042
+ const dependencyNames = collectDependencyNames(root);
1043
+ const candidates = [];
1044
+ for (const [token, acc] of accumulators) {
1045
+ if (acc.evidence.size === 0) continue;
1046
+ const hasSourceKey = acc.hasSourceNonDemoted || acc.hasSourceDemoted;
1047
+ const hasManifestDep = dependencyNames.has(token);
1048
+ const curatedWillOffer = acc.hasCuratedEnvKey || hasManifestDep;
1049
+ if (CURATED_TOKENS.has(token) && curatedWillOffer && !hasSourceKey) continue;
1050
+ const confidence = computeConfidence(acc, hasManifestDep) ? "confirmed" : "unconfirmed";
1051
+ if (hasManifestDep) {
1052
+ addEvidence(acc, "package", token);
1053
+ }
1054
+ const evidence = Array.from(acc.evidence.values()).sort(
1055
+ (a, b) => a.class === b.class ? a.matched.localeCompare(b.matched) : a.class.localeCompare(b.class)
1056
+ );
1057
+ candidates.push({ token, confidence, evidence });
1058
+ }
1059
+ return candidates.sort((a, b) => a.token.localeCompare(b.token));
1060
+ }
1061
+ function computeConfidence(acc, hasManifestDep) {
1062
+ if (acc.hasEnvTemplate || acc.hasSourceNonDemoted || acc.hasApiIshHostname || acc.hasRepeatedHostname) {
1063
+ return true;
1064
+ }
1065
+ const lowClasses = /* @__PURE__ */ new Set();
1066
+ if (acc.hasScript) lowClasses.add("script");
1067
+ if (acc.hasConfig) lowClasses.add("config");
1068
+ if (acc.hasHostname) lowClasses.add("hostname");
1069
+ if (acc.hasSourceDemoted) lowClasses.add("demoted-source");
1070
+ const corroborators = /* @__PURE__ */ new Set();
1071
+ if (acc.hasHostname) corroborators.add("hostname");
1072
+ if (hasManifestDep) corroborators.add("manifest-dep");
1073
+ for (const low of lowClasses) {
1074
+ for (const corroborator of corroborators) {
1075
+ if (corroborator !== low) return true;
1076
+ }
1077
+ }
1078
+ return false;
1079
+ }
1080
+
1081
+ // src/core/knowledge/detect.ts
1082
+ var MAX_SWIFT_CONTENT_SAMPLES = 40;
1083
+ var MAX_SAMPLE_BYTES = 16e3;
1084
+ var MAX_SERVICE_HOSTNAME_SAMPLES = 60;
1085
+ var MAX_SERVICE_SCAN_FILES = 5e3;
1086
+ var SERVICE_SOURCE_EXTENSIONS = [
1087
+ ".ts",
1088
+ ".tsx",
1089
+ ".js",
1090
+ ".jsx",
1091
+ ".mjs",
1092
+ ".swift",
1093
+ ".py",
1094
+ ".go",
1095
+ ".rb",
1096
+ ".java",
1097
+ ".kt",
1098
+ ".cs",
1099
+ ".php",
1100
+ ".rs"
1101
+ ];
1102
+ var SERVICE_SCAN_EXCLUDES = [
1103
+ "test",
1104
+ "tests",
1105
+ "__tests__",
1106
+ "spec",
1107
+ "fixture",
1108
+ "fixtures",
1109
+ "mock",
1110
+ "mocks",
1111
+ "example",
1112
+ "examples",
1113
+ "sample",
1114
+ "samples",
1115
+ "vendor",
1116
+ "third_party",
1117
+ "third-party"
1118
+ ];
1119
+ var MCP_CONFIG_CANDIDATES = [".mcp.json", ".cursor/mcp.json", ".vscode/mcp.json"];
1120
+ function readTextSafe2(filePath, maxBytes = MAX_SAMPLE_BYTES) {
1121
+ try {
1122
+ return readFileSync4(filePath, "utf8").slice(0, maxBytes);
1123
+ } catch {
1124
+ return "";
1125
+ }
1126
+ }
1127
+ function fileSizeBytes(filePath) {
1128
+ try {
1129
+ const stat = statSync(filePath);
1130
+ return stat.isFile() ? stat.size : 0;
1131
+ } catch {
1132
+ return 0;
1133
+ }
1134
+ }
1135
+ function readJsonSafe2(filePath) {
1136
+ try {
1137
+ const parsed = JSON.parse(readFileSync4(filePath, "utf8"));
1138
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
1139
+ } catch {
1140
+ return null;
1141
+ }
1142
+ }
1143
+ function collectFiles(root, predicate, limit) {
1144
+ const matches = [];
1145
+ const stack = [""];
1146
+ while (stack.length > 0 && matches.length < limit) {
1147
+ const relativeDirectory = stack.pop() ?? "";
1148
+ let entries;
1149
+ try {
1150
+ entries = readdirSync2(path4.join(root, relativeDirectory), { withFileTypes: true });
1151
+ } catch {
1152
+ continue;
1153
+ }
1154
+ for (const entry of entries) {
1155
+ const relativePath = path4.join(relativeDirectory, entry.name);
1156
+ if (isIgnoredProjectPath(relativePath)) continue;
1157
+ if (entry.isDirectory()) {
1158
+ stack.push(relativePath);
1159
+ } else if (entry.isFile() && predicate(relativePath, entry.name)) {
1160
+ matches.push(relativePath);
1161
+ if (matches.length >= limit) break;
1162
+ }
1163
+ }
1164
+ }
1165
+ return matches;
1166
+ }
1167
+ function detectJsFrameworks(root) {
1168
+ const pkg = readJsonSafe2(path4.join(root, "package.json"));
1169
+ if (!pkg) return [];
1170
+ const dependencyNames = /* @__PURE__ */ new Set();
1171
+ for (const bucket of ["dependencies", "devDependencies", "peerDependencies"]) {
1172
+ const deps = pkg[bucket];
1173
+ if (deps && typeof deps === "object" && !Array.isArray(deps)) {
1174
+ for (const name of Object.keys(deps)) dependencyNames.add(name);
1175
+ }
1176
+ }
1177
+ const frameworks = /* @__PURE__ */ new Set();
1178
+ for (const [dependency, framework] of Object.entries(JS_FRAMEWORK_DEPENDENCIES)) {
1179
+ if (dependencyNames.has(dependency)) frameworks.add(framework);
1180
+ }
1181
+ return Array.from(frameworks);
1182
+ }
1183
+ function detectSwiftFrameworks(root) {
1184
+ const swiftFiles = collectFiles(
1185
+ root,
1186
+ (_relativePath, basename) => basename.endsWith(".swift"),
1187
+ MAX_SWIFT_CONTENT_SAMPLES
1188
+ );
1189
+ const frameworks = /* @__PURE__ */ new Set();
1190
+ for (const relativePath of swiftFiles) {
1191
+ const content = readTextSafe2(path4.join(root, relativePath));
1192
+ if (/^\s*import\s+SwiftUI\b/m.test(content)) frameworks.add("swiftui");
1193
+ if (/^\s*import\s+UIKit\b/m.test(content)) frameworks.add("uikit");
1194
+ if (/^\s*import\s+AppKit\b/m.test(content)) frameworks.add("appkit");
1195
+ if (/^\s*import\s+Vapor\b/m.test(content)) frameworks.add("vapor");
1196
+ if (frameworks.size >= 4) break;
1197
+ }
1198
+ return Array.from(frameworks);
1199
+ }
1200
+ function detectSdkTargets(root) {
1201
+ const targets = /* @__PURE__ */ new Set();
1202
+ const packageSwift = readTextSafe2(path4.join(root, "Package.swift"), 32e3);
1203
+ if (packageSwift) {
1204
+ const platformPattern = /\.(iOS|macOS|watchOS|tvOS|visionOS)\s*\(\s*(?:\.v(\d+)(?:_\d+)?|"(\d+)(?:\.\d+)*")\s*\)/g;
1205
+ for (const match of packageSwift.matchAll(platformPattern)) {
1206
+ const platform = (match[1] ?? "").toLowerCase();
1207
+ const version = match[2] ?? match[3];
1208
+ if (platform && version) targets.add(`${platform}-${version}`);
1209
+ }
1210
+ }
1211
+ const pbxprojFiles = collectFiles(
1212
+ root,
1213
+ (relativePath, basename) => basename === "project.pbxproj" && relativePath.includes(".xcodeproj"),
1214
+ 3
1215
+ );
1216
+ for (const relativePath of pbxprojFiles) {
1217
+ const content = readTextSafe2(path4.join(root, relativePath), 256e3);
1218
+ const ios = content.match(/IPHONEOS_DEPLOYMENT_TARGET\s*=\s*(\d+)(?:\.\d+)*/);
1219
+ if (ios?.[1]) targets.add(`ios-${ios[1]}`);
1220
+ const macos = content.match(/MACOSX_DEPLOYMENT_TARGET\s*=\s*(\d+)(?:\.\d+)*/);
1221
+ if (macos?.[1]) targets.add(`macos-${macos[1]}`);
1222
+ }
1223
+ return Array.from(targets).sort();
1224
+ }
1225
+ var MAX_TOOL_SCAN_FILES = 5e3;
1226
+ function detectTools(root) {
1227
+ const exactNames = /* @__PURE__ */ new Map();
1228
+ const suffixes = /* @__PURE__ */ new Map();
1229
+ for (const [tool, markers] of Object.entries(TOOL_MARKERS)) {
1230
+ for (const marker of markers) {
1231
+ if (marker.startsWith("*.")) suffixes.set(marker.slice(1), tool);
1232
+ else exactNames.set(marker, tool);
1233
+ }
1234
+ }
1235
+ const found = /* @__PURE__ */ new Set();
1236
+ let visited = 0;
1237
+ collectFiles(
1238
+ root,
1239
+ (_relativePath, basename) => {
1240
+ visited += 1;
1241
+ const exact = exactNames.get(basename);
1242
+ if (exact) found.add(exact);
1243
+ for (const [suffix, tool] of suffixes) {
1244
+ if (basename.endsWith(suffix)) found.add(tool);
1245
+ }
1246
+ return visited >= MAX_TOOL_SCAN_FILES;
1247
+ },
1248
+ 1
1249
+ );
1250
+ return Array.from(found).sort();
1251
+ }
1252
+ function collectDirectDependencyNames(root) {
1253
+ const names = /* @__PURE__ */ new Set();
1254
+ const pkg = readJsonSafe2(path4.join(root, "package.json"));
1255
+ if (pkg) {
1256
+ for (const bucket of [
1257
+ "dependencies",
1258
+ "devDependencies",
1259
+ "peerDependencies",
1260
+ "optionalDependencies"
1261
+ ]) {
1262
+ const deps = pkg[bucket];
1263
+ if (deps && typeof deps === "object" && !Array.isArray(deps)) {
1264
+ for (const name of Object.keys(deps)) names.add(name.toLowerCase());
1265
+ }
1266
+ }
1267
+ }
1268
+ const packageSwift = readTextSafe2(path4.join(root, "Package.swift"), 32e3);
1269
+ for (const match of packageSwift.matchAll(/\.package\([^)]*url:\s*"([^"]+)"/g)) {
1270
+ const url = match[1] ?? "";
1271
+ const slug = url.replace(/\.git$/, "").split("/").pop();
1272
+ if (slug) names.add(slug.toLowerCase());
1273
+ }
1274
+ const requirements = readTextSafe2(path4.join(root, "requirements.txt"), 32e3);
1275
+ for (const line of requirements.split(/\r?\n/)) {
1276
+ const trimmed = line.trim();
1277
+ if (!trimmed || trimmed.startsWith("#")) continue;
1278
+ const name = trimmed.split(/[<>=!~;[\s]/)[0];
1279
+ if (name) names.add(name.toLowerCase());
1280
+ }
1281
+ const goMod = readTextSafe2(path4.join(root, "go.mod"), 32e3);
1282
+ for (const match of goMod.matchAll(/^\s*(?:require\s+)?([\w.\-/]+\.[\w.\-/]+)\s+v\d/gm)) {
1283
+ const modulePath = (match[1] ?? "").toLowerCase().replace(/\/v\d+$/, "");
1284
+ if (!modulePath) continue;
1285
+ names.add(modulePath);
1286
+ const segment = modulePath.split("/").pop();
1287
+ if (segment) names.add(segment);
1288
+ }
1289
+ const gemfile = readTextSafe2(path4.join(root, "Gemfile"), 32e3);
1290
+ for (const match of gemfile.matchAll(/^\s*gem\s+["']([^"']+)["']/gm)) {
1291
+ const name = match[1];
1292
+ if (name) names.add(name.toLowerCase());
1293
+ }
1294
+ const composer = readJsonSafe2(path4.join(root, "composer.json"));
1295
+ if (composer) {
1296
+ for (const bucket of ["require", "require-dev"]) {
1297
+ const deps = composer[bucket];
1298
+ if (deps && typeof deps === "object" && !Array.isArray(deps)) {
1299
+ for (const name of Object.keys(deps)) {
1300
+ const key = name.toLowerCase();
1301
+ names.add(key);
1302
+ const segment = key.split("/").pop();
1303
+ if (segment) names.add(segment);
1304
+ }
1305
+ }
1306
+ }
1307
+ }
1308
+ return names;
1309
+ }
1310
+ function collectEnvKeyNames(root) {
1311
+ const keys = /* @__PURE__ */ new Set();
1312
+ const envCandidates = [
1313
+ ".env",
1314
+ ".env.example",
1315
+ ".env.sample",
1316
+ ".env.template",
1317
+ ".env.local",
1318
+ ".env.development",
1319
+ ".env.production"
1320
+ ];
1321
+ for (const candidate of envCandidates) {
1322
+ const content = readTextSafe2(path4.join(root, candidate), 32e3);
1323
+ if (!content) continue;
1324
+ for (const line of content.split(/\r?\n/)) {
1325
+ const trimmed = line.trim();
1326
+ if (!trimmed || trimmed.startsWith("#")) continue;
1327
+ const withoutExport = trimmed.replace(/^export\s+/, "");
1328
+ const eq = withoutExport.indexOf("=");
1329
+ const key = (eq >= 0 ? withoutExport.slice(0, eq) : withoutExport).trim();
1330
+ if (/^[A-Z][A-Z0-9_]*$/.test(key)) keys.add(key);
1331
+ }
1332
+ }
1333
+ return keys;
1334
+ }
1335
+ function isExcludedServicePath(relativePath) {
1336
+ const segments = relativePath.toLowerCase().split(path4.sep);
1337
+ return segments.some((segment) => SERVICE_SCAN_EXCLUDES.includes(segment));
1338
+ }
1339
+ function detectServices(root) {
1340
+ const dependencyNames = collectDirectDependencyNames(root);
1341
+ const envKeyNames = collectEnvKeyNames(root);
1342
+ const anyHostnames = SERVICE_SIGNALS.some((s) => s.hostnames.length > 0);
1343
+ const sourceHostnames = anyHostnames ? collectServiceHostnames(root) : /* @__PURE__ */ new Set();
1344
+ const detected = [];
1345
+ for (const signal of SERVICE_SIGNALS) {
1346
+ const evidence = [];
1347
+ if (signal.envKeys.some((key) => envKeyNames.has(key))) evidence.push("env-key");
1348
+ if (signal.packages.some((pkg) => dependencyNames.has(pkg.toLowerCase()))) {
1349
+ evidence.push("package");
1350
+ }
1351
+ if (signal.hostnames.some((host) => sourceHostnames.has(host.toLowerCase()))) {
1352
+ evidence.push("hostname");
1353
+ }
1354
+ if (evidence.length === 0) continue;
1355
+ const strong = evidence.includes("env-key") || evidence.includes("package");
1356
+ const confidence = strong ? evidence.length >= 2 ? "high" : "medium" : "low";
1357
+ detected.push({ token: signal.token, confidence, evidence });
1358
+ }
1359
+ return detected.sort((a, b) => a.token.localeCompare(b.token));
1360
+ }
1361
+ function collectServiceHostnames(root) {
1362
+ const wanted = /* @__PURE__ */ new Set();
1363
+ for (const signal of SERVICE_SIGNALS) {
1364
+ for (const host of signal.hostnames) wanted.add(host.toLowerCase());
1365
+ }
1366
+ const found = /* @__PURE__ */ new Set();
1367
+ if (wanted.size === 0) return found;
1368
+ let visited = 0;
1369
+ const sourceFiles = collectFiles(
1370
+ root,
1371
+ (relativePath, basename) => {
1372
+ if (visited >= MAX_SERVICE_SCAN_FILES) return true;
1373
+ visited += 1;
1374
+ return !isExcludedServicePath(relativePath) && SERVICE_SOURCE_EXTENSIONS.some((ext) => basename.endsWith(ext));
1375
+ },
1376
+ MAX_SERVICE_HOSTNAME_SAMPLES
1377
+ );
1378
+ for (const relativePath of sourceFiles) {
1379
+ const content = readTextSafe2(path4.join(root, relativePath)).toLowerCase();
1380
+ if (!content) continue;
1381
+ for (const host of wanted) {
1382
+ if (!found.has(host) && content.includes(host)) found.add(host);
1383
+ }
1384
+ if (found.size === wanted.size) break;
1385
+ }
1386
+ return found;
1387
+ }
1388
+ function auditAgentConfig(root) {
1389
+ const agentsPath = path4.join(root, "AGENTS.md");
1390
+ const agentsPresent = existsSync2(agentsPath);
1391
+ const agentsContent = agentsPresent ? readTextSafe2(agentsPath, 512e3) : "";
1392
+ const claudePath = path4.join(root, "CLAUDE.md");
1393
+ return {
1394
+ agentsMd: {
1395
+ present: agentsPresent,
1396
+ sizeBytes: agentsPresent ? fileSizeBytes(agentsPath) : 0,
1397
+ hasKnowledgeBlock: agentsContent.includes(KNOWLEDGE_BLOCK_BEGIN)
1398
+ },
1399
+ claudeMd: {
1400
+ present: existsSync2(claudePath),
1401
+ sizeBytes: existsSync2(claudePath) ? fileSizeBytes(claudePath) : 0
1402
+ },
1403
+ mcpConfigs: MCP_CONFIG_CANDIDATES.filter((candidate) => existsSync2(path4.join(root, candidate))),
1404
+ knowledgeManifest: { present: existsSync2(knowledgeManifestPath(root)) }
1405
+ };
1406
+ }
1407
+ function computeStackFingerprint(detection) {
1408
+ const payload = {
1409
+ languages: [...detection.languages].sort(),
1410
+ frameworks: [...detection.frameworks].sort(),
1411
+ sdkTargets: [...detection.sdkTargets].sort()
1412
+ };
1413
+ if (detection.tools && detection.tools.length > 0) payload.tools = [...detection.tools].sort();
1414
+ if (detection.domains && detection.domains.length > 0)
1415
+ payload.domains = [...detection.domains].sort();
1416
+ return createHash("sha256").update(JSON.stringify(payload)).digest("hex").slice(0, 16);
1417
+ }
1418
+ function detectStack(cwd, options = {}) {
1419
+ const root = path4.resolve(cwd);
1420
+ const capabilities = options.capabilities ?? detectProjectCapabilities(root);
1421
+ const frameworks = /* @__PURE__ */ new Set();
1422
+ if (capabilities.languages.includes("swift")) {
1423
+ for (const framework of detectSwiftFrameworks(root)) frameworks.add(framework);
1424
+ }
1425
+ if (capabilities.languages.includes("node")) {
1426
+ for (const framework of detectJsFrameworks(root)) frameworks.add(framework);
1427
+ }
1428
+ const sdkTargets = capabilities.languages.includes("swift") ? detectSdkTargets(root) : [];
1429
+ const tools = detectTools(root);
1430
+ const partial = {
1431
+ languages: capabilities.languages,
1432
+ frameworks: Array.from(frameworks).sort(),
1433
+ sdkTargets,
1434
+ tools
1435
+ };
1436
+ const detectedServices = detectServices(root);
1437
+ const serviceCandidates = detectServiceCandidates(root);
1438
+ return {
1439
+ root,
1440
+ ...partial,
1441
+ ...detectedServices.length > 0 ? { detectedServices } : {},
1442
+ ...serviceCandidates.length > 0 ? { serviceCandidates } : {},
1443
+ agentConfig: auditAgentConfig(root),
1444
+ fingerprint: computeStackFingerprint(partial)
1445
+ };
1446
+ }
1447
+
1448
+ // src/core/knowledge/intent.ts
1449
+ import { existsSync as existsSync3, mkdirSync, readFileSync as readFileSync5, unlinkSync, writeFileSync } from "fs";
1450
+ import path5 from "path";
1451
+ import { z as z3 } from "zod";
1452
+ var IntentDimensionStatus = z3.enum(["active", "satisfied", "conflict", "retired"]);
1453
+ var IntentDimensionSchema = z3.object({
1454
+ token: z3.string().min(1),
1455
+ dimension: z3.enum(STACK_DIMENSIONS),
1456
+ status: IntentDimensionStatus,
1457
+ statusChangedAt: z3.string().min(1),
1458
+ /** Present only in `conflict` status. */
1459
+ conflict: z3.object({
1460
+ detectedToken: z3.string().min(1),
1461
+ acknowledged: z3.boolean()
1462
+ }).optional()
1463
+ });
1464
+ var StackIntentContractSchema = z3.object({
1465
+ schemaVersion: z3.literal(1),
1466
+ /** Verbatim user spec (provenance for notices and doctor). */
1467
+ spec: z3.string().min(1),
1468
+ declaredAt: z3.string().min(1),
1469
+ /** Optional free-text rationale (`--reason`). */
1470
+ rationale: z3.string().optional(),
1471
+ /** Derived, stored for greppability: retired | conflict | active. */
1472
+ status: z3.enum(["active", "conflict", "retired"]),
1473
+ dimensions: z3.array(IntentDimensionSchema),
1474
+ retiredAt: z3.string().nullable()
1475
+ });
1476
+ function stackIntentPath(cwd) {
1477
+ return path5.join(cwd, ".poetic", "context", "knowledge", "stack-intent.json");
1478
+ }
1479
+ function legacyDeclaredStackPath(cwd) {
1480
+ return path5.join(cwd, ".poetic", "state", "declared-stack.json");
1481
+ }
1482
+ function parseIntentSpec(spec) {
1483
+ const rawTokens = spec.split(/[,\s]+/).map((token) => token.trim()).filter((token) => token.length > 0);
1484
+ if (rawTokens.length === 0) {
1485
+ return {
1486
+ ok: false,
1487
+ error: "Empty --stack spec. Example: --stack swift,swiftui,macos-26 or --stack tool:terraform,domain:aws"
1488
+ };
1489
+ }
1490
+ const byKey = /* @__PURE__ */ new Map();
1491
+ for (const raw of rawTokens) {
1492
+ const result = classifyStackToken(raw);
1493
+ if (!result.ok) return { ok: false, error: result.error };
1494
+ const key = `${result.token.dimension}:${result.token.token}`;
1495
+ const existing = byKey.get(key);
1496
+ if (!existing || result.token.explicit && !existing.explicit) {
1497
+ byKey.set(key, result.token);
1498
+ }
1499
+ }
1500
+ const tokens = Array.from(byKey.values());
1501
+ if (!hasStrongAnchor(tokens)) {
1502
+ return {
1503
+ ok: false,
1504
+ error: "--stack needs at least one strong anchor: a known language (swift, python, ...), a versioned platform (macos-26, k8s-1.31), or an explicitly prefixed token (tool:terraform, domain:aws, fw:htmx)."
1505
+ };
1506
+ }
1507
+ return { ok: true, tokens };
1508
+ }
1509
+ function deriveContractStatus(dimensions) {
1510
+ if (dimensions.every((d) => d.status === "retired")) {
1511
+ return "retired";
1512
+ }
1513
+ if (dimensions.some((d) => d.status === "conflict" && d.conflict?.acknowledged !== true)) {
1514
+ return "conflict";
1515
+ }
1516
+ return "active";
1517
+ }
1518
+ function createIntentContract(spec, tokens, options = {}) {
1519
+ const nowIso = (options.now?.() ?? /* @__PURE__ */ new Date()).toISOString();
1520
+ const dimensions = tokens.map((token) => ({
1521
+ token: token.token,
1522
+ dimension: token.dimension,
1523
+ status: "active",
1524
+ statusChangedAt: nowIso
1525
+ }));
1526
+ return {
1527
+ schemaVersion: 1,
1528
+ spec,
1529
+ declaredAt: nowIso,
1530
+ ...options.rationale ? { rationale: options.rationale } : {},
1531
+ status: deriveContractStatus(dimensions),
1532
+ dimensions,
1533
+ retiredAt: null
1534
+ };
1535
+ }
1536
+ function readIntentContract(cwd) {
1537
+ const filePath = stackIntentPath(cwd);
1538
+ if (!existsSync3(filePath)) return { status: "absent" };
1539
+ try {
1540
+ const parsed = StackIntentContractSchema.safeParse(JSON.parse(readFileSync5(filePath, "utf8")));
1541
+ if (!parsed.success) {
1542
+ return { status: "invalid", error: parsed.error.issues[0]?.message ?? "schema mismatch" };
1543
+ }
1544
+ return { status: "ok", contract: parsed.data };
1545
+ } catch (error) {
1546
+ return { status: "invalid", error: error instanceof Error ? error.message : String(error) };
1547
+ }
1548
+ }
1549
+ function writeIntentContract(cwd, contract) {
1550
+ const filePath = stackIntentPath(cwd);
1551
+ mkdirSync(path5.dirname(filePath), { recursive: true });
1552
+ writeFileSync(filePath, `${JSON.stringify(contract, null, 2)}
1553
+ `, "utf8");
1554
+ }
1555
+ function removeIntentContract(cwd) {
1556
+ try {
1557
+ unlinkSync(stackIntentPath(cwd));
1558
+ } catch {
1559
+ }
1560
+ }
1561
+ var LegacyDeclaredSchema = z3.object({
1562
+ schemaVersion: z3.literal(1),
1563
+ spec: z3.string().min(1),
1564
+ declaredAt: z3.string().min(1),
1565
+ languages: z3.array(z3.string()),
1566
+ frameworks: z3.array(z3.string()),
1567
+ sdkTargets: z3.array(z3.string())
1568
+ });
1569
+ function migrateLegacyDeclaration(cwd, options = {}) {
1570
+ const legacyPath = legacyDeclaredStackPath(cwd);
1571
+ if (!existsSync3(legacyPath)) return void 0;
1572
+ const existing = readIntentContract(cwd);
1573
+ if (existing.status !== "absent") {
1574
+ if (existing.status === "ok") {
1575
+ try {
1576
+ unlinkSync(legacyPath);
1577
+ } catch {
1578
+ }
1579
+ }
1580
+ return void 0;
1581
+ }
1582
+ let legacy;
1583
+ try {
1584
+ const parsed = LegacyDeclaredSchema.safeParse(JSON.parse(readFileSync5(legacyPath, "utf8")));
1585
+ if (!parsed.success) return void 0;
1586
+ legacy = parsed.data;
1587
+ } catch {
1588
+ return void 0;
1589
+ }
1590
+ const rawTokens = [...legacy.languages, ...legacy.sdkTargets, ...legacy.frameworks];
1591
+ const tokens = [];
1592
+ for (const raw of rawTokens) {
1593
+ const result = classifyStackToken(raw);
1594
+ if (result.ok) tokens.push(result.token);
1595
+ }
1596
+ if (tokens.length === 0) return void 0;
1597
+ const contract = createIntentContract(legacy.spec, tokens, { now: options.now });
1598
+ const migrated = { ...contract, declaredAt: legacy.declaredAt };
1599
+ writeIntentContract(cwd, migrated);
1600
+ try {
1601
+ unlinkSync(legacyPath);
1602
+ } catch {
1603
+ }
1604
+ return migrated;
1605
+ }
1606
+ function resolveIntent(detection, contract, options = {}) {
1607
+ const nowIso = (options.now?.() ?? /* @__PURE__ */ new Date()).toISOString();
1608
+ const detectedLanguages = new Set(detection.languages);
1609
+ const detectedFrameworks = new Set(detection.frameworks);
1610
+ const detectedSdk = new Set(detection.sdkTargets);
1611
+ const detectedTools = new Set(detection.tools ?? []);
1612
+ const detectedDomains = new Set(detection.domains ?? []);
1613
+ const detectedSdkByPlatform = /* @__PURE__ */ new Map();
1614
+ for (const target of detection.sdkTargets) {
1615
+ detectedSdkByPlatform.set(sdkPlatform(target), target);
1616
+ }
1617
+ const languages = new Set(detection.languages);
1618
+ const frameworks = new Set(detection.frameworks);
1619
+ const sdkTargets = new Set(detection.sdkTargets);
1620
+ const tools = new Set(detection.tools ?? []);
1621
+ const domains = new Set(detection.domains ?? []);
1622
+ const acknowledgedSdkPairs = [...detection.acknowledgedSdkPairs ?? []];
1623
+ const conflicts = [];
1624
+ let contractChanged = false;
1625
+ let declaredRealLanguage = false;
1626
+ const dimensions = contract.dimensions.map((dim) => {
1627
+ if (dim.status === "retired") return dim;
1628
+ const setStatus = (status, conflict) => {
1629
+ const unchanged = dim.status === status && dim.conflict?.detectedToken === conflict?.detectedToken && dim.conflict?.acknowledged === conflict?.acknowledged;
1630
+ if (unchanged) return dim;
1631
+ contractChanged = true;
1632
+ return {
1633
+ ...dim,
1634
+ status,
1635
+ statusChangedAt: nowIso,
1636
+ ...conflict ? { conflict } : { conflict: void 0 }
1637
+ };
1638
+ };
1639
+ switch (dim.dimension) {
1640
+ case "lang": {
1641
+ declaredRealLanguage = true;
1642
+ if (detectedLanguages.has(dim.token)) {
1643
+ return setStatus("satisfied");
1644
+ }
1645
+ languages.add(dim.token);
1646
+ return setStatus("active");
1647
+ }
1648
+ case "fw": {
1649
+ if (detectedFrameworks.has(dim.token)) return setStatus("satisfied");
1650
+ frameworks.add(dim.token);
1651
+ return setStatus("active");
1652
+ }
1653
+ case "tool": {
1654
+ if (detectedTools.has(dim.token)) return setStatus("satisfied");
1655
+ tools.add(dim.token);
1656
+ return setStatus("active");
1657
+ }
1658
+ case "domain": {
1659
+ if (detectedDomains.has(dim.token)) return setStatus("satisfied");
1660
+ domains.add(dim.token);
1661
+ return setStatus("active");
1662
+ }
1663
+ case "sdk": {
1664
+ if (detectedSdk.has(dim.token)) return setStatus("satisfied");
1665
+ const platform = sdkPlatform(dim.token);
1666
+ const detectedSame = detectedSdkByPlatform.get(platform);
1667
+ if (!detectedSame) {
1668
+ sdkTargets.add(dim.token);
1669
+ return setStatus("active");
1670
+ }
1671
+ const acknowledged = dim.conflict?.acknowledged === true && dim.conflict.detectedToken === detectedSame;
1672
+ if (acknowledged) {
1673
+ sdkTargets.add(dim.token);
1674
+ acknowledgedSdkPairs.push({
1675
+ platform,
1676
+ sdkVersion: sdkVersion(dim.token),
1677
+ deploymentVersion: sdkVersion(detectedSame)
1678
+ });
1679
+ return setStatus("conflict", { detectedToken: detectedSame, acknowledged: true });
1680
+ }
1681
+ const next = setStatus("conflict", { detectedToken: detectedSame, acknowledged: false });
1682
+ conflicts.push({ dimension: next, detectedToken: detectedSame });
1683
+ return next;
1684
+ }
1685
+ default: {
1686
+ const exhaustive = dim.dimension;
1687
+ return exhaustive;
1688
+ }
1689
+ }
1690
+ });
1691
+ if (declaredRealLanguage) {
1692
+ languages.delete("docs");
1693
+ languages.delete("unknown");
1694
+ if (languages.size === 0) {
1695
+ for (const dim of dimensions) {
1696
+ if (dim.dimension === "lang") {
1697
+ languages.add(dim.token);
1698
+ }
1699
+ }
1700
+ }
1701
+ }
1702
+ const partial = {
1703
+ languages: Array.from(languages).sort(),
1704
+ frameworks: Array.from(frameworks).sort(),
1705
+ sdkTargets: Array.from(sdkTargets).sort(),
1706
+ tools: Array.from(tools).sort(),
1707
+ domains: Array.from(domains).sort()
1708
+ };
1709
+ const updatedContract = {
1710
+ ...contract,
1711
+ status: deriveContractStatus(dimensions),
1712
+ dimensions
1713
+ };
1714
+ if (updatedContract.status !== contract.status) contractChanged = true;
1715
+ const effective = {
1716
+ ...detection,
1717
+ ...partial,
1718
+ ...acknowledgedSdkPairs.length > 0 ? { acknowledgedSdkPairs } : {},
1719
+ fingerprint: computeStackFingerprint(partial)
1720
+ };
1721
+ const dimensionDone = (d) => d.status === "satisfied" || d.status === "retired" || d.status === "conflict" && d.conflict?.acknowledged === true;
1722
+ const allCovered = dimensions.every(dimensionDone);
1723
+ const allSatisfied = allCovered || dimensions.every(
1724
+ (d) => dimensionDone(d) || !isGatingToken({ token: d.token, dimension: d.dimension, explicit: true })
1725
+ );
1726
+ return {
1727
+ effective,
1728
+ contract: updatedContract,
1729
+ contractChanged,
1730
+ conflicts,
1731
+ allSatisfied,
1732
+ allCovered
1733
+ };
1734
+ }
1735
+ function retireContract(contract, options = {}) {
1736
+ const nowIso = (options.now?.() ?? /* @__PURE__ */ new Date()).toISOString();
1737
+ return {
1738
+ ...contract,
1739
+ status: "retired",
1740
+ retiredAt: nowIso,
1741
+ dimensions: contract.dimensions.map(
1742
+ (dim) => dim.status === "retired" ? dim : { ...dim, status: "retired", statusChangedAt: nowIso }
1743
+ )
1744
+ };
1745
+ }
1746
+ function acknowledgeConflicts(contract, options = {}) {
1747
+ const nowIso = (options.now?.() ?? /* @__PURE__ */ new Date()).toISOString();
1748
+ const dimensions = contract.dimensions.map((dim) => {
1749
+ if (dim.status !== "conflict" || dim.conflict?.acknowledged === true) return dim;
1750
+ return {
1751
+ ...dim,
1752
+ statusChangedAt: nowIso,
1753
+ conflict: {
1754
+ ...dim.conflict,
1755
+ acknowledged: true
1756
+ }
1757
+ };
1758
+ });
1759
+ return { ...contract, status: deriveContractStatus(dimensions), dimensions };
1760
+ }
1761
+ function acceptDetectedReality(contract, options = {}) {
1762
+ const nowIso = (options.now?.() ?? /* @__PURE__ */ new Date()).toISOString();
1763
+ const dimensions = contract.dimensions.map((dim) => {
1764
+ if (dim.status !== "conflict") return dim;
1765
+ return { ...dim, status: "retired", statusChangedAt: nowIso, conflict: void 0 };
1766
+ });
1767
+ return { ...contract, status: deriveContractStatus(dimensions), dimensions };
1768
+ }
1769
+ function describeDimension(dim) {
1770
+ const base = `${dim.token.padEnd(12)} ${dim.dimension.padEnd(6)} ${dim.status}`;
1771
+ if (dim.status === "conflict" && dim.conflict) {
1772
+ const ack = dim.conflict.acknowledged ? " (acknowledged)" : "";
1773
+ return `${base}${ack} \u2014 detected ${dim.conflict.detectedToken}`;
1774
+ }
1775
+ if (dim.status === "active") return `${base} (not yet in code)`;
1776
+ return base;
1777
+ }
1778
+
1779
+ export {
1780
+ KitItemSchema,
1781
+ resolvePoeticVersion,
1782
+ KNOWLEDGE_BLOCK_BEGIN,
1783
+ KNOWLEDGE_BLOCK_END,
1784
+ CONTEXT_DIR,
1785
+ knowledgeManifestPath,
1786
+ readKnowledgeManifest,
1787
+ writeKnowledgeManifest,
1788
+ createManifest,
1789
+ CANDIDATE_ITEM_ID_PREFIX,
1790
+ CANDIDATE_SEARCH_PRIORITY,
1791
+ MAX_UNRESOLVED_LINES,
1792
+ candidateSetSignature,
1793
+ QUERY_SAFE_EVIDENCE_CLASSES,
1794
+ isQuerySafeHostname,
1795
+ isCandidateQuerySafe,
1796
+ SERVICE_DOC_DOMAINS,
1797
+ serviceSignalForToken,
1798
+ detectStack,
1799
+ stackIntentPath,
1800
+ legacyDeclaredStackPath,
1801
+ parseIntentSpec,
1802
+ createIntentContract,
1803
+ readIntentContract,
1804
+ writeIntentContract,
1805
+ removeIntentContract,
1806
+ migrateLegacyDeclaration,
1807
+ resolveIntent,
1808
+ retireContract,
1809
+ acknowledgeConflicts,
1810
+ acceptDetectedReality,
1811
+ describeDimension
1812
+ };
1813
+ //# sourceMappingURL=chunk-KZ5CJVBP.js.map