agentic-qe 3.15.11 → 3.15.13
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 +267 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-KCQDVYY2.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-TIDSQ3ZK.js → agent-booster-wasm-6RRQWMNE.js} +2 -2
- package/dist/cli/chunks/{agent-handler-G3EPBVA7.js → agent-handler-AOH6TV7W.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-ARC5C7GW.js → agent-memory-branch-2P54SF5N.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-SAQOHSGN.js +2 -0
- package/dist/cli/chunks/{arena-K4I4QDXB.js → arena-NSVFCAF5.js} +2 -2
- package/dist/cli/chunks/{arena-36DTATJV.js → arena-X6MOGQHA.js} +4 -4
- package/dist/cli/chunks/{audit-WQSJSJZF.js → audit-27DJLQNM.js} +3 -3
- package/dist/cli/chunks/base-WCACU3FN.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-BB4K67MT.js → better-sqlite3-BU5GXILS.js} +2 -2
- package/dist/cli/chunks/{brain-handler-CU3GOIU3.js → brain-handler-GTQNHHZS.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-NJQX7ZNB.js → branch-enumerator-5CLULOCU.js} +2 -2
- package/dist/cli/chunks/{browser-6YJF4FQW.js → browser-R4DMU3LN.js} +2 -2
- package/dist/cli/chunks/browser-workflow-G6IASEAP.js +2 -0
- package/dist/cli/chunks/{chunk-G4FAPO57.js → chunk-2G7TVT6W.js} +2 -2
- package/dist/cli/chunks/{chunk-HDNWSKHA.js → chunk-32ZMWEP3.js} +2 -2
- package/dist/cli/chunks/{chunk-FWSGPE3V.js → chunk-3AN5TNGD.js} +3 -3
- package/dist/cli/chunks/{chunk-X4J73KP3.js → chunk-3LJ7LQMV.js} +1 -1
- package/dist/cli/chunks/{chunk-3RHOPP7A.js → chunk-3QZEGE67.js} +1 -1
- package/dist/cli/chunks/{chunk-RBZCA7SD.js → chunk-3RZV5DGO.js} +2 -2
- package/dist/cli/chunks/{chunk-DDEOZPWJ.js → chunk-3Y2ROSCL.js} +2 -2
- package/dist/cli/chunks/{chunk-LD5CFK53.js → chunk-3Y7TJFHU.js} +2 -2
- package/dist/cli/chunks/{chunk-I36CRDHF.js → chunk-3YNLWPBF.js} +2 -2
- package/dist/cli/chunks/{chunk-ZMC543GI.js → chunk-42J34YG4.js} +2 -2
- package/dist/cli/chunks/{chunk-YNOCQ2SL.js → chunk-4OVC4RIL.js} +1 -1
- package/dist/cli/chunks/{chunk-2KFFEKSI.js → chunk-526QYFJU.js} +2 -2
- package/dist/cli/chunks/{chunk-LBX7M4LW.js → chunk-5FKWCZNF.js} +2 -2
- package/dist/cli/chunks/{chunk-OH5V5EJW.js → chunk-5K26BEYB.js} +2 -2
- package/dist/cli/chunks/{chunk-TCYSBC7Y.js → chunk-5MDERQH3.js} +1 -1
- package/dist/cli/chunks/{chunk-V5AADCBC.js → chunk-5VMAV6T6.js} +1 -1
- package/dist/cli/chunks/{chunk-YBBT3YYG.js → chunk-5ZGM3RMH.js} +1 -1
- package/dist/cli/chunks/{chunk-RTY7VSZB.js → chunk-6KATY3KS.js} +2 -2
- package/dist/cli/chunks/{chunk-LPU6PAJE.js → chunk-6Z7PRBSG.js} +2 -2
- package/dist/cli/chunks/{chunk-6NA3KZZT.js → chunk-72ASBE35.js} +7 -7
- package/dist/cli/chunks/{chunk-GBFUANTC.js → chunk-756CGMEH.js} +1 -1
- package/dist/cli/chunks/{chunk-UTTSH4NH.js → chunk-75RDHBAX.js} +3 -3
- package/dist/cli/chunks/{chunk-XGPTZUKQ.js → chunk-7CMTY45A.js} +2 -2
- package/dist/cli/chunks/{chunk-NC6K7SCQ.js → chunk-7JUC2MVZ.js} +2 -2
- package/dist/cli/chunks/{chunk-RTFKTKSO.js → chunk-7NA7JXNB.js} +2 -2
- package/dist/cli/chunks/{chunk-GWJWSLDA.js → chunk-7PLIEBY7.js} +2 -2
- package/dist/cli/chunks/{chunk-OURITHFV.js → chunk-7YTGHGK4.js} +2 -2
- package/dist/cli/chunks/{chunk-ITL3IN2E.js → chunk-A64JFBWI.js} +2 -2
- package/dist/cli/chunks/{chunk-OHR7C777.js → chunk-AL6FBH3E.js} +2 -2
- package/dist/cli/chunks/{chunk-5N25I53C.js → chunk-AQSVJNEH.js} +2 -2
- package/dist/cli/chunks/{chunk-FL32MTKT.js → chunk-ARJW4I2O.js} +2 -2
- package/dist/cli/chunks/{chunk-ZQHDA4O7.js → chunk-ASQYASNV.js} +1 -1
- package/dist/cli/chunks/{chunk-4HJKQIX5.js → chunk-BEGR4D6N.js} +2 -2
- package/dist/cli/chunks/{chunk-G77MLBDF.js → chunk-BK577VL7.js} +2 -2
- package/dist/cli/chunks/{chunk-NPZOBSAN.js → chunk-BLSLEVDI.js} +2 -2
- package/dist/cli/chunks/{chunk-R5LGV6GZ.js → chunk-BTVEYBW2.js} +2 -2
- package/dist/cli/chunks/{chunk-2CW7VRPH.js → chunk-C6JTLKG7.js} +5 -5
- package/dist/cli/chunks/{chunk-EWPUQCN4.js → chunk-C7JM7CD3.js} +2 -2
- package/dist/cli/chunks/{chunk-325QCVDI.js → chunk-CCMKSHAT.js} +2 -2
- package/dist/cli/chunks/{chunk-V7DA4HAK.js → chunk-CE7B5LU7.js} +1 -1
- package/dist/cli/chunks/{chunk-4RAQ7PJA.js → chunk-CM4LSLKR.js} +2 -2
- package/dist/cli/chunks/chunk-CRWPZT74.js +62 -0
- package/dist/cli/chunks/{chunk-U3LJNNVJ.js → chunk-CT6SAVXQ.js} +2 -2
- package/dist/cli/chunks/chunk-CV77DMDQ.js +2 -0
- package/dist/cli/chunks/{chunk-UMVSWQNB.js → chunk-DFUASIKA.js} +2 -2
- package/dist/cli/chunks/{chunk-KSE5TDM5.js → chunk-DLD7RUZ4.js} +2 -2
- package/dist/cli/chunks/{chunk-4MUBW4RT.js → chunk-DNDL7SOS.js} +2 -2
- package/dist/cli/chunks/{chunk-EJPK7OTR.js → chunk-DVGRPK7A.js} +2 -2
- package/dist/cli/chunks/{chunk-WCVCOT4E.js → chunk-E56B6IDX.js} +2 -2
- package/dist/cli/chunks/{chunk-7HEMJHPP.js → chunk-E7CLYGS7.js} +1 -1
- package/dist/cli/chunks/{chunk-R5GRABPQ.js → chunk-EXGMJFAT.js} +1 -1
- package/dist/cli/chunks/chunk-F3YS57NF.js +21 -0
- package/dist/cli/chunks/{chunk-I4K2HTQU.js → chunk-FZ76G4QJ.js} +1 -1
- package/dist/cli/chunks/{chunk-4UX35V7P.js → chunk-G2Q66Z23.js} +2 -2
- package/dist/cli/chunks/{chunk-KJCIMNHS.js → chunk-G6WDYBLQ.js} +1 -1
- package/dist/cli/chunks/{chunk-VWUZSNVC.js → chunk-G77ERMUD.js} +1 -1
- package/dist/cli/chunks/{chunk-FZHSG75I.js → chunk-GB6HBNH2.js} +2 -2
- package/dist/cli/chunks/{chunk-KDI5JOYZ.js → chunk-GHM6MQNK.js} +2 -2
- package/dist/cli/chunks/{chunk-H7BLYMNU.js → chunk-GHY6Z6KO.js} +5 -5
- package/dist/cli/chunks/{chunk-TFW7CCKS.js → chunk-GII6UM3F.js} +1 -1
- package/dist/cli/chunks/{chunk-DOBZPSKE.js → chunk-GU5HNCWI.js} +1 -1
- package/dist/cli/chunks/{chunk-AFFN6E6Q.js → chunk-H4GG2NLO.js} +2 -2
- package/dist/cli/chunks/{chunk-7R5HC56U.js → chunk-H4H2YSFH.js} +1 -1
- package/dist/cli/chunks/{chunk-J4JMCZVA.js → chunk-HD7YIFOI.js} +2 -2
- package/dist/cli/chunks/{chunk-5MTWCCZJ.js → chunk-HOAJUIBQ.js} +2 -2
- package/dist/cli/chunks/{chunk-T5KHJ3J7.js → chunk-HQZGPJYG.js} +2 -2
- package/dist/cli/chunks/{chunk-VEEYL2CZ.js → chunk-HZ5NXFXH.js} +2 -2
- package/dist/cli/chunks/{chunk-LQ4NUC6Q.js → chunk-I3C7JOXC.js} +2 -2
- package/dist/cli/chunks/{chunk-Z2EA7A4Z.js → chunk-IC3TQEOA.js} +1 -1
- package/dist/cli/chunks/{chunk-E44NNCEU.js → chunk-IJUHSJ2U.js} +2 -2
- package/dist/cli/chunks/{chunk-EH2S6AOR.js → chunk-J2ZIFFM6.js} +2 -2
- package/dist/cli/chunks/{chunk-GVKVJJQX.js → chunk-JGZ722G3.js} +2 -2
- package/dist/cli/chunks/{chunk-EK5GMOSO.js → chunk-JQGMW45H.js} +1 -1
- package/dist/cli/chunks/{chunk-XGBU3KEM.js → chunk-JRRXCODW.js} +2 -2
- package/dist/cli/chunks/{chunk-5WYZHDIZ.js → chunk-K3TLLJMX.js} +1 -1
- package/dist/cli/chunks/{chunk-LXQ3B4RY.js → chunk-K4CZA77U.js} +2 -2
- package/dist/cli/chunks/chunk-K65CGKLD.js +8 -0
- package/dist/cli/chunks/{chunk-HFFPYC4G.js → chunk-KADFXPPN.js} +2 -2
- package/dist/cli/chunks/{chunk-APPZATXA.js → chunk-KB56CPU4.js} +2 -2
- package/dist/cli/chunks/{chunk-25P77WA5.js → chunk-KCW47QR5.js} +1 -1
- package/dist/cli/chunks/{chunk-WM3SRRA6.js → chunk-KDNJ4F3P.js} +2 -2
- package/dist/cli/chunks/{chunk-5ERFHEEE.js → chunk-KDVZND5Q.js} +1 -1
- package/dist/cli/chunks/{chunk-YOCULVHR.js → chunk-KUAKV3IW.js} +1 -1
- package/dist/cli/chunks/{chunk-M5XYIQYZ.js → chunk-KV4T4MXK.js} +2 -2
- package/dist/cli/chunks/{chunk-MIK4RBEH.js → chunk-KWYH3FI4.js} +1 -1
- package/dist/cli/chunks/{chunk-UKKYMW3S.js → chunk-LFJALJOA.js} +2 -2
- package/dist/cli/chunks/{chunk-K7V2WZNF.js → chunk-LL7LDPXS.js} +1 -1
- package/dist/cli/chunks/{chunk-55CH76ZO.js → chunk-LUZNKJE6.js} +3 -3
- package/dist/cli/chunks/{chunk-OV5RPLKV.js → chunk-LWR3FV3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-SMVVAVN2.js → chunk-LZYQHVD4.js} +2 -2
- package/dist/cli/chunks/{chunk-672XOJDG.js → chunk-M6AAGIG7.js} +1 -1
- package/dist/cli/chunks/{chunk-WCAVIJ64.js → chunk-MAMQA43L.js} +1 -1
- package/dist/cli/chunks/chunk-MB46UBGY.js +3 -0
- package/dist/cli/chunks/{chunk-AP3ADWDK.js → chunk-MFW5HSG4.js} +2 -2
- package/dist/cli/chunks/{chunk-NKTWKYHB.js → chunk-MGZ5FJUW.js} +2 -2
- package/dist/cli/chunks/{chunk-ERN43HOX.js → chunk-MVVB7C2E.js} +410 -410
- package/dist/cli/chunks/{chunk-57LNKSW7.js → chunk-N4CYAKOX.js} +2 -2
- package/dist/cli/chunks/chunk-NT4DBXSX.js +2 -0
- package/dist/cli/chunks/{chunk-BZPE3LDO.js → chunk-NU3W5WFT.js} +2 -2
- package/dist/cli/chunks/chunk-NURIILUB.js +2 -0
- package/dist/cli/chunks/{chunk-ITPGWGQS.js → chunk-NW7IBHJA.js} +4 -4
- package/dist/cli/chunks/{chunk-OD5D4LSZ.js → chunk-NZ3GUMB2.js} +2 -2
- package/dist/cli/chunks/{chunk-35M2X3C5.js → chunk-NZD4DPSU.js} +2 -2
- package/dist/cli/chunks/{chunk-EIDJNT5C.js → chunk-O6FGXMHD.js} +1 -1
- package/dist/cli/chunks/{chunk-OYJC3YON.js → chunk-OCAEXYFA.js} +2 -2
- package/dist/cli/chunks/{chunk-Y7B5EUIJ.js → chunk-OFACHK5O.js} +2 -2
- package/dist/cli/chunks/{chunk-5MNASJOH.js → chunk-P7A4NKTZ.js} +2 -2
- package/dist/cli/chunks/{chunk-M7XFBSIK.js → chunk-PB6J6HAA.js} +2 -2
- package/dist/cli/chunks/{chunk-5HQP4SLM.js → chunk-PHP5UBT4.js} +2 -2
- package/dist/cli/chunks/{chunk-KXS3Y2AX.js → chunk-PIDQVU3L.js} +2 -2
- package/dist/cli/chunks/{chunk-4UBVAJFO.js → chunk-PSFSPGUD.js} +2 -2
- package/dist/cli/chunks/chunk-PT4FMJPQ.js +3 -0
- package/dist/cli/chunks/{chunk-HDJUYAZG.js → chunk-Q3UDLV5Z.js} +1 -1
- package/dist/cli/chunks/{chunk-CIAL4YRY.js → chunk-QDEJ4CI2.js} +2 -2
- package/dist/cli/chunks/{chunk-S6IYEBAI.js → chunk-QPNG5ZN2.js} +2 -2
- package/dist/cli/chunks/{chunk-YPX2TV3M.js → chunk-R7SYRCRP.js} +1 -1
- package/dist/cli/chunks/{chunk-XNLIWQYE.js → chunk-RF7HWBHN.js} +2 -2
- package/dist/cli/chunks/{chunk-5YLOLACR.js → chunk-RFNW2LGD.js} +2 -2
- package/dist/cli/chunks/{chunk-2VLYUF7U.js → chunk-S5AZCIZS.js} +2 -2
- package/dist/cli/chunks/{chunk-ETVAYGCB.js → chunk-SE4VNN4I.js} +3 -3
- package/dist/cli/chunks/{chunk-E6PF35JZ.js → chunk-SG3NX7QE.js} +2 -2
- package/dist/cli/chunks/{chunk-VYTILW4R.js → chunk-SSU73QAX.js} +2 -2
- package/dist/cli/chunks/{chunk-ZP75ASUU.js → chunk-SVLQRAMF.js} +1 -1
- package/dist/cli/chunks/{chunk-JGJXXAS6.js → chunk-SYV2V3PL.js} +4 -4
- package/dist/cli/chunks/{chunk-4RH5I24Q.js → chunk-T3PGQFDI.js} +2 -2
- package/dist/cli/chunks/{chunk-O4JAKWWM.js → chunk-TCBBNUBP.js} +17 -17
- package/dist/cli/chunks/{chunk-QDESWOZP.js → chunk-TOQWL2ZF.js} +2 -2
- package/dist/cli/chunks/{chunk-NTB342NJ.js → chunk-TSQC2KKZ.js} +4 -4
- package/dist/cli/chunks/{chunk-NQZNMCZU.js → chunk-TWDW32W2.js} +2 -2
- package/dist/cli/chunks/{chunk-CO3DX2AX.js → chunk-TWJTK4CC.js} +2 -2
- package/dist/cli/chunks/{chunk-FUYOOKTH.js → chunk-U2FUXDDJ.js} +3 -3
- package/dist/cli/chunks/{chunk-XDI5X3FR.js → chunk-UDQSYWVF.js} +1 -1
- package/dist/cli/chunks/chunk-UOC3O6RP.js +5 -0
- package/dist/cli/chunks/chunk-UT2VZ33P.js +2 -0
- package/dist/cli/chunks/{chunk-IOZRKXR5.js → chunk-UTRV7T2N.js} +2 -2
- package/dist/cli/chunks/{chunk-ZMHCMJ4J.js → chunk-UXZSUMEA.js} +2 -2
- package/dist/cli/chunks/{chunk-G4CKPWF6.js → chunk-VRHRBAEM.js} +1 -1
- package/dist/cli/chunks/{chunk-AUUJBXWX.js → chunk-VRVMIPTM.js} +2 -2
- package/dist/cli/chunks/{chunk-IENZSO3K.js → chunk-VTDFVFST.js} +2 -2
- package/dist/cli/chunks/{chunk-JFLU7L3W.js → chunk-VTOBUZL6.js} +2 -2
- package/dist/cli/chunks/{chunk-KKYO2NKV.js → chunk-VU5TBX2V.js} +2 -2
- package/dist/cli/chunks/{chunk-XS2XF3YG.js → chunk-W26B7ERY.js} +1 -1
- package/dist/cli/chunks/{chunk-DOFREOPQ.js → chunk-W2QWSQVE.js} +2 -2
- package/dist/cli/chunks/{chunk-KSLLHFVY.js → chunk-W3INMZZ6.js} +1 -1
- package/dist/cli/chunks/{chunk-FLU5FDSC.js → chunk-W3PPFHI5.js} +59 -59
- package/dist/cli/chunks/chunk-WKGTGOYS.js +13 -0
- package/dist/cli/chunks/{chunk-4X4MWMHB.js → chunk-WNQS4WTS.js} +2 -2
- package/dist/cli/chunks/{chunk-XJKZ7FTR.js → chunk-WO274FRI.js} +2 -2
- package/dist/cli/chunks/{chunk-76SNL7GU.js → chunk-WOCGL4QP.js} +2 -2
- package/dist/cli/chunks/{chunk-HYXUN7BW.js → chunk-WQL7WCIZ.js} +1 -1
- package/dist/cli/chunks/{chunk-BTVWA35P.js → chunk-X2Z7F4EU.js} +2 -2
- package/dist/cli/chunks/{chunk-VBK2YAYY.js → chunk-X7N2JF2X.js} +2 -2
- package/dist/cli/chunks/{chunk-NT7JRHMH.js → chunk-XEAEYC6Y.js} +1 -1
- package/dist/cli/chunks/{chunk-G2IJFNZS.js → chunk-XNBOGCF3.js} +2 -2
- package/dist/cli/chunks/{chunk-LCVEEII4.js → chunk-XPRVF4YE.js} +2 -2
- package/dist/cli/chunks/{chunk-AMZKAJLJ.js → chunk-YBQH2VOP.js} +2 -2
- package/dist/cli/chunks/{chunk-JUMICXM6.js → chunk-YQFLQE53.js} +2 -2
- package/dist/cli/chunks/{chunk-M5RQ6U3G.js → chunk-YSZ5OE3Z.js} +2 -2
- package/dist/cli/chunks/{chunk-RQMCZQN2.js → chunk-YXRASAPI.js} +2 -2
- package/dist/cli/chunks/{chunk-X3PZCXWG.js → chunk-YZEXYO4W.js} +1 -1
- package/dist/cli/chunks/{chunk-TL6OFMXF.js → chunk-YZWBNBTW.js} +2 -2
- package/dist/cli/chunks/{chunk-CFWGGRE7.js → chunk-ZAKQLAHT.js} +1 -1
- package/dist/cli/chunks/ci-ENOASTYB.js +81 -0
- package/dist/cli/chunks/{ci-config-J665XNOX.js → ci-config-B26OXHQM.js} +2 -2
- package/dist/cli/chunks/{ci-output-PEQQQWVD.js → ci-output-JTCLLNOQ.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-HHB2JSKH.js → circuit-breaker-23JMFNM5.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-JKUJRWPN.js → claude-flow-setup-ON6L462G.js} +2 -2
- package/dist/cli/chunks/client-TV3V2YZ5.js +2 -0
- package/dist/cli/chunks/{cline-installer-Y77BWTAN.js → cline-installer-OWQ4D2FQ.js} +2 -2
- package/dist/cli/chunks/{code-LV2HAGJY.js → code-2ZRL7SEU.js} +19 -18
- package/dist/cli/chunks/{code-index-extractor-4GKKSETB.js → code-index-extractor-JXSQVM67.js} +2 -2
- package/dist/cli/chunks/{codex-installer-WMKBYE5Y.js → codex-installer-7LXZYBSQ.js} +2 -2
- package/dist/cli/chunks/{completions-SBGFAOIJ.js → completions-C2LR623C.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-AQHFIJXC.js → complexity-analyzer-TGQLHCYJ.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-26AYFS2E.js → continuedev-installer-RUGD24D2.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-4UD3DK55.js → copilot-installer-ZLFVLEJP.js} +2 -2
- package/dist/cli/chunks/core-handlers-PZT4OLWR.js +2 -0
- package/dist/cli/chunks/{cost-tracker-TP4NZCG4.js → cost-tracker-RT4QL745.js} +2 -2
- package/dist/cli/chunks/{coverage-B2KIXHAI.js → coverage-NV3C4IMM.js} +11 -10
- package/dist/cli/chunks/cross-domain-router-QOFCZ7G4.js +2 -0
- package/dist/cli/chunks/{cursor-installer-AVZEQZ4W.js → cursor-installer-LJKLNFF6.js} +2 -2
- package/dist/cli/chunks/{daemon-XM2A7LQU.js → daemon-BMDXCQT5.js} +3 -3
- package/dist/cli/chunks/{daemon-P574WWBW.js → daemon-FBH3IRYN.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-MIWOZ6ET.js → dag-attention-scheduler-JGDED55I.js} +2 -2
- package/dist/cli/chunks/{detect-TYR7HT23.js → detect-SZIHIVCJ.js} +2 -2
- package/dist/cli/chunks/{dist-node-2DGVQGLS.js → dist-node-FV3KWXQ6.js} +2 -2
- package/dist/cli/chunks/{domain-handler-RRA4ZOMF.js → domain-handler-GI5JWQOV.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-IVZEZ5RB.js → domain-plugins-BUWY36TL.js} +2 -2
- package/dist/cli/chunks/domain-transfer-GCY7W5DA.js +2 -0
- package/dist/cli/chunks/dream-TRFBGDSQ.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-VNIEOVPO.js → embed-and-insert-pattern-GPRR3ZGD.js} +2 -2
- package/dist/cli/chunks/{eval-QV4LVPUF.js → eval-XPB3IGAP.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-DAPKT763.js → experience-capture-middleware-2E554UB3.js} +3 -3
- package/dist/cli/chunks/{fast-paths-WVRFPHX7.js → fast-paths-ZSMWZPUC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-DEFTUIYT.js → feature-flags-GIWVDVVC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-O7ZXDDCD.js → feature-flags-N7EOGE5P.js} +2 -2
- package/dist/cli/chunks/file-discovery-WCKGMSPZ.js +2 -0
- package/dist/cli/chunks/fleet-HCHDOUCX.js +44 -0
- package/dist/cli/chunks/{gnn-wrapper-LS4LZJDR.js → gnn-wrapper-CZNCNXXZ.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-RFTERD4K.js → heartbeat-handler-6YUIF2YQ.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-P44A2OX3.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-ZJQIQJKC.js +2 -0
- package/dist/cli/chunks/hnsw-index-HMG2GH3Z.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-GPKGFFHY.js → hnsw-legacy-bridge-J3M3IK24.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-PHL3F2PR.js → hnswlib-node-ULGTGDZW.js} +2 -2
- package/dist/cli/chunks/{hooks-GYJ6D4QM.js → hooks-C4BUGYUQ.js} +28 -28
- package/dist/cli/chunks/hybrid-backend-B7M74PZG.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-YGEQPCKJ.js → hypergraph-engine-WINGVMPG.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-ZIMM647V.js → hypergraph-handler-GADMWKAU.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-PZYOVKQO.js +2 -0
- package/dist/cli/chunks/{init-guard-VOMBXJXG.js → init-guard-K2T4QWAO.js} +2 -2
- package/dist/cli/chunks/{init-handler-PSMUBWK5.js → init-handler-PCZTDZYI.js} +6 -6
- package/dist/cli/chunks/init-wizard-TZDJQK3U.js +2 -0
- package/dist/cli/chunks/kernel-Y6RRIOKW.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-2YNTFBWJ.js → kilocode-installer-XENXNEIU.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-XHJDPVAZ.js → kiro-installer-3PG2TJ67.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-BVD5Z66M.js +2 -0
- package/dist/cli/chunks/{learning-GNSIDRNG.js → learning-6KDH7FK4.js} +3 -3
- package/dist/cli/chunks/{llm-router-LQDM7IU2.js → llm-router-RKVDEWU2.js} +4 -4
- package/dist/cli/chunks/llm-router-service-KHCAMSUU.js +2 -0
- package/dist/cli/chunks/{load-YATHI72E.js → load-ITHC564X.js} +2 -2
- package/dist/cli/chunks/load-test-RUF7DZA5.js +2 -0
- package/dist/cli/chunks/{mcp-4Y6GDLYK.js → mcp-TCL5UW3N.js} +2 -2
- package/dist/cli/chunks/{memory-OUW3L7H2.js → memory-BKDAY2N2.js} +5 -5
- package/dist/cli/chunks/memory-backend-7ZLFOVGG.js +2 -0
- package/dist/cli/chunks/{memory-handlers-G3LFF53U.js → memory-handlers-WN4FXFOA.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-UBZJXAD2.js → multi-model-executor-VHAT7ZPF.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-AMMNWVH5.js → opencode-installer-E3VM3EEY.js} +2 -2
- package/dist/cli/chunks/{orchestrator-Y44WDOER.js → orchestrator-BMQ6X762.js} +58 -20
- package/dist/cli/chunks/pattern-null-store-RY6CVYHP.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-ESR42RME.js → pattern-usage-recorder-GOOR2BV5.js} +2 -2
- package/dist/cli/chunks/{pipeline-EDTS6OSC.js → pipeline-5NSFQQIX.js} +2 -2
- package/dist/cli/chunks/{platform-5WONJSUX.js → platform-SQM34J5G.js} +2 -2
- package/dist/cli/chunks/{plugin-IJXPCLD4.js → plugin-UQJZRMZG.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-5ECKGZK6.js → prime-radiant-advanced-wasm-WMDJOL4S.js} +2 -2
- package/dist/cli/chunks/project-root-IO5KRNGL.js +2 -0
- package/dist/cli/chunks/protocol-executor-U2CUDWDE.js +2 -0
- package/dist/cli/chunks/{protocol-handler-DRD3GVNW.js → protocol-handler-OBDCVY6X.js} +2 -2
- package/dist/cli/chunks/{prove-KTGW2HMJ.js → prove-XDC7I4XT.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-DQSSX2IP.js +2 -0
- package/dist/cli/chunks/{quality-DV2WPRRS.js → quality-L4GQ6WX4.js} +2 -2
- package/dist/cli/chunks/{quality-gate-HFUAFVZC.js → quality-gate-MJG66LKN.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-6FN4BZIX.js +2 -0
- package/dist/cli/chunks/real-embeddings-HW4G2LWL.js +2 -0
- package/dist/cli/chunks/{ref-validation-QWSKS5OY.js → ref-validation-FC7JOJ2C.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-RBAYRCHX.js → roocode-installer-KWS4CEIC.js} +2 -2
- package/dist/cli/chunks/router-YUO3I7RU.js +2 -0
- package/dist/cli/chunks/routing-feedback-36SLQGJE.js +2 -0
- package/dist/cli/chunks/{routing-handler-FMPP3XKO.js → routing-handler-QF4WVB2S.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-KZZT4HWF.js → ruvector-commands-2MTCOUK6.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-FRYZH3WZ.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-XXNITL5I.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-7CHEV35N.js → rvf-migration-coordinator-BREJCXWN.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-D2WWKJIV.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-Q2TH52SN.js → rvf-store-integrity-KKC6HOJD.js} +2 -2
- package/dist/cli/chunks/safe-db-4RRIGRXD.js +2 -0
- package/dist/cli/chunks/schedule-25RTO4DQ.js +2 -0
- package/dist/cli/chunks/scheduler-BPIOJZ5P.js +2 -0
- package/dist/cli/chunks/{security-CUEA3UIM.js → security-OSAE7VAP.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-DROMBRV2.js → shared-rvf-adapter-COUOS665.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-DBNABOP7.js → shared-rvf-dual-writer-YXMPZKQE.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-EDF47DDX.js +2 -0
- package/dist/cli/chunks/{standalone-memory-IAHA3M6B.js → standalone-memory-E6JBMOIL.js} +2 -2
- package/dist/cli/chunks/{status-handler-AFUCASTX.js → status-handler-AFTCIYIX.js} +2 -2
- package/dist/cli/chunks/{structural-health-AQRV6JJ6.js → structural-health-2FROCEI4.js} +2 -2
- package/dist/cli/chunks/{sync-XW5TLZ7M.js → sync-VAYTOWDC.js} +2 -2
- package/dist/cli/chunks/{sync-GX7FMJHL.js → sync-YIQYOFGW.js} +2 -2
- package/dist/cli/chunks/task-handler-KVQHDEX3.js +62 -0
- package/dist/cli/chunks/task-handlers-MVVECQA6.js +9 -0
- package/dist/cli/chunks/{test-D2XDJNDX.js → test-5JSVTOMY.js} +4 -4
- package/dist/cli/chunks/test-runner-process-LEPF2OSS.js +2 -0
- package/dist/cli/chunks/{test-scheduling-TS6I2PR7.js → test-scheduling-HBOHVLI3.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-HBBLPCZ3.js → token-bootstrap-5VEPTPFA.js} +2 -2
- package/dist/cli/chunks/{token-usage-3MBUX4PR.js → token-usage-TBJHDLY6.js} +2 -2
- package/dist/cli/chunks/{transformers-ZWMQO3L2.js → transformers-VAWYMHMZ.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-TSZTCMFV.js +2 -0
- package/dist/cli/chunks/{types-5YEMGPSQ.js → types-R5SDZU2E.js} +2 -2
- package/dist/cli/chunks/unified-memory-TLGSSLMI.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-MSUR7ZOO.js +2 -0
- package/dist/cli/chunks/unified-persistence-VFFOTWK7.js +2 -0
- package/dist/cli/chunks/{upgrade-2TPBKIHI.js → upgrade-K5PIHXRB.js} +2 -2
- package/dist/cli/chunks/{validate-XRAXXFW6.js → validate-RPTS7RYJ.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-IYSCS3BZ.js → validate-swarm-B2ZL556X.js} +2 -2
- package/dist/cli/chunks/visual-security-6Q44XNLB.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-PZQ3ZG2P.js → web-tree-sitter-K4DUJC32.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-U6XWFRVT.js → windsurf-installer-OK2AJN35.js} +2 -2
- package/dist/cli/chunks/witness-chain-KDOMXDQX.js +2 -0
- package/dist/cli/chunks/witness-chain-N3OY2RMH.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-K7YX2AO6.js → witness-chain-repair-L6Y5RFXR.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-GUTC3W7N.js → witness-chain-verifier-N4CW7FZX.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-YBNKMOP6.js → witness-key-manager-TDNPS3WD.js} +2 -2
- package/dist/cli/chunks/{workflow-UAJUILFQ.js → workflow-XRZA3YCY.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-CVNNT2RJ.js +2 -0
- package/dist/cli/chunks/{wrappers-AVZ3GPAL.js → wrappers-5JIFWKN6.js} +2 -2
- package/dist/cli/commands/ci.js +7 -0
- package/dist/cli/commands/code.js +6 -0
- package/dist/cli/commands/coverage.js +7 -1
- package/dist/cli/commands/fleet-run.d.ts +12 -0
- package/dist/cli/commands/fleet-run.js +175 -0
- package/dist/cli/commands/fleet.js +2 -117
- 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.d.ts +5 -0
- package/dist/cli/handlers/task-handler.js +26 -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 +10 -2
- package/dist/cli/utils/fleet-operation.js +20 -3
- package/dist/cli/utils/fleet-result.d.ts +20 -4
- package/dist/cli/utils/fleet-result.js +32 -21
- package/dist/cli/utils/fleet-shard.d.ts +36 -0
- package/dist/cli/utils/fleet-shard.js +110 -0
- package/dist/coordination/handlers/code-intelligence-handlers.js +21 -1
- 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-types.d.ts +2 -2
- package/dist/coordination/handlers/handler-utils.d.ts +11 -0
- package/dist/coordination/handlers/handler-utils.js +22 -8
- package/dist/coordination/handlers/misc-handlers.js +5 -2
- package/dist/coordination/handlers/quality-handlers.js +2 -2
- package/dist/coordination/handlers/security-handlers.js +12 -2
- package/dist/coordination/protocols/security-audit.js +11 -1
- package/dist/coordination/task-executor.js +7 -2
- package/dist/domains/code-intelligence/coordinator-gnn.d.ts +2 -16
- package/dist/domains/code-intelligence/coordinator-gnn.js +1 -62
- package/dist/domains/code-intelligence/coordinator.d.ts +12 -6
- package/dist/domains/code-intelligence/coordinator.js +24 -27
- package/dist/domains/code-intelligence/interfaces.d.ts +9 -0
- package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +4 -1
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +51 -5
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +144 -78
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +10 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +29 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +11 -3
- package/dist/domains/coverage-analysis/services/coverage-parser.d.ts +2 -0
- package/dist/domains/coverage-analysis/services/coverage-parser.js +18 -2
- package/dist/domains/quality-assessment/coherence/gate-controller.js +16 -4
- package/dist/domains/quality-assessment/coherence/lambda-calculator.d.ts +8 -0
- package/dist/domains/quality-assessment/coherence/lambda-calculator.js +57 -14
- package/dist/domains/quality-assessment/coherence/types.d.ts +12 -7
- package/dist/domains/quality-assessment/coordinator-gate-evaluation.js +3 -1
- package/dist/domains/quality-assessment/coordinator-reports.d.ts +30 -10
- package/dist/domains/quality-assessment/coordinator-reports.js +93 -57
- package/dist/domains/quality-assessment/coordinator.d.ts +14 -40
- package/dist/domains/quality-assessment/coordinator.js +10 -4
- package/dist/domains/quality-assessment/interfaces.d.ts +2 -0
- package/dist/domains/quality-assessment/services/coherence-gate.js +15 -2
- package/dist/domains/quality-assessment/services/quality-gate.js +6 -4
- package/dist/domains/security-compliance/index.d.ts +1 -1
- package/dist/domains/security-compliance/interfaces.d.ts +46 -5
- package/dist/domains/security-compliance/services/scanners/dast-auth-testing.d.ts +3 -3
- package/dist/domains/security-compliance/services/scanners/dast-auth-testing.js +15 -14
- package/dist/domains/security-compliance/services/scanners/dast-helpers.d.ts +8 -9
- package/dist/domains/security-compliance/services/scanners/dast-helpers.js +19 -44
- package/dist/domains/security-compliance/services/scanners/dast-injection-testing.d.ts +3 -3
- package/dist/domains/security-compliance/services/scanners/dast-injection-testing.js +13 -9
- package/dist/domains/security-compliance/services/scanners/dast-requests.d.ts +54 -0
- package/dist/domains/security-compliance/services/scanners/dast-requests.js +125 -0
- package/dist/domains/security-compliance/services/scanners/dast-scanner.d.ts +5 -1
- package/dist/domains/security-compliance/services/scanners/dast-scanner.js +125 -155
- package/dist/domains/security-compliance/services/scanners/index.d.ts +1 -1
- package/dist/domains/security-compliance/services/scanners/index.js +1 -1
- package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +2 -2
- package/dist/domains/security-compliance/services/security-auditor-dast.js +183 -212
- package/dist/domains/security-compliance/services/security-auditor-reports.js +5 -1
- package/dist/domains/security-compliance/services/security-auditor.d.ts +11 -3
- package/dist/domains/security-compliance/services/security-auditor.js +106 -65
- package/dist/domains/test-execution/coordinator.d.ts +2 -1
- package/dist/domains/test-execution/coordinator.js +33 -27
- package/dist/domains/test-execution/interfaces.d.ts +5 -0
- package/dist/domains/test-execution/services/test-executor.d.ts +6 -0
- package/dist/domains/test-execution/services/test-executor.js +16 -4
- package/dist/domains/visual-accessibility/coordinator.js +34 -9
- package/dist/domains/visual-accessibility/interfaces.d.ts +27 -0
- package/dist/domains/visual-accessibility/plugin.js +5 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.d.ts +13 -21
- package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.js +13 -297
- package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +13 -5
- package/dist/domains/visual-accessibility/services/accessibility-tester.js +96 -73
- 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/integrations/embeddings/index/HNSWIndex.js +8 -4
- package/dist/integrations/ruvector/transfer-coherence-stub.js +5 -10
- 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 +509 -497
- 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.d.ts +8 -0
- package/dist/mcp/handlers/domain-handler-configs.js +14 -2
- package/dist/mcp/handlers/handler-factory.js +3 -0
- package/dist/mcp/handlers/model-route-handlers.d.ts +107 -0
- package/dist/mcp/handlers/model-route-handlers.js +139 -0
- package/dist/mcp/handlers/orchestrate-routes.d.ts +6 -1
- package/dist/mcp/handlers/orchestrate-routes.js +94 -3
- package/dist/mcp/handlers/task-handlers.d.ts +3 -242
- package/dist/mcp/handlers/task-handlers.js +11 -788
- package/dist/mcp/handlers/task-inference.d.ts +26 -0
- package/dist/mcp/handlers/task-inference.js +156 -0
- package/dist/mcp/handlers/task-learning-handlers.d.ts +92 -0
- package/dist/mcp/handlers/task-learning-handlers.js +230 -0
- package/dist/mcp/handlers/task-orchestrate-handler.d.ts +73 -0
- package/dist/mcp/handlers/task-orchestrate-handler.js +361 -0
- package/dist/mcp/protocol-server.js +15 -2
- package/dist/mcp/services/reasoning-bank-service.d.ts +6 -1
- package/dist/mcp/services/reasoning-bank-service.js +9 -0
- package/dist/mcp/tools/code-intelligence/analyze.js +3 -6
- package/dist/mcp/tools/coverage-analysis/index.d.ts +4 -0
- package/dist/mcp/tools/coverage-analysis/index.js +8 -2
- package/dist/mcp/tools/visual-accessibility/index.d.ts +7 -0
- package/dist/mcp/tools/visual-accessibility/index.js +29 -13
- package/dist/mcp/types.d.ts +14 -0
- package/dist/routing/advisor/redaction.js +22 -2
- package/dist/shared/events/domain-events.d.ts +2 -0
- package/dist/shared/llm/providers/response-deadline.js +16 -2
- package/dist/shared/metrics/code-metrics.js +21 -3
- package/dist/shared/parsers/typescript-parser.d.ts +6 -0
- package/dist/shared/parsers/typescript-parser.js +13 -1
- 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-H43AFUKL.js +0 -2
- 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-K2HBNYAZ.js +0 -62
- 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/domain-transfer-DOBI67K6.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-handler-TFKVUTNF.js +0 -60
- 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
|
@@ -6,6 +6,11 @@ import { Result } from '../../../shared/types';
|
|
|
6
6
|
import { MemoryBackend } from '../../../kernel/interfaces';
|
|
7
7
|
import { NomicEmbedderConfig, IEmbeddingProvider } from '../../../shared/embeddings';
|
|
8
8
|
import { SearchRequest, SearchResults, SearchResult } from '../interfaces';
|
|
9
|
+
/**
|
|
10
|
+
* #1224: the message for a search over an empty index. "No results" is only
|
|
11
|
+
* reported after searching an index that holds code.
|
|
12
|
+
*/
|
|
13
|
+
export declare const NOTHING_INDEXED_FOR_SEARCH: string;
|
|
9
14
|
/**
|
|
10
15
|
* Interface for the semantic analyzer service
|
|
11
16
|
*/
|
|
@@ -18,7 +23,10 @@ export interface ISemanticAnalyzerService {
|
|
|
18
23
|
findSimilar(code: string, limit?: number): Promise<Result<SearchResult[], Error>>;
|
|
19
24
|
/** Analyze code semantics */
|
|
20
25
|
analyze(code: string): Promise<Result<SemanticAnalysis, Error>>;
|
|
21
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* Get code embeddings. Throws when no embedding model is available: no
|
|
28
|
+
* pseudo-embedding is substituted (ADR-097).
|
|
29
|
+
*/
|
|
22
30
|
getEmbedding(code: string): Promise<number[]>;
|
|
23
31
|
}
|
|
24
32
|
/**
|
|
@@ -56,8 +64,15 @@ export interface HalsteadMetrics {
|
|
|
56
64
|
export interface SemanticAnalyzerConfig {
|
|
57
65
|
/** Embedding vector dimension (384 for all-MiniLM-L6-v2) */
|
|
58
66
|
embeddingDimension: number;
|
|
59
|
-
/** Minimum
|
|
67
|
+
/** Minimum word-overlap score for fuzzy and text-only matches */
|
|
60
68
|
minScore: number;
|
|
69
|
+
/**
|
|
70
|
+
* #1224: minimum cosine similarity for vector hits. Sentence-embedding
|
|
71
|
+
* models score a relevant file well below 0.5 (all-MiniLM-L6-v2 gave 0.37
|
|
72
|
+
* for "login" against a login function), so the text threshold would hide
|
|
73
|
+
* every vector hit.
|
|
74
|
+
*/
|
|
75
|
+
minVectorScore: number;
|
|
61
76
|
/** Maximum search results */
|
|
62
77
|
maxResults: number;
|
|
63
78
|
/** Storage namespace */
|
|
@@ -84,6 +99,8 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
|
|
|
84
99
|
private readonly analysisCache;
|
|
85
100
|
private embedder;
|
|
86
101
|
private embedderInitialized;
|
|
102
|
+
/** #1224: why no embedder is in use, once initialization has run. */
|
|
103
|
+
private embedderUnavailableReason;
|
|
87
104
|
constructor(memory: MemoryBackend, config?: Partial<SemanticAnalyzerConfig>);
|
|
88
105
|
/**
|
|
89
106
|
* Initialize the Nomic embedder lazily
|
|
@@ -106,15 +123,31 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
|
|
|
106
123
|
*/
|
|
107
124
|
analyze(code: string): Promise<Result<SemanticAnalysis, Error>>;
|
|
108
125
|
/**
|
|
109
|
-
* Get embedding vector for code
|
|
110
|
-
* Uses Nomic embeddings via Ollama
|
|
126
|
+
* Get embedding vector for code.
|
|
127
|
+
* Uses Nomic embeddings via Ollama (or the injected provider). Throws when
|
|
128
|
+
* neither is available: no pseudo-embedding is substituted (#1224, ADR-097).
|
|
111
129
|
*/
|
|
112
130
|
getEmbedding(code: string): Promise<number[]>;
|
|
113
131
|
/**
|
|
114
132
|
* Check if using real Nomic embeddings
|
|
115
133
|
*/
|
|
116
134
|
isUsingNomicEmbeddings(): boolean;
|
|
135
|
+
/** #1224: embed `text`, or say why no real embedding is available. */
|
|
136
|
+
private tryEmbed;
|
|
137
|
+
/** Identifies the model behind stored vectors, so vectors from another model are not compared. */
|
|
138
|
+
private embeddingModelId;
|
|
139
|
+
private isCurrentModelVector;
|
|
140
|
+
private vectorKeyPrefix;
|
|
141
|
+
private contentKeyPattern;
|
|
142
|
+
/**
|
|
143
|
+
* #1224: vector search when an embedding model is available. Otherwise (or
|
|
144
|
+
* when no indexed file has a vector from that model) it matches query words
|
|
145
|
+
* against the indexed text and says so through `lexicalOnlyReason`; no
|
|
146
|
+
* similarity is invented for those hits.
|
|
147
|
+
*/
|
|
117
148
|
private semanticSearch;
|
|
149
|
+
/** Word-overlap matching for a semantic query when no vectors can be used. */
|
|
150
|
+
private lexicalSearch;
|
|
118
151
|
private exactSearch;
|
|
119
152
|
private fuzzySearch;
|
|
120
153
|
private extractConcepts;
|
|
@@ -122,11 +155,16 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
|
|
|
122
155
|
private calculateComplexity;
|
|
123
156
|
private extractDependencies;
|
|
124
157
|
private generateSuggestions;
|
|
125
|
-
private generateCodeEmbedding;
|
|
126
158
|
private extractCodeMetadata;
|
|
127
159
|
private detectLanguage;
|
|
128
160
|
private tokenize;
|
|
129
161
|
private calculateFuzzyScore;
|
|
162
|
+
/**
|
|
163
|
+
* A content token matches a query token it contains, or that contains it.
|
|
164
|
+
* #1224: the second direction needs a content token of 3+ characters, so a
|
|
165
|
+
* one-letter variable such as `i` does not match the query "login".
|
|
166
|
+
*/
|
|
167
|
+
private tokensMatch;
|
|
130
168
|
private matchesFilters;
|
|
131
169
|
private extractSnippet;
|
|
132
170
|
private extractSnippetAround;
|
|
@@ -134,6 +172,14 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
|
|
|
134
172
|
private findHighlights;
|
|
135
173
|
private findSemanticHighlights;
|
|
136
174
|
private fileToKey;
|
|
175
|
+
/**
|
|
176
|
+
* Content identity for the analysis and embedding caches.
|
|
177
|
+
*
|
|
178
|
+
* This keys cache entries, so it has to separate any two distinct inputs.
|
|
179
|
+
* A 31-multiplier 32-bit hash does not: for any shared prefix and suffix,
|
|
180
|
+
* "Aa" and "BB" collide, so two different functions would share one entry
|
|
181
|
+
* and the second caller would receive the first one's result.
|
|
182
|
+
*/
|
|
137
183
|
private hashCode;
|
|
138
184
|
private cacheEmbedding;
|
|
139
185
|
private cacheAnalysis;
|
|
@@ -2,12 +2,22 @@
|
|
|
2
2
|
* Agentic QE v3 - Semantic Analyzer Service
|
|
3
3
|
* Semantic code analysis using vector embeddings and HNSW search
|
|
4
4
|
*/
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
5
6
|
import { ok, err } from '../../../shared/types/index.js';
|
|
6
7
|
import { NomicEmbedder, EMBEDDING_CONFIG, } from '../../../shared/embeddings/index.js';
|
|
7
8
|
import { toError } from '../../../shared/error-utils.js';
|
|
9
|
+
/**
|
|
10
|
+
* #1224: the message for a search over an empty index. "No results" is only
|
|
11
|
+
* reported after searching an index that holds code.
|
|
12
|
+
*/
|
|
13
|
+
export const NOTHING_INDEXED_FOR_SEARCH = 'No code is indexed for search yet, so the search was not run. ' +
|
|
14
|
+
'Index the project first (MCP code_index, or `aqe code index <path>`), then search again.';
|
|
15
|
+
/** Upper bound on indexed files one exact/fuzzy search reads. */
|
|
16
|
+
const MAX_INDEXED_FILES_SCANNED = 100_000;
|
|
8
17
|
const DEFAULT_CONFIG = {
|
|
9
18
|
embeddingDimension: EMBEDDING_CONFIG.DIMENSIONS, // 384 for all-MiniLM-L6-v2
|
|
10
19
|
minScore: 0.5,
|
|
20
|
+
minVectorScore: 0.3,
|
|
11
21
|
maxResults: 100,
|
|
12
22
|
namespace: 'code-intelligence:semantic',
|
|
13
23
|
enableCaching: true,
|
|
@@ -25,6 +35,8 @@ export class SemanticAnalyzerService {
|
|
|
25
35
|
analysisCache = new Map();
|
|
26
36
|
embedder = null;
|
|
27
37
|
embedderInitialized = false;
|
|
38
|
+
/** #1224: why no embedder is in use, once initialization has run. */
|
|
39
|
+
embedderUnavailableReason = null;
|
|
28
40
|
constructor(memory, config = {}) {
|
|
29
41
|
this.memory = memory;
|
|
30
42
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
@@ -42,9 +54,11 @@ export class SemanticAnalyzerService {
|
|
|
42
54
|
return;
|
|
43
55
|
}
|
|
44
56
|
if (this.config.useNomicEmbeddings) {
|
|
57
|
+
// #1224: no pseudo-embedding fallback. A failed embed throws, and the
|
|
58
|
+
// search reports itself as lexical-only instead.
|
|
45
59
|
const nomicEmbedder = new NomicEmbedder({
|
|
46
|
-
enableFallback: true,
|
|
47
60
|
...this.config.nomicConfig,
|
|
61
|
+
enableFallback: false,
|
|
48
62
|
});
|
|
49
63
|
// Check if Ollama is available
|
|
50
64
|
const isAvailable = await nomicEmbedder.healthCheck();
|
|
@@ -54,6 +68,13 @@ export class SemanticAnalyzerService {
|
|
|
54
68
|
this.config.embeddingDimension =
|
|
55
69
|
EMBEDDING_CONFIG.DIMENSIONS;
|
|
56
70
|
}
|
|
71
|
+
else {
|
|
72
|
+
this.embedderUnavailableReason =
|
|
73
|
+
`no embedding model available (Ollama model '${EMBEDDING_CONFIG.MODEL}' is not reachable)`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.embedderUnavailableReason = 'embeddings are disabled for code search';
|
|
57
78
|
}
|
|
58
79
|
this.embedderInitialized = true;
|
|
59
80
|
}
|
|
@@ -64,11 +85,23 @@ export class SemanticAnalyzerService {
|
|
|
64
85
|
const startTime = Date.now();
|
|
65
86
|
try {
|
|
66
87
|
const { query, type, scope, limit = this.config.maxResults, filters } = request;
|
|
88
|
+
if (type !== 'semantic' && type !== 'exact' && type !== 'fuzzy') {
|
|
89
|
+
return err(new Error(`Unknown search type: ${type}`));
|
|
90
|
+
}
|
|
91
|
+
// #1224: an empty answer from an empty index is not "no results".
|
|
92
|
+
const indexed = await this.memory.search(this.contentKeyPattern(), 1);
|
|
93
|
+
if (indexed.length === 0) {
|
|
94
|
+
return err(new Error(NOTHING_INDEXED_FOR_SEARCH));
|
|
95
|
+
}
|
|
67
96
|
let results;
|
|
97
|
+
let lexicalOnlyReason;
|
|
68
98
|
switch (type) {
|
|
69
|
-
case 'semantic':
|
|
70
|
-
|
|
99
|
+
case 'semantic': {
|
|
100
|
+
const semantic = await this.semanticSearch(query, limit, scope, filters);
|
|
101
|
+
results = semantic.results;
|
|
102
|
+
lexicalOnlyReason = semantic.lexicalOnlyReason;
|
|
71
103
|
break;
|
|
104
|
+
}
|
|
72
105
|
case 'exact':
|
|
73
106
|
results = await this.exactSearch(query, limit, scope, filters);
|
|
74
107
|
break;
|
|
@@ -83,6 +116,11 @@ export class SemanticAnalyzerService {
|
|
|
83
116
|
results,
|
|
84
117
|
total: results.length,
|
|
85
118
|
searchTime,
|
|
119
|
+
...(type === 'semantic'
|
|
120
|
+
? lexicalOnlyReason === undefined
|
|
121
|
+
? { mode: 'vector' }
|
|
122
|
+
: { mode: 'lexical-only', reason: lexicalOnlyReason }
|
|
123
|
+
: {}),
|
|
86
124
|
});
|
|
87
125
|
}
|
|
88
126
|
catch (error) {
|
|
@@ -94,17 +132,20 @@ export class SemanticAnalyzerService {
|
|
|
94
132
|
*/
|
|
95
133
|
async indexCode(file, content) {
|
|
96
134
|
try {
|
|
97
|
-
// Generate embedding for the code
|
|
98
|
-
const embedding = await this.getEmbedding(content);
|
|
99
135
|
// Extract code metadata
|
|
100
136
|
const metadata = this.extractCodeMetadata(file, content);
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
await this.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
137
|
+
// #1224: store a vector only when a real embedding model produced one;
|
|
138
|
+
// without it the file is still searchable by text.
|
|
139
|
+
const embedded = await this.tryEmbed(content);
|
|
140
|
+
if (embedded.vector) {
|
|
141
|
+
const key = `${this.vectorKeyPrefix()}${this.fileToKey(file)}`;
|
|
142
|
+
await this.memory.storeVector(key, embedded.vector, {
|
|
143
|
+
file,
|
|
144
|
+
...metadata,
|
|
145
|
+
embeddingModel: this.embeddingModelId(),
|
|
146
|
+
indexedAt: new Date().toISOString(),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
108
149
|
// Store content for retrieval.
|
|
109
150
|
// The key is already fully namespace-qualified, so do NOT also pass a
|
|
110
151
|
// {namespace} store option: every read path (semanticSearch/findSimilar/
|
|
@@ -125,13 +166,13 @@ export class SemanticAnalyzerService {
|
|
|
125
166
|
async findSimilar(code, limit = 10) {
|
|
126
167
|
try {
|
|
127
168
|
const embedding = await this.getEmbedding(code);
|
|
128
|
-
const vectorResults = await this.memory.vectorSearch(embedding, limit);
|
|
169
|
+
const vectorResults = await this.memory.vectorSearch(embedding, limit, this.vectorKeyPrefix());
|
|
129
170
|
const results = [];
|
|
130
171
|
for (const vr of vectorResults) {
|
|
131
|
-
if (vr.score < this.config.
|
|
172
|
+
if (vr.score < this.config.minVectorScore)
|
|
132
173
|
continue;
|
|
133
174
|
const metadata = vr.metadata;
|
|
134
|
-
if (!metadata?.file)
|
|
175
|
+
if (!metadata?.file || !this.isCurrentModelVector(metadata))
|
|
135
176
|
continue;
|
|
136
177
|
const contentKey = `${this.config.namespace}:content:${this.fileToKey(metadata.file)}`;
|
|
137
178
|
const stored = await this.memory.get(contentKey);
|
|
@@ -189,8 +230,9 @@ export class SemanticAnalyzerService {
|
|
|
189
230
|
}
|
|
190
231
|
}
|
|
191
232
|
/**
|
|
192
|
-
* Get embedding vector for code
|
|
193
|
-
* Uses Nomic embeddings via Ollama
|
|
233
|
+
* Get embedding vector for code.
|
|
234
|
+
* Uses Nomic embeddings via Ollama (or the injected provider). Throws when
|
|
235
|
+
* neither is available: no pseudo-embedding is substituted (#1224, ADR-097).
|
|
194
236
|
*/
|
|
195
237
|
async getEmbedding(code) {
|
|
196
238
|
// Check cache
|
|
@@ -200,15 +242,10 @@ export class SemanticAnalyzerService {
|
|
|
200
242
|
}
|
|
201
243
|
// Initialize embedder lazily
|
|
202
244
|
await this.initializeEmbedder();
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
if (this.embedder) {
|
|
206
|
-
embedding = await this.embedder.embed(code);
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
// Fallback to pseudo-embedding when Ollama is not available
|
|
210
|
-
embedding = this.generateCodeEmbedding(code);
|
|
245
|
+
if (!this.embedder) {
|
|
246
|
+
throw new Error(`Code embeddings unavailable: ${this.embedderUnavailableReason ?? 'no embedding model'}`);
|
|
211
247
|
}
|
|
248
|
+
const embedding = await this.embedder.embed(code);
|
|
212
249
|
// Cache result
|
|
213
250
|
if (this.config.enableCaching) {
|
|
214
251
|
this.cacheEmbedding(cacheKey, embedding);
|
|
@@ -221,22 +258,67 @@ export class SemanticAnalyzerService {
|
|
|
221
258
|
isUsingNomicEmbeddings() {
|
|
222
259
|
return this.embedder !== null && this.embedder instanceof NomicEmbedder;
|
|
223
260
|
}
|
|
261
|
+
/** #1224: embed `text`, or say why no real embedding is available. */
|
|
262
|
+
async tryEmbed(text) {
|
|
263
|
+
await this.initializeEmbedder();
|
|
264
|
+
if (!this.embedder) {
|
|
265
|
+
return { reason: this.embedderUnavailableReason ?? 'no embedding model available' };
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
return { vector: await this.getEmbedding(text) };
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
return { reason: `the embedding model failed: ${toError(error).message}` };
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/** Identifies the model behind stored vectors, so vectors from another model are not compared. */
|
|
275
|
+
embeddingModelId() {
|
|
276
|
+
return this.embedder instanceof NomicEmbedder ? EMBEDDING_CONFIG.MODEL : 'injected-provider';
|
|
277
|
+
}
|
|
278
|
+
isCurrentModelVector(metadata) {
|
|
279
|
+
return metadata.embeddingModel === this.embeddingModelId();
|
|
280
|
+
}
|
|
281
|
+
vectorKeyPrefix() {
|
|
282
|
+
return `${this.config.namespace}:code:`;
|
|
283
|
+
}
|
|
284
|
+
contentKeyPattern() {
|
|
285
|
+
return `${this.config.namespace}:content:*`;
|
|
286
|
+
}
|
|
224
287
|
// ============================================================================
|
|
225
288
|
// Private Search Methods
|
|
226
289
|
// ============================================================================
|
|
290
|
+
/**
|
|
291
|
+
* #1224: vector search when an embedding model is available. Otherwise (or
|
|
292
|
+
* when no indexed file has a vector from that model) it matches query words
|
|
293
|
+
* against the indexed text and says so through `lexicalOnlyReason`; no
|
|
294
|
+
* similarity is invented for those hits.
|
|
295
|
+
*/
|
|
227
296
|
async semanticSearch(query, limit, scope, filters) {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
297
|
+
const embedded = await this.tryEmbed(query);
|
|
298
|
+
if (!embedded.vector) {
|
|
299
|
+
return {
|
|
300
|
+
results: await this.lexicalSearch(query, limit, scope, filters),
|
|
301
|
+
lexicalOnlyReason: embedded.reason,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
// Only this namespace's vectors, from the model that embedded the query.
|
|
305
|
+
const vectorResults = (await this.memory.vectorSearch(embedded.vector, limit * 2, this.vectorKeyPrefix()))
|
|
306
|
+
.filter((vr) => {
|
|
307
|
+
const metadata = vr.metadata;
|
|
308
|
+
return !!metadata?.file && this.isCurrentModelVector(metadata);
|
|
309
|
+
});
|
|
310
|
+
if (vectorResults.length === 0) {
|
|
311
|
+
return {
|
|
312
|
+
results: await this.lexicalSearch(query, limit, scope, filters),
|
|
313
|
+
lexicalOnlyReason: `no indexed file has an embedding from ${this.embeddingModelId()}; re-index to enable vector search`,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
232
316
|
// Convert to search results with filtering
|
|
233
317
|
const results = [];
|
|
234
318
|
for (const vr of vectorResults) {
|
|
235
|
-
if (vr.score < this.config.
|
|
319
|
+
if (vr.score < this.config.minVectorScore)
|
|
236
320
|
continue;
|
|
237
321
|
const metadata = vr.metadata;
|
|
238
|
-
if (!metadata?.file)
|
|
239
|
-
continue;
|
|
240
322
|
// Apply scope filter
|
|
241
323
|
if (scope && scope.length > 0) {
|
|
242
324
|
const matchesScope = scope.some((s) => metadata.file.includes(s));
|
|
@@ -257,17 +339,23 @@ export class SemanticAnalyzerService {
|
|
|
257
339
|
score: vr.score,
|
|
258
340
|
highlights: this.findSemanticHighlights(stored.content, query),
|
|
259
341
|
metadata: stored.metadata,
|
|
342
|
+
matchType: 'vector',
|
|
260
343
|
});
|
|
261
344
|
if (results.length >= limit)
|
|
262
345
|
break;
|
|
263
346
|
}
|
|
264
347
|
}
|
|
265
|
-
return results;
|
|
348
|
+
return { results };
|
|
349
|
+
}
|
|
350
|
+
/** Word-overlap matching for a semantic query when no vectors can be used. */
|
|
351
|
+
async lexicalSearch(query, limit, scope, filters) {
|
|
352
|
+
const hits = await this.fuzzySearch(query, limit, scope, filters);
|
|
353
|
+
return hits.map((hit) => ({ ...hit, matchType: 'lexical' }));
|
|
266
354
|
}
|
|
267
355
|
async exactSearch(query, limit, scope, filters) {
|
|
268
356
|
const results = [];
|
|
269
|
-
|
|
270
|
-
const keys = await this.memory.search(
|
|
357
|
+
// #1224: scan every indexed file; a cap here hid matches in later files.
|
|
358
|
+
const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
|
|
271
359
|
for (const key of keys) {
|
|
272
360
|
const stored = await this.memory.get(key);
|
|
273
361
|
if (!stored)
|
|
@@ -302,8 +390,7 @@ export class SemanticAnalyzerService {
|
|
|
302
390
|
}
|
|
303
391
|
async fuzzySearch(query, limit, scope, filters) {
|
|
304
392
|
const results = [];
|
|
305
|
-
const
|
|
306
|
-
const keys = await this.memory.search(pattern, limit * 5);
|
|
393
|
+
const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
|
|
307
394
|
const queryTokens = this.tokenize(query.toLowerCase());
|
|
308
395
|
for (const key of keys) {
|
|
309
396
|
const stored = await this.memory.get(key);
|
|
@@ -323,7 +410,7 @@ export class SemanticAnalyzerService {
|
|
|
323
410
|
const contentTokens = this.tokenize(stored.content.toLowerCase());
|
|
324
411
|
const score = this.calculateFuzzyScore(queryTokens, contentTokens);
|
|
325
412
|
if (score >= this.config.minScore) {
|
|
326
|
-
const matchedTokens = queryTokens.filter((t) => contentTokens.some((ct) =>
|
|
413
|
+
const matchedTokens = queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct)));
|
|
327
414
|
results.push({
|
|
328
415
|
file: stored.file,
|
|
329
416
|
snippet: this.extractSnippet(stored.content, 200),
|
|
@@ -499,38 +586,6 @@ export class SemanticAnalyzerService {
|
|
|
499
586
|
// ============================================================================
|
|
500
587
|
// Private Helper Methods
|
|
501
588
|
// ============================================================================
|
|
502
|
-
generateCodeEmbedding(code) {
|
|
503
|
-
// Fallback: Generate a pseudo-embedding based on code features
|
|
504
|
-
// Used when Ollama/Nomic is not available
|
|
505
|
-
const embedding = new Array(this.config.embeddingDimension).fill(0);
|
|
506
|
-
// Extract tokens and features
|
|
507
|
-
const tokens = this.tokenize(code);
|
|
508
|
-
const concepts = this.extractConcepts(code);
|
|
509
|
-
// Combine token-based and concept-based features
|
|
510
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
511
|
-
const token = tokens[i];
|
|
512
|
-
for (let j = 0; j < token.length && j < embedding.length; j++) {
|
|
513
|
-
embedding[(i + j) % embedding.length] += token.charCodeAt(j) / 1000;
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
// Add concept signals
|
|
517
|
-
const conceptIndex = new Map([
|
|
518
|
-
['object-oriented', 0],
|
|
519
|
-
['asynchronous', 1],
|
|
520
|
-
['functional', 2],
|
|
521
|
-
['type-safe', 3],
|
|
522
|
-
['modular', 4],
|
|
523
|
-
]);
|
|
524
|
-
for (const concept of concepts) {
|
|
525
|
-
const idx = conceptIndex.get(concept);
|
|
526
|
-
if (idx !== undefined) {
|
|
527
|
-
embedding[idx] += 0.5;
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
// Normalize
|
|
531
|
-
const magnitude = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0)) || 1;
|
|
532
|
-
return embedding.map((v) => v / magnitude);
|
|
533
|
-
}
|
|
534
589
|
extractCodeMetadata(file, content) {
|
|
535
590
|
return {
|
|
536
591
|
language: this.detectLanguage(file),
|
|
@@ -563,12 +618,21 @@ export class SemanticAnalyzerService {
|
|
|
563
618
|
return 0;
|
|
564
619
|
let matches = 0;
|
|
565
620
|
for (const qt of queryTokens) {
|
|
566
|
-
if (contentTokens.some((ct) =>
|
|
621
|
+
if (contentTokens.some((ct) => this.tokensMatch(qt, ct))) {
|
|
567
622
|
matches++;
|
|
568
623
|
}
|
|
569
624
|
}
|
|
570
625
|
return matches / queryTokens.length;
|
|
571
626
|
}
|
|
627
|
+
/**
|
|
628
|
+
* A content token matches a query token it contains, or that contains it.
|
|
629
|
+
* #1224: the second direction needs a content token of 3+ characters, so a
|
|
630
|
+
* one-letter variable such as `i` does not match the query "login".
|
|
631
|
+
*/
|
|
632
|
+
tokensMatch(queryToken, contentToken) {
|
|
633
|
+
return contentToken.includes(queryToken) ||
|
|
634
|
+
(contentToken.length >= 3 && queryToken.includes(contentToken));
|
|
635
|
+
}
|
|
572
636
|
matchesFilters(metadata, filters) {
|
|
573
637
|
for (const filter of filters) {
|
|
574
638
|
const value = metadata[filter.field];
|
|
@@ -635,14 +699,16 @@ export class SemanticAnalyzerService {
|
|
|
635
699
|
fileToKey(file) {
|
|
636
700
|
return file.replace(/[/\\]/g, ':').replace(/\./g, '_');
|
|
637
701
|
}
|
|
702
|
+
/**
|
|
703
|
+
* Content identity for the analysis and embedding caches.
|
|
704
|
+
*
|
|
705
|
+
* This keys cache entries, so it has to separate any two distinct inputs.
|
|
706
|
+
* A 31-multiplier 32-bit hash does not: for any shared prefix and suffix,
|
|
707
|
+
* "Aa" and "BB" collide, so two different functions would share one entry
|
|
708
|
+
* and the second caller would receive the first one's result.
|
|
709
|
+
*/
|
|
638
710
|
hashCode(str) {
|
|
639
|
-
|
|
640
|
-
for (let i = 0; i < str.length; i++) {
|
|
641
|
-
const char = str.charCodeAt(i);
|
|
642
|
-
hash = (hash << 5) - hash + char;
|
|
643
|
-
hash = hash & hash;
|
|
644
|
-
}
|
|
645
|
-
return hash.toString(16);
|
|
711
|
+
return createHash('sha256').update(str, 'utf8').digest('hex');
|
|
646
712
|
}
|
|
647
713
|
cacheEmbedding(key, embedding) {
|
|
648
714
|
if (this.embeddingCache.size >= this.config.cacheSize) {
|
|
@@ -14,6 +14,16 @@ import type { CoverageSummary, FileCoverage } from './interfaces';
|
|
|
14
14
|
* (or the cwd when none is known), so one file never has two records.
|
|
15
15
|
*/
|
|
16
16
|
export declare function fileCoverageKey(filePath: string, projectRoot?: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* #1030: the per-file record key of each path in ONE report, keyed by the
|
|
19
|
+
* path as the report wrote it. A path is left out when its record would not
|
|
20
|
+
* be a measurement of a project file: it resolves outside the project root
|
|
21
|
+
* (lcov `SF:../../outside.ts`), it is a Windows absolute path read on POSIX
|
|
22
|
+
* (it would resolve to a junk key), or the report lists the same file under
|
|
23
|
+
* two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
|
|
24
|
+
* unknown.
|
|
25
|
+
*/
|
|
26
|
+
export declare function projectFileCoverageKeys(paths: readonly string[], projectRoot?: string): Map<string, string>;
|
|
17
27
|
/** Read the canonical key first, then a measured legacy relative key if present. */
|
|
18
28
|
export declare function fileCoverageLookupKeys(filePath: string, projectRoot?: string): string[];
|
|
19
29
|
export interface CollectedMetrics {
|
|
@@ -17,6 +17,35 @@ import { findProjectRoot } from '../../kernel/project-root.js';
|
|
|
17
17
|
export function fileCoverageKey(filePath, projectRoot) {
|
|
18
18
|
return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ?? findProjectRoot(), filePath);
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* #1030: the per-file record key of each path in ONE report, keyed by the
|
|
22
|
+
* path as the report wrote it. A path is left out when its record would not
|
|
23
|
+
* be a measurement of a project file: it resolves outside the project root
|
|
24
|
+
* (lcov `SF:../../outside.ts`), it is a Windows absolute path read on POSIX
|
|
25
|
+
* (it would resolve to a junk key), or the report lists the same file under
|
|
26
|
+
* two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
|
|
27
|
+
* unknown.
|
|
28
|
+
*/
|
|
29
|
+
export function projectFileCoverageKeys(paths, projectRoot) {
|
|
30
|
+
const root = path.resolve(projectRoot ?? findProjectRoot());
|
|
31
|
+
const keys = new Map();
|
|
32
|
+
const spellings = new Map();
|
|
33
|
+
for (const filePath of paths) {
|
|
34
|
+
if (!path.isAbsolute(filePath) && path.win32.isAbsolute(filePath))
|
|
35
|
+
continue;
|
|
36
|
+
const key = fileCoverageKey(filePath, root);
|
|
37
|
+
const relative = path.relative(root, key);
|
|
38
|
+
if (relative === '' || relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
|
|
39
|
+
continue;
|
|
40
|
+
keys.set(filePath, key);
|
|
41
|
+
spellings.set(key, (spellings.get(key) ?? 0) + 1);
|
|
42
|
+
}
|
|
43
|
+
for (const [filePath, key] of keys) {
|
|
44
|
+
if ((spellings.get(key) ?? 0) > 1)
|
|
45
|
+
keys.delete(filePath);
|
|
46
|
+
}
|
|
47
|
+
return keys;
|
|
48
|
+
}
|
|
20
49
|
/** Read the canonical key first, then a measured legacy relative key if present. */
|
|
21
50
|
export function fileCoverageLookupKeys(filePath, projectRoot) {
|
|
22
51
|
const canonical = `coverage:file:${fileCoverageKey(filePath, projectRoot)}`;
|
|
@@ -11,7 +11,7 @@ import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
|
11
11
|
import { writeQualityEvidence, writeTestRunEvidence } from '../../quality-assessment/quality-evidence.js';
|
|
12
12
|
import { measuredCoverageSummary } from '../../quality-assessment/coverage-report-event.js';
|
|
13
13
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
14
|
-
import { collectedMetrics, collectedSummary,
|
|
14
|
+
import { collectedMetrics, collectedSummary, projectFileCoverageKeys } from '../collected-metrics.js';
|
|
15
15
|
/**
|
|
16
16
|
* Whether an analyze request carries instrumented (measured) coverage (#1008).
|
|
17
17
|
* Fail-closed: an explicit `request.measured` wins; otherwise only data a
|
|
@@ -510,7 +510,11 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
510
510
|
* (The vector index via storeVector is kept for similarity search.)
|
|
511
511
|
*/
|
|
512
512
|
async storeFileCoverageKV(files, projectRoot, runStatus) {
|
|
513
|
+
const keys = projectFileCoverageKeys(files.map(file => file.path), projectRoot);
|
|
513
514
|
for (const file of files) {
|
|
515
|
+
const key = keys.get(file.path);
|
|
516
|
+
if (!key)
|
|
517
|
+
continue;
|
|
514
518
|
try {
|
|
515
519
|
// #1014: a metric with no data is null (not collected), never 0%.
|
|
516
520
|
const pct = (m) => m.total > 0 ? Math.round((m.covered / m.total) * 10000) / 100 : null;
|
|
@@ -518,7 +522,7 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
518
522
|
continue;
|
|
519
523
|
// #1014: stamped, so readers can tell it from legacy unstamped
|
|
520
524
|
// estimate records written by <= 3.15.4.
|
|
521
|
-
await this.memory.set(`coverage:file:${
|
|
525
|
+
await this.memory.set(`coverage:file:${key}`, {
|
|
522
526
|
line: pct(file.lines),
|
|
523
527
|
branch: pct(file.branches),
|
|
524
528
|
function: pct(file.functions),
|
|
@@ -533,11 +537,15 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
533
537
|
}
|
|
534
538
|
}
|
|
535
539
|
async indexFileCoverageVectors(files, projectRoot) {
|
|
540
|
+
const keys = projectFileCoverageKeys(files.map(file => file.path), projectRoot);
|
|
536
541
|
for (const file of files) {
|
|
542
|
+
const key = keys.get(file.path);
|
|
543
|
+
if (!key)
|
|
544
|
+
continue;
|
|
537
545
|
try {
|
|
538
546
|
// Create a vector representation of the file coverage
|
|
539
547
|
const embedding = this.createCoverageEmbedding(file);
|
|
540
|
-
await this.memory.storeVector(`coverage:file:${
|
|
548
|
+
await this.memory.storeVector(`coverage:file:${key}`, embedding, {
|
|
541
549
|
path: file.path,
|
|
542
550
|
lineCoverage: file.lines.covered / (file.lines.total || 1),
|
|
543
551
|
branchCoverage: file.branches.covered / (file.branches.total || 1),
|
|
@@ -129,6 +129,8 @@ export interface CoverageReport {
|
|
|
129
129
|
files: Map<string, FileCoverageData>;
|
|
130
130
|
/** Summary statistics */
|
|
131
131
|
summary: CoverageSummary;
|
|
132
|
+
/** Parts of the report that could not be attributed and are not in `files` (#1232). */
|
|
133
|
+
warnings?: string[];
|
|
132
134
|
}
|
|
133
135
|
/**
|
|
134
136
|
* Summary statistics for entire coverage report
|
|
@@ -461,12 +461,20 @@ export function parseDotcoverContent(content, projectRoot) {
|
|
|
461
461
|
// Parse <Statement> elements to build per-file coverage
|
|
462
462
|
const stmtPattern = /<Statement\s+FileIndex="(\d+)"\s+Line="(\d+)"\s+Column="\d+"\s+EndLine="\d+"\s+EndColumn="\d+"\s+Covered="(\w+)"\s*\/>/g;
|
|
463
463
|
const fileData = new Map();
|
|
464
|
+
// #1232: statements whose FileIndex is not in the file table, by index; never named after a made-up file.
|
|
465
|
+
const unknownIndices = new Map();
|
|
466
|
+
let statementCount = 0;
|
|
464
467
|
let sm;
|
|
465
468
|
while ((sm = stmtPattern.exec(content)) !== null) {
|
|
469
|
+
statementCount++;
|
|
466
470
|
const fileIdx = sm[1];
|
|
467
471
|
const lineNum = parseInt(sm[2], 10);
|
|
468
472
|
const isCovered = sm[3] === 'True';
|
|
469
|
-
const filePath = fileIndex.get(fileIdx)
|
|
473
|
+
const filePath = fileIndex.get(fileIdx);
|
|
474
|
+
if (!filePath) {
|
|
475
|
+
unknownIndices.set(fileIdx, (unknownIndices.get(fileIdx) ?? 0) + 1);
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
470
478
|
if (!fileData.has(filePath)) {
|
|
471
479
|
fileData.set(filePath, { lineDetails: new Map(), total: 0, covered: 0 });
|
|
472
480
|
}
|
|
@@ -476,14 +484,21 @@ export function parseDotcoverContent(content, projectRoot) {
|
|
|
476
484
|
if (isCovered)
|
|
477
485
|
data.covered++;
|
|
478
486
|
}
|
|
487
|
+
const warnings = [];
|
|
488
|
+
if (unknownIndices.size > 0) {
|
|
489
|
+
const skipped = [...unknownIndices.values()].reduce((sum, n) => sum + n, 0);
|
|
490
|
+
warnings.push(`dotCover report references FileIndex ${[...unknownIndices.keys()].join(', ')} missing from its file table; ` +
|
|
491
|
+
`${skipped} statement(s) skipped and their coverage is not reported`);
|
|
492
|
+
}
|
|
479
493
|
// If no Statement elements found, parse from CoveredStatements/TotalStatements attributes
|
|
480
|
-
if (
|
|
494
|
+
if (statementCount === 0) {
|
|
481
495
|
const rootPattern = /CoveredStatements="(\d+)"\s+TotalStatements="(\d+)"/;
|
|
482
496
|
const rootMatch = rootPattern.exec(content);
|
|
483
497
|
if (rootMatch) {
|
|
484
498
|
const covered = parseInt(rootMatch[1], 10);
|
|
485
499
|
const total = parseInt(rootMatch[2], 10);
|
|
486
500
|
const filePath = path.join(projectRoot, 'aggregate');
|
|
501
|
+
warnings.push("dotCover report has no per-file statements; report totals are listed under 'aggregate', which is not a project file");
|
|
487
502
|
files.set(filePath, {
|
|
488
503
|
path: filePath,
|
|
489
504
|
relativePath: 'aggregate',
|
|
@@ -526,6 +541,7 @@ export function parseDotcoverContent(content, projectRoot) {
|
|
|
526
541
|
language: 'csharp',
|
|
527
542
|
files,
|
|
528
543
|
summary: calculateSummary(files),
|
|
544
|
+
...(warnings.length > 0 ? { warnings } : {}),
|
|
529
545
|
};
|
|
530
546
|
}
|
|
531
547
|
// ============================================================================
|