agentic-qe 3.15.11 → 3.15.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/aqe-hook.cjs +38 -2
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +149 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-HL7MOCQN.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-TIDSQ3ZK.js → agent-booster-wasm-5VZCKTIJ.js} +2 -2
- package/dist/cli/chunks/{agent-handler-G3EPBVA7.js → agent-handler-K3C6CQCD.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-ARC5C7GW.js → agent-memory-branch-NVFQ25WS.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-OZ2DXB4G.js +2 -0
- package/dist/cli/chunks/{arena-K4I4QDXB.js → arena-QGWIJADQ.js} +2 -2
- package/dist/cli/chunks/{arena-36DTATJV.js → arena-TSZVDSXS.js} +4 -4
- package/dist/cli/chunks/{audit-WQSJSJZF.js → audit-KIEE2SHJ.js} +3 -3
- package/dist/cli/chunks/base-WIM7G3HC.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-BB4K67MT.js → better-sqlite3-BNB32NW3.js} +2 -2
- package/dist/cli/chunks/{brain-handler-CU3GOIU3.js → brain-handler-MPC5SPYI.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-NJQX7ZNB.js → branch-enumerator-LZ7UXKAY.js} +2 -2
- package/dist/cli/chunks/{browser-6YJF4FQW.js → browser-VDHAW4RK.js} +2 -2
- package/dist/cli/chunks/browser-workflow-QRKCFVR3.js +2 -0
- package/dist/cli/chunks/{chunk-V7DA4HAK.js → chunk-23PQF7NN.js} +1 -1
- package/dist/cli/chunks/{chunk-IENZSO3K.js → chunk-26672ISV.js} +2 -2
- package/dist/cli/chunks/{chunk-OURITHFV.js → chunk-2ASQRBK2.js} +2 -2
- package/dist/cli/chunks/{chunk-VBK2YAYY.js → chunk-2E2QO44T.js} +2 -2
- package/dist/cli/chunks/{chunk-NT7JRHMH.js → chunk-2IVE5AR3.js} +1 -1
- package/dist/cli/chunks/{chunk-672XOJDG.js → chunk-2JYUA27M.js} +1 -1
- package/dist/cli/chunks/{chunk-OHR7C777.js → chunk-2PPSS4JD.js} +2 -2
- package/dist/cli/chunks/{chunk-FUYOOKTH.js → chunk-32UTHIY5.js} +3 -3
- package/dist/cli/chunks/{chunk-UKKYMW3S.js → chunk-33I2ZP6E.js} +2 -2
- package/dist/cli/chunks/{chunk-76SNL7GU.js → chunk-35MIUSXQ.js} +2 -2
- package/dist/cli/chunks/{chunk-4X4MWMHB.js → chunk-35NW676P.js} +2 -2
- package/dist/cli/chunks/{chunk-BZPE3LDO.js → chunk-3EWQN37E.js} +2 -2
- package/dist/cli/chunks/{chunk-5N25I53C.js → chunk-3IU4LDZR.js} +2 -2
- package/dist/cli/chunks/{chunk-NKTWKYHB.js → chunk-47RMGDG4.js} +2 -2
- package/dist/cli/chunks/chunk-4A76VPU4.js +3 -0
- package/dist/cli/chunks/{chunk-4RH5I24Q.js → chunk-4CB3QPZM.js} +2 -2
- package/dist/cli/chunks/{chunk-U3LJNNVJ.js → chunk-4HWUECVD.js} +2 -2
- package/dist/cli/chunks/{chunk-T5KHJ3J7.js → chunk-4KUOYDY2.js} +2 -2
- package/dist/cli/chunks/{chunk-XNLIWQYE.js → chunk-4LWMAAWK.js} +2 -2
- package/dist/cli/chunks/{chunk-KKYO2NKV.js → chunk-4PU5GTZW.js} +2 -2
- package/dist/cli/chunks/{chunk-VWUZSNVC.js → chunk-4SA7M34P.js} +1 -1
- package/dist/cli/chunks/{chunk-5WYZHDIZ.js → chunk-4Y6OEBJZ.js} +1 -1
- package/dist/cli/chunks/{chunk-J4JMCZVA.js → chunk-5A66EGEW.js} +2 -2
- package/dist/cli/chunks/{chunk-HFFPYC4G.js → chunk-5ADXFUMO.js} +2 -2
- package/dist/cli/chunks/{chunk-KJCIMNHS.js → chunk-5S4UIDFK.js} +1 -1
- package/dist/cli/chunks/{chunk-YBBT3YYG.js → chunk-5TAEW5OV.js} +1 -1
- package/dist/cli/chunks/{chunk-FLU5FDSC.js → chunk-5Z23ZMXZ.js} +59 -59
- package/dist/cli/chunks/{chunk-YNOCQ2SL.js → chunk-65TH6RPD.js} +1 -1
- package/dist/cli/chunks/{chunk-XGPTZUKQ.js → chunk-66PXR3NI.js} +2 -2
- package/dist/cli/chunks/{chunk-ITPGWGQS.js → chunk-6E6HB4N4.js} +4 -4
- package/dist/cli/chunks/{chunk-EJPK7OTR.js → chunk-6QRI3JVE.js} +2 -2
- package/dist/cli/chunks/{chunk-ZP75ASUU.js → chunk-7DNR4KKR.js} +1 -1
- package/dist/cli/chunks/{chunk-V5AADCBC.js → chunk-7JFDLL2F.js} +1 -1
- package/dist/cli/chunks/chunk-7OEFBWAG.js +5 -0
- package/dist/cli/chunks/{chunk-EIDJNT5C.js → chunk-7QEUHNKO.js} +1 -1
- package/dist/cli/chunks/{chunk-7R5HC56U.js → chunk-7TA5MUPW.js} +1 -1
- package/dist/cli/chunks/{chunk-LCVEEII4.js → chunk-A2JCRXTK.js} +2 -2
- package/dist/cli/chunks/{chunk-JUMICXM6.js → chunk-A5Y7DAVQ.js} +2 -2
- package/dist/cli/chunks/{chunk-FZHSG75I.js → chunk-ADUAJIAU.js} +2 -2
- package/dist/cli/chunks/{chunk-TFW7CCKS.js → chunk-AJEXPFAB.js} +1 -1
- package/dist/cli/chunks/{chunk-JGJXXAS6.js → chunk-BC4T6SCV.js} +4 -4
- package/dist/cli/chunks/{chunk-4RAQ7PJA.js → chunk-BMG2JLSQ.js} +2 -2
- package/dist/cli/chunks/{chunk-Y7B5EUIJ.js → chunk-BOSMELJX.js} +2 -2
- package/dist/cli/chunks/{chunk-CIAL4YRY.js → chunk-BYRCB5JT.js} +2 -2
- package/dist/cli/chunks/{chunk-XS2XF3YG.js → chunk-C3YOVASQ.js} +1 -1
- package/dist/cli/chunks/{chunk-FL32MTKT.js → chunk-C74M4WUI.js} +2 -2
- package/dist/cli/chunks/{chunk-S6IYEBAI.js → chunk-CA5UNWQF.js} +2 -2
- package/dist/cli/chunks/{chunk-5MTWCCZJ.js → chunk-CDA5Z74H.js} +2 -2
- package/dist/cli/chunks/{chunk-DOFREOPQ.js → chunk-CPIBIR3X.js} +2 -2
- package/dist/cli/chunks/{chunk-UMVSWQNB.js → chunk-CU36D7TN.js} +2 -2
- package/dist/cli/chunks/{chunk-G4CKPWF6.js → chunk-DAUEK66C.js} +1 -1
- package/dist/cli/chunks/{chunk-2KFFEKSI.js → chunk-DRCBRUGN.js} +2 -2
- package/dist/cli/chunks/{chunk-EH2S6AOR.js → chunk-DZGPUGUG.js} +2 -2
- package/dist/cli/chunks/{chunk-HYXUN7BW.js → chunk-EF6OERRR.js} +1 -1
- package/dist/cli/chunks/{chunk-G77MLBDF.js → chunk-EN7GRVEQ.js} +2 -2
- package/dist/cli/chunks/{chunk-XDI5X3FR.js → chunk-ENGL7FIJ.js} +1 -1
- package/dist/cli/chunks/{chunk-HDNWSKHA.js → chunk-FAGKBOX2.js} +2 -2
- package/dist/cli/chunks/{chunk-FWSGPE3V.js → chunk-FNUFTWEO.js} +3 -3
- package/dist/cli/chunks/{chunk-AUUJBXWX.js → chunk-FZJCBSN4.js} +2 -2
- package/dist/cli/chunks/{chunk-ERN43HOX.js → chunk-G24SWTAX.js} +35 -35
- package/dist/cli/chunks/{chunk-VEEYL2CZ.js → chunk-G3AABG4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-35M2X3C5.js → chunk-GJKZ7UQO.js} +2 -2
- package/dist/cli/chunks/{chunk-OV5RPLKV.js → chunk-GKFV6CUD.js} +2 -2
- package/dist/cli/chunks/{chunk-4HJKQIX5.js → chunk-HLGFHHWV.js} +2 -2
- package/dist/cli/chunks/{chunk-R5LGV6GZ.js → chunk-HM3LSFTY.js} +2 -2
- package/dist/cli/chunks/{chunk-M7XFBSIK.js → chunk-HSA5IGGW.js} +2 -2
- package/dist/cli/chunks/{chunk-GWJWSLDA.js → chunk-HZBXJFGN.js} +2 -2
- package/dist/cli/chunks/{chunk-4MUBW4RT.js → chunk-IA55PFLG.js} +2 -2
- package/dist/cli/chunks/{chunk-RBZCA7SD.js → chunk-ICKUINKD.js} +2 -2
- package/dist/cli/chunks/{chunk-KDI5JOYZ.js → chunk-IETBWYHW.js} +2 -2
- package/dist/cli/chunks/{chunk-325QCVDI.js → chunk-IL7GQNNE.js} +2 -2
- package/dist/cli/chunks/{chunk-BTVWA35P.js → chunk-INZARYUD.js} +2 -2
- package/dist/cli/chunks/{chunk-G2IJFNZS.js → chunk-IPA7K556.js} +2 -2
- package/dist/cli/chunks/{chunk-UTTSH4NH.js → chunk-IVTQF55W.js} +3 -3
- package/dist/cli/chunks/{chunk-2CW7VRPH.js → chunk-J7Y7ZBIT.js} +5 -5
- package/dist/cli/chunks/{chunk-M5RQ6U3G.js → chunk-JGIJPDGD.js} +2 -2
- package/dist/cli/chunks/{chunk-RQMCZQN2.js → chunk-JNXK47OL.js} +2 -2
- package/dist/cli/chunks/{chunk-X4J73KP3.js → chunk-JOWUS2X5.js} +1 -1
- package/dist/cli/chunks/{chunk-ZMC543GI.js → chunk-JR6CUKAI.js} +2 -2
- package/dist/cli/chunks/chunk-JRYWLOBD.js +21 -0
- package/dist/cli/chunks/{chunk-ETVAYGCB.js → chunk-JW5PDJ5O.js} +3 -3
- package/dist/cli/chunks/{chunk-OD5D4LSZ.js → chunk-K3A3NWT3.js} +2 -2
- package/dist/cli/chunks/{chunk-LPU6PAJE.js → chunk-KA5SHLMW.js} +2 -2
- package/dist/cli/chunks/{chunk-NPZOBSAN.js → chunk-KGA7VAI4.js} +2 -2
- package/dist/cli/chunks/{chunk-ZMHCMJ4J.js → chunk-KJDI5CHX.js} +2 -2
- package/dist/cli/chunks/{chunk-KSLLHFVY.js → chunk-L3PV7VXK.js} +1 -1
- package/dist/cli/chunks/{chunk-LD5CFK53.js → chunk-L7NGKANW.js} +2 -2
- package/dist/cli/chunks/{chunk-6NA3KZZT.js → chunk-LFBA735S.js} +7 -7
- package/dist/cli/chunks/{chunk-Z2EA7A4Z.js → chunk-MAJXZYGK.js} +1 -1
- package/dist/cli/chunks/{chunk-TCYSBC7Y.js → chunk-MCPEC6OO.js} +1 -1
- package/dist/cli/chunks/{chunk-LBX7M4LW.js → chunk-MCPXNUDK.js} +2 -2
- package/dist/cli/chunks/{chunk-5YLOLACR.js → chunk-MMEALJ4D.js} +2 -2
- package/dist/cli/chunks/{chunk-IOZRKXR5.js → chunk-MYF5CNGV.js} +2 -2
- package/dist/cli/chunks/{chunk-X3PZCXWG.js → chunk-MYUMJ2ZI.js} +1 -1
- package/dist/cli/chunks/{chunk-VYTILW4R.js → chunk-N7O3PF6Y.js} +2 -2
- package/dist/cli/chunks/{chunk-GVKVJJQX.js → chunk-NA3F6FEO.js} +2 -2
- package/dist/cli/chunks/{chunk-TL6OFMXF.js → chunk-NNBQZR73.js} +2 -2
- package/dist/cli/chunks/{chunk-KXS3Y2AX.js → chunk-NV74SICL.js} +2 -2
- package/dist/cli/chunks/chunk-NVRYELCY.js +13 -0
- package/dist/cli/chunks/{chunk-OH5V5EJW.js → chunk-NX4BCSOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-XJKZ7FTR.js → chunk-O3IM4WRZ.js} +2 -2
- package/dist/cli/chunks/{chunk-3RHOPP7A.js → chunk-O4QJMANM.js} +1 -1
- package/dist/cli/chunks/{chunk-O4JAKWWM.js → chunk-OHVYINGM.js} +17 -17
- package/dist/cli/chunks/{chunk-APPZATXA.js → chunk-P5E26N2X.js} +2 -2
- package/dist/cli/chunks/{chunk-5ERFHEEE.js → chunk-P7UFJ6DO.js} +1 -1
- package/dist/cli/chunks/{chunk-5MNASJOH.js → chunk-PGSJBXTD.js} +2 -2
- package/dist/cli/chunks/{chunk-WCAVIJ64.js → chunk-PT2NXS43.js} +1 -1
- package/dist/cli/chunks/{chunk-EWPUQCN4.js → chunk-PTBOLBM4.js} +2 -2
- package/dist/cli/chunks/{chunk-EK5GMOSO.js → chunk-PX5OPXY6.js} +1 -1
- package/dist/cli/chunks/chunk-QCPVUNN3.js +2 -0
- package/dist/cli/chunks/{chunk-K2HBNYAZ.js → chunk-QSGEBCDB.js} +2 -2
- package/dist/cli/chunks/{chunk-G4FAPO57.js → chunk-QUJJYTJH.js} +2 -2
- package/dist/cli/chunks/{chunk-H7BLYMNU.js → chunk-QWG3SILX.js} +3 -3
- package/dist/cli/chunks/{chunk-LXQ3B4RY.js → chunk-RCOLPF3B.js} +2 -2
- package/dist/cli/chunks/{chunk-E44NNCEU.js → chunk-RYHG3I7J.js} +2 -2
- package/dist/cli/chunks/{chunk-RTFKTKSO.js → chunk-SBHM5X2S.js} +2 -2
- package/dist/cli/chunks/{chunk-DOBZPSKE.js → chunk-SDRJJUPO.js} +1 -1
- package/dist/cli/chunks/{chunk-RTY7VSZB.js → chunk-SG2TX72G.js} +2 -2
- package/dist/cli/chunks/{chunk-NTB342NJ.js → chunk-SITL5YZV.js} +4 -4
- package/dist/cli/chunks/{chunk-WM3SRRA6.js → chunk-SPC4RBLF.js} +2 -2
- package/dist/cli/chunks/{chunk-ITL3IN2E.js → chunk-SQVZ3TRU.js} +2 -2
- package/dist/cli/chunks/{chunk-CO3DX2AX.js → chunk-SUX5XB2Z.js} +2 -2
- package/dist/cli/chunks/{chunk-KSE5TDM5.js → chunk-T4EN5VVK.js} +2 -2
- package/dist/cli/chunks/{chunk-5HQP4SLM.js → chunk-TGMXUZZC.js} +2 -2
- package/dist/cli/chunks/{chunk-YOCULVHR.js → chunk-TLRHAMX5.js} +1 -1
- package/dist/cli/chunks/{chunk-GBFUANTC.js → chunk-TOWOJGEI.js} +1 -1
- package/dist/cli/chunks/{chunk-4UBVAJFO.js → chunk-TSOQ2QLT.js} +2 -2
- package/dist/cli/chunks/{chunk-SMVVAVN2.js → chunk-TVA5GRIU.js} +2 -2
- package/dist/cli/chunks/{chunk-K7V2WZNF.js → chunk-TXEUVUMO.js} +1 -1
- package/dist/cli/chunks/{chunk-LQ4NUC6Q.js → chunk-U6IXYQO4.js} +2 -2
- package/dist/cli/chunks/{chunk-HDJUYAZG.js → chunk-U7ZHDGXG.js} +1 -1
- package/dist/cli/chunks/{chunk-2VLYUF7U.js → chunk-UCSK2RMI.js} +2 -2
- package/dist/cli/chunks/{chunk-4UX35V7P.js → chunk-UIKQPO4Y.js} +2 -2
- package/dist/cli/chunks/chunk-UJNGGFGX.js +2 -0
- package/dist/cli/chunks/{chunk-AFFN6E6Q.js → chunk-ULCW6IVQ.js} +2 -2
- package/dist/cli/chunks/{chunk-WCVCOT4E.js → chunk-UREDS662.js} +2 -2
- package/dist/cli/chunks/{chunk-E6PF35JZ.js → chunk-URSTP3WI.js} +2 -2
- package/dist/cli/chunks/{chunk-I36CRDHF.js → chunk-UUZZXHUF.js} +2 -2
- package/dist/cli/chunks/{chunk-MIK4RBEH.js → chunk-UZED4YZ5.js} +1 -1
- package/dist/cli/chunks/{chunk-ZQHDA4O7.js → chunk-VF7FTD64.js} +1 -1
- package/dist/cli/chunks/{chunk-AMZKAJLJ.js → chunk-VUR5THML.js} +2 -2
- package/dist/cli/chunks/{chunk-H43AFUKL.js → chunk-VXVTFKRA.js} +2 -2
- package/dist/cli/chunks/chunk-VZBC6DP7.js +2 -0
- package/dist/cli/chunks/{chunk-DDEOZPWJ.js → chunk-W4II6SIH.js} +2 -2
- package/dist/cli/chunks/{chunk-55CH76ZO.js → chunk-W5HQIYQU.js} +3 -3
- package/dist/cli/chunks/{chunk-YPX2TV3M.js → chunk-W7H55PY4.js} +1 -1
- package/dist/cli/chunks/{chunk-CFWGGRE7.js → chunk-WDEXOLK2.js} +1 -1
- package/dist/cli/chunks/{chunk-XGBU3KEM.js → chunk-WGTEZT7G.js} +2 -2
- package/dist/cli/chunks/{chunk-NC6K7SCQ.js → chunk-WLRU6ESI.js} +2 -2
- package/dist/cli/chunks/{chunk-JFLU7L3W.js → chunk-WTAUF6O4.js} +2 -2
- package/dist/cli/chunks/chunk-XCNSGSKV.js +3 -0
- package/dist/cli/chunks/{chunk-57LNKSW7.js → chunk-XZOYKB22.js} +2 -2
- package/dist/cli/chunks/chunk-YIDAXOUX.js +8 -0
- package/dist/cli/chunks/{chunk-25P77WA5.js → chunk-YLKIXEPP.js} +1 -1
- package/dist/cli/chunks/{chunk-R5GRABPQ.js → chunk-YNVEDFPQ.js} +1 -1
- package/dist/cli/chunks/{chunk-NQZNMCZU.js → chunk-YUA6ZKKY.js} +2 -2
- package/dist/cli/chunks/{chunk-OYJC3YON.js → chunk-YVJEUX3I.js} +2 -2
- package/dist/cli/chunks/{chunk-QDESWOZP.js → chunk-YWWMNTBF.js} +2 -2
- package/dist/cli/chunks/{chunk-7HEMJHPP.js → chunk-ZGROHCOW.js} +1 -1
- package/dist/cli/chunks/{chunk-AP3ADWDK.js → chunk-ZPVGX4DI.js} +2 -2
- package/dist/cli/chunks/{chunk-M5XYIQYZ.js → chunk-ZROAMFX2.js} +2 -2
- package/dist/cli/chunks/{chunk-I4K2HTQU.js → chunk-ZYOYR3UR.js} +1 -1
- package/dist/cli/chunks/ci-BZNWW3I3.js +81 -0
- package/dist/cli/chunks/{ci-config-J665XNOX.js → ci-config-LOHNXOKV.js} +2 -2
- package/dist/cli/chunks/{ci-output-PEQQQWVD.js → ci-output-LCOQBSJL.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-HHB2JSKH.js → circuit-breaker-7LRXTLFE.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-JKUJRWPN.js → claude-flow-setup-HBU4VWC3.js} +2 -2
- package/dist/cli/chunks/client-4PNYDFYS.js +2 -0
- package/dist/cli/chunks/{cline-installer-Y77BWTAN.js → cline-installer-CO6MLH6X.js} +2 -2
- package/dist/cli/chunks/{code-LV2HAGJY.js → code-SIXBS6JM.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-4GKKSETB.js → code-index-extractor-GWJKZ2IQ.js} +2 -2
- package/dist/cli/chunks/{codex-installer-WMKBYE5Y.js → codex-installer-6NINVWXJ.js} +2 -2
- package/dist/cli/chunks/{completions-SBGFAOIJ.js → completions-7VIX3GML.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-AQHFIJXC.js → complexity-analyzer-FBQR6ZP2.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-26AYFS2E.js → continuedev-installer-VA7RIXW5.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-4UD3DK55.js → copilot-installer-4QEBC4MU.js} +2 -2
- package/dist/cli/chunks/core-handlers-ODO6LUWQ.js +2 -0
- package/dist/cli/chunks/{cost-tracker-TP4NZCG4.js → cost-tracker-GRYKHPWL.js} +2 -2
- package/dist/cli/chunks/{coverage-B2KIXHAI.js → coverage-USPMNKOU.js} +11 -10
- package/dist/cli/chunks/cross-domain-router-DT4MHJKK.js +2 -0
- package/dist/cli/chunks/{cursor-installer-AVZEQZ4W.js → cursor-installer-ZXIPSZVH.js} +2 -2
- package/dist/cli/chunks/{daemon-XM2A7LQU.js → daemon-D7F3RGI5.js} +3 -3
- package/dist/cli/chunks/{daemon-P574WWBW.js → daemon-N2VRHPSJ.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-MIWOZ6ET.js → dag-attention-scheduler-NL6BA7BY.js} +2 -2
- package/dist/cli/chunks/{detect-TYR7HT23.js → detect-XC2HCIIT.js} +2 -2
- package/dist/cli/chunks/{dist-node-2DGVQGLS.js → dist-node-A3Y26MEI.js} +2 -2
- package/dist/cli/chunks/{domain-handler-RRA4ZOMF.js → domain-handler-WV6SFXRB.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-IVZEZ5RB.js → domain-plugins-KJIF6Z2B.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-DOBI67K6.js → domain-transfer-L3F6AES2.js} +2 -2
- package/dist/cli/chunks/dream-QOB3JCOM.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-VNIEOVPO.js → embed-and-insert-pattern-PA3Y4KGO.js} +2 -2
- package/dist/cli/chunks/{eval-QV4LVPUF.js → eval-YGEZNUVE.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-DAPKT763.js → experience-capture-middleware-D4T7NW6B.js} +3 -3
- package/dist/cli/chunks/{fast-paths-WVRFPHX7.js → fast-paths-6JYK7RYQ.js} +2 -2
- package/dist/cli/chunks/{feature-flags-O7ZXDDCD.js → feature-flags-DKXMDVPE.js} +2 -2
- package/dist/cli/chunks/{feature-flags-DEFTUIYT.js → feature-flags-RBH2GDSR.js} +2 -2
- package/dist/cli/chunks/file-discovery-BN76S2PR.js +2 -0
- package/dist/cli/chunks/fleet-43YMXACN.js +46 -0
- package/dist/cli/chunks/{gnn-wrapper-LS4LZJDR.js → gnn-wrapper-MV54UC4C.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-RFTERD4K.js → heartbeat-handler-7DKMVQQH.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-3NNP4WCP.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-MZR7Y4WF.js +2 -0
- package/dist/cli/chunks/hnsw-index-HE4AX22U.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-GPKGFFHY.js → hnsw-legacy-bridge-6IWREDQC.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-PHL3F2PR.js → hnswlib-node-5BIESSCK.js} +2 -2
- package/dist/cli/chunks/{hooks-GYJ6D4QM.js → hooks-3EETRM62.js} +28 -28
- package/dist/cli/chunks/hybrid-backend-IHUHB3Y2.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-YGEQPCKJ.js → hypergraph-engine-RSWCB2D3.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-ZIMM647V.js → hypergraph-handler-552LXKL3.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-FI6GI6PD.js +2 -0
- package/dist/cli/chunks/{init-guard-VOMBXJXG.js → init-guard-OTDBJ5HD.js} +2 -2
- package/dist/cli/chunks/{init-handler-PSMUBWK5.js → init-handler-3FK3TKEA.js} +6 -6
- package/dist/cli/chunks/init-wizard-WLQKH5Y5.js +2 -0
- package/dist/cli/chunks/kernel-2WZOQEZS.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-2YNTFBWJ.js → kilocode-installer-KZ2O4LF3.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-XHJDPVAZ.js → kiro-installer-MLCCXRF7.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-G3LVKK6P.js +2 -0
- package/dist/cli/chunks/{learning-GNSIDRNG.js → learning-QUCMBD77.js} +3 -3
- package/dist/cli/chunks/{llm-router-LQDM7IU2.js → llm-router-PDEV3UP2.js} +4 -4
- package/dist/cli/chunks/llm-router-service-MM75HKWJ.js +2 -0
- package/dist/cli/chunks/{load-YATHI72E.js → load-XFVVLO7E.js} +2 -2
- package/dist/cli/chunks/load-test-BEWEE44J.js +2 -0
- package/dist/cli/chunks/{mcp-4Y6GDLYK.js → mcp-74G3CL2S.js} +2 -2
- package/dist/cli/chunks/{memory-OUW3L7H2.js → memory-XIFM6JNX.js} +5 -5
- package/dist/cli/chunks/memory-backend-NYKBBKZR.js +2 -0
- package/dist/cli/chunks/{memory-handlers-G3LFF53U.js → memory-handlers-ZCKURV6S.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-UBZJXAD2.js → multi-model-executor-7L4W3O2Q.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-AMMNWVH5.js → opencode-installer-BPG422LF.js} +2 -2
- package/dist/cli/chunks/{orchestrator-Y44WDOER.js → orchestrator-OEAFLAEV.js} +58 -20
- package/dist/cli/chunks/pattern-null-store-QGPUIV6M.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-ESR42RME.js → pattern-usage-recorder-LOPNCULT.js} +2 -2
- package/dist/cli/chunks/{pipeline-EDTS6OSC.js → pipeline-VWTYUZB7.js} +2 -2
- package/dist/cli/chunks/{platform-5WONJSUX.js → platform-WFJJ3X2E.js} +2 -2
- package/dist/cli/chunks/{plugin-IJXPCLD4.js → plugin-744TPUSG.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-5ECKGZK6.js → prime-radiant-advanced-wasm-BD5BLNDR.js} +2 -2
- package/dist/cli/chunks/project-root-C7ELXZRK.js +2 -0
- package/dist/cli/chunks/protocol-executor-SUVE33BM.js +2 -0
- package/dist/cli/chunks/{protocol-handler-DRD3GVNW.js → protocol-handler-JIBILI74.js} +2 -2
- package/dist/cli/chunks/{prove-KTGW2HMJ.js → prove-MNOL5FYW.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-YWZMMGJB.js +2 -0
- package/dist/cli/chunks/{quality-DV2WPRRS.js → quality-JEGBDGGX.js} +2 -2
- package/dist/cli/chunks/{quality-gate-HFUAFVZC.js → quality-gate-SYJ6ROMI.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-ZFAKXRN7.js +2 -0
- package/dist/cli/chunks/real-embeddings-ZWXS5ZFV.js +2 -0
- package/dist/cli/chunks/{ref-validation-QWSKS5OY.js → ref-validation-RRHUFW2N.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-RBAYRCHX.js → roocode-installer-XFO6JSVN.js} +2 -2
- package/dist/cli/chunks/router-4FTAVYLJ.js +2 -0
- package/dist/cli/chunks/routing-feedback-IO2KOWMJ.js +2 -0
- package/dist/cli/chunks/{routing-handler-FMPP3XKO.js → routing-handler-L2K3JASE.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-KZZT4HWF.js → ruvector-commands-A6CINHGM.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-KCIRNE7C.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-MFC5WTJU.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-7CHEV35N.js → rvf-migration-coordinator-T4RY7L53.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-I3KWHE7X.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-Q2TH52SN.js → rvf-store-integrity-IR33TGQS.js} +2 -2
- package/dist/cli/chunks/safe-db-QXDZ6QY3.js +2 -0
- package/dist/cli/chunks/schedule-CZKD6RIY.js +2 -0
- package/dist/cli/chunks/scheduler-BLA3Q4CH.js +2 -0
- package/dist/cli/chunks/{security-CUEA3UIM.js → security-Z5GDE2IH.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-DROMBRV2.js → shared-rvf-adapter-SIZMEHPM.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-DBNABOP7.js → shared-rvf-dual-writer-HLM65RDS.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-XIUYDJC4.js +2 -0
- package/dist/cli/chunks/{standalone-memory-IAHA3M6B.js → standalone-memory-SKSZG7P5.js} +2 -2
- package/dist/cli/chunks/{status-handler-AFUCASTX.js → status-handler-766YOOMJ.js} +2 -2
- package/dist/cli/chunks/{structural-health-AQRV6JJ6.js → structural-health-M45FNOLT.js} +2 -2
- package/dist/cli/chunks/{sync-GX7FMJHL.js → sync-6CJ24B5T.js} +2 -2
- package/dist/cli/chunks/{sync-XW5TLZ7M.js → sync-B2U366I3.js} +2 -2
- package/dist/cli/chunks/{task-handler-TFKVUTNF.js → task-handler-P6IFLCKP.js} +17 -15
- package/dist/cli/chunks/task-handlers-DPWMUKFC.js +9 -0
- package/dist/cli/chunks/{test-D2XDJNDX.js → test-TODH7KRF.js} +4 -4
- package/dist/cli/chunks/test-runner-process-46IPK3GH.js +2 -0
- package/dist/cli/chunks/{test-scheduling-TS6I2PR7.js → test-scheduling-VMVMVRHT.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-HBBLPCZ3.js → token-bootstrap-XQW7BMCK.js} +2 -2
- package/dist/cli/chunks/{token-usage-3MBUX4PR.js → token-usage-JCZEIRKO.js} +2 -2
- package/dist/cli/chunks/{transformers-ZWMQO3L2.js → transformers-U2ML3OHE.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-MOI2WWNJ.js +2 -0
- package/dist/cli/chunks/{types-5YEMGPSQ.js → types-GGEPCHP6.js} +2 -2
- package/dist/cli/chunks/unified-memory-FL26RTV3.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-E2BPTH3U.js +2 -0
- package/dist/cli/chunks/unified-persistence-5ZOUPKHF.js +2 -0
- package/dist/cli/chunks/{upgrade-2TPBKIHI.js → upgrade-T5GRM7HS.js} +2 -2
- package/dist/cli/chunks/{validate-XRAXXFW6.js → validate-XMUJPLP3.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-IYSCS3BZ.js → validate-swarm-KJLF7JEH.js} +2 -2
- package/dist/cli/chunks/visual-security-IJVPO5FA.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-PZQ3ZG2P.js → web-tree-sitter-LOHVZ7G5.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-U6XWFRVT.js → windsurf-installer-33FBTXJU.js} +2 -2
- package/dist/cli/chunks/witness-chain-5FAFCQKP.js +2 -0
- package/dist/cli/chunks/witness-chain-V2M32W5D.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-K7YX2AO6.js → witness-chain-repair-VWBO4NXE.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-GUTC3W7N.js → witness-chain-verifier-BHJ3ZAEK.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-YBNKMOP6.js → witness-key-manager-WNVPH2Z3.js} +2 -2
- package/dist/cli/chunks/{workflow-UAJUILFQ.js → workflow-6QR5MQTO.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-3JLF3IX7.js +2 -0
- package/dist/cli/chunks/{wrappers-AVZ3GPAL.js → wrappers-EHOL62TS.js} +2 -2
- package/dist/cli/commands/ci.js +7 -0
- package/dist/cli/commands/coverage.js +7 -1
- package/dist/cli/commands/fleet.js +2 -2
- package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +4 -3
- package/dist/cli/commands/hooks-handlers/stats-hooks.js +22 -4
- package/dist/cli/handlers/task-handler.js +6 -0
- package/dist/cli/utils/coverage-verdict.d.ts +11 -2
- package/dist/cli/utils/coverage-verdict.js +26 -6
- package/dist/cli/utils/fleet-operation.d.ts +5 -0
- package/dist/cli/utils/fleet-operation.js +7 -1
- package/dist/cli/utils/fleet-result.d.ts +5 -3
- package/dist/cli/utils/fleet-result.js +9 -3
- package/dist/coordination/handlers/coverage-collection.d.ts +2 -0
- package/dist/coordination/handlers/coverage-collection.js +2 -1
- package/dist/coordination/handlers/coverage-evidence.d.ts +75 -0
- package/dist/coordination/handlers/coverage-evidence.js +159 -0
- package/dist/coordination/handlers/coverage-handlers.js +16 -3
- package/dist/coordination/handlers/coverage-scope.d.ts +40 -0
- package/dist/coordination/handlers/coverage-scope.js +321 -0
- package/dist/coordination/handlers/coverage-target.d.ts +9 -0
- package/dist/coordination/handlers/coverage-target.js +15 -5
- package/dist/coordination/handlers/handler-utils.d.ts +5 -0
- package/dist/coordination/handlers/handler-utils.js +8 -4
- package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +4 -1
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +8 -0
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +10 -7
- package/dist/init/phases/10-workers.js +42 -4
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +23 -1
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +50 -15
- package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +7 -2
- package/dist/integrations/agentic-flow/reasoning-bank/index.js +8 -0
- package/dist/learning/embedder-endpoint-client.d.ts +8 -0
- package/dist/learning/embedder-endpoint-client.js +20 -0
- package/dist/learning/embedder-recovery.d.ts +63 -0
- package/dist/learning/embedder-recovery.js +94 -0
- package/dist/learning/qe-reasoning-bank-types.d.ts +5 -0
- package/dist/learning/qe-reasoning-bank.d.ts +21 -0
- package/dist/learning/qe-reasoning-bank.js +54 -8
- package/dist/learning/real-embeddings.d.ts +23 -0
- package/dist/learning/real-embeddings.js +69 -2
- package/dist/learning/real-qe-reasoning-bank.d.ts +24 -4
- package/dist/learning/real-qe-reasoning-bank.js +58 -20
- package/dist/logging/redaction.js +142 -12
- package/dist/mcp/bundle.js +504 -492
- package/dist/mcp/daemon-mode.d.ts +126 -0
- package/dist/mcp/daemon-mode.js +257 -0
- package/dist/mcp/entry.d.ts +4 -0
- package/dist/mcp/entry.js +50 -2
- package/dist/mcp/handlers/domain-handler-configs.js +5 -0
- package/dist/mcp/handlers/orchestrate-routes.d.ts +6 -1
- package/dist/mcp/handlers/orchestrate-routes.js +53 -0
- package/dist/mcp/handlers/task-handlers.d.ts +11 -2
- package/dist/mcp/handlers/task-handlers.js +50 -5
- package/dist/mcp/protocol-server.js +3 -0
- package/dist/mcp/services/reasoning-bank-service.d.ts +6 -1
- package/dist/mcp/services/reasoning-bank-service.js +9 -0
- package/dist/mcp/types.d.ts +14 -0
- package/dist/routing/advisor/redaction.js +22 -2
- package/dist/shared/llm/providers/response-deadline.js +16 -2
- package/dist/shared/types/index.js +3 -1
- package/dist/strange-loop/infra-healing/infra-aware-agent-provider.js +8 -1
- package/package.json +3 -3
- package/dist/cli/chunks/adapter-V4GSGOOK.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-6WQTM5YR.js +0 -2
- package/dist/cli/chunks/base-AK7BXBX2.js +0 -2
- package/dist/cli/chunks/browser-workflow-VTDFBW7T.js +0 -2
- package/dist/cli/chunks/chunk-2DTX7YAZ.js +0 -6
- package/dist/cli/chunks/chunk-72ZBJD2E.js +0 -3
- package/dist/cli/chunks/chunk-EBPJY4DI.js +0 -3
- package/dist/cli/chunks/chunk-HJ3XNTTJ.js +0 -2
- package/dist/cli/chunks/chunk-IO5537OM.js +0 -2
- package/dist/cli/chunks/chunk-IW6WDGHM.js +0 -2
- package/dist/cli/chunks/chunk-LRL56ZYL.js +0 -21
- package/dist/cli/chunks/chunk-VLD7Z2ED.js +0 -13
- package/dist/cli/chunks/chunk-VO3DRK4P.js +0 -3
- package/dist/cli/chunks/ci-6GUFAZMJ.js +0 -81
- package/dist/cli/chunks/client-HL2COSFM.js +0 -2
- package/dist/cli/chunks/core-handlers-IX7ATLM6.js +0 -2
- package/dist/cli/chunks/cross-domain-router-YYKLAPJO.js +0 -2
- package/dist/cli/chunks/dream-T6EP7B3F.js +0 -2
- package/dist/cli/chunks/file-discovery-JYMVTDMU.js +0 -2
- package/dist/cli/chunks/fleet-FVAUMKUT.js +0 -46
- package/dist/cli/chunks/heartbeat-scheduler-4N5MUJ7S.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-ZPAJDSLR.js +0 -2
- package/dist/cli/chunks/hnsw-index-4CTH6RHB.js +0 -2
- package/dist/cli/chunks/hybrid-backend-AW6UTXQS.js +0 -2
- package/dist/cli/chunks/impact-analyzer-MZK3JMSV.js +0 -2
- package/dist/cli/chunks/init-wizard-FUC7KDVX.js +0 -2
- package/dist/cli/chunks/kernel-ZCPMCVMW.js +0 -2
- package/dist/cli/chunks/knowledge-graph-NUJKEDNF.js +0 -2
- package/dist/cli/chunks/llm-router-service-B2BFBQ76.js +0 -2
- package/dist/cli/chunks/load-test-ZHQ2MUGO.js +0 -2
- package/dist/cli/chunks/memory-backend-AAMQG6WH.js +0 -2
- package/dist/cli/chunks/pattern-null-store-RFNVA46O.js +0 -2
- package/dist/cli/chunks/project-root-7QL4KP5C.js +0 -2
- package/dist/cli/chunks/protocol-executor-2NW5BD4R.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-G2JZOGKD.js +0 -2
- package/dist/cli/chunks/queen-coordinator-GRG5FT2A.js +0 -2
- package/dist/cli/chunks/real-embeddings-RQRVOKVM.js +0 -2
- package/dist/cli/chunks/router-LQB5SWAF.js +0 -2
- package/dist/cli/chunks/routing-feedback-OEEXA55N.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-BZK4M7BO.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-EZZUJL2E.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-6COXTQZ3.js +0 -2
- package/dist/cli/chunks/safe-db-PE6G3L55.js +0 -2
- package/dist/cli/chunks/schedule-OLKQ6QYW.js +0 -2
- package/dist/cli/chunks/scheduler-LSGBDFAT.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-HH4DNTYH.js +0 -2
- package/dist/cli/chunks/task-handlers-SS4ZDXNF.js +0 -9
- package/dist/cli/chunks/test-runner-process-PSSBNNGR.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-TYRQRJ2W.js +0 -2
- package/dist/cli/chunks/unified-memory-AGDZQ5XD.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-X5TJ3JDE.js +0 -2
- package/dist/cli/chunks/unified-persistence-UCV7YETW.js +0 -2
- package/dist/cli/chunks/visual-security-ZLXRIQZV.js +0 -2
- package/dist/cli/chunks/witness-chain-CVIWYTD2.js +0 -2
- package/dist/cli/chunks/witness-chain-VBKORKOX.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-3ZN7MVCE.js +0 -2
|
@@ -23,6 +23,7 @@ import { createPatternStore, } from './pattern-store.js';
|
|
|
23
23
|
import { createSQLitePatternStore, } from './sqlite-persistence.js';
|
|
24
24
|
import { getWitnessChain } from '../audit/witness-chain.js';
|
|
25
25
|
import { getActiveEmbeddingSpaceIdentity } from './real-embeddings.js';
|
|
26
|
+
import { EmbedderRecovery } from './embedder-recovery.js';
|
|
26
27
|
import { reconcileRvfWithSqlite } from './rvf-reconcile.js';
|
|
27
28
|
import { PatternMutationError } from './pattern-mutation-error.js';
|
|
28
29
|
// Import extracted modules
|
|
@@ -67,6 +68,11 @@ export class QEReasoningBank {
|
|
|
67
68
|
coherenceService;
|
|
68
69
|
config;
|
|
69
70
|
embeddingProvenance = new WeakMap();
|
|
71
|
+
/**
|
|
72
|
+
* #1187/#1204: whether the embedder works. While it does not, patterns are
|
|
73
|
+
* stored text-only and searched by text; it is retried in the background.
|
|
74
|
+
*/
|
|
75
|
+
embedderRecovery;
|
|
70
76
|
patternStore;
|
|
71
77
|
initialized = false;
|
|
72
78
|
sqliteStore = null;
|
|
@@ -106,6 +112,11 @@ export class QEReasoningBank {
|
|
|
106
112
|
this.eventBus = eventBus;
|
|
107
113
|
this.coherenceService = coherenceService;
|
|
108
114
|
this.config = { ...DEFAULT_QE_REASONING_BANK_CONFIG, ...config };
|
|
115
|
+
this.embedderRecovery = new EmbedderRecovery({
|
|
116
|
+
retryIntervalMs: this.config.embedderRetryIntervalMs,
|
|
117
|
+
onRecovered: () => logger.info('Embedder available again: patterns are stored and searched with vectors'),
|
|
118
|
+
onRetryFailed: (error) => logger.debug('Embedder still unavailable', { error: toErrorMessage(error) }),
|
|
119
|
+
});
|
|
109
120
|
if (config.rvfDualWriter) {
|
|
110
121
|
this.rvfDualWriter = config.rvfDualWriter;
|
|
111
122
|
}
|
|
@@ -318,14 +329,14 @@ export class QEReasoningBank {
|
|
|
318
329
|
}
|
|
319
330
|
// Generate embedding if not provided
|
|
320
331
|
if (!options.embedding) {
|
|
321
|
-
const embedding = await this.
|
|
332
|
+
const embedding = await this.embedForPatterns(`${options.name} ${options.description} ${options.context?.tags?.join(' ') || ''}`);
|
|
322
333
|
// #981: with no embedding runtime, embed() returns a hash-fallback vector
|
|
323
334
|
// that has no embedding-space provenance, and the pattern store refuses
|
|
324
335
|
// to persist it (VECTOR_SPACE_UNVERIFIED), losing the pattern. Store it
|
|
325
336
|
// text-only instead, as search already does for such vectors; the vector
|
|
326
337
|
// is filled later by `aqe learning backfill-embeddings`.
|
|
327
|
-
const hasProvenance = this.embeddingProvenance.has(embedding)
|
|
328
|
-
|| Boolean(getActiveEmbeddingSpaceIdentity()?.spaceId);
|
|
338
|
+
const hasProvenance = embedding !== null && (this.embeddingProvenance.has(embedding)
|
|
339
|
+
|| Boolean(getActiveEmbeddingSpaceIdentity()?.spaceId));
|
|
329
340
|
if (hasProvenance) {
|
|
330
341
|
options = { ...options, embedding };
|
|
331
342
|
}
|
|
@@ -389,10 +400,10 @@ export class QEReasoningBank {
|
|
|
389
400
|
searchQuery = '';
|
|
390
401
|
}
|
|
391
402
|
else {
|
|
392
|
-
const embedding = await this.
|
|
403
|
+
const embedding = await this.embedForPatterns(query);
|
|
393
404
|
// Hash fallback and resized vectors do not belong to the active provider.
|
|
394
405
|
// Keep their text searchable without claiming semantic comparability.
|
|
395
|
-
searchQuery = this.embeddingProvenance.has(embedding) ? embedding : query;
|
|
406
|
+
searchQuery = embedding && this.embeddingProvenance.has(embedding) ? embedding : query;
|
|
396
407
|
useVectorSearch = Array.isArray(searchQuery);
|
|
397
408
|
}
|
|
398
409
|
}
|
|
@@ -501,9 +512,9 @@ export class QEReasoningBank {
|
|
|
501
512
|
detectedDomains.push('test-generation'); // Default
|
|
502
513
|
}
|
|
503
514
|
// 2. Search for similar patterns
|
|
504
|
-
const embedding = await this.
|
|
505
|
-
const embeddingSpaceId = this.embeddingProvenance.get(embedding);
|
|
506
|
-
const patternResults = await this.patternStore.search(embeddingSpaceId ? embedding : request.task, {
|
|
515
|
+
const embedding = await this.embedForPatterns(request.task);
|
|
516
|
+
const embeddingSpaceId = embedding ? this.embeddingProvenance.get(embedding) : undefined;
|
|
517
|
+
const patternResults = await this.patternStore.search(embedding && embeddingSpaceId ? embedding : request.task, {
|
|
507
518
|
limit: this.config.maxRoutingCandidates,
|
|
508
519
|
domain: detectedDomains[0],
|
|
509
520
|
useVectorSearch: Boolean(embeddingSpaceId),
|
|
@@ -695,6 +706,41 @@ export class QEReasoningBank {
|
|
|
695
706
|
// Hash-based fallback (always works, including ARM64)
|
|
696
707
|
return hashEmbedding(text, this.config.embeddingDimension);
|
|
697
708
|
}
|
|
709
|
+
/**
|
|
710
|
+
* #1187: embed for pattern store, search and routing, or null when the
|
|
711
|
+
* embedder endpoint fails at runtime. Callers then store the pattern
|
|
712
|
+
* text-only and search by text, as they do without an embedding runtime.
|
|
713
|
+
* ADR-097 still holds: no hash vector stands in for an endpoint vector.
|
|
714
|
+
* #1204: after a failure the embedder is not called again until a
|
|
715
|
+
* background retry, due `embedderRetryIntervalMs` later, finds it working.
|
|
716
|
+
*/
|
|
717
|
+
async embedForPatterns(text) {
|
|
718
|
+
if (!this.embedderRecovery.isAvailable())
|
|
719
|
+
return null;
|
|
720
|
+
try {
|
|
721
|
+
return await this.embed(text);
|
|
722
|
+
}
|
|
723
|
+
catch (error) {
|
|
724
|
+
const reason = toErrorMessage(error);
|
|
725
|
+
const message = 'Embedder failed: storing and searching patterns by text only';
|
|
726
|
+
if (this.embedderRecovery.markUnavailable(reason)) {
|
|
727
|
+
logger.warn(message, { error: reason });
|
|
728
|
+
}
|
|
729
|
+
else {
|
|
730
|
+
logger.debug(message, { error: reason });
|
|
731
|
+
}
|
|
732
|
+
return null;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
/**
|
|
736
|
+
* #1204: why the embedder failed, while patterns are stored and searched
|
|
737
|
+
* by text only because of that failure; null while it works or was never
|
|
738
|
+
* needed. A missing embedding runtime with no endpoint configured is not a
|
|
739
|
+
* failure: there embed() returns a hash vector, which is stored text-only.
|
|
740
|
+
*/
|
|
741
|
+
getEmbedderFailure() {
|
|
742
|
+
return this.embedderRecovery.unavailableReason;
|
|
743
|
+
}
|
|
698
744
|
/**
|
|
699
745
|
* Get statistics
|
|
700
746
|
*/
|
|
@@ -75,6 +75,29 @@ export declare function getEmbeddingDimension(): number;
|
|
|
75
75
|
* Reset initialization state (for testing)
|
|
76
76
|
*/
|
|
77
77
|
export declare function resetInitialization(): void;
|
|
78
|
+
/**
|
|
79
|
+
* #1187: allow a new initialization attempt after a failed one. A failed
|
|
80
|
+
* initialization is otherwise remembered for the whole process, so a short
|
|
81
|
+
* embedding-endpoint outage at startup would disable embeddings until the
|
|
82
|
+
* process restarts. Callers rate-limit retries. No-op unless the last
|
|
83
|
+
* initialization failed.
|
|
84
|
+
*/
|
|
85
|
+
export declare function allowEmbedderInitRetry(): void;
|
|
86
|
+
/**
|
|
87
|
+
* #1204: check whether a failed embedder works again, for callers that retry
|
|
88
|
+
* it after a cooldown. Resolves when the embedder is usable; throws otherwise.
|
|
89
|
+
* Other callers keep failing fast while the check runs, so a host that never
|
|
90
|
+
* answers stalls only the (background) check, never them:
|
|
91
|
+
* - after a failed initialization, initialize again while the failure stays
|
|
92
|
+
* recorded; concurrent rechecks share that attempt;
|
|
93
|
+
* - after runtime failures that opened the endpoint circuit breaker, probe the
|
|
94
|
+
* endpoint as the breaker's single trial request, so recovery does not wait
|
|
95
|
+
* for the breaker window as well as the caller's retry interval. The probe
|
|
96
|
+
* must find the identity this process bound to (ADR-097): a changed
|
|
97
|
+
* fingerprint means vectors would not be comparable.
|
|
98
|
+
* Callers rate-limit rechecks, then embed a canary to confirm.
|
|
99
|
+
*/
|
|
100
|
+
export declare function recheckEmbedder(config?: Partial<EmbeddingConfig>): Promise<void>;
|
|
78
101
|
/**
|
|
79
102
|
* ADR-097: Returns true when the embedding pipeline is the external endpoint path,
|
|
80
103
|
* false when it's the in-process transformer (or uninitialized).
|
|
@@ -17,6 +17,8 @@ let embeddingModel = null;
|
|
|
17
17
|
let initPromise = null;
|
|
18
18
|
let initializationFailed = false;
|
|
19
19
|
let failureReason = '';
|
|
20
|
+
/** #1204: an in-flight recheckEmbedder() re-initialization, shared by callers. */
|
|
21
|
+
let initRetryPromise = null;
|
|
20
22
|
/**
|
|
21
23
|
* Set when ADR-097 endpoint path is active. Tracked separately so callers
|
|
22
24
|
* (tests, observability) can verify endpoint vs in-process unambiguously.
|
|
@@ -78,8 +80,10 @@ function isNonSemanticText(text) {
|
|
|
78
80
|
/**
|
|
79
81
|
* Initialize the transformer model
|
|
80
82
|
*/
|
|
81
|
-
async function initializeModel(config = {}) {
|
|
82
|
-
|
|
83
|
+
async function initializeModel(config = {}, retryingAfterFailure = false) {
|
|
84
|
+
// #1204: a recheckEmbedder() retry runs while the failure is still recorded,
|
|
85
|
+
// so other callers keep failing fast instead of waiting on a dead host.
|
|
86
|
+
if (initializationFailed && !retryingAfterFailure) {
|
|
83
87
|
throw new Error(`Transformer initialization previously failed: ${failureReason}`);
|
|
84
88
|
}
|
|
85
89
|
if (initPromise) {
|
|
@@ -134,6 +138,8 @@ async function initializeModel(config = {}) {
|
|
|
134
138
|
console.warn(`[RealEmbeddings] Could not persist endpoint identity: ${toErrorMessage(persistErr)}`);
|
|
135
139
|
}
|
|
136
140
|
embeddingModel = createEndpointPipeline(endpointClient);
|
|
141
|
+
initializationFailed = false;
|
|
142
|
+
failureReason = '';
|
|
137
143
|
return;
|
|
138
144
|
}
|
|
139
145
|
// In-process branch — only here do we import the transformers package.
|
|
@@ -179,6 +185,8 @@ async function initializeModel(config = {}) {
|
|
|
179
185
|
implementation: `transformers:${fullConfig.quantized ? 'quantized' : 'full'}`,
|
|
180
186
|
runtimeFingerprint: fingerprintEmbeddingRuntime(canaryVector),
|
|
181
187
|
});
|
|
188
|
+
initializationFailed = false;
|
|
189
|
+
failureReason = '';
|
|
182
190
|
const loadTime = performance.now() - startTime;
|
|
183
191
|
console.log(`[RealEmbeddings] Model loaded in ${loadTime.toFixed(0)}ms`);
|
|
184
192
|
}
|
|
@@ -393,6 +401,65 @@ export function resetInitialization() {
|
|
|
393
401
|
// AQE_MEMORY_PATH between runs don't write into a stale handle.
|
|
394
402
|
resetEmbedderIdentityStore();
|
|
395
403
|
}
|
|
404
|
+
/**
|
|
405
|
+
* #1187: allow a new initialization attempt after a failed one. A failed
|
|
406
|
+
* initialization is otherwise remembered for the whole process, so a short
|
|
407
|
+
* embedding-endpoint outage at startup would disable embeddings until the
|
|
408
|
+
* process restarts. Callers rate-limit retries. No-op unless the last
|
|
409
|
+
* initialization failed.
|
|
410
|
+
*/
|
|
411
|
+
export function allowEmbedderInitRetry() {
|
|
412
|
+
if (!initializationFailed)
|
|
413
|
+
return;
|
|
414
|
+
initializationFailed = false;
|
|
415
|
+
failureReason = '';
|
|
416
|
+
initPromise = null;
|
|
417
|
+
if (endpointClient) {
|
|
418
|
+
endpointClient.close();
|
|
419
|
+
}
|
|
420
|
+
endpointClient = null;
|
|
421
|
+
endpointIdentity = null;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* #1204: check whether a failed embedder works again, for callers that retry
|
|
425
|
+
* it after a cooldown. Resolves when the embedder is usable; throws otherwise.
|
|
426
|
+
* Other callers keep failing fast while the check runs, so a host that never
|
|
427
|
+
* answers stalls only the (background) check, never them:
|
|
428
|
+
* - after a failed initialization, initialize again while the failure stays
|
|
429
|
+
* recorded; concurrent rechecks share that attempt;
|
|
430
|
+
* - after runtime failures that opened the endpoint circuit breaker, probe the
|
|
431
|
+
* endpoint as the breaker's single trial request, so recovery does not wait
|
|
432
|
+
* for the breaker window as well as the caller's retry interval. The probe
|
|
433
|
+
* must find the identity this process bound to (ADR-097): a changed
|
|
434
|
+
* fingerprint means vectors would not be comparable.
|
|
435
|
+
* Callers rate-limit rechecks, then embed a canary to confirm.
|
|
436
|
+
*/
|
|
437
|
+
export async function recheckEmbedder(config = {}) {
|
|
438
|
+
if (initializationFailed) {
|
|
439
|
+
initRetryPromise ??= retryInitialization(config).finally(() => {
|
|
440
|
+
initRetryPromise = null;
|
|
441
|
+
});
|
|
442
|
+
return initRetryPromise;
|
|
443
|
+
}
|
|
444
|
+
const client = endpointClient;
|
|
445
|
+
if (!client || !client.getBreakerState().open)
|
|
446
|
+
return;
|
|
447
|
+
const identity = await client.probeThroughOpenBreaker();
|
|
448
|
+
if (endpointIdentity && identity.fingerprint !== endpointIdentity.fingerprint) {
|
|
449
|
+
throw new Error(`[RealEmbeddings] endpoint identity changed since this process bound to it ` +
|
|
450
|
+
`(fingerprint ${endpointIdentity.fingerprint} -> ${identity.fingerprint}); ` +
|
|
451
|
+
`restart to use the new embedding space`);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
async function retryInitialization(config) {
|
|
455
|
+
if (endpointClient) {
|
|
456
|
+
endpointClient.close();
|
|
457
|
+
}
|
|
458
|
+
endpointClient = null;
|
|
459
|
+
endpointIdentity = null;
|
|
460
|
+
initPromise = null;
|
|
461
|
+
await initializeModel(config, true);
|
|
462
|
+
}
|
|
396
463
|
/**
|
|
397
464
|
* ADR-097: Returns true when the embedding pipeline is the external endpoint path,
|
|
398
465
|
* false when it's the in-process transformer (or uninitialized).
|
|
@@ -28,6 +28,11 @@ export interface RealQEReasoningBankConfig {
|
|
|
28
28
|
};
|
|
29
29
|
/** Coherence energy threshold for pattern promotion (ADR-052) */
|
|
30
30
|
coherenceThreshold?: number;
|
|
31
|
+
/**
|
|
32
|
+
* #1187: after the embedder fails (at startup or at runtime), wait this long
|
|
33
|
+
* before trying it again. Until then pattern search is lexical-only.
|
|
34
|
+
*/
|
|
35
|
+
embedderRetryIntervalMs?: number;
|
|
31
36
|
}
|
|
32
37
|
export declare const DEFAULT_REAL_CONFIG: RealQEReasoningBankConfig;
|
|
33
38
|
/** Ranking evidence keeps lexical relevance separate from vector reuse safety. */
|
|
@@ -42,7 +47,8 @@ export interface RealQEPatternSearchResult {
|
|
|
42
47
|
* #1022: how pattern search works in this process. Without an embedding
|
|
43
48
|
* runtime the bank stores patterns text-only (vectors pending, filled later by
|
|
44
49
|
* `aqe learning backfill-embeddings`) and searches by SQLite FTS text matching
|
|
45
|
-
* only. No similarity score is computed in that mode.
|
|
50
|
+
* only. No similarity score is computed in that mode. #1187: the same mode
|
|
51
|
+
* applies while an embedder that failed at runtime is unavailable.
|
|
46
52
|
*/
|
|
47
53
|
export interface PatternSearchStatus {
|
|
48
54
|
mode: 'vector' | 'lexical-only';
|
|
@@ -132,8 +138,11 @@ export declare class RealQEReasoningBank {
|
|
|
132
138
|
private hnswIndex;
|
|
133
139
|
private patternIdMap;
|
|
134
140
|
private initialized;
|
|
135
|
-
/**
|
|
136
|
-
|
|
141
|
+
/**
|
|
142
|
+
* #1022/#1187/#1204: whether the embedder works. While it does not, patterns
|
|
143
|
+
* are stored text-only and searched by text; it is retried in the background.
|
|
144
|
+
*/
|
|
145
|
+
private readonly embedderRecovery;
|
|
137
146
|
private stats;
|
|
138
147
|
private routingLatencies;
|
|
139
148
|
private readonly asymmetricEngine;
|
|
@@ -145,6 +154,17 @@ export declare class RealQEReasoningBank {
|
|
|
145
154
|
initialize(): Promise<void>;
|
|
146
155
|
/** #1022: whether pattern search uses vectors or text matching only. */
|
|
147
156
|
getPatternSearchStatus(): PatternSearchStatus;
|
|
157
|
+
/**
|
|
158
|
+
* #1187: embed `text`, or return undefined when the embedder is unavailable.
|
|
159
|
+
* A runtime failure switches this bank to lexical-only (reported by
|
|
160
|
+
* getPatternSearchStatus): callers then store patterns text-only and search
|
|
161
|
+
* by text. The embedder is tried again once `embedderRetryIntervalMs` has
|
|
162
|
+
* passed, so a short outage, at startup or later, does not last until restart.
|
|
163
|
+
* #1204: that retry runs in the background; this call stays text-only.
|
|
164
|
+
*/
|
|
165
|
+
private embedOrUndefined;
|
|
166
|
+
/** #1187: the retry probe; vector search needs the HNSW index as well. */
|
|
167
|
+
private probeEmbedderForRetry;
|
|
148
168
|
/**
|
|
149
169
|
* Initialize HNSW index for fast similarity search
|
|
150
170
|
*/
|
|
@@ -170,7 +190,7 @@ export declare class RealQEReasoningBank {
|
|
|
170
190
|
domain?: QEDomain;
|
|
171
191
|
minSimilarity?: number;
|
|
172
192
|
}): Promise<Result<RealQEPatternSearchResult[]>>;
|
|
173
|
-
/** Append HNSW vector matches for
|
|
193
|
+
/** Append HNSW vector matches for the query embedding to `patterns`. */
|
|
174
194
|
private collectVectorMatches;
|
|
175
195
|
/**
|
|
176
196
|
* Route a task to optimal agent
|
|
@@ -23,6 +23,7 @@ import { blendFtsScore, DEFAULT_PATTERN_STORE_CONFIG } from './pattern-store.js'
|
|
|
23
23
|
import { EMBEDDING_SPACE_CANARY } from './embedding-space.js';
|
|
24
24
|
const logger = LoggerFactory.create('RealQEReasoningBank');
|
|
25
25
|
import { computeRealEmbedding, isTransformerAvailable, getEmbeddingDimension, clearEmbeddingCache, getActiveEmbeddingSpaceIdentity, } from './real-embeddings.js';
|
|
26
|
+
import { EmbedderRecovery, probeEmbedder } from './embedder-recovery.js';
|
|
26
27
|
import { createSQLitePatternStore, } from './sqlite-persistence.js';
|
|
27
28
|
import { detectQEDomain, detectQEDomains, mapQEDomainToAQE, QE_DOMAIN_LIST, shouldPromotePattern, } from './qe-patterns.js';
|
|
28
29
|
import { getGuidance, getCombinedGuidance, generateGuidanceContext, checkAntiPatterns, } from './qe-guidance.js';
|
|
@@ -59,6 +60,7 @@ export const DEFAULT_REAL_CONFIG = {
|
|
|
59
60
|
capabilities: 0.3,
|
|
60
61
|
},
|
|
61
62
|
coherenceThreshold: 0.4, // ADR-052: Coherence gate threshold
|
|
63
|
+
embedderRetryIntervalMs: 60_000,
|
|
62
64
|
};
|
|
63
65
|
// ============================================================================
|
|
64
66
|
// Real QE ReasoningBank Implementation
|
|
@@ -80,8 +82,11 @@ export class RealQEReasoningBank {
|
|
|
80
82
|
hnswIndex = null;
|
|
81
83
|
patternIdMap = new Map();
|
|
82
84
|
initialized = false;
|
|
83
|
-
/**
|
|
84
|
-
|
|
85
|
+
/**
|
|
86
|
+
* #1022/#1187/#1204: whether the embedder works. While it does not, patterns
|
|
87
|
+
* are stored text-only and searched by text; it is retried in the background.
|
|
88
|
+
*/
|
|
89
|
+
embedderRecovery;
|
|
85
90
|
// Statistics tracking - using CircularBuffer for O(1) operations (ADR memory leak fix)
|
|
86
91
|
stats = {
|
|
87
92
|
routingRequests: 0,
|
|
@@ -157,6 +162,12 @@ export class RealQEReasoningBank {
|
|
|
157
162
|
this.qeConfig = { ...DEFAULT_REAL_CONFIG, ...config };
|
|
158
163
|
this.sqliteStore = createSQLitePatternStore(this.qeConfig.sqlite);
|
|
159
164
|
this.asymmetricEngine = new AsymmetricLearningEngine();
|
|
165
|
+
this.embedderRecovery = new EmbedderRecovery({
|
|
166
|
+
retryIntervalMs: this.qeConfig.embedderRetryIntervalMs,
|
|
167
|
+
probe: () => this.probeEmbedderForRetry(),
|
|
168
|
+
onRecovered: () => logger.info('Embedder available again: pattern search uses vectors'),
|
|
169
|
+
onRetryFailed: (error) => logger.debug('Embedder still unavailable', { error: toErrorMessage(error) }),
|
|
170
|
+
});
|
|
160
171
|
}
|
|
161
172
|
/**
|
|
162
173
|
* Initialize the QE ReasoningBank
|
|
@@ -176,11 +187,11 @@ export class RealQEReasoningBank {
|
|
|
176
187
|
await computeRealEmbedding(EMBEDDING_SPACE_CANARY, this.qeConfig.embeddings);
|
|
177
188
|
}
|
|
178
189
|
catch (error) {
|
|
179
|
-
this.
|
|
190
|
+
this.embedderRecovery.markUnavailable(toErrorMessage(error));
|
|
180
191
|
logger.warn('No embedding runtime: patterns are stored without vectors (pending ' +
|
|
181
|
-
'`aqe learning backfill-embeddings`) and searched by text matching only', { reason: this.
|
|
192
|
+
'`aqe learning backfill-embeddings`) and searched by text matching only', { reason: this.embedderRecovery.unavailableReason });
|
|
182
193
|
}
|
|
183
|
-
if (this.
|
|
194
|
+
if (this.embedderRecovery.unavailableReason === null) {
|
|
184
195
|
// Initialize HNSW index
|
|
185
196
|
await this.initializeHNSW();
|
|
186
197
|
logger.info('HNSW index initialized');
|
|
@@ -209,9 +220,39 @@ export class RealQEReasoningBank {
|
|
|
209
220
|
}
|
|
210
221
|
/** #1022: whether pattern search uses vectors or text matching only. */
|
|
211
222
|
getPatternSearchStatus() {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
223
|
+
const reason = this.embedderRecovery.unavailableReason;
|
|
224
|
+
return reason === null ? { mode: 'vector' } : { mode: 'lexical-only', reason };
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* #1187: embed `text`, or return undefined when the embedder is unavailable.
|
|
228
|
+
* A runtime failure switches this bank to lexical-only (reported by
|
|
229
|
+
* getPatternSearchStatus): callers then store patterns text-only and search
|
|
230
|
+
* by text. The embedder is tried again once `embedderRetryIntervalMs` has
|
|
231
|
+
* passed, so a short outage, at startup or later, does not last until restart.
|
|
232
|
+
* #1204: that retry runs in the background; this call stays text-only.
|
|
233
|
+
*/
|
|
234
|
+
async embedOrUndefined(text) {
|
|
235
|
+
if (!this.embedderRecovery.isAvailable())
|
|
236
|
+
return undefined;
|
|
237
|
+
try {
|
|
238
|
+
return await computeRealEmbedding(text, this.qeConfig.embeddings);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
const reason = `Embedder failed at runtime: ${toErrorMessage(error)}`;
|
|
242
|
+
if (this.embedderRecovery.markUnavailable(reason)) {
|
|
243
|
+
logger.warn('Embedder failed: patterns are stored without vectors and searched by ' +
|
|
244
|
+
'text matching only until it recovers', { reason });
|
|
245
|
+
}
|
|
246
|
+
return undefined;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/** #1187: the retry probe; vector search needs the HNSW index as well. */
|
|
250
|
+
async probeEmbedderForRetry() {
|
|
251
|
+
await probeEmbedder(this.qeConfig.embeddings);
|
|
252
|
+
if (!this.hnswIndex) {
|
|
253
|
+
await this.initializeHNSW();
|
|
254
|
+
await this.loadPatternsIntoHNSW();
|
|
255
|
+
}
|
|
215
256
|
}
|
|
216
257
|
/**
|
|
217
258
|
* Initialize HNSW index for fast similarity search
|
|
@@ -331,12 +372,10 @@ export class RealQEReasoningBank {
|
|
|
331
372
|
async storeQEPattern(options) {
|
|
332
373
|
// Require explicit initialization - don't auto-initialize to avoid memory issues
|
|
333
374
|
try {
|
|
334
|
-
// Generate REAL embedding using transformer model. #1022: without
|
|
335
|
-
//
|
|
375
|
+
// Generate REAL embedding using transformer model. #1022/#1187: without
|
|
376
|
+
// a working embedder the pattern is stored text-only (vector pending).
|
|
336
377
|
const textToEmbed = `${options.name} ${options.description || ''} ${options.context?.tags?.join(' ') || ''}`;
|
|
337
|
-
const embedding = this.
|
|
338
|
-
? await computeRealEmbedding(textToEmbed, this.qeConfig.embeddings)
|
|
339
|
-
: undefined;
|
|
378
|
+
const embedding = await this.embedOrUndefined(textToEmbed);
|
|
340
379
|
// Detect QE domain
|
|
341
380
|
const qeDomain = detectQEDomain(textToEmbed) || 'test-generation';
|
|
342
381
|
// ADR-058: Check MemoryWriteGate for contradictions before storing
|
|
@@ -435,13 +474,14 @@ export class RealQEReasoningBank {
|
|
|
435
474
|
try {
|
|
436
475
|
const limit = options.limit || 10;
|
|
437
476
|
const patterns = [];
|
|
438
|
-
// #1022: without
|
|
477
|
+
// #1022/#1187: without a working embedder only the lexical (FTS) branch
|
|
439
478
|
// below runs; its hits are labelled matchType 'lexical'.
|
|
440
|
-
|
|
479
|
+
const queryEmbedding = await this.embedOrUndefined(query);
|
|
480
|
+
if (queryEmbedding) {
|
|
441
481
|
if (!this.hnswIndex) {
|
|
442
482
|
return err(new Error('HNSW index not available'));
|
|
443
483
|
}
|
|
444
|
-
|
|
484
|
+
this.collectVectorMatches(queryEmbedding, limit, options, patterns);
|
|
445
485
|
}
|
|
446
486
|
const existing = new Map(patterns.map(hit => [hit.pattern.id, hit]));
|
|
447
487
|
for (const lexical of this.sqliteStore.searchFTS(query, limit * 2)) {
|
|
@@ -471,10 +511,8 @@ export class RealQEReasoningBank {
|
|
|
471
511
|
return err(toError(error));
|
|
472
512
|
}
|
|
473
513
|
}
|
|
474
|
-
/** Append HNSW vector matches for
|
|
475
|
-
|
|
476
|
-
// Generate REAL embedding for query
|
|
477
|
-
const queryEmbedding = await computeRealEmbedding(query, this.qeConfig.embeddings);
|
|
514
|
+
/** Append HNSW vector matches for the query embedding to `patterns`. */
|
|
515
|
+
collectVectorMatches(queryEmbedding, limit, options, patterns) {
|
|
478
516
|
// Search HNSW index
|
|
479
517
|
const results = this.hnswIndex.searchKnn(queryEmbedding, limit * 2); // Get extra for filtering
|
|
480
518
|
for (let i = 0; i < results.neighbors.length; i++) {
|