agentic-qe 3.10.4 → 3.10.5
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/qcsd-development-swarm/SKILL.md +27 -6
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +71 -0
- package/dist/arena/arena.d.ts +68 -0
- package/dist/arena/arena.js +169 -0
- package/dist/arena/mutator.d.ts +23 -0
- package/dist/arena/mutator.js +112 -0
- package/dist/arena/rng.d.ts +15 -0
- package/dist/arena/rng.js +34 -0
- package/dist/arena/runner.d.ts +44 -0
- package/dist/arena/runner.js +79 -0
- package/dist/cli/bundle.js +7 -7
- package/dist/cli/chunks/adapter-XZVL3DHO.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-EJPDSWON.js → agent-booster-wasm-3BC5LIEB.js} +2 -2
- package/dist/cli/chunks/{agent-handler-2DZB7LGI.js → agent-handler-QLXWVZZF.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-SSFYAVIK.js → agent-memory-branch-3U5PDYW7.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-YIL25K6W.js +2 -0
- package/dist/cli/chunks/arena-BMJQK4RD.js +18 -0
- package/dist/cli/chunks/arena-XENAGV4I.js +4 -0
- package/dist/cli/chunks/{audit-42XG5JFB.js → audit-WPIRUJNZ.js} +2 -2
- package/dist/cli/chunks/base-YCYV23Q3.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-3TZFES5I.js → better-sqlite3-6AGIBSVE.js} +2 -2
- package/dist/cli/chunks/{brain-handler-LFHX2TYP.js → brain-handler-PHSWG5PR.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-AX7DKGV7.js → branch-enumerator-LNSYT34I.js} +2 -2
- package/dist/cli/chunks/{browser-4NYLZ7FA.js → browser-M5BVQMBI.js} +2 -2
- package/dist/cli/chunks/browser-workflow-ALCOCRA2.js +2 -0
- package/dist/cli/chunks/{chunk-Q53M4LI7.js → chunk-24A7KD3D.js} +1 -1
- package/dist/cli/chunks/{chunk-HTLAPMTK.js → chunk-253TDTPH.js} +1 -1
- package/dist/cli/chunks/{chunk-EGTOSQZK.js → chunk-2RLRPKCG.js} +2 -2
- package/dist/cli/chunks/{chunk-2G2PVVQG.js → chunk-2UQWVF4P.js} +2 -2
- package/dist/cli/chunks/{chunk-KGPAWNNR.js → chunk-2Z7HIT5I.js} +1 -1
- package/dist/cli/chunks/{chunk-KJ56OXH4.js → chunk-3BGGNHHZ.js} +1 -1
- package/dist/cli/chunks/{chunk-VJ2D6FST.js → chunk-3JWV4GE6.js} +2 -2
- package/dist/cli/chunks/{chunk-XBFEHVBO.js → chunk-3KGUP2SD.js} +2 -2
- package/dist/cli/chunks/{chunk-JRBGHWAM.js → chunk-3WOQY6UL.js} +2 -2
- package/dist/cli/chunks/{chunk-V5G3SMAJ.js → chunk-4FTO3TPH.js} +2 -2
- package/dist/cli/chunks/{chunk-L6VNEEN6.js → chunk-4K7T6AKM.js} +1 -1
- package/dist/cli/chunks/{chunk-WIYWDON4.js → chunk-4Z7XH4JE.js} +2 -2
- package/dist/cli/chunks/{chunk-ISRTT4I7.js → chunk-54IPDQIZ.js} +8 -8
- package/dist/cli/chunks/{chunk-IYFMDIYZ.js → chunk-56RA6YPN.js} +2 -2
- package/dist/cli/chunks/{chunk-M4ARHDY4.js → chunk-5D7GLMT3.js} +1 -1
- package/dist/cli/chunks/{chunk-6SCIX2W2.js → chunk-66LOFIBP.js} +2 -2
- package/dist/cli/chunks/{chunk-K7K4TFJM.js → chunk-6SAU7GXO.js} +1 -1
- package/dist/cli/chunks/{chunk-KUFC4DBX.js → chunk-75MP7JMV.js} +1 -1
- package/dist/cli/chunks/{chunk-PISW5HUX.js → chunk-7DU35D4M.js} +1 -1
- package/dist/cli/chunks/{chunk-MIQBRVK2.js → chunk-7JZCEQFR.js} +1 -1
- package/dist/cli/chunks/{chunk-XVA56PXZ.js → chunk-A3BDPU5F.js} +4 -4
- package/dist/cli/chunks/{chunk-DAIM72HV.js → chunk-A7HGS7FW.js} +2 -2
- package/dist/cli/chunks/{chunk-EWI37TJA.js → chunk-AMBIOEMO.js} +1 -1
- package/dist/cli/chunks/{chunk-IPAQ4HVX.js → chunk-AVQD7KEN.js} +2 -2
- package/dist/cli/chunks/{chunk-FDFJJFQT.js → chunk-AZCKTAUI.js} +2 -2
- package/dist/cli/chunks/{chunk-JYR3X4OC.js → chunk-B4F5EPNR.js} +1 -1
- package/dist/cli/chunks/{chunk-LYKSIOOT.js → chunk-BB7MEGXD.js} +2 -2
- package/dist/cli/chunks/{chunk-N4CXUGXE.js → chunk-BSRCL6RU.js} +2 -2
- package/dist/cli/chunks/{chunk-IAK76TIZ.js → chunk-CS3UB2OL.js} +1 -1
- package/dist/cli/chunks/{chunk-RUC3FCRK.js → chunk-CTG3GJIM.js} +2 -2
- package/dist/cli/chunks/{chunk-AMW27FSS.js → chunk-CUAM34RQ.js} +3 -3
- package/dist/cli/chunks/{chunk-M2PSXKTG.js → chunk-CUY2EUSQ.js} +2 -2
- package/dist/cli/chunks/{chunk-3UGUX34A.js → chunk-D3Q4443B.js} +1 -1
- package/dist/cli/chunks/{chunk-NJYI7HX7.js → chunk-D4WDJ4ZF.js} +2 -2
- package/dist/cli/chunks/{chunk-U27GVYXA.js → chunk-D7NKRCIL.js} +2 -2
- package/dist/cli/chunks/{chunk-7BQXEYRV.js → chunk-DBR4TQPK.js} +2 -2
- package/dist/cli/chunks/{chunk-USB7GCIC.js → chunk-DIJ74M7V.js} +1 -1
- package/dist/cli/chunks/{chunk-XJXCSCCP.js → chunk-DJQYZ4RZ.js} +1 -1
- package/dist/cli/chunks/{chunk-VJOPNK2L.js → chunk-DN65ILSI.js} +2 -2
- package/dist/cli/chunks/{chunk-Y2EDDV5U.js → chunk-DWLGFYXV.js} +2 -2
- package/dist/cli/chunks/{chunk-OKKTDHHF.js → chunk-EIL7FQC4.js} +4 -4
- package/dist/cli/chunks/{chunk-GDMH7NPV.js → chunk-FE3FGMNB.js} +2 -2
- package/dist/cli/chunks/{chunk-SXMGNMFL.js → chunk-FLYFNNSN.js} +3 -3
- package/dist/cli/chunks/{chunk-N244P4MM.js → chunk-FNJZBIR3.js} +2 -2
- package/dist/cli/chunks/{chunk-PZCSJZVJ.js → chunk-FPWA73N6.js} +2 -2
- package/dist/cli/chunks/{chunk-MQ5WMWUK.js → chunk-FW3C4LWU.js} +2 -2
- package/dist/cli/chunks/{chunk-YSLE6NNG.js → chunk-G4GX6YKX.js} +2 -2
- package/dist/cli/chunks/{chunk-F34OO2Q7.js → chunk-G5UIGH4C.js} +3 -3
- package/dist/cli/chunks/{chunk-UXJVR323.js → chunk-G6FP3S3G.js} +2 -2
- package/dist/cli/chunks/{chunk-SZKFT6CD.js → chunk-GDUGW6FZ.js} +2 -2
- package/dist/cli/chunks/{chunk-ZM4QGYGK.js → chunk-GKG6IQP6.js} +3 -3
- package/dist/cli/chunks/{chunk-F77X5DAF.js → chunk-GMU7P5O3.js} +2 -2
- package/dist/cli/chunks/{chunk-EMZ3DXMG.js → chunk-GTVXVYKE.js} +2 -2
- package/dist/cli/chunks/{chunk-KCXE2LZU.js → chunk-HHEHGERJ.js} +2 -2
- package/dist/cli/chunks/{chunk-GILL32E2.js → chunk-HKJ3LG3N.js} +2 -2
- package/dist/cli/chunks/{chunk-E6CGBOZY.js → chunk-HNYSBE5J.js} +2 -2
- package/dist/cli/chunks/{chunk-UWAUYDW4.js → chunk-HPKYIK7R.js} +2 -2
- package/dist/cli/chunks/{chunk-3ISX5B77.js → chunk-HRORJ352.js} +2 -2
- package/dist/cli/chunks/{chunk-PLD4IGDL.js → chunk-IIFCTJOF.js} +2 -2
- package/dist/cli/chunks/{chunk-C2446H7G.js → chunk-IOE6LDPF.js} +2 -2
- package/dist/cli/chunks/{chunk-UFKVKNAA.js → chunk-IRS4HKAR.js} +1 -1
- package/dist/cli/chunks/{chunk-4BX72XG4.js → chunk-IT7CEHAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-GLMDRGJD.js → chunk-IUKERFLT.js} +1 -1
- package/dist/cli/chunks/{chunk-LKK3NIHC.js → chunk-IVKSZNMI.js} +1 -1
- package/dist/cli/chunks/{chunk-WI5WXYIS.js → chunk-IWRORKD7.js} +2 -2
- package/dist/cli/chunks/{chunk-5T2HDET6.js → chunk-J533CJUN.js} +3 -3
- package/dist/cli/chunks/{chunk-OO7KJ34Y.js → chunk-JPOEI7CJ.js} +2 -2
- package/dist/cli/chunks/{chunk-B6CT4ILU.js → chunk-JY7T2AQQ.js} +4 -4
- package/dist/cli/chunks/{chunk-TBJ566KV.js → chunk-K5KKZWED.js} +2 -2
- package/dist/cli/chunks/{chunk-RJKYPWFD.js → chunk-KIMJPTHD.js} +2 -2
- package/dist/cli/chunks/{chunk-MHWYQHGN.js → chunk-MEN3UW7W.js} +1 -1
- package/dist/cli/chunks/{chunk-KWZEBHAP.js → chunk-MFQIJ3HV.js} +2 -2
- package/dist/cli/chunks/{chunk-MDWJXSBA.js → chunk-MGCW5FWH.js} +2 -2
- package/dist/cli/chunks/{chunk-TWAWEP4X.js → chunk-MIMJVKJJ.js} +3 -3
- package/dist/cli/chunks/{chunk-N3MM4Z33.js → chunk-MJRYHHOG.js} +2 -2
- package/dist/cli/chunks/{chunk-K7CW2X6U.js → chunk-MRXKIXVV.js} +2 -2
- package/dist/cli/chunks/{chunk-XDZXLEJK.js → chunk-MWPFUBXS.js} +2 -2
- package/dist/cli/chunks/{chunk-ND6YSW5N.js → chunk-N2TJXGHG.js} +1 -1
- package/dist/cli/chunks/{chunk-6WF2MOQB.js → chunk-NGSA53GC.js} +2 -2
- package/dist/cli/chunks/{chunk-AIBE3J4A.js → chunk-NKW7VOZV.js} +1 -1
- package/dist/cli/chunks/{chunk-D7IWGQTW.js → chunk-O5OOUMBB.js} +2 -2
- package/dist/cli/chunks/{chunk-O3SG32PS.js → chunk-OATHXZYW.js} +1 -1
- package/dist/cli/chunks/{chunk-QPMAXDJ2.js → chunk-OJNG6ZXG.js} +2 -2
- package/dist/cli/chunks/{chunk-LHPR7ROV.js → chunk-PGNQR2VM.js} +1 -1
- package/dist/cli/chunks/{chunk-M3MKP5VN.js → chunk-PPM5D7LH.js} +1 -1
- package/dist/cli/chunks/{chunk-MKZQBBCU.js → chunk-PYBVFG6T.js} +2 -2
- package/dist/cli/chunks/{chunk-BEFRQOLH.js → chunk-Q6BKJZTG.js} +2 -2
- package/dist/cli/chunks/chunk-QAW6RVAR.js +699 -0
- package/dist/cli/chunks/{chunk-MQIAN57O.js → chunk-QTDZS4U6.js} +2 -2
- package/dist/cli/chunks/{chunk-NZGLDOU4.js → chunk-R573V37S.js} +2 -2
- package/dist/cli/chunks/{chunk-OV4BLIKJ.js → chunk-RCAIOTIF.js} +2 -2
- package/dist/cli/chunks/{chunk-TCV5DASI.js → chunk-RFNEEDPQ.js} +2 -2
- package/dist/cli/chunks/{chunk-M5DBKHM4.js → chunk-RFVZMNYX.js} +2 -2
- package/dist/cli/chunks/{chunk-MWV4KPOB.js → chunk-RLU7764Y.js} +2 -2
- package/dist/cli/chunks/chunk-RLZDXQNM.js +2 -0
- package/dist/cli/chunks/{chunk-6OLHPWSN.js → chunk-RONMVGCT.js} +2 -2
- package/dist/cli/chunks/{chunk-STMMZXS6.js → chunk-RR55MLD4.js} +1 -1
- package/dist/cli/chunks/{chunk-VDKMBOUK.js → chunk-RUQV3BTV.js} +1 -1
- package/dist/cli/chunks/{chunk-OIFJH7TF.js → chunk-RZ7D5SHS.js} +1 -1
- package/dist/cli/chunks/{chunk-2B6ETC7C.js → chunk-S73KENCH.js} +2 -2
- package/dist/cli/chunks/{chunk-4FTLYIMW.js → chunk-S7FGTHFE.js} +2 -2
- package/dist/cli/chunks/{chunk-SVILIQQQ.js → chunk-S7HQOGVD.js} +1 -1
- package/dist/cli/chunks/{chunk-Z4BTPQLG.js → chunk-SK6YRNXI.js} +2 -2
- package/dist/cli/chunks/{chunk-GS33ZRJH.js → chunk-SXQIH2QA.js} +2 -2
- package/dist/cli/chunks/{chunk-MU4P4P4E.js → chunk-TISBFSDJ.js} +1 -1
- package/dist/cli/chunks/{chunk-5Q3L4QEE.js → chunk-TMD6IC6D.js} +2 -2
- package/dist/cli/chunks/{chunk-LOFA3U4X.js → chunk-TMTLWSSA.js} +1 -1
- package/dist/cli/chunks/{chunk-UW3ZSFFB.js → chunk-UOIT5JZ6.js} +2 -2
- package/dist/cli/chunks/{chunk-FQ7I4JBQ.js → chunk-UTORITJT.js} +2 -2
- package/dist/cli/chunks/{chunk-AZJYDM2K.js → chunk-VB7DZVCI.js} +1 -1
- package/dist/cli/chunks/{chunk-VRE2EBFI.js → chunk-VC256KH2.js} +2 -2
- package/dist/cli/chunks/{chunk-WYMQ6FZR.js → chunk-VESYE5YO.js} +3 -3
- package/dist/cli/chunks/{chunk-DPKECIKN.js → chunk-VKWDMOR4.js} +2 -2
- package/dist/cli/chunks/{chunk-SC6UFGJ6.js → chunk-VWN66V7U.js} +2 -2
- package/dist/cli/chunks/{chunk-2TYO4VZH.js → chunk-W5C7R2LS.js} +3 -3
- package/dist/cli/chunks/{chunk-D7PI4CYZ.js → chunk-W7KGHW4T.js} +2 -2
- package/dist/cli/chunks/{chunk-7VO5IEJ2.js → chunk-WFZ4DRIC.js} +2 -2
- package/dist/cli/chunks/{chunk-NSRDP7RD.js → chunk-WFZUKXV5.js} +2 -2
- package/dist/cli/chunks/{chunk-SJC7OKF3.js → chunk-X4B3R3ZZ.js} +2 -2
- package/dist/cli/chunks/{chunk-5FNNCVXR.js → chunk-XI6ZZMX7.js} +1 -1
- package/dist/cli/chunks/{chunk-K72J52JO.js → chunk-YEO2Z3UX.js} +2 -2
- package/dist/cli/chunks/{chunk-PMWWWYUM.js → chunk-YZD4VIE5.js} +1 -1
- package/dist/cli/chunks/{chunk-F6QPAVWS.js → chunk-YZFNPTGN.js} +2 -2
- package/dist/cli/chunks/{chunk-5T4J3IPG.js → chunk-ZCYKWEAM.js} +2 -2
- package/dist/cli/chunks/{chunk-PWJZZCHJ.js → chunk-ZG3DSWUA.js} +1 -1
- package/dist/cli/chunks/{chunk-2L5VFVCG.js → chunk-ZS4BGJJV.js} +1 -1
- package/dist/cli/chunks/{chunk-ICF5RPQU.js → chunk-ZT7JSFGT.js} +2 -2
- package/dist/cli/chunks/{chunk-MFWWPRBV.js → chunk-ZTC64OJE.js} +2 -2
- package/dist/cli/chunks/{chunk-G5FPWH5O.js → chunk-ZUBJBAUD.js} +15 -15
- package/dist/cli/chunks/{ci-2BLMQNX3.js → ci-M2BSQBLL.js} +2 -2
- package/dist/cli/chunks/{ci-output-XK4PPSN7.js → ci-output-Z4TMK6GZ.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-W7X4NPFE.js → circuit-breaker-E3G4GGWB.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-GLBLSYNJ.js → claude-flow-setup-MASRQU54.js} +2 -2
- package/dist/cli/chunks/client-RPB6RYVY.js +2 -0
- package/dist/cli/chunks/{cline-installer-7WX7DBGI.js → cline-installer-P3BWAKQA.js} +2 -2
- package/dist/cli/chunks/{code-SP3HAQWG.js → code-7HY5HQAV.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-44HH36UG.js → code-index-extractor-MBVKLOEU.js} +2 -2
- package/dist/cli/chunks/{codex-installer-LMXRWLPU.js → codex-installer-WZ6QO2PH.js} +2 -2
- package/dist/cli/chunks/{completions-GL5FTZAN.js → completions-TOJC2UFP.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-CQMYGETL.js → complexity-analyzer-QYVDIAAW.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-CYVYS5B7.js → continuedev-installer-J72CV7P4.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-M7XVII2A.js → copilot-installer-ACDA3GEA.js} +2 -2
- package/dist/cli/chunks/core-handlers-QFJT5NX6.js +2 -0
- package/dist/cli/chunks/{cost-tracker-S4ET4FH3.js → cost-tracker-BAYQJELE.js} +2 -2
- package/dist/cli/chunks/{coverage-DFVSSQ4A.js → coverage-QD3XJV6W.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-5GJ7WZKX.js +2 -0
- package/dist/cli/chunks/{cursor-installer-KWDSQPQC.js → cursor-installer-SPGZ4TQM.js} +2 -2
- package/dist/cli/chunks/{daemon-2HD54QVO.js → daemon-3EVOL2UH.js} +3 -3
- package/dist/cli/chunks/{daemon-CRX46BBO.js → daemon-N4JKD5SO.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-SCP6WPZB.js → dag-attention-scheduler-3BVLL3L5.js} +2 -2
- package/dist/cli/chunks/{detect-XS2GDCEX.js → detect-SWACKB45.js} +2 -2
- package/dist/cli/chunks/{dist-node-U43MVQ3F.js → dist-node-LU4E7PI6.js} +2 -2
- package/dist/cli/chunks/{domain-handler-HITMDULH.js → domain-handler-5AKKAC43.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-TJF7DNI4.js → domain-transfer-LB6H7RPX.js} +2 -2
- package/dist/cli/chunks/dream-C6VNLTON.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-JKG33YZK.js → embed-and-insert-pattern-7RBA5NDK.js} +2 -2
- package/dist/cli/chunks/{eval-NF5Y4W37.js → eval-ZZFPRENX.js} +5 -5
- package/dist/cli/chunks/{experience-capture-middleware-VMMFYJ4D.js → experience-capture-middleware-HRO3EGIW.js} +3 -3
- package/dist/cli/chunks/{fast-paths-W2Q53IR2.js → fast-paths-IRRNQBTY.js} +2 -2
- package/dist/cli/chunks/{feature-flags-B4PBMQJO.js → feature-flags-R5N5IWI2.js} +2 -2
- package/dist/cli/chunks/{feature-flags-PVI7A4RE.js → feature-flags-W54ABAUA.js} +2 -2
- package/dist/cli/chunks/{file-discovery-E4L3I33I.js → file-discovery-6CIDLVID.js} +2 -2
- package/dist/cli/chunks/{fleet-LE5SHVLK.js → fleet-YTFN64WE.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-MWWJBLOH.js → gnn-wrapper-RXMPLMV2.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-XOUVNPQK.js → heartbeat-handler-HQQWEEQQ.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-4SBO27BG.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-W7G6VNXW.js +2 -0
- package/dist/cli/chunks/hnsw-index-LENA5QML.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-W3T5ZDDP.js → hnsw-legacy-bridge-GPZIKYFD.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-PX5JM3DG.js → hnswlib-node-P6HSEFLW.js} +2 -2
- package/dist/cli/chunks/hooks-AYLAGFOK.js +285 -0
- package/dist/cli/chunks/hybrid-router-IXHIC45P.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-VDFK3JYH.js → hypergraph-engine-56FMXI3T.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-EUDGEF25.js → hypergraph-handler-APEVT5IE.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-DKGVMYU6.js +2 -0
- package/dist/cli/chunks/{init-handler-MZEAJOZK.js → init-handler-5DWF4REQ.js} +6 -6
- package/dist/cli/chunks/init-wizard-BBY3LY3F.js +2 -0
- package/dist/cli/chunks/kernel-7CUW7G62.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-ECBYWT6M.js → kilocode-installer-XKAUA5VA.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-KYFCSYTG.js → kiro-installer-NI2KIYJE.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-Q5CP47IP.js +2 -0
- package/dist/cli/chunks/{learning-4RAFMDSB.js → learning-ZIUMUNXZ.js} +3 -3
- package/dist/cli/chunks/{llm-router-JHBNLYP3.js → llm-router-IL52EF2V.js} +4 -4
- package/dist/cli/chunks/llm-router-service-MTXCX7TO.js +2 -0
- package/dist/cli/chunks/{load-4DVQML7P.js → load-B5LFYD6O.js} +2 -2
- package/dist/cli/chunks/load-test-YBWXASBO.js +2 -0
- package/dist/cli/chunks/{mcp-LCWMU4GZ.js → mcp-K6GZLWBC.js} +2 -2
- package/dist/cli/chunks/{memory-3DTJAURT.js → memory-NCQRVSN6.js} +5 -5
- package/dist/cli/chunks/memory-backend-52LANEA3.js +2 -0
- package/dist/cli/chunks/{memory-handlers-BL6E3XAK.js → memory-handlers-KFW3HYAP.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-AVR5SZOO.js → multi-model-executor-R4LBSJWK.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-DW2426QM.js → opencode-installer-I6CBR3PV.js} +2 -2
- package/dist/cli/chunks/{orchestrator-AHF4W5GS.js → orchestrator-5FXUCES6.js} +10 -10
- package/dist/cli/chunks/{pipeline-N6THEWYE.js → pipeline-GDKCTXJH.js} +2 -2
- package/dist/cli/chunks/{platform-MRCFQF7X.js → platform-ZFY3F4T3.js} +2 -2
- package/dist/cli/chunks/{plugin-6YKUN5QM.js → plugin-HQMEN3OS.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-2YPAHSVS.js → prime-radiant-advanced-wasm-LSJGF4CV.js} +2 -2
- package/dist/cli/chunks/protocol-executor-TRYUS77M.js +2 -0
- package/dist/cli/chunks/{protocol-handler-Y2NMUKWQ.js → protocol-handler-BMDNIGPP.js} +2 -2
- package/dist/cli/chunks/{prove-DZUNWBFD.js → prove-ABVGAG4Z.js} +2 -2
- package/dist/cli/chunks/provider-manager-6XQQN7FX.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-3IUPE4DJ.js +2 -0
- package/dist/cli/chunks/{quality-AIFQMGUV.js → quality-ENJXPNP5.js} +2 -2
- package/dist/cli/chunks/queen-coordinator-VWPH4XPX.js +2 -0
- package/dist/cli/chunks/{real-embeddings-5XL4LOG2.js → real-embeddings-W3GNAEJO.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-LV3WONT5.js → roocode-installer-4FJNQ7PU.js} +2 -2
- package/dist/cli/chunks/router-OIB6ODHA.js +2 -0
- package/dist/cli/chunks/routing-feedback-EKYPCZYG.js +2 -0
- package/dist/cli/chunks/{routing-handler-WSMUILGD.js → routing-handler-GFS5FA4F.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-BCEIDTW3.js → ruvector-commands-GBMYNJKN.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-LRSPC6H3.js → rvf-dual-writer-STUAQT6U.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-QHNX6353.js → rvf-migration-adapter-LO6DBNJH.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-SLNB3XPW.js → rvf-migration-coordinator-I5AD4VJ2.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-7RXP2Q4Q.js +2 -0
- package/dist/cli/chunks/safe-db-MNKFEPBX.js +2 -0
- package/dist/cli/chunks/schedule-AJXABVXX.js +2 -0
- package/dist/cli/chunks/scheduler-LDWYHIAW.js +2 -0
- package/dist/cli/chunks/{security-CYY6TECQ.js → security-X3WCA5K5.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-U6JE4O6A.js → shared-rvf-adapter-Z4FSPWNP.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-PJBSNBRV.js → shared-rvf-dual-writer-QOPOIRIC.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-A6GKDMOJ.js +2 -0
- package/dist/cli/chunks/{status-handler-W723LXX5.js → status-handler-B2B5QBVK.js} +2 -2
- package/dist/cli/chunks/{structural-health-WZUPZBB5.js → structural-health-KT47LBVH.js} +2 -2
- package/dist/cli/chunks/{sync-ZLMF53TB.js → sync-CKID22IW.js} +2 -2
- package/dist/cli/chunks/{sync-UA22CKUS.js → sync-VWD6OOUR.js} +2 -2
- package/dist/cli/chunks/{task-handler-SENTEEXZ.js → task-handler-X5JT5YBF.js} +2 -2
- package/dist/cli/chunks/{task-handlers-FGVUZOCC.js → task-handlers-IW4GQDW4.js} +3 -3
- package/dist/cli/chunks/{test-Q37C3WI2.js → test-MBZSUASD.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-E6SPIBTH.js → test-scheduling-E5KHKRZS.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-HQFFMZUF.js → token-bootstrap-TIDPJ5IG.js} +2 -2
- package/dist/cli/chunks/{token-usage-JHNWTZ7L.js → token-usage-ECJSPOQB.js} +2 -2
- package/dist/cli/chunks/{transformers-TEXDUVNI.js → transformers-UZJAQ7OZ.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-MWSS52H6.js → tree-sitter-wasm-parser-H6BU2E5R.js} +2 -2
- package/dist/cli/chunks/{types-YQRKHYH3.js → types-PM7NT3MH.js} +2 -2
- package/dist/cli/chunks/unified-memory-27QJHABO.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-76VUXR4H.js +2 -0
- package/dist/cli/chunks/unified-persistence-QRCGDEXH.js +2 -0
- package/dist/cli/chunks/{upgrade-JKMEDURI.js → upgrade-FS2XYC2P.js} +2 -2
- package/dist/cli/chunks/{validate-URO7G6OE.js → validate-4Y2BNN3A.js} +3 -3
- package/dist/cli/chunks/{validate-swarm-VZVJ56Z5.js → validate-swarm-Z7QXZSUE.js} +4 -4
- package/dist/cli/chunks/{vibium-G5WZILL6.js → vibium-VZ6L3O2G.js} +2 -2
- package/dist/cli/chunks/visual-security-KB27O7BE.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-LECH5T6H.js → web-tree-sitter-H7P37W5U.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-2NPLC2YW.js → windsurf-installer-IB2VHSZS.js} +2 -2
- package/dist/cli/chunks/{witness-chain-X347C36A.js → witness-chain-C4DISYJN.js} +2 -2
- package/dist/cli/chunks/witness-chain-EYPXHRDV.js +2 -0
- package/dist/cli/chunks/{workflow-V4ALYZ73.js → workflow-IGM7KVIO.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-6AQZ3USU.js +2 -0
- package/dist/cli/chunks/{wrappers-QXOPRPR4.js → wrappers-PQXC263L.js} +2 -2
- package/dist/cli/commands/arena.d.ts +10 -0
- package/dist/cli/commands/arena.js +129 -0
- package/dist/cli/commands/hooks-handlers/command-hooks.js +38 -2
- package/dist/cli/commands/hooks-handlers/hooks-dream-learning.d.ts +4 -0
- package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +66 -3
- package/dist/cli/commands/hooks-handlers/nesting-provenance.d.ts +27 -0
- package/dist/cli/commands/hooks-handlers/nesting-provenance.js +46 -0
- package/dist/cli/commands/hooks-handlers/task-hooks.js +22 -1
- package/dist/cli/commands/hooks-handlers/tool-loop-guardrail.d.ts +71 -0
- package/dist/cli/commands/hooks-handlers/tool-loop-guardrail.js +142 -0
- package/dist/cli/index.js +17 -0
- package/dist/contracts/verdicts.d.ts +297 -0
- package/dist/contracts/verdicts.js +178 -0
- package/dist/coordination/queen-types.d.ts +4 -0
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +15 -6
- package/dist/integrations/agentic-flow/reasoning-bank/trajectory-tracker.js +12 -0
- package/dist/mcp/bundle.js +368 -368
- package/dist/mcp/handlers/core-handlers.d.ts +20 -0
- package/dist/mcp/handlers/core-handlers.js +28 -0
- package/dist/mcp/handlers/domain-handler-configs.d.ts +3 -0
- package/dist/mcp/handlers/domain-handler-configs.js +22 -10
- package/dist/shared/llm/cost-tracker.js +6 -2
- package/dist/shared/llm/interfaces.d.ts +4 -0
- package/dist/shared/llm/providers/claude.js +16 -2
- package/dist/shared/reasoning-scrub.d.ts +29 -0
- package/dist/shared/reasoning-scrub.js +75 -0
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-A62ETL5C.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-MTCRAV6N.js +0 -2
- package/dist/cli/chunks/base-KKEBUHZC.js +0 -2
- package/dist/cli/chunks/browser-workflow-XHYAJUB6.js +0 -2
- package/dist/cli/chunks/chunk-HPYGMKZF.js +0 -2
- package/dist/cli/chunks/chunk-PZ4PRZXN.js +0 -699
- package/dist/cli/chunks/client-C6CJOCRN.js +0 -2
- package/dist/cli/chunks/cross-domain-router-I3GEA5G6.js +0 -2
- package/dist/cli/chunks/dream-JCQMG2RL.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-FBHE4ZWH.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-EOOA4WXD.js +0 -2
- package/dist/cli/chunks/hnsw-index-TD3KRPND.js +0 -2
- package/dist/cli/chunks/hooks-RUPQVIUM.js +0 -250
- package/dist/cli/chunks/hybrid-router-64O6PXZ2.js +0 -2
- package/dist/cli/chunks/impact-analyzer-ITQHXGTM.js +0 -2
- package/dist/cli/chunks/init-wizard-DZ4IKGQI.js +0 -2
- package/dist/cli/chunks/kernel-HSVY4ZYK.js +0 -2
- package/dist/cli/chunks/knowledge-graph-H32TXXX4.js +0 -2
- package/dist/cli/chunks/llm-router-service-3FKESBUX.js +0 -2
- package/dist/cli/chunks/load-test-LKHURZGZ.js +0 -2
- package/dist/cli/chunks/memory-backend-XRJRZ6CK.js +0 -2
- package/dist/cli/chunks/protocol-executor-KABPB6PQ.js +0 -2
- package/dist/cli/chunks/provider-manager-U7EBM3FA.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-64O2OQIW.js +0 -2
- package/dist/cli/chunks/queen-coordinator-SV3COGIL.js +0 -2
- package/dist/cli/chunks/router-QARRPMED.js +0 -2
- package/dist/cli/chunks/routing-feedback-KD2JFTPK.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-4LLGF5AY.js +0 -2
- package/dist/cli/chunks/safe-db-RAX3H2P7.js +0 -2
- package/dist/cli/chunks/schedule-RQZGLLUY.js +0 -2
- package/dist/cli/chunks/scheduler-ACWTN4LN.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-SWNBO257.js +0 -2
- package/dist/cli/chunks/unified-memory-QG3FDRKR.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-KOR4EOIG.js +0 -2
- package/dist/cli/chunks/unified-persistence-J6NIRYKM.js +0 -2
- package/dist/cli/chunks/visual-security-RAWV6YLN.js +0 -2
- package/dist/cli/chunks/witness-chain-ZO7FIM35.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-7SKITNIJ.js +0 -2
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Nested-Subagent Provenance Validation (ADR-101)
|
|
3
|
+
*
|
|
4
|
+
* Parses and validates the `--parent-agent-id` / `--depth` flags on
|
|
5
|
+
* `aqe hooks post-task`. Anthropic announced nested subagent support
|
|
6
|
+
* (depth=5) on 2026-06-09; recording which agent spawned a task and at
|
|
7
|
+
* what depth lets ReasoningBank segment patterns per hierarchy level —
|
|
8
|
+
* useful today for flat depth-1 spawns, and ready for deep chains the
|
|
9
|
+
* day the upstream `Task` denylist lifts.
|
|
10
|
+
*/
|
|
11
|
+
/** Agent identifiers: alphanum start, then alphanum / _ . : - , max 128 chars */
|
|
12
|
+
const AGENT_ID_RE = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/;
|
|
13
|
+
/** Defensive bound — well above Anthropic's announced depth=5 cap */
|
|
14
|
+
export const MAX_NESTING_DEPTH = 32;
|
|
15
|
+
/**
|
|
16
|
+
* Validate raw flag values. Both flags are optional and independent;
|
|
17
|
+
* depth=0 is a valid value (top-level) and must survive as 0, not be
|
|
18
|
+
* coerced to undefined.
|
|
19
|
+
*/
|
|
20
|
+
export function parseNestingProvenance(parentAgentIdRaw, depthRaw) {
|
|
21
|
+
const result = {};
|
|
22
|
+
if (parentAgentIdRaw !== undefined) {
|
|
23
|
+
if (!AGENT_ID_RE.test(parentAgentIdRaw)) {
|
|
24
|
+
return {
|
|
25
|
+
error: `Invalid --parent-agent-id "${parentAgentIdRaw}": must start with a letter or digit ` +
|
|
26
|
+
`and contain only letters, digits, "_", ".", ":", "-" (max 128 chars)`,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
result.parentAgentId = parentAgentIdRaw;
|
|
30
|
+
}
|
|
31
|
+
if (depthRaw !== undefined) {
|
|
32
|
+
const depth = typeof depthRaw === 'number' ? depthRaw : Number(depthRaw);
|
|
33
|
+
if (!Number.isInteger(depth)) {
|
|
34
|
+
return { error: `Invalid --depth "${depthRaw}": must be an integer` };
|
|
35
|
+
}
|
|
36
|
+
if (depth < 0) {
|
|
37
|
+
return { error: `Invalid --depth ${depth}: must be >= 0` };
|
|
38
|
+
}
|
|
39
|
+
if (depth > MAX_NESTING_DEPTH) {
|
|
40
|
+
return { error: `Invalid --depth ${depth}: must be <= ${MAX_NESTING_DEPTH}` };
|
|
41
|
+
}
|
|
42
|
+
result.depth = depth;
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=nesting-provenance.js.map
|
|
@@ -14,6 +14,7 @@ import { applyHookBusyTimeout, getHooksSystem, createHybridBackendWithTimeout, i
|
|
|
14
14
|
import { ensureRoutingOutcomesAdr095Columns } from '../../../routing/routing-outcomes-migration.js';
|
|
15
15
|
import { deriveTaskType } from '../../../learning/agent-routing.js';
|
|
16
16
|
import { detectQEDomains } from '../../../learning/qe-patterns.js';
|
|
17
|
+
import { parseNestingProvenance } from './nesting-provenance.js';
|
|
17
18
|
// ============================================================================
|
|
18
19
|
// Constants — task-bridge / routing-quality / q-learning
|
|
19
20
|
// ============================================================================
|
|
@@ -311,10 +312,24 @@ export function registerTaskHooks(hooks) {
|
|
|
311
312
|
.option('--agent <name>', 'Agent that executed the task')
|
|
312
313
|
.option('--duration <ms>', 'Task duration in milliseconds')
|
|
313
314
|
.option('-d, --description <desc>', 'Task description — fallback Q-state source when pre-task bridge is absent (issue #499)')
|
|
315
|
+
.option('--parent-agent-id <id>', 'Agent that spawned this task (ADR-101 nesting provenance)')
|
|
316
|
+
.option('--depth <n>', 'Nesting depth of this task, 0 = top-level (ADR-101)')
|
|
314
317
|
.option('--json', 'Output as JSON')
|
|
315
318
|
.action(async (options) => {
|
|
316
319
|
try {
|
|
317
320
|
const success = options.success === 'true' || options.success === true;
|
|
321
|
+
// ADR-101: validate nesting provenance before any persistence
|
|
322
|
+
const provenance = parseNestingProvenance(options.parentAgentId, options.depth);
|
|
323
|
+
if (provenance.error) {
|
|
324
|
+
if (options.json) {
|
|
325
|
+
console.log(JSON.stringify({ success: false, error: provenance.error }));
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
console.error(chalk.red(` ✗ ${provenance.error}`));
|
|
329
|
+
}
|
|
330
|
+
process.exitCode = 1;
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
318
333
|
// Initialize hooks system and record learning outcome
|
|
319
334
|
// BUG FIX: Must call getHooksSystem() FIRST to initialize, not check state.initialized
|
|
320
335
|
let patternsLearned = 0;
|
|
@@ -344,11 +359,15 @@ export function registerTaskHooks(hooks) {
|
|
|
344
359
|
const effectiveTaskId = options.taskId || `hook-${Date.now()}`;
|
|
345
360
|
const agent = options.agent || 'unknown';
|
|
346
361
|
const durationMs = options.duration ? parseInt(options.duration, 10) : 0;
|
|
362
|
+
// ADR-101: provenance rides in the feedback string so the
|
|
363
|
+
// learning loop can segment patterns per hierarchy level
|
|
364
|
+
const provenanceSuffix = (provenance.parentAgentId ? `, Parent: ${provenance.parentAgentId}` : '') +
|
|
365
|
+
(provenance.depth !== undefined ? `, Depth: ${provenance.depth}` : '');
|
|
347
366
|
await reasoningBank.recordOutcome({
|
|
348
367
|
patternId: `task:${agent}:${effectiveTaskId}`,
|
|
349
368
|
success,
|
|
350
369
|
metrics: { executionTimeMs: durationMs },
|
|
351
|
-
feedback: `Agent: ${agent}, Task: ${effectiveTaskId}`,
|
|
370
|
+
feedback: `Agent: ${agent}, Task: ${effectiveTaskId}${provenanceSuffix}`,
|
|
352
371
|
});
|
|
353
372
|
// Stream B: full experience pipeline (captured_experiences,
|
|
354
373
|
// experience_applications + per-pattern fan-out, qe_trajectories
|
|
@@ -359,6 +378,8 @@ export function registerTaskHooks(hooks) {
|
|
|
359
378
|
agent,
|
|
360
379
|
durationMs,
|
|
361
380
|
success,
|
|
381
|
+
parentAgentId: provenance.parentAgentId,
|
|
382
|
+
depth: provenance.depth,
|
|
362
383
|
});
|
|
363
384
|
// Issue #460: when --agent arrives empty (Claude Code does not
|
|
364
385
|
// expose $TOOL_RESULT_agent_id in PostToolUse context), `agent`
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Tool-Loop Circuit Breaker (ADR-100)
|
|
3
|
+
*
|
|
4
|
+
* Detects consecutive failures of the same Bash command across hook
|
|
5
|
+
* invocations and breaks runaway retry loops: WARN at 3, BLOCK at 5.
|
|
6
|
+
* Advisory by default (the block is a strongly-worded recommendation in
|
|
7
|
+
* the hook output); `AQE_STRICT_TOOL_LOOP=1` upgrades the block to a
|
|
8
|
+
* PreToolUse deny.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors the closed → open → half-open semantics of
|
|
11
|
+
* `src/coordination/circuit-breaker/domain-circuit-breaker.ts` (ADR-064),
|
|
12
|
+
* but persists state in a small JSON sidecar instead of process memory:
|
|
13
|
+
* every hook call is a fresh CLI process, so in-process state cannot see
|
|
14
|
+
* the previous invocation, and opening memory.db from pre-command would
|
|
15
|
+
* add DB-init latency to every Bash command. The sidecar is ephemeral
|
|
16
|
+
* guardrail state — safe to delete at any time, not a data store.
|
|
17
|
+
*/
|
|
18
|
+
export type ToolLoopVerdict = 'allow' | 'warn' | 'block';
|
|
19
|
+
export interface ToolLoopCheck {
|
|
20
|
+
verdict: ToolLoopVerdict;
|
|
21
|
+
consecutiveFailures: number;
|
|
22
|
+
/** True when an open breaker is being given a probe attempt (half-open) */
|
|
23
|
+
halfOpen: boolean;
|
|
24
|
+
/** Human-readable guidance for warn/block verdicts */
|
|
25
|
+
hint?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ToolLoopGuardrailOptions {
|
|
28
|
+
/** Path of the JSON state sidecar */
|
|
29
|
+
statePath: string;
|
|
30
|
+
/** Consecutive failures before warning (default 3) */
|
|
31
|
+
warnThreshold?: number;
|
|
32
|
+
/** Consecutive failures before blocking (default 5) */
|
|
33
|
+
blockThreshold?: number;
|
|
34
|
+
/** An open breaker allows one probe attempt after this long (default 2 min) */
|
|
35
|
+
halfOpenAfterMs?: number;
|
|
36
|
+
/** Entries idle longer than this are pruned (default 30 min) */
|
|
37
|
+
staleAfterMs?: number;
|
|
38
|
+
}
|
|
39
|
+
export declare class ToolLoopGuardrail {
|
|
40
|
+
private readonly statePath;
|
|
41
|
+
private readonly warnThreshold;
|
|
42
|
+
private readonly blockThreshold;
|
|
43
|
+
private readonly halfOpenAfterMs;
|
|
44
|
+
private readonly staleAfterMs;
|
|
45
|
+
constructor(options: ToolLoopGuardrailOptions);
|
|
46
|
+
/**
|
|
47
|
+
* Normalize a command into a breaker key: whitespace-collapsed and
|
|
48
|
+
* length-capped so cosmetic differences don't split the failure count.
|
|
49
|
+
*/
|
|
50
|
+
static signature(command: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Consult the breaker before a command runs (pre-command hook).
|
|
53
|
+
* Fail-open: any state-read problem yields 'allow'.
|
|
54
|
+
*/
|
|
55
|
+
check(command: string, now?: number): ToolLoopCheck;
|
|
56
|
+
/**
|
|
57
|
+
* Record a command outcome (post-command hook). Success resets the
|
|
58
|
+
* breaker for that command; failure increments it. Fail-open on errors.
|
|
59
|
+
*/
|
|
60
|
+
record(command: string, success: boolean, now?: number): void;
|
|
61
|
+
/** Whether strict mode upgrades the advisory block to a hook deny. */
|
|
62
|
+
static isStrict(env?: NodeJS.ProcessEnv): boolean;
|
|
63
|
+
private readState;
|
|
64
|
+
private writeState;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Guardrail bound to the project's `.agentic-qe/` directory — the shared
|
|
68
|
+
* instance used by the pre-command/post-command hooks.
|
|
69
|
+
*/
|
|
70
|
+
export declare function createProjectToolLoopGuardrail(projectRoot: string): ToolLoopGuardrail;
|
|
71
|
+
//# sourceMappingURL=tool-loop-guardrail.d.ts.map
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Tool-Loop Circuit Breaker (ADR-100)
|
|
3
|
+
*
|
|
4
|
+
* Detects consecutive failures of the same Bash command across hook
|
|
5
|
+
* invocations and breaks runaway retry loops: WARN at 3, BLOCK at 5.
|
|
6
|
+
* Advisory by default (the block is a strongly-worded recommendation in
|
|
7
|
+
* the hook output); `AQE_STRICT_TOOL_LOOP=1` upgrades the block to a
|
|
8
|
+
* PreToolUse deny.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors the closed → open → half-open semantics of
|
|
11
|
+
* `src/coordination/circuit-breaker/domain-circuit-breaker.ts` (ADR-064),
|
|
12
|
+
* but persists state in a small JSON sidecar instead of process memory:
|
|
13
|
+
* every hook call is a fresh CLI process, so in-process state cannot see
|
|
14
|
+
* the previous invocation, and opening memory.db from pre-command would
|
|
15
|
+
* add DB-init latency to every Bash command. The sidecar is ephemeral
|
|
16
|
+
* guardrail state — safe to delete at any time, not a data store.
|
|
17
|
+
*/
|
|
18
|
+
import * as fs from 'fs';
|
|
19
|
+
import * as path from 'path';
|
|
20
|
+
export class ToolLoopGuardrail {
|
|
21
|
+
statePath;
|
|
22
|
+
warnThreshold;
|
|
23
|
+
blockThreshold;
|
|
24
|
+
halfOpenAfterMs;
|
|
25
|
+
staleAfterMs;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.statePath = options.statePath;
|
|
28
|
+
this.warnThreshold = options.warnThreshold ?? 3;
|
|
29
|
+
this.blockThreshold = options.blockThreshold ?? 5;
|
|
30
|
+
this.halfOpenAfterMs = options.halfOpenAfterMs ?? 120_000;
|
|
31
|
+
this.staleAfterMs = options.staleAfterMs ?? 30 * 60_000;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Normalize a command into a breaker key: whitespace-collapsed and
|
|
35
|
+
* length-capped so cosmetic differences don't split the failure count.
|
|
36
|
+
*/
|
|
37
|
+
static signature(command) {
|
|
38
|
+
return command.trim().replace(/\s+/g, ' ').slice(0, 200);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Consult the breaker before a command runs (pre-command hook).
|
|
42
|
+
* Fail-open: any state-read problem yields 'allow'.
|
|
43
|
+
*/
|
|
44
|
+
check(command, now = Date.now()) {
|
|
45
|
+
const sig = ToolLoopGuardrail.signature(command);
|
|
46
|
+
if (!sig) {
|
|
47
|
+
return { verdict: 'allow', consecutiveFailures: 0, halfOpen: false };
|
|
48
|
+
}
|
|
49
|
+
const entry = this.readState()[sig];
|
|
50
|
+
if (!entry || entry.consecutiveFailures < this.warnThreshold) {
|
|
51
|
+
return { verdict: 'allow', consecutiveFailures: entry?.consecutiveFailures ?? 0, halfOpen: false };
|
|
52
|
+
}
|
|
53
|
+
const failures = entry.consecutiveFailures;
|
|
54
|
+
if (failures >= this.blockThreshold) {
|
|
55
|
+
// Open breaker: allow a single probe once the half-open window elapses
|
|
56
|
+
if (now - entry.lastFailureAt >= this.halfOpenAfterMs) {
|
|
57
|
+
return {
|
|
58
|
+
verdict: 'warn',
|
|
59
|
+
consecutiveFailures: failures,
|
|
60
|
+
halfOpen: true,
|
|
61
|
+
hint: `This command has failed ${failures}x consecutively; allowing one probe attempt. ` +
|
|
62
|
+
`If it fails again it will be flagged immediately.`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
verdict: 'block',
|
|
67
|
+
consecutiveFailures: failures,
|
|
68
|
+
halfOpen: false,
|
|
69
|
+
hint: `The same command failed ${failures}x consecutively. Re-running it unchanged is ` +
|
|
70
|
+
`unlikely to succeed — inspect the error output, change the approach, or fix the ` +
|
|
71
|
+
`underlying problem first. (A successful run resets this breaker.)`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
verdict: 'warn',
|
|
76
|
+
consecutiveFailures: failures,
|
|
77
|
+
halfOpen: false,
|
|
78
|
+
hint: `This command has failed ${failures}x consecutively — consider changing approach before retrying.`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Record a command outcome (post-command hook). Success resets the
|
|
83
|
+
* breaker for that command; failure increments it. Fail-open on errors.
|
|
84
|
+
*/
|
|
85
|
+
record(command, success, now = Date.now()) {
|
|
86
|
+
const sig = ToolLoopGuardrail.signature(command);
|
|
87
|
+
if (!sig)
|
|
88
|
+
return;
|
|
89
|
+
try {
|
|
90
|
+
const state = this.readState();
|
|
91
|
+
if (success) {
|
|
92
|
+
if (state[sig]) {
|
|
93
|
+
delete state[sig];
|
|
94
|
+
this.writeState(state, now);
|
|
95
|
+
}
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const entry = state[sig] ?? { consecutiveFailures: 0, lastFailureAt: now };
|
|
99
|
+
entry.consecutiveFailures += 1;
|
|
100
|
+
entry.lastFailureAt = now;
|
|
101
|
+
state[sig] = entry;
|
|
102
|
+
this.writeState(state, now);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
/* fail-open: guardrail must never break the hook */
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Whether strict mode upgrades the advisory block to a hook deny. */
|
|
109
|
+
static isStrict(env = process.env) {
|
|
110
|
+
return env.AQE_STRICT_TOOL_LOOP === '1' || env.AQE_STRICT_TOOL_LOOP === 'true';
|
|
111
|
+
}
|
|
112
|
+
readState() {
|
|
113
|
+
try {
|
|
114
|
+
const raw = fs.readFileSync(this.statePath, 'utf8');
|
|
115
|
+
const parsed = JSON.parse(raw);
|
|
116
|
+
return typeof parsed === 'object' && parsed !== null ? parsed : {};
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return {}; // missing or corrupt sidecar → clean slate
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
writeState(state, now) {
|
|
123
|
+
// Prune stale entries so the sidecar stays small
|
|
124
|
+
for (const [key, entry] of Object.entries(state)) {
|
|
125
|
+
if (now - entry.lastFailureAt > this.staleAfterMs) {
|
|
126
|
+
delete state[key];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
fs.mkdirSync(path.dirname(this.statePath), { recursive: true });
|
|
130
|
+
fs.writeFileSync(this.statePath, JSON.stringify(state));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Guardrail bound to the project's `.agentic-qe/` directory — the shared
|
|
135
|
+
* instance used by the pre-command/post-command hooks.
|
|
136
|
+
*/
|
|
137
|
+
export function createProjectToolLoopGuardrail(projectRoot) {
|
|
138
|
+
return new ToolLoopGuardrail({
|
|
139
|
+
statePath: path.join(projectRoot, '.agentic-qe', 'tool-loop-state.json'),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=tool-loop-guardrail.js.map
|
package/dist/cli/index.js
CHANGED
|
@@ -120,6 +120,18 @@ async function autoInitialize() {
|
|
|
120
120
|
context.persistentScheduler = createPersistentScheduler();
|
|
121
121
|
context.queen = createQueenCoordinator(context.kernel, context.router, protocolExecutor, undefined);
|
|
122
122
|
await context.queen.initialize();
|
|
123
|
+
// Bridge the CLI-initialized components into the MCP handlers' fleet state.
|
|
124
|
+
// The memory/agent/task/team/pipeline handlers are shared between the MCP
|
|
125
|
+
// server and the CLI and are guarded by isFleetInitialized(); without this
|
|
126
|
+
// bridge every CLI invocation failed with "Fleet not initialized" even
|
|
127
|
+
// after a successful auto-init (MCP-CLI parity).
|
|
128
|
+
const { adoptExternalFleet } = await import('../mcp/handlers/core-handlers.js');
|
|
129
|
+
adoptExternalFleet({
|
|
130
|
+
kernel: context.kernel,
|
|
131
|
+
queen: context.queen,
|
|
132
|
+
router: context.router,
|
|
133
|
+
workflowOrchestrator: context.workflowOrchestrator,
|
|
134
|
+
});
|
|
123
135
|
context.initialized = true;
|
|
124
136
|
}
|
|
125
137
|
async function ensureInitializedStrict() {
|
|
@@ -241,6 +253,11 @@ registerLazyCommand(program, {
|
|
|
241
253
|
description: 'Security scanning and URL validation',
|
|
242
254
|
factory: () => import('./commands/security.js').then(m => m.createSecurityCommand(context, cleanupAndExit, ensureInitialized)),
|
|
243
255
|
});
|
|
256
|
+
registerLazyCommand(program, {
|
|
257
|
+
name: 'arena',
|
|
258
|
+
description: 'Competitive test-strategy tournaments (ADR-104)',
|
|
259
|
+
factory: () => import('./commands/arena.js').then(m => m.createArenaCommand(context, cleanupAndExit, ensureInitialized)),
|
|
260
|
+
});
|
|
244
261
|
registerLazyCommand(program, {
|
|
245
262
|
name: 'code',
|
|
246
263
|
description: 'Code intelligence analysis',
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Structured Verdict Contracts (ADR-103)
|
|
3
|
+
*
|
|
4
|
+
* Typed, versioned verdict envelopes for agent-to-agent and MCP-boundary
|
|
5
|
+
* handoffs: RiskDecision (quality gates), FindingVerdict (review findings
|
|
6
|
+
* with adversarial refutations), CoverageGap (risk-weighted gap reports).
|
|
7
|
+
*
|
|
8
|
+
* Validators are dependency-free and are the source of truth; the exported
|
|
9
|
+
* JSON Schemas (published to schemas/*.schema.json by
|
|
10
|
+
* scripts/generate-verdict-schemas.mjs) mirror them for external tooling
|
|
11
|
+
* (ajv, workflow agent() schema option). Envelopes are versioned and
|
|
12
|
+
* additive-only within a major version: consumers must tolerate unknown
|
|
13
|
+
* fields, so schemas keep `additionalProperties: true`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const VERDICT_CONTRACT_VERSION: "1.0";
|
|
16
|
+
export type RiskDecisionOutcome = 'approve' | 'block' | 'escalate';
|
|
17
|
+
export interface RiskDecision {
|
|
18
|
+
/** Envelope discriminator + version */
|
|
19
|
+
contract: 'risk-decision@1';
|
|
20
|
+
decision: RiskDecisionOutcome;
|
|
21
|
+
riskFactors: string[];
|
|
22
|
+
/** 0..1 */
|
|
23
|
+
confidence: number;
|
|
24
|
+
rationale: string;
|
|
25
|
+
}
|
|
26
|
+
export type FindingSeverity = 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
27
|
+
export type FindingOutcome = 'upheld' | 'refuted' | 'uncertain';
|
|
28
|
+
export interface FindingVerdict {
|
|
29
|
+
contract: 'finding-verdict@1';
|
|
30
|
+
id: string;
|
|
31
|
+
title: string;
|
|
32
|
+
file?: string;
|
|
33
|
+
severity: FindingSeverity;
|
|
34
|
+
/** 0..1 */
|
|
35
|
+
confidence: number;
|
|
36
|
+
evidence: string[];
|
|
37
|
+
verdict: FindingOutcome;
|
|
38
|
+
/** One entry per refuter that voted to refute (empty when none) */
|
|
39
|
+
refutations: string[];
|
|
40
|
+
}
|
|
41
|
+
export interface CoverageGap {
|
|
42
|
+
contract: 'coverage-gap@1';
|
|
43
|
+
file: string;
|
|
44
|
+
/** 1-based inclusive line range; omit for whole-file gaps */
|
|
45
|
+
rangeStart?: number;
|
|
46
|
+
rangeEnd?: number;
|
|
47
|
+
/** 0..1 risk weighting */
|
|
48
|
+
riskScore: number;
|
|
49
|
+
suggestedTests: string[];
|
|
50
|
+
}
|
|
51
|
+
export interface ValidationResult {
|
|
52
|
+
valid: boolean;
|
|
53
|
+
errors: string[];
|
|
54
|
+
}
|
|
55
|
+
export declare function validateRiskDecision(value: unknown): ValidationResult;
|
|
56
|
+
export declare function validateFindingVerdict(value: unknown): ValidationResult;
|
|
57
|
+
export declare function validateCoverageGap(value: unknown): ValidationResult;
|
|
58
|
+
/**
|
|
59
|
+
* Derive a RiskDecision from a quality-gate outcome (quality_assess boundary).
|
|
60
|
+
* Indeterminate gates (passed undefined) escalate rather than guess.
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildRiskDecisionFromQualityGate(input: {
|
|
63
|
+
passed?: boolean;
|
|
64
|
+
qualityScore?: number;
|
|
65
|
+
recommendations?: string[];
|
|
66
|
+
}): RiskDecision;
|
|
67
|
+
export declare const RISK_DECISION_SCHEMA: {
|
|
68
|
+
readonly $schema: "http://json-schema.org/draft-07/schema#";
|
|
69
|
+
readonly $id: "https://agentic-qe.dev/schemas/risk-decision.schema.json";
|
|
70
|
+
readonly title: "RiskDecision";
|
|
71
|
+
readonly type: "object";
|
|
72
|
+
readonly required: readonly ["contract", "decision", "riskFactors", "confidence", "rationale"];
|
|
73
|
+
readonly additionalProperties: true;
|
|
74
|
+
readonly properties: {
|
|
75
|
+
readonly contract: {
|
|
76
|
+
readonly const: "risk-decision@1";
|
|
77
|
+
};
|
|
78
|
+
readonly decision: {
|
|
79
|
+
readonly enum: readonly ["approve", "block", "escalate"];
|
|
80
|
+
};
|
|
81
|
+
readonly riskFactors: {
|
|
82
|
+
readonly type: "array";
|
|
83
|
+
readonly items: {
|
|
84
|
+
readonly type: "string";
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
readonly confidence: {
|
|
88
|
+
readonly type: "number";
|
|
89
|
+
readonly minimum: 0;
|
|
90
|
+
readonly maximum: 1;
|
|
91
|
+
};
|
|
92
|
+
readonly rationale: {
|
|
93
|
+
readonly type: "string";
|
|
94
|
+
readonly minLength: 1;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
export declare const FINDING_VERDICT_SCHEMA: {
|
|
99
|
+
readonly $schema: "http://json-schema.org/draft-07/schema#";
|
|
100
|
+
readonly $id: "https://agentic-qe.dev/schemas/finding-verdict.schema.json";
|
|
101
|
+
readonly title: "FindingVerdict";
|
|
102
|
+
readonly type: "object";
|
|
103
|
+
readonly required: readonly ["contract", "id", "title", "severity", "confidence", "evidence", "verdict", "refutations"];
|
|
104
|
+
readonly additionalProperties: true;
|
|
105
|
+
readonly properties: {
|
|
106
|
+
readonly contract: {
|
|
107
|
+
readonly const: "finding-verdict@1";
|
|
108
|
+
};
|
|
109
|
+
readonly id: {
|
|
110
|
+
readonly type: "string";
|
|
111
|
+
readonly minLength: 1;
|
|
112
|
+
};
|
|
113
|
+
readonly title: {
|
|
114
|
+
readonly type: "string";
|
|
115
|
+
readonly minLength: 1;
|
|
116
|
+
};
|
|
117
|
+
readonly file: {
|
|
118
|
+
readonly type: "string";
|
|
119
|
+
};
|
|
120
|
+
readonly severity: {
|
|
121
|
+
readonly enum: readonly ["critical", "high", "medium", "low", "info"];
|
|
122
|
+
};
|
|
123
|
+
readonly confidence: {
|
|
124
|
+
readonly type: "number";
|
|
125
|
+
readonly minimum: 0;
|
|
126
|
+
readonly maximum: 1;
|
|
127
|
+
};
|
|
128
|
+
readonly evidence: {
|
|
129
|
+
readonly type: "array";
|
|
130
|
+
readonly items: {
|
|
131
|
+
readonly type: "string";
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
readonly verdict: {
|
|
135
|
+
readonly enum: readonly ["upheld", "refuted", "uncertain"];
|
|
136
|
+
};
|
|
137
|
+
readonly refutations: {
|
|
138
|
+
readonly type: "array";
|
|
139
|
+
readonly items: {
|
|
140
|
+
readonly type: "string";
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
export declare const COVERAGE_GAP_SCHEMA: {
|
|
146
|
+
readonly $schema: "http://json-schema.org/draft-07/schema#";
|
|
147
|
+
readonly $id: "https://agentic-qe.dev/schemas/coverage-gap.schema.json";
|
|
148
|
+
readonly title: "CoverageGap";
|
|
149
|
+
readonly type: "object";
|
|
150
|
+
readonly required: readonly ["contract", "file", "riskScore", "suggestedTests"];
|
|
151
|
+
readonly additionalProperties: true;
|
|
152
|
+
readonly properties: {
|
|
153
|
+
readonly contract: {
|
|
154
|
+
readonly const: "coverage-gap@1";
|
|
155
|
+
};
|
|
156
|
+
readonly file: {
|
|
157
|
+
readonly type: "string";
|
|
158
|
+
readonly minLength: 1;
|
|
159
|
+
};
|
|
160
|
+
readonly rangeStart: {
|
|
161
|
+
readonly type: "integer";
|
|
162
|
+
readonly minimum: 1;
|
|
163
|
+
};
|
|
164
|
+
readonly rangeEnd: {
|
|
165
|
+
readonly type: "integer";
|
|
166
|
+
readonly minimum: 1;
|
|
167
|
+
};
|
|
168
|
+
readonly riskScore: {
|
|
169
|
+
readonly type: "number";
|
|
170
|
+
readonly minimum: 0;
|
|
171
|
+
readonly maximum: 1;
|
|
172
|
+
};
|
|
173
|
+
readonly suggestedTests: {
|
|
174
|
+
readonly type: "array";
|
|
175
|
+
readonly items: {
|
|
176
|
+
readonly type: "string";
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
export declare const VERDICT_SCHEMAS: {
|
|
182
|
+
readonly 'risk-decision': {
|
|
183
|
+
readonly $schema: "http://json-schema.org/draft-07/schema#";
|
|
184
|
+
readonly $id: "https://agentic-qe.dev/schemas/risk-decision.schema.json";
|
|
185
|
+
readonly title: "RiskDecision";
|
|
186
|
+
readonly type: "object";
|
|
187
|
+
readonly required: readonly ["contract", "decision", "riskFactors", "confidence", "rationale"];
|
|
188
|
+
readonly additionalProperties: true;
|
|
189
|
+
readonly properties: {
|
|
190
|
+
readonly contract: {
|
|
191
|
+
readonly const: "risk-decision@1";
|
|
192
|
+
};
|
|
193
|
+
readonly decision: {
|
|
194
|
+
readonly enum: readonly ["approve", "block", "escalate"];
|
|
195
|
+
};
|
|
196
|
+
readonly riskFactors: {
|
|
197
|
+
readonly type: "array";
|
|
198
|
+
readonly items: {
|
|
199
|
+
readonly type: "string";
|
|
200
|
+
};
|
|
201
|
+
};
|
|
202
|
+
readonly confidence: {
|
|
203
|
+
readonly type: "number";
|
|
204
|
+
readonly minimum: 0;
|
|
205
|
+
readonly maximum: 1;
|
|
206
|
+
};
|
|
207
|
+
readonly rationale: {
|
|
208
|
+
readonly type: "string";
|
|
209
|
+
readonly minLength: 1;
|
|
210
|
+
};
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
readonly 'finding-verdict': {
|
|
214
|
+
readonly $schema: "http://json-schema.org/draft-07/schema#";
|
|
215
|
+
readonly $id: "https://agentic-qe.dev/schemas/finding-verdict.schema.json";
|
|
216
|
+
readonly title: "FindingVerdict";
|
|
217
|
+
readonly type: "object";
|
|
218
|
+
readonly required: readonly ["contract", "id", "title", "severity", "confidence", "evidence", "verdict", "refutations"];
|
|
219
|
+
readonly additionalProperties: true;
|
|
220
|
+
readonly properties: {
|
|
221
|
+
readonly contract: {
|
|
222
|
+
readonly const: "finding-verdict@1";
|
|
223
|
+
};
|
|
224
|
+
readonly id: {
|
|
225
|
+
readonly type: "string";
|
|
226
|
+
readonly minLength: 1;
|
|
227
|
+
};
|
|
228
|
+
readonly title: {
|
|
229
|
+
readonly type: "string";
|
|
230
|
+
readonly minLength: 1;
|
|
231
|
+
};
|
|
232
|
+
readonly file: {
|
|
233
|
+
readonly type: "string";
|
|
234
|
+
};
|
|
235
|
+
readonly severity: {
|
|
236
|
+
readonly enum: readonly ["critical", "high", "medium", "low", "info"];
|
|
237
|
+
};
|
|
238
|
+
readonly confidence: {
|
|
239
|
+
readonly type: "number";
|
|
240
|
+
readonly minimum: 0;
|
|
241
|
+
readonly maximum: 1;
|
|
242
|
+
};
|
|
243
|
+
readonly evidence: {
|
|
244
|
+
readonly type: "array";
|
|
245
|
+
readonly items: {
|
|
246
|
+
readonly type: "string";
|
|
247
|
+
};
|
|
248
|
+
};
|
|
249
|
+
readonly verdict: {
|
|
250
|
+
readonly enum: readonly ["upheld", "refuted", "uncertain"];
|
|
251
|
+
};
|
|
252
|
+
readonly refutations: {
|
|
253
|
+
readonly type: "array";
|
|
254
|
+
readonly items: {
|
|
255
|
+
readonly type: "string";
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
};
|
|
259
|
+
};
|
|
260
|
+
readonly 'coverage-gap': {
|
|
261
|
+
readonly $schema: "http://json-schema.org/draft-07/schema#";
|
|
262
|
+
readonly $id: "https://agentic-qe.dev/schemas/coverage-gap.schema.json";
|
|
263
|
+
readonly title: "CoverageGap";
|
|
264
|
+
readonly type: "object";
|
|
265
|
+
readonly required: readonly ["contract", "file", "riskScore", "suggestedTests"];
|
|
266
|
+
readonly additionalProperties: true;
|
|
267
|
+
readonly properties: {
|
|
268
|
+
readonly contract: {
|
|
269
|
+
readonly const: "coverage-gap@1";
|
|
270
|
+
};
|
|
271
|
+
readonly file: {
|
|
272
|
+
readonly type: "string";
|
|
273
|
+
readonly minLength: 1;
|
|
274
|
+
};
|
|
275
|
+
readonly rangeStart: {
|
|
276
|
+
readonly type: "integer";
|
|
277
|
+
readonly minimum: 1;
|
|
278
|
+
};
|
|
279
|
+
readonly rangeEnd: {
|
|
280
|
+
readonly type: "integer";
|
|
281
|
+
readonly minimum: 1;
|
|
282
|
+
};
|
|
283
|
+
readonly riskScore: {
|
|
284
|
+
readonly type: "number";
|
|
285
|
+
readonly minimum: 0;
|
|
286
|
+
readonly maximum: 1;
|
|
287
|
+
};
|
|
288
|
+
readonly suggestedTests: {
|
|
289
|
+
readonly type: "array";
|
|
290
|
+
readonly items: {
|
|
291
|
+
readonly type: "string";
|
|
292
|
+
};
|
|
293
|
+
};
|
|
294
|
+
};
|
|
295
|
+
};
|
|
296
|
+
};
|
|
297
|
+
//# sourceMappingURL=verdicts.d.ts.map
|