agentic-qe 3.12.3 → 3.13.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 (386) hide show
  1. package/.claude/helpers/.helpers-version +1 -1
  2. package/.claude/helpers/auto-memory-hook.mjs +430 -430
  3. package/.claude/helpers/helpers.manifest.json +6 -5
  4. package/.claude/helpers/hook-handler.cjs +565 -311
  5. package/.claude/helpers/intelligence.cjs +1058 -1058
  6. package/.claude/helpers/statusline.cjs +995 -682
  7. package/.claude/skills/qe-court/SKILL.md +186 -0
  8. package/.claude/skills/qe-court/config.json +27 -0
  9. package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +38 -0
  10. package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/budget.test.ts +21 -0
  11. package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/budget.ts +25 -0
  12. package/.claude/skills/qe-court/evals/qe-court.yaml +70 -0
  13. package/.claude/skills/qe-court/schemas/output.json +92 -0
  14. package/.claude/skills/qe-court/scripts/validate-config.json +30 -0
  15. package/.claude/skills/skills-manifest.json +9 -8
  16. package/CHANGELOG.md +65 -0
  17. package/README.md +3 -3
  18. package/assets/skills/qe-court/SKILL.md +186 -0
  19. package/assets/skills/qe-court/config.json +27 -0
  20. package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +38 -0
  21. package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/budget.test.ts +21 -0
  22. package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/budget.ts +25 -0
  23. package/assets/skills/qe-court/evals/qe-court.yaml +70 -0
  24. package/assets/skills/qe-court/schemas/output.json +92 -0
  25. package/assets/skills/qe-court/scripts/validate-config.json +30 -0
  26. package/assets/skills/skills-manifest.json +9 -8
  27. package/dist/cli/bundle.js +5 -5
  28. package/dist/cli/chunks/adapter-CWIMFWAI.js +2 -0
  29. package/dist/cli/chunks/{agent-booster-wasm-XFAQATTH.js → agent-booster-wasm-ACX2DK7Y.js} +2 -2
  30. package/dist/cli/chunks/{agent-handler-2ZV4CA3U.js → agent-handler-B45WP4ZJ.js} +2 -2
  31. package/dist/cli/chunks/{agent-memory-branch-6WGP7F5T.js → agent-memory-branch-QQLZDE56.js} +2 -2
  32. package/dist/cli/chunks/aqe-learning-engine-OTXT2DLN.js +2 -0
  33. package/dist/cli/chunks/{arena-FWX7XZAE.js → arena-G3IKZAG5.js} +4 -4
  34. package/dist/cli/chunks/{arena-KJUNQK4N.js → arena-SDB7723R.js} +2 -2
  35. package/dist/cli/chunks/{audit-YFUDEOKN.js → audit-GY46XUZA.js} +3 -3
  36. package/dist/cli/chunks/base-O3SPSWBA.js +2 -0
  37. package/dist/cli/chunks/{hnswlib-node-SKTT5KIH.js → better-sqlite3-DUZ6FFAH.js} +2 -2
  38. package/dist/cli/chunks/{brain-handler-ZCK4WTPK.js → brain-handler-347CYMPN.js} +3 -3
  39. package/dist/cli/chunks/{branch-enumerator-HTVINRYG.js → branch-enumerator-Z3ULBFSM.js} +2 -2
  40. package/dist/cli/chunks/{browser-WUL2B77M.js → browser-OYEIHD7F.js} +2 -2
  41. package/dist/cli/chunks/browser-workflow-MXS3ZKY2.js +2 -0
  42. package/dist/cli/chunks/{chunk-OBL6W4Z5.js → chunk-2DIT5AUU.js} +2 -2
  43. package/dist/cli/chunks/{chunk-IWQHQLT6.js → chunk-2NRZYQSF.js} +2 -2
  44. package/dist/cli/chunks/chunk-2VQVEQS4.js +153 -0
  45. package/dist/cli/chunks/{chunk-E2U3LTGM.js → chunk-32ZGV4Q4.js} +1 -1
  46. package/dist/cli/chunks/{chunk-VUCVSKJC.js → chunk-34PEINFS.js} +2 -2
  47. package/dist/cli/chunks/{chunk-XUUVAAHV.js → chunk-3GSYD5SL.js} +2 -2
  48. package/dist/cli/chunks/{chunk-MOX25RZQ.js → chunk-3JVUWKCO.js} +2 -2
  49. package/dist/cli/chunks/{chunk-RLBNAB6Y.js → chunk-3K4SF57Q.js} +1 -1
  50. package/dist/cli/chunks/{chunk-MSDIIRLM.js → chunk-3NOCK6ED.js} +2 -2
  51. package/dist/cli/chunks/{chunk-3YC4YUGB.js → chunk-3UHEZ5HZ.js} +2 -2
  52. package/dist/cli/chunks/{chunk-J2RJOJ5Q.js → chunk-4BDLD7V2.js} +1 -1
  53. package/dist/cli/chunks/{chunk-ZGKQCUPB.js → chunk-4BESADKE.js} +2 -2
  54. package/dist/cli/chunks/{chunk-PDX7IYTJ.js → chunk-54MFKCLT.js} +2 -2
  55. package/dist/cli/chunks/{chunk-TP3UAWMB.js → chunk-56WZFXTQ.js} +2 -2
  56. package/dist/cli/chunks/{chunk-WFPGIP4N.js → chunk-5EIOQCGN.js} +2 -2
  57. package/dist/cli/chunks/{chunk-32L7DKNQ.js → chunk-5FLTZ3KT.js} +2 -2
  58. package/dist/cli/chunks/{chunk-Y5L37K7X.js → chunk-5ICQL42E.js} +2 -2
  59. package/dist/cli/chunks/{chunk-Y625LP6K.js → chunk-5KAT6WBQ.js} +2 -2
  60. package/dist/cli/chunks/{chunk-UIHZ34SJ.js → chunk-6AOBLBR4.js} +2 -2
  61. package/dist/cli/chunks/{chunk-7WF3TW3G.js → chunk-6DTOGSDV.js} +4 -4
  62. package/dist/cli/chunks/{chunk-NAMJGRGC.js → chunk-6SXKCIN5.js} +2 -2
  63. package/dist/cli/chunks/{chunk-FTM562PF.js → chunk-7DMXCCSD.js} +1 -1
  64. package/dist/cli/chunks/{chunk-KE3RK35K.js → chunk-7UNY32PU.js} +1 -1
  65. package/dist/cli/chunks/{chunk-BSNNTOHY.js → chunk-7YXT6BXN.js} +3 -3
  66. package/dist/cli/chunks/{chunk-DZ775UGW.js → chunk-A4QLGPYO.js} +2 -2
  67. package/dist/cli/chunks/{chunk-SFS3UHNF.js → chunk-A7GLWWSE.js} +1 -1
  68. package/dist/cli/chunks/{chunk-WKE6WL5C.js → chunk-ANIDFJCT.js} +3 -3
  69. package/dist/cli/chunks/{chunk-XDHGCBTS.js → chunk-ANYYTWOQ.js} +2 -2
  70. package/dist/cli/chunks/{chunk-NLDLUHOF.js → chunk-AO7AHX6K.js} +2 -2
  71. package/dist/cli/chunks/{chunk-Z3SXMYVI.js → chunk-BCKTBGDM.js} +3 -3
  72. package/dist/cli/chunks/{chunk-UGW23T6S.js → chunk-BGYLNCL6.js} +2 -2
  73. package/dist/cli/chunks/{chunk-KVHCWH4H.js → chunk-BOVH6WSM.js} +2 -2
  74. package/dist/cli/chunks/{chunk-L2X3BWMN.js → chunk-BUGWPTMF.js} +2 -2
  75. package/dist/cli/chunks/{chunk-DTZFZ5M7.js → chunk-CFVEDUTW.js} +2 -2
  76. package/dist/cli/chunks/{chunk-CL6SNCFF.js → chunk-CPH5JP4L.js} +1 -1
  77. package/dist/cli/chunks/{chunk-AIWRYWK2.js → chunk-CQFT7H3F.js} +2 -2
  78. package/dist/cli/chunks/{chunk-BQ2K4BPD.js → chunk-CWUBOLKY.js} +2 -2
  79. package/dist/cli/chunks/{chunk-2LNDU7AW.js → chunk-CYL2FV23.js} +2 -2
  80. package/dist/cli/chunks/{chunk-YEC55GO5.js → chunk-D3MPV5G7.js} +2 -2
  81. package/dist/cli/chunks/{chunk-DMD6WVJ2.js → chunk-DRIJYTSK.js} +2 -2
  82. package/dist/cli/chunks/{chunk-PXCJDB7J.js → chunk-DYUC7WFA.js} +1 -1
  83. package/dist/cli/chunks/{chunk-EOUJ6X5H.js → chunk-E3B5XTXJ.js} +1 -1
  84. package/dist/cli/chunks/{chunk-PSDH7CIL.js → chunk-EECM5XKY.js} +1 -1
  85. package/dist/cli/chunks/{chunk-E53UR2EW.js → chunk-EFRESRLB.js} +3 -3
  86. package/dist/cli/chunks/{chunk-SGMJ277D.js → chunk-ES7WCYOU.js} +1 -1
  87. package/dist/cli/chunks/{chunk-DDYP6FBC.js → chunk-FAQLI3P5.js} +2 -2
  88. package/dist/cli/chunks/{chunk-CXMOIE7D.js → chunk-FBBZHATF.js} +2 -2
  89. package/dist/cli/chunks/{chunk-KKOFH26C.js → chunk-FL3BM54K.js} +1 -1
  90. package/dist/cli/chunks/{chunk-MB7TZQW3.js → chunk-FQLWQWRU.js} +3 -3
  91. package/dist/cli/chunks/{chunk-GMFFMJD6.js → chunk-FQY3UTGA.js} +2 -2
  92. package/dist/cli/chunks/{chunk-SPI4LUJ6.js → chunk-FUU32QY5.js} +2 -2
  93. package/dist/cli/chunks/{chunk-RSZOCQOL.js → chunk-G4GTE3RJ.js} +2 -2
  94. package/dist/cli/chunks/{chunk-NOSQI2OW.js → chunk-G5DFYX3J.js} +3 -3
  95. package/dist/cli/chunks/{chunk-OPG2HV2W.js → chunk-G7FMYFTN.js} +1 -1
  96. package/dist/cli/chunks/{chunk-N4ML23ZG.js → chunk-GFBLWFRV.js} +1 -1
  97. package/dist/cli/chunks/{chunk-LNIHLNW4.js → chunk-GJMZR7WU.js} +3 -3
  98. package/dist/cli/chunks/{chunk-PTPN6HQ7.js → chunk-GTUFX7AR.js} +2 -2
  99. package/dist/cli/chunks/{chunk-67BCEHU5.js → chunk-GUEZQOHL.js} +1 -1
  100. package/dist/cli/chunks/{chunk-RE42RJYR.js → chunk-HL2QMM4M.js} +2 -2
  101. package/dist/cli/chunks/{chunk-QILF6BZH.js → chunk-HOKON5EL.js} +2 -2
  102. package/dist/cli/chunks/{chunk-YOG5KQZF.js → chunk-HTPM3URI.js} +2 -2
  103. package/dist/cli/chunks/chunk-HVB2L52I.js +2 -0
  104. package/dist/cli/chunks/{chunk-DHUZHT5D.js → chunk-IHQTXJAQ.js} +1 -1
  105. package/dist/cli/chunks/{chunk-SV7J5FDW.js → chunk-IPHLXAMX.js} +2 -2
  106. package/dist/cli/chunks/{chunk-Y6XNISHP.js → chunk-IYDYJ33J.js} +2 -2
  107. package/dist/cli/chunks/{chunk-CYSBM52D.js → chunk-IZRLIWFN.js} +2 -2
  108. package/dist/cli/chunks/{chunk-MS6VOSPY.js → chunk-J3L52EA4.js} +5 -5
  109. package/dist/cli/chunks/{chunk-WQASUQ5P.js → chunk-JGM6XCCP.js} +1 -1
  110. package/dist/cli/chunks/chunk-JPIBPKBP.js +54 -0
  111. package/dist/cli/chunks/{chunk-TXLPOXAN.js → chunk-K5N6SLHO.js} +1 -1
  112. package/dist/cli/chunks/{chunk-R6WMGSEK.js → chunk-KSYLRM4Q.js} +2 -2
  113. package/dist/cli/chunks/{chunk-2CPJCXV6.js → chunk-KUA4HHU6.js} +2 -2
  114. package/dist/cli/chunks/{chunk-WUE53ZPH.js → chunk-KVL63BSU.js} +1 -1
  115. package/dist/cli/chunks/{chunk-6SUSRXXF.js → chunk-KZTBNDNE.js} +1 -1
  116. package/dist/cli/chunks/{chunk-M7W6VJ65.js → chunk-L2SFGFE6.js} +1 -1
  117. package/dist/cli/chunks/{chunk-XZGOXLZH.js → chunk-L4LLA5U7.js} +1 -1
  118. package/dist/cli/chunks/{chunk-AZ24ONMX.js → chunk-L4S722JD.js} +1 -1
  119. package/dist/cli/chunks/{chunk-HJ4U64BL.js → chunk-LBE2P6UC.js} +2 -2
  120. package/dist/cli/chunks/{chunk-KA4EAMMQ.js → chunk-LOXVVMS4.js} +3 -3
  121. package/dist/cli/chunks/{chunk-UGXHMQ6P.js → chunk-LWYLW7RX.js} +2 -2
  122. package/dist/cli/chunks/{chunk-HJ2LG5IH.js → chunk-LXPB7H2P.js} +1 -1
  123. package/dist/cli/chunks/{chunk-WBZNLFTV.js → chunk-MBCGI3M2.js} +3 -3
  124. package/dist/cli/chunks/{chunk-7XUM4LBC.js → chunk-MVI2QMRW.js} +1 -1
  125. package/dist/cli/chunks/{chunk-2OX74DOO.js → chunk-N5MMBA35.js} +1 -1
  126. package/dist/cli/chunks/{chunk-VSD6JE2H.js → chunk-N7VOOI3U.js} +2 -2
  127. package/dist/cli/chunks/{chunk-ROFCS47F.js → chunk-NETN3OUG.js} +1 -1
  128. package/dist/cli/chunks/chunk-NQNKKVNO.js +29 -0
  129. package/dist/cli/chunks/{chunk-NJDLJ3KD.js → chunk-NUQBJGGF.js} +2 -2
  130. package/dist/cli/chunks/chunk-OETDMOOE.js +2 -0
  131. package/dist/cli/chunks/{chunk-4EHW4TNA.js → chunk-OXXMVQDF.js} +2 -2
  132. package/dist/cli/chunks/{chunk-6HQDPDN5.js → chunk-OZR25R7W.js} +2 -2
  133. package/dist/cli/chunks/{chunk-UZ7FXVH5.js → chunk-PERJO2DY.js} +1 -1
  134. package/dist/cli/chunks/{chunk-XQ5JT7KM.js → chunk-PP2RYSHT.js} +3 -3
  135. package/dist/cli/chunks/{chunk-DCYBV6HV.js → chunk-Q7PBGNUD.js} +1 -1
  136. package/dist/cli/chunks/{chunk-LCM7TY76.js → chunk-QCEW4ZDW.js} +2 -2
  137. package/dist/cli/chunks/{chunk-NKTLKMUB.js → chunk-QI4CGJNK.js} +1 -1
  138. package/dist/cli/chunks/{chunk-NT66CT73.js → chunk-QQB55ZJJ.js} +2 -2
  139. package/dist/cli/chunks/{chunk-KRS4KGX5.js → chunk-QTU3CVOB.js} +2 -2
  140. package/dist/cli/chunks/{chunk-DW7OI5IF.js → chunk-QWYISZTN.js} +2 -2
  141. package/dist/cli/chunks/{chunk-KNWBRMLL.js → chunk-R3GEXYO4.js} +2 -2
  142. package/dist/cli/chunks/{chunk-YUDGQZJN.js → chunk-RDU4WTV2.js} +2 -2
  143. package/dist/cli/chunks/{chunk-VFYMWDSJ.js → chunk-RJZRWVL4.js} +1 -1
  144. package/dist/cli/chunks/{chunk-D4GMAUTP.js → chunk-RLCWR7TS.js} +10 -10
  145. package/dist/cli/chunks/{chunk-YDYKFSD2.js → chunk-RSFIOR2I.js} +10 -10
  146. package/dist/cli/chunks/{chunk-EHO52NKU.js → chunk-RVJPWRV6.js} +2 -2
  147. package/dist/cli/chunks/{chunk-KGHSKDC7.js → chunk-RVRBTOWX.js} +2 -2
  148. package/dist/cli/chunks/{chunk-2YDZXFO2.js → chunk-SHCTEXNH.js} +2 -2
  149. package/dist/cli/chunks/chunk-SNTUKW4Q.js +2 -0
  150. package/dist/cli/chunks/{chunk-MOXKKY5Q.js → chunk-SRQ3CPJE.js} +4 -4
  151. package/dist/cli/chunks/{chunk-GS6G7AVS.js → chunk-THBTN7XB.js} +2 -2
  152. package/dist/cli/chunks/{chunk-LHAUFY4Y.js → chunk-TNRIGQ6U.js} +2 -2
  153. package/dist/cli/chunks/{chunk-UAPUA6OY.js → chunk-TVMFH5N2.js} +2 -2
  154. package/dist/cli/chunks/{chunk-HGJQSTQD.js → chunk-TZ73SXQ5.js} +1 -1
  155. package/dist/cli/chunks/{chunk-CHFTHSMM.js → chunk-TZPKTRJB.js} +2 -2
  156. package/dist/cli/chunks/{chunk-GV2BS5NC.js → chunk-U2SW6KK5.js} +2 -2
  157. package/dist/cli/chunks/{chunk-BDGKB2PT.js → chunk-UIPPJKON.js} +2 -2
  158. package/dist/cli/chunks/{chunk-FXOOOJQD.js → chunk-UMG5URNV.js} +1 -1
  159. package/dist/cli/chunks/{chunk-7Q74K3HZ.js → chunk-UNIBND6A.js} +1 -1
  160. package/dist/cli/chunks/{chunk-LGYEOYQJ.js → chunk-USMDIIHY.js} +2 -2
  161. package/dist/cli/chunks/{chunk-2HCMRGMO.js → chunk-VC6EXDGY.js} +2 -2
  162. package/dist/cli/chunks/{chunk-5FAWIIWF.js → chunk-VHYMSZNF.js} +2 -2
  163. package/dist/cli/chunks/{chunk-ZTKCGEB6.js → chunk-VLBV2VL3.js} +1 -1
  164. package/dist/cli/chunks/{chunk-6E47R27C.js → chunk-VLNPJAVH.js} +1 -1
  165. package/dist/cli/chunks/{chunk-EH7TSJPS.js → chunk-VSNRPMAZ.js} +2 -2
  166. package/dist/cli/chunks/{chunk-FJACKKRL.js → chunk-W5YEIHIO.js} +2 -2
  167. package/dist/cli/chunks/{chunk-4HP7N6SP.js → chunk-WRYT4HTZ.js} +2 -2
  168. package/dist/cli/chunks/{chunk-ZFLE4D4X.js → chunk-XFCWYQHW.js} +2 -2
  169. package/dist/cli/chunks/{chunk-72QQDR3Y.js → chunk-XKFE3FLI.js} +2 -2
  170. package/dist/cli/chunks/{chunk-KXKACV3E.js → chunk-YFGAHNCG.js} +2 -2
  171. package/dist/cli/chunks/{chunk-S47YGWXK.js → chunk-YPTGE5NJ.js} +2 -2
  172. package/dist/cli/chunks/{chunk-PEHEANAM.js → chunk-YRQLVGCI.js} +2 -2
  173. package/dist/cli/chunks/{chunk-L6GZGEFQ.js → chunk-Z6QCOZ2H.js} +2 -2
  174. package/dist/cli/chunks/{chunk-GGTCD4MA.js → chunk-ZCFZ4USU.js} +1 -1
  175. package/dist/cli/chunks/{chunk-MZ7SIO6R.js → chunk-ZEIG5IQ4.js} +2 -2
  176. package/dist/cli/chunks/{chunk-XBOCRCC6.js → chunk-ZJG6N2OK.js} +1 -1
  177. package/dist/cli/chunks/{chunk-M32DTUZM.js → chunk-ZJIX5FGQ.js} +3 -3
  178. package/dist/cli/chunks/{chunk-ADQFQBFJ.js → chunk-ZLXBNNNT.js} +2 -2
  179. package/dist/cli/chunks/{chunk-BEPP57C2.js → chunk-ZOXWASCC.js} +2 -2
  180. package/dist/cli/chunks/{ci-MMLUV6L6.js → ci-74ZUCO5V.js} +2 -2
  181. package/dist/cli/chunks/{ci-output-25GS6RXR.js → ci-output-HD6IZNJA.js} +2 -2
  182. package/dist/cli/chunks/{circuit-breaker-4OWAN6R6.js → circuit-breaker-USZVMA42.js} +2 -2
  183. package/dist/cli/chunks/{claude-flow-setup-LR3SRBX6.js → claude-flow-setup-S4XKNCD5.js} +2 -2
  184. package/dist/cli/chunks/client-33PGO5FA.js +2 -0
  185. package/dist/cli/chunks/{cline-installer-YSZWRZUI.js → cline-installer-6EW4CHAR.js} +2 -2
  186. package/dist/cli/chunks/{code-UUWUIXI7.js → code-TOLWD2XL.js} +2 -2
  187. package/dist/cli/chunks/{code-index-extractor-2LSPQORU.js → code-index-extractor-UA4QQ7B3.js} +2 -2
  188. package/dist/cli/chunks/{codex-installer-E5BVXZVA.js → codex-installer-C2CUP4FW.js} +2 -2
  189. package/dist/cli/chunks/{completions-YKXBKZSO.js → completions-KVUMQQ4K.js} +2 -2
  190. package/dist/cli/chunks/{complexity-analyzer-HNT2QRWB.js → complexity-analyzer-DFH6LMK2.js} +2 -2
  191. package/dist/cli/chunks/{continuedev-installer-AW5VCB66.js → continuedev-installer-LYDQSAU7.js} +2 -2
  192. package/dist/cli/chunks/{copilot-installer-B6SVZXQT.js → copilot-installer-7USXLZHZ.js} +2 -2
  193. package/dist/cli/chunks/core-handlers-CSNZIM3A.js +2 -0
  194. package/dist/cli/chunks/{cost-tracker-POZMBN2V.js → cost-tracker-JBDIUMKZ.js} +2 -2
  195. package/dist/cli/chunks/{coverage-V5BGPN5Q.js → coverage-RGO3K357.js} +3 -3
  196. package/dist/cli/chunks/cross-domain-router-DRIBR5L3.js +2 -0
  197. package/dist/cli/chunks/{cursor-installer-EYBI4QVK.js → cursor-installer-YEZGD37F.js} +2 -2
  198. package/dist/cli/chunks/{daemon-CF6ENQB2.js → daemon-FVETQ3LL.js} +3 -3
  199. package/dist/cli/chunks/{daemon-HKARXY2W.js → daemon-LPEXHNYG.js} +4 -4
  200. package/dist/cli/chunks/{dag-attention-scheduler-XIL5IAP7.js → dag-attention-scheduler-UKYE2FII.js} +2 -2
  201. package/dist/cli/chunks/{detect-RRX2U2KK.js → detect-WBG5P7ER.js} +2 -2
  202. package/dist/cli/chunks/{dist-node-DOANNRCS.js → dist-node-YW6YRBCU.js} +2 -2
  203. package/dist/cli/chunks/{domain-handler-QMTJV5OR.js → domain-handler-HH7J4A32.js} +2 -2
  204. package/dist/cli/chunks/{domain-transfer-FSNH75XW.js → domain-transfer-V34GXD5I.js} +2 -2
  205. package/dist/cli/chunks/dream-WUNO723O.js +2 -0
  206. package/dist/cli/chunks/{embed-and-insert-pattern-NI7PGONV.js → embed-and-insert-pattern-WYLRS3CL.js} +2 -2
  207. package/dist/cli/chunks/{eval-6ZAF2RY3.js → eval-EIMVXY5J.js} +2 -2
  208. package/dist/cli/chunks/{experience-capture-middleware-JMXR7N5G.js → experience-capture-middleware-QMZHRUKM.js} +3 -3
  209. package/dist/cli/chunks/{fast-paths-YB7XZZ76.js → fast-paths-NHLW6XS6.js} +2 -2
  210. package/dist/cli/chunks/{feature-flags-KJSP7KR6.js → feature-flags-N3UHMSZ3.js} +2 -2
  211. package/dist/cli/chunks/{feature-flags-2RC4GFC4.js → feature-flags-NE3MBL3P.js} +2 -2
  212. package/dist/cli/chunks/{file-discovery-SUPBXFYI.js → file-discovery-SI44X4YS.js} +2 -2
  213. package/dist/cli/chunks/{fleet-KSXFOLFW.js → fleet-MMYUXRRM.js} +3 -3
  214. package/dist/cli/chunks/{gnn-wrapper-DFZ5KPPK.js → gnn-wrapper-RLYXYU2Q.js} +2 -2
  215. package/dist/cli/chunks/{heartbeat-handler-G3EADK2H.js → heartbeat-handler-6EDRUYLV.js} +4 -4
  216. package/dist/cli/chunks/heartbeat-scheduler-VAFQDJLL.js +2 -0
  217. package/dist/cli/chunks/hnsw-adapter-TIRPA7XE.js +2 -0
  218. package/dist/cli/chunks/hnsw-index-SSQBRQCQ.js +2 -0
  219. package/dist/cli/chunks/{hnsw-legacy-bridge-MA676GER.js → hnsw-legacy-bridge-RVM7EAIH.js} +2 -2
  220. package/dist/cli/chunks/{better-sqlite3-FE55OGYB.js → hnswlib-node-RJPBJU2Q.js} +2 -2
  221. package/dist/cli/chunks/{hooks-HTCPMZNZ.js → hooks-ZF4VKHEO.js} +10 -10
  222. package/dist/cli/chunks/hybrid-router-AKBWZOQ3.js +2 -0
  223. package/dist/cli/chunks/{hypergraph-engine-QPB3IH4A.js → hypergraph-engine-YWS66PGO.js} +2 -2
  224. package/dist/cli/chunks/{hypergraph-handler-GBFSVD7N.js → hypergraph-handler-OQHVRPWB.js} +3 -3
  225. package/dist/cli/chunks/impact-analyzer-46FQIZ6Y.js +2 -0
  226. package/dist/cli/chunks/{init-handler-XYBTBCPD.js → init-handler-YW74YF2V.js} +6 -6
  227. package/dist/cli/chunks/init-wizard-U3NHGYSS.js +2 -0
  228. package/dist/cli/chunks/kernel-ZDXHT6QF.js +2 -0
  229. package/dist/cli/chunks/{kilocode-installer-LY6JOBFY.js → kilocode-installer-APWB2GMA.js} +2 -2
  230. package/dist/cli/chunks/{kiro-installer-JF6NXTJL.js → kiro-installer-DICKFVNC.js} +2 -2
  231. package/dist/cli/chunks/knowledge-graph-6XTW6WO6.js +2 -0
  232. package/dist/cli/chunks/{learning-BIISN67N.js → learning-MXHNYW5D.js} +3 -3
  233. package/dist/cli/chunks/{llm-router-YZUNVZQE.js → llm-router-LTFIX7NY.js} +5 -5
  234. package/dist/cli/chunks/llm-router-service-3F4E64SY.js +2 -0
  235. package/dist/cli/chunks/{load-MTWNBNLL.js → load-JUMIQ4LZ.js} +2 -2
  236. package/dist/cli/chunks/load-test-SWZNGEIY.js +2 -0
  237. package/dist/cli/chunks/{mcp-37PYMNHQ.js → mcp-WHIARJGO.js} +2 -2
  238. package/dist/cli/chunks/{memory-IXUUDCI3.js → memory-KAHS6Z5A.js} +5 -5
  239. package/dist/cli/chunks/memory-backend-PR74ZPBA.js +2 -0
  240. package/dist/cli/chunks/{memory-handlers-RM2VOFJX.js → memory-handlers-DG3RRXB6.js} +2 -2
  241. package/dist/cli/chunks/{multi-model-executor-RKKS5XYG.js → multi-model-executor-E3Y2RHMX.js} +2 -2
  242. package/dist/cli/chunks/{opencode-installer-3VXI5MTR.js → opencode-installer-3RKGNGGE.js} +2 -2
  243. package/dist/cli/chunks/{orchestrator-UO3ZOGFZ.js → orchestrator-TXITUKWD.js} +5 -5
  244. package/dist/cli/chunks/pattern-null-store-EPE36BVT.js +2 -0
  245. package/dist/cli/chunks/{pattern-usage-recorder-YJKRL2GI.js → pattern-usage-recorder-EE2BUFZT.js} +2 -2
  246. package/dist/cli/chunks/{pipeline-GJQJKXWX.js → pipeline-AXTT6KZB.js} +2 -2
  247. package/dist/cli/chunks/{platform-RHVCZK6C.js → platform-TICPVKE2.js} +2 -2
  248. package/dist/cli/chunks/{plugin-ZKAIW7O6.js → plugin-VQKNV3EM.js} +2 -2
  249. package/dist/cli/chunks/{prime-radiant-advanced-wasm-4X3DSKQV.js → prime-radiant-advanced-wasm-6GY5YY7D.js} +2 -2
  250. package/dist/cli/chunks/protocol-executor-IELENNST.js +2 -0
  251. package/dist/cli/chunks/{protocol-handler-KKYQZMB2.js → protocol-handler-YFWDR7UZ.js} +2 -2
  252. package/dist/cli/chunks/{prove-OD6RPKWX.js → prove-FUMRCXAA.js} +2 -2
  253. package/dist/cli/chunks/provider-manager-3R3KOBHG.js +2 -0
  254. package/dist/cli/chunks/qe-reasoning-bank-S2R2PCBS.js +2 -0
  255. package/dist/cli/chunks/{quality-ZRWBXCKO.js → quality-2APISBW5.js} +2 -2
  256. package/dist/cli/chunks/{quality-gate-Y6BWQV7J.js → quality-gate-MCC3E5TM.js} +3 -3
  257. package/dist/cli/chunks/queen-coordinator-2E23NEV4.js +2 -0
  258. package/dist/cli/chunks/{real-embeddings-YYEUO4P2.js → real-embeddings-CC5TNOTI.js} +2 -2
  259. package/dist/cli/chunks/{roocode-installer-JBCPS3FK.js → roocode-installer-YAHTEVPI.js} +2 -2
  260. package/dist/cli/chunks/router-3FVLWO6S.js +2 -0
  261. package/dist/cli/chunks/routing-feedback-ZQLRNNR7.js +2 -0
  262. package/dist/cli/chunks/{routing-handler-KTPJOSBJ.js → routing-handler-6NQBW4TQ.js} +2 -2
  263. package/dist/cli/chunks/{ruvector-commands-SCZZVRE7.js → ruvector-commands-ZHXLHUPG.js} +2 -2
  264. package/dist/cli/chunks/{rvf-dual-writer-IP7GELQJ.js → rvf-dual-writer-5KF2DGCW.js} +2 -2
  265. package/dist/cli/chunks/{rvf-migration-adapter-WLFTDARU.js → rvf-migration-adapter-BBU57BGF.js} +2 -2
  266. package/dist/cli/chunks/{rvf-migration-coordinator-MGFDQ5WD.js → rvf-migration-coordinator-VN4VRZA4.js} +2 -2
  267. package/dist/cli/chunks/rvf-native-adapter-YFGLQNEB.js +2 -0
  268. package/dist/cli/chunks/{rvf-store-integrity-OTOAGT5W.js → rvf-store-integrity-XCY2XQZA.js} +2 -2
  269. package/dist/cli/chunks/safe-db-4SBLBTW7.js +2 -0
  270. package/dist/cli/chunks/schedule-5Y3BGVAA.js +2 -0
  271. package/dist/cli/chunks/scheduler-DOID3QF3.js +2 -0
  272. package/dist/cli/chunks/{security-B2CLZKRB.js → security-PYP4H3KN.js} +3 -3
  273. package/dist/cli/chunks/{shared-rvf-adapter-2PMFAQMN.js → shared-rvf-adapter-3CJHRNX6.js} +2 -2
  274. package/dist/cli/chunks/{shared-rvf-dual-writer-B6P732AV.js → shared-rvf-dual-writer-MKSLKWDI.js} +2 -2
  275. package/dist/cli/chunks/sqlite-persistence-M4JEQO57.js +2 -0
  276. package/dist/cli/chunks/{status-handler-M6SN2W2D.js → status-handler-VYIZ3VJF.js} +2 -2
  277. package/dist/cli/chunks/{structural-health-YCCTGI3K.js → structural-health-MVV4OWXP.js} +2 -2
  278. package/dist/cli/chunks/{sync-KSRF77ID.js → sync-G47OYIQ3.js} +2 -2
  279. package/dist/cli/chunks/sync-VNX6L3TI.js +2 -0
  280. package/dist/cli/chunks/{task-handler-MIKRB2SL.js → task-handler-GOWF2GEH.js} +2 -2
  281. package/dist/cli/chunks/{task-handlers-YXKRUBQ4.js → task-handlers-J2WC6J37.js} +3 -3
  282. package/dist/cli/chunks/{test-MLOLQCB7.js → test-DMCJ3BXS.js} +4 -4
  283. package/dist/cli/chunks/{test-scheduling-3KXESUZS.js → test-scheduling-TRFHHKFM.js} +3 -3
  284. package/dist/cli/chunks/{token-bootstrap-6V2PMDBJ.js → token-bootstrap-KEQ7AHFF.js} +2 -2
  285. package/dist/cli/chunks/{token-usage-DP6THJ3I.js → token-usage-B54FOFOF.js} +2 -2
  286. package/dist/cli/chunks/transformers-IACZG7IV.js +2 -0
  287. package/dist/cli/chunks/{tree-sitter-wasm-parser-COK2XERS.js → tree-sitter-wasm-parser-N7H4X37E.js} +2 -2
  288. package/dist/cli/chunks/{types-PYHUCVOZ.js → types-B3SHT4OD.js} +2 -2
  289. package/dist/cli/chunks/unified-memory-WNYWTGVX.js +2 -0
  290. package/dist/cli/chunks/unified-memory-hnsw-YPAV7U4E.js +2 -0
  291. package/dist/cli/chunks/unified-persistence-TJ252S7L.js +2 -0
  292. package/dist/cli/chunks/{upgrade-ONP2HNGL.js → upgrade-A2PQ5EWK.js} +2 -2
  293. package/dist/cli/chunks/{validate-NWSICDAY.js → validate-UXV7UQUT.js} +2 -2
  294. package/dist/cli/chunks/{validate-swarm-KXS5P3U7.js → validate-swarm-MMBU4FPP.js} +2 -2
  295. package/dist/cli/chunks/{vibium-TZSGZRCQ.js → vibium-R4GUVADA.js} +2 -2
  296. package/dist/cli/chunks/visual-security-VKYXEGJB.js +2 -0
  297. package/dist/cli/chunks/{web-tree-sitter-V2FADNRA.js → web-tree-sitter-MP6E6CJB.js} +2 -2
  298. package/dist/cli/chunks/{windsurf-installer-GQM7KWDC.js → windsurf-installer-Z6BWMUUO.js} +2 -2
  299. package/dist/cli/chunks/{witness-chain-GTITDIA2.js → witness-chain-EFLTABBA.js} +2 -2
  300. package/dist/cli/chunks/witness-chain-WVXRXKQP.js +2 -0
  301. package/dist/cli/chunks/{witness-key-manager-AHRM2M52.js → witness-key-manager-PN36TV43.js} +2 -2
  302. package/dist/cli/chunks/{workflow-XCGHEL3I.js → workflow-A2AX3RJU.js} +4 -4
  303. package/dist/cli/chunks/workflow-orchestrator-GOWSPR3G.js +2 -0
  304. package/dist/cli/chunks/{wrappers-VGO2GO4J.js → wrappers-NA6FHA63.js} +2 -2
  305. package/dist/cli/commands/llm-router.js +1 -0
  306. package/dist/init/skills-installer.js +1 -0
  307. package/dist/integrations/embeddings/base/EmbeddingGenerator.js +13 -1
  308. package/dist/kernel/unified-memory.js +4 -0
  309. package/dist/learning/qe-flywheel/corpus-scorer.js +10 -7
  310. package/dist/learning/qe-flywheel/generation.d.ts +7 -0
  311. package/dist/learning/qe-flywheel/generation.js +5 -0
  312. package/dist/learning/qe-flywheel/witness-verify.d.ts +86 -0
  313. package/dist/learning/qe-flywheel/witness-verify.js +156 -0
  314. package/dist/mcp/bundle.js +397 -386
  315. package/dist/shared/db-recovery.d.ts +55 -0
  316. package/dist/shared/db-recovery.js +184 -0
  317. package/dist/shared/llm/billing-modes.js +5 -2
  318. package/dist/shared/llm/cost-tracker.js +1 -0
  319. package/dist/shared/llm/interfaces.d.ts +14 -1
  320. package/dist/shared/llm/provider-manager.d.ts +1 -1
  321. package/dist/shared/llm/provider-manager.js +7 -3
  322. package/dist/shared/llm/providers/claude-code.js +12 -3
  323. package/dist/shared/llm/providers/codex.d.ts +58 -0
  324. package/dist/shared/llm/providers/codex.js +305 -0
  325. package/dist/shared/llm/providers/index.d.ts +1 -0
  326. package/dist/shared/llm/providers/index.js +1 -0
  327. package/dist/shared/llm/router/config-store.js +5 -0
  328. package/dist/shared/llm/router/hybrid-router.js +2 -2
  329. package/dist/shared/llm/spend-ledger.d.ts +24 -0
  330. package/dist/shared/llm/spend-ledger.js +86 -15
  331. package/dist/shared/llm/translation/message-formatter.js +1 -0
  332. package/dist/shared/safe-db.d.ts +10 -0
  333. package/dist/shared/safe-db.js +17 -0
  334. package/dist/skills/qe-court/referee.d.ts +62 -0
  335. package/dist/skills/qe-court/referee.js +78 -0
  336. package/dist/validation/gate-reexecute.d.ts +9 -0
  337. package/dist/validation/gate-reexecute.js +61 -0
  338. package/dist/validation/paired-bootstrap.d.ts +36 -0
  339. package/dist/validation/paired-bootstrap.js +58 -0
  340. package/package.json +7 -3
  341. package/dist/cli/chunks/adapter-D657MKZY.js +0 -2
  342. package/dist/cli/chunks/aqe-learning-engine-AFR6OZJK.js +0 -2
  343. package/dist/cli/chunks/base-K5QRGZWE.js +0 -2
  344. package/dist/cli/chunks/browser-workflow-ZMMKCGYW.js +0 -2
  345. package/dist/cli/chunks/chunk-6SQ72FG7.js +0 -2
  346. package/dist/cli/chunks/chunk-FHHCH7WL.js +0 -2
  347. package/dist/cli/chunks/chunk-G5OGKVLO.js +0 -2
  348. package/dist/cli/chunks/chunk-ILRKO6A5.js +0 -43
  349. package/dist/cli/chunks/chunk-NX522PRH.js +0 -153
  350. package/dist/cli/chunks/chunk-PPUDKQ4X.js +0 -29
  351. package/dist/cli/chunks/chunk-ULQCEM7K.js +0 -2
  352. package/dist/cli/chunks/client-WI7RRUZO.js +0 -2
  353. package/dist/cli/chunks/core-handlers-T6URR57V.js +0 -2
  354. package/dist/cli/chunks/cross-domain-router-WHTTKHWM.js +0 -2
  355. package/dist/cli/chunks/dream-QUL6SURC.js +0 -2
  356. package/dist/cli/chunks/heartbeat-scheduler-VZNKE33K.js +0 -2
  357. package/dist/cli/chunks/hnsw-adapter-LGWLDZLC.js +0 -2
  358. package/dist/cli/chunks/hnsw-index-66FOOI7U.js +0 -2
  359. package/dist/cli/chunks/hybrid-router-I5MEVQDF.js +0 -2
  360. package/dist/cli/chunks/impact-analyzer-K6ANYIY3.js +0 -2
  361. package/dist/cli/chunks/init-wizard-URHGXJ32.js +0 -2
  362. package/dist/cli/chunks/kernel-OKI5ZY5P.js +0 -2
  363. package/dist/cli/chunks/knowledge-graph-VQQSK7T5.js +0 -2
  364. package/dist/cli/chunks/llm-router-service-TISH33SY.js +0 -2
  365. package/dist/cli/chunks/load-test-KWKWC4Q7.js +0 -2
  366. package/dist/cli/chunks/memory-backend-JSQQMXVS.js +0 -2
  367. package/dist/cli/chunks/pattern-null-store-SXBIUKE5.js +0 -2
  368. package/dist/cli/chunks/protocol-executor-D3Q5P3WY.js +0 -2
  369. package/dist/cli/chunks/provider-manager-2EIX7E5Q.js +0 -2
  370. package/dist/cli/chunks/qe-reasoning-bank-ITOW2ZHC.js +0 -2
  371. package/dist/cli/chunks/queen-coordinator-TO5X2EXL.js +0 -2
  372. package/dist/cli/chunks/router-GZJQEJU3.js +0 -2
  373. package/dist/cli/chunks/routing-feedback-CRXSKFNS.js +0 -2
  374. package/dist/cli/chunks/rvf-native-adapter-WHADT5HX.js +0 -2
  375. package/dist/cli/chunks/safe-db-MIZ2OFWC.js +0 -2
  376. package/dist/cli/chunks/schedule-XFILYTYC.js +0 -2
  377. package/dist/cli/chunks/scheduler-EIPJ777A.js +0 -2
  378. package/dist/cli/chunks/sqlite-persistence-PFU3GSRD.js +0 -2
  379. package/dist/cli/chunks/sync-3SDMVAIU.js +0 -2
  380. package/dist/cli/chunks/transformers-QFOBOP2Y.js +0 -2
  381. package/dist/cli/chunks/unified-memory-OUVCMFGK.js +0 -2
  382. package/dist/cli/chunks/unified-memory-hnsw-YGQPOHXB.js +0 -2
  383. package/dist/cli/chunks/unified-persistence-GFRZVDOW.js +0 -2
  384. package/dist/cli/chunks/visual-security-LVOOYQ64.js +0 -2
  385. package/dist/cli/chunks/witness-chain-QNFPV4UL.js +0 -2
  386. package/dist/cli/chunks/workflow-orchestrator-MIVBCALG.js +0 -2
@@ -1,5 +1,5 @@
1
- import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.3");process.exit(0)}
2
- import"./chunk-DMD6WVJ2.js";import{b as $}from"./chunk-FTM562PF.js";import{d as R}from"./chunk-S47YGWXK.js";import{b as k,c as C,d as b}from"./chunk-BEPP57C2.js";import{c as W}from"./chunk-OBL6W4Z5.js";import"./chunk-NKTLKMUB.js";import"./chunk-2LNDU7AW.js";import"./chunk-SGMJ277D.js";import{Command as O}from"commander";import o from"chalk";function P(d,a){let m=d.indexOf("=");return m>0&&(a[d.substring(0,m)]=d.substring(m+1)),a}function x(d,a,m){let y=new O("workflow").description("Manage QE workflows and pipelines (ADR-041)");return y.command("run <file>").description("Execute a QE pipeline from YAML file").option("-w, --watch","Watch execution progress").option("-v, --verbose","Show detailed output").option("--params <json>","Additional parameters as JSON","{}").action(async(t,l)=>{if(!await m())return;let e=await import("fs"),c=(await import("path")).resolve(t);try{console.log(o.blue(`
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.13.0");process.exit(0)}
2
+ import"./chunk-DRIJYTSK.js";import{b as $}from"./chunk-7DMXCCSD.js";import{d as R}from"./chunk-YPTGE5NJ.js";import{b as k,c as C,d as b}from"./chunk-ZOXWASCC.js";import{c as W}from"./chunk-2DIT5AUU.js";import"./chunk-QI4CGJNK.js";import"./chunk-CYL2FV23.js";import"./chunk-ES7WCYOU.js";import{Command as O}from"commander";import o from"chalk";function P(d,a){let m=d.indexOf("=");return m>0&&(a[d.substring(0,m)]=d.substring(m+1)),a}function x(d,a,m){let y=new O("workflow").description("Manage QE workflows and pipelines (ADR-041)");return y.command("run <file>").description("Execute a QE pipeline from YAML file").option("-w, --watch","Watch execution progress").option("-v, --verbose","Show detailed output").option("--params <json>","Additional parameters as JSON","{}").action(async(t,l)=>{if(!await m())return;let e=await import("fs"),c=(await import("path")).resolve(t);try{console.log(o.blue(`
3
3
  Running workflow from: ${t}
4
4
  `));let s=k(c);if(!s.success||!s.workflow){console.log(o.red("Failed to parse pipeline:"));for(let w of s.errors)console.log(o.red(` ${w}`));await a(1)}let r={...W(l.params,"params")};if(s.pipeline){for(let w of s.pipeline.stages)if(w.params)for(let[S,h]of Object.entries(w.params))r[S]=h}if(!d.workflowOrchestrator.getWorkflow(s.workflow.id)){let w=d.workflowOrchestrator.registerWorkflow(s.workflow);w.success||(console.log(o.red(`Failed to register workflow: ${w.error.message}`)),await a(1))}let n=await d.workflowOrchestrator.executeWorkflow(s.workflow.id,r);if(!n.success){console.log(o.red(`Failed to start workflow: ${n.error.message}`)),await a(1);return}let p=n.value;if(console.log(o.cyan(` Execution ID: ${p}`)),console.log(o.gray(` Workflow: ${s.workflow.name}`)),console.log(o.gray(` Stages: ${s.workflow.steps.length}`)),console.log(""),l.watch){console.log(o.blue(`Workflow Progress:
5
5
  `));let w,S=Date.now();for(;;){let g=d.workflowOrchestrator.getWorkflowStatus(p);if(!g)break;if(!w||w.progress!==g.progress||w.status!==g.status||JSON.stringify(w.currentSteps)!==JSON.stringify(g.currentSteps)){process.stdout.write("\r\x1B[K");let v="\u2588".repeat(Math.floor(g.progress/5))+"\u2591".repeat(20-Math.floor(g.progress/5)),D=g.status==="completed"?o.green:g.status==="failed"?o.red:g.status==="running"?o.yellow:o.gray;console.log(` [${v}] ${g.progress}% - ${D(g.status)}`),g.currentSteps.length>0&&l.verbose&&console.log(o.gray(` Running: ${g.currentSteps.join(", ")}`)),w=g}if(g.status==="completed"||g.status==="failed"||g.status==="cancelled")break;await new Promise(v=>setTimeout(v,500))}let h=d.workflowOrchestrator.getWorkflowStatus(p);if(h){console.log("");let g=h.duration||Date.now()-S;h.status==="completed"?(console.log(o.green("Workflow completed successfully")),console.log(o.gray(` Duration: ${$(g)}`)),console.log(o.gray(` Completed: ${h.completedSteps.length} stages`)),h.skippedSteps.length>0&&console.log(o.yellow(` Skipped: ${h.skippedSteps.length} stages`))):h.status==="failed"?(console.log(o.red("Workflow failed")),console.log(o.red(` Error: ${h.error}`)),console.log(o.gray(` Failed stages: ${h.failedSteps.join(", ")}`))):console.log(o.yellow(`Workflow ${h.status}`))}}else console.log(o.green("Workflow execution started")),console.log(o.gray(` Use 'aqe workflow status ${p}' to check progress`));console.log(""),await a(0)}catch(s){console.error(o.red(`
@@ -35,10 +35,10 @@ Workflow cancelled: ${t}
35
35
  `)):console.log(o.red(`
36
36
  Failed to cancel workflow: ${l.error.message}
37
37
  `)),await a(l.success?0:1)}catch(l){console.error(o.red(`
38
- Failed to cancel workflow:`),l),await a(1)}}),y.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:t}=await import("./browser-workflow-ZMMKCGYW.js"),e=await new t().invoke({});if(e.success&&e.data){console.log(o.blue(`
38
+ Failed to cancel workflow:`),l),await a(1)}}),y.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:t}=await import("./browser-workflow-MXS3ZKY2.js"),e=await new t().invoke({});if(e.success&&e.data){console.log(o.blue(`
39
39
  Browser Workflow Templates:
40
40
  `));for(let u of e.data.availableTemplates)console.log(` ${o.cyan(u)}`);console.log("")}else console.log(o.red(`Failed: ${e.error||"Unknown error"}`));await a(0)}catch(t){console.error(o.red(`
41
- Failed:`),t),await a(1)}}),y.command("browser-load [template]").description("Load and validate a browser workflow template or inline YAML").option("--yaml <yaml>","Inline YAML workflow definition").option("-v, --var <key=value>","Variable override (repeatable)",P,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(t,l)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-ZMMKCGYW.js"),{writeOutput:u,toJSON:c}=await import("./ci-output-25GS6RXR.js"),s=new e,f={variables:l.var||{}};if(l.yaml)f.workflowYaml=l.yaml;else if(t)if(t.endsWith(".yaml")||t.endsWith(".yml")){let i=await import("fs"),p=(await import("path")).resolve(t);i.existsSync(p)||(console.log(o.red(`
41
+ Failed:`),t),await a(1)}}),y.command("browser-load [template]").description("Load and validate a browser workflow template or inline YAML").option("--yaml <yaml>","Inline YAML workflow definition").option("-v, --var <key=value>","Variable override (repeatable)",P,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(t,l)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-MXS3ZKY2.js"),{writeOutput:u,toJSON:c}=await import("./ci-output-HD6IZNJA.js"),s=new e,f={variables:l.var||{}};if(l.yaml)f.workflowYaml=l.yaml;else if(t)if(t.endsWith(".yaml")||t.endsWith(".yml")){let i=await import("fs"),p=(await import("path")).resolve(t);i.existsSync(p)||(console.log(o.red(`
42
42
  File not found: ${p}
43
43
  `)),await a(1)),f.workflowYaml=i.readFileSync(p,"utf-8")}else f.templateName=t;else console.log(o.red(`
44
44
  Provide a template name or --yaml. Use "workflow browser-list" to see templates.
@@ -0,0 +1,2 @@
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.13.0");process.exit(0)}
2
+ import{a,b,c,d}from"./chunk-54MFKCLT.js";import"./chunk-IYDYJ33J.js";import"./chunk-G5DFYX3J.js";import"./chunk-W5YEIHIO.js";import"./chunk-BUGWPTMF.js";import"./chunk-HVB2L52I.js";import"./chunk-OXXMVQDF.js";import"./chunk-NUQBJGGF.js";import"./chunk-2DIT5AUU.js";import"./chunk-QI4CGJNK.js";import"./chunk-CYL2FV23.js";import"./chunk-E3B5XTXJ.js";import"./chunk-SNTUKW4Q.js";import"./chunk-TVMFH5N2.js";import"./chunk-THBTN7XB.js";import"./chunk-RDU4WTV2.js";import"./chunk-LBE2P6UC.js";import"./chunk-IZRLIWFN.js";import"./chunk-AO7AHX6K.js";import"./chunk-YRQLVGCI.js";import"./chunk-3GSYD5SL.js";import"./chunk-ES7WCYOU.js";export{b as DEFAULT_WORKFLOW_CONFIG,a as WorkflowEvents,c as WorkflowOrchestrator,d as createWorkflowOrchestrator};
@@ -1,2 +1,2 @@
1
- import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.3");process.exit(0)}
2
- import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v as L,w as M,x as N}from"./chunk-QILF6BZH.js";import{a as v,b as w,c as x,d as y,e as z,f as A,g as B,h as C,i as D,j as E,k as F,l as G,m as H,n as I,o as J,p as K}from"./chunk-YOG5KQZF.js";import"./chunk-NOSQI2OW.js";import"./chunk-FJACKKRL.js";import"./chunk-L2X3BWMN.js";import"./chunk-G5OGKVLO.js";import"./chunk-4EHW4TNA.js";import"./chunk-NJDLJ3KD.js";import"./chunk-OBL6W4Z5.js";import"./chunk-2LNDU7AW.js";import"./chunk-ULQCEM7K.js";import"./chunk-UAPUA6OY.js";import"./chunk-GS6G7AVS.js";import"./chunk-YUDGQZJN.js";import"./chunk-HJ4U64BL.js";import"./chunk-CYSBM52D.js";import"./chunk-NLDLUHOF.js";import"./chunk-PEHEANAM.js";import"./chunk-XUUVAAHV.js";import"./chunk-SGMJ277D.js";export{z as GNNLayerFactory,i as QEFlashAttention,x as QEGNNEmbeddingIndex,y as QEGNNIndexFactory,a as QESONA,e as QE_FLASH_ATTENTION_CONFIG,g as QE_PERFORMANCE_TARGETS,f as QE_SONA_CONFIG,A as TensorCompressionFactory,u as batchComputeAttention,K as batchDifferentiableSearch,M as checkRuvectorPackagesAvailable,c as createDomainQESONA,j as createQEFlashAttention,b as createQESONA,D as getDifferentiableSearch,F as getGetCompressionLevel,E as getHierarchicalForward,G as getInit,h as getOptimalBlockConfig,k as getQEFlashAttentionConfig,n as getRuvectorDotProductAttention,m as getRuvectorFlashAttention,p as getRuvectorHyperbolicAttention,B as getRuvectorLayer,q as getRuvectorLinearAttention,r as getRuvectorMoEAttention,o as getRuvectorMultiHeadAttention,L as getRuvectorPackageVersions,C as getTensorCompress,l as getWorkloadTypes,N as initAllRuvectorPackages,w as initGNN,d as isAttentionAvailable,v as isGNNAvailable,s as toFloat32Array,H as toFloat32ArrayGNN,J as toIEmbedding,t as toNumberArrayAttn,I as toNumberArrayGNN};
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.13.0");process.exit(0)}
2
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v as L,w as M,x as N}from"./chunk-HOKON5EL.js";import{a as v,b as w,c as x,d as y,e as z,f as A,g as B,h as C,i as D,j as E,k as F,l as G,m as H,n as I,o as J,p as K}from"./chunk-HTPM3URI.js";import"./chunk-G5DFYX3J.js";import"./chunk-W5YEIHIO.js";import"./chunk-BUGWPTMF.js";import"./chunk-HVB2L52I.js";import"./chunk-OXXMVQDF.js";import"./chunk-NUQBJGGF.js";import"./chunk-2DIT5AUU.js";import"./chunk-CYL2FV23.js";import"./chunk-SNTUKW4Q.js";import"./chunk-TVMFH5N2.js";import"./chunk-THBTN7XB.js";import"./chunk-RDU4WTV2.js";import"./chunk-LBE2P6UC.js";import"./chunk-IZRLIWFN.js";import"./chunk-AO7AHX6K.js";import"./chunk-YRQLVGCI.js";import"./chunk-3GSYD5SL.js";import"./chunk-ES7WCYOU.js";export{z as GNNLayerFactory,i as QEFlashAttention,x as QEGNNEmbeddingIndex,y as QEGNNIndexFactory,a as QESONA,e as QE_FLASH_ATTENTION_CONFIG,g as QE_PERFORMANCE_TARGETS,f as QE_SONA_CONFIG,A as TensorCompressionFactory,u as batchComputeAttention,K as batchDifferentiableSearch,M as checkRuvectorPackagesAvailable,c as createDomainQESONA,j as createQEFlashAttention,b as createQESONA,D as getDifferentiableSearch,F as getGetCompressionLevel,E as getHierarchicalForward,G as getInit,h as getOptimalBlockConfig,k as getQEFlashAttentionConfig,n as getRuvectorDotProductAttention,m as getRuvectorFlashAttention,p as getRuvectorHyperbolicAttention,B as getRuvectorLayer,q as getRuvectorLinearAttention,r as getRuvectorMoEAttention,o as getRuvectorMultiHeadAttention,L as getRuvectorPackageVersions,C as getTensorCompress,l as getWorkloadTypes,N as initAllRuvectorPackages,w as initGNN,d as isAttentionAvailable,v as isGNNAvailable,s as toFloat32Array,H as toFloat32ArrayGNN,J as toIEmbedding,t as toNumberArrayAttn,I as toNumberArrayGNN};
@@ -400,6 +400,7 @@ function getDefaultModelForProvider(provider) {
400
400
  const defaults = {
401
401
  claude: 'claude-sonnet-4-6',
402
402
  'claude-code': 'sonnet',
403
+ codex: 'gpt-5-codex',
403
404
  openai: 'gpt-4o',
404
405
  ollama: 'llama3.1',
405
406
  openrouter: 'anthropic/claude-sonnet-4',
@@ -30,6 +30,7 @@ const V3_DOMAIN_SKILLS = [
30
30
  'qe-visual-accessibility', // Visual regression, WCAG
31
31
  'qe-chaos-resilience', // Fault injection, resilience
32
32
  'qe-learning-optimization', // Transfer learning, self-improvement
33
+ 'qe-court', // Adversarial review court — overturn-gated SHIP/REMAND/BLOCK verdict (ADR-124)
33
34
  // V3 utilities
34
35
  'qe-iterative-loop', // QE iteration patterns
35
36
  // New skills (ADR-086 skill design standards)
@@ -11,7 +11,6 @@
11
11
  * @module integrations/embeddings/base/EmbeddingGenerator
12
12
  */
13
13
  import { EmbeddingCache } from '../cache/EmbeddingCache.js';
14
- import { pipeline } from '@huggingface/transformers';
15
14
  import { cosineSimilarity } from '../../../shared/utils/vector-math.js';
16
15
  /**
17
16
  * Base embedding generator class
@@ -61,6 +60,19 @@ export class EmbeddingGenerator {
61
60
  const loadDtype = this.config.quantization === 'none' ? 'fp32' :
62
61
  this.config.quantization === 'fp16' ? 'fp16' :
63
62
  this.config.quantization === 'int8' ? 'int8' : 'q8';
63
+ // Lazy-load the optional transformers backend (#565). If it isn't
64
+ // installed, fail with an actionable message pointing at the endpoint path.
65
+ let pipeline;
66
+ try {
67
+ ({ pipeline } = await import('@huggingface/transformers'));
68
+ }
69
+ catch (err) {
70
+ throw new Error('Local (in-process) embeddings require the optional dependency ' +
71
+ '"@huggingface/transformers", which is not installed. Either run ' +
72
+ '`npm install @huggingface/transformers`, or configure an embedding ' +
73
+ 'endpoint (e.g. Cognitum /v1/embeddings) so the local backend is not needed. ' +
74
+ `Underlying import error: ${err instanceof Error ? err.message : String(err)}`);
75
+ }
64
76
  this.model = await pipeline('feature-extraction', this.config.model, {
65
77
  dtype: loadDtype,
66
78
  // v4 narrowed ProgressInfo to a discriminated union — `progress`
@@ -255,6 +255,10 @@ export class UnifiedMemoryManager {
255
255
  this.db = openSafeDatabase(this.config.dbPath, {
256
256
  walMode: this.config.walMode,
257
257
  busyTimeout: this.config.busyTimeout,
258
+ // M3.2: the missing-file case is handled above; this covers the
259
+ // EXISTS-but-MALFORMED case — auto-restore the newest verified backup and
260
+ // park the corrupt original (non-destructive) instead of opening a broken DB.
261
+ autoRestore: true,
258
262
  });
259
263
  this.db.pragma(`mmap_size = ${this.config.mmapSize}`);
260
264
  this.db.pragma(`cache_size = ${this.config.cacheSize}`);
@@ -150,11 +150,13 @@ function selectHeldOut(docs, ratio) {
150
150
  */
151
151
  function scoreHeldOut(docs, policy, ratio) {
152
152
  if (docs.length === 0)
153
- return 0;
153
+ return { mean: 0, samples: [] };
154
154
  const queries = selectHeldOut(docs, ratio);
155
155
  if (queries.length === 0)
156
- return 0;
157
- let sumReciprocalRank = 0;
156
+ return { mean: 0, samples: [] };
157
+ // Per-query reciprocal ranks: the mean is the held-out signal; the vector is
158
+ // the paired sample the accept/v1+sig significance gate needs (ADR-118).
159
+ const samples = [];
158
160
  for (const queried of queries) {
159
161
  const query = queried.bodyTokens; // subject deliberately withheld
160
162
  const rels = docs.map((d) => ({ doc: d, rel: relevance(query, d, queried, policy) }));
@@ -177,9 +179,10 @@ function scoreHeldOut(docs, policy, ratio) {
177
179
  }
178
180
  const ranked = rankMMR(pool, policy.mmrLambda);
179
181
  const rank = ranked.indexOf(queried.id) + 1; // 1-based; 0 -> not found
180
- sumReciprocalRank += rank > 0 ? 1 / rank : 0;
182
+ samples.push(rank > 0 ? 1 / rank : 0);
181
183
  }
182
- return sumReciprocalRank / queries.length;
184
+ const mean = samples.reduce((a, b) => a + b, 0) / samples.length;
185
+ return { mean, samples };
183
186
  }
184
187
  // ---------------------------------------------------------------------------
185
188
  // Anchor flat guard (the no-regression floor)
@@ -283,11 +286,11 @@ export function createCorpusScorer(opts) {
283
286
  const corpus = loadCorpus(opts.db);
284
287
  let anchorMeanCached = null;
285
288
  return (policy) => {
286
- const heldOut = scoreHeldOut(corpus, policy, ratio);
289
+ const held = scoreHeldOut(corpus, policy, ratio);
287
290
  if (anchorMeanCached === null) {
288
291
  anchorMeanCached = gradeAnchor(anchorPath);
289
292
  }
290
- return { heldOut, anchorMean: anchorMeanCached };
293
+ return { heldOut: held.mean, anchorMean: anchorMeanCached, heldOutSamples: held.samples };
291
294
  };
292
295
  }
293
296
  //# sourceMappingURL=corpus-scorer.js.map
@@ -22,6 +22,13 @@ export interface PolicyScores {
22
22
  heldOut: number;
23
23
  /** Mean over the ADR-117 frozen anchor items (the no-regression signal). */
24
24
  anchorMean: number;
25
+ /**
26
+ * Per-held-out-task scores whose mean is `heldOut`. Optional — when present and
27
+ * paired index-for-index with the baseline's, they enable the accept/v1+sig
28
+ * paired-bootstrap significance gate (ADR-118). Scorers that don't provide them
29
+ * simply can't use accept/v1+sig (it fail-closes).
30
+ */
31
+ heldOutSamples?: number[];
25
32
  }
26
33
  /** Injected: evaluate a policy → its held-out + anchor scores. */
27
34
  export type PolicyScorer = (policy: RetrievalPolicy) => PolicyScores | Promise<PolicyScores>;
@@ -54,6 +54,11 @@ export async function runFlywheelGeneration(input) {
54
54
  anchorTol: input.anchorTol,
55
55
  provenanceTier,
56
56
  allowJudgeTier: input.allowJudgeTier,
57
+ // ADR-118 accept/v1+sig: seal the paired per-task samples ONLY when the sig
58
+ // rule is in use. Left undefined for accept/v1 (and thus absent from the
59
+ // sealed hash), so accept/v1 receipts remain byte-identical to before.
60
+ candidateHeldOutSamples: ruleVersion === 'accept/v1+sig' ? candidateScores.heldOutSamples : undefined,
61
+ baselineHeldOutSamples: ruleVersion === 'accept/v1+sig' ? baselineScores.heldOutSamples : undefined,
57
62
  };
58
63
  const ruleResult = reExecuteGate(ruleVersion, sealed);
59
64
  const verdict = ruleResult.promote ? 'promote' : 'reject';
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Cross-side witness verification (ADR-124 M2.2) — the single verifier that
3
+ * reconciles AQE's flywheel receipts with the Cognitum `qe-harness` witness
4
+ * bundles so QE evidence signed by the shared platform identity
5
+ * (fingerprint `f1ac28607da49ec1`) is verifiable on either side.
6
+ *
7
+ * WHAT WAS ALREADY ALIGNED (the bridge that exists): both sides use Ed25519,
8
+ * the same env secret `QE_WITNESS_SIGNING_KEY` (JSON `{publicKey,privateKey}`
9
+ * PEM), and the SAME key-id/fingerprint scheme `sha256(pem.trim()).slice(0,16)`
10
+ * — so both can sign AS the platform identity. `keyFingerprint()` here is
11
+ * byte-identical to `receipt.ts` `keyIdOf` and to qe-harness `witness.ts`.
12
+ *
13
+ * WHAT THIS RECONCILES: the two SIGNED ARTIFACTS are not natively
14
+ * cross-verifiable — AQE signs a fixed-field-order JSON body as HEX; qe-harness
15
+ * signs a `sha256:`-prefixed digest of a recursively key-sorted `stableStringify`
16
+ * as BASE64, wrapped in a nested `witness{}`. This module verifies BOTH.
17
+ *
18
+ * TWO EXTERNAL DEPENDENCIES (tracked, need the qe-harness owner — see M2.2 notes):
19
+ * 1. The public key for `f1ac28607da49ec1` is committed to NEITHER repo (it
20
+ * lives on meta-llm). Offline verification of platform-signed artifacts
21
+ * needs it provisioned via `QE_WITNESS_PUBLIC_KEYS_JSON`. This verifier is
22
+ * READY the moment that allowlist is populated.
23
+ * 2. The qe-harness bundle format here is implemented to the documented
24
+ * algorithm; byte-parity must be confirmed against a REAL qe-harness sample
25
+ * bundle before it gates anything (see witness-verify.test.ts).
26
+ *
27
+ * No new deps — node:crypto only. Reuses receipt.ts for the AQE path.
28
+ */
29
+ import { type EvolveReceipt } from './receipt.js';
30
+ /** Public-key allowlist: fingerprint (`sha256(pem)[:16]`) → SPKI PEM. */
31
+ export type PublicKeyAllowlist = Map<string, string>;
32
+ /** Byte-identical to receipt.ts `keyIdOf` and qe-harness `witness.ts` fingerprint. */
33
+ export declare function keyFingerprint(publicKeyPem: string): string;
34
+ /**
35
+ * Load the trusted public-key allowlist from `QE_WITNESS_PUBLIC_KEYS_JSON`
36
+ * (`{ "<fingerprint>": "<SPKI PEM>", ... }`). Empty map when unset/unparseable —
37
+ * callers decide whether an empty allowlist means "verify signature only" (AQE
38
+ * receipts carry their own PEM) or "reject" (platform bundles need a trust root).
39
+ */
40
+ export declare function loadAllowlist(json?: string | undefined): PublicKeyAllowlist;
41
+ /**
42
+ * Deterministic serialization matching qe-harness `stableStringify`: recursive
43
+ * key-sort on objects, array order preserved. This MUST stay byte-identical to
44
+ * the qe-harness implementation or digests will not match.
45
+ */
46
+ export declare function stableStringify(value: unknown): string;
47
+ /** qe-harness canonical digest: `sha256:` + sha256(stableStringify(bundle − digest − witness)). */
48
+ export declare function canonicalDigest(bundle: Record<string, unknown>): string;
49
+ /** The qe-harness witness envelope (packages/engine/src/types.ts). */
50
+ export interface HarnessWitness {
51
+ alg: 'ed25519';
52
+ digest: string;
53
+ /** base64 Ed25519 signature over `digest`. */
54
+ signature: string;
55
+ publicKeyFingerprint: string;
56
+ signedAt?: string;
57
+ }
58
+ export type WitnessFormat = 'aqe-receipt' | 'harness-witness' | 'unknown';
59
+ export interface VerifyResult {
60
+ valid: boolean;
61
+ format: WitnessFormat;
62
+ fingerprint?: string;
63
+ reason?: string;
64
+ }
65
+ /**
66
+ * Verify an AQE flywheel receipt. When an allowlist is provided and non-empty,
67
+ * the receipt's embedded public key must be present (by fingerprint) AND match;
68
+ * an empty allowlist verifies the signature against the receipt's own PEM only.
69
+ * NOTE: this is signature verification; the full AQE trust model ALSO re-executes
70
+ * the frozen gate (ADR-120) — do that separately for promotion decisions.
71
+ */
72
+ export declare function verifyAqeReceipt(receipt: EvolveReceipt, allowlist?: PublicKeyAllowlist, opts?: {
73
+ allowSelfSigned?: boolean;
74
+ }): VerifyResult;
75
+ /**
76
+ * Verify a qe-harness witness bundle. Requires the signer's public key in the
77
+ * allowlist (platform bundles do NOT embed their PEM). Recomputes the canonical
78
+ * digest to detect payload tampering, then Ed25519-verifies the base64 signature
79
+ * over the digest string.
80
+ */
81
+ export declare function verifyHarnessWitness(bundle: Record<string, unknown> & {
82
+ witness: HarnessWitness;
83
+ }, allowlist: PublicKeyAllowlist): VerifyResult;
84
+ /** Detect the artifact format and dispatch to the right verifier. */
85
+ export declare function verifyWitness(artifact: unknown, allowlist?: PublicKeyAllowlist): VerifyResult;
86
+ //# sourceMappingURL=witness-verify.d.ts.map
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Cross-side witness verification (ADR-124 M2.2) — the single verifier that
3
+ * reconciles AQE's flywheel receipts with the Cognitum `qe-harness` witness
4
+ * bundles so QE evidence signed by the shared platform identity
5
+ * (fingerprint `f1ac28607da49ec1`) is verifiable on either side.
6
+ *
7
+ * WHAT WAS ALREADY ALIGNED (the bridge that exists): both sides use Ed25519,
8
+ * the same env secret `QE_WITNESS_SIGNING_KEY` (JSON `{publicKey,privateKey}`
9
+ * PEM), and the SAME key-id/fingerprint scheme `sha256(pem.trim()).slice(0,16)`
10
+ * — so both can sign AS the platform identity. `keyFingerprint()` here is
11
+ * byte-identical to `receipt.ts` `keyIdOf` and to qe-harness `witness.ts`.
12
+ *
13
+ * WHAT THIS RECONCILES: the two SIGNED ARTIFACTS are not natively
14
+ * cross-verifiable — AQE signs a fixed-field-order JSON body as HEX; qe-harness
15
+ * signs a `sha256:`-prefixed digest of a recursively key-sorted `stableStringify`
16
+ * as BASE64, wrapped in a nested `witness{}`. This module verifies BOTH.
17
+ *
18
+ * TWO EXTERNAL DEPENDENCIES (tracked, need the qe-harness owner — see M2.2 notes):
19
+ * 1. The public key for `f1ac28607da49ec1` is committed to NEITHER repo (it
20
+ * lives on meta-llm). Offline verification of platform-signed artifacts
21
+ * needs it provisioned via `QE_WITNESS_PUBLIC_KEYS_JSON`. This verifier is
22
+ * READY the moment that allowlist is populated.
23
+ * 2. The qe-harness bundle format here is implemented to the documented
24
+ * algorithm; byte-parity must be confirmed against a REAL qe-harness sample
25
+ * bundle before it gates anything (see witness-verify.test.ts).
26
+ *
27
+ * No new deps — node:crypto only. Reuses receipt.ts for the AQE path.
28
+ */
29
+ import { createHash, verify as edVerify, createPublicKey } from 'node:crypto';
30
+ import { verifySignature, receiptBodyString } from './receipt.js';
31
+ /** Byte-identical to receipt.ts `keyIdOf` and qe-harness `witness.ts` fingerprint. */
32
+ export function keyFingerprint(publicKeyPem) {
33
+ return createHash('sha256').update(publicKeyPem.trim()).digest('hex').slice(0, 16);
34
+ }
35
+ /**
36
+ * Load the trusted public-key allowlist from `QE_WITNESS_PUBLIC_KEYS_JSON`
37
+ * (`{ "<fingerprint>": "<SPKI PEM>", ... }`). Empty map when unset/unparseable —
38
+ * callers decide whether an empty allowlist means "verify signature only" (AQE
39
+ * receipts carry their own PEM) or "reject" (platform bundles need a trust root).
40
+ */
41
+ export function loadAllowlist(json = process.env.QE_WITNESS_PUBLIC_KEYS_JSON) {
42
+ const map = new Map();
43
+ if (!json)
44
+ return map;
45
+ try {
46
+ const obj = JSON.parse(json);
47
+ for (const [fp, pem] of Object.entries(obj)) {
48
+ if (typeof pem === 'string')
49
+ map.set(fp, pem);
50
+ }
51
+ }
52
+ catch {
53
+ // An unparseable allowlist yields an empty (fail-closed) trust root — but log
54
+ // it loudly, or a typo'd env var silently disables verification (qe-court finding).
55
+ console.error('[witness-verify] QE_WITNESS_PUBLIC_KEYS_JSON is set but not valid JSON — ' +
56
+ 'treating the trust root as EMPTY (verification will fail closed).');
57
+ }
58
+ return map;
59
+ }
60
+ /**
61
+ * Deterministic serialization matching qe-harness `stableStringify`: recursive
62
+ * key-sort on objects, array order preserved. This MUST stay byte-identical to
63
+ * the qe-harness implementation or digests will not match.
64
+ */
65
+ export function stableStringify(value) {
66
+ if (value === null || typeof value !== 'object')
67
+ return JSON.stringify(value) ?? 'null';
68
+ if (Array.isArray(value))
69
+ return '[' + value.map(stableStringify).join(',') + ']';
70
+ const obj = value;
71
+ const keys = Object.keys(obj).sort();
72
+ return '{' + keys.map((k) => JSON.stringify(k) + ':' + stableStringify(obj[k])).join(',') + '}';
73
+ }
74
+ /** qe-harness canonical digest: `sha256:` + sha256(stableStringify(bundle − digest − witness)). */
75
+ export function canonicalDigest(bundle) {
76
+ const rest = {};
77
+ for (const [k, v] of Object.entries(bundle)) {
78
+ if (k === 'digest' || k === 'witness')
79
+ continue;
80
+ rest[k] = v;
81
+ }
82
+ return 'sha256:' + createHash('sha256').update(stableStringify(rest)).digest('hex');
83
+ }
84
+ /**
85
+ * Verify an AQE flywheel receipt. When an allowlist is provided and non-empty,
86
+ * the receipt's embedded public key must be present (by fingerprint) AND match;
87
+ * an empty allowlist verifies the signature against the receipt's own PEM only.
88
+ * NOTE: this is signature verification; the full AQE trust model ALSO re-executes
89
+ * the frozen gate (ADR-120) — do that separately for promotion decisions.
90
+ */
91
+ export function verifyAqeReceipt(receipt, allowlist, opts) {
92
+ const fingerprint = keyFingerprint(receipt.publicKeyPem);
93
+ if (allowlist && allowlist.size > 0) {
94
+ const allowed = allowlist.get(fingerprint);
95
+ if (!allowed)
96
+ return { valid: false, format: 'aqe-receipt', fingerprint, reason: 'fingerprint-not-in-allowlist' };
97
+ if (allowed.trim() !== receipt.publicKeyPem.trim()) {
98
+ return { valid: false, format: 'aqe-receipt', fingerprint, reason: 'allowlist-pem-mismatch' };
99
+ }
100
+ }
101
+ else if (!opts?.allowSelfSigned) {
102
+ // FAIL-CLOSED (qe-court finding): with no trust root, verifying against the
103
+ // receipt's OWN embedded key just proves internal consistency — anyone can
104
+ // self-sign a forged receipt. A caller must either provide an allowlist or
105
+ // explicitly opt into self-signed verification (e.g. a consistency check that
106
+ // is NOT used as authorization).
107
+ return { valid: false, format: 'aqe-receipt', fingerprint, reason: 'no-trust-root' };
108
+ }
109
+ const ok = verifySignature(receipt.publicKeyPem, receiptBodyString(receipt), receipt.signature);
110
+ return { valid: ok, format: 'aqe-receipt', fingerprint, reason: ok ? undefined : 'bad-signature' };
111
+ }
112
+ /**
113
+ * Verify a qe-harness witness bundle. Requires the signer's public key in the
114
+ * allowlist (platform bundles do NOT embed their PEM). Recomputes the canonical
115
+ * digest to detect payload tampering, then Ed25519-verifies the base64 signature
116
+ * over the digest string.
117
+ */
118
+ export function verifyHarnessWitness(bundle, allowlist) {
119
+ const w = bundle.witness;
120
+ const fingerprint = w?.publicKeyFingerprint;
121
+ // Fail closed on an unexpected algorithm — never verify a non-Ed25519-declared
122
+ // witness as Ed25519 (qe-court finding: ambiguous alg across implementations).
123
+ if (w?.alg !== 'ed25519') {
124
+ return { valid: false, format: 'harness-witness', fingerprint, reason: 'unsupported-alg' };
125
+ }
126
+ const pem = fingerprint ? allowlist.get(fingerprint) : undefined;
127
+ if (!pem)
128
+ return { valid: false, format: 'harness-witness', fingerprint, reason: 'fingerprint-not-in-allowlist' };
129
+ const recomputed = canonicalDigest(bundle);
130
+ if (recomputed !== w.digest) {
131
+ return { valid: false, format: 'harness-witness', fingerprint, reason: 'digest-mismatch' };
132
+ }
133
+ try {
134
+ const key = createPublicKey(pem);
135
+ const ok = edVerify(null, Buffer.from(w.digest, 'utf8'), key, Buffer.from(w.signature, 'base64'));
136
+ return { valid: ok, format: 'harness-witness', fingerprint, reason: ok ? undefined : 'bad-signature' };
137
+ }
138
+ catch {
139
+ return { valid: false, format: 'harness-witness', fingerprint, reason: 'verify-error' };
140
+ }
141
+ }
142
+ /** Detect the artifact format and dispatch to the right verifier. */
143
+ export function verifyWitness(artifact, allowlist = loadAllowlist()) {
144
+ if (artifact && typeof artifact === 'object') {
145
+ const o = artifact;
146
+ const w = o.witness;
147
+ if (w && typeof w === 'object' && typeof w.signature === 'string' && typeof w.publicKeyFingerprint === 'string') {
148
+ return verifyHarnessWitness(o, allowlist);
149
+ }
150
+ if (typeof o.signature === 'string' && typeof o.publicKeyPem === 'string' && typeof o.sealedHash === 'string') {
151
+ return verifyAqeReceipt(o, allowlist);
152
+ }
153
+ }
154
+ return { valid: false, format: 'unknown', reason: 'unrecognized-artifact' };
155
+ }
156
+ //# sourceMappingURL=witness-verify.js.map