agentic-qe 3.15.10 → 3.15.11
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 +114 -0
- package/README.md +8 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2a/agent-cards/generator.js +6 -3
- package/dist/adapters/a2a/tasks/task-router.js +3 -1
- package/dist/adapters/trajectory-adapter.js +1 -1
- package/dist/agents/claim-verifier/verifiers/output-verifier.d.ts +3 -1
- package/dist/agents/claim-verifier/verifiers/output-verifier.js +31 -2
- package/dist/agents/overlay-loader.js +26 -21
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-V4GSGOOK.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-H7ANGXW4.js → agent-booster-wasm-TIDSQ3ZK.js} +2 -2
- package/dist/cli/chunks/{agent-handler-SVXSHEET.js → agent-handler-G3EPBVA7.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-WKQH36XL.js → agent-memory-branch-ARC5C7GW.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-6WQTM5YR.js +2 -0
- package/dist/cli/chunks/{arena-OPS36NFZ.js → arena-36DTATJV.js} +4 -4
- package/dist/cli/chunks/{arena-EKOOFVST.js → arena-K4I4QDXB.js} +2 -2
- package/dist/cli/chunks/{audit-AO5NDZRI.js → audit-WQSJSJZF.js} +3 -3
- package/dist/cli/chunks/base-AK7BXBX2.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-TFLVEMMY.js → better-sqlite3-BB4K67MT.js} +2 -2
- package/dist/cli/chunks/{brain-handler-ADBBJPYW.js → brain-handler-CU3GOIU3.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-HGHUYYL5.js → branch-enumerator-NJQX7ZNB.js} +2 -2
- package/dist/cli/chunks/{browser-5LU6P4SZ.js → browser-6YJF4FQW.js} +2 -2
- package/dist/cli/chunks/browser-workflow-VTDFBW7T.js +2 -0
- package/dist/cli/chunks/{chunk-LQEURY7C.js → chunk-25P77WA5.js} +1 -1
- package/dist/cli/chunks/{chunk-FFTPAWM6.js → chunk-2CW7VRPH.js} +8 -8
- package/dist/cli/chunks/chunk-2DTX7YAZ.js +6 -0
- package/dist/cli/chunks/{chunk-6KIL6CMD.js → chunk-2KFFEKSI.js} +2 -2
- package/dist/cli/chunks/{chunk-UARKIZAS.js → chunk-2VLYUF7U.js} +2 -2
- package/dist/cli/chunks/{chunk-A55QKKT2.js → chunk-325QCVDI.js} +2 -2
- package/dist/cli/chunks/{chunk-FBXTQNRH.js → chunk-35M2X3C5.js} +2 -2
- package/dist/cli/chunks/{chunk-S75EYIJG.js → chunk-3RHOPP7A.js} +1 -1
- package/dist/cli/chunks/{chunk-SY2IB442.js → chunk-4HJKQIX5.js} +2 -2
- package/dist/cli/chunks/chunk-4MUBW4RT.js +7 -0
- package/dist/cli/chunks/{chunk-KSIWGGJI.js → chunk-4RAQ7PJA.js} +2 -2
- package/dist/cli/chunks/{chunk-DT7SIJOA.js → chunk-4RH5I24Q.js} +2 -2
- package/dist/cli/chunks/{chunk-JHIY4VCC.js → chunk-4UBVAJFO.js} +3 -3
- package/dist/cli/chunks/{chunk-RPHY2DU6.js → chunk-4UX35V7P.js} +2 -2
- package/dist/cli/chunks/{chunk-7LFZ4CHM.js → chunk-4X4MWMHB.js} +2 -2
- package/dist/cli/chunks/{chunk-TNMBRDCA.js → chunk-55CH76ZO.js} +3 -3
- package/dist/cli/chunks/{chunk-6S3WJGUV.js → chunk-57LNKSW7.js} +2 -2
- package/dist/cli/chunks/chunk-5ERFHEEE.js +14 -0
- package/dist/cli/chunks/{chunk-KNQ2ERFX.js → chunk-5HQP4SLM.js} +2 -2
- package/dist/cli/chunks/{chunk-XFVTGAAJ.js → chunk-5MNASJOH.js} +2 -2
- package/dist/cli/chunks/{chunk-UCJMVXO4.js → chunk-5MTWCCZJ.js} +2 -2
- package/dist/cli/chunks/{chunk-GZLZCZ42.js → chunk-5N25I53C.js} +2 -2
- package/dist/cli/chunks/{chunk-NGKNYIQZ.js → chunk-5WYZHDIZ.js} +1 -1
- package/dist/cli/chunks/{chunk-GWZZ7DAO.js → chunk-5YLOLACR.js} +2 -2
- package/dist/cli/chunks/{chunk-B6LTH6YV.js → chunk-672XOJDG.js} +1 -1
- package/dist/cli/chunks/{chunk-DNRWGATA.js → chunk-6NA3KZZT.js} +3 -3
- package/dist/cli/chunks/chunk-72ZBJD2E.js +3 -0
- package/dist/cli/chunks/{chunk-XLZYRTNO.js → chunk-76SNL7GU.js} +2 -2
- package/dist/cli/chunks/{chunk-37OWRCUN.js → chunk-7HEMJHPP.js} +2 -2
- package/dist/cli/chunks/{chunk-WQ4PYWSW.js → chunk-7R5HC56U.js} +1 -1
- package/dist/cli/chunks/{chunk-EDLFX4ZB.js → chunk-AFFN6E6Q.js} +2 -2
- package/dist/cli/chunks/{chunk-YCGP5VFP.js → chunk-AMZKAJLJ.js} +2 -2
- package/dist/cli/chunks/{chunk-OEKP73MC.js → chunk-AP3ADWDK.js} +2 -2
- package/dist/cli/chunks/{chunk-DE4YJQJF.js → chunk-APPZATXA.js} +2 -2
- package/dist/cli/chunks/{chunk-RWWOHCMG.js → chunk-AUUJBXWX.js} +2 -2
- package/dist/cli/chunks/{chunk-LRZY4KS2.js → chunk-BTVWA35P.js} +2 -2
- package/dist/cli/chunks/{chunk-4G63WT4F.js → chunk-BZPE3LDO.js} +2 -2
- package/dist/cli/chunks/{chunk-OY2AHLSF.js → chunk-CFWGGRE7.js} +1 -1
- package/dist/cli/chunks/{chunk-7OZVZIBE.js → chunk-CIAL4YRY.js} +2 -2
- package/dist/cli/chunks/{chunk-TBLI254A.js → chunk-CO3DX2AX.js} +2 -2
- package/dist/cli/chunks/{chunk-GHBNRMSJ.js → chunk-DDEOZPWJ.js} +2 -2
- package/dist/cli/chunks/{chunk-62OAY5KJ.js → chunk-DOBZPSKE.js} +1 -1
- package/dist/cli/chunks/{chunk-NVYIZCSR.js → chunk-DOFREOPQ.js} +2 -2
- package/dist/cli/chunks/{chunk-SU5H66SD.js → chunk-E44NNCEU.js} +2 -2
- package/dist/cli/chunks/{chunk-MG27QY4D.js → chunk-E6PF35JZ.js} +2 -2
- package/dist/cli/chunks/{chunk-4SJYIX54.js → chunk-EBPJY4DI.js} +2 -2
- package/dist/cli/chunks/{chunk-EWFECZ2U.js → chunk-EH2S6AOR.js} +2 -2
- package/dist/cli/chunks/{chunk-Y76IAYQD.js → chunk-EIDJNT5C.js} +1 -1
- package/dist/cli/chunks/{chunk-6PX4OXQO.js → chunk-EJPK7OTR.js} +2 -2
- package/dist/cli/chunks/{chunk-EAU5KDFO.js → chunk-EK5GMOSO.js} +1 -1
- package/dist/cli/chunks/{chunk-ABFFWZPC.js → chunk-ERN43HOX.js} +151 -149
- package/dist/cli/chunks/{chunk-SO45NA4D.js → chunk-ETVAYGCB.js} +11 -11
- package/dist/cli/chunks/{chunk-RK73HB2F.js → chunk-EWPUQCN4.js} +2 -2
- package/dist/cli/chunks/{chunk-DMFTELBS.js → chunk-FL32MTKT.js} +2 -2
- package/dist/cli/chunks/chunk-FLU5FDSC.js +742 -0
- package/dist/cli/chunks/{chunk-NZYLNXT6.js → chunk-FUYOOKTH.js} +5 -5
- package/dist/cli/chunks/{chunk-NAXGWDVM.js → chunk-FWSGPE3V.js} +3 -3
- package/dist/cli/chunks/{chunk-ATHWDAXB.js → chunk-FZHSG75I.js} +2 -2
- package/dist/cli/chunks/{chunk-OBAREPDC.js → chunk-G2IJFNZS.js} +2 -2
- package/dist/cli/chunks/{chunk-H32EPIR2.js → chunk-G4CKPWF6.js} +1 -1
- package/dist/cli/chunks/{chunk-SKQUUE4F.js → chunk-G4FAPO57.js} +2 -2
- package/dist/cli/chunks/{chunk-KG336OV3.js → chunk-G77MLBDF.js} +2 -2
- package/dist/cli/chunks/{chunk-V6JBOIMX.js → chunk-GBFUANTC.js} +1 -1
- package/dist/cli/chunks/{chunk-YAKGBHO4.js → chunk-GVKVJJQX.js} +2 -2
- package/dist/cli/chunks/{chunk-GJHWY3ZX.js → chunk-GWJWSLDA.js} +2 -2
- package/dist/cli/chunks/{chunk-WDVRE6GN.js → chunk-H43AFUKL.js} +2 -2
- package/dist/cli/chunks/chunk-H7BLYMNU.js +59 -0
- package/dist/cli/chunks/{chunk-NW5JUCCG.js → chunk-HDJUYAZG.js} +1 -1
- package/dist/cli/chunks/{chunk-FKL3R5JQ.js → chunk-HDNWSKHA.js} +2 -2
- package/dist/cli/chunks/{chunk-Z2O2YJAF.js → chunk-HFFPYC4G.js} +2 -2
- package/dist/cli/chunks/{chunk-WSF24I3D.js → chunk-HJ3XNTTJ.js} +2 -2
- package/dist/cli/chunks/{chunk-YDAQK5UF.js → chunk-HYXUN7BW.js} +1 -1
- package/dist/cli/chunks/{chunk-2ZI5FKSF.js → chunk-I36CRDHF.js} +2 -2
- package/dist/cli/chunks/{chunk-OY3NJNP2.js → chunk-I4K2HTQU.js} +1 -1
- package/dist/cli/chunks/{chunk-2ZMF4NCF.js → chunk-IENZSO3K.js} +2 -2
- package/dist/cli/chunks/chunk-IO5537OM.js +2 -0
- package/dist/cli/chunks/{chunk-G3CZCUPM.js → chunk-IOZRKXR5.js} +2 -2
- package/dist/cli/chunks/{chunk-BQUAE3CP.js → chunk-ITL3IN2E.js} +2 -2
- package/dist/cli/chunks/{chunk-3P34JFQH.js → chunk-ITPGWGQS.js} +14 -14
- package/dist/cli/chunks/{chunk-NSHU347M.js → chunk-IW6WDGHM.js} +1 -1
- package/dist/cli/chunks/{chunk-KOBVYY6H.js → chunk-J4JMCZVA.js} +2 -2
- package/dist/cli/chunks/{chunk-ACWFKES2.js → chunk-JFLU7L3W.js} +2 -2
- package/dist/cli/chunks/{chunk-YK7JN5N7.js → chunk-JGJXXAS6.js} +4 -4
- package/dist/cli/chunks/{chunk-ESUO3GTJ.js → chunk-JUMICXM6.js} +2 -2
- package/dist/cli/chunks/{chunk-VKRTTFB6.js → chunk-K2HBNYAZ.js} +2 -2
- package/dist/cli/chunks/{chunk-6MVVSSID.js → chunk-K7V2WZNF.js} +1 -1
- package/dist/cli/chunks/{chunk-XEB3NLJR.js → chunk-KDI5JOYZ.js} +2 -2
- package/dist/cli/chunks/{chunk-YKMU4LBV.js → chunk-KJCIMNHS.js} +1 -1
- package/dist/cli/chunks/{chunk-IKISCIGH.js → chunk-KKYO2NKV.js} +2 -2
- package/dist/cli/chunks/{chunk-VFSYMOAL.js → chunk-KSE5TDM5.js} +2 -2
- package/dist/cli/chunks/{chunk-V2RSNVMW.js → chunk-KSLLHFVY.js} +1 -1
- package/dist/cli/chunks/{chunk-6C3II5OM.js → chunk-KXS3Y2AX.js} +2 -2
- package/dist/cli/chunks/{chunk-LMS3Y7JD.js → chunk-LBX7M4LW.js} +2 -2
- package/dist/cli/chunks/{chunk-2XGVTYVX.js → chunk-LCVEEII4.js} +2 -2
- package/dist/cli/chunks/{chunk-C522H7XR.js → chunk-LD5CFK53.js} +32 -32
- package/dist/cli/chunks/{chunk-FESZBPUB.js → chunk-LPU6PAJE.js} +2 -2
- package/dist/cli/chunks/{chunk-7ZCDZHDB.js → chunk-LQ4NUC6Q.js} +2 -2
- package/dist/cli/chunks/chunk-LRL56ZYL.js +21 -0
- package/dist/cli/chunks/{chunk-D6DA2KFD.js → chunk-LXQ3B4RY.js} +2 -2
- package/dist/cli/chunks/{chunk-I33O4BRQ.js → chunk-M5RQ6U3G.js} +2 -2
- package/dist/cli/chunks/{chunk-6GP6W46M.js → chunk-M5XYIQYZ.js} +2 -2
- package/dist/cli/chunks/chunk-M7XFBSIK.js +2 -0
- package/dist/cli/chunks/{chunk-IPJ7Q3AJ.js → chunk-MIK4RBEH.js} +1 -1
- package/dist/cli/chunks/{chunk-GRCIBCJ2.js → chunk-NC6K7SCQ.js} +2 -2
- package/dist/cli/chunks/{chunk-CESIR27V.js → chunk-NKTWKYHB.js} +2 -2
- package/dist/cli/chunks/{chunk-OPFGRS5S.js → chunk-NPZOBSAN.js} +2 -2
- package/dist/cli/chunks/{chunk-PGYMKGOE.js → chunk-NQZNMCZU.js} +2 -2
- package/dist/cli/chunks/{chunk-2T7RRL6G.js → chunk-NT7JRHMH.js} +1 -1
- package/dist/cli/chunks/{chunk-H2PYU7MN.js → chunk-NTB342NJ.js} +1 -1
- package/dist/cli/chunks/{chunk-NPPHWFA2.js → chunk-O4JAKWWM.js} +13 -13
- package/dist/cli/chunks/{chunk-APSRPR4W.js → chunk-OD5D4LSZ.js} +2 -2
- package/dist/cli/chunks/{chunk-UHTTW3IT.js → chunk-OH5V5EJW.js} +2 -2
- package/dist/cli/chunks/{chunk-PFG6VQ5Z.js → chunk-OHR7C777.js} +2 -2
- package/dist/cli/chunks/{chunk-U53ZB4IX.js → chunk-OURITHFV.js} +2 -2
- package/dist/cli/chunks/{chunk-DEF34AFL.js → chunk-OV5RPLKV.js} +2 -2
- package/dist/cli/chunks/{chunk-GJMLK5UT.js → chunk-OYJC3YON.js} +2 -2
- package/dist/cli/chunks/{chunk-AH3ZD3NJ.js → chunk-QDESWOZP.js} +2 -2
- package/dist/cli/chunks/chunk-R5GRABPQ.js +2 -0
- package/dist/cli/chunks/{chunk-CZGOSJQ4.js → chunk-R5LGV6GZ.js} +2 -2
- package/dist/cli/chunks/{chunk-MNN5J4GU.js → chunk-RBZCA7SD.js} +2 -2
- package/dist/cli/chunks/chunk-RQMCZQN2.js +2 -0
- package/dist/cli/chunks/chunk-RTFKTKSO.js +4 -0
- package/dist/cli/chunks/{chunk-FB6TI3BH.js → chunk-RTY7VSZB.js} +2 -2
- package/dist/cli/chunks/{chunk-2SXBBUM6.js → chunk-S6IYEBAI.js} +2 -2
- package/dist/cli/chunks/{chunk-YYTGXD3R.js → chunk-SMVVAVN2.js} +2 -2
- package/dist/cli/chunks/{chunk-MA7JIQ6U.js → chunk-T5KHJ3J7.js} +5 -5
- package/dist/cli/chunks/{chunk-FZOWULMH.js → chunk-TCYSBC7Y.js} +1 -1
- package/dist/cli/chunks/{chunk-IU2IV4NE.js → chunk-TFW7CCKS.js} +1 -1
- package/dist/cli/chunks/chunk-TL6OFMXF.js +6 -0
- package/dist/cli/chunks/{chunk-ERQKYIP7.js → chunk-U3LJNNVJ.js} +5 -5
- package/dist/cli/chunks/{chunk-5E6GHSTY.js → chunk-UKKYMW3S.js} +2 -2
- package/dist/cli/chunks/{chunk-YK3BVZY6.js → chunk-UMVSWQNB.js} +2 -2
- package/dist/cli/chunks/{chunk-CFBEBXLO.js → chunk-UTTSH4NH.js} +3 -3
- package/dist/cli/chunks/{chunk-6XCMKIZN.js → chunk-V5AADCBC.js} +1 -1
- package/dist/cli/chunks/{chunk-5LPYV3TK.js → chunk-V7DA4HAK.js} +1 -1
- package/dist/cli/chunks/{chunk-7PJIR4ST.js → chunk-VBK2YAYY.js} +2 -2
- package/dist/cli/chunks/{chunk-ODJNUMV3.js → chunk-VEEYL2CZ.js} +2 -2
- package/dist/cli/chunks/{chunk-PPSAMXYN.js → chunk-VLD7Z2ED.js} +3 -3
- package/dist/cli/chunks/{chunk-N6PIIK6G.js → chunk-VO3DRK4P.js} +2 -2
- package/dist/cli/chunks/{chunk-ZXPY654C.js → chunk-VWUZSNVC.js} +1 -1
- package/dist/cli/chunks/{chunk-WDQ7IEZY.js → chunk-VYTILW4R.js} +2 -2
- package/dist/cli/chunks/{chunk-CZ2IF6MC.js → chunk-WCAVIJ64.js} +1 -1
- package/dist/cli/chunks/{chunk-M2QV7PT7.js → chunk-WCVCOT4E.js} +2 -2
- package/dist/cli/chunks/{chunk-AI4VYSFS.js → chunk-WM3SRRA6.js} +2 -2
- package/dist/cli/chunks/{chunk-NNFZUTDH.js → chunk-X3PZCXWG.js} +1 -1
- package/dist/cli/chunks/{chunk-PCEW6Q2C.js → chunk-X4J73KP3.js} +1 -1
- package/dist/cli/chunks/{chunk-DBMNJSBV.js → chunk-XDI5X3FR.js} +1 -1
- package/dist/cli/chunks/{chunk-VJQYDYAJ.js → chunk-XGBU3KEM.js} +2 -2
- package/dist/cli/chunks/{chunk-3Y7SPD72.js → chunk-XGPTZUKQ.js} +2 -2
- package/dist/cli/chunks/{chunk-EN2QSKFF.js → chunk-XJKZ7FTR.js} +2 -2
- package/dist/cli/chunks/{chunk-VWNFAW2M.js → chunk-XNLIWQYE.js} +2 -2
- package/dist/cli/chunks/{chunk-FAUCT5KR.js → chunk-XS2XF3YG.js} +6 -5
- package/dist/cli/chunks/chunk-Y7B5EUIJ.js +180 -0
- package/dist/cli/chunks/{chunk-Z7IYW5U7.js → chunk-YBBT3YYG.js} +1 -1
- package/dist/cli/chunks/{chunk-6TB6YOCZ.js → chunk-YNOCQ2SL.js} +1 -1
- package/dist/cli/chunks/{chunk-7TB6FK4B.js → chunk-YOCULVHR.js} +1 -1
- package/dist/cli/chunks/{chunk-H74Q7TJN.js → chunk-YPX2TV3M.js} +1 -1
- package/dist/cli/chunks/{chunk-V2M2XCR5.js → chunk-Z2EA7A4Z.js} +1 -1
- package/dist/cli/chunks/{chunk-KI73QCR5.js → chunk-ZMC543GI.js} +2 -2
- package/dist/cli/chunks/chunk-ZMHCMJ4J.js +2 -0
- package/dist/cli/chunks/{chunk-WBM6N6IM.js → chunk-ZP75ASUU.js} +1 -1
- package/dist/cli/chunks/{chunk-VFKF2XO7.js → chunk-ZQHDA4O7.js} +1 -1
- package/dist/cli/chunks/{ci-MSKMVH5X.js → ci-6GUFAZMJ.js} +2 -2
- package/dist/cli/chunks/{ci-config-7ODMNAUM.js → ci-config-J665XNOX.js} +2 -2
- package/dist/cli/chunks/{ci-output-FXZ7ZZW3.js → ci-output-PEQQQWVD.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-4VOUEPOX.js → circuit-breaker-HHB2JSKH.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-7D4SGLM4.js → claude-flow-setup-JKUJRWPN.js} +2 -2
- package/dist/cli/chunks/client-HL2COSFM.js +2 -0
- package/dist/cli/chunks/{cline-installer-WRRT7BGQ.js → cline-installer-Y77BWTAN.js} +2 -2
- package/dist/cli/chunks/{code-ZDJRIL3S.js → code-LV2HAGJY.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-4S4SHM56.js → code-index-extractor-4GKKSETB.js} +2 -2
- package/dist/cli/chunks/{codex-installer-YTRHNDWR.js → codex-installer-WMKBYE5Y.js} +2 -2
- package/dist/cli/chunks/{completions-6N64JUXJ.js → completions-SBGFAOIJ.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-I4A26VCJ.js → complexity-analyzer-AQHFIJXC.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-IIDR66LB.js → continuedev-installer-26AYFS2E.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-SVVFY3S2.js → copilot-installer-4UD3DK55.js} +2 -2
- package/dist/cli/chunks/core-handlers-IX7ATLM6.js +2 -0
- package/dist/cli/chunks/{cost-tracker-VGFS6IBX.js → cost-tracker-TP4NZCG4.js} +2 -2
- package/dist/cli/chunks/{coverage-B7MCGNTE.js → coverage-B2KIXHAI.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-YYKLAPJO.js +2 -0
- package/dist/cli/chunks/{cursor-installer-UPETT57E.js → cursor-installer-AVZEQZ4W.js} +2 -2
- package/dist/cli/chunks/{daemon-7BDJHEIJ.js → daemon-P574WWBW.js} +4 -4
- package/dist/cli/chunks/{daemon-CQFNZLXU.js → daemon-XM2A7LQU.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-PJVABHON.js → dag-attention-scheduler-MIWOZ6ET.js} +2 -2
- package/dist/cli/chunks/{detect-56SKAGWX.js → detect-TYR7HT23.js} +2 -2
- package/dist/cli/chunks/{dist-node-UYTYUMLN.js → dist-node-2DGVQGLS.js} +2 -2
- package/dist/cli/chunks/{domain-handler-YOYLBYJE.js → domain-handler-RRA4ZOMF.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-7TARX2XF.js → domain-plugins-IVZEZ5RB.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-AKVSBD6E.js → domain-transfer-DOBI67K6.js} +2 -2
- package/dist/cli/chunks/dream-T6EP7B3F.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-IS6HSR66.js → embed-and-insert-pattern-VNIEOVPO.js} +2 -2
- package/dist/cli/chunks/{eval-GNB574IM.js → eval-QV4LVPUF.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-RCAOCKM7.js → experience-capture-middleware-DAPKT763.js} +3 -3
- package/dist/cli/chunks/{fast-paths-KTZ5SF54.js → fast-paths-WVRFPHX7.js} +2 -2
- package/dist/cli/chunks/{feature-flags-ITX5LQ57.js → feature-flags-DEFTUIYT.js} +2 -2
- package/dist/cli/chunks/{feature-flags-KFHSR5YF.js → feature-flags-O7ZXDDCD.js} +2 -2
- package/dist/cli/chunks/file-discovery-JYMVTDMU.js +2 -0
- package/dist/cli/chunks/{fleet-2Y3ZE6CE.js → fleet-FVAUMKUT.js} +22 -22
- package/dist/cli/chunks/{gnn-wrapper-RLFW3GSX.js → gnn-wrapper-LS4LZJDR.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-EM2URCYZ.js → heartbeat-handler-RFTERD4K.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-4N5MUJ7S.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-ZPAJDSLR.js +2 -0
- package/dist/cli/chunks/hnsw-index-4CTH6RHB.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-JMHEOIBH.js → hnsw-legacy-bridge-GPKGFFHY.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-CBP73QHY.js → hnswlib-node-PHL3F2PR.js} +2 -2
- package/dist/cli/chunks/{hooks-IP7XE34Z.js → hooks-GYJ6D4QM.js} +30 -30
- package/dist/cli/chunks/hybrid-backend-AW6UTXQS.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-ONAYHU25.js → hypergraph-engine-YGEQPCKJ.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-VINJRAID.js → hypergraph-handler-ZIMM647V.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-MZK3JMSV.js +2 -0
- package/dist/cli/chunks/{init-guard-RYVV5R3Z.js → init-guard-VOMBXJXG.js} +2 -2
- package/dist/cli/chunks/{init-handler-MPRGWMOE.js → init-handler-PSMUBWK5.js} +26 -25
- package/dist/cli/chunks/init-wizard-FUC7KDVX.js +2 -0
- package/dist/cli/chunks/kernel-ZCPMCVMW.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-OPD7JBRL.js → kilocode-installer-2YNTFBWJ.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-M4OPUNK2.js → kiro-installer-XHJDPVAZ.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-NUJKEDNF.js +2 -0
- package/dist/cli/chunks/{learning-4UWTQLMF.js → learning-GNSIDRNG.js} +3 -3
- package/dist/cli/chunks/{llm-router-SQ56FF6Z.js → llm-router-LQDM7IU2.js} +4 -4
- package/dist/cli/chunks/llm-router-service-B2BFBQ76.js +2 -0
- package/dist/cli/chunks/{load-HPHKDGGL.js → load-YATHI72E.js} +2 -2
- package/dist/cli/chunks/load-test-ZHQ2MUGO.js +2 -0
- package/dist/cli/chunks/{mcp-TELMAC7Z.js → mcp-4Y6GDLYK.js} +2 -2
- package/dist/cli/chunks/{memory-PFQ3KPVJ.js → memory-OUW3L7H2.js} +5 -5
- package/dist/cli/chunks/memory-backend-AAMQG6WH.js +2 -0
- package/dist/cli/chunks/memory-handlers-G3LFF53U.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-3VDRX6TZ.js → multi-model-executor-UBZJXAD2.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-PJ576R63.js → opencode-installer-AMMNWVH5.js} +2 -2
- package/dist/cli/chunks/{orchestrator-72QP4UU7.js → orchestrator-Y44WDOER.js} +19 -19
- package/dist/cli/chunks/pattern-null-store-RFNVA46O.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-754YQW7C.js → pattern-usage-recorder-ESR42RME.js} +2 -2
- package/dist/cli/chunks/{pipeline-AVXY4MVB.js → pipeline-EDTS6OSC.js} +2 -2
- package/dist/cli/chunks/{platform-3E3DXLYB.js → platform-5WONJSUX.js} +2 -2
- package/dist/cli/chunks/{plugin-7FUQAKRE.js → plugin-IJXPCLD4.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-NIB4F5NV.js → prime-radiant-advanced-wasm-5ECKGZK6.js} +2 -2
- package/dist/cli/chunks/project-root-7QL4KP5C.js +2 -0
- package/dist/cli/chunks/protocol-executor-2NW5BD4R.js +2 -0
- package/dist/cli/chunks/{protocol-handler-BQRYMUTG.js → protocol-handler-DRD3GVNW.js} +2 -2
- package/dist/cli/chunks/{prove-H52QGC6B.js → prove-KTGW2HMJ.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-G2JZOGKD.js +2 -0
- package/dist/cli/chunks/{quality-QO4XPAUM.js → quality-DV2WPRRS.js} +2 -2
- package/dist/cli/chunks/{quality-gate-FBKE5E6F.js → quality-gate-HFUAFVZC.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-GRG5FT2A.js +2 -0
- package/dist/cli/chunks/{real-embeddings-RWGOVOXO.js → real-embeddings-RQRVOKVM.js} +2 -2
- package/dist/cli/chunks/{ref-validation-LF76ZOBD.js → ref-validation-QWSKS5OY.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-3BYEBTQ7.js → roocode-installer-RBAYRCHX.js} +2 -2
- package/dist/cli/chunks/router-LQB5SWAF.js +2 -0
- package/dist/cli/chunks/routing-feedback-OEEXA55N.js +2 -0
- package/dist/cli/chunks/{routing-handler-DST7BVCU.js → routing-handler-FMPP3XKO.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-XE32PGKC.js → ruvector-commands-KZZT4HWF.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-BZK4M7BO.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-EZZUJL2E.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-VP32XC75.js → rvf-migration-coordinator-7CHEV35N.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-6COXTQZ3.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-SH2AMVI7.js → rvf-store-integrity-Q2TH52SN.js} +2 -2
- package/dist/cli/chunks/safe-db-PE6G3L55.js +2 -0
- package/dist/cli/chunks/schedule-OLKQ6QYW.js +2 -0
- package/dist/cli/chunks/scheduler-LSGBDFAT.js +2 -0
- package/dist/cli/chunks/{security-VSPNKCDS.js → security-CUEA3UIM.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-HX6AHL3P.js → shared-rvf-adapter-DROMBRV2.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-MX4FC2JE.js → shared-rvf-dual-writer-DBNABOP7.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-HH4DNTYH.js +2 -0
- package/dist/cli/chunks/{standalone-memory-O4QUTK6L.js → standalone-memory-IAHA3M6B.js} +2 -2
- package/dist/cli/chunks/{status-handler-Z2BP6EOG.js → status-handler-AFUCASTX.js} +2 -2
- package/dist/cli/chunks/{structural-health-R36WNLQG.js → structural-health-AQRV6JJ6.js} +2 -2
- package/dist/cli/chunks/{sync-QF5Y3EMZ.js → sync-GX7FMJHL.js} +2 -2
- package/dist/cli/chunks/{sync-2ELWUFQU.js → sync-XW5TLZ7M.js} +2 -2
- package/dist/cli/chunks/{task-handler-43PYE75J.js → task-handler-TFKVUTNF.js} +2 -2
- package/dist/cli/chunks/task-handlers-SS4ZDXNF.js +9 -0
- package/dist/cli/chunks/{test-UWA377D4.js → test-D2XDJNDX.js} +11 -11
- package/dist/cli/chunks/test-runner-process-PSSBNNGR.js +2 -0
- package/dist/cli/chunks/{test-scheduling-YQZPJRRN.js → test-scheduling-TS6I2PR7.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-F7C6UKTC.js → token-bootstrap-HBBLPCZ3.js} +2 -2
- package/dist/cli/chunks/{token-usage-DO6WLMXP.js → token-usage-3MBUX4PR.js} +2 -2
- package/dist/cli/chunks/{transformers-H5RGFKVO.js → transformers-ZWMQO3L2.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-TYRQRJ2W.js +2 -0
- package/dist/cli/chunks/{types-PJS2FGPF.js → types-5YEMGPSQ.js} +2 -2
- package/dist/cli/chunks/unified-memory-AGDZQ5XD.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-X5TJ3JDE.js +2 -0
- package/dist/cli/chunks/unified-persistence-UCV7YETW.js +2 -0
- package/dist/cli/chunks/{upgrade-4IC4F6AB.js → upgrade-2TPBKIHI.js} +2 -2
- package/dist/cli/chunks/{validate-DHUWW7PF.js → validate-XRAXXFW6.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-OERQNOX5.js → validate-swarm-IYSCS3BZ.js} +2 -2
- package/dist/cli/chunks/visual-security-ZLXRIQZV.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-TV7DMKES.js → web-tree-sitter-PZQ3ZG2P.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-QZPWSH37.js → windsurf-installer-U6XWFRVT.js} +2 -2
- package/dist/cli/chunks/witness-chain-CVIWYTD2.js +2 -0
- package/dist/cli/chunks/witness-chain-VBKORKOX.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-RUXIOE7F.js → witness-chain-repair-K7YX2AO6.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-YXENHB42.js → witness-chain-verifier-GUTC3W7N.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-HL26AGFO.js → witness-key-manager-YBNKMOP6.js} +2 -2
- package/dist/cli/chunks/{workflow-EOVVCN2E.js → workflow-UAJUILFQ.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-3ZN7MVCE.js +2 -0
- package/dist/cli/chunks/{wrappers-AGODHBOO.js → wrappers-AVZ3GPAL.js} +2 -2
- package/dist/cli/commands/fleet.js +4 -1
- package/dist/cli/commands/hooks-handlers/tool-loop-guardrail.js +11 -6
- package/dist/cli/commands/test.js +5 -2
- package/dist/cli/handlers/init-handler.d.ts +12 -0
- package/dist/cli/handlers/init-handler.js +27 -12
- package/dist/cli/utils/ci-output.d.ts +2 -0
- package/dist/cli/utils/ci-output.js +2 -0
- package/dist/cli/utils/progress.d.ts +16 -2
- package/dist/cli/utils/progress.js +31 -14
- package/dist/coordination/consensus/consensus-engine.js +3 -1
- package/dist/coordination/handlers/code-intelligence-handlers.js +3 -2
- package/dist/coordination/handlers/coverage-collection.js +3 -1
- package/dist/coordination/handlers/coverage-runner.d.ts +3 -8
- package/dist/coordination/handlers/coverage-runner.js +6 -22
- package/dist/coordination/handlers/coverage-stderr.d.ts +23 -0
- package/dist/coordination/handlers/coverage-stderr.js +39 -0
- package/dist/coordination/handlers/coverage-target.js +6 -3
- package/dist/coordination/handlers/handler-utils.js +3 -1
- package/dist/coordination/handlers/requirements-handlers.js +3 -2
- package/dist/coordination/handlers/security-handlers.js +34 -20
- package/dist/coordination/queen-coordinator.js +8 -3
- package/dist/coordination/task-executability.d.ts +12 -0
- package/dist/coordination/task-executability.js +27 -0
- package/dist/coordination/workflow-orchestrator.d.ts +6 -0
- package/dist/coordination/workflow-orchestrator.js +22 -8
- package/dist/domains/code-intelligence/services/product-factors-bridge.js +7 -4
- package/dist/domains/coverage-analysis/services/coverage-parser.js +19 -10
- package/dist/domains/learning-optimization/interfaces.d.ts +2 -0
- package/dist/domains/learning-optimization/services/learning-coordinator.js +2 -1
- package/dist/domains/learning-optimization/services/metrics-optimizer.js +14 -4
- package/dist/domains/learning-optimization/services/production-intel.js +3 -1
- package/dist/domains/security-compliance/generic-finding-dedup.d.ts +40 -0
- package/dist/domains/security-compliance/generic-finding-dedup.js +63 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +14 -6
- package/dist/domains/security-compliance/services/scanners/sast-scanner.js +4 -2
- package/dist/domains/security-compliance/services/security-auditor-sast.js +2 -2
- package/dist/domains/security-compliance/services/security-auditor-secrets.js +2 -2
- package/dist/domains/security-compliance/services/security-auditor.js +3 -2
- package/dist/domains/test-execution/coordinator.d.ts +2 -1
- package/dist/domains/test-execution/coordinator.js +5 -14
- package/dist/domains/test-execution/interfaces.d.ts +11 -1
- package/dist/domains/test-execution/services/retry-outcome.d.ts +18 -0
- package/dist/domains/test-execution/services/retry-outcome.js +53 -0
- package/dist/domains/test-generation/coordinator.js +2 -2
- package/dist/domains/test-generation/services/pattern-matcher.js +4 -4
- package/dist/domains/test-generation/services/test-generator.js +2 -2
- package/dist/governance/evolution-pipeline-integration.js +3 -1
- package/dist/hooks/cross-phase-hooks.js +3 -1
- package/dist/init/init-wizard-steps.js +5 -1
- package/dist/init/phases/04-database.js +7 -0
- package/dist/init/phases/12-verification.js +14 -4
- package/dist/init/settings-merge.js +7 -4
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +7 -0
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +31 -2
- package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +3 -1
- package/dist/integrations/agentic-flow/reasoning-bank/index.js +5 -0
- package/dist/integrations/ruvector/filter-adapter.js +2 -1
- package/dist/learning/dream/insight-generator.js +5 -4
- package/dist/learning/memory-auditor.js +3 -1
- package/dist/learning/qe-patterns.js +2 -1
- package/dist/learning/real-qe-reasoning-bank.d.ts +19 -0
- package/dist/learning/real-qe-reasoning-bank.js +70 -38
- package/dist/mcp/bundle.js +486 -481
- package/dist/mcp/handlers/domain-handler-configs.d.ts +2 -0
- package/dist/mcp/handlers/domain-handler-configs.js +8 -2
- package/dist/mcp/handlers/task-handlers.d.ts +13 -0
- package/dist/mcp/handlers/task-handlers.js +42 -16
- package/dist/mcp/handlers/validation-pipeline-handler.js +9 -9
- package/dist/mcp/protocol-server.js +8 -8
- package/dist/mcp/qe-tool-bridge.js +3 -0
- package/dist/mcp/services/reasoning-bank-service.d.ts +3 -1
- package/dist/mcp/services/reasoning-bank-service.js +4 -0
- package/dist/mcp/tool-annotations.js +4 -1
- package/dist/mcp/tools/coherence/check.js +1 -0
- package/dist/mcp/tools/coherence/consensus.js +4 -2
- package/dist/mcp/tools/learning-optimization/optimize.js +1 -2
- package/dist/mcp/tools/mincut/index.js +3 -0
- package/dist/mcp/tools/quality-assessment/gate.js +7 -0
- package/dist/mcp/tools/qx-analysis/analyze.js +1 -0
- package/dist/mcp/tools/requirements-validation/quality-criteria.js +10 -3
- package/dist/mcp/tools/security-compliance/scan.js +4 -2
- package/dist/mcp/tools/test-execution/e2e-execute.js +2 -2
- package/dist/mcp/tools/test-execution/execute.js +3 -2
- package/dist/memory/crdt/crdt-store.js +5 -0
- package/dist/memory/crdt/lww-register.js +12 -2
- package/dist/optimization/early-exit-token-optimizer.js +3 -1
- package/dist/planning/goap-planner.js +5 -0
- package/dist/planning/plan-executor.js +5 -0
- package/dist/shared/io/confined-read.d.ts +74 -0
- package/dist/shared/io/confined-read.js +256 -0
- package/dist/shared/io/file-reader.d.ts +6 -6
- package/dist/shared/io/file-reader.js +16 -42
- package/dist/shared/llm/providers/claude-code.js +4 -1
- package/dist/shared/native-module-errors.d.ts +51 -0
- package/dist/shared/native-module-errors.js +129 -0
- package/dist/shared/safe-db.js +14 -4
- package/dist/shared/security/osv-client.js +4 -1
- package/dist/shared/types/test-frameworks.js +2 -2
- package/dist/sync/readers/json-reader.js +2 -1
- package/dist/validation/anchor-set.d.ts +6 -0
- package/dist/validation/anchor-set.js +9 -1
- package/dist/validation/quality-gate-runner.d.ts +7 -1
- package/dist/validation/quality-gate-runner.js +3 -3
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-TR5SLAZC.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-DXWKCHY2.js +0 -2
- package/dist/cli/chunks/base-GTB6POYE.js +0 -2
- package/dist/cli/chunks/browser-workflow-MSBOLYUY.js +0 -2
- package/dist/cli/chunks/chunk-6P7424AO.js +0 -21
- package/dist/cli/chunks/chunk-6X5DHU6Q.js +0 -14
- package/dist/cli/chunks/chunk-CMBLM26R.js +0 -2
- package/dist/cli/chunks/chunk-DKAC3E3B.js +0 -3
- package/dist/cli/chunks/chunk-DURHK377.js +0 -742
- package/dist/cli/chunks/chunk-FPUDRSFJ.js +0 -180
- package/dist/cli/chunks/chunk-G5I6KGMW.js +0 -59
- package/dist/cli/chunks/chunk-HOZUDE4C.js +0 -2
- package/dist/cli/chunks/chunk-TYFZXDGZ.js +0 -4
- package/dist/cli/chunks/chunk-U4OICXV2.js +0 -6
- package/dist/cli/chunks/chunk-XBVUVFJK.js +0 -4
- package/dist/cli/chunks/chunk-XUZDBQ5X.js +0 -6
- package/dist/cli/chunks/chunk-YBSBABOS.js +0 -2
- package/dist/cli/chunks/chunk-ZG5666GJ.js +0 -2
- package/dist/cli/chunks/client-POSVREVS.js +0 -2
- package/dist/cli/chunks/core-handlers-V243GY7X.js +0 -2
- package/dist/cli/chunks/cross-domain-router-N3AIEM3B.js +0 -2
- package/dist/cli/chunks/dream-UA7MKOPQ.js +0 -2
- package/dist/cli/chunks/file-discovery-YCMNKZAK.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-QH5V6G2P.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-OJNFAGJS.js +0 -2
- package/dist/cli/chunks/hnsw-index-DFUNARVD.js +0 -2
- package/dist/cli/chunks/hybrid-backend-SSGQQEQ2.js +0 -2
- package/dist/cli/chunks/impact-analyzer-CRGCA7ZD.js +0 -2
- package/dist/cli/chunks/init-wizard-NIMZ4J55.js +0 -2
- package/dist/cli/chunks/kernel-JQK7PRAI.js +0 -2
- package/dist/cli/chunks/knowledge-graph-YPVVIKEU.js +0 -2
- package/dist/cli/chunks/llm-router-service-5OGAUOXF.js +0 -2
- package/dist/cli/chunks/load-test-UKNV5MWW.js +0 -2
- package/dist/cli/chunks/memory-backend-ZW4BTRNK.js +0 -2
- package/dist/cli/chunks/memory-handlers-FCXN437E.js +0 -2
- package/dist/cli/chunks/pattern-null-store-4DUV6MQC.js +0 -2
- package/dist/cli/chunks/project-root-JCAUNL6O.js +0 -2
- package/dist/cli/chunks/protocol-executor-RNZNZP3A.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-WK6TQOG2.js +0 -2
- package/dist/cli/chunks/queen-coordinator-4452SXZQ.js +0 -2
- package/dist/cli/chunks/router-3DIS5X4R.js +0 -2
- package/dist/cli/chunks/routing-feedback-OPXRCXM7.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-JL6T727I.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-V7IBDUCS.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-O3UQTEBK.js +0 -2
- package/dist/cli/chunks/safe-db-EVB4ZC7T.js +0 -2
- package/dist/cli/chunks/schedule-ORDDXXY4.js +0 -2
- package/dist/cli/chunks/scheduler-XFLJSFIU.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-Y7B42CJ3.js +0 -2
- package/dist/cli/chunks/task-handlers-KPWAEMKH.js +0 -9
- package/dist/cli/chunks/test-runner-process-3XZUYST2.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YTBCBHUO.js +0 -2
- package/dist/cli/chunks/unified-memory-EHD4VNFW.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-ZODGM4UK.js +0 -2
- package/dist/cli/chunks/unified-persistence-MHSI7ABK.js +0 -2
- package/dist/cli/chunks/visual-security-54MLFKWY.js +0 -2
- package/dist/cli/chunks/witness-chain-LC6Q2W27.js +0 -2
- package/dist/cli/chunks/witness-chain-QUIBAF3W.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-UKHEJVSK.js +0 -2
|
@@ -186,11 +186,21 @@ export class MetricsOptimizerService {
|
|
|
186
186
|
async recommendStrategy(context) {
|
|
187
187
|
try {
|
|
188
188
|
// Search for strategies that worked well in similar contexts
|
|
189
|
-
const keys = await this.memory.search('learning:strategy:optimized:*', 100);
|
|
189
|
+
const keys = await this.memory.search('learning:strategy:optimized:*', 100, { namespace: 'learning-optimization' });
|
|
190
190
|
const candidates = [];
|
|
191
|
-
for (const
|
|
192
|
-
|
|
193
|
-
|
|
191
|
+
for (const found of keys) {
|
|
192
|
+
// SQLite returns bare keys; in-memory search includes the namespace.
|
|
193
|
+
// get() applies that namespace separately, as storeOptimizationResult does.
|
|
194
|
+
const prefix = 'learning-optimization:';
|
|
195
|
+
const key = found.startsWith(prefix) ? found.slice(prefix.length) : found;
|
|
196
|
+
const optimized = await this.memory.get(key, { namespace: 'learning-optimization' });
|
|
197
|
+
if (optimized
|
|
198
|
+
&& context.tags.includes(optimized.domain)
|
|
199
|
+
&& context.tags.includes(optimized.objective.metric)
|
|
200
|
+
&& (!context.objective || (context.tags.includes(context.objective.metric)
|
|
201
|
+
&& optimized.objective.metric === context.objective.metric
|
|
202
|
+
&& optimized.objective.direction === context.objective.direction))
|
|
203
|
+
&& optimized.confidence > 0.6) {
|
|
194
204
|
const contextScore = this.scoreContextMatch(optimized, context);
|
|
195
205
|
const performanceScore = optimized.improvement * optimized.confidence;
|
|
196
206
|
candidates.push({
|
|
@@ -7,6 +7,7 @@ import { ok, err } from '../../../shared/types/index.js';
|
|
|
7
7
|
import { TimeRange } from '../../../shared/value-objects/index.js';
|
|
8
8
|
import { toError } from '../../../shared/error-utils.js';
|
|
9
9
|
import { rehydrateDates } from '../../../shared/utils/kv-date-rehydrate.js';
|
|
10
|
+
import { createSafeRecord } from '../../../shared/utils/safe-record.js';
|
|
10
11
|
const DEFAULT_CONFIG = {
|
|
11
12
|
metricsRetentionDays: 90,
|
|
12
13
|
anomalyThreshold: 2.5,
|
|
@@ -268,7 +269,8 @@ export class ProductionIntelService {
|
|
|
268
269
|
async getDomainHealth(domain) {
|
|
269
270
|
const timeRange = TimeRange.lastNDays(1);
|
|
270
271
|
const metricsResult = await this.getMetricsHistory('*', timeRange, domain);
|
|
271
|
-
|
|
272
|
+
// #1157: metric names come from stored production metrics.
|
|
273
|
+
const metrics = createSafeRecord();
|
|
272
274
|
if (metricsResult.success) {
|
|
273
275
|
for (const metric of metricsResult.value) {
|
|
274
276
|
if (!metrics[metric.name]) {
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1170: drop the generic eval/exec finding that language-specific SAST
|
|
3
|
+
* already reported as code injection on the same line.
|
|
4
|
+
*
|
|
5
|
+
* The scan-security task runs text patterns over every file and SAST over
|
|
6
|
+
* JS/TS files, so one `eval()` was counted twice: once by SAST (critical,
|
|
7
|
+
* CWE-95) and once by the generic eval/exec pattern (high). Only that pair is
|
|
8
|
+
* the same finding. Other generic rules (secrets, CORS, debug mode) can flag
|
|
9
|
+
* a different value or a higher severity on a line SAST also matched, so
|
|
10
|
+
* they are always kept.
|
|
11
|
+
*/
|
|
12
|
+
/** Title of the generic-pattern eval/exec finding in the scan-security handler. */
|
|
13
|
+
export declare const GENERIC_EVAL_EXEC_TITLE = "Dangerous eval/exec usage";
|
|
14
|
+
interface LocatedFinding {
|
|
15
|
+
title: string;
|
|
16
|
+
severity?: string;
|
|
17
|
+
location: {
|
|
18
|
+
file: string;
|
|
19
|
+
line?: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
interface SastFinding {
|
|
23
|
+
severity?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
references?: readonly string[];
|
|
26
|
+
location: {
|
|
27
|
+
file: string;
|
|
28
|
+
line?: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generic findings without the eval/exec matches SAST already reported as
|
|
33
|
+
* CWE-95 on the same real file and line, at the same or a higher severity, so
|
|
34
|
+
* dropping one never lowers what the scan reports. `isEvalOnly` says whether a generic
|
|
35
|
+
* eval/exec match is eval alone; a line that also calls exec() is kept,
|
|
36
|
+
* since SAST's eval rule does not report the exec call.
|
|
37
|
+
*/
|
|
38
|
+
export declare function dropGenericEvalCoveredBySast<T extends LocatedFinding>(generic: readonly T[], sast: readonly SastFinding[], isEvalOnly: (finding: T) => boolean): Promise<T[]>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=generic-finding-dedup.d.ts.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1170: drop the generic eval/exec finding that language-specific SAST
|
|
3
|
+
* already reported as code injection on the same line.
|
|
4
|
+
*
|
|
5
|
+
* The scan-security task runs text patterns over every file and SAST over
|
|
6
|
+
* JS/TS files, so one `eval()` was counted twice: once by SAST (critical,
|
|
7
|
+
* CWE-95) and once by the generic eval/exec pattern (high). Only that pair is
|
|
8
|
+
* the same finding. Other generic rules (secrets, CORS, debug mode) can flag
|
|
9
|
+
* a different value or a higher severity on a line SAST also matched, so
|
|
10
|
+
* they are always kept.
|
|
11
|
+
*/
|
|
12
|
+
import { realpath } from 'node:fs/promises';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
/** Title of the generic-pattern eval/exec finding in the scan-security handler. */
|
|
15
|
+
export const GENERIC_EVAL_EXEC_TITLE = 'Dangerous eval/exec usage';
|
|
16
|
+
/** CWE-95 (eval injection): SAST's eval() and Function-constructor rules. */
|
|
17
|
+
function isEvalInjection(finding) {
|
|
18
|
+
return /\[CWE-95\]/.test(finding.description ?? '') ||
|
|
19
|
+
(finding.references ?? []).some(ref => /\/definitions\/95\.html$/.test(ref));
|
|
20
|
+
}
|
|
21
|
+
const SEVERITY_RANK = {
|
|
22
|
+
informational: 0, low: 1, medium: 2, high: 3, critical: 4,
|
|
23
|
+
};
|
|
24
|
+
const rank = (severity) => SEVERITY_RANK[severity ?? ''] ?? -1;
|
|
25
|
+
async function realPathOf(file, cache) {
|
|
26
|
+
const resolved = path.resolve(file);
|
|
27
|
+
let real = cache.get(resolved);
|
|
28
|
+
if (real === undefined) {
|
|
29
|
+
real = await realpath(resolved).catch(() => resolved);
|
|
30
|
+
cache.set(resolved, real);
|
|
31
|
+
}
|
|
32
|
+
return real;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generic findings without the eval/exec matches SAST already reported as
|
|
36
|
+
* CWE-95 on the same real file and line, at the same or a higher severity, so
|
|
37
|
+
* dropping one never lowers what the scan reports. `isEvalOnly` says whether a generic
|
|
38
|
+
* eval/exec match is eval alone; a line that also calls exec() is kept,
|
|
39
|
+
* since SAST's eval rule does not report the exec call.
|
|
40
|
+
*/
|
|
41
|
+
export async function dropGenericEvalCoveredBySast(generic, sast, isEvalOnly) {
|
|
42
|
+
const evalSast = sast.filter(isEvalInjection);
|
|
43
|
+
if (evalSast.length === 0)
|
|
44
|
+
return [...generic];
|
|
45
|
+
const cache = new Map();
|
|
46
|
+
// Highest SAST CWE-95 severity per real file and line.
|
|
47
|
+
const covered = new Map();
|
|
48
|
+
for (const finding of evalSast) {
|
|
49
|
+
const key = `${await realPathOf(finding.location.file, cache)}:${finding.location.line ?? 0}`;
|
|
50
|
+
covered.set(key, Math.max(covered.get(key) ?? -1, rank(finding.severity)));
|
|
51
|
+
}
|
|
52
|
+
const kept = [];
|
|
53
|
+
for (const finding of generic) {
|
|
54
|
+
const key = `${await realPathOf(finding.location.file, cache)}:${finding.location.line ?? 0}`;
|
|
55
|
+
const sastRank = covered.get(key);
|
|
56
|
+
const duplicate = finding.title === GENERIC_EVAL_EXEC_TITLE && isEvalOnly(finding) &&
|
|
57
|
+
sastRank !== undefined && sastRank >= rank(finding.severity);
|
|
58
|
+
if (!duplicate)
|
|
59
|
+
kept.push(finding);
|
|
60
|
+
}
|
|
61
|
+
return kept;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=generic-finding-dedup.js.map
|
|
@@ -22,28 +22,33 @@
|
|
|
22
22
|
* complete, with a reason; each member can be scanned directly.
|
|
23
23
|
*/
|
|
24
24
|
import * as fs from 'fs/promises';
|
|
25
|
+
// #1161: manifests and lockfiles are read from a validated descriptor; one
|
|
26
|
+
// linked out of the project, or to a device, is refused instead of read.
|
|
27
|
+
import { readConfinedText } from '../../../../shared/io/confined-read.js';
|
|
25
28
|
import * as path from 'path';
|
|
26
29
|
import semver from 'semver';
|
|
27
30
|
import { parse as parseYaml } from 'yaml';
|
|
28
31
|
import { safeJsonParse } from '../../../../shared/safe-json.js';
|
|
29
32
|
import { classifyNpmSpec, exactNpmVersion } from '../../../../shared/security/osv-lookup.js';
|
|
33
|
+
import { createSafeRecord, getOwn, setOwn } from '../../../../shared/utils/safe-record.js';
|
|
30
34
|
import { LOCKFILES, parseLockfile } from './lockfile-versions.js';
|
|
31
35
|
/** The reason a workspace root's scan is not complete (#1057). */
|
|
32
36
|
export const WORKSPACE_NOT_SCANNED = 'workspace member dependencies are not scanned yet (#1057); scan each member directory separately';
|
|
33
37
|
const OUT_OF_SYNC = 'lockfile out of sync with package.json';
|
|
34
38
|
/** All declared dependencies of a manifest (later fields win, as npm resolves them). */
|
|
35
39
|
export function declaredDependencies(manifest) {
|
|
36
|
-
|
|
40
|
+
// #1157: a dependency named `__proto__` is kept as an own entry, not dropped.
|
|
41
|
+
const out = createSafeRecord();
|
|
37
42
|
for (const field of ['peerDependencies', 'optionalDependencies', 'devDependencies', 'dependencies']) {
|
|
38
43
|
for (const [name, spec] of Object.entries(manifest[field] ?? {})) {
|
|
39
44
|
if (typeof spec === 'string')
|
|
40
|
-
out
|
|
45
|
+
setOwn(out, name, spec);
|
|
41
46
|
}
|
|
42
47
|
}
|
|
43
48
|
return out;
|
|
44
49
|
}
|
|
45
50
|
async function readManifest(file) {
|
|
46
|
-
return safeJsonParse(await
|
|
51
|
+
return safeJsonParse(await readConfinedText(file, { outsideRoot: 'allow' }));
|
|
47
52
|
}
|
|
48
53
|
async function exists(file) {
|
|
49
54
|
try {
|
|
@@ -123,7 +128,7 @@ async function pnpmDeclaresPackages(file) {
|
|
|
123
128
|
const st = await fs.stat(file); // follows a link; a dangling one throws
|
|
124
129
|
if (!st.isFile() || st.size > MAX_PNPM_WORKSPACE_BYTES)
|
|
125
130
|
return true;
|
|
126
|
-
const text = await
|
|
131
|
+
const text = await readConfinedText(file, { outsideRoot: 'allow', maxBytes: MAX_PNPM_WORKSPACE_BYTES });
|
|
127
132
|
doc = parseYaml(text, { uniqueKeys: false, merge: true, maxAliasCount: 100 });
|
|
128
133
|
}
|
|
129
134
|
catch {
|
|
@@ -182,7 +187,10 @@ export function resolveFromRecord(dependencies, lockedVersions = {}) {
|
|
|
182
187
|
members: () => [],
|
|
183
188
|
hasImporter: () => true,
|
|
184
189
|
recordedSpec: () => null,
|
|
185
|
-
resolve: (_importer, name) =>
|
|
190
|
+
resolve: (_importer, name) => {
|
|
191
|
+
const version = getOwn(lockedVersions, name);
|
|
192
|
+
return version !== undefined ? { version } : undefined;
|
|
193
|
+
},
|
|
186
194
|
};
|
|
187
195
|
return Object.entries(dependencies).map(([name, spec]) => resolveOne(name, spec, '', index, new Set()));
|
|
188
196
|
}
|
|
@@ -202,7 +210,7 @@ export async function resolveDependencies(manifestPath) {
|
|
|
202
210
|
if (found) {
|
|
203
211
|
const member = path.relative(found.dir, realManifestDir).split(path.sep).join('/');
|
|
204
212
|
try {
|
|
205
|
-
const parsed = parseLockfile(found.file, await
|
|
213
|
+
const parsed = parseLockfile(found.file, await readConfinedText(path.join(found.dir, found.file), { outsideRoot: 'allow' }));
|
|
206
214
|
const rootManifest = member ? await readManifest(path.join(found.dir, 'package.json')).catch(() => ({})) : manifest;
|
|
207
215
|
// A member scanned directly: the root lockfile covers it if it lists the
|
|
208
216
|
// importer (npm/pnpm) or, for yarn, if the root declares workspaces.
|
|
@@ -11,6 +11,7 @@ import { ok, err } from '../../../../shared/types/index.js';
|
|
|
11
11
|
import { ALL_SECURITY_PATTERNS, BUILT_IN_RULE_SETS } from './security-patterns.js';
|
|
12
12
|
import { toError } from '../../../../shared/error-utils.js';
|
|
13
13
|
import { safeJsonParse } from '../../../../shared/safe-json.js';
|
|
14
|
+
import { readConfinedFile } from '../../../../shared/io/confined-read.js';
|
|
14
15
|
import { CLAUDE_TIER_MODELS, DEFAULT_OPUS_MODEL } from '../../../../shared/llm/model-registry.js';
|
|
15
16
|
import { isSemgrepAvailable, runSemgrepWithRules, convertSemgrepFindings, } from '../semgrep-integration.js';
|
|
16
17
|
// ============================================================================
|
|
@@ -303,8 +304,9 @@ export class SASTScanner {
|
|
|
303
304
|
let content;
|
|
304
305
|
let sourceDigest;
|
|
305
306
|
try {
|
|
306
|
-
|
|
307
|
-
|
|
307
|
+
// #1161: open once and validate the opened descriptor, so a file swapped
|
|
308
|
+
// after the sast-scan path check cannot redirect the read.
|
|
309
|
+
const bytes = await readConfinedFile(filePath, { outsideRoot: 'allow' });
|
|
308
310
|
sourceDigest = createHash('sha256').update(bytes).digest('hex');
|
|
309
311
|
content = bytes.toString('utf8');
|
|
310
312
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
6
6
|
import { v4 as uuidv4 } from 'uuid';
|
|
7
|
-
import
|
|
7
|
+
import { readConfinedText } from '../../../shared/io/confined-read.js';
|
|
8
8
|
import * as path from 'path';
|
|
9
9
|
/**
|
|
10
10
|
* Get the default SAST vulnerability patterns for JS/TS analysis
|
|
@@ -173,7 +173,7 @@ export async function performSASTScan(findSourceFiles, shouldExclude) {
|
|
|
173
173
|
continue;
|
|
174
174
|
}
|
|
175
175
|
try {
|
|
176
|
-
const content = await
|
|
176
|
+
const content = await readConfinedText(filePath, { outsideRoot: 'allow' }); // #1161
|
|
177
177
|
const lines = content.split('\n');
|
|
178
178
|
filesScanned++;
|
|
179
179
|
linesScanned += lines.length;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Extracted from security-auditor.ts - Secret/credential detection
|
|
4
4
|
*/
|
|
5
5
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
6
|
-
import
|
|
6
|
+
import { readConfinedText } from '../../../shared/io/confined-read.js';
|
|
7
7
|
/**
|
|
8
8
|
* Get the comprehensive set of secret detection patterns
|
|
9
9
|
*/
|
|
@@ -198,7 +198,7 @@ export function validateSecret(type, value) {
|
|
|
198
198
|
export async function scanFileForSecrets(file) {
|
|
199
199
|
const secrets = [];
|
|
200
200
|
try {
|
|
201
|
-
const content = await
|
|
201
|
+
const content = await readConfinedText(file.value, { outsideRoot: 'allow' }); // #1161
|
|
202
202
|
const lines = content.split('\n');
|
|
203
203
|
const secretPatterns = getSecretPatterns();
|
|
204
204
|
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
13
13
|
import { v4 as uuidv4 } from 'uuid';
|
|
14
14
|
import * as fs from 'fs/promises';
|
|
15
|
+
import { readConfinedText } from '../../../shared/io/confined-read.js';
|
|
15
16
|
import * as path from 'path';
|
|
16
17
|
import { ok, err } from '../../../shared/types/index.js';
|
|
17
18
|
import { toError } from '../../../shared/error-utils.js';
|
|
@@ -249,7 +250,7 @@ export class SecurityAuditorService {
|
|
|
249
250
|
const dependencies = [];
|
|
250
251
|
try {
|
|
251
252
|
if (ecosystem === 'npm') {
|
|
252
|
-
const content = await
|
|
253
|
+
const content = await readConfinedText(manifest, { outsideRoot: 'allow' }); // #1161
|
|
253
254
|
const packageJson = safeJsonParse(content);
|
|
254
255
|
const allDeps = {
|
|
255
256
|
...packageJson.dependencies,
|
|
@@ -263,7 +264,7 @@ export class SecurityAuditorService {
|
|
|
263
264
|
}
|
|
264
265
|
}
|
|
265
266
|
else if (ecosystem === 'pip') {
|
|
266
|
-
const content = await
|
|
267
|
+
const content = await readConfinedText(manifest, { outsideRoot: 'allow' }); // #1161
|
|
267
268
|
const lines = content.split('\n');
|
|
268
269
|
for (const line of lines) {
|
|
269
270
|
const trimmed = line.trim();
|
|
@@ -125,7 +125,8 @@ export declare class TestExecutionCoordinator extends BaseDomainCoordinator<Test
|
|
|
125
125
|
runTests(request: SimpleTestRequest): Promise<Result<TestRunResult, Error>>;
|
|
126
126
|
/**
|
|
127
127
|
* Retry a run's failed tests when retries were requested, and attach what
|
|
128
|
-
* the retries did to the run (#1130).
|
|
128
|
+
* the retries did to the run (#1130). A test that passed on a retry counts
|
|
129
|
+
* as passed and flaky in the run's own counts (#1170).
|
|
129
130
|
*/
|
|
130
131
|
private retryFailures;
|
|
131
132
|
/**
|
|
@@ -9,6 +9,7 @@ import { TestExecutionEvents, createEvent, } from '../../shared/events/index.js'
|
|
|
9
9
|
import { TestExecutorService } from './services/test-executor.js';
|
|
10
10
|
import { FlakyDetectorService } from './services/flaky-detector.js';
|
|
11
11
|
import { RetryHandlerService } from './services/retry-handler.js';
|
|
12
|
+
import { applyRetryOutcome } from './services/retry-outcome.js';
|
|
12
13
|
import { TestPrioritizerService } from './services/test-prioritizer.js';
|
|
13
14
|
import { createE2ETestRunnerService, } from './services/e2e-runner.js';
|
|
14
15
|
import { createDomainFinding, } from '../../coordination/consensus/domain-findings.js';
|
|
@@ -162,7 +163,8 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
162
163
|
}
|
|
163
164
|
/**
|
|
164
165
|
* Retry a run's failed tests when retries were requested, and attach what
|
|
165
|
-
* the retries did to the run (#1130).
|
|
166
|
+
* the retries did to the run (#1130). A test that passed on a retry counts
|
|
167
|
+
* as passed and flaky in the run's own counts (#1170).
|
|
166
168
|
*/
|
|
167
169
|
async retryFailures(run, retryCount) {
|
|
168
170
|
if (!retryCount || retryCount <= 0)
|
|
@@ -179,17 +181,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
179
181
|
});
|
|
180
182
|
if (!retried.success)
|
|
181
183
|
return;
|
|
182
|
-
|
|
183
|
-
run.retries = {
|
|
184
|
-
totalRetries: retried.value.retried,
|
|
185
|
-
nowPassing: retried.value.nowPassing,
|
|
186
|
-
stillFailing: retried.value.stillFailing,
|
|
187
|
-
tests: (retried.value.tests ?? []).map(({ testId, ...outcome }) => ({
|
|
188
|
-
name: byId.get(testId)?.testName ?? testId,
|
|
189
|
-
file: byId.get(testId)?.file ?? '',
|
|
190
|
-
...outcome,
|
|
191
|
-
})),
|
|
192
|
-
};
|
|
184
|
+
applyRetryOutcome(run, retried.value);
|
|
193
185
|
}
|
|
194
186
|
/**
|
|
195
187
|
* Detect test framework from file patterns and project configuration
|
|
@@ -686,11 +678,10 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
686
678
|
/**
|
|
687
679
|
* Record execution results for DT learning
|
|
688
680
|
*/
|
|
689
|
-
async recordExecutionResults(runId, testFiles, result,
|
|
681
|
+
async recordExecutionResults(runId, testFiles, result, _prioritizationInfo) {
|
|
690
682
|
// Record each test execution for learning
|
|
691
683
|
for (let i = 0; i < testFiles.length; i++) {
|
|
692
684
|
const testId = this.generateTestId(testFiles[i]);
|
|
693
|
-
const info = prioritizationInfo;
|
|
694
685
|
// Find if this test failed (check if it's in failed tests)
|
|
695
686
|
const failedTest = result.failedTests.find(t => t.file === testFiles[i]);
|
|
696
687
|
const passed = !failedTest;
|
|
@@ -80,6 +80,11 @@ export interface ITestRunResult {
|
|
|
80
80
|
fileCoverages?: IFileCoverageData[];
|
|
81
81
|
/** #1130: what the requested retries of failed tests did. Absent when none were requested. */
|
|
82
82
|
retries?: IRunRetrySummary;
|
|
83
|
+
/**
|
|
84
|
+
* #1170: tests that failed and then passed on a retry. They are counted in
|
|
85
|
+
* `passed`, not `failed`. Absent when no test passed on a retry.
|
|
86
|
+
*/
|
|
87
|
+
flaky?: number;
|
|
83
88
|
}
|
|
84
89
|
/** #1130: the measured outcome of a run's retries, per failed test. */
|
|
85
90
|
export interface IRunRetrySummary {
|
|
@@ -102,8 +107,13 @@ export interface ITestCaseResult {
|
|
|
102
107
|
status: 'passed' | 'failed' | 'skipped';
|
|
103
108
|
/** Runner-reported duration in ms; omitted when the runner reported none. */
|
|
104
109
|
duration?: number;
|
|
105
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
* The runner's failure message for a failed test, or for the failed first
|
|
112
|
+
* attempt of a flaky test, when it reported one.
|
|
113
|
+
*/
|
|
106
114
|
failureMessage?: string;
|
|
115
|
+
/** #1170: the test failed and then passed on a retry, so it is `passed`. */
|
|
116
|
+
flaky?: true;
|
|
107
117
|
}
|
|
108
118
|
export interface IFileCoverageData {
|
|
109
119
|
path: string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1170: a run's final outcome after its failed tests were retried.
|
|
3
|
+
*
|
|
4
|
+
* A test that failed and then passed on a retry is passed, and flaky: it
|
|
5
|
+
* leaves `failed`/`failedTests`, its runner test case reads `passed` with
|
|
6
|
+
* `flaky: true`, and the run counts it in `flaky`. A test whose retries all
|
|
7
|
+
* failed, or whose retry matched no test, stays failed.
|
|
8
|
+
*/
|
|
9
|
+
import type { IRetryResult, ITestRunResult } from '../interfaces';
|
|
10
|
+
/**
|
|
11
|
+
* Default retries of a failed test, shared by `aqe test execute` and MCP
|
|
12
|
+
* `test_execute_parallel` so both surfaces rerun a failure the same number of
|
|
13
|
+
* times (#1170).
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_TEST_RETRY_COUNT = 2;
|
|
16
|
+
/** Attach the retry outcome to `run` and move tests that passed on retry from failed to passed. */
|
|
17
|
+
export declare function applyRetryOutcome(run: ITestRunResult, retried: IRetryResult): void;
|
|
18
|
+
//# sourceMappingURL=retry-outcome.d.ts.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1170: a run's final outcome after its failed tests were retried.
|
|
3
|
+
*
|
|
4
|
+
* A test that failed and then passed on a retry is passed, and flaky: it
|
|
5
|
+
* leaves `failed`/`failedTests`, its runner test case reads `passed` with
|
|
6
|
+
* `flaky: true`, and the run counts it in `flaky`. A test whose retries all
|
|
7
|
+
* failed, or whose retry matched no test, stays failed.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default retries of a failed test, shared by `aqe test execute` and MCP
|
|
11
|
+
* `test_execute_parallel` so both surfaces rerun a failure the same number of
|
|
12
|
+
* times (#1170).
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_TEST_RETRY_COUNT = 2;
|
|
15
|
+
/** Attach the retry outcome to `run` and move tests that passed on retry from failed to passed. */
|
|
16
|
+
export function applyRetryOutcome(run, retried) {
|
|
17
|
+
const byId = new Map(run.failedTests.map(t => [t.testId, t]));
|
|
18
|
+
const outcomes = retried.tests ?? [];
|
|
19
|
+
const summary = {
|
|
20
|
+
totalRetries: retried.retried,
|
|
21
|
+
nowPassing: retried.nowPassing,
|
|
22
|
+
stillFailing: retried.stillFailing,
|
|
23
|
+
tests: outcomes.map(({ testId, ...outcome }) => ({
|
|
24
|
+
name: byId.get(testId)?.testName ?? testId,
|
|
25
|
+
file: byId.get(testId)?.file ?? '',
|
|
26
|
+
...outcome,
|
|
27
|
+
})),
|
|
28
|
+
};
|
|
29
|
+
run.retries = summary;
|
|
30
|
+
const passedOnRetry = new Set(outcomes.filter(o => o.passed && !o.unmatched).map(o => o.testId));
|
|
31
|
+
const recovered = run.failedTests.filter(t => passedOnRetry.has(t.testId));
|
|
32
|
+
if (recovered.length === 0)
|
|
33
|
+
return;
|
|
34
|
+
run.failedTests = run.failedTests.filter(t => !passedOnRetry.has(t.testId));
|
|
35
|
+
run.failed = Math.max(0, run.failed - recovered.length);
|
|
36
|
+
run.passed += recovered.length;
|
|
37
|
+
run.flaky = (run.flaky ?? 0) + recovered.length;
|
|
38
|
+
if (run.failed === 0 && run.status === 'failed')
|
|
39
|
+
run.status = 'passed';
|
|
40
|
+
if (run.testCases) {
|
|
41
|
+
const pending = [...recovered];
|
|
42
|
+
run.testCases = run.testCases.map(testCase => {
|
|
43
|
+
if (testCase.status !== 'failed')
|
|
44
|
+
return testCase;
|
|
45
|
+
const index = pending.findIndex(t => t.testName === testCase.name && t.file === testCase.file);
|
|
46
|
+
if (index < 0)
|
|
47
|
+
return testCase;
|
|
48
|
+
pending.splice(index, 1);
|
|
49
|
+
return { ...testCase, status: 'passed', flaky: true };
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=retry-outcome.js.map
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { LoggerFactory } from '../../logging/index.js';
|
|
11
11
|
import { v4 as uuidv4 } from 'uuid';
|
|
12
|
-
import {
|
|
12
|
+
import { readConfinedText } from '../../shared/io/confined-read.js';
|
|
13
13
|
import { ok, err, } from '../../shared/types/index.js';
|
|
14
14
|
import { toError } from '../../shared/error-utils.js';
|
|
15
15
|
// Opt-in free-tier local test generation (cross-pollination plan 06, D7-wire/D8/D9).
|
|
@@ -425,7 +425,7 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
425
425
|
return null;
|
|
426
426
|
let code = '';
|
|
427
427
|
try {
|
|
428
|
-
code = await
|
|
428
|
+
code = await readConfinedText(src, { outsideRoot: 'allow' }); // #1161
|
|
429
429
|
}
|
|
430
430
|
catch {
|
|
431
431
|
return null; // unreadable → fall back
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { v4 as uuidv4 } from 'uuid';
|
|
9
9
|
import ts from 'typescript';
|
|
10
|
-
import
|
|
10
|
+
import { readConfinedTextSync } from '../../../shared/io/confined-read.js';
|
|
11
11
|
import * as path from 'path';
|
|
12
12
|
import { ok, err } from '../../../shared/types/index.js';
|
|
13
13
|
import { NomicEmbedder, EMBEDDING_CONFIG } from '../../../shared/embeddings/index.js';
|
|
@@ -45,7 +45,7 @@ export class PatternMatcherService {
|
|
|
45
45
|
// Read file content
|
|
46
46
|
let content;
|
|
47
47
|
try {
|
|
48
|
-
content =
|
|
48
|
+
content = readConfinedTextSync(filePath, { outsideRoot: 'allow' }); // #1161
|
|
49
49
|
}
|
|
50
50
|
catch {
|
|
51
51
|
return err(new Error(`Cannot read file: ${filePath}`));
|
|
@@ -737,7 +737,7 @@ export class PatternMatcherService {
|
|
|
737
737
|
// Read the file content
|
|
738
738
|
let content;
|
|
739
739
|
try {
|
|
740
|
-
content =
|
|
740
|
+
content = readConfinedTextSync(file, { outsideRoot: 'allow' }); // #1161
|
|
741
741
|
}
|
|
742
742
|
catch {
|
|
743
743
|
// File doesn't exist or can't be read, return empty
|
|
@@ -1068,7 +1068,7 @@ class TypeScriptASTParser {
|
|
|
1068
1068
|
this.sourceCode = content;
|
|
1069
1069
|
}
|
|
1070
1070
|
else {
|
|
1071
|
-
this.sourceCode =
|
|
1071
|
+
this.sourceCode = readConfinedTextSync(filePath, { outsideRoot: 'allow' }); // #1161
|
|
1072
1072
|
}
|
|
1073
1073
|
this.sourceFile = ts.createSourceFile(path.basename(filePath), this.sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
1074
1074
|
return this.sourceFile;
|
|
@@ -10,7 +10,7 @@ import { generateBehaviorExamples } from './behavior-examples.js';
|
|
|
10
10
|
import { validateBehaviorExamples } from './behavior-example-validation.js';
|
|
11
11
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
12
12
|
import { v4 as uuidv4 } from 'uuid';
|
|
13
|
-
import
|
|
13
|
+
import { readConfinedTextSync } from '../../../shared/io/confined-read.js';
|
|
14
14
|
import * as path from 'path';
|
|
15
15
|
import ts from 'typescript';
|
|
16
16
|
import { ok, err } from '../../../shared/types/index.js';
|
|
@@ -445,7 +445,7 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
445
445
|
let codeAnalysis = null;
|
|
446
446
|
let sourceContent = '';
|
|
447
447
|
try {
|
|
448
|
-
sourceContent =
|
|
448
|
+
sourceContent = readConfinedTextSync(sourceFile, { outsideRoot: 'allow' }); // #1161
|
|
449
449
|
codeAnalysis = await this.analyzeSourceCode(sourceContent, sourceFile);
|
|
450
450
|
}
|
|
451
451
|
catch {
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
import { governanceFlags } from './feature-flags.js';
|
|
20
20
|
import { getUnifiedMemory } from '../kernel/unified-memory.js';
|
|
21
21
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
22
|
+
import { createSafeRecord } from '../shared/utils/safe-record.js';
|
|
22
23
|
// ============================================================================
|
|
23
24
|
// Feature Flag Helpers
|
|
24
25
|
// ============================================================================
|
|
@@ -799,7 +800,8 @@ export class EvolutionPipelineIntegration {
|
|
|
799
800
|
* Group array by key function
|
|
800
801
|
*/
|
|
801
802
|
groupBy(array, keyFn) {
|
|
802
|
-
|
|
803
|
+
// #1157: keys come from recorded rule applications.
|
|
804
|
+
const groups = createSafeRecord();
|
|
803
805
|
for (const item of array) {
|
|
804
806
|
const key = keyFn(item);
|
|
805
807
|
if (!groups[key]) {
|
|
@@ -12,6 +12,7 @@ import { join } from 'path';
|
|
|
12
12
|
import { parse as parseYaml } from 'yaml';
|
|
13
13
|
import { getCrossPhaseMemory, } from '../memory/cross-phase-memory.js';
|
|
14
14
|
import { captureHooksConfigSnapshot, validateHookUrl, classifyHookExit, } from './security/index.js';
|
|
15
|
+
import { createSafeRecord } from '../shared/utils/safe-record.js';
|
|
15
16
|
// =============================================================================
|
|
16
17
|
// Hook Executor
|
|
17
18
|
// =============================================================================
|
|
@@ -79,7 +80,8 @@ export class CrossPhaseHookExecutor {
|
|
|
79
80
|
// IMP-07: Runtime kill-switch check
|
|
80
81
|
if (process.env.AQE_HOOKS_DISABLED === 'true')
|
|
81
82
|
return {};
|
|
82
|
-
|
|
83
|
+
// #1157: agent names come from the hooks YAML file.
|
|
84
|
+
const injectedSignals = createSafeRecord();
|
|
83
85
|
const matchingHooks = this.filterManagedHooks(Object.entries(this.config.hooks).filter(([_, hook]) => hook.trigger.event === 'phase-start' &&
|
|
84
86
|
hook.trigger.phase === phaseName));
|
|
85
87
|
for (const [hookName, hook] of matchingHooks) {
|
|
@@ -11,6 +11,7 @@ import { createSkillsInstaller } from './skills-installer.js';
|
|
|
11
11
|
import { createAgentsInstaller } from './agents-installer.js';
|
|
12
12
|
import { createN8nInstaller } from './n8n-installer.js';
|
|
13
13
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
14
|
+
import { isNativeModuleLoadFailure, withNativeModuleRemedy } from '../shared/native-module-errors.js';
|
|
14
15
|
import { openDatabase } from '../shared/safe-db.js';
|
|
15
16
|
import { safeJsonParse } from '../shared/safe-json.js';
|
|
16
17
|
// ============================================================================
|
|
@@ -112,7 +113,7 @@ export async function initializePersistenceDatabase(projectRoot) {
|
|
|
112
113
|
const mod = await import('better-sqlite3');
|
|
113
114
|
Database = mod.default;
|
|
114
115
|
}
|
|
115
|
-
catch
|
|
116
|
+
catch {
|
|
116
117
|
throw new Error('SQLite persistence REQUIRED but better-sqlite3 is not installed.\n' +
|
|
117
118
|
'Install it with: npm install better-sqlite3\n' +
|
|
118
119
|
'If you see native compilation errors, ensure build tools are installed:\n' +
|
|
@@ -157,6 +158,9 @@ export async function initializePersistenceDatabase(projectRoot) {
|
|
|
157
158
|
return true;
|
|
158
159
|
}
|
|
159
160
|
catch (error) {
|
|
161
|
+
if (isNativeModuleLoadFailure(error)) {
|
|
162
|
+
throw new Error(`SQLite persistence initialization FAILED: ${toErrorMessage(withNativeModuleRemedy(error))}`, { cause: error });
|
|
163
|
+
}
|
|
160
164
|
throw new Error(`SQLite persistence initialization FAILED: ${error}\n` +
|
|
161
165
|
`Database path: ${dbPath}\n` +
|
|
162
166
|
'Ensure the directory is writable and has sufficient disk space.');
|
|
@@ -17,6 +17,8 @@ import { existsSync, mkdirSync } from 'fs';
|
|
|
17
17
|
import { join } from 'path';
|
|
18
18
|
import { BasePhase, } from './phase-interface.js';
|
|
19
19
|
import { getAQEVersion } from '../types.js';
|
|
20
|
+
import { toErrorMessage } from '../../shared/error-utils.js';
|
|
21
|
+
import { isNativeModuleLoadFailure, withNativeModuleRemedy } from '../../shared/native-module-errors.js';
|
|
20
22
|
/**
|
|
21
23
|
* Database phase - initializes SQLite persistence via UnifiedMemoryManager
|
|
22
24
|
*/
|
|
@@ -106,6 +108,11 @@ export class DatabasePhase extends BasePhase {
|
|
|
106
108
|
};
|
|
107
109
|
}
|
|
108
110
|
catch (error) {
|
|
111
|
+
// A native-addon load failure (#1173) is not a disk/permission problem:
|
|
112
|
+
// report the cause and the install fix instead of the generic advice.
|
|
113
|
+
if (isNativeModuleLoadFailure(error)) {
|
|
114
|
+
throw new Error(`SQLite persistence initialization FAILED: ${toErrorMessage(withNativeModuleRemedy(error))}`, { cause: error });
|
|
115
|
+
}
|
|
109
116
|
throw new Error(`SQLite persistence initialization FAILED: ${error}\n` +
|
|
110
117
|
`Database path: ${dbPath}\n` +
|
|
111
118
|
'Ensure the directory is writable and has sufficient disk space.');
|