agentic-qe 3.14.6 → 3.14.8
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/helpers/.helpers-version +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +18 -9
- package/.claude/helpers/helpers.manifest.json +6 -5
- package/.claude/helpers/hook-handler.cjs +40 -12
- package/.claude/helpers/memory.cjs +86 -0
- package/.claude/helpers/router.cjs +105 -0
- package/.claude/helpers/session.cjs +166 -0
- package/.claude/helpers/statusline.cjs +73 -621
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +204 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2a/notifications/retry-queue.js +5 -0
- package/dist/adapters/claude-flow/pretrain-bridge.js +3 -2
- package/dist/agents/claim-verifier/verifiers/file-verifier.js +3 -2
- package/dist/cli/bundle.js +8 -8
- package/dist/cli/chunks/adapter-XYCOXQCC.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-2YGML6OU.js → agent-booster-wasm-67OKGDGZ.js} +2 -2
- package/dist/cli/chunks/{agent-handler-D5SSQYNU.js → agent-handler-4HZEQ3WQ.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-YHPLTITV.js → agent-memory-branch-IBHZQSRN.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-DTJCROTG.js +2 -0
- package/dist/cli/chunks/{arena-7BGOXGXO.js → arena-EJBIGSF4.js} +2 -2
- package/dist/cli/chunks/{arena-MCE6EU7K.js → arena-LCLRGUIK.js} +4 -4
- package/dist/cli/chunks/{audit-BMWTQECB.js → audit-PY4JNDQQ.js} +3 -3
- package/dist/cli/chunks/base-5TQ34GMD.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-PMUNGASU.js → better-sqlite3-2JG5K6XT.js} +2 -2
- package/dist/cli/chunks/{brain-handler-QPUFYX7F.js → brain-handler-3UYK55GA.js} +4 -4
- package/dist/cli/chunks/{branch-enumerator-WKFDGRN4.js → branch-enumerator-GOSWOX46.js} +2 -2
- package/dist/cli/chunks/{browser-VY5HKH5X.js → browser-DC2JV47Z.js} +2 -2
- package/dist/cli/chunks/browser-workflow-KWX4ESTJ.js +2 -0
- package/dist/cli/chunks/{chunk-FWASDOT2.js → chunk-25EEIAHS.js} +2 -2
- package/dist/cli/chunks/{chunk-P6OYS755.js → chunk-3576QGPP.js} +1 -1
- package/dist/cli/chunks/{chunk-2TMWAQQ3.js → chunk-3EKG7HFV.js} +4 -4
- package/dist/cli/chunks/{chunk-QZANMBIT.js → chunk-3FCHH4VP.js} +1 -1
- package/dist/cli/chunks/{chunk-CD542DNJ.js → chunk-3S5IIK32.js} +1 -1
- package/dist/cli/chunks/{chunk-5VFPCSK7.js → chunk-3X2JSW3R.js} +1 -1
- package/dist/cli/chunks/{chunk-D45SG6CP.js → chunk-4HXFPBAA.js} +1 -1
- package/dist/cli/chunks/{chunk-JVNTSNWU.js → chunk-4PY44TKH.js} +2 -2
- package/dist/cli/chunks/{chunk-DZ3AUAAB.js → chunk-4RNCVSVN.js} +2 -2
- package/dist/cli/chunks/{chunk-JBTPOIAC.js → chunk-56M4QNXU.js} +2 -2
- package/dist/cli/chunks/{chunk-H52HZ67P.js → chunk-5X4HDW5W.js} +2 -2
- package/dist/cli/chunks/{chunk-UNFFDHER.js → chunk-673XJBGW.js} +10 -32
- package/dist/cli/chunks/{chunk-RTFO5UQH.js → chunk-6F7MFHTY.js} +2 -2
- package/dist/cli/chunks/{chunk-Y3LZ35OG.js → chunk-6GJWT2OY.js} +2 -2
- package/dist/cli/chunks/{chunk-JXGFRBUO.js → chunk-6GNWVPMR.js} +2 -2
- package/dist/cli/chunks/{chunk-3EA536JF.js → chunk-6VTC3OHD.js} +2 -2
- package/dist/cli/chunks/{chunk-W6HXLH5G.js → chunk-775WGWLL.js} +3 -3
- package/dist/cli/chunks/{chunk-TVYY3OCX.js → chunk-77WL5HQW.js} +1 -1
- package/dist/cli/chunks/chunk-7STWD4KJ.js +3 -0
- package/dist/cli/chunks/{chunk-YSLL6VSL.js → chunk-7TNCEVWX.js} +2 -2
- package/dist/cli/chunks/{chunk-Z7WODOTH.js → chunk-7X3LMTRA.js} +2 -2
- package/dist/cli/chunks/{chunk-RZZCUIAI.js → chunk-A53MMSGC.js} +2 -2
- package/dist/cli/chunks/{chunk-QW6VMTBR.js → chunk-A5CLVZC3.js} +2 -2
- package/dist/cli/chunks/{chunk-IG5GNEC6.js → chunk-AEYJ4ZLA.js} +1 -1
- package/dist/cli/chunks/{chunk-NMAIY4PX.js → chunk-AJ5PCJQ2.js} +11 -11
- package/dist/cli/chunks/{chunk-WO4QMXIG.js → chunk-AJMAKUS3.js} +2 -2
- package/dist/cli/chunks/{chunk-2NPKIBAZ.js → chunk-AOD2ES44.js} +2 -2
- package/dist/cli/chunks/chunk-AR2S4DOB.js +2 -0
- package/dist/cli/chunks/{chunk-257E2A5M.js → chunk-AUFV2G2J.js} +5 -5
- package/dist/cli/chunks/{chunk-BVR7RMC5.js → chunk-B2QKBQYD.js} +1 -1
- package/dist/cli/chunks/{chunk-B6D2CHEH.js → chunk-BCCSV3RH.js} +1 -1
- package/dist/cli/chunks/{chunk-2YXGBZWV.js → chunk-BFIXUKOR.js} +1 -1
- package/dist/cli/chunks/chunk-BHPTHC5O.js +4 -0
- package/dist/cli/chunks/{chunk-AIRGNL55.js → chunk-BITFGVZ4.js} +2 -2
- package/dist/cli/chunks/{chunk-MBRHSU6W.js → chunk-BL6273KR.js} +10 -10
- package/dist/cli/chunks/{chunk-SMDN3BQZ.js → chunk-BOIUENWW.js} +1 -1
- package/dist/cli/chunks/{chunk-YS4FCTWF.js → chunk-BT3MI2BW.js} +1 -1
- package/dist/cli/chunks/{chunk-JZOS5FCX.js → chunk-BTBJ2NLH.js} +2 -2
- package/dist/cli/chunks/{chunk-CCK4BF76.js → chunk-BUVJIVFG.js} +1 -1
- package/dist/cli/chunks/{chunk-2JVWITNK.js → chunk-BZIPW2PA.js} +56 -80
- package/dist/cli/chunks/{chunk-BPEDWS6O.js → chunk-C647D42G.js} +2 -2
- package/dist/cli/chunks/{chunk-6U7LNMWZ.js → chunk-CBWM5NOO.js} +3 -3
- package/dist/cli/chunks/{chunk-72KXSMWI.js → chunk-CIEXUYY7.js} +1 -1
- package/dist/cli/chunks/{chunk-SE4WIB26.js → chunk-CLUHGBLN.js} +4 -4
- package/dist/cli/chunks/{chunk-JIXUMYKZ.js → chunk-CQEWL32R.js} +1 -1
- package/dist/cli/chunks/{chunk-CM7U6TAX.js → chunk-CXUC7YKA.js} +2 -2
- package/dist/cli/chunks/{chunk-7LPR6HJG.js → chunk-D2Y36V5J.js} +2 -2
- package/dist/cli/chunks/{chunk-BJTJLJRZ.js → chunk-DSJJHPPS.js} +4 -4
- package/dist/cli/chunks/{chunk-ZVWVV4EX.js → chunk-DZHXCOSK.js} +1 -1
- package/dist/cli/chunks/{chunk-7Z5LHRC3.js → chunk-EBV3WFIR.js} +2 -2
- package/dist/cli/chunks/{chunk-KNNISEDY.js → chunk-EKO5QL2B.js} +1 -1
- package/dist/cli/chunks/{chunk-XAS3XRYM.js → chunk-EMOZ5O5S.js} +1 -1
- package/dist/cli/chunks/{chunk-62N4NUJH.js → chunk-ES7TAJRJ.js} +2 -2
- package/dist/cli/chunks/chunk-EXQGHTPD.js +65 -0
- package/dist/cli/chunks/{chunk-Q7EAGKAE.js → chunk-F2WAB4WK.js} +2 -2
- package/dist/cli/chunks/{chunk-L4RUBPLR.js → chunk-F57FTFWS.js} +2 -2
- package/dist/cli/chunks/{chunk-GGRHV6D7.js → chunk-F6JJNBE5.js} +1 -1
- package/dist/cli/chunks/{chunk-3EZOZN25.js → chunk-FRC7AFB4.js} +2 -2
- package/dist/cli/chunks/{chunk-RSXXCL4A.js → chunk-G36RZF2Y.js} +1 -1
- package/dist/cli/chunks/{chunk-ZSPU4MOS.js → chunk-G3C7Z6FO.js} +2 -2
- package/dist/cli/chunks/{chunk-SNOBH4AZ.js → chunk-GA63ESNT.js} +2 -2
- package/dist/cli/chunks/{chunk-HNFVJP4I.js → chunk-GHMJFICO.js} +2 -2
- package/dist/cli/chunks/{chunk-7D3V65N5.js → chunk-GK5WLUX3.js} +1 -1
- package/dist/cli/chunks/{chunk-RETBYIAC.js → chunk-GQJ4QDEN.js} +6 -6
- package/dist/cli/chunks/chunk-GVLRE3BV.js +12 -0
- package/dist/cli/chunks/{chunk-MW2GGZZ5.js → chunk-H5UH234L.js} +1 -1
- package/dist/cli/chunks/{chunk-HM6ZSCPI.js → chunk-HBAFXWSO.js} +1 -1
- package/dist/cli/chunks/{chunk-DHVX5UB2.js → chunk-HE3BDBAO.js} +2 -2
- package/dist/cli/chunks/{chunk-YFBSPLJG.js → chunk-HHANMCD2.js} +1 -1
- package/dist/cli/chunks/chunk-HPVYJ6JH.js +2 -0
- package/dist/cli/chunks/{chunk-PX5YDCRH.js → chunk-I6NZFBT3.js} +3 -3
- package/dist/cli/chunks/{chunk-5J6W7SIA.js → chunk-ISBOHF6Y.js} +1 -1
- package/dist/cli/chunks/{chunk-UCFQALXO.js → chunk-J24AJEDE.js} +2 -2
- package/dist/cli/chunks/{chunk-FBMN7B46.js → chunk-J5HTQHJK.js} +2 -2
- package/dist/cli/chunks/{chunk-GPYVDFB3.js → chunk-JDOVO4E4.js} +205 -195
- package/dist/cli/chunks/chunk-JQAJUXRE.js +2 -0
- package/dist/cli/chunks/{chunk-RG52OKAM.js → chunk-JRK5GX56.js} +1 -1
- package/dist/cli/chunks/{chunk-I33ERSGB.js → chunk-JRLZ7LZ3.js} +2 -2
- package/dist/cli/chunks/{chunk-NQZ5AR3D.js → chunk-JTOFLDU7.js} +2 -2
- package/dist/cli/chunks/{chunk-NHWGMJAP.js → chunk-K6EOHGKS.js} +2 -2
- package/dist/cli/chunks/{chunk-5QQSIGUA.js → chunk-KKXH25IH.js} +2 -2
- package/dist/cli/chunks/{chunk-VGFFFKGK.js → chunk-KNSQWM2E.js} +2 -2
- package/dist/cli/chunks/{chunk-B6MOJC3X.js → chunk-L5T32SRF.js} +1 -1
- package/dist/cli/chunks/{chunk-WGM35YWL.js → chunk-LKFBW2QM.js} +2 -2
- package/dist/cli/chunks/{chunk-AJRUJAAK.js → chunk-LMAI74EP.js} +1 -1
- package/dist/cli/chunks/{chunk-C6KWXUFJ.js → chunk-LQVS5IWH.js} +2 -2
- package/dist/cli/chunks/{chunk-H5BS5VH7.js → chunk-LRGTPUJA.js} +2 -2
- package/dist/cli/chunks/{chunk-3HZS4M3O.js → chunk-LTHV4PIG.js} +2 -2
- package/dist/cli/chunks/{chunk-7CUQCCMD.js → chunk-M7QKCHLQ.js} +2 -2
- package/dist/cli/chunks/{chunk-CF2ISEOJ.js → chunk-N3ASALOL.js} +2 -2
- package/dist/cli/chunks/{chunk-ZCRTRYXK.js → chunk-NEXBTLN6.js} +2 -2
- package/dist/cli/chunks/{chunk-VMNWDJIZ.js → chunk-NJEEKYEP.js} +3 -3
- package/dist/cli/chunks/{chunk-ZEV3YTO7.js → chunk-NWUFTLSF.js} +2 -2
- package/dist/cli/chunks/{chunk-MQROI74N.js → chunk-O4QB2GFL.js} +2 -2
- package/dist/cli/chunks/{chunk-GDSXITFH.js → chunk-OA75C4HY.js} +2 -2
- package/dist/cli/chunks/{chunk-SESK3ARK.js → chunk-OVMG6EEF.js} +2 -2
- package/dist/cli/chunks/{chunk-MUOG6QXR.js → chunk-OX7MJFLC.js} +2 -2
- package/dist/cli/chunks/{chunk-ELLBS5RP.js → chunk-OZJQN7YE.js} +2 -2
- package/dist/cli/chunks/{chunk-D6CJIGRU.js → chunk-PFXCRRR6.js} +55 -55
- package/dist/cli/chunks/{chunk-ZL6SYKUK.js → chunk-PVJLQ2YZ.js} +1 -1
- package/dist/cli/chunks/{chunk-6LIHFV7O.js → chunk-QDRFLM77.js} +2 -2
- package/dist/cli/chunks/{chunk-H6ZM3PUT.js → chunk-QH7C4PTX.js} +1 -1
- package/dist/cli/chunks/chunk-QKM4XT2F.js +2 -0
- package/dist/cli/chunks/{chunk-V4DM6ELU.js → chunk-QP7EKLWU.js} +2 -2
- package/dist/cli/chunks/{chunk-BAMN2CHI.js → chunk-QPACHVDI.js} +1 -1
- package/dist/cli/chunks/{chunk-QDFTT3RF.js → chunk-QQVE65ER.js} +2 -2
- package/dist/cli/chunks/{chunk-LL3IGZBI.js → chunk-QYCZYJH7.js} +2 -2
- package/dist/cli/chunks/{chunk-DUYOVM5I.js → chunk-R6I5I724.js} +2 -2
- package/dist/cli/chunks/{chunk-ENGZ4D5V.js → chunk-RJJIPTVH.js} +2 -2
- package/dist/cli/chunks/{chunk-7NITCZWD.js → chunk-RM6OC35G.js} +1 -1
- package/dist/cli/chunks/{chunk-Q5XTSMWR.js → chunk-RTD4U7IW.js} +2 -2
- package/dist/cli/chunks/{chunk-DBDPRORT.js → chunk-SKJQKOFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ICTXTNQZ.js → chunk-SMBGK7XI.js} +1 -1
- package/dist/cli/chunks/{chunk-PI7TJS62.js → chunk-SPS472C5.js} +2 -2
- package/dist/cli/chunks/{chunk-IV5UZOHH.js → chunk-SUNXA2UR.js} +2 -2
- package/dist/cli/chunks/{chunk-IB27QACC.js → chunk-SVP3BP52.js} +2 -2
- package/dist/cli/chunks/{chunk-5OOMJGFN.js → chunk-T4WQPE77.js} +1 -1
- package/dist/cli/chunks/{chunk-66VWCR67.js → chunk-T53ZN4NO.js} +2 -2
- package/dist/cli/chunks/chunk-T6W2EYHC.js +2 -0
- package/dist/cli/chunks/{chunk-EAY2JMZG.js → chunk-T7YCNOW5.js} +2 -2
- package/dist/cli/chunks/{chunk-FZOBD67M.js → chunk-TCQWVVSR.js} +1 -1
- package/dist/cli/chunks/{chunk-SJUXE4IC.js → chunk-TGRHO4ES.js} +2 -2
- package/dist/cli/chunks/{chunk-6RE3X4V5.js → chunk-TP7L4EX6.js} +2 -2
- package/dist/cli/chunks/{chunk-6SQM2MUX.js → chunk-TT45RCLN.js} +2 -2
- package/dist/cli/chunks/{chunk-AVBJYI5I.js → chunk-TUZNWRYC.js} +1 -1
- package/dist/cli/chunks/{chunk-YHKEDEAA.js → chunk-U2QTL5T2.js} +3 -3
- package/dist/cli/chunks/chunk-U64QORFO.js +2 -0
- package/dist/cli/chunks/{chunk-BBT64TII.js → chunk-UHLZKH6B.js} +4 -4
- package/dist/cli/chunks/{chunk-GSF6MB64.js → chunk-UIWXKRTK.js} +2 -2
- package/dist/cli/chunks/{chunk-JMONHE4B.js → chunk-UNFE4RPV.js} +1 -1
- package/dist/cli/chunks/{chunk-DPYSUDAO.js → chunk-UQGIC5OX.js} +1 -1
- package/dist/cli/chunks/{chunk-IAF6T27S.js → chunk-VAXTPLO3.js} +2 -2
- package/dist/cli/chunks/{chunk-6SH5VZUD.js → chunk-VCSNNLWL.js} +2 -2
- package/dist/cli/chunks/chunk-VSPNIDQK.js +21 -0
- package/dist/cli/chunks/{chunk-6OS76PHI.js → chunk-VV2JVYOI.js} +2 -2
- package/dist/cli/chunks/{chunk-IQO7UCFR.js → chunk-VW7AXJQS.js} +2 -2
- package/dist/cli/chunks/{chunk-UQ32JHES.js → chunk-W7JUD4EZ.js} +2 -2
- package/dist/cli/chunks/chunk-WFKE7NZ5.js +12 -0
- package/dist/cli/chunks/{chunk-RFNPJK6N.js → chunk-WVEHKAIH.js} +3 -3
- package/dist/cli/chunks/{chunk-64VGZQLB.js → chunk-XAESN54Q.js} +1 -1
- package/dist/cli/chunks/{chunk-BMAPORJ7.js → chunk-XECZYQT5.js} +2 -2
- package/dist/cli/chunks/chunk-XFT4FYTC.js +2 -0
- package/dist/cli/chunks/{chunk-Y3UOUNHM.js → chunk-YHX74M7C.js} +2 -2
- package/dist/cli/chunks/chunk-YIWBJ637.js +2 -0
- package/dist/cli/chunks/{chunk-SDRHUMJB.js → chunk-Z5UZOYQS.js} +2 -2
- package/dist/cli/chunks/{chunk-7J6QC567.js → chunk-Z6G3QVZ4.js} +12 -12
- package/dist/cli/chunks/ci-5LIV2HW5.js +82 -0
- package/dist/cli/chunks/{ci-output-LDT24TS3.js → ci-output-UO5BDFU4.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-F5V4KITU.js → circuit-breaker-UQDPXYRD.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-DT6WQQVD.js → claude-flow-setup-62QES3QX.js} +2 -2
- package/dist/cli/chunks/client-AJZKCP4I.js +2 -0
- package/dist/cli/chunks/{cline-installer-G7TJOAEX.js → cline-installer-X7VZTSZG.js} +2 -2
- package/dist/cli/chunks/{code-PGE6A42V.js → code-H3BF4L4H.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-RNITH372.js → code-index-extractor-BJGFZGGL.js} +2 -2
- package/dist/cli/chunks/{codex-installer-LBX77AI3.js → codex-installer-KVZWKU6S.js} +2 -2
- package/dist/cli/chunks/{completions-4AWLAARX.js → completions-YMILE6V7.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-ZPNSS476.js → complexity-analyzer-J26N2PWG.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-UAPWX6OA.js → continuedev-installer-MAR42OV7.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-BJN2YJGI.js → copilot-installer-CVOJF6OT.js} +2 -2
- package/dist/cli/chunks/core-handlers-MQHEMGDV.js +2 -0
- package/dist/cli/chunks/{cost-tracker-MHP2VJ63.js → cost-tracker-SXLWXE55.js} +2 -2
- package/dist/cli/chunks/{coverage-PQB4IEFG.js → coverage-D7HCHFP3.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-3QNMZV5R.js +2 -0
- package/dist/cli/chunks/{cursor-installer-ZXBWYAS3.js → cursor-installer-X37VHIKW.js} +2 -2
- package/dist/cli/chunks/{daemon-64C7R6OJ.js → daemon-JN7SOH6F.js} +4 -4
- package/dist/cli/chunks/{daemon-N2BEGEFY.js → daemon-LIW47IDM.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-SPZDAPNL.js → dag-attention-scheduler-QCHHIZBT.js} +2 -2
- package/dist/cli/chunks/{detect-LXJBSSZW.js → detect-WRFCWAX5.js} +2 -2
- package/dist/cli/chunks/{dist-node-U3TKZ2IZ.js → dist-node-6FWT4XZO.js} +2 -2
- package/dist/cli/chunks/{domain-handler-3DDWUVSR.js → domain-handler-SNFPNMRT.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-JJVWI4OQ.js → domain-plugins-MXKHH62P.js} +2 -2
- package/dist/cli/chunks/domain-transfer-47UJNERX.js +2 -0
- package/dist/cli/chunks/dream-OSWAITPT.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-JPAR7TXX.js → embed-and-insert-pattern-LZFAUNBQ.js} +2 -2
- package/dist/cli/chunks/{eval-SOLG23EA.js → eval-AMUXTMJB.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-T7G2VOOD.js → experience-capture-middleware-3D65TR2C.js} +4 -4
- package/dist/cli/chunks/{fast-paths-32N3ELI4.js → fast-paths-Y7BBMM56.js} +2 -2
- package/dist/cli/chunks/{feature-flags-APJDQ4N7.js → feature-flags-JMQQ7JW4.js} +2 -2
- package/dist/cli/chunks/{feature-flags-NAHKLDRN.js → feature-flags-VESRRQ6V.js} +2 -2
- package/dist/cli/chunks/{file-discovery-YKVM3MDB.js → file-discovery-JJKQQUV6.js} +2 -2
- package/dist/cli/chunks/{fleet-55M5CJS4.js → fleet-WIGHICJF.js} +4 -4
- package/dist/cli/chunks/{gnn-wrapper-UD6E6S6Z.js → gnn-wrapper-BFNPETTT.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-OYVW3VSC.js → heartbeat-handler-HDXKTGUI.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-BVRVVIE2.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-MZTHXULS.js +2 -0
- package/dist/cli/chunks/hnsw-index-KHEX4VDG.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-HBYIS3ZW.js → hnsw-legacy-bridge-6A7OTAPT.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-EQPM42OU.js → hnswlib-node-LKV2H47B.js} +2 -2
- package/dist/cli/chunks/{hooks-5ZSSJWO6.js → hooks-KDSFYQQG.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-2B3LCLR4.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-XBGVQ4PD.js → hypergraph-engine-GDLPEPUC.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-CAWAQ673.js → hypergraph-handler-4UMFA2EW.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-4R4VWOGQ.js +2 -0
- package/dist/cli/chunks/{init-handler-PRHXSARK.js → init-handler-4GCHPQHD.js} +16 -14
- package/dist/cli/chunks/init-wizard-TAOPXHHD.js +2 -0
- package/dist/cli/chunks/kernel-6I6VZUWY.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-F7LXBM7I.js → kilocode-installer-HJZMT2G5.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-NM723ZRG.js → kiro-installer-WUPY67HG.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-KFMTTUR5.js +2 -0
- package/dist/cli/chunks/{learning-5QYIDHH3.js → learning-AXKIS7IG.js} +4 -4
- package/dist/cli/chunks/{llm-router-43HKWPSX.js → llm-router-HUDPNZLJ.js} +4 -4
- package/dist/cli/chunks/llm-router-service-2D74XVM3.js +2 -0
- package/dist/cli/chunks/{load-5YDBWSCS.js → load-RM44POD7.js} +2 -2
- package/dist/cli/chunks/load-test-53FWOWNS.js +2 -0
- package/dist/cli/chunks/{mcp-UMAPMNMY.js → mcp-5JVQRBOP.js} +2 -2
- package/dist/cli/chunks/{memory-FWCPCQFP.js → memory-VGZ2V6PL.js} +5 -5
- package/dist/cli/chunks/memory-backend-KFJDDPEZ.js +2 -0
- package/dist/cli/chunks/memory-handlers-EI537Z32.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-2XTBGLE4.js → multi-model-executor-WPRKCSCM.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-GIXOJ6NS.js → opencode-installer-YAJMRCQO.js} +2 -2
- package/dist/cli/chunks/{orchestrator-VW6BKHLI.js → orchestrator-MUGWBUYP.js} +17 -17
- package/dist/cli/chunks/pattern-null-store-7DMU5CJ4.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-7CEUC3J7.js → pattern-usage-recorder-ZQJJ2YNG.js} +2 -2
- package/dist/cli/chunks/{pipeline-IGUQPPPO.js → pipeline-F4DXDUDC.js} +2 -2
- package/dist/cli/chunks/{platform-2P636I7B.js → platform-HI3A3OWF.js} +2 -2
- package/dist/cli/chunks/{plugin-NY6SWDPE.js → plugin-XRITPTR7.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-2UUDTIO2.js → prime-radiant-advanced-wasm-HHNJP7CQ.js} +2 -2
- package/dist/cli/chunks/{project-root-IOISG5KX.js → project-root-2VN4WO2A.js} +2 -2
- package/dist/cli/chunks/protocol-executor-2EMTBTMG.js +2 -0
- package/dist/cli/chunks/{protocol-handler-ZTPCRQ5W.js → protocol-handler-ZEVHSEBG.js} +2 -2
- package/dist/cli/chunks/{prove-SQX5A3IG.js → prove-C4BLZWBS.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-VZHZZPHE.js +2 -0
- package/dist/cli/chunks/{quality-DROILKRY.js → quality-M3DTE4KK.js} +2 -2
- package/dist/cli/chunks/quality-gate-V6KS7ML3.js +7 -0
- package/dist/cli/chunks/queen-coordinator-7MYTTUHI.js +2 -0
- package/dist/cli/chunks/{real-embeddings-P5U3MGYC.js → real-embeddings-YWSE3IRT.js} +2 -2
- package/dist/cli/chunks/{ref-validation-KY73NQXD.js → ref-validation-ZWOTFA3T.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-6JPPRB3W.js → roocode-installer-GJBIWETD.js} +2 -2
- package/dist/cli/chunks/router-ZD4LXAWA.js +2 -0
- package/dist/cli/chunks/routing-feedback-FSLMDVGD.js +2 -0
- package/dist/cli/chunks/{routing-handler-VTJIVFUO.js → routing-handler-CFYLGNAR.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-C6RPSJJO.js → ruvector-commands-EDKG456B.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-LTKTDRFS.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-IF24EVC5.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-R53URRIO.js → rvf-migration-coordinator-ZMEYMAI6.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-E6JNBKMZ.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-MMXN5TEJ.js → rvf-store-integrity-AH6PNJP6.js} +2 -2
- package/dist/cli/chunks/safe-db-F6TRB5KZ.js +2 -0
- package/dist/cli/chunks/schedule-HBD4BYTE.js +2 -0
- package/dist/cli/chunks/scheduler-6FYWPMQC.js +2 -0
- package/dist/cli/chunks/{security-3B3R2NL4.js → security-ZU2GW3ZM.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-VIJB7JUS.js → shared-rvf-adapter-5FOVSL3T.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-UVWGDUWC.js → shared-rvf-dual-writer-IO4DC4XV.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-DOU72F5Z.js +2 -0
- package/dist/cli/chunks/{standalone-memory-M4LWAAYZ.js → standalone-memory-3UXDZ7HI.js} +2 -2
- package/dist/cli/chunks/{status-handler-YYFV6OZL.js → status-handler-264CHTWS.js} +2 -2
- package/dist/cli/chunks/{structural-health-27E6LLKB.js → structural-health-E2QPUOZE.js} +2 -2
- package/dist/cli/chunks/{sync-J3LJ56WN.js → sync-2ACMWM7D.js} +2 -2
- package/dist/cli/chunks/sync-N2L2OST4.js +2 -0
- package/dist/cli/chunks/{task-handler-4MCEBQZL.js → task-handler-IB5CVOTY.js} +2 -2
- package/dist/cli/chunks/task-handlers-QBMYNJHE.js +9 -0
- package/dist/cli/chunks/test-7RGLRDSP.js +33 -0
- package/dist/cli/chunks/{test-scheduling-ZJBFRZ3J.js → test-scheduling-RJABJT2W.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-JVHMHB72.js +2 -0
- package/dist/cli/chunks/{token-usage-3X5WMTG2.js → token-usage-3ECHQVCY.js} +2 -2
- package/dist/cli/chunks/{transformers-MVL4C5IX.js → transformers-KJH3IJWI.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-SLW65ZFO.js → tree-sitter-wasm-parser-XN6PFI32.js} +2 -2
- package/dist/cli/chunks/{types-TG5P3CRS.js → types-5BAPXOLS.js} +2 -2
- package/dist/cli/chunks/unified-memory-GHAYAXWZ.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-CCC63YXT.js +2 -0
- package/dist/cli/chunks/unified-persistence-HKRHI5PG.js +2 -0
- package/dist/cli/chunks/{upgrade-ETBHDEPY.js → upgrade-S5NFQZID.js} +2 -2
- package/dist/cli/chunks/{validate-C2A73LZK.js → validate-BIBWOLJD.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-67XN42ML.js → validate-swarm-WAA3LBHH.js} +2 -2
- package/dist/cli/chunks/visual-security-APOXJ3Q3.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-USJN77P4.js → web-tree-sitter-OTBQTHAV.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-5GGZXGJW.js → windsurf-installer-NNQ22EW6.js} +2 -2
- package/dist/cli/chunks/witness-chain-7IP5IJGT.js +2 -0
- package/dist/cli/chunks/{witness-chain-IWS5ZHHL.js → witness-chain-E7MUBOJW.js} +2 -2
- package/dist/cli/chunks/witness-chain-repair-FW4QSN4C.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-3GEADWPE.js → witness-chain-verifier-YMROEBVL.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-ZWEIK3VJ.js → witness-key-manager-4CGRNDMJ.js} +2 -2
- package/dist/cli/chunks/{workflow-KHMVVBBA.js → workflow-4VRSTRAN.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-2HNW5ZMQ.js +2 -0
- package/dist/cli/chunks/wrappers-4M4UTGEU.js +2 -0
- package/dist/cli/commands/ci.js +18 -7
- package/dist/cli/commands/quality-gate.js +6 -1
- package/dist/cli/commands/test.js +18 -3
- package/dist/cli/handlers/init-handler.d.ts +2 -0
- package/dist/cli/handlers/init-handler.js +8 -2
- package/dist/cli/index.js +15 -2
- package/dist/cli/process-store-cleanup.d.ts +7 -0
- package/dist/cli/process-store-cleanup.js +27 -0
- package/dist/cli/utils/ci-config.d.ts +3 -3
- package/dist/cli/utils/ci-config.js +202 -68
- package/dist/coordination/handlers/test-execution-handlers.js +13 -8
- package/dist/coordination/index.d.ts +1 -1
- package/dist/coordination/queen-event-handlers.js +9 -6
- package/dist/coordination/result-saver.js +1 -1
- package/dist/coordination/services/index.d.ts +1 -1
- package/dist/coordination/services/task-audit-logger.d.ts +38 -13
- package/dist/coordination/services/task-audit-logger.js +33 -5
- package/dist/coordination/task-executor.d.ts +5 -0
- package/dist/coordination/task-executor.js +10 -5
- package/dist/domains/quality-assessment/quality-evidence.d.ts +3 -1
- package/dist/domains/quality-assessment/quality-evidence.js +7 -2
- package/dist/domains/test-execution/services/retry-handler.js +32 -13
- package/dist/domains/test-execution/services/test-executor.d.ts +3 -3
- package/dist/domains/test-execution/services/test-executor.js +66 -22
- package/dist/domains/test-generation/coordinator.js +6 -5
- package/dist/domains/test-generation/interfaces.d.ts +11 -1
- package/dist/domains/test-generation/services/behavior-example-validation.d.ts +36 -0
- package/dist/domains/test-generation/services/behavior-example-validation.js +89 -0
- package/dist/domains/test-generation/services/behavior-examples.d.ts +8 -0
- package/dist/domains/test-generation/services/behavior-examples.js +65 -0
- package/dist/domains/test-generation/services/test-generator.d.ts +1 -1
- package/dist/domains/test-generation/services/test-generator.js +59 -30
- package/dist/domains/visual-accessibility/services/axe-core-audit.d.ts +0 -15
- package/dist/domains/visual-accessibility/services/axe-core-audit.js +12 -10
- package/dist/init/browser-engine-installer.d.ts +5 -5
- package/dist/init/browser-engine-installer.js +28 -6
- package/dist/init/fleet-integration.js +3 -2
- package/dist/init/init-wizard-steps.js +3 -2
- package/dist/init/init-wizard.d.ts +2 -0
- package/dist/init/orchestrator.js +1 -0
- package/dist/init/phases/06-code-intelligence.js +6 -4
- package/dist/init/phases/09-assets.js +8 -18
- package/dist/init/phases/phase-interface.d.ts +2 -0
- package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +2 -5
- package/dist/integrations/ruvector/sona-persistence.d.ts +1 -0
- package/dist/integrations/ruvector/sona-persistence.js +74 -20
- package/dist/integrations/ruvector/sona-wrapper.d.ts +2 -0
- package/dist/integrations/ruvector/sona-wrapper.js +13 -0
- package/dist/integrations/vibium/client.d.ts +1 -0
- package/dist/integrations/vibium/client.js +24 -11
- package/dist/integrations/vibium/runtime.d.ts +14 -0
- package/dist/integrations/vibium/runtime.js +94 -0
- package/dist/kernel/memory-backend.js +5 -4
- package/dist/kernel/pattern-fts-self-heal.d.ts +63 -0
- package/dist/kernel/pattern-fts-self-heal.js +193 -0
- package/dist/kernel/process-lifecycle.d.ts +60 -0
- package/dist/kernel/process-lifecycle.js +91 -0
- package/dist/kernel/unified-memory-schemas.d.ts +15 -1
- package/dist/kernel/unified-memory-schemas.js +53 -25
- package/dist/kernel/unified-memory.js +34 -36
- package/dist/kernel/unified-persistence.js +12 -6
- package/dist/learning/aqe-learning-engine.js +3 -2
- package/dist/learning/experience-capture.d.ts +2 -1
- package/dist/learning/experience-capture.js +23 -8
- package/dist/learning/pattern-store.d.ts +1 -1
- package/dist/learning/pattern-store.js +27 -30
- package/dist/learning/qe-patterns.d.ts +6 -0
- package/dist/learning/qe-reasoning-bank.d.ts +1 -0
- package/dist/learning/qe-reasoning-bank.js +14 -4
- package/dist/learning/real-qe-reasoning-bank.d.ts +9 -4
- package/dist/learning/real-qe-reasoning-bank.js +28 -4
- package/dist/learning/rvf-pattern-store.js +19 -19
- package/dist/learning/sqlite-persistence.js +9 -24
- package/dist/mcp/bundle.js +545 -581
- package/dist/mcp/connection-pool.d.ts +2 -0
- package/dist/mcp/connection-pool.js +13 -2
- package/dist/mcp/entry.js +52 -6
- package/dist/mcp/handlers/domain-handler-configs.js +12 -4
- package/dist/mcp/handlers/memory-handlers.d.ts +1 -0
- package/dist/mcp/handlers/memory-handlers.js +16 -6
- package/dist/mcp/handlers/task-handlers.js +11 -7
- package/dist/mcp/protocol-server.js +47 -11
- package/dist/mcp/services/reasoning-bank-service.d.ts +6 -1
- package/dist/mcp/services/reasoning-bank-service.js +5 -1
- package/dist/mcp/tools/test-execution/e2e-execute.js +9 -1
- package/dist/mcp/tools/test-generation/generate.d.ts +6 -1
- package/dist/mcp/tools/test-generation/generate.js +8 -0
- package/dist/mcp/types.d.ts +8 -2
- package/dist/optimization/session-cache.js +13 -11
- package/dist/plugins/cache.js +10 -3
- package/dist/shared/embeddings/embedding-cache.js +4 -4
- package/dist/shared/error-utils.d.ts +15 -0
- package/dist/shared/error-utils.js +21 -0
- package/dist/shared/events/domain-events.d.ts +2 -1
- package/dist/shared/llm/cache.js +7 -10
- package/dist/shared/retry-engine.js +4 -0
- package/dist/shared/test-runner-process.d.ts +10 -0
- package/dist/shared/test-runner-process.js +210 -0
- package/dist/validation/quality-verdict.js +3 -2
- package/dist/workers/quality-daemon/priority-queue.js +4 -1
- package/package.json +10 -6
- package/dist/cli/chunks/adapter-UYOJPTOX.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-JR5AVQXR.js +0 -2
- package/dist/cli/chunks/base-DRZ2LS6X.js +0 -2
- package/dist/cli/chunks/browser-workflow-CJ7T3MXF.js +0 -2
- package/dist/cli/chunks/chunk-3NIG7S5W.js +0 -2
- package/dist/cli/chunks/chunk-4N23RFDU.js +0 -2
- package/dist/cli/chunks/chunk-AHKELLIO.js +0 -12
- package/dist/cli/chunks/chunk-DK4XN4CU.js +0 -2
- package/dist/cli/chunks/chunk-E6G2RD5H.js +0 -4
- package/dist/cli/chunks/chunk-MJS53PRX.js +0 -2
- package/dist/cli/chunks/chunk-PZPWRQ2M.js +0 -21
- package/dist/cli/chunks/chunk-QGA55PFM.js +0 -12
- package/dist/cli/chunks/chunk-SPV2VKC5.js +0 -3
- package/dist/cli/chunks/chunk-TCHGOB2N.js +0 -2
- package/dist/cli/chunks/chunk-UKA2KOXE.js +0 -2
- package/dist/cli/chunks/chunk-WCJBU2KI.js +0 -2
- package/dist/cli/chunks/chunk-Z6GGIRQQ.js +0 -65
- package/dist/cli/chunks/ci-W6K6G2KZ.js +0 -81
- package/dist/cli/chunks/client-KHWJT6FB.js +0 -2
- package/dist/cli/chunks/core-handlers-HING5RRG.js +0 -2
- package/dist/cli/chunks/cross-domain-router-PQTD6AZN.js +0 -2
- package/dist/cli/chunks/domain-transfer-M36KUJ2U.js +0 -2
- package/dist/cli/chunks/dream-WUGRSNCV.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-33XX5XNQ.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-XQPERX3H.js +0 -2
- package/dist/cli/chunks/hnsw-index-2GNXTWHH.js +0 -2
- package/dist/cli/chunks/hybrid-backend-CCF7URKI.js +0 -2
- package/dist/cli/chunks/impact-analyzer-HGKAZWIG.js +0 -2
- package/dist/cli/chunks/init-wizard-72MFBI3G.js +0 -2
- package/dist/cli/chunks/kernel-BRCBVMSK.js +0 -2
- package/dist/cli/chunks/knowledge-graph-DG44IPEI.js +0 -2
- package/dist/cli/chunks/llm-router-service-24KXFX32.js +0 -2
- package/dist/cli/chunks/load-test-N4TAYJY3.js +0 -2
- package/dist/cli/chunks/memory-backend-NVYFYVAU.js +0 -2
- package/dist/cli/chunks/memory-handlers-UTWCNCHL.js +0 -2
- package/dist/cli/chunks/pattern-null-store-SBPNYDBR.js +0 -2
- package/dist/cli/chunks/protocol-executor-IBYEII5Q.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-7IETWW6W.js +0 -2
- package/dist/cli/chunks/quality-gate-PWKWDJY2.js +0 -7
- package/dist/cli/chunks/queen-coordinator-NHUK2MWJ.js +0 -2
- package/dist/cli/chunks/router-SRSO3IHF.js +0 -2
- package/dist/cli/chunks/routing-feedback-PASRE5HY.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-4M4J67OU.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-TSXGT5LF.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-MOF3E7BR.js +0 -2
- package/dist/cli/chunks/safe-db-QJLFO33B.js +0 -2
- package/dist/cli/chunks/schedule-YIVXW5O2.js +0 -2
- package/dist/cli/chunks/scheduler-AON7DWSJ.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-75VHKKQB.js +0 -2
- package/dist/cli/chunks/sync-26CEGSTC.js +0 -2
- package/dist/cli/chunks/task-handlers-GYBAWKE2.js +0 -9
- package/dist/cli/chunks/test-MPC5HRH5.js +0 -33
- package/dist/cli/chunks/token-bootstrap-2Y2XITBX.js +0 -2
- package/dist/cli/chunks/unified-memory-UCQ6AB32.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-IXYUMKRR.js +0 -2
- package/dist/cli/chunks/unified-persistence-7E6JQ4FZ.js +0 -2
- package/dist/cli/chunks/vibium-NILGKHLN.js +0 -2
- package/dist/cli/chunks/visual-security-4VZXPEVG.js +0 -2
- package/dist/cli/chunks/witness-chain-JQA2VPZI.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-4UA7IPS3.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-GI5NQH7C.js +0 -2
- package/dist/cli/chunks/wrappers-N6XIK5PT.js +0 -2
|
@@ -21,6 +21,34 @@ export interface TaskAuditEntry {
|
|
|
21
21
|
readonly domain?: DomainName;
|
|
22
22
|
readonly details?: Record<string, unknown>;
|
|
23
23
|
}
|
|
24
|
+
/** An entry produced by this logger, positioned within its generation. */
|
|
25
|
+
export interface TaskAuditSequencedEntry extends TaskAuditEntry {
|
|
26
|
+
readonly sequence: number;
|
|
27
|
+
}
|
|
28
|
+
/** Filters select retained entries; they do not change retention metadata. */
|
|
29
|
+
export interface TaskAuditFilter {
|
|
30
|
+
operation?: TaskOperation;
|
|
31
|
+
taskId?: string;
|
|
32
|
+
agentId?: string;
|
|
33
|
+
domain?: DomainName;
|
|
34
|
+
fromTimestamp?: Date;
|
|
35
|
+
toTimestamp?: Date;
|
|
36
|
+
limit?: number;
|
|
37
|
+
}
|
|
38
|
+
/** Completeness of the bounded observation window since construction/clear. */
|
|
39
|
+
export interface TaskAuditWindow {
|
|
40
|
+
generation: string;
|
|
41
|
+
recordedEntries: number;
|
|
42
|
+
retainedEntries: number;
|
|
43
|
+
droppedEntries: number;
|
|
44
|
+
firstRetainedSequence: number | null;
|
|
45
|
+
lastRetainedSequence: number | null;
|
|
46
|
+
disposition: 'complete' | 'truncated';
|
|
47
|
+
}
|
|
48
|
+
/** Filtered entries with metadata for the entire retained window. */
|
|
49
|
+
export interface TaskAuditSnapshot extends TaskAuditWindow {
|
|
50
|
+
entries: TaskAuditSequencedEntry[];
|
|
51
|
+
}
|
|
24
52
|
/**
|
|
25
53
|
* Configuration for task audit logger
|
|
26
54
|
*/
|
|
@@ -41,6 +69,9 @@ export interface TaskAuditConfig {
|
|
|
41
69
|
export declare class TaskAuditLogger {
|
|
42
70
|
private readonly entries;
|
|
43
71
|
private readonly config;
|
|
72
|
+
private generation;
|
|
73
|
+
private recordedEntries;
|
|
74
|
+
private droppedEntries;
|
|
44
75
|
constructor(config?: Partial<TaskAuditConfig>);
|
|
45
76
|
/**
|
|
46
77
|
* Log a task operation
|
|
@@ -65,19 +96,13 @@ export declare class TaskAuditLogger {
|
|
|
65
96
|
/**
|
|
66
97
|
* Get audit entries with optional filtering
|
|
67
98
|
*/
|
|
68
|
-
getEntries(filter?:
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
limit?: number;
|
|
76
|
-
}): TaskAuditEntry[];
|
|
77
|
-
/**
|
|
78
|
-
* Get statistics about task operations
|
|
79
|
-
*/
|
|
80
|
-
getStatistics(): {
|
|
99
|
+
getEntries(filter?: TaskAuditFilter): TaskAuditSequencedEntry[];
|
|
100
|
+
/** Get selected entries without losing evidence of earlier evictions/resets. */
|
|
101
|
+
getSnapshot(filter?: TaskAuditFilter): TaskAuditSnapshot;
|
|
102
|
+
private getWindow;
|
|
103
|
+
/** Get counts for the retained window, with its completeness metadata. */
|
|
104
|
+
getStatistics(): TaskAuditWindow & {
|
|
105
|
+
basis: 'retained-window';
|
|
81
106
|
totalEntries: number;
|
|
82
107
|
operationCounts: Record<TaskOperation, number>;
|
|
83
108
|
taskCount: number;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* This replaces the full authorization service with simple audit logging
|
|
6
6
|
* for a local CLI tool where all agents are trusted.
|
|
7
7
|
*/
|
|
8
|
+
import { randomUUID } from 'node:crypto';
|
|
8
9
|
const DEFAULT_CONFIG = {
|
|
9
10
|
enableConsoleLog: true,
|
|
10
11
|
maxEntries: 1000,
|
|
@@ -19,14 +20,21 @@ const DEFAULT_CONFIG = {
|
|
|
19
20
|
export class TaskAuditLogger {
|
|
20
21
|
entries = [];
|
|
21
22
|
config;
|
|
23
|
+
generation = randomUUID();
|
|
24
|
+
recordedEntries = 0;
|
|
25
|
+
droppedEntries = 0;
|
|
22
26
|
constructor(config = {}) {
|
|
23
27
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
28
|
+
if (!Number.isSafeInteger(this.config.maxEntries) || this.config.maxEntries < 0) {
|
|
29
|
+
throw new RangeError('maxEntries must be a non-negative safe integer');
|
|
30
|
+
}
|
|
24
31
|
}
|
|
25
32
|
/**
|
|
26
33
|
* Log a task operation
|
|
27
34
|
*/
|
|
28
35
|
log(operation, taskId, options) {
|
|
29
36
|
const entry = {
|
|
37
|
+
sequence: ++this.recordedEntries,
|
|
30
38
|
timestamp: new Date(),
|
|
31
39
|
operation,
|
|
32
40
|
taskId,
|
|
@@ -37,7 +45,9 @@ export class TaskAuditLogger {
|
|
|
37
45
|
this.entries.push(entry);
|
|
38
46
|
// Trim if exceeds max
|
|
39
47
|
if (this.entries.length > this.config.maxEntries) {
|
|
40
|
-
|
|
48
|
+
const dropped = this.entries.length - this.config.maxEntries;
|
|
49
|
+
this.entries.splice(0, dropped);
|
|
50
|
+
this.droppedEntries += dropped;
|
|
41
51
|
}
|
|
42
52
|
// Console log if enabled
|
|
43
53
|
if (this.config.enableConsoleLog) {
|
|
@@ -102,11 +112,24 @@ export class TaskAuditLogger {
|
|
|
102
112
|
}
|
|
103
113
|
}
|
|
104
114
|
const limit = filter?.limit ?? result.length;
|
|
105
|
-
return result.slice(-limit);
|
|
115
|
+
return limit === 0 ? [] : result.slice(-limit);
|
|
106
116
|
}
|
|
107
|
-
/**
|
|
108
|
-
|
|
109
|
-
|
|
117
|
+
/** Get selected entries without losing evidence of earlier evictions/resets. */
|
|
118
|
+
getSnapshot(filter) {
|
|
119
|
+
return { ...this.getWindow(), entries: this.getEntries(filter) };
|
|
120
|
+
}
|
|
121
|
+
getWindow() {
|
|
122
|
+
return {
|
|
123
|
+
generation: this.generation,
|
|
124
|
+
recordedEntries: this.recordedEntries,
|
|
125
|
+
retainedEntries: this.entries.length,
|
|
126
|
+
droppedEntries: this.droppedEntries,
|
|
127
|
+
firstRetainedSequence: this.entries[0]?.sequence ?? null,
|
|
128
|
+
lastRetainedSequence: this.entries[this.entries.length - 1]?.sequence ?? null,
|
|
129
|
+
disposition: this.droppedEntries > 0 ? 'truncated' : 'complete',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** Get counts for the retained window, with its completeness metadata. */
|
|
110
133
|
getStatistics() {
|
|
111
134
|
const operationCounts = {
|
|
112
135
|
submit: 0,
|
|
@@ -129,6 +152,8 @@ export class TaskAuditLogger {
|
|
|
129
152
|
}
|
|
130
153
|
}
|
|
131
154
|
return {
|
|
155
|
+
...this.getWindow(),
|
|
156
|
+
basis: 'retained-window',
|
|
132
157
|
totalEntries: this.entries.length,
|
|
133
158
|
operationCounts,
|
|
134
159
|
taskCount: taskIds.size,
|
|
@@ -140,6 +165,9 @@ export class TaskAuditLogger {
|
|
|
140
165
|
*/
|
|
141
166
|
clear() {
|
|
142
167
|
this.entries.length = 0;
|
|
168
|
+
this.generation = randomUUID();
|
|
169
|
+
this.recordedEntries = 0;
|
|
170
|
+
this.droppedEntries = 0;
|
|
143
171
|
}
|
|
144
172
|
}
|
|
145
173
|
/**
|
|
@@ -154,6 +154,11 @@ export declare class DomainTaskExecutor implements TaskHandlerContext {
|
|
|
154
154
|
private getTaskDomain;
|
|
155
155
|
private timeout;
|
|
156
156
|
private publishTaskCompleted;
|
|
157
|
+
/**
|
|
158
|
+
* @param callerError true when the task was rejected because of invalid
|
|
159
|
+
* caller input; the queen then neither retries it nor counts it toward
|
|
160
|
+
* the domain circuit breaker.
|
|
161
|
+
*/
|
|
157
162
|
private publishTaskFailed;
|
|
158
163
|
}
|
|
159
164
|
export declare function createTaskExecutor(kernel: QEKernel, config?: Partial<TaskExecutorConfig>): DomainTaskExecutor;
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* Handler implementations are extracted into ./handlers/ modules.
|
|
14
14
|
*/
|
|
15
15
|
import { v4 as uuidv4 } from 'uuid';
|
|
16
|
-
import { toErrorMessage } from '../shared/error-utils.js';
|
|
16
|
+
import { isCallerInputError, toErrorMessage } from '../shared/error-utils.js';
|
|
17
17
|
import { createResultSaver } from './result-saver.js';
|
|
18
18
|
import { createLogger } from '../logging/logger-factory.js';
|
|
19
19
|
import { getClaudeModelForTier } from '../shared/llm/model-registry.js';
|
|
@@ -436,7 +436,7 @@ export class DomainTaskExecutor {
|
|
|
436
436
|
]);
|
|
437
437
|
if (!result.success) {
|
|
438
438
|
const errorMsg = 'error' in result ? result.error.message : 'Unknown error';
|
|
439
|
-
await this.publishTaskFailed(task.id, errorMsg, domain);
|
|
439
|
+
await this.publishTaskFailed(task.id, errorMsg, domain, 'error' in result && isCallerInputError(result.error));
|
|
440
440
|
// ADR-051: Record failed outcome
|
|
441
441
|
this.recordOutcome(task, routingTier, false, Date.now() - startTime).catch((e) => { logger.warn('recordOutcome failed', { error: e instanceof Error ? e.message : String(e), taskId: task.id }); });
|
|
442
442
|
return {
|
|
@@ -486,7 +486,7 @@ export class DomainTaskExecutor {
|
|
|
486
486
|
}
|
|
487
487
|
catch (error) {
|
|
488
488
|
const errorMessage = toErrorMessage(error);
|
|
489
|
-
await this.publishTaskFailed(task.id, errorMessage, domain);
|
|
489
|
+
await this.publishTaskFailed(task.id, errorMessage, domain, isCallerInputError(error));
|
|
490
490
|
// ADR-051: Record failed outcome
|
|
491
491
|
this.recordOutcome(task, routingTier, false, Date.now() - startTime).catch((e) => { logger.warn('recordOutcome failed', { error: e instanceof Error ? e.message : String(e), taskId: task.id }); });
|
|
492
492
|
return {
|
|
@@ -655,13 +655,18 @@ export class DomainTaskExecutor {
|
|
|
655
655
|
payload: { taskId, result },
|
|
656
656
|
});
|
|
657
657
|
}
|
|
658
|
-
|
|
658
|
+
/**
|
|
659
|
+
* @param callerError true when the task was rejected because of invalid
|
|
660
|
+
* caller input; the queen then neither retries it nor counts it toward
|
|
661
|
+
* the domain circuit breaker.
|
|
662
|
+
*/
|
|
663
|
+
async publishTaskFailed(taskId, error, domain, callerError = false) {
|
|
659
664
|
await this.eventBus.publish({
|
|
660
665
|
id: uuidv4(),
|
|
661
666
|
type: 'TaskFailed',
|
|
662
667
|
timestamp: new Date(),
|
|
663
668
|
source: domain,
|
|
664
|
-
payload: { taskId, error },
|
|
669
|
+
payload: { taskId, error, ...(callerError ? { callerError: true } : {}) },
|
|
665
670
|
});
|
|
666
671
|
}
|
|
667
672
|
}
|
|
@@ -33,7 +33,9 @@ export declare function loadQualityEvidence(memory: MemoryBackend, options?: {
|
|
|
33
33
|
now?: number;
|
|
34
34
|
maxAgeMs?: number;
|
|
35
35
|
}): Promise<QualityEvidenceValues>;
|
|
36
|
-
export declare function evaluateQualityEvidence(values: QualityEvidenceValues
|
|
36
|
+
export declare function evaluateQualityEvidence(values: QualityEvidenceValues, thresholds?: {
|
|
37
|
+
coverage?: number;
|
|
38
|
+
}): {
|
|
37
39
|
passed: boolean;
|
|
38
40
|
checks: EvaluatedQualityCheck[];
|
|
39
41
|
recommendations: string[];
|
|
@@ -91,9 +91,14 @@ export async function loadQualityEvidence(memory, options = {}) {
|
|
|
91
91
|
}
|
|
92
92
|
return values;
|
|
93
93
|
}
|
|
94
|
-
export function evaluateQualityEvidence(values) {
|
|
94
|
+
export function evaluateQualityEvidence(values, thresholds = {}) {
|
|
95
|
+
if (thresholds.coverage !== undefined && (!Number.isFinite(thresholds.coverage) || thresholds.coverage < 0 || thresholds.coverage > 100)) {
|
|
96
|
+
throw new Error('Coverage quality threshold must be a finite number between 0 and 100.');
|
|
97
|
+
}
|
|
95
98
|
const checks = QUALITY_METRICS.map((name) => {
|
|
96
|
-
const threshold =
|
|
99
|
+
const threshold = name === 'coverage' && thresholds.coverage !== undefined
|
|
100
|
+
? { ...DEFAULT_QUALITY_THRESHOLDS[name], value: thresholds.coverage }
|
|
101
|
+
: DEFAULT_QUALITY_THRESHOLDS[name];
|
|
97
102
|
const value = values[name];
|
|
98
103
|
return {
|
|
99
104
|
name,
|
|
@@ -11,6 +11,7 @@ import { TEST_EXECUTION_CONSTANTS, RETRY_CONSTANTS } from '../../constants.js';
|
|
|
11
11
|
import { toError } from '../../../shared/error-utils.js';
|
|
12
12
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
13
13
|
import { secureRandom } from '../../../shared/utils/crypto-random.js';
|
|
14
|
+
import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
|
|
14
15
|
const DEFAULT_RETRY_CONFIG = {
|
|
15
16
|
simulateForTesting: false,
|
|
16
17
|
simulatedRetrySuccessRate: RETRY_CONSTANTS.DEFAULT_FLAKY_PASS_RATE,
|
|
@@ -379,6 +380,8 @@ export class RetryHandlerService {
|
|
|
379
380
|
let stdout = '';
|
|
380
381
|
let stderr = '';
|
|
381
382
|
let timedOut = false;
|
|
383
|
+
let termination;
|
|
384
|
+
const timeoutError = new Error(`Test execution timed out after ${timeout}ms for command: ${command} ${args.join(' ')}`);
|
|
382
385
|
const settle = (fn, value) => {
|
|
383
386
|
report?.cleanup();
|
|
384
387
|
fn(value);
|
|
@@ -387,13 +390,20 @@ export class RetryHandlerService {
|
|
|
387
390
|
// Arguments are passed as array to avoid shell interpretation
|
|
388
391
|
const proc = spawn(command, args, {
|
|
389
392
|
cwd,
|
|
393
|
+
detached: process.platform !== 'win32',
|
|
390
394
|
env: { ...process.env, FORCE_COLOR: '0', CI: 'true' },
|
|
391
395
|
});
|
|
396
|
+
const untrackExit = trackTestRunnerExit(proc);
|
|
392
397
|
const timeoutHandle = setTimeout(() => {
|
|
393
398
|
timedOut = true;
|
|
394
|
-
proc
|
|
395
|
-
|
|
396
|
-
|
|
399
|
+
termination = terminateTestRunner(proc);
|
|
400
|
+
termination.catch(error => {
|
|
401
|
+
logger.warn(`Retry runner cleanup failed: ${toError(error).message}`);
|
|
402
|
+
// A denied cleanup can leave the root alive: preserve the timeout
|
|
403
|
+
// outcome immediately, keeping artifacts because settlement is unknown.
|
|
404
|
+
reject(timeoutError);
|
|
405
|
+
});
|
|
406
|
+
termination.then(untrackExit, () => undefined);
|
|
397
407
|
}, timeout);
|
|
398
408
|
proc.stdout?.on('data', (data) => {
|
|
399
409
|
stdout += data.toString();
|
|
@@ -404,9 +414,10 @@ export class RetryHandlerService {
|
|
|
404
414
|
proc.on('close', (code) => {
|
|
405
415
|
clearTimeout(timeoutHandle);
|
|
406
416
|
if (timedOut) {
|
|
407
|
-
settle(reject,
|
|
417
|
+
termination?.then(() => settle(reject, timeoutError), () => reject(timeoutError));
|
|
408
418
|
return;
|
|
409
419
|
}
|
|
420
|
+
untrackExit();
|
|
410
421
|
// Parse result based on exit code and output (Vitest writes the JSON
|
|
411
422
|
// report to the --outputFile; read it back rather than trusting stdout).
|
|
412
423
|
try {
|
|
@@ -422,6 +433,7 @@ export class RetryHandlerService {
|
|
|
422
433
|
});
|
|
423
434
|
proc.on('error', (err) => {
|
|
424
435
|
clearTimeout(timeoutHandle);
|
|
436
|
+
untrackExit();
|
|
425
437
|
report?.cleanup();
|
|
426
438
|
reject(new Error(`Failed to spawn test process: ${err.message}. ` +
|
|
427
439
|
`Command: ${command} ${args.join(' ')}. ` +
|
|
@@ -433,20 +445,23 @@ export class RetryHandlerService {
|
|
|
433
445
|
* Parse test runner output to determine pass/fail status
|
|
434
446
|
*/
|
|
435
447
|
parseTestResult(exitCode, stdout, stderr) {
|
|
436
|
-
// A
|
|
448
|
+
// A retry can clear a prior failure only when the report proves a test
|
|
449
|
+
// actually passed. Empty/fully skipped selections can also exit zero.
|
|
437
450
|
try {
|
|
438
451
|
// Vitest JSON output
|
|
439
452
|
const vitestMatch = stdout.match(/\{[\s\S]*"testResults"[\s\S]*\}/);
|
|
440
453
|
if (vitestMatch) {
|
|
441
454
|
const result = safeJsonParse(vitestMatch[0]);
|
|
442
455
|
if (exitCode === 0 && result.success !== false
|
|
443
|
-
&& result.numFailedTests === 0 && result.numFailedTestSuites === 0
|
|
456
|
+
&& result.numFailedTests === 0 && result.numFailedTestSuites === 0
|
|
457
|
+
&& Number.isFinite(result.numPassedTests) && result.numPassedTests > 0) {
|
|
444
458
|
return { passed: true };
|
|
445
459
|
}
|
|
446
460
|
const failedTest = result.testResults?.[0]?.assertionResults?.find((r) => r.status === 'failed');
|
|
447
461
|
return {
|
|
448
462
|
passed: false,
|
|
449
|
-
error: failedTest?.failureMessages?.join('\n') || stderr
|
|
463
|
+
error: failedTest?.failureMessages?.join('\n') || stderr
|
|
464
|
+
|| (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
|
|
450
465
|
};
|
|
451
466
|
}
|
|
452
467
|
// Jest JSON output
|
|
@@ -454,34 +469,38 @@ export class RetryHandlerService {
|
|
|
454
469
|
if (jestMatch) {
|
|
455
470
|
const result = safeJsonParse(jestMatch[0]);
|
|
456
471
|
if (exitCode === 0 && result.success !== false
|
|
457
|
-
&& result.numFailedTests === 0 && result.numFailedTestSuites === 0
|
|
472
|
+
&& result.numFailedTests === 0 && result.numFailedTestSuites === 0
|
|
473
|
+
&& Number.isFinite(result.numPassedTests) && result.numPassedTests > 0) {
|
|
458
474
|
return { passed: true };
|
|
459
475
|
}
|
|
460
476
|
const failedTest = result.testResults?.[0]?.assertionResults?.find((r) => r.status === 'failed');
|
|
461
477
|
return {
|
|
462
478
|
passed: false,
|
|
463
|
-
error: failedTest?.failureMessages?.join('\n') || stderr
|
|
479
|
+
error: failedTest?.failureMessages?.join('\n') || stderr
|
|
480
|
+
|| (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
|
|
464
481
|
};
|
|
465
482
|
}
|
|
466
483
|
// Mocha JSON output
|
|
467
484
|
const mochaMatch = stdout.match(/\{[\s\S]*"stats"[\s\S]*"failures"[\s\S]*\}/);
|
|
468
485
|
if (mochaMatch) {
|
|
469
486
|
const result = safeJsonParse(mochaMatch[0]);
|
|
470
|
-
if (exitCode === 0 && result.stats?.failures === 0
|
|
487
|
+
if (exitCode === 0 && result.stats?.failures === 0
|
|
488
|
+
&& Number.isFinite(result.stats?.passes) && result.stats.passes > 0) {
|
|
471
489
|
return { passed: true };
|
|
472
490
|
}
|
|
473
491
|
const failure = result.failures?.[0];
|
|
474
492
|
return {
|
|
475
493
|
passed: false,
|
|
476
|
-
error: failure?.err?.message || stderr
|
|
494
|
+
error: failure?.err?.message || stderr
|
|
495
|
+
|| (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
|
|
477
496
|
};
|
|
478
497
|
}
|
|
479
498
|
}
|
|
480
499
|
catch {
|
|
481
|
-
//
|
|
500
|
+
// Unreadable output cannot prove that the retry executed a passing test.
|
|
482
501
|
}
|
|
483
502
|
if (exitCode === 0)
|
|
484
|
-
return { passed:
|
|
503
|
+
return { passed: false, error: 'Retry runner did not report any passing tests.' };
|
|
485
504
|
// Non-zero exit code means failure
|
|
486
505
|
const errorOutput = stderr || stdout || `Test failed with exit code ${exitCode}`;
|
|
487
506
|
return {
|
|
@@ -170,9 +170,9 @@ export declare class TestExecutorService implements ITestExecutionService {
|
|
|
170
170
|
*/
|
|
171
171
|
private extractCoverageFromJson;
|
|
172
172
|
/**
|
|
173
|
-
* Read coverage from
|
|
174
|
-
*
|
|
175
|
-
*
|
|
173
|
+
* Read coverage from the private output directory of a completed runner.
|
|
174
|
+
* Setting the directory does not enable coverage; project configuration
|
|
175
|
+
* still decides whether coverage is collected.
|
|
176
176
|
*/
|
|
177
177
|
private readCoverageFromDisk;
|
|
178
178
|
private storeResults;
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
|
|
8
|
+
import { tmpdir } from 'node:os';
|
|
8
9
|
import { join } from 'node:path';
|
|
9
10
|
import { v4 as uuidv4 } from 'uuid';
|
|
10
11
|
import { ok, err } from '../../../shared/types/index.js';
|
|
@@ -16,6 +17,7 @@ import { writeQualityEvidence } from '../../quality-assessment/quality-evidence.
|
|
|
16
17
|
import { getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
17
18
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
18
19
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
20
|
+
import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
|
|
19
21
|
const DEFAULT_CONFIG = {
|
|
20
22
|
simulateForTesting: false,
|
|
21
23
|
simulatedTestsPerFile: 5,
|
|
@@ -368,19 +370,29 @@ Provide:
|
|
|
368
370
|
return err(new Error(`Test file not found: ${missingFile}`));
|
|
369
371
|
}
|
|
370
372
|
// Build command based on framework
|
|
371
|
-
const { command, args, report } = this.buildTestCommand(files, framework);
|
|
373
|
+
const { command, args, report, coverageDirectory } = this.buildTestCommand(files, framework);
|
|
372
374
|
const fileLabel = files.join(', ');
|
|
373
375
|
return new Promise((resolve) => {
|
|
374
376
|
let stdout = '';
|
|
375
377
|
let stderr = '';
|
|
376
378
|
let killed = false;
|
|
379
|
+
let termination;
|
|
377
380
|
let settled = false;
|
|
381
|
+
const cleanupArtifacts = () => {
|
|
382
|
+
report?.cleanup();
|
|
383
|
+
if (coverageDirectory) {
|
|
384
|
+
try {
|
|
385
|
+
rmSync(coverageDirectory, { recursive: true, force: true });
|
|
386
|
+
}
|
|
387
|
+
catch { /* Best effort. */ }
|
|
388
|
+
}
|
|
389
|
+
};
|
|
378
390
|
const finish = (result, cleanup = true) => {
|
|
379
391
|
if (settled)
|
|
380
392
|
return;
|
|
381
393
|
settled = true;
|
|
382
394
|
if (cleanup)
|
|
383
|
-
|
|
395
|
+
cleanupArtifacts();
|
|
384
396
|
resolve(result);
|
|
385
397
|
};
|
|
386
398
|
// Spawn the test runner process
|
|
@@ -390,6 +402,7 @@ Provide:
|
|
|
390
402
|
try {
|
|
391
403
|
proc = spawn(command, args, {
|
|
392
404
|
cwd: process.cwd(),
|
|
405
|
+
detached: process.platform !== 'win32',
|
|
393
406
|
env: {
|
|
394
407
|
...process.env,
|
|
395
408
|
FORCE_COLOR: '0', // Disable color codes for easier parsing
|
|
@@ -401,10 +414,15 @@ Provide:
|
|
|
401
414
|
finish(err(new Error(`Failed to spawn test runner: ${toErrorMessage(error)}. Is '${command}' installed?`)));
|
|
402
415
|
return;
|
|
403
416
|
}
|
|
417
|
+
const untrackExit = trackTestRunnerExit(proc);
|
|
404
418
|
// Set timeout
|
|
405
419
|
const timeoutId = setTimeout(() => {
|
|
406
420
|
killed = true;
|
|
407
|
-
proc
|
|
421
|
+
termination = terminateTestRunner(proc);
|
|
422
|
+
// Keep the timeout outcome immediate; cleanup waits for the owned
|
|
423
|
+
// group, rather than treating the root's close as descendant exit.
|
|
424
|
+
termination.catch(error => logger.warn(`Test runner cleanup failed: ${toErrorMessage(error)}`));
|
|
425
|
+
termination.then(untrackExit, () => undefined);
|
|
408
426
|
finish(err(new Error(`Test execution timed out after ${timeout}ms for files: ${fileLabel}`)), false);
|
|
409
427
|
}, timeout);
|
|
410
428
|
proc.stdout?.on('data', (data) => {
|
|
@@ -416,9 +434,12 @@ Provide:
|
|
|
416
434
|
proc.on('close', (code) => {
|
|
417
435
|
clearTimeout(timeoutId);
|
|
418
436
|
if (killed) {
|
|
419
|
-
|
|
420
|
-
|
|
437
|
+
// Coverage and JSON reports belong to this run; clean both only
|
|
438
|
+
// after the entire owned process group has stopped.
|
|
439
|
+
termination?.then(() => cleanupArtifacts(), () => undefined);
|
|
440
|
+
return; // The timeout result has already been returned.
|
|
421
441
|
}
|
|
442
|
+
untrackExit();
|
|
422
443
|
// Parse results based on framework. Vitest 5 writes the JSON report to
|
|
423
444
|
// a file instead of stdout, so read it back through the report handle.
|
|
424
445
|
let reportText;
|
|
@@ -434,10 +455,10 @@ Provide:
|
|
|
434
455
|
return;
|
|
435
456
|
}
|
|
436
457
|
const parseResult = this.parseTestOutput(reportText, stderr, fileLabel, framework, code);
|
|
437
|
-
//
|
|
438
|
-
//
|
|
439
|
-
if (parseResult.success && !parseResult.value.coverage &&
|
|
440
|
-
const diskCoverage = this.readCoverageFromDisk();
|
|
458
|
+
// Read only this invocation's coverage artifacts. A previous or
|
|
459
|
+
// concurrent run's project coverage directory is not evidence.
|
|
460
|
+
if (parseResult.success && !parseResult.value.coverage && coverageDirectory) {
|
|
461
|
+
const diskCoverage = this.readCoverageFromDisk(coverageDirectory);
|
|
441
462
|
if (diskCoverage) {
|
|
442
463
|
parseResult.value.coverage = diskCoverage.summary;
|
|
443
464
|
if (diskCoverage.perFile.length > 0) {
|
|
@@ -451,6 +472,7 @@ Provide:
|
|
|
451
472
|
clearTimeout(timeoutId);
|
|
452
473
|
if (killed)
|
|
453
474
|
return;
|
|
475
|
+
untrackExit();
|
|
454
476
|
finish(err(new Error(`Failed to spawn test runner: ${error.message}. Is '${command}' installed?`)));
|
|
455
477
|
});
|
|
456
478
|
});
|
|
@@ -460,22 +482,35 @@ Provide:
|
|
|
460
482
|
*/
|
|
461
483
|
buildTestCommand(fileOrFiles, framework) {
|
|
462
484
|
const files = Array.isArray(fileOrFiles) ? fileOrFiles : [fileOrFiles];
|
|
485
|
+
const createCoverageDirectory = () => mkdtempSync(join(tmpdir(), 'aqe-test-coverage-'));
|
|
463
486
|
switch (framework.toLowerCase()) {
|
|
464
487
|
case 'vitest': {
|
|
465
488
|
// --outputFile makes Vitest 4 and 5 both write the JSON report to a
|
|
466
489
|
// file we own; Vitest 5 no longer prints it to stdout.
|
|
467
|
-
const
|
|
490
|
+
const coverageDirectory = createCoverageDirectory();
|
|
491
|
+
let report;
|
|
492
|
+
try {
|
|
493
|
+
report = createVitestJsonReport();
|
|
494
|
+
}
|
|
495
|
+
catch (error) {
|
|
496
|
+
rmSync(coverageDirectory, { recursive: true, force: true });
|
|
497
|
+
throw error;
|
|
498
|
+
}
|
|
468
499
|
return {
|
|
469
500
|
command: 'npx',
|
|
470
|
-
args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args],
|
|
501
|
+
args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args, `--coverage.reportsDirectory=${coverageDirectory}`],
|
|
471
502
|
report,
|
|
503
|
+
coverageDirectory,
|
|
472
504
|
};
|
|
473
505
|
}
|
|
474
|
-
case 'jest':
|
|
506
|
+
case 'jest': {
|
|
507
|
+
const coverageDirectory = createCoverageDirectory();
|
|
475
508
|
return {
|
|
476
509
|
command: 'npx',
|
|
477
|
-
args: ['jest', ...files, '--json', '--no-colors', '--testLocationInResults'],
|
|
510
|
+
args: ['jest', ...files, '--json', '--no-colors', '--testLocationInResults', `--coverageDirectory=${coverageDirectory}`],
|
|
511
|
+
coverageDirectory,
|
|
478
512
|
};
|
|
513
|
+
}
|
|
479
514
|
case 'mocha':
|
|
480
515
|
// Note: mocha has no built-in coverage — requires external nyc/c8 wrapper.
|
|
481
516
|
// Coverage data will be unavailable for mocha-based test runs.
|
|
@@ -491,11 +526,20 @@ Provide:
|
|
|
491
526
|
};
|
|
492
527
|
default: {
|
|
493
528
|
// Default to vitest
|
|
494
|
-
const
|
|
529
|
+
const coverageDirectory = createCoverageDirectory();
|
|
530
|
+
let report;
|
|
531
|
+
try {
|
|
532
|
+
report = createVitestJsonReport();
|
|
533
|
+
}
|
|
534
|
+
catch (error) {
|
|
535
|
+
rmSync(coverageDirectory, { recursive: true, force: true });
|
|
536
|
+
throw error;
|
|
537
|
+
}
|
|
495
538
|
return {
|
|
496
539
|
command: 'npx',
|
|
497
|
-
args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args],
|
|
540
|
+
args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args, `--coverage.reportsDirectory=${coverageDirectory}`],
|
|
498
541
|
report,
|
|
542
|
+
coverageDirectory,
|
|
499
543
|
};
|
|
500
544
|
}
|
|
501
545
|
}
|
|
@@ -1003,16 +1047,16 @@ Provide:
|
|
|
1003
1047
|
return { perFile };
|
|
1004
1048
|
}
|
|
1005
1049
|
/**
|
|
1006
|
-
* Read coverage from
|
|
1007
|
-
*
|
|
1008
|
-
*
|
|
1050
|
+
* Read coverage from the private output directory of a completed runner.
|
|
1051
|
+
* Setting the directory does not enable coverage; project configuration
|
|
1052
|
+
* still decides whether coverage is collected.
|
|
1009
1053
|
*/
|
|
1010
|
-
readCoverageFromDisk() {
|
|
1054
|
+
readCoverageFromDisk(coverageDirectory) {
|
|
1011
1055
|
try {
|
|
1012
1056
|
// Check common coverage output paths
|
|
1013
1057
|
const candidates = [
|
|
1014
|
-
join(
|
|
1015
|
-
join(
|
|
1058
|
+
join(coverageDirectory, 'coverage-summary.json'),
|
|
1059
|
+
join(coverageDirectory, 'coverage-final.json'),
|
|
1016
1060
|
];
|
|
1017
1061
|
for (const filePath of candidates) {
|
|
1018
1062
|
if (!existsSync(filePath))
|
|
@@ -249,7 +249,7 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
249
249
|
this.startWorkflow(workflowId, 'generate');
|
|
250
250
|
// Opt-in (plan 06, D7-wire): try the FREE local model first with a repair
|
|
251
251
|
// loop. Fully guarded — any miss falls through to the normal LLM path.
|
|
252
|
-
if (this.freeTierExecutor) {
|
|
252
|
+
if (this.freeTierExecutor && !request.behaviorExamples?.length) {
|
|
253
253
|
try {
|
|
254
254
|
const ft = await this.tryFreeTierGeneration(request);
|
|
255
255
|
if (ft) {
|
|
@@ -354,11 +354,12 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
354
354
|
}
|
|
355
355
|
}
|
|
356
356
|
// Three-loop protocol: instantAdapt must precede recordOutcome
|
|
357
|
-
|
|
357
|
+
const coverageEstimate = result.value.coverageEstimate;
|
|
358
|
+
if (coverageEstimate !== null && isSONAThreeLoopEnabled() && this.qesona?.isThreeLoopEnabled()) {
|
|
358
359
|
const tests = result.value;
|
|
359
360
|
this.qesona.instantAdapt([
|
|
360
361
|
tests.tests.length / 20,
|
|
361
|
-
|
|
362
|
+
coverageEstimate / 100,
|
|
362
363
|
tests.patternsUsed.length / 10,
|
|
363
364
|
request.sourceFiles.length / 20,
|
|
364
365
|
(request.coverageTarget ?? 80) / 100,
|
|
@@ -476,7 +477,7 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
476
477
|
framework,
|
|
477
478
|
llmEnhanced: true,
|
|
478
479
|
};
|
|
479
|
-
return { tests: [test], coverageEstimate:
|
|
480
|
+
return { tests: [test], coverageEstimate: null, patternsUsed: ['free-tier-local', `tier:${r.tierUsed}`] };
|
|
480
481
|
}
|
|
481
482
|
/**
|
|
482
483
|
* Generate tests using TDD workflow
|
|
@@ -953,7 +954,7 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
953
954
|
* Per ADR-040: Store test generation patterns in SONA
|
|
954
955
|
*/
|
|
955
956
|
async storeTestGenerationPattern(tests, request) {
|
|
956
|
-
if (!this.qesona) {
|
|
957
|
+
if (!this.qesona || tests.coverageEstimate === null) {
|
|
957
958
|
return;
|
|
958
959
|
}
|
|
959
960
|
try {
|