agentic-qe 3.15.9 → 3.15.10
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 +251 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2ui/catalog/component-schemas.js +2 -1
- package/dist/adapters/a2ui/data/json-pointer-resolver.js +10 -5
- package/dist/adapters/a2ui/integration/agui-sync.js +10 -6
- package/dist/adapters/a2ui/integration/surface-state-bridge.js +9 -5
- package/dist/adapters/ag-ui/json-patch.js +10 -6
- package/dist/audit/witness-chain.d.ts +1 -1
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-TR5SLAZC.js +2 -0
- package/dist/cli/chunks/agent-booster-wasm-H7ANGXW4.js +2 -0
- package/dist/cli/chunks/{agent-handler-RIYHTHVZ.js → agent-handler-SVXSHEET.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-WSUCUHOO.js → agent-memory-branch-WKQH36XL.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-DXWKCHY2.js +2 -0
- package/dist/cli/chunks/{arena-KRIBMIXX.js → arena-EKOOFVST.js} +2 -2
- package/dist/cli/chunks/{arena-YAJZX6MC.js → arena-OPS36NFZ.js} +4 -4
- package/dist/cli/chunks/{audit-7ZNOXWP3.js → audit-AO5NDZRI.js} +3 -3
- package/dist/cli/chunks/base-GTB6POYE.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-ZQAT4I6H.js → better-sqlite3-TFLVEMMY.js} +2 -2
- package/dist/cli/chunks/{brain-handler-452WCPZC.js → brain-handler-ADBBJPYW.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-IJFXJRPN.js → branch-enumerator-HGHUYYL5.js} +2 -2
- package/dist/cli/chunks/browser-5LU6P4SZ.js +4 -0
- package/dist/cli/chunks/browser-workflow-MSBOLYUY.js +2 -0
- package/dist/cli/chunks/{chunk-UOJBR4J3.js → chunk-2SXBBUM6.js} +2 -2
- package/dist/cli/chunks/{chunk-7JKB3Q7O.js → chunk-2T7RRL6G.js} +1 -1
- package/dist/cli/chunks/{chunk-HCYQHWI2.js → chunk-2XGVTYVX.js} +2 -2
- package/dist/cli/chunks/{chunk-3LYU7BLY.js → chunk-2ZI5FKSF.js} +2 -2
- package/dist/cli/chunks/chunk-2ZMF4NCF.js +4 -0
- package/dist/cli/chunks/{chunk-F3PQZX44.js → chunk-37OWRCUN.js} +1 -1
- package/dist/cli/chunks/{chunk-YRBBBUJX.js → chunk-3P34JFQH.js} +4 -4
- package/dist/cli/chunks/{chunk-ICP2ORGI.js → chunk-3Y7SPD72.js} +2 -2
- package/dist/cli/chunks/{chunk-WGDR2KIR.js → chunk-4G63WT4F.js} +2 -2
- package/dist/cli/chunks/chunk-4SJYIX54.js +3 -0
- package/dist/cli/chunks/chunk-5E6GHSTY.js +3 -0
- package/dist/cli/chunks/{chunk-OXTFSIGN.js → chunk-5LPYV3TK.js} +1 -1
- package/dist/cli/chunks/{chunk-XWIUFYM3.js → chunk-62OAY5KJ.js} +1 -1
- package/dist/cli/chunks/{chunk-VCMINU7K.js → chunk-6C3II5OM.js} +2 -2
- package/dist/cli/chunks/{chunk-EFBLP43U.js → chunk-6GP6W46M.js} +2 -2
- package/dist/cli/chunks/{chunk-4JCY45KV.js → chunk-6KIL6CMD.js} +2 -2
- package/dist/cli/chunks/{chunk-CTZJUV5I.js → chunk-6MVVSSID.js} +1 -1
- package/dist/cli/chunks/{chunk-JEP4ULR6.js → chunk-6P7424AO.js} +2 -2
- package/dist/cli/chunks/{chunk-SVHUYVUR.js → chunk-6PX4OXQO.js} +2 -2
- package/dist/cli/chunks/{chunk-LEAKYZ37.js → chunk-6S3WJGUV.js} +2 -2
- package/dist/cli/chunks/{chunk-7X2Y727E.js → chunk-6TB6YOCZ.js} +1 -1
- package/dist/cli/chunks/{chunk-VU2EL424.js → chunk-6X5DHU6Q.js} +1 -1
- package/dist/cli/chunks/{chunk-DDPPSSHW.js → chunk-6XCMKIZN.js} +1 -1
- package/dist/cli/chunks/{chunk-ZANDSVCK.js → chunk-7LFZ4CHM.js} +2 -2
- package/dist/cli/chunks/{chunk-UYLYMWV5.js → chunk-7OZVZIBE.js} +2 -2
- package/dist/cli/chunks/{chunk-32UTLDNY.js → chunk-7PJIR4ST.js} +2 -2
- package/dist/cli/chunks/{chunk-DINZR5CF.js → chunk-7TB6FK4B.js} +1 -1
- package/dist/cli/chunks/{chunk-KVBEGOJE.js → chunk-7ZCDZHDB.js} +2 -2
- package/dist/cli/chunks/{chunk-55HRSNGN.js → chunk-A55QKKT2.js} +2 -2
- package/dist/cli/chunks/{chunk-LCJTEUDC.js → chunk-ABFFWZPC.js} +428 -433
- package/dist/cli/chunks/{chunk-PVIA2FPD.js → chunk-ACWFKES2.js} +2 -2
- package/dist/cli/chunks/{chunk-2BA45H64.js → chunk-AH3ZD3NJ.js} +2 -2
- package/dist/cli/chunks/{chunk-OG2UI6A3.js → chunk-AI4VYSFS.js} +2 -2
- package/dist/cli/chunks/chunk-APSRPR4W.js +2 -0
- package/dist/cli/chunks/chunk-ATHWDAXB.js +3 -0
- package/dist/cli/chunks/{chunk-TSYQDRNK.js → chunk-B6LTH6YV.js} +2 -2
- package/dist/cli/chunks/chunk-BQUAE3CP.js +3 -0
- package/dist/cli/chunks/{chunk-OCESWNAZ.js → chunk-C522H7XR.js} +54 -33
- package/dist/cli/chunks/{chunk-TUYJ53V4.js → chunk-CESIR27V.js} +2 -2
- package/dist/cli/chunks/{chunk-PBZI2ZPV.js → chunk-CFBEBXLO.js} +3 -3
- package/dist/cli/chunks/{chunk-FJ4VTLLK.js → chunk-CMBLM26R.js} +2 -2
- package/dist/cli/chunks/{chunk-YZYDTABJ.js → chunk-CZ2IF6MC.js} +1 -1
- package/dist/cli/chunks/{chunk-GKPQ2GRR.js → chunk-CZGOSJQ4.js} +2 -2
- package/dist/cli/chunks/{chunk-FL3OYGCS.js → chunk-D6DA2KFD.js} +2 -2
- package/dist/cli/chunks/{chunk-37BIGMJI.js → chunk-DBMNJSBV.js} +1 -1
- package/dist/cli/chunks/{chunk-BHKXMIWX.js → chunk-DE4YJQJF.js} +2 -2
- package/dist/cli/chunks/{chunk-3CJCROMW.js → chunk-DEF34AFL.js} +2 -2
- package/dist/cli/chunks/chunk-DKAC3E3B.js +3 -0
- package/dist/cli/chunks/{chunk-AOFO4N32.js → chunk-DMFTELBS.js} +2 -2
- package/dist/cli/chunks/{chunk-KLGYIEJK.js → chunk-DNRWGATA.js} +10 -10
- package/dist/cli/chunks/{chunk-JWGRWMZP.js → chunk-DT7SIJOA.js} +2 -2
- package/dist/cli/chunks/{chunk-6PXA2BQJ.js → chunk-DURHK377.js} +67 -67
- package/dist/cli/chunks/{chunk-HAROIAJE.js → chunk-EAU5KDFO.js} +1 -1
- package/dist/cli/chunks/{chunk-L42JPFCC.js → chunk-EDLFX4ZB.js} +2 -2
- package/dist/cli/chunks/{chunk-6OOYIO3W.js → chunk-EN2QSKFF.js} +2 -2
- package/dist/cli/chunks/{chunk-UNUTC6TX.js → chunk-ERQKYIP7.js} +2 -2
- package/dist/cli/chunks/{chunk-KFUUIAR4.js → chunk-ESUO3GTJ.js} +2 -2
- package/dist/cli/chunks/{chunk-4V27J6YN.js → chunk-EWFECZ2U.js} +2 -2
- package/dist/cli/chunks/{chunk-4W4DYVSH.js → chunk-FAUCT5KR.js} +3 -3
- package/dist/cli/chunks/{chunk-IFEIY3NQ.js → chunk-FB6TI3BH.js} +2 -2
- package/dist/cli/chunks/{chunk-2TDIS6YK.js → chunk-FBXTQNRH.js} +2 -2
- package/dist/cli/chunks/{chunk-XOLDMK23.js → chunk-FESZBPUB.js} +2 -2
- package/dist/cli/chunks/chunk-FFTPAWM6.js +141 -0
- package/dist/cli/chunks/{chunk-A6YIH4C4.js → chunk-FKL3R5JQ.js} +2 -2
- package/dist/cli/chunks/{chunk-N5PDFGCQ.js → chunk-FPUDRSFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-7QGYJ5OY.js → chunk-FZOWULMH.js} +1 -1
- package/dist/cli/chunks/{chunk-AVB5QY2Q.js → chunk-G3CZCUPM.js} +2 -2
- package/dist/cli/chunks/{chunk-FV3NHVC7.js → chunk-G5I6KGMW.js} +3 -3
- package/dist/cli/chunks/{chunk-N3KEY4XJ.js → chunk-GHBNRMSJ.js} +2 -2
- package/dist/cli/chunks/{chunk-2YH62JCN.js → chunk-GJHWY3ZX.js} +2 -2
- package/dist/cli/chunks/{chunk-ZXBCCO2H.js → chunk-GJMLK5UT.js} +2 -2
- package/dist/cli/chunks/{chunk-NHZIWIQZ.js → chunk-GRCIBCJ2.js} +2 -2
- package/dist/cli/chunks/{chunk-J3DTDJDT.js → chunk-GWZZ7DAO.js} +2 -2
- package/dist/cli/chunks/{chunk-4SUOVLJ6.js → chunk-GZLZCZ42.js} +2 -2
- package/dist/cli/chunks/{chunk-MZS32SYS.js → chunk-H2PYU7MN.js} +1 -1
- package/dist/cli/chunks/{chunk-ABFDB4X3.js → chunk-H32EPIR2.js} +1 -1
- package/dist/cli/chunks/{chunk-KIXYKUCI.js → chunk-H74Q7TJN.js} +1 -1
- package/dist/cli/chunks/chunk-HOZUDE4C.js +2 -0
- package/dist/cli/chunks/{chunk-PMCRCEW5.js → chunk-I33O4BRQ.js} +2 -2
- package/dist/cli/chunks/{chunk-N3NP6PTT.js → chunk-IKISCIGH.js} +2 -2
- package/dist/cli/chunks/{chunk-Q3JVJRVJ.js → chunk-IPJ7Q3AJ.js} +1 -1
- package/dist/cli/chunks/{chunk-WRRCQ2UE.js → chunk-IU2IV4NE.js} +1 -1
- package/dist/cli/chunks/{chunk-QQ5SZH4D.js → chunk-JHIY4VCC.js} +2 -2
- package/dist/cli/chunks/{chunk-W32YU3VI.js → chunk-KG336OV3.js} +2 -2
- package/dist/cli/chunks/{chunk-W5VJRDDG.js → chunk-KI73QCR5.js} +2 -2
- package/dist/cli/chunks/{chunk-HGTWAZWU.js → chunk-KNQ2ERFX.js} +2 -2
- package/dist/cli/chunks/{chunk-SNBYYO6F.js → chunk-KOBVYY6H.js} +2 -2
- package/dist/cli/chunks/{chunk-VQHVHVSF.js → chunk-KSIWGGJI.js} +8 -8
- package/dist/cli/chunks/{chunk-REUFWGMA.js → chunk-LMS3Y7JD.js} +2 -2
- package/dist/cli/chunks/{chunk-LMU5DUDK.js → chunk-LQEURY7C.js} +1 -1
- package/dist/cli/chunks/{chunk-AJ4YDSOI.js → chunk-LRZY4KS2.js} +2 -2
- package/dist/cli/chunks/{chunk-KIKWJM6J.js → chunk-M2QV7PT7.js} +2 -2
- package/dist/cli/chunks/{chunk-TNMQVG4A.js → chunk-MA7JIQ6U.js} +2 -2
- package/dist/cli/chunks/{chunk-I6S35FRO.js → chunk-MG27QY4D.js} +2 -2
- package/dist/cli/chunks/chunk-MNN5J4GU.js +12 -0
- package/dist/cli/chunks/chunk-N6PIIK6G.js +3 -0
- package/dist/cli/chunks/chunk-NAXGWDVM.js +12 -0
- package/dist/cli/chunks/{chunk-XOVNZT7F.js → chunk-NGKNYIQZ.js} +1 -1
- package/dist/cli/chunks/chunk-NNFZUTDH.js +2 -0
- package/dist/cli/chunks/{chunk-ZVSLCEVC.js → chunk-NPPHWFA2.js} +3 -3
- package/dist/cli/chunks/{chunk-JNNZK7KH.js → chunk-NSHU347M.js} +1 -1
- package/dist/cli/chunks/{chunk-PX2B5TS2.js → chunk-NVYIZCSR.js} +2 -2
- package/dist/cli/chunks/{chunk-5NS3USRW.js → chunk-NW5JUCCG.js} +1 -1
- package/dist/cli/chunks/{chunk-KR3M44CF.js → chunk-NZYLNXT6.js} +3 -3
- package/dist/cli/chunks/{chunk-5D2I7JUP.js → chunk-OBAREPDC.js} +2 -2
- package/dist/cli/chunks/{chunk-F4JYIRW2.js → chunk-ODJNUMV3.js} +2 -2
- package/dist/cli/chunks/{chunk-K5DJXMAA.js → chunk-OEKP73MC.js} +2 -2
- package/dist/cli/chunks/{chunk-2URBI52G.js → chunk-OPFGRS5S.js} +2 -2
- package/dist/cli/chunks/{chunk-HZ5NC6U5.js → chunk-OY2AHLSF.js} +1 -1
- package/dist/cli/chunks/{chunk-GII5WVAK.js → chunk-OY3NJNP2.js} +1 -1
- package/dist/cli/chunks/{chunk-P73W2K7T.js → chunk-PCEW6Q2C.js} +1 -1
- package/dist/cli/chunks/{chunk-7QTB5VJZ.js → chunk-PFG6VQ5Z.js} +2 -2
- package/dist/cli/chunks/{chunk-7KII4CQG.js → chunk-PGYMKGOE.js} +2 -2
- package/dist/cli/chunks/{chunk-BXO536GT.js → chunk-PPSAMXYN.js} +3 -3
- package/dist/cli/chunks/chunk-RK73HB2F.js +2 -0
- package/dist/cli/chunks/{chunk-ZBDRLF43.js → chunk-RPHY2DU6.js} +2 -2
- package/dist/cli/chunks/{chunk-XDBD4GXO.js → chunk-RWWOHCMG.js} +25 -20
- package/dist/cli/chunks/{chunk-J5KNRVXR.js → chunk-S75EYIJG.js} +1 -1
- package/dist/cli/chunks/{chunk-ETG7O5E5.js → chunk-SKQUUE4F.js} +5 -5
- package/dist/cli/chunks/chunk-SO45NA4D.js +180 -0
- package/dist/cli/chunks/{chunk-47V7FQGX.js → chunk-SU5H66SD.js} +2 -2
- package/dist/cli/chunks/{chunk-NTAD5UX4.js → chunk-SY2IB442.js} +2 -2
- package/dist/cli/chunks/{chunk-D6XVGFTI.js → chunk-TBLI254A.js} +2 -2
- package/dist/cli/chunks/{chunk-47TYABPD.js → chunk-TNMBRDCA.js} +3 -3
- package/dist/cli/chunks/{chunk-P2CXVNKK.js → chunk-TYFZXDGZ.js} +2 -2
- package/dist/cli/chunks/{chunk-2XITOPYV.js → chunk-U4OICXV2.js} +2 -2
- package/dist/cli/chunks/{chunk-JAV5WPSY.js → chunk-U53ZB4IX.js} +2 -2
- package/dist/cli/chunks/chunk-UARKIZAS.js +2 -0
- package/dist/cli/chunks/{chunk-2HL3UM5P.js → chunk-UCJMVXO4.js} +2 -2
- package/dist/cli/chunks/{chunk-HWK5L7IJ.js → chunk-UHTTW3IT.js} +2 -2
- package/dist/cli/chunks/{chunk-OXZLKP6C.js → chunk-V2M2XCR5.js} +1 -1
- package/dist/cli/chunks/{chunk-YZGSJG34.js → chunk-V2RSNVMW.js} +1 -1
- package/dist/cli/chunks/{chunk-5JWGCIQW.js → chunk-V6JBOIMX.js} +1 -1
- package/dist/cli/chunks/{chunk-JUVHZG7I.js → chunk-VFKF2XO7.js} +1 -1
- package/dist/cli/chunks/{chunk-XQ3DDY7X.js → chunk-VFSYMOAL.js} +2 -2
- package/dist/cli/chunks/{chunk-V5PXQSFS.js → chunk-VJQYDYAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-A4RU67VX.js → chunk-VKRTTFB6.js} +2 -2
- package/dist/cli/chunks/{chunk-H3KBIWTO.js → chunk-VWNFAW2M.js} +2 -2
- package/dist/cli/chunks/{chunk-72AMFDC7.js → chunk-WBM6N6IM.js} +1 -1
- package/dist/cli/chunks/{chunk-XUIA5KMS.js → chunk-WDQ7IEZY.js} +2 -2
- package/dist/cli/chunks/{chunk-FLASM2XB.js → chunk-WDVRE6GN.js} +2 -2
- package/dist/cli/chunks/{chunk-FV7VAG74.js → chunk-WQ4PYWSW.js} +1 -1
- package/dist/cli/chunks/{chunk-DGTLJNJH.js → chunk-WSF24I3D.js} +2 -2
- package/dist/cli/chunks/{chunk-6YL6JOQB.js → chunk-XBVUVFJK.js} +2 -2
- package/dist/cli/chunks/{chunk-VRGCKBF7.js → chunk-XEB3NLJR.js} +2 -2
- package/dist/cli/chunks/{chunk-XYCKHYBM.js → chunk-XFVTGAAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-2I2UPJS7.js → chunk-XLZYRTNO.js} +2 -2
- package/dist/cli/chunks/{chunk-AR2E4B7K.js → chunk-XUZDBQ5X.js} +5 -5
- package/dist/cli/chunks/{chunk-AQTVVLNP.js → chunk-Y76IAYQD.js} +1 -1
- package/dist/cli/chunks/{chunk-UOWHE77F.js → chunk-YAKGBHO4.js} +2 -2
- package/dist/cli/chunks/{chunk-JK2ME6IT.js → chunk-YBSBABOS.js} +2 -2
- package/dist/cli/chunks/{chunk-NDKLQW6N.js → chunk-YCGP5VFP.js} +2 -2
- package/dist/cli/chunks/{chunk-GBUIG3FS.js → chunk-YDAQK5UF.js} +1 -1
- package/dist/cli/chunks/{chunk-HTZJSQ3C.js → chunk-YK3BVZY6.js} +2 -2
- package/dist/cli/chunks/{chunk-GCWSX2NY.js → chunk-YK7JN5N7.js} +4 -4
- package/dist/cli/chunks/{chunk-C6RTMTEH.js → chunk-YKMU4LBV.js} +1 -1
- package/dist/cli/chunks/{chunk-JP4P3P3D.js → chunk-YYTGXD3R.js} +2 -2
- package/dist/cli/chunks/{chunk-763SUL4B.js → chunk-Z2O2YJAF.js} +2 -2
- package/dist/cli/chunks/{chunk-QTVWUQTB.js → chunk-Z7IYW5U7.js} +1 -1
- package/dist/cli/chunks/{chunk-XZJ2O3VC.js → chunk-ZG5666GJ.js} +1 -1
- package/dist/cli/chunks/{chunk-6EPHNJTL.js → chunk-ZXPY654C.js} +1 -1
- package/dist/cli/chunks/{ci-7SGRCFPS.js → ci-MSKMVH5X.js} +2 -2
- package/dist/cli/chunks/{ci-config-MX3URPZA.js → ci-config-7ODMNAUM.js} +2 -2
- package/dist/cli/chunks/{ci-output-M47NJY6D.js → ci-output-FXZ7ZZW3.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-5GAK45SW.js → circuit-breaker-4VOUEPOX.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-YXYSRH4Y.js → claude-flow-setup-7D4SGLM4.js} +2 -2
- package/dist/cli/chunks/client-POSVREVS.js +2 -0
- package/dist/cli/chunks/{cline-installer-DLJ5QD5N.js → cline-installer-WRRT7BGQ.js} +2 -2
- package/dist/cli/chunks/{code-ONKLMVQ2.js → code-ZDJRIL3S.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-2232LGZN.js → code-index-extractor-4S4SHM56.js} +2 -2
- package/dist/cli/chunks/{codex-installer-UOWLYCMH.js → codex-installer-YTRHNDWR.js} +2 -2
- package/dist/cli/chunks/{completions-MHX7GCC7.js → completions-6N64JUXJ.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-43ZUJKZU.js → complexity-analyzer-I4A26VCJ.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-6Q5JR4FF.js → continuedev-installer-IIDR66LB.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-CZUMVHSI.js → copilot-installer-SVVFY3S2.js} +2 -2
- package/dist/cli/chunks/core-handlers-V243GY7X.js +2 -0
- package/dist/cli/chunks/{cost-tracker-VS5ZW3XN.js → cost-tracker-VGFS6IBX.js} +2 -2
- package/dist/cli/chunks/{coverage-VWKTWZ6D.js → coverage-B7MCGNTE.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-N3AIEM3B.js +2 -0
- package/dist/cli/chunks/{cursor-installer-YIFEMORH.js → cursor-installer-UPETT57E.js} +2 -2
- package/dist/cli/chunks/daemon-7BDJHEIJ.js +18 -0
- package/dist/cli/chunks/{daemon-SHWJSJW5.js → daemon-CQFNZLXU.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-TCC2WM46.js → dag-attention-scheduler-PJVABHON.js} +2 -2
- package/dist/cli/chunks/{detect-IGTWSQMA.js → detect-56SKAGWX.js} +2 -2
- package/dist/cli/chunks/{dist-node-TCOTJVQX.js → dist-node-UYTYUMLN.js} +2 -2
- package/dist/cli/chunks/{domain-handler-55ZVYODR.js → domain-handler-YOYLBYJE.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-GJRWOHQP.js → domain-plugins-7TARX2XF.js} +2 -2
- package/dist/cli/chunks/domain-transfer-AKVSBD6E.js +2 -0
- package/dist/cli/chunks/dream-UA7MKOPQ.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-XAMNIKQL.js → embed-and-insert-pattern-IS6HSR66.js} +2 -2
- package/dist/cli/chunks/{eval-GO22R4OZ.js → eval-GNB574IM.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-F2BRMJ3Y.js → experience-capture-middleware-RCAOCKM7.js} +3 -3
- package/dist/cli/chunks/{fast-paths-6RGPYALD.js → fast-paths-KTZ5SF54.js} +2 -2
- package/dist/cli/chunks/{feature-flags-ZGS3KLPH.js → feature-flags-ITX5LQ57.js} +2 -2
- package/dist/cli/chunks/{feature-flags-MIWQIOHU.js → feature-flags-KFHSR5YF.js} +2 -2
- package/dist/cli/chunks/file-discovery-YCMNKZAK.js +2 -0
- package/dist/cli/chunks/fleet-2Y3ZE6CE.js +46 -0
- package/dist/cli/chunks/{gnn-wrapper-ALBJVW6T.js → gnn-wrapper-RLFW3GSX.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-ZMM53NDY.js → heartbeat-handler-EM2URCYZ.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-QH5V6G2P.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-OJNFAGJS.js +2 -0
- package/dist/cli/chunks/hnsw-index-DFUNARVD.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-RYUJPA7B.js → hnsw-legacy-bridge-JMHEOIBH.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-XM6XF3YV.js → hnswlib-node-CBP73QHY.js} +2 -2
- package/dist/cli/chunks/{hooks-X62O7TJO.js → hooks-IP7XE34Z.js} +34 -34
- package/dist/cli/chunks/hybrid-backend-SSGQQEQ2.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-ZBWUPTVD.js → hypergraph-engine-ONAYHU25.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-DUMF6SJV.js → hypergraph-handler-VINJRAID.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-CRGCA7ZD.js +2 -0
- package/dist/cli/chunks/{init-guard-S4I2R46S.js → init-guard-RYVV5R3Z.js} +2 -2
- package/dist/cli/chunks/{init-handler-L4KJHVWS.js → init-handler-MPRGWMOE.js} +6 -6
- package/dist/cli/chunks/init-wizard-NIMZ4J55.js +2 -0
- package/dist/cli/chunks/kernel-JQK7PRAI.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-GNNB5FCZ.js → kilocode-installer-OPD7JBRL.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-HR6ZAH7T.js → kiro-installer-M4OPUNK2.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-YPVVIKEU.js +2 -0
- package/dist/cli/chunks/{learning-4IEEOHJS.js → learning-4UWTQLMF.js} +24 -24
- package/dist/cli/chunks/{llm-router-ZFMORP36.js → llm-router-SQ56FF6Z.js} +4 -4
- package/dist/cli/chunks/llm-router-service-5OGAUOXF.js +2 -0
- package/dist/cli/chunks/{load-ZM43WGDO.js → load-HPHKDGGL.js} +2 -2
- package/dist/cli/chunks/load-test-UKNV5MWW.js +2 -0
- package/dist/cli/chunks/mcp-TELMAC7Z.js +2 -0
- package/dist/cli/chunks/{memory-W5FZGVAD.js → memory-PFQ3KPVJ.js} +5 -5
- package/dist/cli/chunks/memory-backend-ZW4BTRNK.js +2 -0
- package/dist/cli/chunks/memory-handlers-FCXN437E.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-SXXGAQ2G.js → multi-model-executor-3VDRX6TZ.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-PIRBUAB5.js → opencode-installer-PJ576R63.js} +2 -2
- package/dist/cli/chunks/{orchestrator-H5SQCQTB.js → orchestrator-72QP4UU7.js} +63 -19
- package/dist/cli/chunks/pattern-null-store-4DUV6MQC.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-XZTWDI2T.js → pattern-usage-recorder-754YQW7C.js} +2 -2
- package/dist/cli/chunks/pipeline-AVXY4MVB.js +19 -0
- package/dist/cli/chunks/{platform-KJDABL5C.js → platform-3E3DXLYB.js} +2 -2
- package/dist/cli/chunks/{plugin-V4KSBVVM.js → plugin-7FUQAKRE.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-JDHTKQAT.js → prime-radiant-advanced-wasm-NIB4F5NV.js} +2 -2
- package/dist/cli/chunks/project-root-JCAUNL6O.js +2 -0
- package/dist/cli/chunks/protocol-executor-RNZNZP3A.js +2 -0
- package/dist/cli/chunks/{protocol-handler-BNRONTQV.js → protocol-handler-BQRYMUTG.js} +2 -2
- package/dist/cli/chunks/{prove-ELLL6XMX.js → prove-H52QGC6B.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-WK6TQOG2.js +2 -0
- package/dist/cli/chunks/{quality-NH2QA4D4.js → quality-QO4XPAUM.js} +2 -2
- package/dist/cli/chunks/{quality-gate-JTKLF7GW.js → quality-gate-FBKE5E6F.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-4452SXZQ.js +2 -0
- package/dist/cli/chunks/{real-embeddings-J3KCKLPB.js → real-embeddings-RWGOVOXO.js} +2 -2
- package/dist/cli/chunks/{ref-validation-HNXQRP4F.js → ref-validation-LF76ZOBD.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-COJ6CX6S.js → roocode-installer-3BYEBTQ7.js} +2 -2
- package/dist/cli/chunks/router-3DIS5X4R.js +2 -0
- package/dist/cli/chunks/routing-feedback-OPXRCXM7.js +2 -0
- package/dist/cli/chunks/{routing-handler-WM33ZILE.js → routing-handler-DST7BVCU.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-BBLXEA7A.js → ruvector-commands-XE32PGKC.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-JL6T727I.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-V7IBDUCS.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-P7H6HCAG.js → rvf-migration-coordinator-VP32XC75.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-O3UQTEBK.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-R5SPVRFP.js → rvf-store-integrity-SH2AMVI7.js} +2 -2
- package/dist/cli/chunks/safe-db-EVB4ZC7T.js +2 -0
- package/dist/cli/chunks/schedule-ORDDXXY4.js +2 -0
- package/dist/cli/chunks/scheduler-XFLJSFIU.js +2 -0
- package/dist/cli/chunks/{security-AUDTRX3I.js → security-VSPNKCDS.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-PVDGBGI2.js → shared-rvf-adapter-HX6AHL3P.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-LZ2GMSS2.js → shared-rvf-dual-writer-MX4FC2JE.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-Y7B42CJ3.js +2 -0
- package/dist/cli/chunks/{standalone-memory-XNOAI4G4.js → standalone-memory-O4QUTK6L.js} +2 -2
- package/dist/cli/chunks/{status-handler-K72XZE4T.js → status-handler-Z2BP6EOG.js} +2 -2
- package/dist/cli/chunks/{structural-health-NF3YY7U5.js → structural-health-R36WNLQG.js} +2 -2
- package/dist/cli/chunks/sync-2ELWUFQU.js +2 -0
- package/dist/cli/chunks/{sync-VBD5Y3E2.js → sync-QF5Y3EMZ.js} +2 -2
- package/dist/cli/chunks/{task-handler-24S3WFVJ.js → task-handler-43PYE75J.js} +2 -2
- package/dist/cli/chunks/task-handlers-KPWAEMKH.js +9 -0
- package/dist/cli/chunks/{test-XFSGQELD.js → test-UWA377D4.js} +16 -16
- package/dist/cli/chunks/test-runner-process-3XZUYST2.js +2 -0
- package/dist/cli/chunks/{test-scheduling-VYUQ4CDE.js → test-scheduling-YQZPJRRN.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-F7C6UKTC.js +2 -0
- package/dist/cli/chunks/{token-usage-VLQ6WO2L.js → token-usage-DO6WLMXP.js} +2 -2
- package/dist/cli/chunks/{transformers-TOFMWWNM.js → transformers-H5RGFKVO.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YTBCBHUO.js +2 -0
- package/dist/cli/chunks/{types-JTWLBAZJ.js → types-PJS2FGPF.js} +2 -2
- package/dist/cli/chunks/unified-memory-EHD4VNFW.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-ZODGM4UK.js +2 -0
- package/dist/cli/chunks/unified-persistence-MHSI7ABK.js +2 -0
- package/dist/cli/chunks/{upgrade-4ABM72T4.js → upgrade-4IC4F6AB.js} +2 -2
- package/dist/cli/chunks/{validate-UDJCWKXI.js → validate-DHUWW7PF.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-TODOUWNN.js → validate-swarm-OERQNOX5.js} +2 -2
- package/dist/cli/chunks/visual-security-54MLFKWY.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-WBMAJPM5.js → web-tree-sitter-TV7DMKES.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-BTT53TUL.js → windsurf-installer-QZPWSH37.js} +2 -2
- package/dist/cli/chunks/witness-chain-LC6Q2W27.js +2 -0
- package/dist/cli/chunks/witness-chain-QUIBAF3W.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-RUXIOE7F.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-FRY3LMGH.js → witness-chain-verifier-YXENHB42.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-X7QHQQWL.js → witness-key-manager-HL26AGFO.js} +2 -2
- package/dist/cli/chunks/{workflow-QMZPAWQW.js → workflow-EOVVCN2E.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-UKHEJVSK.js +2 -0
- package/dist/cli/chunks/wrappers-AGODHBOO.js +2 -0
- package/dist/cli/commands/fleet.js +19 -12
- package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +9 -2
- package/dist/cli/commands/hooks-handlers/session-hooks.js +2 -2
- package/dist/cli/commands/hooks-handlers/stats-hooks.js +3 -2
- package/dist/cli/commands/learning.js +5 -3
- package/dist/cli/commands/ruvector-commands.js +2 -1
- package/dist/cli/commands/test.js +6 -0
- package/dist/cli/utils/ci-output.d.ts +9 -0
- package/dist/cli/utils/fleet-operation.d.ts +32 -0
- package/dist/cli/utils/fleet-operation.js +71 -0
- package/dist/cli/utils/fleet-result.d.ts +31 -0
- package/dist/cli/utils/fleet-result.js +124 -0
- package/dist/context/sources/git-source.js +6 -2
- package/dist/coordination/handlers/code-intelligence-handlers.js +60 -5
- package/dist/coordination/handlers/coverage-handlers.js +10 -1
- package/dist/coordination/handlers/requirements-handlers.js +16 -2
- package/dist/coordination/handlers/security-handlers.js +11 -1
- package/dist/coordination/handlers/test-execution-handlers.js +25 -7
- package/dist/coordination/mincut/queen-integration.d.ts +39 -1
- package/dist/coordination/mincut/queen-integration.js +83 -6
- package/dist/coordination/protocols/learning-consolidation-archive.d.ts +2 -6
- package/dist/coordination/protocols/learning-consolidation-archive.js +4 -27
- package/dist/coordination/protocols/learning-consolidation.d.ts +24 -0
- package/dist/coordination/protocols/learning-consolidation.js +71 -22
- package/dist/coordination/queen-coordinator.d.ts +1 -1
- package/dist/coordination/queen-coordinator.js +19 -7
- package/dist/coordination/queen-event-handlers.js +13 -0
- package/dist/coordination/queen-task-management.d.ts +18 -24
- package/dist/coordination/queen-task-management.js +62 -168
- package/dist/coordination/queen-task-queue.d.ts +41 -0
- package/dist/coordination/queen-task-queue.js +194 -0
- package/dist/coordination/queen-types.d.ts +1 -1
- package/dist/coordination/queen-work-stealing.d.ts +6 -1
- package/dist/coordination/queen-work-stealing.js +7 -4
- package/dist/coordination/result-saver-adapters.d.ts +15 -0
- package/dist/coordination/result-saver-adapters.js +57 -0
- package/dist/coordination/result-saver.d.ts +1 -1
- package/dist/coordination/result-saver.js +8 -5
- package/dist/coordination/yaml-pipeline-loader.js +5 -2
- package/dist/domains/code-intelligence/index-path-guard.d.ts +5 -2
- package/dist/domains/code-intelligence/index-path-guard.js +20 -50
- package/dist/domains/code-intelligence/plugin.js +5 -1
- package/dist/domains/code-intelligence/services/metric-collector/index.d.ts +2 -2
- package/dist/domains/code-intelligence/services/metric-collector/index.js +2 -3
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.d.ts +1 -1
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.js +11 -36
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.d.ts +1 -1
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +45 -103
- package/dist/domains/contract-testing/services/api-compatibility.js +7 -6
- package/dist/domains/contract-testing/services/contract-validator.js +6 -4
- package/dist/domains/contract-testing/services/schema-validator.js +8 -5
- package/dist/domains/defect-intelligence/interfaces.d.ts +2 -0
- package/dist/domains/defect-intelligence/plugin.js +11 -2
- package/dist/domains/defect-intelligence/prediction-history.d.ts +27 -0
- package/dist/domains/defect-intelligence/prediction-history.js +68 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +25 -10
- package/dist/domains/enterprise-integration/services/message-broker-service.js +3 -2
- package/dist/domains/enterprise-integration/services/odata-service.js +2 -1
- package/dist/domains/enterprise-integration/services/sap-integration-service.js +3 -2
- package/dist/domains/learning-optimization/active-patterns.d.ts +2 -2
- package/dist/domains/learning-optimization/active-patterns.js +2 -2
- package/dist/domains/learning-optimization/coordinator.js +9 -5
- package/dist/domains/learning-optimization/interfaces.d.ts +6 -2
- package/dist/domains/learning-optimization/pattern-archive.d.ts +31 -0
- package/dist/domains/learning-optimization/pattern-archive.js +56 -0
- package/dist/domains/learning-optimization/pattern-consolidation.d.ts +12 -0
- package/dist/domains/learning-optimization/pattern-consolidation.js +41 -0
- package/dist/domains/learning-optimization/reward-source.d.ts +13 -0
- package/dist/domains/learning-optimization/reward-source.js +8 -1
- package/dist/domains/learning-optimization/services/learning-coordinator.d.ts +5 -3
- package/dist/domains/learning-optimization/services/learning-coordinator.js +45 -58
- package/dist/domains/security-compliance/plugin.js +17 -3
- package/dist/domains/security-compliance/sast-path-guard.d.ts +9 -0
- package/dist/domains/security-compliance/sast-path-guard.js +17 -0
- package/dist/domains/security-compliance/services/scanners/dast-auth-testing.js +46 -56
- package/dist/domains/security-compliance/services/scanners/dast-helpers.js +76 -91
- package/dist/domains/security-compliance/services/scanners/dast-injection-testing.js +52 -62
- package/dist/domains/security-compliance/services/scanners/dast-scanner.d.ts +21 -1
- package/dist/domains/security-compliance/services/scanners/dast-scanner.js +29 -24
- package/dist/domains/security-compliance/services/scanners/scanner-orchestrator.js +4 -1
- package/dist/domains/test-execution/coordinator.d.ts +5 -0
- package/dist/domains/test-execution/coordinator.js +35 -20
- package/dist/domains/test-execution/interfaces.d.ts +25 -0
- package/dist/domains/test-execution/plugin.js +19 -4
- package/dist/domains/test-execution/services/flaky-detector.js +9 -7
- package/dist/domains/test-execution/services/retry-handler.js +46 -7
- package/dist/domains/test-execution/services/runner-test-cases.d.ts +11 -0
- package/dist/domains/test-execution/services/runner-test-cases.js +20 -2
- package/dist/domains/test-execution/services/test-executor.js +8 -8
- package/dist/domains/test-generation/plugin.js +7 -2
- package/dist/domains/test-generation/services/test-data-generator.js +3 -1
- package/dist/domains/visual-accessibility/services/axe-core-audit.js +1 -1
- package/dist/hooks/cross-phase-hooks.js +2 -1
- package/dist/init/phases/10-workers.js +50 -6
- package/dist/integrations/browser/agent-browser/client.js +37 -52
- package/dist/integrations/browser/agent-browser/command-executor.d.ts +33 -27
- package/dist/integrations/browser/agent-browser/command-executor.js +53 -54
- package/dist/integrations/browser/agent-browser/session-manager.d.ts +1 -1
- package/dist/integrations/browser/agent-browser/session-manager.js +8 -9
- package/dist/integrations/browser/web-content-fetcher.js +9 -3
- package/dist/integrations/vibium/client.js +2 -2
- package/dist/integrations/vibium/runtime.d.ts +1 -1
- package/dist/integrations/vibium/runtime.js +14 -11
- package/dist/kernel/unified-memory-schemas.d.ts +3 -2
- package/dist/kernel/unified-memory-schemas.js +3 -2
- package/dist/kernel/unified-memory.js +25 -6
- package/dist/learning/dream/dream-commit.d.ts +65 -0
- package/dist/learning/dream/dream-commit.js +104 -0
- package/dist/learning/dream/dream-engine.d.ts +81 -31
- package/dist/learning/dream/dream-engine.js +225 -168
- package/dist/learning/dream/dream-insights-pruner.d.ts +9 -3
- package/dist/learning/dream/dream-insights-pruner.js +16 -30
- package/dist/learning/dream/index.d.ts +3 -2
- package/dist/learning/dream/index.js +3 -1
- package/dist/learning/dream/rvcow-branch-manager.d.ts +8 -1
- package/dist/learning/dream/rvcow-branch-manager.js +8 -1
- package/dist/learning/dream/speculative-dreamer.d.ts +50 -74
- package/dist/learning/dream/speculative-dreamer.js +64 -111
- package/dist/learning/dream/spreading-activation.d.ts +2 -1
- package/dist/learning/dream/spreading-activation.js +15 -6
- package/dist/learning/experience-capture.d.ts +9 -0
- package/dist/learning/experience-capture.js +18 -4
- package/dist/learning/qe-reasoning-bank-types.d.ts +17 -2
- package/dist/learning/qe-reasoning-bank.js +22 -11
- package/dist/learning/sqlite-persistence.d.ts +6 -0
- package/dist/learning/sqlite-persistence.js +16 -2
- package/dist/learning/usage-outcome.d.ts +68 -0
- package/dist/learning/usage-outcome.js +84 -0
- package/dist/mcp/background-workers.d.ts +13 -1
- package/dist/mcp/background-workers.js +17 -3
- package/dist/mcp/bundle.js +607 -580
- package/dist/mcp/handlers/core-handlers.js +11 -0
- package/dist/mcp/handlers/domain-handler-configs.d.ts +5 -0
- package/dist/mcp/handlers/domain-handler-configs.js +11 -3
- package/dist/mcp/handlers/handler-factory.d.ts +2 -1
- package/dist/mcp/handlers/handler-factory.js +36 -15
- package/dist/mcp/handlers/orchestrate-routes.d.ts +36 -0
- package/dist/mcp/handlers/orchestrate-routes.js +88 -0
- package/dist/mcp/handlers/task-handlers.d.ts +3 -0
- package/dist/mcp/handlers/task-handlers.js +35 -8
- package/dist/mcp/handlers/validation-pipeline-handler.js +6 -2
- package/dist/mcp/protocol-server.js +2 -0
- package/dist/mcp/security/schema-validator.js +3 -2
- package/dist/mcp/tools/code-intelligence/c4.js +11 -1
- package/dist/mcp/tools/coverage-analysis/index.js +31 -2
- package/dist/mcp/tools/learning-optimization/dream.d.ts +8 -8
- package/dist/mcp/tools/learning-optimization/dream.js +38 -34
- package/dist/mcp/tools/learning-optimization/optimize.d.ts +18 -2
- package/dist/mcp/tools/learning-optimization/optimize.js +58 -10
- package/dist/mcp/tools/quality-assessment/gate.js +12 -1
- package/dist/mcp/tools/requirements-validation/quality-criteria.js +9 -2
- package/dist/migration/agent-compat.js +7 -5
- package/dist/migrations/20261018_add_dream_insights_archive.d.ts +27 -0
- package/dist/migrations/20261018_add_dream_insights_archive.js +57 -0
- package/dist/shared/git/git-analyzer.d.ts +49 -0
- package/dist/shared/git/git-analyzer.js +159 -319
- package/dist/shared/git/git-process.d.ts +22 -0
- package/dist/shared/git/git-process.js +37 -0
- package/dist/shared/git/index.d.ts +1 -0
- package/dist/shared/git/index.js +1 -0
- package/dist/shared/io/payload-path-guard.d.ts +75 -0
- package/dist/shared/io/payload-path-guard.js +190 -0
- package/dist/shared/llm/router/agent-router-config.js +2 -1
- package/dist/shared/llm/translation/tool-translator.js +2 -1
- package/dist/shared/test-runner-args.d.ts +5 -0
- package/dist/shared/test-runner-args.js +6 -1
- package/dist/shared/test-runner-process.d.ts +6 -0
- package/dist/shared/test-runner-process.js +14 -0
- package/dist/shared/test-runner-verdict.d.ts +9 -1
- package/dist/shared/test-runner-verdict.js +15 -4
- package/dist/shared/utils/namespaced-search.d.ts +14 -0
- package/dist/shared/utils/namespaced-search.js +19 -1
- package/dist/shared/utils/safe-expression-evaluator.js +4 -3
- package/dist/strange-loop/infra-healing/recovery-playbook.js +13 -3
- package/dist/validation/gate-reexecute.js +7 -4
- package/dist/workers/daemon.js +13 -1
- package/dist/workers/quality-daemon/git-watcher.js +9 -9
- package/dist/workers/workers/defect-predictor.d.ts +8 -3
- package/dist/workers/workers/defect-predictor.js +48 -49
- package/dist/workers/workers/learning-consolidation.d.ts +2 -0
- package/dist/workers/workers/learning-consolidation.js +12 -1
- package/dist/workflows/browser/workflow-loader.js +8 -5
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-R2Q4QGXQ.js +0 -2
- package/dist/cli/chunks/agent-booster-wasm-427FRKWG.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-3RENLQWP.js +0 -2
- package/dist/cli/chunks/base-67DXSAYM.js +0 -2
- package/dist/cli/chunks/browser-CT3MTV6G.js +0 -4
- package/dist/cli/chunks/browser-workflow-NDXRROWZ.js +0 -2
- package/dist/cli/chunks/chunk-4URT6JO2.js +0 -2
- package/dist/cli/chunks/chunk-5LAAZLUC.js +0 -4
- package/dist/cli/chunks/chunk-7DMA5NYL.js +0 -4
- package/dist/cli/chunks/chunk-F2SQPP6U.js +0 -4
- package/dist/cli/chunks/chunk-G3BKZNFL.js +0 -120
- package/dist/cli/chunks/chunk-GR3JYE5A.js +0 -2
- package/dist/cli/chunks/chunk-J3WGK22W.js +0 -2
- package/dist/cli/chunks/chunk-KHSRIPBP.js +0 -180
- package/dist/cli/chunks/chunk-KTSLTZSG.js +0 -2
- package/dist/cli/chunks/chunk-O3JLOVZX.js +0 -4
- package/dist/cli/chunks/chunk-THAY7WHO.js +0 -12
- package/dist/cli/chunks/chunk-VXZJOKOX.js +0 -2
- package/dist/cli/chunks/chunk-VYLM2YV5.js +0 -12
- package/dist/cli/chunks/client-ZP3CTVRF.js +0 -2
- package/dist/cli/chunks/core-handlers-JSRXQWPE.js +0 -2
- package/dist/cli/chunks/cross-domain-router-7UKODQWG.js +0 -2
- package/dist/cli/chunks/daemon-YIFT46FH.js +0 -34
- package/dist/cli/chunks/domain-transfer-6EF75EKU.js +0 -2
- package/dist/cli/chunks/dream-UDLM6M55.js +0 -2
- package/dist/cli/chunks/file-discovery-THWOUQ7Z.js +0 -2
- package/dist/cli/chunks/fleet-ADL57COA.js +0 -44
- package/dist/cli/chunks/heartbeat-scheduler-HGOC5KH3.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-EPSA6AP7.js +0 -2
- package/dist/cli/chunks/hnsw-index-RMFOPYGY.js +0 -2
- package/dist/cli/chunks/hybrid-backend-NZ3G4WBX.js +0 -2
- package/dist/cli/chunks/impact-analyzer-WZC6NHFP.js +0 -2
- package/dist/cli/chunks/init-wizard-422UZYQ5.js +0 -2
- package/dist/cli/chunks/kernel-N7PJ6FCE.js +0 -2
- package/dist/cli/chunks/knowledge-graph-SZCVQF37.js +0 -2
- package/dist/cli/chunks/llm-router-service-4DE5WDUZ.js +0 -2
- package/dist/cli/chunks/load-test-POMIF4Q4.js +0 -2
- package/dist/cli/chunks/mcp-CRZKZE37.js +0 -2
- package/dist/cli/chunks/memory-backend-4P6AHSOY.js +0 -2
- package/dist/cli/chunks/memory-handlers-NK6NV3GE.js +0 -2
- package/dist/cli/chunks/pattern-null-store-CCHQHGQG.js +0 -2
- package/dist/cli/chunks/pipeline-5LMLBIJ7.js +0 -19
- package/dist/cli/chunks/project-root-X72FSM2F.js +0 -2
- package/dist/cli/chunks/protocol-executor-QW6XN6QN.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-ZD3WF647.js +0 -2
- package/dist/cli/chunks/queen-coordinator-S4U4MKK2.js +0 -2
- package/dist/cli/chunks/router-CXZKOOTR.js +0 -2
- package/dist/cli/chunks/routing-feedback-IYFANYY5.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-HCLQ5WUQ.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-XCLUWOO3.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-MRT5H3IP.js +0 -2
- package/dist/cli/chunks/safe-db-WFODRGVZ.js +0 -2
- package/dist/cli/chunks/schedule-RO55OQXG.js +0 -2
- package/dist/cli/chunks/scheduler-XXMJCH24.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-AWRIS4MK.js +0 -2
- package/dist/cli/chunks/sync-UVXA6CT2.js +0 -2
- package/dist/cli/chunks/task-handlers-GUYW2EPJ.js +0 -9
- package/dist/cli/chunks/token-bootstrap-EDK6FNQ3.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-MI3NZKUD.js +0 -2
- package/dist/cli/chunks/unified-memory-6JWHV6EF.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-4UANU6NU.js +0 -2
- package/dist/cli/chunks/unified-persistence-KGGNA46H.js +0 -2
- package/dist/cli/chunks/visual-security-6VZNQLH7.js +0 -2
- package/dist/cli/chunks/witness-chain-AKKHWEWU.js +0 -2
- package/dist/cli/chunks/witness-chain-TATPXQRK.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-2HGJGE7O.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-4GAW7HNZ.js +0 -2
- package/dist/cli/chunks/wrappers-ZD5NBHYI.js +0 -2
|
@@ -2,15 +2,25 @@
|
|
|
2
2
|
* Agentic QE v3 - DAST (Dynamic Application Security Testing) Scanner
|
|
3
3
|
* Performs dynamic analysis of running applications to detect security vulnerabilities
|
|
4
4
|
*/
|
|
5
|
-
import { LoggerFactory } from '../../../../logging/index.js';
|
|
6
5
|
import { v4 as uuidv4 } from 'uuid';
|
|
7
6
|
import { ok, err } from '../../../../shared/types/index.js';
|
|
8
7
|
import { toError } from '../../../../shared/error-utils.js';
|
|
9
8
|
import { fetchWithResponseDeadline } from '../../../../shared/llm/providers/response-deadline.js';
|
|
10
|
-
import { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, scanSensitiveFiles, analyzeCORS, extractAndCrawlLinks, testXSS, testSQLi, analyzeFormsForSecurityIssues, testAuthorizationBypass, testIDOR, validateCredentials, buildAuthHeaders,
|
|
9
|
+
import { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, scanSensitiveFiles, analyzeCORS, extractAndCrawlLinks, testXSS, testSQLi, analyzeFormsForSecurityIssues, testAuthorizationBypass, testIDOR, validateCredentials, buildAuthHeaders, calculateSummary, storeScanResults, } from './dast-helpers.js';
|
|
11
10
|
// ============================================================================
|
|
12
11
|
// DAST Scanner Service
|
|
13
12
|
// ============================================================================
|
|
13
|
+
/** Transport failures are execution errors, not absence of vulnerabilities. */
|
|
14
|
+
function dastRequestFailure(error) {
|
|
15
|
+
if (error instanceof Error && 'code' in error && ['DAST_AUTHENTICATION_FAILED', 'DAST_TARGET_UNAVAILABLE'].includes(String(error.code)))
|
|
16
|
+
return error;
|
|
17
|
+
const timeout = error instanceof Error && /timeout|abort/i.test(error.message);
|
|
18
|
+
return Object.assign(new Error(timeout
|
|
19
|
+
? 'DAST target request timeout; dynamic analysis is incomplete'
|
|
20
|
+
: 'DAST target request failed; dynamic analysis is incomplete'), {
|
|
21
|
+
code: timeout ? 'DAST_REQUEST_TIMEOUT' : 'DAST_REQUEST_FAILED',
|
|
22
|
+
});
|
|
23
|
+
}
|
|
14
24
|
/**
|
|
15
25
|
* DAST Scanner - Dynamic Application Security Testing
|
|
16
26
|
* Scans running applications for security vulnerabilities
|
|
@@ -32,7 +42,6 @@ import { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, sc
|
|
|
32
42
|
* - No JavaScript execution (static response analysis only)
|
|
33
43
|
* - No session management testing beyond cookie attributes
|
|
34
44
|
*/
|
|
35
|
-
const logger = LoggerFactory.create('security-compliance/dast-scanner');
|
|
36
45
|
export class DASTScanner {
|
|
37
46
|
config;
|
|
38
47
|
memory;
|
|
@@ -90,7 +99,7 @@ export class DASTScanner {
|
|
|
90
99
|
// Validate credentials
|
|
91
100
|
const credValidation = validateCredentials(credentials);
|
|
92
101
|
if (!credValidation.valid) {
|
|
93
|
-
|
|
102
|
+
throw new Error(credValidation.reason);
|
|
94
103
|
}
|
|
95
104
|
const mergedOptions = {
|
|
96
105
|
maxDepth: options?.maxDepth ?? this.config.dastMaxDepth,
|
|
@@ -158,6 +167,12 @@ export class DASTScanner {
|
|
|
158
167
|
},
|
|
159
168
|
redirect: 'follow',
|
|
160
169
|
}, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
|
|
170
|
+
if (response.status === 401 || response.status === 403 || response.status >= 500) {
|
|
171
|
+
await response.body?.cancel().catch(() => undefined);
|
|
172
|
+
throw Object.assign(new Error(`DAST ${response.status < 500 ? 'authentication rejected' : 'target unavailable'} (HTTP ${response.status}); dynamic analysis is incomplete`), {
|
|
173
|
+
code: response.status < 500 ? 'DAST_AUTHENTICATION_FAILED' : 'DAST_TARGET_UNAVAILABLE',
|
|
174
|
+
});
|
|
175
|
+
}
|
|
161
176
|
crawledUrls++;
|
|
162
177
|
// Security header analysis
|
|
163
178
|
analyzeSecurityHeaders(response.headers, targetUrl, vulnerabilities);
|
|
@@ -190,11 +205,11 @@ export class DASTScanner {
|
|
|
190
205
|
}
|
|
191
206
|
}
|
|
192
207
|
catch (fetchError) {
|
|
193
|
-
|
|
208
|
+
throw dastRequestFailure(fetchError);
|
|
194
209
|
}
|
|
195
210
|
}
|
|
196
211
|
catch (error) {
|
|
197
|
-
|
|
212
|
+
throw toError(error);
|
|
198
213
|
}
|
|
199
214
|
return { vulnerabilities, crawledUrls };
|
|
200
215
|
}
|
|
@@ -231,11 +246,13 @@ export class DASTScanner {
|
|
|
231
246
|
redirect: 'follow',
|
|
232
247
|
}, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
|
|
233
248
|
await response.body?.cancel().catch(() => undefined);
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
249
|
+
if (response.status === 401 || response.status === 403 || response.status >= 500) {
|
|
250
|
+
await response.body?.cancel().catch(() => undefined);
|
|
251
|
+
throw Object.assign(new Error(`DAST ${response.status < 500 ? 'authentication rejected' : 'target unavailable'} (HTTP ${response.status}); dynamic analysis is incomplete`), {
|
|
252
|
+
code: response.status < 500 ? 'DAST_AUTHENTICATION_FAILED' : 'DAST_TARGET_UNAVAILABLE',
|
|
253
|
+
});
|
|
238
254
|
}
|
|
255
|
+
crawledUrls++;
|
|
239
256
|
// Standard security header checks
|
|
240
257
|
analyzeSecurityHeaders(response.headers, targetUrl, vulnerabilities, true);
|
|
241
258
|
// Check for session token in URL
|
|
@@ -251,11 +268,11 @@ export class DASTScanner {
|
|
|
251
268
|
analyzeCookieSecurity(response.headers, targetUrl, vulnerabilities, true);
|
|
252
269
|
}
|
|
253
270
|
catch (fetchError) {
|
|
254
|
-
|
|
271
|
+
throw dastRequestFailure(fetchError);
|
|
255
272
|
}
|
|
256
273
|
}
|
|
257
274
|
catch (error) {
|
|
258
|
-
|
|
275
|
+
throw toError(error);
|
|
259
276
|
}
|
|
260
277
|
return { vulnerabilities, crawledUrls };
|
|
261
278
|
}
|
|
@@ -286,18 +303,6 @@ export class DASTScanner {
|
|
|
286
303
|
references: ['https://owasp.org/www-project-web-security-testing-guide/'],
|
|
287
304
|
};
|
|
288
305
|
}
|
|
289
|
-
createAuthFailedVuln(targetUrl, status) {
|
|
290
|
-
return {
|
|
291
|
-
id: uuidv4(),
|
|
292
|
-
title: 'Authentication Failed',
|
|
293
|
-
description: `Authentication returned ${status} status`,
|
|
294
|
-
severity: 'informational',
|
|
295
|
-
category: 'broken-auth',
|
|
296
|
-
location: { file: targetUrl },
|
|
297
|
-
remediation: { description: 'Verify credentials are correct', estimatedEffort: 'trivial', automatable: false },
|
|
298
|
-
references: [],
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
306
|
createTokenInUrlVuln(targetUrl, search) {
|
|
302
307
|
return {
|
|
303
308
|
id: uuidv4(),
|
|
@@ -122,7 +122,10 @@ export class SecurityScannerService {
|
|
|
122
122
|
if (dastScan.success) {
|
|
123
123
|
dastResult = dastScan.value;
|
|
124
124
|
}
|
|
125
|
-
|
|
125
|
+
else {
|
|
126
|
+
// A requested phase that did not execute cannot become a full scan.
|
|
127
|
+
return err(dastScan.error);
|
|
128
|
+
}
|
|
126
129
|
}
|
|
127
130
|
// Combine summaries
|
|
128
131
|
const combinedSummary = this.combineSummaries(sastResult.value.summary, dastResult?.summary);
|
|
@@ -123,6 +123,11 @@ export declare class TestExecutionCoordinator extends BaseDomainCoordinator<Test
|
|
|
123
123
|
* Auto-detects framework and uses sensible defaults
|
|
124
124
|
*/
|
|
125
125
|
runTests(request: SimpleTestRequest): Promise<Result<TestRunResult, Error>>;
|
|
126
|
+
/**
|
|
127
|
+
* Retry a run's failed tests when retries were requested, and attach what
|
|
128
|
+
* the retries did to the run (#1130). The run's own counts are unchanged.
|
|
129
|
+
*/
|
|
130
|
+
private retryFailures;
|
|
126
131
|
/**
|
|
127
132
|
* Detect test framework from file patterns and project configuration
|
|
128
133
|
*/
|
|
@@ -146,16 +146,8 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
146
146
|
workers,
|
|
147
147
|
timeout,
|
|
148
148
|
});
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
const failedTestIds = result.value.failedTests.map(t => t.testId);
|
|
152
|
-
await this.retry({
|
|
153
|
-
runId: result.value.runId,
|
|
154
|
-
failedTests: failedTestIds,
|
|
155
|
-
maxRetries: request.retryCount,
|
|
156
|
-
backoff: 'exponential',
|
|
157
|
-
});
|
|
158
|
-
}
|
|
149
|
+
if (result.success)
|
|
150
|
+
await this.retryFailures(result.value, request.retryCount);
|
|
159
151
|
return result;
|
|
160
152
|
}
|
|
161
153
|
// Sequential execution
|
|
@@ -164,18 +156,41 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
164
156
|
framework,
|
|
165
157
|
timeout,
|
|
166
158
|
});
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
const failedTestIds = result.value.failedTests.map(t => t.testId);
|
|
170
|
-
await this.retry({
|
|
171
|
-
runId: result.value.runId,
|
|
172
|
-
failedTests: failedTestIds,
|
|
173
|
-
maxRetries: request.retryCount,
|
|
174
|
-
backoff: 'exponential',
|
|
175
|
-
});
|
|
176
|
-
}
|
|
159
|
+
if (result.success)
|
|
160
|
+
await this.retryFailures(result.value, request.retryCount);
|
|
177
161
|
return result;
|
|
178
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* Retry a run's failed tests when retries were requested, and attach what
|
|
165
|
+
* the retries did to the run (#1130). The run's own counts are unchanged.
|
|
166
|
+
*/
|
|
167
|
+
async retryFailures(run, retryCount) {
|
|
168
|
+
if (!retryCount || retryCount <= 0)
|
|
169
|
+
return;
|
|
170
|
+
if (run.failed === 0) {
|
|
171
|
+
run.retries = { totalRetries: 0, nowPassing: 0, stillFailing: 0, tests: [] };
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const retried = await this.retry({
|
|
175
|
+
runId: run.runId,
|
|
176
|
+
failedTests: run.failedTests.map(t => t.testId),
|
|
177
|
+
maxRetries: retryCount,
|
|
178
|
+
backoff: 'exponential',
|
|
179
|
+
});
|
|
180
|
+
if (!retried.success)
|
|
181
|
+
return;
|
|
182
|
+
const byId = new Map(run.failedTests.map(t => [t.testId, t]));
|
|
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
|
+
};
|
|
193
|
+
}
|
|
179
194
|
/**
|
|
180
195
|
* Detect test framework from file patterns and project configuration
|
|
181
196
|
*/
|
|
@@ -78,6 +78,22 @@ export interface ITestRunResult {
|
|
|
78
78
|
coverage?: ICoverageData;
|
|
79
79
|
/** Per-file coverage data for granular quality assessment */
|
|
80
80
|
fileCoverages?: IFileCoverageData[];
|
|
81
|
+
/** #1130: what the requested retries of failed tests did. Absent when none were requested. */
|
|
82
|
+
retries?: IRunRetrySummary;
|
|
83
|
+
}
|
|
84
|
+
/** #1130: the measured outcome of a run's retries, per failed test. */
|
|
85
|
+
export interface IRunRetrySummary {
|
|
86
|
+
/** Reruns that executed a test (an unmatched retry runs nothing and is not counted). */
|
|
87
|
+
totalRetries: number;
|
|
88
|
+
nowPassing: number;
|
|
89
|
+
stillFailing: number;
|
|
90
|
+
tests: Array<{
|
|
91
|
+
name: string;
|
|
92
|
+
file: string;
|
|
93
|
+
attempts: number;
|
|
94
|
+
passed: boolean;
|
|
95
|
+
unmatched?: boolean;
|
|
96
|
+
}>;
|
|
81
97
|
}
|
|
82
98
|
/** One test case taken verbatim from a runner report (#1110). */
|
|
83
99
|
export interface ITestCaseResult {
|
|
@@ -144,6 +160,15 @@ export interface IRetryResult {
|
|
|
144
160
|
nowPassing: number;
|
|
145
161
|
stillFailing: number;
|
|
146
162
|
flakyDetected: string[];
|
|
163
|
+
/** Failed tests whose retry filter selected no test, so none was rerun (#1141). */
|
|
164
|
+
unmatched?: string[];
|
|
165
|
+
/** #1130: the outcome per retried test. */
|
|
166
|
+
tests?: Array<{
|
|
167
|
+
testId: string;
|
|
168
|
+
attempts: number;
|
|
169
|
+
passed: boolean;
|
|
170
|
+
unmatched?: boolean;
|
|
171
|
+
}>;
|
|
147
172
|
}
|
|
148
173
|
export interface IExecutionStats {
|
|
149
174
|
runId: string;
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { err } from '../../shared/types/index.js';
|
|
6
6
|
import { BaseDomainPlugin } from '../domain-interface.js';
|
|
7
|
+
import { requirePayloadFiles } from '../../shared/io/payload-path-guard.js';
|
|
7
8
|
import { createTestExecutionCoordinator } from './coordinator.js';
|
|
8
9
|
import { getGlobalInfraHealing } from '../../strange-loop/infra-healing/global-instance.js';
|
|
9
10
|
import { isMeasuredGapPayload } from '../../shared/events/domain-events.js';
|
|
@@ -60,11 +61,22 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
|
|
|
60
61
|
if (!this.coordinator) {
|
|
61
62
|
return err(new Error('Coordinator not initialized'));
|
|
62
63
|
}
|
|
64
|
+
// #1126: a runner executes the files it is given, so only files and
|
|
65
|
+
// directories (#909 Jest targets) inside the project, passed on as the
|
|
66
|
+
// real paths that were checked. A missing one is still reported by the
|
|
67
|
+
// runner.
|
|
68
|
+
let testFiles;
|
|
69
|
+
if (payload.testFiles !== undefined) {
|
|
70
|
+
const confined = await requirePayloadFiles('execute-tests', 'testFiles', payload.testFiles, { allowMissing: true, allowDirectory: true });
|
|
71
|
+
if (!confined.success)
|
|
72
|
+
return confined;
|
|
73
|
+
testFiles = confined.value;
|
|
74
|
+
}
|
|
63
75
|
// Support both simple and full request formats
|
|
64
|
-
if (
|
|
76
|
+
if (testFiles) {
|
|
65
77
|
// Simple request format
|
|
66
78
|
const request = {
|
|
67
|
-
testFiles
|
|
79
|
+
testFiles,
|
|
68
80
|
parallel: payload.parallel,
|
|
69
81
|
retryCount: payload.retryCount,
|
|
70
82
|
timeout: payload.timeout,
|
|
@@ -75,7 +87,7 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
|
|
|
75
87
|
else if (payload.framework) {
|
|
76
88
|
// Full request format
|
|
77
89
|
const request = {
|
|
78
|
-
testFiles:
|
|
90
|
+
testFiles: [],
|
|
79
91
|
framework: payload.framework,
|
|
80
92
|
timeout: payload.timeout,
|
|
81
93
|
env: payload.env,
|
|
@@ -96,8 +108,11 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
|
|
|
96
108
|
if (!testFiles) {
|
|
97
109
|
return err(new Error('Invalid detect-flaky payload: missing testFiles'));
|
|
98
110
|
}
|
|
111
|
+
const confined = await requirePayloadFiles('detect-flaky', 'testFiles', testFiles, { allowMissing: true, allowDirectory: true });
|
|
112
|
+
if (!confined.success)
|
|
113
|
+
return confined;
|
|
99
114
|
return this.coordinator.detectFlaky({
|
|
100
|
-
testFiles,
|
|
115
|
+
testFiles: confined.value,
|
|
101
116
|
runs: runs ?? 5,
|
|
102
117
|
threshold: threshold ?? 0.1,
|
|
103
118
|
});
|
|
@@ -15,6 +15,7 @@ import { getTestRunnerExecutionError } from '../../../shared/test-runner-verdict
|
|
|
15
15
|
import { createVitestJsonReport, needsVitestJsonReportFile } from '../../../shared/vitest-json-report.js';
|
|
16
16
|
import { isJestCommand, jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
17
17
|
import { secureRandom } from '../../../shared/utils/crypto-random.js';
|
|
18
|
+
import { redactFailureText } from './runner-test-cases.js';
|
|
18
19
|
const DEFAULT_FLAKY_CONFIG = {
|
|
19
20
|
simulateForTesting: false,
|
|
20
21
|
simulatedFlakinessRate: RETRY_CONSTANTS.DEFAULT_FLAKY_RATE,
|
|
@@ -132,7 +133,8 @@ export class FlakyDetectorService {
|
|
|
132
133
|
async recordExecution(testId, result) {
|
|
133
134
|
// Add to in-memory history
|
|
134
135
|
const history = this.testHistory.get(testId) ?? [];
|
|
135
|
-
history.
|
|
136
|
+
// #1122: test-history is persisted, so failure text is stored redacted.
|
|
137
|
+
history.push(result.error ? { ...result, error: redactFailureText(result.error) } : result);
|
|
136
138
|
// Keep only last 100 executions
|
|
137
139
|
if (history.length > 100) {
|
|
138
140
|
history.shift();
|
|
@@ -336,7 +338,7 @@ export class FlakyDetectorService {
|
|
|
336
338
|
runId,
|
|
337
339
|
passed: code === 0,
|
|
338
340
|
duration,
|
|
339
|
-
error: code !== 0 ? stderr || `Exit code: ${code}` : undefined,
|
|
341
|
+
error: code !== 0 ? redactFailureText(stderr || `Exit code: ${code}`) : undefined,
|
|
340
342
|
timestamp: new Date(),
|
|
341
343
|
context: {
|
|
342
344
|
parallelRuns: 1,
|
|
@@ -365,7 +367,7 @@ export class FlakyDetectorService {
|
|
|
365
367
|
passed: code === 0,
|
|
366
368
|
duration,
|
|
367
369
|
error: code !== 0
|
|
368
|
-
? stderr || `Exit code: ${code}, Parse error: ${parseError}`
|
|
370
|
+
? redactFailureText(stderr || `Exit code: ${code}, Parse error: ${parseError}`)
|
|
369
371
|
: undefined,
|
|
370
372
|
timestamp: new Date(),
|
|
371
373
|
context: {
|
|
@@ -479,8 +481,8 @@ export class FlakyDetectorService {
|
|
|
479
481
|
runId,
|
|
480
482
|
passed: test.status === 'passed',
|
|
481
483
|
duration: test.duration || 0,
|
|
482
|
-
error: test.status === 'failed'
|
|
483
|
-
? test.failureMessages
|
|
484
|
+
error: test.status === 'failed' && test.failureMessages
|
|
485
|
+
? redactFailureText(test.failureMessages.join('\n'))
|
|
484
486
|
: undefined,
|
|
485
487
|
timestamp: new Date(),
|
|
486
488
|
context: {
|
|
@@ -505,8 +507,8 @@ export class FlakyDetectorService {
|
|
|
505
507
|
runId,
|
|
506
508
|
passed: assertion.status === 'passed',
|
|
507
509
|
duration: assertion.duration || 0,
|
|
508
|
-
error: assertion.status === 'failed'
|
|
509
|
-
? assertion.failureMessages
|
|
510
|
+
error: assertion.status === 'failed' && assertion.failureMessages
|
|
511
|
+
? redactFailureText(assertion.failureMessages.join('\n'))
|
|
510
512
|
: undefined,
|
|
511
513
|
timestamp: new Date(),
|
|
512
514
|
context: {
|
|
@@ -14,6 +14,7 @@ import { toError } from '../../../shared/error-utils.js';
|
|
|
14
14
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
15
15
|
import { secureRandom } from '../../../shared/utils/crypto-random.js';
|
|
16
16
|
import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
|
|
17
|
+
import { redactFailureText } from './runner-test-cases.js';
|
|
17
18
|
/**
|
|
18
19
|
* Whether a runner-reported test file and the requested target are the same
|
|
19
20
|
* file. Runners report real paths, so a target given through a symlink must be
|
|
@@ -104,6 +105,8 @@ export class RetryHandlerService {
|
|
|
104
105
|
const nowPassing = [];
|
|
105
106
|
const stillFailing = [];
|
|
106
107
|
const flakyDetected = [];
|
|
108
|
+
const unmatched = [];
|
|
109
|
+
const tests = [];
|
|
107
110
|
for (const test of failedTests) {
|
|
108
111
|
const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry);
|
|
109
112
|
stats.totalRetries += result.attempts;
|
|
@@ -118,11 +121,18 @@ export class RetryHandlerService {
|
|
|
118
121
|
else {
|
|
119
122
|
stillFailing.push(test.testId);
|
|
120
123
|
stats.failed++;
|
|
124
|
+
if (result.unmatched)
|
|
125
|
+
unmatched.push(test.testId);
|
|
121
126
|
}
|
|
127
|
+
tests.push({
|
|
128
|
+
testId: test.testId, attempts: result.attempts, passed: result.passed,
|
|
129
|
+
...(result.unmatched ? { unmatched: true } : {}),
|
|
130
|
+
});
|
|
122
131
|
// Record retry history
|
|
123
132
|
await this.recordRetry(test.testId, result);
|
|
124
133
|
}
|
|
125
134
|
stats.flakyDetected = flakyDetected;
|
|
135
|
+
stats.unmatched = unmatched;
|
|
126
136
|
stats.endTime = Date.now();
|
|
127
137
|
this.runStats.set(runId, stats);
|
|
128
138
|
// Persist stats
|
|
@@ -136,6 +146,8 @@ export class RetryHandlerService {
|
|
|
136
146
|
nowPassing: nowPassing.length,
|
|
137
147
|
stillFailing: stillFailing.length,
|
|
138
148
|
flakyDetected,
|
|
149
|
+
unmatched,
|
|
150
|
+
tests,
|
|
139
151
|
};
|
|
140
152
|
return ok(retryResult);
|
|
141
153
|
}
|
|
@@ -218,7 +230,8 @@ export class RetryHandlerService {
|
|
|
218
230
|
}
|
|
219
231
|
async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry) {
|
|
220
232
|
let attempts = 0;
|
|
221
|
-
|
|
233
|
+
// #1122: the final error is persisted in retry-history, so keep it redacted.
|
|
234
|
+
let lastError = redactFailureText(test.error);
|
|
222
235
|
while (attempts < maxRetries) {
|
|
223
236
|
// Check if should retry
|
|
224
237
|
const shouldRetry = await this.shouldRetry(test.testId, attempts, lastError);
|
|
@@ -232,9 +245,16 @@ export class RetryHandlerService {
|
|
|
232
245
|
if (onRetry) {
|
|
233
246
|
onRetry(test.testId, attempts + 1);
|
|
234
247
|
}
|
|
235
|
-
attempts++;
|
|
236
248
|
// Execute test (simulated - in real implementation, would run actual test)
|
|
237
249
|
const result = await this.executeTest(test);
|
|
250
|
+
// #1141: a filter that selected no test reran nothing. Report that
|
|
251
|
+
// instead of counting it as a retry, and stop: another attempt would
|
|
252
|
+
// select nothing again.
|
|
253
|
+
if (result.unmatched) {
|
|
254
|
+
logger.warn(`Retry of "${test.testName}" matched no test in ${test.file}; nothing was rerun.`);
|
|
255
|
+
return { testId: test.testId, passed: false, attempts, finalError: lastError, unmatched: true };
|
|
256
|
+
}
|
|
257
|
+
attempts++;
|
|
238
258
|
if (result.passed) {
|
|
239
259
|
return {
|
|
240
260
|
testId: test.testId,
|
|
@@ -243,7 +263,7 @@ export class RetryHandlerService {
|
|
|
243
263
|
finalError: undefined,
|
|
244
264
|
};
|
|
245
265
|
}
|
|
246
|
-
lastError = result.error
|
|
266
|
+
lastError = result.error !== undefined ? redactFailureText(result.error) : lastError;
|
|
247
267
|
}
|
|
248
268
|
return {
|
|
249
269
|
testId: test.testId,
|
|
@@ -477,9 +497,16 @@ export class RetryHandlerService {
|
|
|
477
497
|
const result = safeJsonParse(vitestMatch[0]);
|
|
478
498
|
// Vitest's positional file filter uses prefix matching. A passing
|
|
479
499
|
// sibling must not clear a failure in the requested file (#972).
|
|
480
|
-
const
|
|
481
|
-
&& sameTestFile(file.name, targetFile, this.config.cwd ?? process.cwd())
|
|
482
|
-
&& file.assertionResults?.some(assertion => assertion.status ===
|
|
500
|
+
const targetHas = (status) => result.testResults?.some((file) => typeof file.name === 'string'
|
|
501
|
+
&& (!targetFile || sameTestFile(file.name, targetFile, this.config.cwd ?? process.cwd()))
|
|
502
|
+
&& file.assertionResults?.some(assertion => assertion.status === status)) === true;
|
|
503
|
+
const targetPassed = !targetFile || targetHas('passed');
|
|
504
|
+
const nothingRan = targetFile
|
|
505
|
+
? Array.isArray(result.testResults) && !targetPassed && !targetHas('failed')
|
|
506
|
+
: result.numPassedTests === 0;
|
|
507
|
+
if (nothingRan && result.numFailedTests === 0 && result.numFailedTestSuites === 0) {
|
|
508
|
+
return UNMATCHED;
|
|
509
|
+
}
|
|
483
510
|
if (exitCode === 0 && result.success !== false
|
|
484
511
|
&& result.numFailedTests === 0 && result.numFailedTestSuites === 0
|
|
485
512
|
&& Number.isFinite(result.numPassedTests) && result.numPassedTests > 0
|
|
@@ -501,6 +528,10 @@ export class RetryHandlerService {
|
|
|
501
528
|
const jestMatch = stdout.match(/\{[\s\S]*"numFailedTests"[\s\S]*\}/);
|
|
502
529
|
if (jestMatch) {
|
|
503
530
|
const result = safeJsonParse(jestMatch[0]);
|
|
531
|
+
if (result.numPassedTests === 0 && result.numFailedTests === 0
|
|
532
|
+
&& result.numFailedTestSuites === 0) {
|
|
533
|
+
return UNMATCHED;
|
|
534
|
+
}
|
|
504
535
|
if (exitCode === 0 && result.success !== false
|
|
505
536
|
&& result.numFailedTests === 0 && result.numFailedTestSuites === 0
|
|
506
537
|
&& Number.isFinite(result.numPassedTests) && result.numPassedTests > 0) {
|
|
@@ -517,6 +548,8 @@ export class RetryHandlerService {
|
|
|
517
548
|
const mochaMatch = stdout.match(/\{[\s\S]*"stats"[\s\S]*"failures"[\s\S]*\}/);
|
|
518
549
|
if (mochaMatch) {
|
|
519
550
|
const result = safeJsonParse(mochaMatch[0]);
|
|
551
|
+
if (result.stats?.passes === 0 && result.stats?.failures === 0)
|
|
552
|
+
return UNMATCHED;
|
|
520
553
|
if (exitCode === 0 && result.stats?.failures === 0
|
|
521
554
|
&& Number.isFinite(result.stats?.passes) && result.stats.passes > 0) {
|
|
522
555
|
return { passed: true };
|
|
@@ -538,7 +571,7 @@ export class RetryHandlerService {
|
|
|
538
571
|
const errorOutput = stderr || stdout || `Test failed with exit code ${exitCode}`;
|
|
539
572
|
return {
|
|
540
573
|
passed: false,
|
|
541
|
-
error: errorOutput.substring(0, 1000), // Truncate long error messages
|
|
574
|
+
error: redactFailureText(errorOutput).substring(0, 1000), // Truncate long error messages
|
|
542
575
|
};
|
|
543
576
|
}
|
|
544
577
|
calculateDelay(attempt, backoff, baseDelay, maxDelay) {
|
|
@@ -573,6 +606,7 @@ export class RetryHandlerService {
|
|
|
573
606
|
attempts: result.attempts,
|
|
574
607
|
passed: result.passed,
|
|
575
608
|
error: result.finalError,
|
|
609
|
+
...(result.unmatched ? { unmatched: true } : {}),
|
|
576
610
|
timestamp: new Date(),
|
|
577
611
|
});
|
|
578
612
|
// Keep last 50 entries
|
|
@@ -616,4 +650,9 @@ export class RetryHandlerService {
|
|
|
616
650
|
};
|
|
617
651
|
}
|
|
618
652
|
}
|
|
653
|
+
const UNMATCHED = {
|
|
654
|
+
passed: false,
|
|
655
|
+
unmatched: true,
|
|
656
|
+
error: 'The retry filter matched no test, so nothing was rerun.',
|
|
657
|
+
};
|
|
619
658
|
//# sourceMappingURL=retry-handler.js.map
|
|
@@ -6,6 +6,17 @@
|
|
|
6
6
|
* derived from aggregate counts.
|
|
7
7
|
*/
|
|
8
8
|
import type { ITestCaseResult } from '../interfaces';
|
|
9
|
+
/**
|
|
10
|
+
* #1122: failure text goes back over MCP and into saved results, so
|
|
11
|
+
* credential-shaped values (e.g. a connection string) are redacted first.
|
|
12
|
+
* The text is not shortened here; callers apply their own caps.
|
|
13
|
+
*/
|
|
14
|
+
export declare function redactFailureText(text: string): string;
|
|
15
|
+
/** Failed tests with `error` and `stack` redacted (#1122). */
|
|
16
|
+
export declare function redactFailedTests<T extends {
|
|
17
|
+
error: string;
|
|
18
|
+
stack?: string;
|
|
19
|
+
}>(tests: T[]): T[];
|
|
9
20
|
/**
|
|
10
21
|
* Test cases listed in a runner JSON report, or undefined when the report
|
|
11
22
|
* has no per-test entries.
|
|
@@ -5,19 +5,37 @@
|
|
|
5
5
|
* test case with the runner's own name, status and duration; nothing is
|
|
6
6
|
* derived from aggregate counts.
|
|
7
7
|
*/
|
|
8
|
+
import { redactLogText } from '../../../logging/redaction.js';
|
|
8
9
|
const SKIPPED_STATUSES = new Set(['skipped', 'pending', 'todo']);
|
|
9
10
|
/** Upper bound on a reported failure message, so one stack cannot swamp the output. */
|
|
10
11
|
const MAX_FAILURE_MESSAGE_LENGTH = 4000;
|
|
11
12
|
function failureMessageOf(assertion) {
|
|
12
13
|
if (!Array.isArray(assertion.failureMessages))
|
|
13
14
|
return undefined;
|
|
14
|
-
const
|
|
15
|
-
if (!
|
|
15
|
+
const joined = assertion.failureMessages.filter((m) => typeof m === 'string').join('\n').trim();
|
|
16
|
+
if (!joined)
|
|
16
17
|
return undefined;
|
|
18
|
+
const message = redactFailureText(joined);
|
|
17
19
|
return message.length > MAX_FAILURE_MESSAGE_LENGTH
|
|
18
20
|
? `${message.slice(0, MAX_FAILURE_MESSAGE_LENGTH)}… [truncated]`
|
|
19
21
|
: message;
|
|
20
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* #1122: failure text goes back over MCP and into saved results, so
|
|
25
|
+
* credential-shaped values (e.g. a connection string) are redacted first.
|
|
26
|
+
* The text is not shortened here; callers apply their own caps.
|
|
27
|
+
*/
|
|
28
|
+
export function redactFailureText(text) {
|
|
29
|
+
return redactLogText(text, Number.POSITIVE_INFINITY);
|
|
30
|
+
}
|
|
31
|
+
/** Failed tests with `error` and `stack` redacted (#1122). */
|
|
32
|
+
export function redactFailedTests(tests) {
|
|
33
|
+
return tests.map(test => ({
|
|
34
|
+
...test,
|
|
35
|
+
error: redactFailureText(test.error),
|
|
36
|
+
...(typeof test.stack === 'string' ? { stack: redactFailureText(test.stack) } : {}),
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
21
39
|
function toStatus(status) {
|
|
22
40
|
if (status === 'passed' || status === 'failed')
|
|
23
41
|
return status;
|
|
@@ -17,8 +17,8 @@ import { secureRandom, secureRandomInt } from '../../../shared/utils/crypto-rand
|
|
|
17
17
|
import { writeTestRunEvidence } from '../../quality-assessment/quality-evidence.js';
|
|
18
18
|
import { istanbulLineHits } from '../../../coordination/handlers/handler-utils.js';
|
|
19
19
|
import { fileCoverageKey } from '../../coverage-analysis/collected-metrics.js';
|
|
20
|
-
import { mergeTestCases, testCasesFromRunnerReport } from './runner-test-cases.js';
|
|
21
|
-
import { getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
20
|
+
import { mergeTestCases, redactFailedTests, redactFailureText, testCasesFromRunnerReport } from './runner-test-cases.js';
|
|
21
|
+
import { capDiagnostics, getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
22
22
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
23
23
|
import { jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
24
24
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
@@ -76,7 +76,7 @@ export class TestExecutorService {
|
|
|
76
76
|
failed: results.failed,
|
|
77
77
|
skipped: results.skipped,
|
|
78
78
|
duration,
|
|
79
|
-
failedTests: results.failedTests,
|
|
79
|
+
failedTests: redactFailedTests(results.failedTests),
|
|
80
80
|
...(results.testCases ? { testCases: results.testCases } : {}),
|
|
81
81
|
coverage: results.coverage,
|
|
82
82
|
fileCoverages: results.fileCoverages,
|
|
@@ -132,7 +132,7 @@ export class TestExecutorService {
|
|
|
132
132
|
failed: aggregated.failed,
|
|
133
133
|
skipped: aggregated.skipped,
|
|
134
134
|
duration,
|
|
135
|
-
failedTests: aggregated.failedTests,
|
|
135
|
+
failedTests: redactFailedTests(aggregated.failedTests),
|
|
136
136
|
...(aggregated.testCases ? { testCases: aggregated.testCases } : {}),
|
|
137
137
|
coverage: aggregated.coverage,
|
|
138
138
|
fileCoverages: aggregated.fileCoverages,
|
|
@@ -260,7 +260,7 @@ export class TestExecutorService {
|
|
|
260
260
|
if (!this.isLLMAnalysisAvailable() || failures.length === 0)
|
|
261
261
|
return null;
|
|
262
262
|
try {
|
|
263
|
-
const failureSummary = failures.slice(0, 5).map(f => `- ${f.testName}: ${f.error
|
|
263
|
+
const failureSummary = failures.slice(0, 5).map(f => `- ${f.testName}: ${f.error ? redactFailureText(f.error).substring(0, 200) : 'Unknown error'}`).join('\n');
|
|
264
264
|
const response = await this.llmRouter.chat({
|
|
265
265
|
model: this.getModelForTier(this.config.llmModelTier),
|
|
266
266
|
messages: [{
|
|
@@ -624,7 +624,7 @@ Provide:
|
|
|
624
624
|
}
|
|
625
625
|
catch (error) {
|
|
626
626
|
return err(new Error(`Failed to parse test output for ${file}: ${toErrorMessage(error)}\n` +
|
|
627
|
-
`stdout: ${stdout
|
|
627
|
+
`stdout: ${capDiagnostics(stdout, 500)}\nstderr: ${capDiagnostics(stderr, 500)}`));
|
|
628
628
|
}
|
|
629
629
|
}
|
|
630
630
|
/**
|
|
@@ -880,7 +880,7 @@ Provide:
|
|
|
880
880
|
];
|
|
881
881
|
for (const indicator of errorMessages) {
|
|
882
882
|
if (combinedOutput.includes(indicator)) {
|
|
883
|
-
return err(new Error(`Test execution failed for ${file} (exit code ${exitCode}):\n${combinedOutput
|
|
883
|
+
return err(new Error(`Test execution failed for ${file} (exit code ${exitCode}):\n${capDiagnostics(combinedOutput, 1000)}`));
|
|
884
884
|
}
|
|
885
885
|
}
|
|
886
886
|
}
|
|
@@ -894,7 +894,7 @@ Provide:
|
|
|
894
894
|
}
|
|
895
895
|
// Could not parse output - return error with details
|
|
896
896
|
return err(new Error(`Unable to parse test results for ${file}. Exit code: ${exitCode}\n` +
|
|
897
|
-
`Output: ${combinedOutput
|
|
897
|
+
`Output: ${capDiagnostics(combinedOutput, 500)}`));
|
|
898
898
|
}
|
|
899
899
|
/**
|
|
900
900
|
* Create generic failure entries when we know tests failed but can't parse details
|