agentic-qe 3.15.15 → 3.15.16
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/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +90 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/audit/witness-chain.d.ts +7 -0
- package/dist/audit/witness-chain.js +10 -0
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-6CQ2PIP5.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-EUF4XVUC.js → agent-booster-wasm-45NWEKVS.js} +2 -2
- package/dist/cli/chunks/{agent-handler-MOX6PSIQ.js → agent-handler-LVHMYFEF.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-AEXKIGDG.js → agent-memory-branch-YDWOJFEQ.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +2 -0
- package/dist/cli/chunks/{arena-IQ5ZZDRF.js → arena-CZKHXDDS.js} +2 -2
- package/dist/cli/chunks/{arena-M7GA3CVG.js → arena-ELDZH3CZ.js} +4 -4
- package/dist/cli/chunks/{audit-4IPBMKWB.js → audit-5MT4T47Z.js} +3 -3
- package/dist/cli/chunks/base-SMCMMVGP.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-IKDKJ2IE.js → better-sqlite3-6TGYPC2B.js} +2 -2
- package/dist/cli/chunks/{brain-handler-5NQUDH4W.js → brain-handler-HQWZFO52.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-KSXELWRC.js → branch-enumerator-WVILM4SO.js} +2 -2
- package/dist/cli/chunks/{browser-6LACARWE.js → browser-RX5ALU3H.js} +2 -2
- package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +2 -0
- package/dist/cli/chunks/{chunk-SJCKCSN3.js → chunk-24OX5TQJ.js} +1 -1
- package/dist/cli/chunks/{chunk-J3FP5UGL.js → chunk-24QHCVX6.js} +1 -1
- package/dist/cli/chunks/{chunk-BZULJMGH.js → chunk-2H4XH6FT.js} +2 -2
- package/dist/cli/chunks/{chunk-E3MRDIZF.js → chunk-2YZ4G6NW.js} +1 -1
- package/dist/cli/chunks/chunk-32BPDLRZ.js +27 -0
- package/dist/cli/chunks/{chunk-76P32JVU.js → chunk-32GN3JKR.js} +1 -1
- package/dist/cli/chunks/{chunk-W62OOK7A.js → chunk-3HD7E6HN.js} +2 -2
- package/dist/cli/chunks/{chunk-AJPROCDW.js → chunk-4D4DENG6.js} +2 -2
- package/dist/cli/chunks/{chunk-PFQCV6YS.js → chunk-4LQFBY5L.js} +6 -6
- package/dist/cli/chunks/{chunk-4ATQP3PR.js → chunk-4NFQLP6R.js} +1 -1
- package/dist/cli/chunks/{chunk-WUOOX7UG.js → chunk-525CFDUE.js} +2 -2
- package/dist/cli/chunks/chunk-5B5QPCNU.js +65 -0
- package/dist/cli/chunks/{chunk-SON6ZRH3.js → chunk-5JZRZI4S.js} +2 -2
- package/dist/cli/chunks/{chunk-2ZFLULL4.js → chunk-5LAVKGLH.js} +2 -2
- package/dist/cli/chunks/chunk-5NNNEWLS.js +755 -0
- package/dist/cli/chunks/{chunk-JCZCJE6X.js → chunk-5PBLPQ5T.js} +2 -2
- package/dist/cli/chunks/chunk-5QO3R3TU.js +6 -0
- package/dist/cli/chunks/{chunk-EKP2SC77.js → chunk-5SPCGMBB.js} +2 -2
- package/dist/cli/chunks/{chunk-3J3RNJNX.js → chunk-5V3TI2LG.js} +1 -1
- package/dist/cli/chunks/{chunk-UAQZI6N4.js → chunk-5VZL4UVN.js} +2 -2
- package/dist/cli/chunks/{chunk-MIA447GY.js → chunk-63GMRQ25.js} +1 -1
- package/dist/cli/chunks/{chunk-TODNOP7C.js → chunk-63ZKI4PX.js} +6 -6
- package/dist/cli/chunks/{chunk-TZIHDJZD.js → chunk-67Z5R7RJ.js} +2 -2
- package/dist/cli/chunks/{chunk-WVXJ2QIG.js → chunk-6DPYNAOK.js} +2 -2
- package/dist/cli/chunks/{chunk-4HKAD25N.js → chunk-6ICX3FEG.js} +3 -3
- package/dist/cli/chunks/{chunk-BLL2XU7A.js → chunk-6XXZDV2C.js} +2 -2
- package/dist/cli/chunks/{chunk-R6LHJ7ME.js → chunk-6ZBXSOX6.js} +2 -2
- package/dist/cli/chunks/{chunk-5PTAFGJT.js → chunk-72XSEQMW.js} +2 -2
- package/dist/cli/chunks/{chunk-GKSMRBHU.js → chunk-7TE5ONQQ.js} +1 -1
- package/dist/cli/chunks/{chunk-UJABDXST.js → chunk-A5GBXCP5.js} +2 -2
- package/dist/cli/chunks/{chunk-22UKJGGN.js → chunk-AAMLQ2LF.js} +3 -3
- package/dist/cli/chunks/chunk-AG2EWGXS.js +21 -0
- package/dist/cli/chunks/{chunk-SZAZQZWI.js → chunk-AGRV5B3T.js} +2 -2
- package/dist/cli/chunks/{chunk-XH4JMX5O.js → chunk-AJMJNQMP.js} +1 -1
- package/dist/cli/chunks/{chunk-ZIPAB5J6.js → chunk-AR67RJPY.js} +2 -2
- package/dist/cli/chunks/{chunk-GGQGCT4Y.js → chunk-ASEOFRIG.js} +2 -2
- package/dist/cli/chunks/{chunk-AHMWD6JG.js → chunk-BEKDKVQT.js} +2 -2
- package/dist/cli/chunks/{chunk-W27AJ5B4.js → chunk-BY5OF7OH.js} +2 -2
- package/dist/cli/chunks/{chunk-T67R2MUN.js → chunk-C5FP5GW3.js} +2 -2
- package/dist/cli/chunks/{chunk-XHHWABJV.js → chunk-C6D5AHBO.js} +2 -2
- package/dist/cli/chunks/{chunk-PXATBHWN.js → chunk-CAKMOVZ6.js} +2 -2
- package/dist/cli/chunks/{chunk-337Z52QM.js → chunk-CEYSYSK5.js} +2 -2
- package/dist/cli/chunks/{chunk-KJBPB7P5.js → chunk-CGGUM2YJ.js} +2 -2
- package/dist/cli/chunks/{chunk-CAOUV5GZ.js → chunk-CJSHWQXP.js} +2 -2
- package/dist/cli/chunks/{chunk-GCHYOPRZ.js → chunk-CRPIYUTJ.js} +2 -2
- package/dist/cli/chunks/{chunk-RIRZHOS2.js → chunk-D6COXLYE.js} +2 -2
- package/dist/cli/chunks/{chunk-O6EWL5DQ.js → chunk-DTMAS2GB.js} +2 -2
- package/dist/cli/chunks/{chunk-XM6ZVFM5.js → chunk-DVYHMDFR.js} +470 -411
- package/dist/cli/chunks/chunk-DXD6K2ZP.js +3 -0
- package/dist/cli/chunks/{chunk-74YG72NQ.js → chunk-E3D4GPLP.js} +3 -3
- package/dist/cli/chunks/{chunk-KCQNFBBR.js → chunk-EA4YQVKS.js} +1 -1
- package/dist/cli/chunks/{chunk-4D4CWP72.js → chunk-EGYE5UPQ.js} +2 -2
- package/dist/cli/chunks/{chunk-DURD37JZ.js → chunk-EK7OLYOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-DKX4GNRU.js → chunk-F742SZAX.js} +2 -2
- package/dist/cli/chunks/{chunk-JCQGJGGZ.js → chunk-FBDVGRSC.js} +1 -1
- package/dist/cli/chunks/{chunk-LVABQNRF.js → chunk-FDDC72IA.js} +2 -2
- package/dist/cli/chunks/{chunk-5AFVEWMT.js → chunk-FL64OUBA.js} +2 -2
- package/dist/cli/chunks/{chunk-5I7357KS.js → chunk-FLNAW7C4.js} +2 -2
- package/dist/cli/chunks/{chunk-BQ47GQPK.js → chunk-G5RHFBAY.js} +2 -2
- package/dist/cli/chunks/{chunk-XIVVTYM2.js → chunk-GAHNO6JJ.js} +2 -2
- package/dist/cli/chunks/{chunk-X33CWRDF.js → chunk-GFWHUQSF.js} +2 -2
- package/dist/cli/chunks/{chunk-VMAM46HQ.js → chunk-GJYHWYXR.js} +2 -2
- package/dist/cli/chunks/{chunk-ZYJB6FML.js → chunk-GQ6TUIKY.js} +1 -1
- package/dist/cli/chunks/{chunk-E56PVVWC.js → chunk-GSKMOPL7.js} +2 -2
- package/dist/cli/chunks/{chunk-JUDUBQHA.js → chunk-HCH4Y6XX.js} +2 -2
- package/dist/cli/chunks/{chunk-QFGYH6HD.js → chunk-HGWXF45W.js} +1 -1
- package/dist/cli/chunks/{chunk-FTRSS64D.js → chunk-HJ6ZGVTB.js} +2 -2
- package/dist/cli/chunks/{chunk-6BRQPHMZ.js → chunk-HLUXXCHF.js} +1 -1
- package/dist/cli/chunks/{chunk-BP5T3OEV.js → chunk-HVRRLYX6.js} +4 -4
- package/dist/cli/chunks/{chunk-AOKKUB5F.js → chunk-I7MQIM2U.js} +1 -1
- package/dist/cli/chunks/{chunk-7XB3FCKM.js → chunk-IESR7TNB.js} +2 -2
- package/dist/cli/chunks/{chunk-OQG3UQQ7.js → chunk-IHRXZZQM.js} +1 -1
- package/dist/cli/chunks/{chunk-YUS6TWAL.js → chunk-IOKYCMTJ.js} +6 -6
- package/dist/cli/chunks/{chunk-ERN56H6S.js → chunk-IOQ6ZQ5W.js} +1 -1
- package/dist/cli/chunks/{chunk-GQABPCQE.js → chunk-IOYG4VFL.js} +2 -2
- package/dist/cli/chunks/{chunk-KLTMOXIK.js → chunk-IUBJVHNB.js} +2 -2
- package/dist/cli/chunks/{chunk-ZSOMUTNL.js → chunk-J442IZLE.js} +1 -1
- package/dist/cli/chunks/{chunk-G242G224.js → chunk-J4ELZNLY.js} +2 -2
- package/dist/cli/chunks/chunk-J7I6PABJ.js +153 -0
- package/dist/cli/chunks/chunk-JDIYMZCQ.js +2 -0
- package/dist/cli/chunks/{chunk-2IIXCEMS.js → chunk-JHQCRRJI.js} +2 -2
- package/dist/cli/chunks/{chunk-6LE362LZ.js → chunk-JQ3DYUMS.js} +2 -2
- package/dist/cli/chunks/{chunk-EFUJDMNC.js → chunk-KITOPKRG.js} +2 -2
- package/dist/cli/chunks/{chunk-M4CJCPCQ.js → chunk-KKU2QGSJ.js} +2 -2
- package/dist/cli/chunks/chunk-KL7OKSU2.js +4 -0
- package/dist/cli/chunks/{chunk-HL2ANKN3.js → chunk-KNSRL6NO.js} +2 -2
- package/dist/cli/chunks/{chunk-FOOW4JVS.js → chunk-KPRCB5LT.js} +2 -2
- package/dist/cli/chunks/{chunk-E5G4WZ2T.js → chunk-KQYJ4VQ5.js} +1 -1
- package/dist/cli/chunks/{chunk-RBKUU7WF.js → chunk-KU2AUFGX.js} +2 -2
- package/dist/cli/chunks/{chunk-UQPA33UK.js → chunk-KVF4NXGQ.js} +2 -2
- package/dist/cli/chunks/{chunk-BDKEAGQ2.js → chunk-KXCLACFG.js} +2 -2
- package/dist/cli/chunks/{chunk-K3WZICFA.js → chunk-L2DWPVNJ.js} +1 -1
- package/dist/cli/chunks/{chunk-6YVMX2TC.js → chunk-L6QSTQME.js} +2 -2
- package/dist/cli/chunks/{chunk-LJMYRTJ7.js → chunk-LE4QJREF.js} +1 -1
- package/dist/cli/chunks/{chunk-NWIIYHT6.js → chunk-LKTTUHLF.js} +2 -2
- package/dist/cli/chunks/{chunk-W5ZJG2OU.js → chunk-LQLPB2T6.js} +2 -2
- package/dist/cli/chunks/{chunk-JKJOB65O.js → chunk-LRSX2FJM.js} +1 -1
- package/dist/cli/chunks/chunk-M4FRQ4TE.js +12 -0
- package/dist/cli/chunks/chunk-M7WJCTG3.js +2 -0
- package/dist/cli/chunks/{chunk-6RBTS3NF.js → chunk-MAFQV4U4.js} +2 -2
- package/dist/cli/chunks/{chunk-UE2J6MA5.js → chunk-MD43XRX5.js} +1 -1
- package/dist/cli/chunks/{chunk-2CKERSMB.js → chunk-MI5MFHRA.js} +2 -2
- package/dist/cli/chunks/{chunk-T66PPF4D.js → chunk-MO55CVMT.js} +32 -32
- package/dist/cli/chunks/{chunk-C4KLXFJP.js → chunk-N7HL5PHH.js} +1 -1
- package/dist/cli/chunks/chunk-NAEWCFQT.js +14 -0
- package/dist/cli/chunks/{chunk-U62OUXBF.js → chunk-NDJ7P2EP.js} +1 -1
- package/dist/cli/chunks/{chunk-M4WMSCAE.js → chunk-NO3IV5Q5.js} +1 -1
- package/dist/cli/chunks/{chunk-27HE2BHC.js → chunk-NQXXI77K.js} +2 -2
- package/dist/cli/chunks/{chunk-NQS3BWS6.js → chunk-NVEWF4JV.js} +1 -1
- package/dist/cli/chunks/{chunk-EBTNMQSS.js → chunk-NZU4ACBZ.js} +2 -2
- package/dist/cli/chunks/chunk-O5W3FIO6.js +63 -0
- package/dist/cli/chunks/{chunk-BFQTLF5X.js → chunk-OAEE6JWQ.js} +2 -2
- package/dist/cli/chunks/{chunk-PS6UMZVK.js → chunk-OCV2XEWQ.js} +2 -2
- package/dist/cli/chunks/{chunk-BU4UQR36.js → chunk-P3EYRILV.js} +2 -2
- package/dist/cli/chunks/{chunk-LHMQIZ6B.js → chunk-PEQDY4BO.js} +2 -2
- package/dist/cli/chunks/{chunk-PYPS65P7.js → chunk-PF7RBAYL.js} +2 -2
- package/dist/cli/chunks/{chunk-UXIY4IAI.js → chunk-PHT5N7SC.js} +2 -2
- package/dist/cli/chunks/{chunk-GV2QE5TO.js → chunk-PINSJCM3.js} +1 -1
- package/dist/cli/chunks/{chunk-4X3SWKBA.js → chunk-PPUZWYUG.js} +2 -2
- package/dist/cli/chunks/{chunk-L32JNNKL.js → chunk-QPEOLAAS.js} +1 -1
- package/dist/cli/chunks/{chunk-UUBIQR6A.js → chunk-QQWBWEJS.js} +18 -18
- package/dist/cli/chunks/{chunk-VCXI4XC4.js → chunk-QVDCVD5D.js} +2 -2
- package/dist/cli/chunks/{chunk-JW74KRBC.js → chunk-RJIEG3NA.js} +2 -2
- package/dist/cli/chunks/{chunk-C4RTAVC6.js → chunk-RV74I3YO.js} +2 -2
- package/dist/cli/chunks/{chunk-5G4UFTV4.js → chunk-S75SOOZL.js} +2 -2
- package/dist/cli/chunks/{chunk-MV55NXTD.js → chunk-SASBO5Y5.js} +2 -2
- package/dist/cli/chunks/{chunk-UORB2QDU.js → chunk-SDLWKRVL.js} +2 -2
- package/dist/cli/chunks/{chunk-Y2OX6KGN.js → chunk-SHKOCGNK.js} +2 -2
- package/dist/cli/chunks/{chunk-6KCSKGVY.js → chunk-SI6DPU5D.js} +1 -1
- package/dist/cli/chunks/{chunk-LYJHUNBK.js → chunk-SJ6Y4725.js} +2 -2
- package/dist/cli/chunks/{chunk-7ACCBHRB.js → chunk-SR52XP5F.js} +1 -1
- package/dist/cli/chunks/{chunk-C5CXL3JP.js → chunk-SSUAAX3F.js} +2 -2
- package/dist/cli/chunks/{chunk-BBRROA3Z.js → chunk-SSYAQZXA.js} +2 -2
- package/dist/cli/chunks/{chunk-DUKE27HC.js → chunk-SUDMM5SO.js} +2 -2
- package/dist/cli/chunks/{chunk-H5DER3JY.js → chunk-TIUKLYAI.js} +1 -1
- package/dist/cli/chunks/{chunk-5C62XMJR.js → chunk-TVGI32MB.js} +33 -33
- package/dist/cli/chunks/{chunk-MPFPWJTH.js → chunk-U2A7NHZA.js} +2 -2
- package/dist/cli/chunks/{chunk-TX2CHQD7.js → chunk-UE5ZOZR2.js} +2 -2
- package/dist/cli/chunks/{chunk-OLZH5LRT.js → chunk-UHEOGZLX.js} +11 -11
- package/dist/cli/chunks/chunk-UNGBRZDK.js +12 -0
- package/dist/cli/chunks/{chunk-XWIAZG3C.js → chunk-V5NHZV7S.js} +2 -2
- package/dist/cli/chunks/{chunk-AP2W7Z3A.js → chunk-VJCIEHEF.js} +1 -1
- package/dist/cli/chunks/{chunk-K3XBQC3R.js → chunk-VMDFFTCK.js} +1 -1
- package/dist/cli/chunks/chunk-VSIKHWZ4.js +29 -0
- package/dist/cli/chunks/{chunk-LB2LGEDP.js → chunk-VWPM27GU.js} +2 -2
- package/dist/cli/chunks/{chunk-HTZSRMHW.js → chunk-VXFLJNCA.js} +2 -2
- package/dist/cli/chunks/{chunk-73PBAWAF.js → chunk-W5HQUIML.js} +2 -2
- package/dist/cli/chunks/{chunk-DEKR3CTS.js → chunk-WP4RETKG.js} +2 -2
- package/dist/cli/chunks/{chunk-ZWBGYJ7K.js → chunk-XIIQ5QTT.js} +2 -2
- package/dist/cli/chunks/{chunk-TDQWTSBS.js → chunk-XIQW7EFL.js} +2 -2
- package/dist/cli/chunks/{chunk-AKZO6GGG.js → chunk-XWUWX7BV.js} +4 -4
- package/dist/cli/chunks/{chunk-LNX74WHQ.js → chunk-Y4PFUMOU.js} +1 -1
- package/dist/cli/chunks/chunk-YAPLJR7K.js +2 -0
- package/dist/cli/chunks/{chunk-3CYNZFKH.js → chunk-YLMNVLDK.js} +1 -1
- package/dist/cli/chunks/{chunk-XG4F4XH4.js → chunk-YNMJEDN5.js} +2 -2
- package/dist/cli/chunks/{chunk-RDMRY7CT.js → chunk-YPBSUGMI.js} +1 -1
- package/dist/cli/chunks/{chunk-OBDONJQM.js → chunk-YRAX7SFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-7BLZHFKD.js → chunk-YTHTQPWR.js} +1 -1
- package/dist/cli/chunks/{chunk-IXL5ZHWJ.js → chunk-YU2BDRSD.js} +1 -1
- package/dist/cli/chunks/chunk-ZB3LEFYG.js +2 -0
- package/dist/cli/chunks/{chunk-T4GE7MPI.js → chunk-ZFL436FN.js} +2 -2
- package/dist/cli/chunks/{chunk-CBK5CT6T.js → chunk-ZJH5MU2I.js} +2 -2
- package/dist/cli/chunks/{chunk-LTQVUAPH.js → chunk-ZQ2XW3IP.js} +2 -2
- package/dist/cli/chunks/chunk-ZR2TKVXQ.js +14 -0
- package/dist/cli/chunks/{ci-UCUJOSBW.js → ci-MFUR4CWV.js} +2 -2
- package/dist/cli/chunks/{ci-config-2XILD3XG.js → ci-config-PNDLQ6XV.js} +2 -2
- package/dist/cli/chunks/{ci-output-BL6KWOHW.js → ci-output-PFZ4M7NC.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-5XLIOXE5.js → circuit-breaker-5HH6NLZN.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-4IMP6ACS.js → claude-flow-setup-QCKYLGLC.js} +2 -2
- package/dist/cli/chunks/client-MHQRTZM4.js +2 -0
- package/dist/cli/chunks/{cline-installer-RYLHCDK7.js → cline-installer-EASVPFXR.js} +2 -2
- package/dist/cli/chunks/{code-WY3GJXHX.js → code-UJXDVYRK.js} +4 -3
- package/dist/cli/chunks/{code-index-extractor-Y4MZBZCW.js → code-index-extractor-BZJ3UDP4.js} +2 -2
- package/dist/cli/chunks/{codex-installer-SCJ3T3DX.js → codex-installer-XSQZUVOZ.js} +2 -2
- package/dist/cli/chunks/{completions-CN2DXQFU.js → completions-OWOOJFI2.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-7MDPPIBH.js → complexity-analyzer-KP5TOHDT.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-GCEJRK34.js → continuedev-installer-IFKQXLHM.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-BHPDSELY.js → copilot-installer-IGJ6KGQY.js} +2 -2
- package/dist/cli/chunks/core-handlers-UAK3LLJE.js +2 -0
- package/dist/cli/chunks/{cost-tracker-VO5MFWR6.js → cost-tracker-MMDDNKZB.js} +2 -2
- package/dist/cli/chunks/{coverage-LYFQYNH6.js → coverage-LUH2B7NT.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +2 -0
- package/dist/cli/chunks/{cursor-installer-KP4HA7TV.js → cursor-installer-4YLM5GWM.js} +2 -2
- package/dist/cli/chunks/daemon-CAVZ7OFV.js +18 -0
- package/dist/cli/chunks/{daemon-7RC7TS57.js → daemon-MZKVM4CJ.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-NKA44RSR.js → dag-attention-scheduler-X4CYW665.js} +2 -2
- package/dist/cli/chunks/{detect-CMYAJWYF.js → detect-7BM2XINO.js} +2 -2
- package/dist/cli/chunks/{dist-node-EN3PYEGW.js → dist-node-Y5APLEYB.js} +2 -2
- package/dist/cli/chunks/{domain-handler-EXSZCX7A.js → domain-handler-X3ZRJNAH.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-HCQFSNL7.js → domain-plugins-2UW5KQJB.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-3LGSNTPO.js → domain-transfer-35W4CIBV.js} +2 -2
- package/dist/cli/chunks/dream-EJY24JN6.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +3 -0
- package/dist/cli/chunks/embedding-space-SBM2MZD2.js +2 -0
- package/dist/cli/chunks/{eval-OQELIWJK.js → eval-4QA2SROK.js} +2 -2
- package/dist/cli/chunks/experience-capture-middleware-Z6BF6KYM.js +40 -0
- package/dist/cli/chunks/{fast-paths-UV4NDEWM.js → fast-paths-FIORX6GN.js} +2 -2
- package/dist/cli/chunks/{feature-flags-CKTYX67J.js → feature-flags-6LYI2T4G.js} +2 -2
- package/dist/cli/chunks/{feature-flags-H7H33B6C.js → feature-flags-ZOO7LMIC.js} +2 -2
- package/dist/cli/chunks/file-discovery-UZSFSS4V.js +2 -0
- package/dist/cli/chunks/{fleet-ZJBCAKRG.js → fleet-7WF53H4F.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-RUE2QZRG.js → gnn-wrapper-KJ6B7BRM.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-XRV327M7.js → heartbeat-handler-DEKKMOVW.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +2 -0
- package/dist/cli/chunks/hnsw-index-POCPMVJH.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-UJID6ZZ4.js → hnsw-legacy-bridge-L27WS27N.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-WS43R4AX.js → hnswlib-node-4YOQC6L4.js} +2 -2
- package/dist/cli/chunks/{hooks-YZNJKXAJ.js → hooks-TAOKV4EJ.js} +23 -22
- package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-XQJSIMTS.js → hypergraph-engine-BODRJLHL.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-ZD2NYXMR.js → hypergraph-handler-RKMYJNTU.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +2 -0
- package/dist/cli/chunks/{init-guard-DSRUAVRT.js → init-guard-MXHSLSB2.js} +2 -2
- package/dist/cli/chunks/{init-handler-RJU5QMAP.js → init-handler-HUE57IFW.js} +6 -6
- package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +2 -0
- package/dist/cli/chunks/kernel-CCDWT7KS.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-BCPOCVMC.js → kilocode-installer-S333IKYQ.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-GFCWCB2S.js → kiro-installer-WM5DLQWC.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +2 -0
- package/dist/cli/chunks/{learning-FZTD72CF.js → learning-LNHMQLH5.js} +3 -3
- package/dist/cli/chunks/{llm-router-GJVKGRJL.js → llm-router-EWFXYZZR.js} +4 -4
- package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +2 -0
- package/dist/cli/chunks/{load-YKTPOYBE.js → load-FGYGWVDK.js} +2 -2
- package/dist/cli/chunks/load-test-UNZUWY3F.js +2 -0
- package/dist/cli/chunks/{mcp-LT6R2IKS.js → mcp-2FHNAAOM.js} +2 -2
- package/dist/cli/chunks/{memory-4HKKOLRY.js → memory-DZMQ73AB.js} +5 -5
- package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +2 -0
- package/dist/cli/chunks/memory-handlers-MP426XRJ.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-2YPM2WTK.js → multi-model-executor-6F2UAEUW.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-WBAJMH5K.js → opencode-installer-XY3BGOTZ.js} +2 -2
- package/dist/cli/chunks/{orchestrator-5W5WVMVJ.js → orchestrator-B4CNKUOS.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-GXRMNPAZ.js → pattern-usage-recorder-R4GUFNMD.js} +2 -2
- package/dist/cli/chunks/{pipeline-2NA4DRDA.js → pipeline-FG5RKVRO.js} +2 -2
- package/dist/cli/chunks/{platform-BGERNQ5V.js → platform-3BT4KEVJ.js} +2 -2
- package/dist/cli/chunks/{plugin-L4EPVENR.js → plugin-WI4RIN7O.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-RTQRTPTM.js → prime-radiant-advanced-wasm-7ECDNQFS.js} +2 -2
- package/dist/cli/chunks/project-root-BEANNYWU.js +2 -0
- package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +2 -0
- package/dist/cli/chunks/{protocol-handler-SYQXM6JK.js → protocol-handler-WNODKPGW.js} +2 -2
- package/dist/cli/chunks/{prove-5O7GPJCU.js → prove-5RHAEPYZ.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +2 -0
- package/dist/cli/chunks/{quality-KIIDHGNF.js → quality-WPHR7BGQ.js} +2 -2
- package/dist/cli/chunks/{quality-gate-H65VECD3.js → quality-gate-4RKTEZMX.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +2 -0
- package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +2 -0
- package/dist/cli/chunks/{ref-validation-CSBJOMZM.js → ref-validation-TPAWHOHH.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-G7OVYXEN.js → roocode-installer-7AVHFNDI.js} +2 -2
- package/dist/cli/chunks/router-EP34O3KB.js +2 -0
- package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +2 -0
- package/dist/cli/chunks/{routing-handler-ZNZPPI5Y.js → routing-handler-YKEDVJSH.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-C6IG3OY3.js → ruvector-commands-JUAMM354.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-3G6LFLT3.js → rvf-store-integrity-VJDUIRTX.js} +2 -2
- package/dist/cli/chunks/safe-db-TCAU4FUT.js +2 -0
- package/dist/cli/chunks/schedule-NB5KV435.js +2 -0
- package/dist/cli/chunks/scheduler-JKXGKVK6.js +2 -0
- package/dist/cli/chunks/{security-A3IMVLFM.js → security-ORDN3RD2.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-VHWQ6US5.js → shared-rvf-adapter-CF4BCIO7.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-JB3QS7IG.js → shared-rvf-dual-writer-C32UBR6D.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +2 -0
- package/dist/cli/chunks/{standalone-memory-DDNXCSBD.js → standalone-memory-OXRJYZXN.js} +2 -2
- package/dist/cli/chunks/{status-handler-2HK7XPEK.js → status-handler-BCX5D4HY.js} +2 -2
- package/dist/cli/chunks/{structural-health-DSJVLEPV.js → structural-health-LFG7RUU6.js} +2 -2
- package/dist/cli/chunks/sync-OSF7C2NL.js +2 -0
- package/dist/cli/chunks/{sync-NTUR53PI.js → sync-YJEE2K2L.js} +2 -2
- package/dist/cli/chunks/task-handler-6LXKPTXJ.js +64 -0
- package/dist/cli/chunks/{task-handlers-VJR6EHRZ.js → task-handlers-CILP36I7.js} +4 -4
- package/dist/cli/chunks/{test-O6FK3FVF.js → test-SD457QJ6.js} +4 -4
- package/dist/cli/chunks/test-runner-process-VKD65QQU.js +2 -0
- package/dist/cli/chunks/{test-scheduling-Q6QEEOS6.js → test-scheduling-ISI2O4Q5.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-VUELSBOS.js +2 -0
- package/dist/cli/chunks/{token-usage-YEEFWSSI.js → token-usage-XOC5KG7S.js} +2 -2
- package/dist/cli/chunks/{transformers-BZCHJJJT.js → transformers-LSLQAARK.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +2 -0
- package/dist/cli/chunks/{types-4AOKZYOX.js → types-5BLCGLCR.js} +2 -2
- package/dist/cli/chunks/unified-memory-GI76TXFV.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +2 -0
- package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +2 -0
- package/dist/cli/chunks/{upgrade-2MWW6BT2.js → upgrade-RQJYLK3J.js} +2 -2
- package/dist/cli/chunks/{validate-PAEV3GT5.js → validate-QBHWXXCK.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-ZIXACK5K.js → validate-swarm-IKXBKFB5.js} +2 -2
- package/dist/cli/chunks/visual-security-GZ2MOKWB.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-VLTXZFAB.js → web-tree-sitter-ZF6FIE5R.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-VELMLOZF.js → windsurf-installer-HQGDZT5D.js} +2 -2
- package/dist/cli/chunks/witness-chain-DCHCAMSQ.js +2 -0
- package/dist/cli/chunks/witness-chain-P3XXXA62.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-PUX2NFDL.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-MIDWD4JS.js → witness-chain-verifier-PX2OQ6XT.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-OSVCWOB2.js → witness-key-manager-RXYQNFJB.js} +2 -2
- package/dist/cli/chunks/{workflow-MK7A7QCX.js → workflow-FBKCA4H6.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +2 -0
- package/dist/cli/chunks/wrappers-TWSKBTWD.js +2 -0
- package/dist/cli/commands/code.js +4 -0
- package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +10 -2
- package/dist/cli/handlers/task-handler.d.ts +5 -0
- package/dist/cli/handlers/task-handler.js +21 -1
- package/dist/cli/utils/task-result.d.ts +11 -0
- package/dist/cli/utils/task-result.js +39 -0
- package/dist/coordination/handlers/test-execution-handlers.js +92 -58
- package/dist/coordination/mincut/mincut-persistence.js +29 -25
- package/dist/domains/code-intelligence/coordinator.d.ts +4 -0
- package/dist/domains/code-intelligence/coordinator.js +46 -13
- package/dist/domains/code-intelligence/interfaces.d.ts +10 -1
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +32 -7
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +112 -53
- package/dist/domains/learning-optimization/services/learning-coordinator.js +1 -1
- package/dist/domains/quality-assessment/coordinator.js +2 -1
- package/dist/domains/test-execution/coordinator.js +10 -5
- package/dist/domains/test-execution/interfaces.d.ts +12 -0
- package/dist/domains/test-execution/plugin.js +6 -2
- package/dist/domains/test-execution/services/retry-handler.d.ts +2 -0
- package/dist/domains/test-execution/services/retry-handler.js +14 -9
- package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
- package/dist/domains/test-execution/services/test-executor.js +28 -9
- package/dist/domains/visual-accessibility/coordinator.d.ts +15 -7
- package/dist/domains/visual-accessibility/coordinator.js +15 -7
- package/dist/domains/visual-accessibility/interfaces.d.ts +27 -3
- package/dist/domains/visual-accessibility/services/accessibility-contrast.d.ts +39 -0
- package/dist/domains/visual-accessibility/services/accessibility-contrast.js +93 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester-browser.d.ts +18 -3
- package/dist/domains/visual-accessibility/services/accessibility-tester-browser.js +50 -40
- package/dist/domains/visual-accessibility/services/accessibility-tester-checks.d.ts +27 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester-checks.js +137 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +5 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester.js +43 -24
- package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.d.ts +2 -3
- package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.js +8 -14
- package/dist/feedback/coverage-learner.js +13 -9
- package/dist/feedback/test-outcome-tracker.js +13 -9
- package/dist/governance/witness-chain.d.ts +5 -0
- package/dist/governance/witness-chain.js +22 -6
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +22 -0
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +115 -45
- package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.d.ts +6 -0
- package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.js +51 -33
- package/dist/integrations/agentic-flow/reasoning-bank/trajectory-tracker.js +17 -9
- package/dist/integrations/embeddings/cache/EmbeddingCache.d.ts +8 -0
- package/dist/integrations/embeddings/cache/EmbeddingCache.js +24 -10
- package/dist/integrations/ruvector/delta-tracker.d.ts +11 -0
- package/dist/integrations/ruvector/delta-tracker.js +16 -0
- package/dist/integrations/ruvector/sona-persistence.d.ts +10 -0
- package/dist/integrations/ruvector/sona-persistence.js +49 -24
- package/dist/kernel/unified-memory.d.ts +24 -0
- package/dist/kernel/unified-memory.js +63 -8
- package/dist/learning/aqe-learning-engine.js +1 -1
- package/dist/learning/embed-and-insert-pattern.js +4 -2
- package/dist/learning/embedder-endpoint-client.d.ts +31 -0
- package/dist/learning/embedder-endpoint-client.js +103 -10
- package/dist/learning/embedding-space.d.ts +12 -0
- package/dist/learning/embedding-space.js +17 -0
- package/dist/learning/experience-capture-middleware.js +25 -13
- package/dist/learning/experience-capture.js +1 -1
- package/dist/learning/experience-consolidation.d.ts +18 -0
- package/dist/learning/experience-consolidation.js +55 -8
- package/dist/learning/experience-space-verification.d.ts +71 -0
- package/dist/learning/experience-space-verification.js +147 -0
- package/dist/learning/pattern-lifecycle.d.ts +40 -4
- package/dist/learning/pattern-lifecycle.js +153 -76
- package/dist/learning/pattern-null-store.d.ts +5 -0
- package/dist/learning/pattern-null-store.js +8 -0
- package/dist/learning/pattern-promotion.js +6 -3
- package/dist/learning/pattern-store.d.ts +6 -0
- package/dist/learning/pattern-store.js +19 -6
- package/dist/learning/qe-reasoning-bank.js +2 -2
- package/dist/learning/real-embeddings.js +3 -1
- package/dist/learning/real-qe-reasoning-bank.d.ts +5 -0
- package/dist/learning/real-qe-reasoning-bank.js +77 -47
- package/dist/learning/rvf-pattern-store.js +6 -2
- package/dist/learning/sqlite-persistence.d.ts +6 -0
- package/dist/learning/sqlite-persistence.js +10 -0
- package/dist/mcp/bundle.js +641 -570
- package/dist/mcp/entry.js +4 -0
- package/dist/mcp/handlers/domain-handler-configs.js +2 -0
- package/dist/mcp/handlers/trajectory-judge.js +1 -1
- package/dist/mcp/protocol-server.js +1 -0
- package/dist/mcp/tools/visual-accessibility/index.js +8 -2
- package/dist/mcp/types.d.ts +6 -0
- package/dist/optimization/session-cache.d.ts +17 -1
- package/dist/optimization/session-cache.js +40 -36
- package/dist/planning/goap-planner.d.ts +6 -0
- package/dist/planning/goap-planner.js +35 -19
- package/dist/planning/plan-executor.js +24 -15
- package/dist/routing/co-execution-repository.js +12 -9
- package/dist/routing/routing-feedback.d.ts +8 -0
- package/dist/routing/routing-feedback.js +46 -24
- package/dist/routing/routing-outcomes-migration.js +7 -2
- package/dist/shared/llm/spend-ledger.d.ts +9 -0
- package/dist/shared/llm/spend-ledger.js +64 -39
- package/dist/shared/sqlite-lock-wait.d.ts +27 -0
- package/dist/shared/sqlite-lock-wait.js +37 -0
- package/dist/shared/sqlite-write-queue.d.ts +28 -0
- package/dist/shared/sqlite-write-queue.js +38 -0
- package/dist/shared/test-runner-project.d.ts +69 -0
- package/dist/shared/test-runner-project.js +186 -0
- package/dist/skills/security-visual-testing/index.d.ts +3 -1
- package/dist/skills/security-visual-testing/index.js +49 -35
- package/dist/skills/security-visual-testing/types.d.ts +19 -3
- package/dist/workers/workers/heartbeat-scheduler.js +5 -5
- package/dist/workers/workers/learning-consolidation.js +8 -7
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-QU6INSKP.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-PAJPENJD.js +0 -2
- package/dist/cli/chunks/base-OTGSN6IC.js +0 -2
- package/dist/cli/chunks/browser-workflow-WLZGR6SB.js +0 -2
- package/dist/cli/chunks/chunk-2LUTPMBO.js +0 -21
- package/dist/cli/chunks/chunk-3HVFIITW.js +0 -2
- package/dist/cli/chunks/chunk-5KA5TVPR.js +0 -6
- package/dist/cli/chunks/chunk-6NBRMD25.js +0 -13
- package/dist/cli/chunks/chunk-7O45RQHF.js +0 -153
- package/dist/cli/chunks/chunk-EMSZVUYA.js +0 -29
- package/dist/cli/chunks/chunk-G6RDCCFV.js +0 -4
- package/dist/cli/chunks/chunk-HH4ED4F7.js +0 -744
- package/dist/cli/chunks/chunk-Q6I4SIUU.js +0 -65
- package/dist/cli/chunks/chunk-QGBGSQ2E.js +0 -14
- package/dist/cli/chunks/chunk-QRKTBSZT.js +0 -27
- package/dist/cli/chunks/chunk-SHRI7TKJ.js +0 -62
- package/dist/cli/chunks/chunk-UGYM4U44.js +0 -2
- package/dist/cli/chunks/chunk-VY4U6DPO.js +0 -12
- package/dist/cli/chunks/chunk-WNTA4YKE.js +0 -14
- package/dist/cli/chunks/chunk-XHLYGXYE.js +0 -2
- package/dist/cli/chunks/client-KKRNPX4F.js +0 -2
- package/dist/cli/chunks/core-handlers-47MPMED7.js +0 -2
- package/dist/cli/chunks/cross-domain-router-U6MBFHEC.js +0 -2
- package/dist/cli/chunks/daemon-AXLVPKVO.js +0 -18
- package/dist/cli/chunks/dream-76L6EEN7.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-B6MNHICW.js +0 -3
- package/dist/cli/chunks/experience-capture-middleware-SUFILYPW.js +0 -40
- package/dist/cli/chunks/file-discovery-VSFKZ3LJ.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-NIK3KKEH.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-WJG7LUJJ.js +0 -2
- package/dist/cli/chunks/hnsw-index-D6PRI5HC.js +0 -2
- package/dist/cli/chunks/hybrid-backend-RIUR3I7F.js +0 -2
- package/dist/cli/chunks/impact-analyzer-C36YYTJ5.js +0 -2
- package/dist/cli/chunks/init-wizard-JCKNGIGT.js +0 -2
- package/dist/cli/chunks/kernel-F7ILJTYD.js +0 -2
- package/dist/cli/chunks/knowledge-graph-VTXDBHB2.js +0 -2
- package/dist/cli/chunks/llm-router-service-TNOWQINA.js +0 -2
- package/dist/cli/chunks/load-test-FPVBK2EV.js +0 -2
- package/dist/cli/chunks/memory-backend-2QE7O67A.js +0 -2
- package/dist/cli/chunks/memory-handlers-X4CMVBXB.js +0 -2
- package/dist/cli/chunks/pattern-null-store-UI35ORHW.js +0 -2
- package/dist/cli/chunks/project-root-S7WDFTMU.js +0 -2
- package/dist/cli/chunks/protocol-executor-OPANXQVB.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-3OTF4DYQ.js +0 -2
- package/dist/cli/chunks/queen-coordinator-WTYH4TAN.js +0 -2
- package/dist/cli/chunks/real-embeddings-DYIOLKQ3.js +0 -2
- package/dist/cli/chunks/router-DBBW4NC2.js +0 -2
- package/dist/cli/chunks/routing-feedback-W35QHCL4.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-X3NSL25Z.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-TZR7GDOK.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-4ATTHGHD.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-HD25ZYV5.js +0 -2
- package/dist/cli/chunks/safe-db-ZS2QKANY.js +0 -2
- package/dist/cli/chunks/schedule-ZH6VNA32.js +0 -2
- package/dist/cli/chunks/scheduler-T6CD74B6.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-47WU5EKZ.js +0 -2
- package/dist/cli/chunks/sync-3MUV6S5E.js +0 -2
- package/dist/cli/chunks/task-handler-74MZN2EO.js +0 -62
- package/dist/cli/chunks/test-runner-process-2NPW3UDQ.js +0 -2
- package/dist/cli/chunks/token-bootstrap-TTRCECLP.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-RZAND65G.js +0 -2
- package/dist/cli/chunks/unified-memory-FZ5K2C7W.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-VREWX56M.js +0 -2
- package/dist/cli/chunks/unified-persistence-YZGMKX6B.js +0 -2
- package/dist/cli/chunks/visual-security-GXGSFBVA.js +0 -2
- package/dist/cli/chunks/witness-chain-MRJKVCOW.js +0 -2
- package/dist/cli/chunks/witness-chain-WWHJKITG.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-5SAXPETG.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-SG7DV72E.js +0 -2
- package/dist/cli/chunks/wrappers-5QFMCKXL.js +0 -2
|
@@ -94,12 +94,12 @@ export class SemanticAnalyzerService {
|
|
|
94
94
|
return err(new Error(NOTHING_INDEXED_FOR_SEARCH));
|
|
95
95
|
}
|
|
96
96
|
let results;
|
|
97
|
-
let
|
|
97
|
+
let semanticOutcome = {};
|
|
98
98
|
switch (type) {
|
|
99
99
|
case 'semantic': {
|
|
100
|
-
const
|
|
101
|
-
results =
|
|
102
|
-
|
|
100
|
+
const { results: hits, ...outcome } = await this.semanticSearch(query, limit, scope, filters);
|
|
101
|
+
results = hits;
|
|
102
|
+
semanticOutcome = outcome;
|
|
103
103
|
break;
|
|
104
104
|
}
|
|
105
105
|
case 'exact':
|
|
@@ -116,11 +116,7 @@ export class SemanticAnalyzerService {
|
|
|
116
116
|
results,
|
|
117
117
|
total: results.length,
|
|
118
118
|
searchTime,
|
|
119
|
-
...
|
|
120
|
-
? lexicalOnlyReason === undefined
|
|
121
|
-
? { mode: 'vector' }
|
|
122
|
-
: { mode: 'lexical-only', reason: lexicalOnlyReason }
|
|
123
|
-
: {}),
|
|
119
|
+
...semanticOutcome,
|
|
124
120
|
});
|
|
125
121
|
}
|
|
126
122
|
catch (error) {
|
|
@@ -130,13 +126,13 @@ export class SemanticAnalyzerService {
|
|
|
130
126
|
/**
|
|
131
127
|
* Index code content for semantic search
|
|
132
128
|
*/
|
|
133
|
-
async indexCode(file, content) {
|
|
129
|
+
async indexCode(file, content, options = {}) {
|
|
134
130
|
try {
|
|
135
131
|
// Extract code metadata
|
|
136
132
|
const metadata = this.extractCodeMetadata(file, content);
|
|
137
133
|
// #1224: store a vector only when a real embedding model produced one;
|
|
138
134
|
// without it the file is still searchable by text.
|
|
139
|
-
const embedded = await this.tryEmbed(content);
|
|
135
|
+
const embedded = options.embed === false ? {} : await this.tryEmbed(content);
|
|
140
136
|
if (embedded.vector) {
|
|
141
137
|
const key = `${this.vectorKeyPrefix()}${this.fileToKey(file)}`;
|
|
142
138
|
await this.memory.storeVector(key, embedded.vector, {
|
|
@@ -153,8 +149,15 @@ export class SemanticAnalyzerService {
|
|
|
153
149
|
// namespace, and a write with {namespace} could not be read back without
|
|
154
150
|
// the same option (issue #491 Bug 2) — which silently dropped every
|
|
155
151
|
// search result (#511 follow-up).
|
|
156
|
-
|
|
157
|
-
|
|
152
|
+
const stored = embedded.vector
|
|
153
|
+
? { file, content, metadata, embeddingModel: this.embeddingModelId() }
|
|
154
|
+
: { file, content, metadata };
|
|
155
|
+
await this.memory.set(`${this.config.namespace}:content:${this.fileToKey(file)}`, stored);
|
|
156
|
+
return ok(embedded.vector
|
|
157
|
+
? { vector: true }
|
|
158
|
+
: this.embedder && embedded.reason
|
|
159
|
+
? { vector: false, vectorFailure: embedded.reason }
|
|
160
|
+
: { vector: false });
|
|
158
161
|
}
|
|
159
162
|
catch (error) {
|
|
160
163
|
return err(toError(error));
|
|
@@ -284,21 +287,31 @@ export class SemanticAnalyzerService {
|
|
|
284
287
|
contentKeyPattern() {
|
|
285
288
|
return `${this.config.namespace}:content:*`;
|
|
286
289
|
}
|
|
290
|
+
/** Visits every indexed file's stored content, one at a time. */
|
|
291
|
+
async forEachIndexed(visit) {
|
|
292
|
+
const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
|
|
293
|
+
for (const key of keys) {
|
|
294
|
+
const stored = await this.memory.get(key);
|
|
295
|
+
if (stored)
|
|
296
|
+
visit(stored);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
287
299
|
// ============================================================================
|
|
288
300
|
// Private Search Methods
|
|
289
301
|
// ============================================================================
|
|
290
302
|
/**
|
|
291
303
|
* #1224: vector search when an embedding model is available. Otherwise (or
|
|
292
304
|
* when no indexed file has a vector from that model) it matches query words
|
|
293
|
-
* against the indexed text and
|
|
294
|
-
* similarity is invented for those hits.
|
|
305
|
+
* against the indexed text and reports `mode: 'lexical-only'` with the
|
|
306
|
+
* reason; no similarity is invented for those hits.
|
|
295
307
|
*/
|
|
296
308
|
async semanticSearch(query, limit, scope, filters) {
|
|
297
309
|
const embedded = await this.tryEmbed(query);
|
|
298
310
|
if (!embedded.vector) {
|
|
299
311
|
return {
|
|
300
312
|
results: await this.lexicalSearch(query, limit, scope, filters),
|
|
301
|
-
|
|
313
|
+
mode: 'lexical-only',
|
|
314
|
+
reason: embedded.reason,
|
|
302
315
|
};
|
|
303
316
|
}
|
|
304
317
|
// Only this namespace's vectors, from the model that embedded the query.
|
|
@@ -310,7 +323,8 @@ export class SemanticAnalyzerService {
|
|
|
310
323
|
if (vectorResults.length === 0) {
|
|
311
324
|
return {
|
|
312
325
|
results: await this.lexicalSearch(query, limit, scope, filters),
|
|
313
|
-
|
|
326
|
+
mode: 'lexical-only',
|
|
327
|
+
reason: `no indexed file has an embedding from ${this.embeddingModelId()}; re-index to enable vector search`,
|
|
314
328
|
};
|
|
315
329
|
}
|
|
316
330
|
// Convert to search results with filtering
|
|
@@ -345,7 +359,53 @@ export class SemanticAnalyzerService {
|
|
|
345
359
|
break;
|
|
346
360
|
}
|
|
347
361
|
}
|
|
348
|
-
return
|
|
362
|
+
return this.withVectorlessFiles(query, results, limit, scope, filters);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* #1231: files indexed while the embedding model was unavailable have no
|
|
366
|
+
* vector, so vector search cannot rank them. Match those by text, label the
|
|
367
|
+
* hits 'lexical', and report the result as 'partial-vector' with the counts.
|
|
368
|
+
* Cosine and text-match scores are not comparable, so vector hits come
|
|
369
|
+
* first (by cosine), then lexical hits (by share of query words found); the
|
|
370
|
+
* reason says how many text matches the limit left out.
|
|
371
|
+
*/
|
|
372
|
+
async withVectorlessFiles(query, vectorHits, limit, scope, filters) {
|
|
373
|
+
const model = this.embeddingModelId();
|
|
374
|
+
const vectorFiles = new Set(vectorHits.map((hit) => hit.file));
|
|
375
|
+
const queryTokens = this.tokenize(query.toLowerCase());
|
|
376
|
+
const lexicalHits = [];
|
|
377
|
+
let indexedFiles = 0;
|
|
378
|
+
let withoutVector = 0;
|
|
379
|
+
await this.forEachIndexed((stored) => {
|
|
380
|
+
indexedFiles++;
|
|
381
|
+
if (stored.embeddingModel === model)
|
|
382
|
+
return;
|
|
383
|
+
withoutVector++;
|
|
384
|
+
if (vectorFiles.has(stored.file))
|
|
385
|
+
return;
|
|
386
|
+
const hit = this.fuzzyMatch(queryTokens, stored, scope, filters);
|
|
387
|
+
if (hit)
|
|
388
|
+
lexicalHits.push({ ...hit, matchType: 'lexical' });
|
|
389
|
+
});
|
|
390
|
+
const coverage = { indexedFiles, filesWithVector: indexedFiles - withoutVector };
|
|
391
|
+
if (withoutVector === 0) {
|
|
392
|
+
return { results: vectorHits, mode: 'vector', coverage };
|
|
393
|
+
}
|
|
394
|
+
const byScore = (a, b) => b.score - a.score;
|
|
395
|
+
const results = [...[...vectorHits].sort(byScore), ...lexicalHits.sort(byScore)].slice(0, limit);
|
|
396
|
+
const droppedLexical = vectorHits.length + lexicalHits.length - results.length;
|
|
397
|
+
return {
|
|
398
|
+
results,
|
|
399
|
+
mode: 'partial-vector',
|
|
400
|
+
reason: `${withoutVector} of ${indexedFiles} indexed files have no embedding from ${model} ` +
|
|
401
|
+
'(it was unavailable when they were indexed, or an older aqe version indexed them), ' +
|
|
402
|
+
'so they were matched by text only (matchType "lexical", listed after the vector hits); ' +
|
|
403
|
+
(droppedLexical > 0
|
|
404
|
+
? `${droppedLexical} more text match(es) were left out by the limit of ${limit}; `
|
|
405
|
+
: '') +
|
|
406
|
+
're-index to rank them by vector',
|
|
407
|
+
coverage,
|
|
408
|
+
};
|
|
349
409
|
}
|
|
350
410
|
/** Word-overlap matching for a semantic query when no vectors can be used. */
|
|
351
411
|
async lexicalSearch(query, limit, scope, filters) {
|
|
@@ -390,39 +450,38 @@ export class SemanticAnalyzerService {
|
|
|
390
450
|
}
|
|
391
451
|
async fuzzySearch(query, limit, scope, filters) {
|
|
392
452
|
const results = [];
|
|
393
|
-
const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
|
|
394
453
|
const queryTokens = this.tokenize(query.toLowerCase());
|
|
395
|
-
|
|
396
|
-
const
|
|
397
|
-
if (
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
if (scope && scope.length > 0) {
|
|
401
|
-
const matchesScope = scope.some((s) => stored.file.includes(s));
|
|
402
|
-
if (!matchesScope)
|
|
403
|
-
continue;
|
|
404
|
-
}
|
|
405
|
-
// Apply filters
|
|
406
|
-
if (filters && !this.matchesFilters(stored.metadata, filters)) {
|
|
407
|
-
continue;
|
|
408
|
-
}
|
|
409
|
-
// Fuzzy match using token overlap
|
|
410
|
-
const contentTokens = this.tokenize(stored.content.toLowerCase());
|
|
411
|
-
const score = this.calculateFuzzyScore(queryTokens, contentTokens);
|
|
412
|
-
if (score >= this.config.minScore) {
|
|
413
|
-
const matchedTokens = queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct)));
|
|
414
|
-
results.push({
|
|
415
|
-
file: stored.file,
|
|
416
|
-
snippet: this.extractSnippet(stored.content, 200),
|
|
417
|
-
score,
|
|
418
|
-
highlights: matchedTokens,
|
|
419
|
-
metadata: stored.metadata,
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
}
|
|
454
|
+
await this.forEachIndexed((stored) => {
|
|
455
|
+
const hit = this.fuzzyMatch(queryTokens, stored, scope, filters);
|
|
456
|
+
if (hit)
|
|
457
|
+
results.push(hit);
|
|
458
|
+
});
|
|
423
459
|
// Sort by score and limit
|
|
424
460
|
return results.sort((a, b) => b.score - a.score).slice(0, limit);
|
|
425
461
|
}
|
|
462
|
+
/** Token-overlap match of one indexed file, or null when it is filtered out or scores too low. */
|
|
463
|
+
fuzzyMatch(queryTokens, stored, scope, filters) {
|
|
464
|
+
// Apply scope filter
|
|
465
|
+
if (scope && scope.length > 0 && !scope.some((s) => stored.file.includes(s))) {
|
|
466
|
+
return null;
|
|
467
|
+
}
|
|
468
|
+
// Apply filters
|
|
469
|
+
if (filters && !this.matchesFilters(stored.metadata, filters)) {
|
|
470
|
+
return null;
|
|
471
|
+
}
|
|
472
|
+
// Fuzzy match using token overlap
|
|
473
|
+
const contentTokens = this.tokenize(stored.content.toLowerCase());
|
|
474
|
+
const score = this.calculateFuzzyScore(queryTokens, contentTokens);
|
|
475
|
+
if (score < this.config.minScore)
|
|
476
|
+
return null;
|
|
477
|
+
return {
|
|
478
|
+
file: stored.file,
|
|
479
|
+
snippet: this.extractSnippet(stored.content, 200),
|
|
480
|
+
score,
|
|
481
|
+
highlights: queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct))),
|
|
482
|
+
metadata: stored.metadata,
|
|
483
|
+
};
|
|
484
|
+
}
|
|
426
485
|
// ============================================================================
|
|
427
486
|
// Private Analysis Methods
|
|
428
487
|
// ============================================================================
|
|
@@ -625,13 +684,13 @@ export class SemanticAnalyzerService {
|
|
|
625
684
|
return matches / queryTokens.length;
|
|
626
685
|
}
|
|
627
686
|
/**
|
|
628
|
-
* A
|
|
629
|
-
*
|
|
630
|
-
*
|
|
687
|
+
* A query word is found when a content word contains it (or equals it):
|
|
688
|
+
* "login" is found in `loginWithPassword`. #1279: not the reverse; a query
|
|
689
|
+
* word such as `stepHandler450` is not found just because the file has the
|
|
690
|
+
* shorter word `step`, which made almost every file a full match.
|
|
631
691
|
*/
|
|
632
692
|
tokensMatch(queryToken, contentToken) {
|
|
633
|
-
return contentToken.includes(queryToken)
|
|
634
|
-
(contentToken.length >= 3 && queryToken.includes(contentToken));
|
|
693
|
+
return contentToken.includes(queryToken);
|
|
635
694
|
}
|
|
636
695
|
matchesFilters(metadata, filters) {
|
|
637
696
|
for (const filter of filters) {
|
|
@@ -683,7 +742,7 @@ export class SemanticAnalyzerService {
|
|
|
683
742
|
const queryTokens = this.tokenize(query.toLowerCase());
|
|
684
743
|
const contentTokens = this.tokenize(content.toLowerCase());
|
|
685
744
|
for (const qt of queryTokens) {
|
|
686
|
-
const match = contentTokens.find((ct) =>
|
|
745
|
+
const match = contentTokens.find((ct) => this.tokensMatch(qt, ct));
|
|
687
746
|
if (match && !highlights.includes(match)) {
|
|
688
747
|
highlights.push(match);
|
|
689
748
|
}
|
|
@@ -512,7 +512,7 @@ Provide:
|
|
|
512
512
|
const contextFingerprint = `${experience.domain}:${experience.action}`;
|
|
513
513
|
for (const patternId of experience.appliedPatternIds ?? []) {
|
|
514
514
|
try {
|
|
515
|
-
nullStore.
|
|
515
|
+
await nullStore.recordNullWhenUnlocked({
|
|
516
516
|
patternId,
|
|
517
517
|
contextFingerprint,
|
|
518
518
|
failureMode: String(experience.result.outcome?.error ?? experience.action),
|
|
@@ -284,7 +284,8 @@ export class QualityAssessmentCoordinator extends BaseDomainCoordinator {
|
|
|
284
284
|
// ADR-070: Record quality gate decision in witness chain
|
|
285
285
|
try {
|
|
286
286
|
const wc = await getWitnessChain();
|
|
287
|
-
|
|
287
|
+
// #1283: queued, so a locked memory.db does not freeze the MCP server.
|
|
288
|
+
await wc.appendWhenUnlocked(finalResult.passed ? 'QUALITY_GATE_PASS' : 'QUALITY_GATE_FAIL', { gateName: request.gateName, passed: finalResult.passed, score: finalResult.overallScore, failedChecks: finalResult.failedChecks }, 'quality-gate');
|
|
288
289
|
}
|
|
289
290
|
catch (_wcErr) { /* non-critical */ }
|
|
290
291
|
// ADR-062: Monotonic gate threshold ratcheting
|
|
@@ -160,6 +160,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
160
160
|
workers,
|
|
161
161
|
timeout,
|
|
162
162
|
retryCount: request.retryCount,
|
|
163
|
+
projectRoot: request.projectRoot,
|
|
163
164
|
});
|
|
164
165
|
}
|
|
165
166
|
// Sequential execution
|
|
@@ -168,6 +169,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
168
169
|
framework,
|
|
169
170
|
timeout,
|
|
170
171
|
retryCount: request.retryCount,
|
|
172
|
+
projectRoot: request.projectRoot,
|
|
171
173
|
});
|
|
172
174
|
}
|
|
173
175
|
/**
|
|
@@ -176,7 +178,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
176
178
|
* as passed and flaky in the run's own counts (#1170). When that changes
|
|
177
179
|
* the outcome, the run is stored again with it (#1176).
|
|
178
180
|
*/
|
|
179
|
-
async retryFailures(run, retryCount, testFiles) {
|
|
181
|
+
async retryFailures(run, retryCount, testFiles, projectRoot) {
|
|
180
182
|
if (!retryCount || retryCount <= 0)
|
|
181
183
|
return;
|
|
182
184
|
if (run.failed === 0) {
|
|
@@ -188,6 +190,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
188
190
|
failedTests: run.failedTests.map(t => t.testId),
|
|
189
191
|
maxRetries: retryCount,
|
|
190
192
|
backoff: 'exponential',
|
|
193
|
+
projectRoot,
|
|
191
194
|
});
|
|
192
195
|
if (!retried.success)
|
|
193
196
|
return;
|
|
@@ -258,7 +261,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
258
261
|
// #1176: these first-attempt failures did happen; flaky analysis
|
|
259
262
|
// records them even when a retry then passes.
|
|
260
263
|
const firstAttemptFailures = [...result.value.failedTests];
|
|
261
|
-
await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
|
|
264
|
+
await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
|
|
262
265
|
// Record execution results for learning
|
|
263
266
|
if (this.config.enablePrioritization && prioritizationResult) {
|
|
264
267
|
await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
|
|
@@ -296,7 +299,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
296
299
|
if (this.config.infraHealing && result.value.failedTests.length > 0) {
|
|
297
300
|
this.feedInfraHealingFromFailures(result.value.failedTests);
|
|
298
301
|
// ADR-057: Attempt automatic recovery and re-run affected tests
|
|
299
|
-
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount });
|
|
302
|
+
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
|
|
300
303
|
if (rerunResult)
|
|
301
304
|
return rerunResult;
|
|
302
305
|
}
|
|
@@ -367,7 +370,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
367
370
|
this.activeRuns.delete(runId);
|
|
368
371
|
if (result.success) {
|
|
369
372
|
// #1176: retries finish before the run is recorded or announced.
|
|
370
|
-
await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
|
|
373
|
+
await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
|
|
371
374
|
// Record execution results for learning
|
|
372
375
|
if (this.config.enablePrioritization && prioritizationResult) {
|
|
373
376
|
await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
|
|
@@ -407,7 +410,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
407
410
|
if (this.config.infraHealing && result.value.failedTests.length > 0) {
|
|
408
411
|
this.feedInfraHealingFromFailures(result.value.failedTests);
|
|
409
412
|
// ADR-057: Attempt automatic recovery and re-run affected tests
|
|
410
|
-
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount });
|
|
413
|
+
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
|
|
411
414
|
if (rerunResult)
|
|
412
415
|
return rerunResult;
|
|
413
416
|
}
|
|
@@ -510,6 +513,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
510
513
|
failedTests: testsToRetry,
|
|
511
514
|
maxRetries: request.maxRetries,
|
|
512
515
|
backoff: request.backoff ?? 'exponential',
|
|
516
|
+
projectRoot: request.projectRoot,
|
|
513
517
|
onRetry: (testId, attempt) => {
|
|
514
518
|
// Could publish individual retry events here
|
|
515
519
|
void testId;
|
|
@@ -630,6 +634,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
630
634
|
timeout: originalRequest.timeout,
|
|
631
635
|
env: originalRequest.env,
|
|
632
636
|
retryCount: originalRequest.retryCount,
|
|
637
|
+
projectRoot: originalRequest.projectRoot,
|
|
633
638
|
});
|
|
634
639
|
}
|
|
635
640
|
/**
|
|
@@ -47,6 +47,11 @@ export interface ISimpleTestRequest {
|
|
|
47
47
|
timeout?: number;
|
|
48
48
|
/** Number of parallel workers (default: auto based on file count) */
|
|
49
49
|
workers?: number;
|
|
50
|
+
/**
|
|
51
|
+
* #1247: directory to run every file from, already checked to be inside the
|
|
52
|
+
* project. When omitted, each file runs from its nearest runner project.
|
|
53
|
+
*/
|
|
54
|
+
projectRoot?: string;
|
|
50
55
|
}
|
|
51
56
|
export interface IExecuteTestsRequest {
|
|
52
57
|
testFiles: string[];
|
|
@@ -59,6 +64,11 @@ export interface IExecuteTestsRequest {
|
|
|
59
64
|
* or TestRunCompleted is published, so both carry the final outcome.
|
|
60
65
|
*/
|
|
61
66
|
retryCount?: number;
|
|
67
|
+
/**
|
|
68
|
+
* #1247: directory to run every file from, already checked to be inside the
|
|
69
|
+
* project. When omitted, each file runs from its nearest runner project.
|
|
70
|
+
*/
|
|
71
|
+
projectRoot?: string;
|
|
62
72
|
}
|
|
63
73
|
export interface IParallelExecutionRequest extends IExecuteTestsRequest {
|
|
64
74
|
workers: number;
|
|
@@ -173,6 +183,8 @@ export interface IRetryRequest {
|
|
|
173
183
|
failedTests: string[];
|
|
174
184
|
maxRetries: number;
|
|
175
185
|
backoff?: 'linear' | 'exponential';
|
|
186
|
+
/** #1247: the run's explicit projectRoot; retries run from it too. */
|
|
187
|
+
projectRoot?: string;
|
|
176
188
|
}
|
|
177
189
|
export interface IRetryResult {
|
|
178
190
|
originalFailed: number;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { err } from '../../shared/types/index.js';
|
|
6
6
|
import { BaseDomainPlugin } from '../domain-interface.js';
|
|
7
7
|
import { requirePayloadFiles } from '../../shared/io/payload-path-guard.js';
|
|
8
|
+
import { requireTestRunTargets } from '../../shared/test-runner-project.js';
|
|
8
9
|
import { createTestExecutionCoordinator } from './coordinator.js';
|
|
9
10
|
import { getGlobalInfraHealing } from '../../strange-loop/infra-healing/global-instance.js';
|
|
10
11
|
import { isMeasuredGapPayload } from '../../shared/events/domain-events.js';
|
|
@@ -65,12 +66,14 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
|
|
|
65
66
|
// directories (#909 Jest targets) inside the project, passed on as the
|
|
66
67
|
// real paths that were checked. A missing one is still reported by the
|
|
67
68
|
// runner.
|
|
69
|
+
// #1247: an explicit projectRoot is confined the same way.
|
|
68
70
|
let testFiles;
|
|
71
|
+
let projectRoot;
|
|
69
72
|
if (payload.testFiles !== undefined) {
|
|
70
|
-
const confined = await
|
|
73
|
+
const confined = await requireTestRunTargets('execute-tests', payload.testFiles, payload.projectRoot);
|
|
71
74
|
if (!confined.success)
|
|
72
75
|
return confined;
|
|
73
|
-
testFiles = confined.value;
|
|
76
|
+
({ testFiles, projectRoot } = confined.value);
|
|
74
77
|
}
|
|
75
78
|
// Support both simple and full request formats
|
|
76
79
|
if (testFiles) {
|
|
@@ -81,6 +84,7 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
|
|
|
81
84
|
retryCount: payload.retryCount,
|
|
82
85
|
timeout: payload.timeout,
|
|
83
86
|
workers: payload.workers,
|
|
87
|
+
projectRoot,
|
|
84
88
|
};
|
|
85
89
|
return this.coordinator.runTests(request);
|
|
86
90
|
}
|
|
@@ -74,6 +74,8 @@ export interface RetryExecutionRequest {
|
|
|
74
74
|
baseDelay?: number;
|
|
75
75
|
maxDelay?: number;
|
|
76
76
|
onRetry?: (testId: string, attempt: number) => void;
|
|
77
|
+
/** #1247: the run's explicit projectRoot; every retry runs from it. */
|
|
78
|
+
projectRoot?: string;
|
|
77
79
|
}
|
|
78
80
|
export interface RetryStatistics {
|
|
79
81
|
totalRetries: number;
|
|
@@ -6,6 +6,7 @@ import { LoggerFactory } from '../../../logging/index.js';
|
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
7
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
8
8
|
import { jestExactPathPattern, nameFilterArg, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
9
|
+
import { runnerCwdFor } from '../../../shared/test-runner-project.js';
|
|
9
10
|
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
10
11
|
import { resolve as resolvePath } from 'node:path';
|
|
11
12
|
import { ok, err } from '../../../shared/types/index.js';
|
|
@@ -92,7 +93,7 @@ export class RetryHandlerService {
|
|
|
92
93
|
* Execute failed tests with retry logic
|
|
93
94
|
*/
|
|
94
95
|
async executeWithRetry(request) {
|
|
95
|
-
const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, } = request;
|
|
96
|
+
const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, projectRoot, } = request;
|
|
96
97
|
try {
|
|
97
98
|
const stats = {
|
|
98
99
|
runId,
|
|
@@ -108,7 +109,7 @@ export class RetryHandlerService {
|
|
|
108
109
|
const unmatched = [];
|
|
109
110
|
const tests = [];
|
|
110
111
|
for (const test of failedTests) {
|
|
111
|
-
const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry);
|
|
112
|
+
const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot);
|
|
112
113
|
stats.totalRetries += result.attempts;
|
|
113
114
|
if (result.passed) {
|
|
114
115
|
nowPassing.push(test.testId);
|
|
@@ -228,7 +229,7 @@ export class RetryHandlerService {
|
|
|
228
229
|
return false;
|
|
229
230
|
}
|
|
230
231
|
}
|
|
231
|
-
async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry) {
|
|
232
|
+
async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot) {
|
|
232
233
|
let attempts = 0;
|
|
233
234
|
// #1122: the final error is persisted in retry-history, so keep it redacted.
|
|
234
235
|
let lastError = redactFailureText(test.error);
|
|
@@ -246,7 +247,7 @@ export class RetryHandlerService {
|
|
|
246
247
|
onRetry(test.testId, attempts + 1);
|
|
247
248
|
}
|
|
248
249
|
// Execute test (simulated - in real implementation, would run actual test)
|
|
249
|
-
const result = await this.executeTest(test);
|
|
250
|
+
const result = await this.executeTest(test, projectRoot);
|
|
250
251
|
// #1141: a filter that selected no test reran nothing. Report that
|
|
251
252
|
// instead of counting it as a retry, and stop: another attempt would
|
|
252
253
|
// select nothing again.
|
|
@@ -272,7 +273,7 @@ export class RetryHandlerService {
|
|
|
272
273
|
finalError: lastError,
|
|
273
274
|
};
|
|
274
275
|
}
|
|
275
|
-
async executeTest(test) {
|
|
276
|
+
async executeTest(test, projectRoot) {
|
|
276
277
|
// In simulation mode (for unit testing), use random behavior
|
|
277
278
|
if (this.config.simulateForTesting) {
|
|
278
279
|
const passOnRetry = secureRandom() < this.config.simulatedRetrySuccessRate;
|
|
@@ -282,12 +283,12 @@ export class RetryHandlerService {
|
|
|
282
283
|
};
|
|
283
284
|
}
|
|
284
285
|
// In production mode, actually execute the test
|
|
285
|
-
return this.executeRealTest(test);
|
|
286
|
+
return this.executeRealTest(test, projectRoot);
|
|
286
287
|
}
|
|
287
288
|
/**
|
|
288
289
|
* Execute a real test using the configured test runner
|
|
289
290
|
*/
|
|
290
|
-
async executeRealTest(test) {
|
|
291
|
+
async executeRealTest(test, projectRoot) {
|
|
291
292
|
const testFile = test.file;
|
|
292
293
|
const testName = test.testName;
|
|
293
294
|
const cwd = this.config.cwd ?? process.cwd();
|
|
@@ -295,8 +296,12 @@ export class RetryHandlerService {
|
|
|
295
296
|
if (!existsSync(testFile)) {
|
|
296
297
|
throw new Error(`Test file not found: ${testFile}. Cannot retry non-existent test file.`);
|
|
297
298
|
}
|
|
299
|
+
// #1247: retry from the same directory as the first run: the caller's
|
|
300
|
+
// projectRoot, else a configured directory, else the file's runner
|
|
301
|
+
// project. The file path stays relative to `cwd`.
|
|
302
|
+
const runCwd = projectRoot ?? this.config.cwd ?? runnerCwdFor(testFile);
|
|
298
303
|
// Detect or use configured test runner
|
|
299
|
-
const runner = await this.detectTestRunner(
|
|
304
|
+
const runner = await this.detectTestRunner(runCwd);
|
|
300
305
|
if (!runner) {
|
|
301
306
|
throw new Error(`No test runner detected or configured. Install vitest, jest, or mocha, ` +
|
|
302
307
|
`or configure testRunner in RetryHandlerConfig. Cannot execute retry for: ${testFile}`);
|
|
@@ -304,7 +309,7 @@ export class RetryHandlerService {
|
|
|
304
309
|
// Build command based on runner
|
|
305
310
|
const { command, args, report } = this.buildTestCommand(runner, testFile, testName, cwd);
|
|
306
311
|
// Execute the test
|
|
307
|
-
return this.spawnTestProcess(command, args,
|
|
312
|
+
return this.spawnTestProcess(command, args, runCwd, report, runner === 'vitest' ? testFile : undefined);
|
|
308
313
|
}
|
|
309
314
|
/**
|
|
310
315
|
* Detect which test runner is available in the project
|
|
@@ -113,6 +113,7 @@ export declare class TestExecutorService implements ITestExecutionService {
|
|
|
113
113
|
private mergeSequentialCoverage;
|
|
114
114
|
private executeTestFile;
|
|
115
115
|
private executeTestFiles;
|
|
116
|
+
private executeProjectFiles;
|
|
116
117
|
/**
|
|
117
118
|
* Spawn actual test runner process (vitest, jest, mocha)
|
|
118
119
|
*/
|
|
@@ -21,6 +21,7 @@ import { mergeTestCases, redactFailedTests, redactFailureText, testCasesFromRunn
|
|
|
21
21
|
import { capDiagnostics, getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
22
22
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
23
23
|
import { jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
24
|
+
import { groupByRunnerProject } from '../../../shared/test-runner-project.js';
|
|
24
25
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
25
26
|
import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
|
|
26
27
|
const DEFAULT_CONFIG = {
|
|
@@ -314,7 +315,7 @@ Provide:
|
|
|
314
315
|
return ok(undefined);
|
|
315
316
|
}
|
|
316
317
|
async runTests(request) {
|
|
317
|
-
const { testFiles, framework, timeout = 30000 } = request;
|
|
318
|
+
const { testFiles, framework, timeout = 30000, projectRoot } = request;
|
|
318
319
|
const failedTests = [];
|
|
319
320
|
const coverages = [];
|
|
320
321
|
const allFileCoverages = [];
|
|
@@ -323,7 +324,7 @@ Provide:
|
|
|
323
324
|
let failed = 0;
|
|
324
325
|
let skipped = 0;
|
|
325
326
|
for (const file of testFiles) {
|
|
326
|
-
const result = await this.executeTestFile(file, framework, timeout);
|
|
327
|
+
const result = await this.executeTestFile(file, framework, timeout, projectRoot);
|
|
327
328
|
executionResults.push(result);
|
|
328
329
|
passed += result.passed;
|
|
329
330
|
failed += result.failed;
|
|
@@ -393,16 +394,34 @@ Provide:
|
|
|
393
394
|
const coverage = this.extractCoverageFromJson({ coverageMap: merged });
|
|
394
395
|
return coverage.summary ? { summary: coverage.summary, perFile: coverage.perFile } : undefined;
|
|
395
396
|
}
|
|
396
|
-
async executeTestFile(file, framework, timeout) {
|
|
397
|
-
return this.executeTestFiles([file], framework, timeout);
|
|
397
|
+
async executeTestFile(file, framework, timeout, projectRoot) {
|
|
398
|
+
return this.executeTestFiles([file], framework, timeout, projectRoot);
|
|
398
399
|
}
|
|
399
|
-
async executeTestFiles(files, framework, timeout) {
|
|
400
|
+
async executeTestFiles(files, framework, timeout, projectRoot) {
|
|
400
401
|
// In simulation mode (for unit testing), use random behavior
|
|
401
402
|
if (this.config.simulateForTesting) {
|
|
402
403
|
return this.aggregateResults(files.map(file => this.simulateTestExecution(file)));
|
|
403
404
|
}
|
|
405
|
+
// #1247: a runner loads the config of the directory it starts in, so each
|
|
406
|
+
// file runs from its own runner project (or the caller's projectRoot).
|
|
407
|
+
const groups = projectRoot
|
|
408
|
+
? [{ cwd: projectRoot, files }]
|
|
409
|
+
: groupByRunnerProject(files);
|
|
410
|
+
if (groups.length === 1) {
|
|
411
|
+
return this.executeProjectFiles(groups[0].files, framework, timeout, groups[0].cwd);
|
|
412
|
+
}
|
|
413
|
+
// Each project gets its own runner and timeout. Their coverage maps are
|
|
414
|
+
// merged from raw counters, or left unmeasured (#1030).
|
|
415
|
+
const results = await Promise.all(groups.map(group => this.executeProjectFiles(group.files, framework, timeout, group.cwd)));
|
|
416
|
+
const combined = this.aggregateResults(results);
|
|
417
|
+
const merged = this.mergeSequentialCoverage(results);
|
|
418
|
+
combined.coverage = merged?.summary;
|
|
419
|
+
combined.fileCoverages = merged?.perFile;
|
|
420
|
+
return combined;
|
|
421
|
+
}
|
|
422
|
+
async executeProjectFiles(files, framework, timeout, cwd) {
|
|
404
423
|
// Production mode: spawn actual test runner process
|
|
405
|
-
const result = await this.spawnTestRunner(files, framework, timeout);
|
|
424
|
+
const result = await this.spawnTestRunner(files, framework, timeout, cwd);
|
|
406
425
|
if (result.success === false) {
|
|
407
426
|
// Runner/suite errors have no trustworthy assertion receipt to aggregate.
|
|
408
427
|
if (result.error instanceof TestRunnerExecutionError)
|
|
@@ -428,7 +447,7 @@ Provide:
|
|
|
428
447
|
/**
|
|
429
448
|
* Spawn actual test runner process (vitest, jest, mocha)
|
|
430
449
|
*/
|
|
431
|
-
async spawnTestRunner(files, framework, timeout) {
|
|
450
|
+
async spawnTestRunner(files, framework, timeout, cwd = process.cwd()) {
|
|
432
451
|
// Verify test file exists
|
|
433
452
|
const missingFile = files.find(file => !existsSync(file));
|
|
434
453
|
if (missingFile) {
|
|
@@ -466,7 +485,7 @@ Provide:
|
|
|
466
485
|
let proc;
|
|
467
486
|
try {
|
|
468
487
|
proc = spawn(command, args, {
|
|
469
|
-
cwd
|
|
488
|
+
cwd,
|
|
470
489
|
detached: process.platform !== 'win32',
|
|
471
490
|
env: {
|
|
472
491
|
...process.env,
|
|
@@ -999,7 +1018,7 @@ Provide:
|
|
|
999
1018
|
return shards;
|
|
1000
1019
|
}
|
|
1001
1020
|
async executeWorker(files, _workerIndex, _isolation, request) {
|
|
1002
|
-
return this.executeTestFiles(files, request.framework, request.timeout ?? 30000);
|
|
1021
|
+
return this.executeTestFiles(files, request.framework, request.timeout ?? 30000, request.projectRoot);
|
|
1003
1022
|
}
|
|
1004
1023
|
aggregateResults(results) {
|
|
1005
1024
|
const aggregated = {
|