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
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Contrast and keyboard checks through the unified browser client (#1228)
|
|
3
|
+
*
|
|
4
|
+
* The page audit runs through agent-browser (the default browser for audits);
|
|
5
|
+
* these checks use the same client, so they are measured whenever the audit is.
|
|
6
|
+
* Each runs axe-core in the loaded page and reports only what it returned.
|
|
7
|
+
*/
|
|
8
|
+
import { ok, err } from '../../../shared/types/index.js';
|
|
9
|
+
import { toError } from '../../../shared/error-utils.js';
|
|
10
|
+
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
11
|
+
import { AXE_LOADER_JS, KEYBOARD_NOT_MEASURED, getElementType, mapKeyboardIssueType } from './accessibility-tester-browser.js';
|
|
12
|
+
import { AXE_CONTRAST_DATA_JS, contrastValues, toContrastAnalysis } from './accessibility-contrast.js';
|
|
13
|
+
/** axe-core rules that concern keyboard operation and focus order. */
|
|
14
|
+
const KEYBOARD_RULES = ['bypass', 'tabindex', 'scrollable-region-focusable', 'accesskeys', 'frame-focusable-content'];
|
|
15
|
+
/** Browser-side helper that builds a CSS selector for an element. */
|
|
16
|
+
const CSS_PATH_JS = `function (el) {
|
|
17
|
+
if (el.id) return '#' + CSS.escape(el.id);
|
|
18
|
+
var parts = [];
|
|
19
|
+
while (el && el.nodeType === 1 && el !== document.documentElement) {
|
|
20
|
+
var part = el.tagName.toLowerCase();
|
|
21
|
+
var parent = el.parentElement;
|
|
22
|
+
if (parent) {
|
|
23
|
+
var same = Array.prototype.filter.call(parent.children, function (c) { return c.tagName === el.tagName; });
|
|
24
|
+
if (same.length > 1) part += ':nth-of-type(' + (same.indexOf(el) + 1) + ')';
|
|
25
|
+
}
|
|
26
|
+
parts.unshift(part);
|
|
27
|
+
el = parent;
|
|
28
|
+
}
|
|
29
|
+
return parts.join(' > ');
|
|
30
|
+
}`;
|
|
31
|
+
/**
|
|
32
|
+
* Check colour contrast with axe-core's contrast rule. Lists every element the
|
|
33
|
+
* rule checked, failing and passing, with the colours and ratio it measured.
|
|
34
|
+
*/
|
|
35
|
+
export async function checkContrastWithBrowserClient(client, url, wcagLevel, browserConfig) {
|
|
36
|
+
const rule = wcagLevel === 'AAA' ? 'color-contrast-enhanced' : 'color-contrast';
|
|
37
|
+
const script = `
|
|
38
|
+
(async function() {
|
|
39
|
+
${AXE_LOADER_JS}
|
|
40
|
+
const contrastOf = ${AXE_CONTRAST_DATA_JS};
|
|
41
|
+
const results = await axe.run(document, { runOnly: { type: 'rule', values: ['${rule}'] } });
|
|
42
|
+
const nodesOf = (rules) => rules.flatMap(r => r.nodes.map(n => ({
|
|
43
|
+
selector: n.target.join(' > '),
|
|
44
|
+
failureSummary: n.failureSummary,
|
|
45
|
+
contrast: contrastOf(n)
|
|
46
|
+
})));
|
|
47
|
+
return JSON.stringify({ violations: nodesOf(results.violations), passes: nodesOf(results.passes) });
|
|
48
|
+
})();
|
|
49
|
+
`;
|
|
50
|
+
const result = await withLoadedPage(client, url, browserConfig, () => evaluateJson(client, script, 'contrast check'));
|
|
51
|
+
if (!result.success)
|
|
52
|
+
return result;
|
|
53
|
+
return ok([
|
|
54
|
+
...result.value.violations.map((n) => toContrastAnalysis(n.selector, contrastValues(n.contrast, n.failureSummary), false, wcagLevel)),
|
|
55
|
+
...result.value.passes.map((n) => toContrastAnalysis(n.selector, contrastValues(n.contrast, n.failureSummary), true, wcagLevel)),
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check keyboard navigation: the focusable elements in document order and
|
|
60
|
+
* axe-core's keyboard rules. Focus indicators and traps are not measured.
|
|
61
|
+
*/
|
|
62
|
+
export async function checkKeyboardWithBrowserClient(client, url, browserConfig) {
|
|
63
|
+
const script = `
|
|
64
|
+
(async function() {
|
|
65
|
+
${AXE_LOADER_JS}
|
|
66
|
+
const cssPath = ${CSS_PATH_JS};
|
|
67
|
+
const candidates = document.querySelectorAll('a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"])');
|
|
68
|
+
const focusable = Array.from(candidates)
|
|
69
|
+
.filter(el => !el.disabled && el.getClientRects().length > 0)
|
|
70
|
+
.map(el => ({ selector: cssPath(el), tagName: el.tagName }));
|
|
71
|
+
const results = await axe.run(document, { runOnly: { type: 'rule', values: ${JSON.stringify(KEYBOARD_RULES)} } });
|
|
72
|
+
return JSON.stringify({
|
|
73
|
+
focusable,
|
|
74
|
+
violations: results.violations.map(v => ({
|
|
75
|
+
id: v.id,
|
|
76
|
+
nodes: v.nodes.map(n => ({ selector: n.target.join(' > '), failureSummary: n.failureSummary }))
|
|
77
|
+
}))
|
|
78
|
+
});
|
|
79
|
+
})();
|
|
80
|
+
`;
|
|
81
|
+
const result = await withLoadedPage(client, url, browserConfig, () => evaluateJson(client, script, 'keyboard check'));
|
|
82
|
+
if (!result.success)
|
|
83
|
+
return result;
|
|
84
|
+
const tabOrder = result.value.focusable.map((el, index) => ({
|
|
85
|
+
index,
|
|
86
|
+
selector: el.selector,
|
|
87
|
+
elementType: getElementType(el.tagName),
|
|
88
|
+
hasVisibleFocus: null,
|
|
89
|
+
}));
|
|
90
|
+
const issues = result.value.violations.flatMap((v) => v.nodes.map((n) => ({
|
|
91
|
+
type: mapKeyboardIssueType(v.id),
|
|
92
|
+
selector: n.selector,
|
|
93
|
+
description: n.failureSummary ?? v.id,
|
|
94
|
+
})));
|
|
95
|
+
return ok({
|
|
96
|
+
url,
|
|
97
|
+
focusableElements: tabOrder.length,
|
|
98
|
+
tabOrder,
|
|
99
|
+
issues,
|
|
100
|
+
traps: [],
|
|
101
|
+
notMeasured: [...KEYBOARD_NOT_MEASURED],
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async function withLoadedPage(client, url, browserConfig, run) {
|
|
105
|
+
try {
|
|
106
|
+
const launchResult = await client.launch({ headless: browserConfig.headless });
|
|
107
|
+
if (!launchResult.success) {
|
|
108
|
+
return err(new Error(`Failed to launch browser: ${launchResult.error?.message ?? 'Unknown error'}`));
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const navResult = await client.navigate(url);
|
|
112
|
+
if (!navResult.success) {
|
|
113
|
+
return err(new Error(`Failed to navigate to ${url}: ${navResult.error?.message ?? 'Unknown error'}`));
|
|
114
|
+
}
|
|
115
|
+
return await run();
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
await client.quit();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return err(toError(error));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function evaluateJson(client, script, label) {
|
|
126
|
+
const evalResult = await client.evaluate(script);
|
|
127
|
+
if (!evalResult.success) {
|
|
128
|
+
return err(new Error(`Failed to run the ${label}: ${evalResult.error?.message ?? 'Unknown error'}`));
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
return ok(safeJsonParse(evalResult.value));
|
|
132
|
+
}
|
|
133
|
+
catch (parseError) {
|
|
134
|
+
return err(new Error(`Failed to parse the ${label} results: ${parseError}`));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=accessibility-tester-checks.js.map
|
|
@@ -65,6 +65,11 @@ export declare class AccessibilityTesterService implements IAccessibilityAuditin
|
|
|
65
65
|
/** Simulation mode: synthetic results, labelled unmeasured and never stored. */
|
|
66
66
|
private auditSimulated;
|
|
67
67
|
checkContrast(url: string): Promise<Result<ContrastAnalysis[], Error>>;
|
|
68
|
+
/**
|
|
69
|
+
* Run a check with the browser client the page audit uses (agent-browser),
|
|
70
|
+
* then Vibium (#1228). The error is the not-measured reason when neither ran.
|
|
71
|
+
*/
|
|
72
|
+
private runBrowserCheck;
|
|
68
73
|
validateWCAGLevel(url: string, level: 'A' | 'AA' | 'AAA'): Promise<Result<WCAGValidationResult, Error>>;
|
|
69
74
|
checkKeyboardNavigation(url: string): Promise<Result<KeyboardNavigationReport, Error>>;
|
|
70
75
|
private storeReport;
|
|
@@ -30,6 +30,7 @@ import { toError } from '../../../shared/error-utils.js';
|
|
|
30
30
|
import { getBrowserClientForUseCase, } from '../../../integrations/browser/index.js';
|
|
31
31
|
// Extracted modules
|
|
32
32
|
import { WCAG_CRITERIA, getErrorMessage, auditWithBrowserClient, auditWithVibium, auditElementWithVibium, checkContrastWithVibium, checkKeyboardWithVibium, } from './accessibility-tester-browser.js';
|
|
33
|
+
import { checkContrastWithBrowserClient, checkKeyboardWithBrowserClient, } from './accessibility-tester-checks.js';
|
|
33
34
|
import { initializeRules, filterRulesByLevel, runSimulatedRule, hashUrl, } from './accessibility-tester-heuristics.js';
|
|
34
35
|
const DEFAULT_CONFIG = {
|
|
35
36
|
defaultWCAGLevel: 'AA',
|
|
@@ -245,26 +246,47 @@ export class AccessibilityTesterService {
|
|
|
245
246
|
// ============================================================================
|
|
246
247
|
async checkContrast(url) {
|
|
247
248
|
try {
|
|
248
|
-
//
|
|
249
|
-
const cacheKey = `visual-accessibility:contrast:
|
|
249
|
+
// v3 (#1145, #1228): never serve a guessed result cached by an earlier version.
|
|
250
|
+
const cacheKey = `visual-accessibility:contrast:v3:${hashUrl(url)}`;
|
|
250
251
|
const cached = await this.memory.get(cacheKey);
|
|
251
252
|
if (cached)
|
|
252
253
|
return ok(cached);
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
}
|
|
260
|
-
const analyses = browserResult.value;
|
|
261
|
-
await this.memory.set(cacheKey, analyses, { namespace: 'visual-accessibility', ttl: 3600 });
|
|
262
|
-
return ok(analyses);
|
|
254
|
+
const level = this.config.defaultWCAGLevel;
|
|
255
|
+
const result = await this.runBrowserCheck((client) => checkContrastWithBrowserClient(client, url, level, this.config.browserConfig), (vibium) => checkContrastWithVibium(vibium, url, level, this.config.browserConfig));
|
|
256
|
+
if (!result.success)
|
|
257
|
+
return err(notMeasuredError('Color contrast', url, result.error.message));
|
|
258
|
+
await this.memory.set(cacheKey, result.value, { namespace: 'visual-accessibility', ttl: 3600 });
|
|
259
|
+
return ok(result.value);
|
|
263
260
|
}
|
|
264
261
|
catch (error) {
|
|
265
262
|
return err(toError(error));
|
|
266
263
|
}
|
|
267
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* Run a check with the browser client the page audit uses (agent-browser),
|
|
267
|
+
* then Vibium (#1228). The error is the not-measured reason when neither ran.
|
|
268
|
+
*/
|
|
269
|
+
async runBrowserCheck(withClient, withVibium) {
|
|
270
|
+
const failures = [];
|
|
271
|
+
if (this.shouldUseBrowserMode()) {
|
|
272
|
+
const browserClient = await this.getBrowserClient();
|
|
273
|
+
if (browserClient) {
|
|
274
|
+
const result = await withClient(browserClient);
|
|
275
|
+
if (result.success)
|
|
276
|
+
return result;
|
|
277
|
+
failures.push(getErrorMessage(result));
|
|
278
|
+
logger.warn(`Browser client check failed: ${getErrorMessage(result)}`);
|
|
279
|
+
}
|
|
280
|
+
if (this.vibiumClient) {
|
|
281
|
+
const result = await withVibium(this.vibiumClient);
|
|
282
|
+
if (result.success)
|
|
283
|
+
return result;
|
|
284
|
+
failures.push(getErrorMessage(result));
|
|
285
|
+
logger.warn(`Vibium check failed: ${getErrorMessage(result)}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return err(new Error(this.notMeasuredReason(failures)));
|
|
289
|
+
}
|
|
268
290
|
// ============================================================================
|
|
269
291
|
// WCAG Validation
|
|
270
292
|
// ============================================================================
|
|
@@ -297,22 +319,19 @@ export class AccessibilityTesterService {
|
|
|
297
319
|
// ============================================================================
|
|
298
320
|
async checkKeyboardNavigation(url) {
|
|
299
321
|
try {
|
|
300
|
-
|
|
322
|
+
// v3 (#1228): earlier versions cached hasVisibleFocus: true without measuring it.
|
|
323
|
+
const cacheKey = `visual-accessibility:keyboard:v3:${hashUrl(url)}`;
|
|
301
324
|
const cached = await this.memory.get(cacheKey);
|
|
302
325
|
if (cached)
|
|
303
326
|
return ok(cached);
|
|
304
|
-
if (!this.
|
|
305
|
-
|
|
306
|
-
? this.notMeasuredReason([]) : 'the keyboard check is disabled';
|
|
307
|
-
return err(notMeasuredError('Keyboard navigation', url, reason));
|
|
327
|
+
if (!this.config.enableKeyboardCheck) {
|
|
328
|
+
return err(notMeasuredError('Keyboard navigation', url, 'the keyboard check is disabled'));
|
|
308
329
|
}
|
|
309
|
-
const
|
|
310
|
-
if (!
|
|
311
|
-
return err(notMeasuredError('Keyboard navigation', url,
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
await this.memory.set(cacheKey, report, { namespace: 'visual-accessibility', ttl: 3600 });
|
|
315
|
-
return ok(report);
|
|
330
|
+
const result = await this.runBrowserCheck((client) => checkKeyboardWithBrowserClient(client, url, this.config.browserConfig), (vibium) => checkKeyboardWithVibium(vibium, url, this.config.defaultWCAGLevel, this.config.browserConfig));
|
|
331
|
+
if (!result.success)
|
|
332
|
+
return err(notMeasuredError('Keyboard navigation', url, result.error.message));
|
|
333
|
+
await this.memory.set(cacheKey, result.value, { namespace: 'visual-accessibility', ttl: 3600 });
|
|
334
|
+
return ok(result.value);
|
|
316
335
|
}
|
|
317
336
|
catch (error) {
|
|
318
337
|
return err(toError(error));
|
|
@@ -178,9 +178,8 @@ export declare class BrowserSwarmCoordinator {
|
|
|
178
178
|
/**
|
|
179
179
|
* Run accessibility audit across all viewports
|
|
180
180
|
*
|
|
181
|
-
* Navigates to the URL and runs
|
|
182
|
-
*
|
|
183
|
-
* would require integration with axe-core or similar tools.
|
|
181
|
+
* Navigates to the URL and runs axe-core in each viewport. A viewport whose
|
|
182
|
+
* audit did not run is listed under failures, never as a clean report (#1228).
|
|
184
183
|
*
|
|
185
184
|
* @param url - URL to audit
|
|
186
185
|
* @returns Accessibility audit results by viewport
|
|
@@ -24,6 +24,7 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
24
24
|
import { ok, err } from '../../../shared/types/index.js';
|
|
25
25
|
import { FilePath } from '../../../shared/value-objects/index.js';
|
|
26
26
|
import { toError } from '../../../shared/error-utils.js';
|
|
27
|
+
import { runAxeCore, mapAxeResultToReport } from './accessibility-tester-browser.js';
|
|
27
28
|
import { getBrowserClientForUseCase, } from '../../../integrations/browser/index.js';
|
|
28
29
|
/**
|
|
29
30
|
* Standard viewport configurations for common devices
|
|
@@ -304,9 +305,8 @@ export class BrowserSwarmCoordinator {
|
|
|
304
305
|
/**
|
|
305
306
|
* Run accessibility audit across all viewports
|
|
306
307
|
*
|
|
307
|
-
* Navigates to the URL and runs
|
|
308
|
-
*
|
|
309
|
-
* would require integration with axe-core or similar tools.
|
|
308
|
+
* Navigates to the URL and runs axe-core in each viewport. A viewport whose
|
|
309
|
+
* audit did not run is listed under failures, never as a clean report (#1228).
|
|
310
310
|
*
|
|
311
311
|
* @param url - URL to audit
|
|
312
312
|
* @returns Accessibility audit results by viewport
|
|
@@ -326,17 +326,11 @@ export class BrowserSwarmCoordinator {
|
|
|
326
326
|
if (this.isAgentBrowserClient(session.client)) {
|
|
327
327
|
await session.client.setViewport(viewport.width, viewport.height);
|
|
328
328
|
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
violations: [],
|
|
335
|
-
passes: [],
|
|
336
|
-
incomplete: [],
|
|
337
|
-
score: 100,
|
|
338
|
-
wcagLevel: 'AA',
|
|
339
|
-
};
|
|
329
|
+
const axeResult = await runAxeCore(session.client, 'AA');
|
|
330
|
+
if (!axeResult.success) {
|
|
331
|
+
throw new Error(`Accessibility NOT MEASURED in this viewport: ${axeResult.error.message}`);
|
|
332
|
+
}
|
|
333
|
+
const report = { ...mapAxeResultToReport(url, axeResult.value, 'AA'), measured: true };
|
|
340
334
|
return report;
|
|
341
335
|
});
|
|
342
336
|
// Process results
|
|
@@ -171,12 +171,15 @@ export class CoverageLearner {
|
|
|
171
171
|
/**
|
|
172
172
|
* Persist a coverage session to the database
|
|
173
173
|
*/
|
|
174
|
-
persistSession(session) {
|
|
174
|
+
async persistSession(session) {
|
|
175
175
|
if (!this.db)
|
|
176
176
|
return;
|
|
177
177
|
try {
|
|
178
|
-
const
|
|
179
|
-
database.
|
|
178
|
+
const memory = this.db;
|
|
179
|
+
const database = memory.getDatabase();
|
|
180
|
+
// #1283: queued, so a locked memory.db does not freeze the MCP server's
|
|
181
|
+
// event loop while the tool call that recorded this coverage session waits.
|
|
182
|
+
await memory.writeWhenUnlocked(() => database.prepare(`
|
|
180
183
|
INSERT OR REPLACE INTO coverage_sessions (
|
|
181
184
|
id, target_path, agent_id, technique,
|
|
182
185
|
before_lines, before_branches, before_functions,
|
|
@@ -184,10 +187,10 @@ export class CoverageLearner {
|
|
|
184
187
|
tests_generated, tests_passed, gaps_json,
|
|
185
188
|
duration_ms, started_at, completed_at, context_json
|
|
186
189
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
187
|
-
`).run(session.id, session.targetPath, session.agentId, session.technique, session.beforeCoverage.lines, session.beforeCoverage.branches, session.beforeCoverage.functions, session.afterCoverage.lines, session.afterCoverage.branches, session.afterCoverage.functions, session.testsGenerated, session.testsPassed, JSON.stringify(session.gapsTargeted), session.durationMs, session.startedAt instanceof Date ? session.startedAt.toISOString() : session.startedAt, session.completedAt instanceof Date ? session.completedAt.toISOString() : session.completedAt, session.context ? JSON.stringify(session.context) : null);
|
|
190
|
+
`).run(session.id, session.targetPath, session.agentId, session.technique, session.beforeCoverage.lines, session.beforeCoverage.branches, session.beforeCoverage.functions, session.afterCoverage.lines, session.afterCoverage.branches, session.afterCoverage.functions, session.testsGenerated, session.testsPassed, JSON.stringify(session.gapsTargeted), session.durationMs, session.startedAt instanceof Date ? session.startedAt.toISOString() : session.startedAt, session.completedAt instanceof Date ? session.completedAt.toISOString() : session.completedAt, session.context ? JSON.stringify(session.context) : null));
|
|
188
191
|
this.persistCount++;
|
|
189
192
|
if (this.persistCount % CoverageLearner.RETENTION_CLEANUP_INTERVAL === 0) {
|
|
190
|
-
this.enforceRetention(
|
|
193
|
+
await this.enforceRetention(memory);
|
|
191
194
|
}
|
|
192
195
|
}
|
|
193
196
|
catch (error) {
|
|
@@ -197,14 +200,15 @@ export class CoverageLearner {
|
|
|
197
200
|
/**
|
|
198
201
|
* Delete oldest rows beyond retention limit
|
|
199
202
|
*/
|
|
200
|
-
enforceRetention(
|
|
203
|
+
async enforceRetention(memory) {
|
|
201
204
|
try {
|
|
205
|
+
const database = memory.getDatabase();
|
|
202
206
|
const maxRows = this.config.maxOutcomesInMemory * 2;
|
|
203
|
-
database.prepare(`
|
|
207
|
+
await memory.writeWhenUnlocked(() => database.prepare(`
|
|
204
208
|
DELETE FROM coverage_sessions WHERE id NOT IN (
|
|
205
209
|
SELECT id FROM coverage_sessions ORDER BY created_at DESC LIMIT ?
|
|
206
210
|
)
|
|
207
|
-
`).run(maxRows);
|
|
211
|
+
`).run(maxRows));
|
|
208
212
|
}
|
|
209
213
|
catch (error) {
|
|
210
214
|
console.warn('[CoverageLearner] Retention cleanup failed:', toErrorMessage(error));
|
|
@@ -216,7 +220,7 @@ export class CoverageLearner {
|
|
|
216
220
|
async learnFromSession(session) {
|
|
217
221
|
// Store session
|
|
218
222
|
this.sessionStore.add(session);
|
|
219
|
-
this.persistSession(session);
|
|
223
|
+
await this.persistSession(session);
|
|
220
224
|
// Calculate improvement
|
|
221
225
|
const improvement = this.calculateOverallImprovement(session);
|
|
222
226
|
// Only learn from significant improvements
|
|
@@ -142,12 +142,15 @@ export class TestOutcomeTracker {
|
|
|
142
142
|
/**
|
|
143
143
|
* Persist a single outcome to DB (write-through)
|
|
144
144
|
*/
|
|
145
|
-
persistOutcome(outcome) {
|
|
145
|
+
async persistOutcome(outcome) {
|
|
146
146
|
if (!this.db)
|
|
147
147
|
return;
|
|
148
148
|
try {
|
|
149
|
-
const
|
|
150
|
-
database.
|
|
149
|
+
const memory = this.db;
|
|
150
|
+
const database = memory.getDatabase();
|
|
151
|
+
// #1283: queued, so a locked memory.db does not freeze the MCP server's
|
|
152
|
+
// event loop while the tool call that recorded this test outcome waits.
|
|
153
|
+
await memory.writeWhenUnlocked(() => database.prepare(`
|
|
151
154
|
INSERT OR REPLACE INTO test_outcomes (
|
|
152
155
|
id, test_id, test_name, generated_by, pattern_id,
|
|
153
156
|
framework, language, domain, passed, error_message,
|
|
@@ -156,10 +159,10 @@ export class TestOutcomeTracker {
|
|
|
156
159
|
maintainability_score, complexity, lines_of_code,
|
|
157
160
|
assertion_count, file_path, source_file_path, metadata_json
|
|
158
161
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
159
|
-
`).run(outcome.id, outcome.testId, outcome.testName, outcome.generatedBy, outcome.patternId || null, outcome.framework, outcome.language, outcome.domain, outcome.passed ? 1 : 0, outcome.errorMessage || null, outcome.coverage.lines, outcome.coverage.branches, outcome.coverage.functions, outcome.mutationScore ?? null, outcome.executionTimeMs, outcome.flaky ? 1 : 0, outcome.flakinessScore ?? null, outcome.maintainabilityScore, outcome.complexity ?? null, outcome.linesOfCode ?? null, outcome.assertionCount ?? null, outcome.filePath || null, outcome.sourceFilePath || null, outcome.metadata ? JSON.stringify(outcome.metadata) : null);
|
|
162
|
+
`).run(outcome.id, outcome.testId, outcome.testName, outcome.generatedBy, outcome.patternId || null, outcome.framework, outcome.language, outcome.domain, outcome.passed ? 1 : 0, outcome.errorMessage || null, outcome.coverage.lines, outcome.coverage.branches, outcome.coverage.functions, outcome.mutationScore ?? null, outcome.executionTimeMs, outcome.flaky ? 1 : 0, outcome.flakinessScore ?? null, outcome.maintainabilityScore, outcome.complexity ?? null, outcome.linesOfCode ?? null, outcome.assertionCount ?? null, outcome.filePath || null, outcome.sourceFilePath || null, outcome.metadata ? JSON.stringify(outcome.metadata) : null));
|
|
160
163
|
this.persistCount++;
|
|
161
164
|
if (this.persistCount % TestOutcomeTracker.RETENTION_CLEANUP_INTERVAL === 0) {
|
|
162
|
-
this.enforceRetention(
|
|
165
|
+
await this.enforceRetention(memory);
|
|
163
166
|
}
|
|
164
167
|
}
|
|
165
168
|
catch (error) {
|
|
@@ -169,14 +172,15 @@ export class TestOutcomeTracker {
|
|
|
169
172
|
/**
|
|
170
173
|
* Delete oldest rows beyond retention limit
|
|
171
174
|
*/
|
|
172
|
-
enforceRetention(
|
|
175
|
+
async enforceRetention(memory) {
|
|
173
176
|
try {
|
|
177
|
+
const database = memory.getDatabase();
|
|
174
178
|
const maxRows = this.config.maxOutcomesInMemory * 2; // Keep 2x in-memory limit in DB
|
|
175
|
-
database.prepare(`
|
|
179
|
+
await memory.writeWhenUnlocked(() => database.prepare(`
|
|
176
180
|
DELETE FROM test_outcomes WHERE id NOT IN (
|
|
177
181
|
SELECT id FROM test_outcomes ORDER BY created_at DESC LIMIT ?
|
|
178
182
|
)
|
|
179
|
-
`).run(maxRows);
|
|
183
|
+
`).run(maxRows));
|
|
180
184
|
}
|
|
181
185
|
catch (error) {
|
|
182
186
|
console.warn('[TestOutcomeTracker] Retention cleanup failed:', toErrorMessage(error));
|
|
@@ -188,7 +192,7 @@ export class TestOutcomeTracker {
|
|
|
188
192
|
async track(outcome) {
|
|
189
193
|
// 1. Store outcome
|
|
190
194
|
this.store.add(outcome);
|
|
191
|
-
this.persistOutcome(outcome);
|
|
195
|
+
await this.persistOutcome(outcome);
|
|
192
196
|
// 2. Update pattern metrics if pattern was used
|
|
193
197
|
if (outcome.patternId) {
|
|
194
198
|
this.updatePatternMetrics(outcome);
|
|
@@ -245,6 +245,11 @@ export declare class WitnessChain {
|
|
|
245
245
|
export interface IWitnessChainPersistence {
|
|
246
246
|
/** Store a receipt in SQLite. Called after each appendWitness(). */
|
|
247
247
|
insertReceipt(receipt: WitnessReceipt): void;
|
|
248
|
+
/**
|
|
249
|
+
* Store a receipt without blocking on a locked database (#1283). When
|
|
250
|
+
* present, appendWitness() uses it instead of insertReceipt().
|
|
251
|
+
*/
|
|
252
|
+
insertReceiptWhenUnlocked?(receipt: WitnessReceipt): Promise<void>;
|
|
248
253
|
/** Load all receipts from SQLite, ordered by chainIndex. */
|
|
249
254
|
loadAllReceipts(): WitnessReceipt[];
|
|
250
255
|
/** Get the total count of persisted receipts. */
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
import { createHash, randomUUID } from 'crypto';
|
|
19
19
|
import { LoggerFactory } from '../logging/index.js';
|
|
20
20
|
import { getRuVectorFeatureFlags } from '../integrations/ruvector/feature-flags.js';
|
|
21
|
+
import { writeWhenUnlockedOn } from '../shared/sqlite-write-queue.js';
|
|
21
22
|
const logger = LoggerFactory.create('witness-chain');
|
|
22
23
|
// ============================================================================
|
|
23
24
|
// SPRT Accumulator
|
|
@@ -387,14 +388,25 @@ export class PersistentWitnessChain extends WitnessChain {
|
|
|
387
388
|
*/
|
|
388
389
|
appendWitness(decision) {
|
|
389
390
|
const receipt = super.appendWitness(decision);
|
|
390
|
-
|
|
391
|
-
this.persistence.insertReceipt(receipt);
|
|
392
|
-
}
|
|
393
|
-
catch (err) {
|
|
391
|
+
const warn = (err) => {
|
|
394
392
|
logger.warn('Failed to persist witness receipt to SQLite', {
|
|
395
393
|
chainIndex: receipt.chainIndex,
|
|
396
394
|
error: err instanceof Error ? err.message : String(err),
|
|
397
395
|
});
|
|
396
|
+
};
|
|
397
|
+
try {
|
|
398
|
+
// #1283: queue the insert when the backend can, so a locked memory.db
|
|
399
|
+
// does not freeze the MCP server's event loop. The receipt is already in
|
|
400
|
+
// the in-memory chain, which is what callers read.
|
|
401
|
+
if (this.persistence.insertReceiptWhenUnlocked) {
|
|
402
|
+
this.persistence.insertReceiptWhenUnlocked(receipt).catch(warn);
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
this.persistence.insertReceipt(receipt);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
catch (err) {
|
|
409
|
+
warn(err);
|
|
398
410
|
}
|
|
399
411
|
return receipt;
|
|
400
412
|
}
|
|
@@ -440,9 +452,13 @@ export function createWitnessChainSQLitePersistence(db) {
|
|
|
440
452
|
const countStmt = db.prepare(`
|
|
441
453
|
SELECT COUNT(*) as cnt FROM witness_chain_receipts
|
|
442
454
|
`);
|
|
455
|
+
const insertReceipt = (receipt) => {
|
|
456
|
+
insertStmt.run(receipt.id, receipt.chainIndex, receipt.timestamp, receipt.previousHash, receipt.hash, receipt.decision.type, receipt.decision.decision, JSON.stringify(receipt.decision.context), receipt.decision.evidence ?? null);
|
|
457
|
+
};
|
|
443
458
|
return {
|
|
444
|
-
insertReceipt
|
|
445
|
-
|
|
459
|
+
insertReceipt,
|
|
460
|
+
insertReceiptWhenUnlocked(receipt) {
|
|
461
|
+
return writeWhenUnlockedOn(db, () => insertReceipt(receipt));
|
|
446
462
|
},
|
|
447
463
|
loadAllReceipts() {
|
|
448
464
|
const rows = loadAllStmt.all();
|
|
@@ -41,6 +41,11 @@ export interface Experience {
|
|
|
41
41
|
readonly avgTokenSavings: number;
|
|
42
42
|
/** Embedding for similarity search */
|
|
43
43
|
readonly embedding?: number[];
|
|
44
|
+
/**
|
|
45
|
+
* #1217: embedding-space identity (ADR-097 spaceId) the embedding was
|
|
46
|
+
* computed in. Only vectors from the active space are compared.
|
|
47
|
+
*/
|
|
48
|
+
readonly embeddingSpaceId?: string;
|
|
44
49
|
/** Creation timestamp */
|
|
45
50
|
readonly createdAt: Date;
|
|
46
51
|
/** Last applied timestamp */
|
|
@@ -135,6 +140,12 @@ export declare class ExperienceReplay {
|
|
|
135
140
|
private idToExperienceId;
|
|
136
141
|
private experienceIdToHnswId;
|
|
137
142
|
private nextHnswId;
|
|
143
|
+
/**
|
|
144
|
+
* #1217: embedding space the HNSW index holds vectors of. The index only
|
|
145
|
+
* holds vectors of one space, so a similarity is never measured across
|
|
146
|
+
* spaces. Null until the embedder's space is known.
|
|
147
|
+
*/
|
|
148
|
+
private indexSpaceId;
|
|
138
149
|
private recentExperiences;
|
|
139
150
|
private reservoirBuffer;
|
|
140
151
|
private stats;
|
|
@@ -157,6 +168,10 @@ export declare class ExperienceReplay {
|
|
|
157
168
|
/**
|
|
158
169
|
* Load embeddings into HNSW index for O(log n) similarity search
|
|
159
170
|
* Performance: 150x-12,500x faster than linear scan
|
|
171
|
+
*
|
|
172
|
+
* #1217: loads only vectors of the given embedding space, as the pattern
|
|
173
|
+
* banks do (ADR-097). Vectors of another space, or without provenance, are
|
|
174
|
+
* not comparable with a query embedded in this one.
|
|
160
175
|
*/
|
|
161
176
|
private loadEmbeddingIndex;
|
|
162
177
|
/**
|
|
@@ -245,6 +260,13 @@ export declare class ExperienceReplay {
|
|
|
245
260
|
dispose(): Promise<void>;
|
|
246
261
|
private ensureInitialized;
|
|
247
262
|
private rowToExperience;
|
|
263
|
+
/**
|
|
264
|
+
* #1217: add a stored vector to the HNSW index. A vector of another
|
|
265
|
+
* embedding space re-binds the index to that space (the active one, since
|
|
266
|
+
* the vector was just computed): the rows of that space are reloaded,
|
|
267
|
+
* including this one.
|
|
268
|
+
*/
|
|
269
|
+
private indexExperience;
|
|
248
270
|
private floatArrayToBuffer;
|
|
249
271
|
private bufferToFloatArray;
|
|
250
272
|
}
|