@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,1125 @@
1
+ import {
2
+ LocalFileBackend,
3
+ checkVersion
4
+ } from "./chunk-CTLUBNCW.js";
5
+ import {
6
+ createWorkItemFile
7
+ } from "./chunk-6MFRHTRI.js";
8
+ import {
9
+ DEFAULT_LEASE_TTL_MS,
10
+ HumanReviewRequiredError,
11
+ InvalidTransitionError,
12
+ LeaseExpiredError
13
+ } from "./chunk-Y55LZN5U.js";
14
+ import {
15
+ StaleVersionError
16
+ } from "./chunk-TDSEX5CF.js";
17
+ import {
18
+ generateId
19
+ } from "./chunk-VNSYKC25.js";
20
+ import {
21
+ withIndexRegeneration
22
+ } from "./chunk-OPYFYTWQ.js";
23
+ import {
24
+ getBucketPathByKind
25
+ } from "./chunk-HOYBYAOA.js";
26
+ import {
27
+ listMarkdownFiles,
28
+ parseMarkdownFile,
29
+ writeMarkdownFile
30
+ } from "./chunk-OIS7J26S.js";
31
+ import {
32
+ assertSafePathComponent
33
+ } from "./chunk-S2VQCZO4.js";
34
+ import {
35
+ emitWarning
36
+ } from "./chunk-EJGCZGUF.js";
37
+
38
+ // src/planning/issue-fingerprint.ts
39
+ import { createHash } from "crypto";
40
+ function normalizeSnippet(snippet) {
41
+ return snippet.split("\n").map((line) => line.trim()).filter((line, i, arr) => !(line === "" && arr[i - 1] === "")).join("\n").replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "").replace(/\s+/g, " ").trim();
42
+ }
43
+ function normalizePath(filepath) {
44
+ return filepath.replace(/\\/g, "/").replace(/^\.\//, "").toLowerCase();
45
+ }
46
+ function sha256(input) {
47
+ return createHash("sha256").update(input, "utf8").digest("hex");
48
+ }
49
+ function generateFingerprint(input) {
50
+ const normalizedSnippet = normalizeSnippet(input.snippet);
51
+ const normalizedPath = normalizePath(input.path);
52
+ const snippetHash = sha256(normalizedSnippet);
53
+ const compositeInput = [input.ruleId, snippetHash, input.symbolName ?? "", normalizedPath].join(
54
+ "\0"
55
+ );
56
+ const compositeHash = sha256(compositeInput);
57
+ return {
58
+ ruleId: input.ruleId,
59
+ snippetHash,
60
+ symbolName: input.symbolName,
61
+ path: normalizedPath,
62
+ compositeHash
63
+ };
64
+ }
65
+ function matchFingerprint(candidate, existing) {
66
+ if (candidate.compositeHash === existing.compositeHash) {
67
+ return "exact";
68
+ }
69
+ if (candidate.ruleId === existing.ruleId && candidate.symbolName && existing.symbolName && candidate.symbolName === existing.symbolName) {
70
+ return "fuzzy";
71
+ }
72
+ return "none";
73
+ }
74
+ function findDuplicate(candidate, existingFingerprints) {
75
+ let bestExact = null;
76
+ let bestFuzzy = null;
77
+ for (const existing of existingFingerprints) {
78
+ const strength = matchFingerprint(candidate, existing.fingerprint);
79
+ if (strength === "exact") {
80
+ if (!bestExact || existing.findingId < bestExact.existingFindingId) {
81
+ bestExact = {
82
+ strength: "exact",
83
+ existingFindingId: existing.findingId,
84
+ fingerprint: existing.fingerprint
85
+ };
86
+ }
87
+ continue;
88
+ }
89
+ if (strength === "fuzzy") {
90
+ const confidence = computeFuzzyConfidence(candidate, existing.fingerprint);
91
+ const reason = describeFuzzyMatch(candidate, existing.fingerprint);
92
+ if (!bestFuzzy || confidence > (bestFuzzy.confidence ?? 0) || Math.abs(confidence - (bestFuzzy.confidence ?? 0)) < Number.EPSILON && existing.findingId < bestFuzzy.existingFindingId) {
93
+ bestFuzzy = {
94
+ strength: "fuzzy",
95
+ existingFindingId: existing.findingId,
96
+ fingerprint: existing.fingerprint,
97
+ confidence,
98
+ reason
99
+ };
100
+ }
101
+ }
102
+ }
103
+ if (bestExact) return bestExact;
104
+ return bestFuzzy;
105
+ }
106
+ function computeFuzzyConfidence(candidate, existing) {
107
+ let confidence = 0.55;
108
+ if (candidate.snippetHash === existing.snippetHash) confidence += 0.25;
109
+ if (candidate.path === existing.path) confidence += 0.2;
110
+ return Math.min(1, confidence);
111
+ }
112
+ function describeFuzzyMatch(candidate, existing) {
113
+ const details = ["matched ruleId + symbolName"];
114
+ details.push(
115
+ candidate.snippetHash === existing.snippetHash ? "same snippet hash" : "different snippet hash"
116
+ );
117
+ details.push(candidate.path === existing.path ? "same path" : "different path");
118
+ return details.join("; ");
119
+ }
120
+ function trackOccurrence(currentCount, now = /* @__PURE__ */ new Date()) {
121
+ return {
122
+ lastSeenAt: now.toISOString(),
123
+ occurrenceCount: currentCount + 1
124
+ };
125
+ }
126
+
127
+ // src/planning/issue-manager.ts
128
+ import * as path from "path";
129
+
130
+ // src/planning/coordination/lease.ts
131
+ var DEFAULT_LEASE_TTL_MS2 = 15 * 60 * 1e3;
132
+ var DEFAULT_GRACE_MS = 5 * 60 * 1e3;
133
+ function isExpiryLive(expiresAtIso, nowIso) {
134
+ if (!expiresAtIso) return false;
135
+ const expiryMs = Date.parse(expiresAtIso);
136
+ const nowMs = Date.parse(nowIso);
137
+ if (Number.isNaN(expiryMs) || Number.isNaN(nowMs)) return false;
138
+ return expiryMs > nowMs;
139
+ }
140
+
141
+ // src/planning/issue-state-machine.ts
142
+ var FINDING_TRANSITIONS = {
143
+ raw: ["open", "closed"],
144
+ open: ["closed"],
145
+ closed: []
146
+ };
147
+ var ISSUE_TRANSITIONS = {
148
+ open: ["claimed", "investigating", "wontfix", "duplicate"],
149
+ claimed: ["claimed", "resolved", "open", "wontfix", "duplicate", "investigating"],
150
+ investigating: ["open", "resolved", "wontfix", "duplicate"],
151
+ resolved: [],
152
+ // terminal
153
+ wontfix: [],
154
+ // terminal
155
+ duplicate: []
156
+ // terminal
157
+ };
158
+ function requiresHumanActorForIssue(toStatus, category, severity) {
159
+ if (toStatus === "wontfix" && (category === "security" || severity === "critical")) {
160
+ return true;
161
+ }
162
+ return false;
163
+ }
164
+ function requiresHumanActorForFinding(finding, toStatus) {
165
+ return finding.status === "raw" && toStatus === "open" && finding.requiresHumanReview;
166
+ }
167
+ function isEffectivelyClaimed(entity, now = /* @__PURE__ */ new Date()) {
168
+ if (!entity.claimedBy || !entity.expiresAt) return false;
169
+ return isExpiryLive(entity.expiresAt, now.toISOString());
170
+ }
171
+ function transitionFinding(input) {
172
+ const { finding, toStatus, actor, expectedVersion, closedReason, fixCommit, deferredNote } = input;
173
+ const now = input.now ?? /* @__PURE__ */ new Date();
174
+ const nowISO = now.toISOString();
175
+ checkVersion(finding.id, finding.version, expectedVersion);
176
+ const allowed = FINDING_TRANSITIONS[finding.status];
177
+ if (!allowed.includes(toStatus)) {
178
+ throw new InvalidTransitionError(finding.id, finding.status, toStatus);
179
+ }
180
+ if (requiresHumanActorForFinding(finding, toStatus) && actor.actorType !== "human") {
181
+ throw new HumanReviewRequiredError(
182
+ finding.id,
183
+ `${finding.status} \u2192 ${toStatus}`,
184
+ finding.category,
185
+ finding.severity
186
+ );
187
+ }
188
+ if (toStatus === "closed" && !closedReason) {
189
+ throw new InvalidTransitionError(
190
+ finding.id,
191
+ finding.status,
192
+ toStatus,
193
+ "closedReason is required when closing a finding"
194
+ );
195
+ }
196
+ const updated = {
197
+ ...finding,
198
+ status: toStatus,
199
+ version: finding.version + 1,
200
+ updatedAt: nowISO
201
+ };
202
+ if (toStatus === "closed") {
203
+ updated.closedReason = closedReason;
204
+ updated.closedBy = actor;
205
+ updated.closedAt = nowISO;
206
+ if (fixCommit) updated.fixCommit = fixCommit;
207
+ if (deferredNote) updated.deferredNote = deferredNote;
208
+ }
209
+ return updated;
210
+ }
211
+ function transitionIssue(input) {
212
+ const { issue, toStatus, actor, expectedVersion, resolution, leaseTtlMs } = input;
213
+ const now = input.now ?? /* @__PURE__ */ new Date();
214
+ const nowISO = now.toISOString();
215
+ checkVersion(issue.id, issue.version, expectedVersion);
216
+ const allowed = ISSUE_TRANSITIONS[issue.status];
217
+ if (!allowed.includes(toStatus)) {
218
+ throw new InvalidTransitionError(issue.id, issue.status, toStatus);
219
+ }
220
+ if (requiresHumanActorForIssue(toStatus, issue.category, issue.severity)) {
221
+ if (actor.actorType !== "human") {
222
+ throw new HumanReviewRequiredError(
223
+ issue.id,
224
+ `${issue.status} \u2192 ${toStatus}`,
225
+ issue.category,
226
+ issue.severity
227
+ );
228
+ }
229
+ }
230
+ const updated = {
231
+ ...issue,
232
+ status: toStatus,
233
+ version: issue.version + 1,
234
+ updatedAt: nowISO
235
+ };
236
+ switch (toStatus) {
237
+ case "claimed": {
238
+ if (isEffectivelyClaimed(issue, now) && issue.claimedBy !== actor.actorId) {
239
+ throw new InvalidTransitionError(
240
+ issue.id,
241
+ issue.status,
242
+ toStatus,
243
+ `Already claimed by ${issue.claimedBy}`
244
+ );
245
+ }
246
+ const ttl = getValidLeaseTtlMs(leaseTtlMs, issue.id, issue.status, toStatus);
247
+ updated.claimedBy = actor.actorId;
248
+ updated.claimedAt = nowISO;
249
+ updated.expiresAt = new Date(now.getTime() + ttl).toISOString();
250
+ break;
251
+ }
252
+ case "resolved":
253
+ if (issue.status === "claimed") {
254
+ if (issue.claimedBy !== actor.actorId) {
255
+ throw new InvalidTransitionError(
256
+ issue.id,
257
+ issue.status,
258
+ toStatus,
259
+ "Only the claimant can resolve"
260
+ );
261
+ }
262
+ if (!isEffectivelyClaimed(issue, now)) {
263
+ throw new LeaseExpiredError(issue.id, issue.expiresAt ?? "unknown");
264
+ }
265
+ }
266
+ if (!resolution) {
267
+ throw new InvalidTransitionError(
268
+ issue.id,
269
+ issue.status,
270
+ toStatus,
271
+ "Resolution required when resolving"
272
+ );
273
+ }
274
+ updated.resolution = resolution;
275
+ updated.resolvedBy = actor;
276
+ updated.resolvedAt = nowISO;
277
+ if (input.fixCommit !== void 0) {
278
+ const fixCommit = input.fixCommit.trim();
279
+ if (fixCommit.length === 0) {
280
+ throw new InvalidTransitionError(
281
+ issue.id,
282
+ issue.status,
283
+ toStatus,
284
+ "fixCommit must be a non-empty string when provided"
285
+ );
286
+ }
287
+ updated.fixCommit = fixCommit;
288
+ }
289
+ if (input.fixPr !== void 0) {
290
+ if (!Number.isInteger(input.fixPr) || input.fixPr <= 0) {
291
+ throw new InvalidTransitionError(
292
+ issue.id,
293
+ issue.status,
294
+ toStatus,
295
+ "fixPr must be a positive integer when provided"
296
+ );
297
+ }
298
+ updated.fixPr = input.fixPr;
299
+ }
300
+ updated.claimedBy = void 0;
301
+ updated.claimedAt = void 0;
302
+ updated.expiresAt = void 0;
303
+ break;
304
+ case "open":
305
+ if (issue.status === "claimed" && issue.claimedBy !== actor.actorId) {
306
+ throw new InvalidTransitionError(
307
+ issue.id,
308
+ issue.status,
309
+ toStatus,
310
+ "Only the claimant can release the claim"
311
+ );
312
+ }
313
+ updated.claimedBy = void 0;
314
+ updated.claimedAt = void 0;
315
+ updated.expiresAt = void 0;
316
+ break;
317
+ case "investigating":
318
+ break;
319
+ }
320
+ return updated;
321
+ }
322
+ function promoteFinding(input) {
323
+ const { finding, issueId, actor, expectedVersion } = input;
324
+ const now = input.now ?? /* @__PURE__ */ new Date();
325
+ const nowISO = now.toISOString();
326
+ const updatedFinding = transitionFinding({
327
+ finding,
328
+ toStatus: "closed",
329
+ actor,
330
+ expectedVersion,
331
+ now,
332
+ closedReason: "promoted"
333
+ });
334
+ const newIssue = {
335
+ id: issueId,
336
+ kind: "issue",
337
+ title: finding.title,
338
+ status: "open",
339
+ version: 1,
340
+ severity: finding.severity ?? "medium",
341
+ category: finding.category,
342
+ findingIds: [finding.id],
343
+ originProvenance: { ...finding.reportedBy },
344
+ relatedIssues: [],
345
+ createdAt: nowISO,
346
+ updatedAt: nowISO
347
+ };
348
+ return { updatedFinding, newIssue };
349
+ }
350
+ function renewLease(input) {
351
+ const { entity, actor, expectedVersion, leaseTtlMs } = input;
352
+ const now = input.now ?? /* @__PURE__ */ new Date();
353
+ checkVersion(entity.id, entity.version, expectedVersion);
354
+ if (entity.claimedBy !== actor.actorId) {
355
+ throw new InvalidTransitionError(
356
+ entity.id,
357
+ entity.status,
358
+ entity.status,
359
+ "Only the claimant can renew the lease"
360
+ );
361
+ }
362
+ if (!isEffectivelyClaimed(entity, now)) {
363
+ throw new LeaseExpiredError(entity.id, entity.expiresAt ?? "unknown");
364
+ }
365
+ const ttl = getValidLeaseTtlMs(leaseTtlMs, entity.id, entity.status, entity.status);
366
+ return {
367
+ ...entity,
368
+ version: entity.version + 1,
369
+ expiresAt: new Date(now.getTime() + ttl).toISOString(),
370
+ updatedAt: now.toISOString()
371
+ };
372
+ }
373
+ function getValidLeaseTtlMs(leaseTtlMs, entityId, fromStatus, toStatus) {
374
+ const ttl = leaseTtlMs ?? DEFAULT_LEASE_TTL_MS;
375
+ if (!Number.isFinite(ttl) || ttl <= 0) {
376
+ throw new InvalidTransitionError(
377
+ entityId,
378
+ fromStatus,
379
+ toStatus,
380
+ "Lease TTL must be a positive finite number"
381
+ );
382
+ }
383
+ return ttl;
384
+ }
385
+ function matchesSuppression(finding, suppressions, now = /* @__PURE__ */ new Date()) {
386
+ for (const s of suppressions) {
387
+ if (s.expiresAt && new Date(s.expiresAt) <= now) continue;
388
+ const ruleMatch = !s.ruleId || s.ruleId === finding.fingerprint.ruleId;
389
+ const pathMatch = !s.pathGlob || matchGlob(s.pathGlob, finding.fingerprint.path);
390
+ if (ruleMatch && pathMatch) return s;
391
+ }
392
+ return null;
393
+ }
394
+ function matchGlob(pattern, filepath) {
395
+ const GLOBSTAR = "\0GLOBSTAR\0";
396
+ const GLOB = "\0GLOB\0";
397
+ const QMARK = "\0QMARK\0";
398
+ const tokenized = pattern.replace(/\*\*/g, GLOBSTAR).replace(/\*/g, GLOB).replace(/\?/g, QMARK);
399
+ const escaped = tokenized.replace(/[-/\\^$+?.()|[\]{}]/g, "\\$&");
400
+ const regexStr = escaped.replaceAll(GLOBSTAR, ".*").replaceAll(GLOB, "[^/]*").replaceAll(QMARK, "[^/]");
401
+ return new RegExp(`^${regexStr}$`).test(filepath);
402
+ }
403
+ function evaluateIngest(finding, suppressions, now = /* @__PURE__ */ new Date()) {
404
+ const matched = matchesSuppression(finding, suppressions, now);
405
+ if (matched) {
406
+ return {
407
+ status: "closed",
408
+ requiresHumanReview: false,
409
+ matchedSuppression: matched,
410
+ closedReason: "dismissed",
411
+ closedBy: {
412
+ actorType: "system",
413
+ actorId: `suppression:${matched.id}`
414
+ },
415
+ closedAt: now.toISOString()
416
+ };
417
+ }
418
+ const needsHuman = finding.category === "security" || finding.severity === "critical";
419
+ return { status: "raw", requiresHumanReview: needsHuman };
420
+ }
421
+
422
+ // src/planning/issue-validation.ts
423
+ var DEFAULT_CONSENSUS_CONFIG = {
424
+ minValidations: 2,
425
+ confirmedThreshold: 0.67,
426
+ rejectedThreshold: 0.67,
427
+ minAverageConfidence: 0.7
428
+ };
429
+ function appendValidation(input) {
430
+ const { finding, validation, expectedVersion } = input;
431
+ if (finding.version !== expectedVersion) {
432
+ throw new StaleVersionError(finding.version, expectedVersion, finding.id);
433
+ }
434
+ const updatedValidations = [...finding.validations, validation];
435
+ const validatorConfidence = updatedValidations.length > 0 ? updatedValidations.reduce((sum, v) => sum + v.confidence, 0) / updatedValidations.length : void 0;
436
+ return {
437
+ ...finding,
438
+ validations: updatedValidations,
439
+ validatorConfidence,
440
+ version: finding.version + 1,
441
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
442
+ };
443
+ }
444
+ function appendObservation(input) {
445
+ const { finding, observation, expectedVersion } = input;
446
+ if (finding.version !== expectedVersion) {
447
+ throw new StaleVersionError(finding.version, expectedVersion, finding.id);
448
+ }
449
+ const observations = getObservations(finding);
450
+ return {
451
+ ...finding,
452
+ observations: [...observations, observation],
453
+ version: finding.version + 1,
454
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
455
+ };
456
+ }
457
+ function getObservations(finding) {
458
+ if (Array.isArray(finding.observations) && finding.observations.length > 0) {
459
+ return finding.observations;
460
+ }
461
+ return [
462
+ createObservation(
463
+ finding.reportedBy,
464
+ finding.reporterConfidence,
465
+ finding.severity,
466
+ finding.codeLocations,
467
+ new Date(finding.reportedAt)
468
+ )
469
+ ];
470
+ }
471
+ function computeAgreement(finding) {
472
+ const identities = new Set(
473
+ getObservations(finding).map((observation) => observationIdentity(observation.reporter))
474
+ );
475
+ return identities.size;
476
+ }
477
+ function computeConsensus(finding, config = DEFAULT_CONSENSUS_CONFIG) {
478
+ const validations = finding.validations;
479
+ const count = validations.length;
480
+ if (count < config.minValidations) {
481
+ return {
482
+ outcome: "insufficient",
483
+ validationCount: count,
484
+ confirmedCount: validations.filter((v) => v.verdict === "confirmed").length,
485
+ rejectedCount: validations.filter((v) => v.verdict === "rejected").length,
486
+ uncertainCount: validations.filter((v) => v.verdict === "uncertain").length,
487
+ averageConfidence: count > 0 ? validations.reduce((s, v) => s + v.confidence, 0) / count : 0,
488
+ autoTriageRecommended: false
489
+ };
490
+ }
491
+ const confirmedCount = validations.filter((v) => v.verdict === "confirmed").length;
492
+ const rejectedCount = validations.filter((v) => v.verdict === "rejected").length;
493
+ const uncertainCount = validations.filter((v) => v.verdict === "uncertain").length;
494
+ const avgConfidence = validations.reduce((s, v) => s + v.confidence, 0) / count;
495
+ const confirmedRatio = confirmedCount / count;
496
+ const rejectedRatio = rejectedCount / count;
497
+ let outcome;
498
+ if (confirmedRatio >= config.confirmedThreshold) {
499
+ outcome = "confirmed";
500
+ } else if (rejectedRatio >= config.rejectedThreshold) {
501
+ outcome = "rejected";
502
+ } else {
503
+ outcome = "uncertain";
504
+ }
505
+ const isGated = finding.category === "security" || finding.severity === "critical";
506
+ const meetsConfidence = avgConfidence >= config.minAverageConfidence;
507
+ const autoTriageRecommended = !isGated && meetsConfidence && outcome !== "uncertain";
508
+ let recommendedStatus;
509
+ if (autoTriageRecommended) {
510
+ recommendedStatus = outcome === "confirmed" ? "triaged" : "rejected";
511
+ }
512
+ return {
513
+ outcome,
514
+ validationCount: count,
515
+ confirmedCount,
516
+ rejectedCount,
517
+ uncertainCount,
518
+ averageConfidence: avgConfidence,
519
+ autoTriageRecommended,
520
+ recommendedStatus
521
+ };
522
+ }
523
+ function createValidation(validator, verdict, confidence, reasoning, now = /* @__PURE__ */ new Date()) {
524
+ if (!Number.isFinite(confidence)) {
525
+ throw new Error(
526
+ `Validation confidence must be a finite number, received: ${String(confidence)}`
527
+ );
528
+ }
529
+ return {
530
+ validator,
531
+ verdict,
532
+ confidence: Math.max(0, Math.min(1, confidence)),
533
+ reasoning,
534
+ validatedAt: now.toISOString()
535
+ };
536
+ }
537
+ function createObservation(reporter, confidence, severity, codeLocations, now = /* @__PURE__ */ new Date()) {
538
+ if (!Number.isFinite(confidence)) {
539
+ throw new Error(
540
+ `Observation confidence must be a finite number, received: ${String(confidence)}`
541
+ );
542
+ }
543
+ return {
544
+ reporter,
545
+ confidence: Math.max(0, Math.min(1, confidence)),
546
+ ...severity ? { severity } : {},
547
+ codeLocations,
548
+ observedAt: Number.isNaN(now.getTime()) ? (/* @__PURE__ */ new Date()).toISOString() : now.toISOString()
549
+ };
550
+ }
551
+ function observationIdentity(reporter) {
552
+ return `${reporter.provider}:${reporter.model}:${reporter.harness}`;
553
+ }
554
+
555
+ // src/planning/issue-manager.ts
556
+ function getCoordBackend(repoRoot) {
557
+ return new LocalFileBackend(path.join(repoRoot, ".poetic", "planning", "coordination"));
558
+ }
559
+ async function withEntityLock(repoRoot, entityId, fn) {
560
+ const backend = getCoordBackend(repoRoot);
561
+ const DELAYS_MS = [0, 100, 200, 400, 800, 1600, 2400, 2500];
562
+ let handle = null;
563
+ for (let attempt = 0; attempt < DELAYS_MS.length; attempt++) {
564
+ const delay = DELAYS_MS[attempt] ?? 0;
565
+ if (delay > 0) {
566
+ await new Promise((resolve) => setTimeout(resolve, delay));
567
+ }
568
+ handle = await backend.acquireLock(entityId);
569
+ if (handle !== null) break;
570
+ }
571
+ if (handle === null) {
572
+ const lockPath = path.join(
573
+ repoRoot,
574
+ ".poetic",
575
+ "planning",
576
+ "coordination",
577
+ "locks",
578
+ `${entityId.replace(/[/\\]/g, "_")}.lock`
579
+ );
580
+ throw new Error(
581
+ `Could not acquire lock for entity ${entityId} after retries. Lock path: ${lockPath}. Another process may be writing to this entity.`
582
+ );
583
+ }
584
+ try {
585
+ return await fn();
586
+ } finally {
587
+ await backend.releaseLock(handle);
588
+ }
589
+ }
590
+ var warnedMalformedFindingFiles = /* @__PURE__ */ new Set();
591
+ var warnedMalformedIssueFiles = /* @__PURE__ */ new Set();
592
+ async function createFinding(repoRoot, options) {
593
+ return withIndexRegeneration(repoRoot, async () => {
594
+ const now = /* @__PURE__ */ new Date();
595
+ const nowISO = now.toISOString();
596
+ const fp = generateFingerprint(options.fingerprint);
597
+ const observation = createObservation(
598
+ options.reportedBy,
599
+ options.reporterConfidence,
600
+ options.severity,
601
+ options.codeLocations,
602
+ now
603
+ );
604
+ const ingest = evaluateIngest(
605
+ { fingerprint: fp, category: options.category, severity: options.severity },
606
+ options.suppressions ?? [],
607
+ now
608
+ );
609
+ const findingMeta = {
610
+ kind: "finding",
611
+ title: options.title,
612
+ status: ingest.status,
613
+ version: 1,
614
+ reportedBy: options.reportedBy,
615
+ reportedAt: nowISO,
616
+ observations: [observation],
617
+ reporterConfidence: options.reporterConfidence,
618
+ severity: options.severity,
619
+ category: options.category,
620
+ fingerprint: fp,
621
+ codeLocations: options.codeLocations,
622
+ validations: [],
623
+ firstSeenAt: nowISO,
624
+ lastSeenAt: nowISO,
625
+ occurrenceCount: 1,
626
+ requiresHumanReview: ingest.requiresHumanReview,
627
+ detectionRunId: options.detectionRunId,
628
+ traceId: options.traceId,
629
+ spanId: options.spanId,
630
+ createdAt: nowISO,
631
+ updatedAt: nowISO,
632
+ closedReason: ingest.closedReason,
633
+ closedBy: ingest.closedBy,
634
+ closedAt: ingest.closedAt
635
+ };
636
+ const result = await createWorkItemFile({
637
+ repoRoot,
638
+ bucket: "finding",
639
+ title: options.title,
640
+ description: options.body?.trim() || "",
641
+ metadata: stripUndefined(findingMeta)
642
+ });
643
+ const finding = { ...findingMeta, id: result.id };
644
+ return {
645
+ id: result.id,
646
+ filePath: result.path,
647
+ finding,
648
+ suppressed: ingest.status === "closed"
649
+ };
650
+ });
651
+ }
652
+ async function readFinding(repoRoot, findingId) {
653
+ const findingDir = getBucketPathByKind("finding", repoRoot);
654
+ const safeFindingId = assertSafePathComponent(findingId, "findingId");
655
+ const filePath = path.join(findingDir, `${safeFindingId}.md`);
656
+ let finding;
657
+ let body;
658
+ try {
659
+ ({ yaml: finding, body } = await parseMarkdownFile(filePath));
660
+ } catch (error) {
661
+ if (error.code === "ENOENT") {
662
+ throw new Error(`Finding not found: ${findingId}`);
663
+ }
664
+ throw error;
665
+ }
666
+ return { finding: normalizeFindingForRead(finding), body, filePath };
667
+ }
668
+ async function updateFinding(repoRoot, findingId, expectedVersion, updates, bodyOverride) {
669
+ return withIndexRegeneration(
670
+ repoRoot,
671
+ () => withEntityLock(repoRoot, findingId, async () => {
672
+ const { finding, body, filePath } = await readFinding(repoRoot, findingId);
673
+ if (finding.version !== expectedVersion) {
674
+ throw new StaleVersionError(finding.version, expectedVersion, findingId);
675
+ }
676
+ const updated = {
677
+ ...finding,
678
+ ...updates,
679
+ version: finding.version + 1,
680
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
681
+ };
682
+ const nextBody = typeof bodyOverride === "string" ? bodyOverride : body;
683
+ await writeMarkdownFile(
684
+ filePath,
685
+ stripUndefined(updated),
686
+ nextBody
687
+ );
688
+ return updated;
689
+ })
690
+ );
691
+ }
692
+ async function transitionFindingStatus(repoRoot, findingId, input) {
693
+ return withIndexRegeneration(
694
+ repoRoot,
695
+ () => withEntityLock(repoRoot, findingId, async () => {
696
+ const { finding, body, filePath } = await readFinding(repoRoot, findingId);
697
+ const updated = transitionFinding({ ...input, finding });
698
+ await writeMarkdownFile(
699
+ filePath,
700
+ stripUndefined(updated),
701
+ body
702
+ );
703
+ return updated;
704
+ })
705
+ );
706
+ }
707
+ async function listFindings(repoRoot, statusFilter, closedReasonFilter) {
708
+ const findingDir = getBucketPathByKind("finding", repoRoot);
709
+ const files = await listMarkdownFiles(findingDir);
710
+ const results = [];
711
+ for (const file of files) {
712
+ try {
713
+ const { yaml: finding } = await parseMarkdownFile(file);
714
+ if (statusFilter && finding.status !== statusFilter) continue;
715
+ if (closedReasonFilter && finding.closedReason !== closedReasonFilter) continue;
716
+ results.push({
717
+ id: finding.id,
718
+ title: finding.title,
719
+ status: finding.status,
720
+ severity: finding.severity,
721
+ category: finding.category,
722
+ version: finding.version,
723
+ closedReason: finding.closedReason
724
+ });
725
+ } catch (error) {
726
+ warnMalformedFile(repoRoot, file, "finding", error, warnedMalformedFindingFiles);
727
+ }
728
+ }
729
+ return results;
730
+ }
731
+ async function readIssue(repoRoot, issueId) {
732
+ const issueDir = getBucketPathByKind("issue", repoRoot);
733
+ const safeIssueId = assertSafePathComponent(issueId, "issueId");
734
+ const filePath = path.join(issueDir, `${safeIssueId}.md`);
735
+ let issue;
736
+ let body;
737
+ try {
738
+ ({ yaml: issue, body } = await parseMarkdownFile(filePath));
739
+ } catch (error) {
740
+ if (error.code === "ENOENT") {
741
+ throw new Error(`Issue not found: ${issueId}`);
742
+ }
743
+ throw error;
744
+ }
745
+ return { issue, body, filePath };
746
+ }
747
+ async function transitionIssueStatus(repoRoot, issueId, input) {
748
+ return withIndexRegeneration(
749
+ repoRoot,
750
+ () => withEntityLock(repoRoot, issueId, async () => {
751
+ const { issue, body, filePath } = await readIssue(repoRoot, issueId);
752
+ const updated = transitionIssue({ ...input, issue });
753
+ await writeMarkdownFile(
754
+ filePath,
755
+ stripUndefined(updated),
756
+ body
757
+ );
758
+ return updated;
759
+ })
760
+ );
761
+ }
762
+ async function listIssues(repoRoot, statusFilter) {
763
+ const issueDir = getBucketPathByKind("issue", repoRoot);
764
+ const files = await listMarkdownFiles(issueDir);
765
+ const results = [];
766
+ for (const file of files) {
767
+ try {
768
+ const { yaml: issue } = await parseMarkdownFile(file);
769
+ if (statusFilter && issue.status !== statusFilter) continue;
770
+ results.push({
771
+ id: issue.id,
772
+ title: issue.title,
773
+ status: issue.status,
774
+ severity: issue.severity,
775
+ category: issue.category,
776
+ version: issue.version,
777
+ claimed: isEffectivelyClaimed(issue),
778
+ findingIds: issue.findingIds ?? []
779
+ });
780
+ } catch (error) {
781
+ warnMalformedFile(repoRoot, file, "issue", error, warnedMalformedIssueFiles);
782
+ }
783
+ }
784
+ return results;
785
+ }
786
+ var FindingPublishConsentError = class extends Error {
787
+ constructor(findingId) {
788
+ super(
789
+ `Refusing to promote finding ${findingId}: promotion creates a TRACKED issue whose body is copied verbatim from this local-only finding (file paths, code snippets, scanner detail) and is then committed and pushed. Re-run with explicit publish consent (--yes-publish-issue) to cross the local\u2192published boundary.`
790
+ );
791
+ this.name = "FindingPublishConsentError";
792
+ }
793
+ };
794
+ async function promoteFindingToIssue(repoRoot, findingId, actor, options = {}) {
795
+ if (!options.publishIssue) {
796
+ throw new FindingPublishConsentError(findingId);
797
+ }
798
+ return withIndexRegeneration(
799
+ repoRoot,
800
+ () => withEntityLock(repoRoot, findingId, async () => {
801
+ const { finding, body, filePath } = await readFinding(repoRoot, findingId);
802
+ const now = /* @__PURE__ */ new Date();
803
+ const issueId = generateId(now);
804
+ const { updatedFinding, newIssue } = promoteFinding({
805
+ finding,
806
+ issueId,
807
+ actor,
808
+ expectedVersion: finding.version,
809
+ now
810
+ });
811
+ await writeMarkdownFile(
812
+ filePath,
813
+ stripUndefined(updatedFinding),
814
+ body
815
+ );
816
+ const issueDir = getBucketPathByKind("issue", repoRoot);
817
+ const issueFilePath = path.join(issueDir, `${issueId}.md`);
818
+ await writeMarkdownFile(
819
+ issueFilePath,
820
+ stripUndefined(newIssue),
821
+ body
822
+ );
823
+ return { finding: updatedFinding, issue: newIssue, issueFilePath };
824
+ })
825
+ );
826
+ }
827
+ async function renewEntityLease(repoRoot, entityId, actor, expectedVersion, leaseTtlMs) {
828
+ return withIndexRegeneration(
829
+ repoRoot,
830
+ () => withEntityLock(repoRoot, entityId, async () => {
831
+ const { issue, body, filePath } = await readIssue(repoRoot, entityId);
832
+ const updated = renewLease({
833
+ entity: issue,
834
+ actor,
835
+ expectedVersion,
836
+ leaseTtlMs
837
+ });
838
+ await writeMarkdownFile(
839
+ filePath,
840
+ stripUndefined(updated),
841
+ body
842
+ );
843
+ })
844
+ );
845
+ }
846
+ async function validateFinding(repoRoot, findingId, input, consensusConfig) {
847
+ return withIndexRegeneration(
848
+ repoRoot,
849
+ () => withEntityLock(repoRoot, findingId, async () => {
850
+ const { finding, body, filePath } = await readFinding(repoRoot, findingId);
851
+ const validation = createValidation(
852
+ input.validator,
853
+ input.verdict,
854
+ input.confidence,
855
+ input.reasoning
856
+ );
857
+ const updated = appendValidation({
858
+ finding,
859
+ validation,
860
+ expectedVersion: input.expectedVersion
861
+ });
862
+ await writeMarkdownFile(
863
+ filePath,
864
+ stripUndefined(updated),
865
+ body
866
+ );
867
+ const consensus = computeConsensus(updated, consensusConfig);
868
+ return { finding: updated, consensus };
869
+ })
870
+ );
871
+ }
872
+ async function getConsensus(repoRoot, findingId, consensusConfig) {
873
+ const { finding } = await readFinding(repoRoot, findingId);
874
+ return computeConsensus(finding, consensusConfig);
875
+ }
876
+ async function spawnTaskFromIssue(repoRoot, issueId, sprintId, actor, expectedVersion, taskOptions = {}) {
877
+ const { createTask } = await import("./task-manager-XAT7GOWB.js");
878
+ return withIndexRegeneration(
879
+ repoRoot,
880
+ () => withEntityLock(repoRoot, issueId, async () => {
881
+ const { issue, body, filePath } = await readIssue(repoRoot, issueId);
882
+ const now = /* @__PURE__ */ new Date();
883
+ if (issue.spawnedTask) {
884
+ throw new Error(`Issue ${issueId} already has spawned task: ${issue.spawnedTask}`);
885
+ }
886
+ if (issue.status !== "open" && issue.status !== "claimed") {
887
+ throw new Error(
888
+ `Cannot spawn task from issue in '${issue.status}' status (must be open or claimed)`
889
+ );
890
+ }
891
+ if (issue.status === "claimed") {
892
+ if (issue.claimedBy !== actor.actorId) {
893
+ throw new Error(
894
+ `Cannot spawn task from claimed issue ${issueId}: only claimant ${issue.claimedBy} can spawn`
895
+ );
896
+ }
897
+ if (!isEffectivelyClaimed(issue, now)) {
898
+ const expiredAt = issue.expiresAt ?? "unknown";
899
+ throw new Error(
900
+ `Cannot spawn task from claimed issue ${issueId}: lease expired at ${expiredAt}`
901
+ );
902
+ }
903
+ }
904
+ if (issue.version !== expectedVersion) {
905
+ throw new StaleVersionError(issue.version, expectedVersion, issueId);
906
+ }
907
+ const task = await createTask(
908
+ `[Issue] ${issue.title}`,
909
+ sprintId,
910
+ {
911
+ priority: taskOptions.priority,
912
+ assignee: taskOptions.assignee,
913
+ description: taskOptions.description || `Spawned from issue ${issueId} (${issue.category}/${issue.severity})`
914
+ },
915
+ repoRoot
916
+ );
917
+ const updated = {
918
+ ...issue,
919
+ spawnedTask: task.id,
920
+ spawnedTaskBy: actor,
921
+ spawnedTaskAt: now.toISOString(),
922
+ version: issue.version + 1,
923
+ updatedAt: now.toISOString()
924
+ };
925
+ await writeMarkdownFile(
926
+ filePath,
927
+ stripUndefined(updated),
928
+ body
929
+ );
930
+ return {
931
+ taskId: task.id,
932
+ issueId: issue.id,
933
+ issueVersion: updated.version
934
+ };
935
+ })
936
+ );
937
+ }
938
+ async function auditMalformedIssueFiles(repoRoot) {
939
+ const results = [];
940
+ const buckets = [
941
+ { kind: "finding", dir: getBucketPathByKind("finding", repoRoot) },
942
+ { kind: "issue", dir: getBucketPathByKind("issue", repoRoot) }
943
+ ];
944
+ for (const bucket of buckets) {
945
+ const files = await listMarkdownFiles(bucket.dir);
946
+ for (const file of files) {
947
+ try {
948
+ await parseMarkdownFile(file);
949
+ } catch (error) {
950
+ results.push({
951
+ bucket: bucket.kind,
952
+ filePath: path.relative(repoRoot, file),
953
+ error: error instanceof Error ? error.message : String(error)
954
+ });
955
+ }
956
+ }
957
+ }
958
+ return results;
959
+ }
960
+ function stripUndefined(obj) {
961
+ const result = {};
962
+ for (const [key, value] of Object.entries(obj)) {
963
+ if (value !== void 0) {
964
+ result[key] = value;
965
+ }
966
+ }
967
+ return result;
968
+ }
969
+ function normalizeFindingForRead(finding) {
970
+ if (Array.isArray(finding.observations) && finding.observations.length > 0) {
971
+ return finding;
972
+ }
973
+ return {
974
+ ...finding,
975
+ observations: getObservations(finding)
976
+ };
977
+ }
978
+ function warnMalformedFile(repoRoot, filePath, bucket, error, warnedSet) {
979
+ const relativePath = path.relative(repoRoot, filePath);
980
+ if (warnedSet.has(relativePath)) return;
981
+ warnedSet.add(relativePath);
982
+ emitWarning(
983
+ "CFG-002",
984
+ {
985
+ taskId: "issue-manager",
986
+ subsystem: "planning",
987
+ executionPhase: "execution"
988
+ },
989
+ {
990
+ severity: "WARN" /* WARN */,
991
+ metadata: {
992
+ operation: "parse-planning-item",
993
+ bucket,
994
+ file: relativePath,
995
+ error: error instanceof Error ? error.message : String(error)
996
+ }
997
+ }
998
+ );
999
+ }
1000
+
1001
+ // src/planning/issue-policy.ts
1002
+ import * as fs from "fs";
1003
+ import * as path2 from "path";
1004
+ import yaml from "js-yaml";
1005
+ var DEFAULT_ISSUE_POLICY = {
1006
+ consensus: {
1007
+ minValidations: 2,
1008
+ confirmedThreshold: 0.67,
1009
+ rejectedThreshold: 0.67,
1010
+ minAverageConfidence: 0.7
1011
+ },
1012
+ autoPromote: {
1013
+ enabled: true,
1014
+ minPromotionConfidence: 0.8,
1015
+ maxPromotesPerRun: 50,
1016
+ gatedCategories: ["security"],
1017
+ gatedSeverities: ["critical"]
1018
+ },
1019
+ ingest: {
1020
+ maxFindingsPerBatch: 500,
1021
+ maxOccurrencesBeforeReview: 10
1022
+ },
1023
+ severityPriority: {
1024
+ critical: "P0",
1025
+ high: "P1",
1026
+ medium: "P2",
1027
+ low: "P3"
1028
+ },
1029
+ scannerWeights: {}
1030
+ };
1031
+ function loadIssuePolicy(repoRoot = process.cwd()) {
1032
+ const configPath = path2.join(repoRoot, ".poetic", "config", "issue-policy.yaml");
1033
+ if (!fs.existsSync(configPath)) {
1034
+ return { ...DEFAULT_ISSUE_POLICY };
1035
+ }
1036
+ try {
1037
+ const raw = fs.readFileSync(configPath, "utf8");
1038
+ const parsed = yaml.load(raw);
1039
+ if (!parsed || typeof parsed !== "object") {
1040
+ return { ...DEFAULT_ISSUE_POLICY };
1041
+ }
1042
+ return mergePolicy(DEFAULT_ISSUE_POLICY, parsed);
1043
+ } catch {
1044
+ return { ...DEFAULT_ISSUE_POLICY };
1045
+ }
1046
+ }
1047
+ function mergePolicy(defaults, overrides) {
1048
+ return {
1049
+ consensus: {
1050
+ ...defaults.consensus,
1051
+ ...overrides.consensus ?? {}
1052
+ },
1053
+ autoPromote: {
1054
+ ...defaults.autoPromote,
1055
+ ...overrides.autoPromote ?? {}
1056
+ },
1057
+ ingest: {
1058
+ ...defaults.ingest,
1059
+ ...overrides.ingest ?? {}
1060
+ },
1061
+ severityPriority: {
1062
+ ...defaults.severityPriority,
1063
+ ...overrides.severityPriority ?? {}
1064
+ },
1065
+ scannerWeights: {
1066
+ ...defaults.scannerWeights,
1067
+ ...overrides.scannerWeights ?? {}
1068
+ }
1069
+ };
1070
+ }
1071
+ function isCategoryGated(category, policy = DEFAULT_ISSUE_POLICY) {
1072
+ return policy.autoPromote.gatedCategories.includes(category);
1073
+ }
1074
+ function isSeverityGated(severity, policy = DEFAULT_ISSUE_POLICY) {
1075
+ if (!severity) return false;
1076
+ return policy.autoPromote.gatedSeverities.includes(severity);
1077
+ }
1078
+ function severityToPriority(severity, policy = DEFAULT_ISSUE_POLICY) {
1079
+ if (!severity) return null;
1080
+ return policy.severityPriority[severity] ?? null;
1081
+ }
1082
+ function applyWeight(confidence, provider, policy = DEFAULT_ISSUE_POLICY) {
1083
+ if (!Number.isFinite(confidence)) {
1084
+ throw new Error(`Confidence must be a finite number, received: ${String(confidence)}`);
1085
+ }
1086
+ const rawWeight = policy.scannerWeights[provider];
1087
+ const weight = Number.isFinite(rawWeight) && rawWeight >= 0 ? rawWeight : 1;
1088
+ return Math.max(0, Math.min(1, confidence * weight));
1089
+ }
1090
+ function exceedsBatchBudget(candidateCount, policy = DEFAULT_ISSUE_POLICY) {
1091
+ return candidateCount > policy.ingest.maxFindingsPerBatch;
1092
+ }
1093
+
1094
+ export {
1095
+ normalizePath,
1096
+ generateFingerprint,
1097
+ findDuplicate,
1098
+ trackOccurrence,
1099
+ appendObservation,
1100
+ getObservations,
1101
+ computeAgreement,
1102
+ computeConsensus,
1103
+ createObservation,
1104
+ createFinding,
1105
+ readFinding,
1106
+ updateFinding,
1107
+ transitionFindingStatus,
1108
+ listFindings,
1109
+ readIssue,
1110
+ transitionIssueStatus,
1111
+ listIssues,
1112
+ promoteFindingToIssue,
1113
+ renewEntityLease,
1114
+ validateFinding,
1115
+ getConsensus,
1116
+ spawnTaskFromIssue,
1117
+ auditMalformedIssueFiles,
1118
+ loadIssuePolicy,
1119
+ isCategoryGated,
1120
+ isSeverityGated,
1121
+ severityToPriority,
1122
+ applyWeight,
1123
+ exceedsBatchBudget
1124
+ };
1125
+ //# sourceMappingURL=chunk-BZU2O43F.js.map