agentic-qe 3.14.8 → 3.15.0
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/release/SKILL.md +6 -0
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +145 -0
- package/README.md +143 -366
- package/assets/readme/credit-ruflo.svg +1 -0
- package/assets/readme/credit-ruvector.svg +1 -0
- package/assets/readme/project-header.svg +1 -0
- package/assets/readme/quality-loop.svg +1 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2a/notifications/retry-queue.js +5 -1
- package/dist/adapters/ag-ui/json-patch.js +14 -7
- package/dist/adapters/ag-ui/state-delta-cache.js +20 -12
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-D7G5MIDQ.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-67OKGDGZ.js → agent-booster-wasm-GDHJ6QUN.js} +2 -2
- package/dist/cli/chunks/{agent-handler-4HZEQ3WQ.js → agent-handler-MPYYQ2RZ.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-IBHZQSRN.js → agent-memory-branch-QBSHKLA2.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-G6TUFGHC.js +2 -0
- package/dist/cli/chunks/{arena-LCLRGUIK.js → arena-UJE2FROF.js} +4 -4
- package/dist/cli/chunks/{arena-EJBIGSF4.js → arena-WIGSL37B.js} +2 -2
- package/dist/cli/chunks/{audit-PY4JNDQQ.js → audit-VT7Y2Z7V.js} +3 -3
- package/dist/cli/chunks/base-B45BOC7E.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-2JG5K6XT.js → better-sqlite3-DSL7LFRK.js} +2 -2
- package/dist/cli/chunks/{brain-handler-3UYK55GA.js → brain-handler-N3C2MDMK.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-GOSWOX46.js → branch-enumerator-B6NSQ3PZ.js} +2 -2
- package/dist/cli/chunks/{browser-DC2JV47Z.js → browser-KQ3YNRGW.js} +2 -2
- package/dist/cli/chunks/browser-workflow-MIBU4XMV.js +2 -0
- package/dist/cli/chunks/{chunk-RM6OC35G.js → chunk-2ORTL5WG.js} +1 -1
- package/dist/cli/chunks/{chunk-B2QKBQYD.js → chunk-2ZEV3O24.js} +1 -1
- package/dist/cli/chunks/{chunk-H5UH234L.js → chunk-32YSI6OT.js} +1 -1
- package/dist/cli/chunks/{chunk-GQJ4QDEN.js → chunk-3DKYBHNA.js} +4 -4
- package/dist/cli/chunks/{chunk-BFIXUKOR.js → chunk-3Y24VTZ3.js} +1 -1
- package/dist/cli/chunks/{chunk-G36RZF2Y.js → chunk-4BWDCUZZ.js} +1 -1
- package/dist/cli/chunks/{chunk-JRLZ7LZ3.js → chunk-4DCDIKBX.js} +2 -2
- package/dist/cli/chunks/{chunk-BHPTHC5O.js → chunk-4EEY23JS.js} +2 -2
- package/dist/cli/chunks/{chunk-NJEEKYEP.js → chunk-4FOKHGP5.js} +2 -2
- package/dist/cli/chunks/{chunk-NEXBTLN6.js → chunk-4OQSAUKR.js} +2 -2
- package/dist/cli/chunks/{chunk-KNSQWM2E.js → chunk-4YPL3OXS.js} +2 -2
- package/dist/cli/chunks/{chunk-QQVE65ER.js → chunk-5DJGP4TA.js} +2 -2
- package/dist/cli/chunks/{chunk-7TNCEVWX.js → chunk-5KN4QL3G.js} +2 -2
- package/dist/cli/chunks/{chunk-T6W2EYHC.js → chunk-5LN7FQZI.js} +2 -2
- package/dist/cli/chunks/{chunk-KKXH25IH.js → chunk-5PNRUMRV.js} +2 -2
- package/dist/cli/chunks/{chunk-G3C7Z6FO.js → chunk-62IEVKN3.js} +2 -2
- package/dist/cli/chunks/{chunk-3576QGPP.js → chunk-6GTIJNRO.js} +1 -1
- package/dist/cli/chunks/{chunk-SKJQKOFJ.js → chunk-6MN4L6BS.js} +2 -2
- package/dist/cli/chunks/{chunk-JTOFLDU7.js → chunk-7D6NVIGP.js} +6 -6
- package/dist/cli/chunks/{chunk-M7QKCHLQ.js → chunk-7JABIXP3.js} +2 -2
- package/dist/cli/chunks/chunk-7JC3LHA6.js +742 -0
- package/dist/cli/chunks/{chunk-LQVS5IWH.js → chunk-7WUHVGGT.js} +2 -2
- package/dist/cli/chunks/{chunk-I6NZFBT3.js → chunk-A37YYHUD.js} +2 -2
- package/dist/cli/chunks/{chunk-FRC7AFB4.js → chunk-AAQNRZKT.js} +2 -2
- package/dist/cli/chunks/{chunk-SPS472C5.js → chunk-AGYPPPXR.js} +2 -2
- package/dist/cli/chunks/chunk-AIE6OKCD.js +2 -0
- package/dist/cli/chunks/{chunk-5X4HDW5W.js → chunk-ANUZGOLQ.js} +2 -2
- package/dist/cli/chunks/{chunk-XFT4FYTC.js → chunk-AQZSF32Y.js} +2 -2
- package/dist/cli/chunks/{chunk-BITFGVZ4.js → chunk-ATXAMGVE.js} +2 -2
- package/dist/cli/chunks/{chunk-VAXTPLO3.js → chunk-AV3RX2L5.js} +2 -2
- package/dist/cli/chunks/{chunk-GHMJFICO.js → chunk-AW5OWYQ4.js} +2 -2
- package/dist/cli/chunks/{chunk-GA63ESNT.js → chunk-B6QTNTCU.js} +2 -2
- package/dist/cli/chunks/{chunk-HHANMCD2.js → chunk-BAPMEDWC.js} +1 -1
- package/dist/cli/chunks/{chunk-EKO5QL2B.js → chunk-BH2SQQ2N.js} +1 -1
- package/dist/cli/chunks/{chunk-W7JUD4EZ.js → chunk-C6M27NQE.js} +2 -2
- package/dist/cli/chunks/{chunk-4PY44TKH.js → chunk-CMYZWIXS.js} +2 -2
- package/dist/cli/chunks/{chunk-3FCHH4VP.js → chunk-CZWWC7GC.js} +1 -1
- package/dist/cli/chunks/{chunk-DSJJHPPS.js → chunk-D7NOHASX.js} +3 -3
- package/dist/cli/chunks/{chunk-N3ASALOL.js → chunk-DGRE6ZAA.js} +2 -2
- package/dist/cli/chunks/{chunk-U2QTL5T2.js → chunk-DSGRXW6K.js} +3 -3
- package/dist/cli/chunks/{chunk-F2WAB4WK.js → chunk-DXA7RLYU.js} +2 -2
- package/dist/cli/chunks/{chunk-C647D42G.js → chunk-DZHIE5UW.js} +2 -2
- package/dist/cli/chunks/{chunk-EMOZ5O5S.js → chunk-EBK6CUBD.js} +1 -1
- package/dist/cli/chunks/{chunk-PVJLQ2YZ.js → chunk-EPEKEUCF.js} +1 -1
- package/dist/cli/chunks/{chunk-UHLZKH6B.js → chunk-EQ4SDE4L.js} +25 -25
- package/dist/cli/chunks/{chunk-HE3BDBAO.js → chunk-EZPWSS3B.js} +2 -2
- package/dist/cli/chunks/{chunk-TCQWVVSR.js → chunk-F76SYOBT.js} +1 -1
- package/dist/cli/chunks/{chunk-7X3LMTRA.js → chunk-F7JVDLOI.js} +2 -2
- package/dist/cli/chunks/{chunk-CLUHGBLN.js → chunk-FCSETOWZ.js} +1 -1
- package/dist/cli/chunks/{chunk-77WL5HQW.js → chunk-FFE4XAQA.js} +1 -1
- package/dist/cli/chunks/{chunk-4HXFPBAA.js → chunk-FPTZP7W5.js} +1 -1
- package/dist/cli/chunks/{chunk-6GNWVPMR.js → chunk-FTFIA4I5.js} +2 -2
- package/dist/cli/chunks/{chunk-YHX74M7C.js → chunk-FTS6NGBP.js} +2 -2
- package/dist/cli/chunks/{chunk-UNFE4RPV.js → chunk-FZ3TQAPW.js} +1 -1
- package/dist/cli/chunks/{chunk-UIWXKRTK.js → chunk-G35KP72N.js} +2 -2
- package/dist/cli/chunks/{chunk-D2Y36V5J.js → chunk-GCHDMO5V.js} +2 -2
- package/dist/cli/chunks/{chunk-ES7TAJRJ.js → chunk-GRN47ANK.js} +2 -2
- package/dist/cli/chunks/{chunk-OVMG6EEF.js → chunk-GV7P5JYF.js} +2 -2
- package/dist/cli/chunks/{chunk-XAESN54Q.js → chunk-GX5RFGW2.js} +1 -1
- package/dist/cli/chunks/{chunk-SUNXA2UR.js → chunk-H77AUJNW.js} +2 -2
- package/dist/cli/chunks/{chunk-T4WQPE77.js → chunk-HBIV7PQH.js} +1 -1
- package/dist/cli/chunks/{chunk-VCSNNLWL.js → chunk-HOPXHZA3.js} +2 -2
- package/dist/cli/chunks/{chunk-GK5WLUX3.js → chunk-I3BH3KIF.js} +1 -1
- package/dist/cli/chunks/{chunk-RTD4U7IW.js → chunk-ILKMNDUM.js} +2 -2
- package/dist/cli/chunks/{chunk-LMAI74EP.js → chunk-IRHBR56R.js} +1 -1
- package/dist/cli/chunks/{chunk-DZHXCOSK.js → chunk-ISAMM7QA.js} +1 -1
- package/dist/cli/chunks/{chunk-6VTC3OHD.js → chunk-ISGFAMHZ.js} +2 -2
- package/dist/cli/chunks/{chunk-QPACHVDI.js → chunk-J46XGXPS.js} +1 -1
- package/dist/cli/chunks/{chunk-T53ZN4NO.js → chunk-J4XCBOPA.js} +2 -2
- package/dist/cli/chunks/{chunk-LKFBW2QM.js → chunk-JIWMFLHV.js} +2 -2
- package/dist/cli/chunks/{chunk-A5CLVZC3.js → chunk-JJ7WAU4I.js} +2 -2
- package/dist/cli/chunks/{chunk-CQEWL32R.js → chunk-JLPNYHJJ.js} +1 -1
- package/dist/cli/chunks/{chunk-6F7MFHTY.js → chunk-JO2YLIZH.js} +2 -2
- package/dist/cli/chunks/{chunk-VSPNIDQK.js → chunk-JSYNSJDQ.js} +2 -2
- package/dist/cli/chunks/{chunk-AJMAKUS3.js → chunk-JYRBOSOF.js} +2 -2
- package/dist/cli/chunks/{chunk-3S5IIK32.js → chunk-KEZ4PXVF.js} +1 -1
- package/dist/cli/chunks/{chunk-TT45RCLN.js → chunk-KLGFEHEN.js} +2 -2
- package/dist/cli/chunks/{chunk-673XJBGW.js → chunk-KU4WLKDK.js} +2 -2
- package/dist/cli/chunks/{chunk-EXQGHTPD.js → chunk-KUTMQBV4.js} +4 -4
- package/dist/cli/chunks/{chunk-A53MMSGC.js → chunk-L6PUBB6L.js} +2 -2
- package/dist/cli/chunks/{chunk-F6JJNBE5.js → chunk-LDJ5DZT5.js} +1 -1
- package/dist/cli/chunks/{chunk-25EEIAHS.js → chunk-LLS6JYPN.js} +2 -2
- package/dist/cli/chunks/{chunk-NWUFTLSF.js → chunk-LPCFIFZF.js} +2 -2
- package/dist/cli/chunks/{chunk-SMBGK7XI.js → chunk-M5EKZA7Q.js} +1 -1
- package/dist/cli/chunks/{chunk-YIWBJ637.js → chunk-MEYSIVMP.js} +2 -2
- package/dist/cli/chunks/{chunk-BUVJIVFG.js → chunk-MFGLRMO4.js} +1 -1
- package/dist/cli/chunks/{chunk-HBAFXWSO.js → chunk-MM57SD2F.js} +1 -1
- package/dist/cli/chunks/{chunk-UQGIC5OX.js → chunk-MO3QXLF2.js} +1 -1
- package/dist/cli/chunks/{chunk-WFKE7NZ5.js → chunk-MRIZY6HB.js} +2 -2
- package/dist/cli/chunks/{chunk-O4QB2GFL.js → chunk-N2MDNEF7.js} +2 -2
- package/dist/cli/chunks/{chunk-GVLRE3BV.js → chunk-N5ZHIQAV.js} +3 -3
- package/dist/cli/chunks/{chunk-6GJWT2OY.js → chunk-NZ556KZN.js} +2 -2
- package/dist/cli/chunks/{chunk-K6EOHGKS.js → chunk-O5AUOBGU.js} +2 -2
- package/dist/cli/chunks/{chunk-RJJIPTVH.js → chunk-OBSX3I4Y.js} +2 -2
- package/dist/cli/chunks/{chunk-3X2JSW3R.js → chunk-OLD2CIDI.js} +1 -1
- package/dist/cli/chunks/{chunk-AJ5PCJQ2.js → chunk-OTJ22IO2.js} +3 -3
- package/dist/cli/chunks/{chunk-J5HTQHJK.js → chunk-OYVDTD3A.js} +2 -2
- package/dist/cli/chunks/{chunk-JDOVO4E4.js → chunk-P2PPJUGD.js} +126 -130
- package/dist/cli/chunks/{chunk-TUZNWRYC.js → chunk-P4FRYNHL.js} +1 -1
- package/dist/cli/chunks/{chunk-56M4QNXU.js → chunk-P4WE6VRR.js} +2 -2
- package/dist/cli/chunks/{chunk-QDRFLM77.js → chunk-P725KXHX.js} +2 -2
- package/dist/cli/chunks/{chunk-AOD2ES44.js → chunk-P7MNF2SK.js} +2 -2
- package/dist/cli/chunks/{chunk-EBV3WFIR.js → chunk-PJU5HVWV.js} +2 -2
- package/dist/cli/chunks/{chunk-LTHV4PIG.js → chunk-PN3FYSQ6.js} +2 -2
- package/dist/cli/chunks/{chunk-CIEXUYY7.js → chunk-PPFW3H7E.js} +1 -1
- package/dist/cli/chunks/{chunk-L5T32SRF.js → chunk-Q4RCUCHD.js} +1 -1
- package/dist/cli/chunks/{chunk-Z5UZOYQS.js → chunk-QRALXNNX.js} +2 -2
- package/dist/cli/chunks/{chunk-CBWM5NOO.js → chunk-QVX22EIM.js} +2 -2
- package/dist/cli/chunks/{chunk-JQAJUXRE.js → chunk-R6CZCMKD.js} +2 -2
- package/dist/cli/chunks/chunk-ROK5YQ5P.js +3 -0
- package/dist/cli/chunks/{chunk-QP7EKLWU.js → chunk-S2GNFAOC.js} +2 -2
- package/dist/cli/chunks/{chunk-JRK5GX56.js → chunk-S644OORE.js} +1 -1
- package/dist/cli/chunks/{chunk-TGRHO4ES.js → chunk-S7CROKX4.js} +2 -2
- package/dist/cli/chunks/{chunk-BT3MI2BW.js → chunk-S7QUHLXV.js} +1 -1
- package/dist/cli/chunks/{chunk-SVP3BP52.js → chunk-UGYXUPGN.js} +2 -2
- package/dist/cli/chunks/{chunk-ISBOHF6Y.js → chunk-URRPJ3M7.js} +1 -1
- package/dist/cli/chunks/{chunk-R6I5I724.js → chunk-URUOTHPO.js} +2 -2
- package/dist/cli/chunks/{chunk-QKM4XT2F.js → chunk-VCYOFWMG.js} +2 -2
- package/dist/cli/chunks/{chunk-BCCSV3RH.js → chunk-VQVFGFYK.js} +1 -1
- package/dist/cli/chunks/{chunk-QH7C4PTX.js → chunk-VT5SMBEM.js} +1 -1
- package/dist/cli/chunks/{chunk-WVEHKAIH.js → chunk-VTGRGYY4.js} +3 -3
- package/dist/cli/chunks/{chunk-TP7L4EX6.js → chunk-VWCFXCSV.js} +2 -2
- package/dist/cli/chunks/{chunk-OZJQN7YE.js → chunk-VY4557VF.js} +2 -2
- package/dist/cli/chunks/{chunk-4RNCVSVN.js → chunk-VYERAOQL.js} +2 -2
- package/dist/cli/chunks/{chunk-VV2JVYOI.js → chunk-W6H2SOIK.js} +2 -2
- package/dist/cli/chunks/{chunk-VW7AXJQS.js → chunk-WBR4VRQE.js} +2 -2
- package/dist/cli/chunks/{chunk-T7YCNOW5.js → chunk-WDV6CBED.js} +2 -2
- package/dist/cli/chunks/{chunk-Z6G3QVZ4.js → chunk-WO7NPGUD.js} +19 -19
- package/dist/cli/chunks/{chunk-AEYJ4ZLA.js → chunk-WPOYFV4X.js} +1 -1
- package/dist/cli/chunks/{chunk-3EKG7HFV.js → chunk-WPSGMTI4.js} +3 -3
- package/dist/cli/chunks/{chunk-XECZYQT5.js → chunk-WQMXQO3O.js} +2 -2
- package/dist/cli/chunks/{chunk-QYCZYJH7.js → chunk-WR54SKKL.js} +2 -2
- package/dist/cli/chunks/{chunk-BTBJ2NLH.js → chunk-X4OESN7M.js} +2 -2
- package/dist/cli/chunks/{chunk-HPVYJ6JH.js → chunk-X5RELRY7.js} +2 -2
- package/dist/cli/chunks/{chunk-BOIUENWW.js → chunk-X7JEBPEW.js} +1 -1
- package/dist/cli/chunks/{chunk-OX7MJFLC.js → chunk-XEABMIUH.js} +2 -2
- package/dist/cli/chunks/{chunk-BL6273KR.js → chunk-XELFJC77.js} +3 -3
- package/dist/cli/chunks/{chunk-775WGWLL.js → chunk-XPUY3ZKD.js} +2 -2
- package/dist/cli/chunks/{chunk-BZIPW2PA.js → chunk-XZDPR6I2.js} +2 -2
- package/dist/cli/chunks/{chunk-OA75C4HY.js → chunk-Y63DADOR.js} +2 -2
- package/dist/cli/chunks/{chunk-F57FTFWS.js → chunk-YFRZVNE4.js} +2 -2
- package/dist/cli/chunks/{chunk-CXUC7YKA.js → chunk-YIDZ3TEN.js} +2 -2
- package/dist/cli/chunks/{chunk-LRGTPUJA.js → chunk-Z6CRROLU.js} +2 -2
- package/dist/cli/chunks/{chunk-J24AJEDE.js → chunk-ZPH2YT3J.js} +2 -2
- package/dist/cli/chunks/{chunk-AUFV2G2J.js → chunk-ZV7LJPSI.js} +5 -5
- package/dist/cli/chunks/{chunk-AR2S4DOB.js → chunk-ZXIIB3QE.js} +1 -1
- package/dist/cli/chunks/{ci-5LIV2HW5.js → ci-63JINRNB.js} +3 -3
- package/dist/cli/chunks/{ci-output-UO5BDFU4.js → ci-output-CRFWLUAA.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-UQDPXYRD.js → circuit-breaker-PJLG3WYL.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-62QES3QX.js → claude-flow-setup-UKHSQMJU.js} +2 -2
- package/dist/cli/chunks/client-A4FTITK3.js +2 -0
- package/dist/cli/chunks/{cline-installer-X7VZTSZG.js → cline-installer-PYQ27AS3.js} +2 -2
- package/dist/cli/chunks/{code-H3BF4L4H.js → code-K7VGLZ3W.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-BJGFZGGL.js → code-index-extractor-NNWAVWSL.js} +2 -2
- package/dist/cli/chunks/{codex-installer-KVZWKU6S.js → codex-installer-U4VJIKRN.js} +2 -2
- package/dist/cli/chunks/{completions-YMILE6V7.js → completions-DOCI3P4W.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-J26N2PWG.js → complexity-analyzer-RFW2QRFR.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-MAR42OV7.js → continuedev-installer-S5WXXOBU.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-CVOJF6OT.js → copilot-installer-AAQ6YLVJ.js} +2 -2
- package/dist/cli/chunks/core-handlers-FO3QTNWI.js +2 -0
- package/dist/cli/chunks/{cost-tracker-SXLWXE55.js → cost-tracker-R4VOHTWQ.js} +2 -2
- package/dist/cli/chunks/{coverage-D7HCHFP3.js → coverage-P54HPCLV.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-LIV6SRWF.js +2 -0
- package/dist/cli/chunks/{cursor-installer-X37VHIKW.js → cursor-installer-VHBWZE5A.js} +2 -2
- package/dist/cli/chunks/{daemon-JN7SOH6F.js → daemon-BTRSWNB4.js} +3 -3
- package/dist/cli/chunks/{daemon-LIW47IDM.js → daemon-JLH5TTWZ.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-QCHHIZBT.js → dag-attention-scheduler-5Z6DCRFK.js} +2 -2
- package/dist/cli/chunks/{detect-WRFCWAX5.js → detect-NWGASRJJ.js} +2 -2
- package/dist/cli/chunks/{dist-node-6FWT4XZO.js → dist-node-XMNNSEFJ.js} +2 -2
- package/dist/cli/chunks/{domain-handler-SNFPNMRT.js → domain-handler-BWVBZTNR.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-MXKHH62P.js → domain-plugins-YAD4USA4.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-47UJNERX.js → domain-transfer-Z3MRPZEZ.js} +2 -2
- package/dist/cli/chunks/dream-DNLGHYXY.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-LZFAUNBQ.js → embed-and-insert-pattern-5CCO45WC.js} +2 -2
- package/dist/cli/chunks/{eval-AMUXTMJB.js → eval-JEMLTGY4.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-3D65TR2C.js → experience-capture-middleware-FKVYBBAN.js} +3 -3
- package/dist/cli/chunks/{fast-paths-Y7BBMM56.js → fast-paths-TFL32H3C.js} +2 -2
- package/dist/cli/chunks/{feature-flags-VESRRQ6V.js → feature-flags-CNGAUUMT.js} +2 -2
- package/dist/cli/chunks/{feature-flags-JMQQ7JW4.js → feature-flags-OHGD2NCW.js} +2 -2
- package/dist/cli/chunks/{file-discovery-JJKQQUV6.js → file-discovery-IHGDYW34.js} +2 -2
- package/dist/cli/chunks/{fleet-WIGHICJF.js → fleet-OGTSDGJ2.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-BFNPETTT.js → gnn-wrapper-QYTTKNCE.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-HDXKTGUI.js → heartbeat-handler-R5OD2SKN.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-DL4LXXJF.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-Y64M43J4.js +2 -0
- package/dist/cli/chunks/hnsw-index-5V6DDMTA.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-6A7OTAPT.js → hnsw-legacy-bridge-ULJWYXBQ.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-LKV2H47B.js → hnswlib-node-SYKJXGE2.js} +2 -2
- package/dist/cli/chunks/{hooks-KDSFYQQG.js → hooks-XAJXPXTU.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-JWT2V4FQ.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-GDLPEPUC.js → hypergraph-engine-GIBPGW4N.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-4UMFA2EW.js → hypergraph-handler-ENFK6IDN.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-XUZQSZZC.js +2 -0
- package/dist/cli/chunks/{init-handler-4GCHPQHD.js → init-handler-CSA62LGT.js} +6 -6
- package/dist/cli/chunks/init-wizard-KDJKHEPN.js +2 -0
- package/dist/cli/chunks/kernel-MUDYPGFR.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-HJZMT2G5.js → kilocode-installer-YXFIRTSA.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-WUPY67HG.js → kiro-installer-JW3BG2MQ.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-GR52N7PU.js +2 -0
- package/dist/cli/chunks/{learning-AXKIS7IG.js → learning-BDBZ7ZVG.js} +3 -3
- package/dist/cli/chunks/{llm-router-HUDPNZLJ.js → llm-router-CCX2DYTC.js} +4 -4
- package/dist/cli/chunks/llm-router-service-QL6LVKZ4.js +2 -0
- package/dist/cli/chunks/{load-RM44POD7.js → load-UJTTEOOK.js} +2 -2
- package/dist/cli/chunks/load-test-76V75WZ5.js +2 -0
- package/dist/cli/chunks/{mcp-5JVQRBOP.js → mcp-2NAJYREC.js} +2 -2
- package/dist/cli/chunks/{memory-VGZ2V6PL.js → memory-C3UQSN5F.js} +5 -5
- package/dist/cli/chunks/memory-backend-SMQRS5QN.js +2 -0
- package/dist/cli/chunks/{memory-handlers-EI537Z32.js → memory-handlers-ESFIJENU.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-WPRKCSCM.js → multi-model-executor-SIHSHAD7.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-YAJMRCQO.js → opencode-installer-KDYHUGPG.js} +2 -2
- package/dist/cli/chunks/{orchestrator-MUGWBUYP.js → orchestrator-MJHIQEHD.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-MWAJMOYU.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-ZQJJ2YNG.js → pattern-usage-recorder-OLBE4UIF.js} +2 -2
- package/dist/cli/chunks/{pipeline-F4DXDUDC.js → pipeline-IOK2CV3U.js} +2 -2
- package/dist/cli/chunks/{platform-HI3A3OWF.js → platform-53JQ7JXN.js} +2 -2
- package/dist/cli/chunks/{plugin-XRITPTR7.js → plugin-L5SDIWDI.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-HHNJP7CQ.js → prime-radiant-advanced-wasm-2DS67JFS.js} +2 -2
- package/dist/cli/chunks/{project-root-2VN4WO2A.js → project-root-LQMOFO2Z.js} +2 -2
- package/dist/cli/chunks/protocol-executor-32X3GAJT.js +2 -0
- package/dist/cli/chunks/{protocol-handler-ZEVHSEBG.js → protocol-handler-NXG2M43B.js} +2 -2
- package/dist/cli/chunks/{prove-C4BLZWBS.js → prove-7K7PFSSX.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-KAFV3TGI.js +2 -0
- package/dist/cli/chunks/{quality-M3DTE4KK.js → quality-ATILUGMJ.js} +2 -2
- package/dist/cli/chunks/{quality-gate-V6KS7ML3.js → quality-gate-MPZMDPIZ.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-L3SODGRX.js +2 -0
- package/dist/cli/chunks/{real-embeddings-YWSE3IRT.js → real-embeddings-VZN3KIAI.js} +2 -2
- package/dist/cli/chunks/{ref-validation-ZWOTFA3T.js → ref-validation-EUATPVXX.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-GJBIWETD.js → roocode-installer-7M2GOUNZ.js} +2 -2
- package/dist/cli/chunks/router-DDCSSXYQ.js +2 -0
- package/dist/cli/chunks/routing-feedback-RFASKYCD.js +2 -0
- package/dist/cli/chunks/{routing-handler-CFYLGNAR.js → routing-handler-VWANE652.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-EDKG456B.js → ruvector-commands-B2YIPGOV.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-HCIF2G56.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-UVAHQ7SV.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-ZMEYMAI6.js → rvf-migration-coordinator-RQXOQJ5T.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-F2I5FFHK.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-AH6PNJP6.js → rvf-store-integrity-7P5YDXRH.js} +2 -2
- package/dist/cli/chunks/safe-db-6ZAA4S23.js +2 -0
- package/dist/cli/chunks/schedule-SM5Q6UVP.js +2 -0
- package/dist/cli/chunks/scheduler-4EYP4EZ6.js +2 -0
- package/dist/cli/chunks/{security-ZU2GW3ZM.js → security-VJ7TVSQF.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-5FOVSL3T.js → shared-rvf-adapter-63NXQFBX.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-IO4DC4XV.js → shared-rvf-dual-writer-JQRP7P5A.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-KLN2K266.js +2 -0
- package/dist/cli/chunks/{standalone-memory-3UXDZ7HI.js → standalone-memory-WJ72PH5P.js} +2 -2
- package/dist/cli/chunks/{status-handler-264CHTWS.js → status-handler-G72ZSLAX.js} +2 -2
- package/dist/cli/chunks/{structural-health-E2QPUOZE.js → structural-health-HYBGP4BD.js} +2 -2
- package/dist/cli/chunks/{sync-N2L2OST4.js → sync-5YMZZIF4.js} +2 -2
- package/dist/cli/chunks/{sync-2ACMWM7D.js → sync-O5FQAHT7.js} +2 -2
- package/dist/cli/chunks/{task-handler-IB5CVOTY.js → task-handler-E6IFNHZG.js} +2 -2
- package/dist/cli/chunks/{task-handlers-QBMYNJHE.js → task-handlers-P3GC2L5L.js} +3 -3
- package/dist/cli/chunks/{test-7RGLRDSP.js → test-OU6ERW67.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-RJABJT2W.js → test-scheduling-3HY4I3HY.js} +7 -7
- package/dist/cli/chunks/{token-bootstrap-JVHMHB72.js → token-bootstrap-A5QA4CWK.js} +2 -2
- package/dist/cli/chunks/{token-usage-3ECHQVCY.js → token-usage-MUNQVPFT.js} +2 -2
- package/dist/cli/chunks/{transformers-KJH3IJWI.js → transformers-IEO25W5V.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-XN6PFI32.js → tree-sitter-wasm-parser-T2EQHEAY.js} +2 -2
- package/dist/cli/chunks/{types-5BAPXOLS.js → types-ODCPGCID.js} +2 -2
- package/dist/cli/chunks/unified-memory-B5IA2KKQ.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-YF74LL3Z.js +2 -0
- package/dist/cli/chunks/unified-persistence-VZMGNGWY.js +2 -0
- package/dist/cli/chunks/{upgrade-S5NFQZID.js → upgrade-4DN6EIW2.js} +2 -2
- package/dist/cli/chunks/{validate-BIBWOLJD.js → validate-TBNAPDE3.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-WAA3LBHH.js → validate-swarm-ZN7XXUY4.js} +2 -2
- package/dist/cli/chunks/visual-security-ZV3BLLSH.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-OTBQTHAV.js → web-tree-sitter-DWAWVD2X.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-NNQ22EW6.js → windsurf-installer-U6EROS5S.js} +2 -2
- package/dist/cli/chunks/{witness-chain-E7MUBOJW.js → witness-chain-EQEJS2P4.js} +2 -2
- package/dist/cli/chunks/witness-chain-OA24MQWX.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-FW4QSN4C.js → witness-chain-repair-KBXDRXS3.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-YMROEBVL.js → witness-chain-verifier-HSQGZ4R4.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-4CGRNDMJ.js → witness-key-manager-RAODG73T.js} +2 -2
- package/dist/cli/chunks/{workflow-4VRSTRAN.js → workflow-KNFJNNKG.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-IMX2LSVE.js +2 -0
- package/dist/cli/chunks/{wrappers-4M4UTGEU.js → wrappers-NIJBA22T.js} +2 -2
- package/dist/cli/utils/workflow-parser.js +73 -57
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.d.ts +1 -1
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +17 -15
- package/dist/domains/test-execution/services/retry-handler.js +6 -3
- package/dist/governance/ab-benchmarking.d.ts +5 -1
- package/dist/governance/ab-benchmarking.js +64 -29
- package/dist/mcp/bundle.js +414 -412
- package/dist/mcp/security/rate-limiter.d.ts +1 -0
- package/dist/mcp/security/rate-limiter.js +22 -5
- package/dist/mcp/services/session-store.js +17 -17
- package/dist/mcp/tools/planning/goap-status.d.ts +2 -0
- package/dist/mcp/tools/planning/goap-status.js +8 -2
- package/dist/planning/goap-planner.d.ts +3 -0
- package/dist/planning/goap-planner.js +80 -37
- package/dist/shared/embeddings/embedding-cache.js +1 -1
- package/dist/shared/embeddings/nomic-embedder.js +17 -7
- package/dist/shared/embeddings/ollama-client.js +5 -3
- package/dist/shared/git/git-analyzer.js +31 -30
- package/dist/shared/http/http-client.js +20 -13
- package/dist/shared/io/file-reader.js +11 -8
- package/dist/shared/llm/cache.d.ts +8 -29
- package/dist/shared/llm/cache.js +6 -2
- package/dist/shared/llm/cost-tracker.js +2 -1
- package/dist/shared/llm/provider-manager.js +4 -22
- package/dist/shared/llm/providers/gemini.d.ts +1 -0
- package/dist/shared/llm/providers/gemini.js +14 -5
- package/dist/shared/llm/providers/openrouter.js +6 -3
- package/dist/shared/metrics/code-metrics.js +1 -1
- package/dist/shared/metrics/system-metrics.js +8 -2
- package/dist/shared/retry-engine.js +2 -12
- package/dist/test-scheduling/executors/vitest-executor.js +26 -17
- package/package.json +3 -1
- package/dist/cli/chunks/adapter-XYCOXQCC.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-DTJCROTG.js +0 -2
- package/dist/cli/chunks/base-5TQ34GMD.js +0 -2
- package/dist/cli/chunks/browser-workflow-KWX4ESTJ.js +0 -2
- package/dist/cli/chunks/chunk-7STWD4KJ.js +0 -3
- package/dist/cli/chunks/chunk-PFXCRRR6.js +0 -736
- package/dist/cli/chunks/chunk-U64QORFO.js +0 -2
- package/dist/cli/chunks/client-AJZKCP4I.js +0 -2
- package/dist/cli/chunks/core-handlers-MQHEMGDV.js +0 -2
- package/dist/cli/chunks/cross-domain-router-3QNMZV5R.js +0 -2
- package/dist/cli/chunks/dream-OSWAITPT.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-BVRVVIE2.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-MZTHXULS.js +0 -2
- package/dist/cli/chunks/hnsw-index-KHEX4VDG.js +0 -2
- package/dist/cli/chunks/hybrid-backend-2B3LCLR4.js +0 -2
- package/dist/cli/chunks/impact-analyzer-4R4VWOGQ.js +0 -2
- package/dist/cli/chunks/init-wizard-TAOPXHHD.js +0 -2
- package/dist/cli/chunks/kernel-6I6VZUWY.js +0 -2
- package/dist/cli/chunks/knowledge-graph-KFMTTUR5.js +0 -2
- package/dist/cli/chunks/llm-router-service-2D74XVM3.js +0 -2
- package/dist/cli/chunks/load-test-53FWOWNS.js +0 -2
- package/dist/cli/chunks/memory-backend-KFJDDPEZ.js +0 -2
- package/dist/cli/chunks/pattern-null-store-7DMU5CJ4.js +0 -2
- package/dist/cli/chunks/protocol-executor-2EMTBTMG.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-VZHZZPHE.js +0 -2
- package/dist/cli/chunks/queen-coordinator-7MYTTUHI.js +0 -2
- package/dist/cli/chunks/router-ZD4LXAWA.js +0 -2
- package/dist/cli/chunks/routing-feedback-FSLMDVGD.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-LTKTDRFS.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-IF24EVC5.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-E6JNBKMZ.js +0 -2
- package/dist/cli/chunks/safe-db-F6TRB5KZ.js +0 -2
- package/dist/cli/chunks/schedule-HBD4BYTE.js +0 -2
- package/dist/cli/chunks/scheduler-6FYWPMQC.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-DOU72F5Z.js +0 -2
- package/dist/cli/chunks/unified-memory-GHAYAXWZ.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-CCC63YXT.js +0 -2
- package/dist/cli/chunks/unified-persistence-HKRHI5PG.js +0 -2
- package/dist/cli/chunks/visual-security-APOXJ3Q3.js +0 -2
- package/dist/cli/chunks/witness-chain-7IP5IJGT.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-2HNW5ZMQ.js +0 -2
|
@@ -66,10 +66,11 @@ export class GitAnalyzer {
|
|
|
66
66
|
return 0.4; // Default when not in git repo
|
|
67
67
|
}
|
|
68
68
|
try {
|
|
69
|
-
const relativePath =
|
|
70
|
-
//
|
|
69
|
+
const relativePath = this.getRelativePath(filePath);
|
|
70
|
+
// Literal pathspecs preserve route filenames such as app/[id].tsx.
|
|
71
|
+
// execFileSync passes arguments directly without shell interpretation.
|
|
71
72
|
const output = execFileSync('git', [
|
|
72
|
-
'log', '--oneline', '--since=90 days ago', '--', relativePath
|
|
73
|
+
'--literal-pathspecs', 'log', '--oneline', '--since=90 days ago', '--', relativePath
|
|
73
74
|
], {
|
|
74
75
|
cwd: this.config.repoRoot,
|
|
75
76
|
encoding: 'utf-8',
|
|
@@ -97,10 +98,10 @@ export class GitAnalyzer {
|
|
|
97
98
|
return 0.5; // Default when not in git repo
|
|
98
99
|
}
|
|
99
100
|
try {
|
|
100
|
-
const relativePath =
|
|
101
|
+
const relativePath = this.getRelativePath(filePath);
|
|
101
102
|
// Get blame info using execFileSync with argument array
|
|
102
103
|
const blameOutput = execFileSync('git', [
|
|
103
|
-
'blame', '--line-porcelain', '--', relativePath
|
|
104
|
+
'--literal-pathspecs', 'blame', '--line-porcelain', '--', relativePath
|
|
104
105
|
], {
|
|
105
106
|
cwd: this.config.repoRoot,
|
|
106
107
|
encoding: 'utf-8',
|
|
@@ -143,12 +144,12 @@ export class GitAnalyzer {
|
|
|
143
144
|
return 0.4; // Default when not in git repo
|
|
144
145
|
}
|
|
145
146
|
try {
|
|
146
|
-
const relativePath =
|
|
147
|
+
const relativePath = this.getRelativePath(filePath);
|
|
147
148
|
// Get first commit date using execFileSync with argument array
|
|
148
149
|
let firstCommitTimestamp = NaN;
|
|
149
150
|
try {
|
|
150
151
|
const firstCommitOutput = execFileSync('git', [
|
|
151
|
-
'log', '--format=%at', '--follow', '--diff-filter=A', '--', relativePath
|
|
152
|
+
'--literal-pathspecs', 'log', '--format=%at', '--follow', '--diff-filter=A', '--', relativePath
|
|
152
153
|
], {
|
|
153
154
|
cwd: this.config.repoRoot,
|
|
154
155
|
encoding: 'utf-8',
|
|
@@ -167,7 +168,7 @@ export class GitAnalyzer {
|
|
|
167
168
|
let lastCommitTimestamp = NaN;
|
|
168
169
|
try {
|
|
169
170
|
const lastCommitOutput = execFileSync('git', [
|
|
170
|
-
'log', '-1', '--format=%at', '--', relativePath
|
|
171
|
+
'--literal-pathspecs', 'log', '-1', '--format=%at', '--', relativePath
|
|
171
172
|
], {
|
|
172
173
|
cwd: this.config.repoRoot,
|
|
173
174
|
encoding: 'utf-8',
|
|
@@ -216,7 +217,7 @@ export class GitAnalyzer {
|
|
|
216
217
|
return 0.2; // Default when not in git repo
|
|
217
218
|
}
|
|
218
219
|
try {
|
|
219
|
-
const relativePath =
|
|
220
|
+
const relativePath = this.getRelativePath(filePath);
|
|
220
221
|
// Search for each keyword separately and count unique commits
|
|
221
222
|
// This avoids shell injection from keywords config
|
|
222
223
|
let bugCommits = 0;
|
|
@@ -225,7 +226,7 @@ export class GitAnalyzer {
|
|
|
225
226
|
const sanitizedKeyword = sanitizeGitArg(keyword);
|
|
226
227
|
try {
|
|
227
228
|
const output = execFileSync('git', [
|
|
228
|
-
'log', '--oneline', '--grep', sanitizedKeyword, '-i', '--', relativePath
|
|
229
|
+
'--literal-pathspecs', 'log', '--oneline', '--grep', sanitizedKeyword, '-i', '--', relativePath
|
|
229
230
|
], {
|
|
230
231
|
cwd: this.config.repoRoot,
|
|
231
232
|
encoding: 'utf-8',
|
|
@@ -267,12 +268,12 @@ export class GitAnalyzer {
|
|
|
267
268
|
return this.getDefaultFileHistory(filePath);
|
|
268
269
|
}
|
|
269
270
|
try {
|
|
270
|
-
const relativePath =
|
|
271
|
+
const relativePath = this.getRelativePath(filePath);
|
|
271
272
|
// Get commit count using execFileSync with argument array
|
|
272
273
|
let totalCommits = 0;
|
|
273
274
|
try {
|
|
274
275
|
const commitCountOutput = execFileSync('git', [
|
|
275
|
-
'log', '--oneline', '--', relativePath
|
|
276
|
+
'--literal-pathspecs', 'log', '--oneline', '--', relativePath
|
|
276
277
|
], {
|
|
277
278
|
cwd: this.config.repoRoot,
|
|
278
279
|
encoding: 'utf-8',
|
|
@@ -287,7 +288,7 @@ export class GitAnalyzer {
|
|
|
287
288
|
let uniqueAuthors = 0;
|
|
288
289
|
try {
|
|
289
290
|
const authorsOutput = execFileSync('git', [
|
|
290
|
-
'log', '--format=%ae', '--', relativePath
|
|
291
|
+
'--literal-pathspecs', 'log', '--format=%ae', '--', relativePath
|
|
291
292
|
], {
|
|
292
293
|
cwd: this.config.repoRoot,
|
|
293
294
|
encoding: 'utf-8',
|
|
@@ -305,7 +306,7 @@ export class GitAnalyzer {
|
|
|
305
306
|
let firstCommit = null;
|
|
306
307
|
try {
|
|
307
308
|
const firstCommitOutput = execFileSync('git', [
|
|
308
|
-
'log', '--format=%at', '--follow', '--', relativePath
|
|
309
|
+
'--literal-pathspecs', 'log', '--format=%at', '--follow', '--', relativePath
|
|
309
310
|
], {
|
|
310
311
|
cwd: this.config.repoRoot,
|
|
311
312
|
encoding: 'utf-8',
|
|
@@ -328,7 +329,7 @@ export class GitAnalyzer {
|
|
|
328
329
|
let lastCommit = null;
|
|
329
330
|
try {
|
|
330
331
|
const lastCommitOutput = execFileSync('git', [
|
|
331
|
-
'log', '-1', '--format=%at', '--', relativePath
|
|
332
|
+
'--literal-pathspecs', 'log', '-1', '--format=%at', '--', relativePath
|
|
332
333
|
], {
|
|
333
334
|
cwd: this.config.repoRoot,
|
|
334
335
|
encoding: 'utf-8',
|
|
@@ -361,7 +362,7 @@ export class GitAnalyzer {
|
|
|
361
362
|
const sanitizedKeyword = sanitizeGitArg(keyword);
|
|
362
363
|
try {
|
|
363
364
|
const bugFixOutput = execFileSync('git', [
|
|
364
|
-
'log', '--oneline', '--grep', sanitizedKeyword, '-i', '--', relativePath
|
|
365
|
+
'--literal-pathspecs', 'log', '--oneline', '--grep', sanitizedKeyword, '-i', '--', relativePath
|
|
365
366
|
], {
|
|
366
367
|
cwd: this.config.repoRoot,
|
|
367
368
|
encoding: 'utf-8',
|
|
@@ -410,19 +411,19 @@ export class GitAnalyzer {
|
|
|
410
411
|
}
|
|
411
412
|
try {
|
|
412
413
|
const sinceDate = since || new Date(Date.now() - 24 * 60 * 60 * 1000);
|
|
413
|
-
const sinceStr = sinceDate.toISOString()
|
|
414
|
+
const sinceStr = sinceDate.toISOString();
|
|
414
415
|
// Get files changed since the date using execFileSync with argument array
|
|
415
416
|
const output = execFileSync('git', [
|
|
416
|
-
'log', `--since=${sinceStr}`, '--name-only', '--
|
|
417
|
+
'log', `--since=${sinceStr}`, '--name-only', '-z', '--format='
|
|
417
418
|
], {
|
|
418
419
|
cwd: this.config.repoRoot,
|
|
419
420
|
encoding: 'utf-8',
|
|
420
421
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
421
|
-
})
|
|
422
|
+
});
|
|
422
423
|
if (!output)
|
|
423
424
|
return [];
|
|
424
|
-
//
|
|
425
|
-
const files = output.split('\
|
|
425
|
+
// NUL records preserve whitespace, newlines and Git-quoted Unicode paths.
|
|
426
|
+
const files = output.split('\0').filter(Boolean);
|
|
426
427
|
return Array.from(new Set(files));
|
|
427
428
|
}
|
|
428
429
|
catch {
|
|
@@ -442,15 +443,15 @@ export class GitAnalyzer {
|
|
|
442
443
|
// Sanitize commit hash to prevent injection
|
|
443
444
|
const sanitizedHash = sanitizeGitArg(commitHash);
|
|
444
445
|
const output = execFileSync('git', [
|
|
445
|
-
'diff-tree', '--no-commit-id', '--name-only', '-r', sanitizedHash
|
|
446
|
+
'diff-tree', '--no-commit-id', '--name-only', '-z', '-r', sanitizedHash
|
|
446
447
|
], {
|
|
447
448
|
cwd: this.config.repoRoot,
|
|
448
449
|
encoding: 'utf-8',
|
|
449
450
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
450
|
-
})
|
|
451
|
+
});
|
|
451
452
|
if (!output)
|
|
452
453
|
return [];
|
|
453
|
-
return output.split('\
|
|
454
|
+
return output.split('\0').filter(Boolean);
|
|
454
455
|
}
|
|
455
456
|
catch {
|
|
456
457
|
return [];
|
|
@@ -469,14 +470,14 @@ export class GitAnalyzer {
|
|
|
469
470
|
// Get unstaged changes using execFileSync with argument array
|
|
470
471
|
try {
|
|
471
472
|
const unstagedOutput = execFileSync('git', [
|
|
472
|
-
'diff', '--name-only', 'HEAD'
|
|
473
|
+
'diff', '--name-only', '-z', 'HEAD'
|
|
473
474
|
], {
|
|
474
475
|
cwd: this.config.repoRoot,
|
|
475
476
|
encoding: 'utf-8',
|
|
476
477
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
477
|
-
})
|
|
478
|
+
});
|
|
478
479
|
if (unstagedOutput) {
|
|
479
|
-
files.push(...unstagedOutput.split('\
|
|
480
|
+
files.push(...unstagedOutput.split('\0').filter(Boolean));
|
|
480
481
|
}
|
|
481
482
|
}
|
|
482
483
|
catch {
|
|
@@ -485,14 +486,14 @@ export class GitAnalyzer {
|
|
|
485
486
|
// Get staged changes using execFileSync with argument array
|
|
486
487
|
try {
|
|
487
488
|
const stagedOutput = execFileSync('git', [
|
|
488
|
-
'diff', '--name-only', '--cached'
|
|
489
|
+
'diff', '--name-only', '-z', '--cached'
|
|
489
490
|
], {
|
|
490
491
|
cwd: this.config.repoRoot,
|
|
491
492
|
encoding: 'utf-8',
|
|
492
493
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
493
|
-
})
|
|
494
|
+
});
|
|
494
495
|
if (stagedOutput) {
|
|
495
|
-
files.push(...stagedOutput.split('\
|
|
496
|
+
files.push(...stagedOutput.split('\0').filter(Boolean));
|
|
496
497
|
}
|
|
497
498
|
}
|
|
498
499
|
catch {
|
|
@@ -74,8 +74,9 @@ class CircuitBreaker {
|
|
|
74
74
|
}
|
|
75
75
|
return false;
|
|
76
76
|
}
|
|
77
|
-
// half-open
|
|
78
|
-
|
|
77
|
+
// The open -> half-open transition already admitted the recovery probe.
|
|
78
|
+
// Keep further requests out until that probe records success or failure.
|
|
79
|
+
return false;
|
|
79
80
|
}
|
|
80
81
|
reset(url) {
|
|
81
82
|
if (url) {
|
|
@@ -253,17 +254,23 @@ export class HttpClient {
|
|
|
253
254
|
if (!error) {
|
|
254
255
|
return 'UNKNOWN_ERROR';
|
|
255
256
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
257
|
+
// Native fetch wraps transport errors in a TypeError whose cause carries
|
|
258
|
+
// the socket/DNS code. Retain message-based handling for existing callers.
|
|
259
|
+
const visited = new Set();
|
|
260
|
+
let current = error;
|
|
261
|
+
while (typeof current === 'object' && current !== null && !visited.has(current)) {
|
|
262
|
+
visited.add(current);
|
|
263
|
+
const detail = current;
|
|
264
|
+
if (detail.name === 'AbortError')
|
|
265
|
+
return 'TIMEOUT';
|
|
266
|
+
const message = typeof detail.message === 'string' ? detail.message : '';
|
|
267
|
+
if (detail.code === 'ECONNREFUSED' || message.includes('ECONNREFUSED'))
|
|
268
|
+
return 'CONNECTION_REFUSED';
|
|
269
|
+
if (detail.code === 'ENOTFOUND' || message.includes('ENOTFOUND'))
|
|
270
|
+
return 'DNS_ERROR';
|
|
271
|
+
if (detail.code === 'ETIMEDOUT' || message.includes('ETIMEDOUT'))
|
|
272
|
+
return 'NETWORK_TIMEOUT';
|
|
273
|
+
current = detail.cause;
|
|
267
274
|
}
|
|
268
275
|
return 'REQUEST_FAILED';
|
|
269
276
|
}
|
|
@@ -235,27 +235,30 @@ export class FileReader {
|
|
|
235
235
|
resolvePath(filePath) {
|
|
236
236
|
// Determine if path is absolute
|
|
237
237
|
const isAbsolutePath = path.isAbsolute(filePath);
|
|
238
|
+
const normalizedBase = path.resolve(this.basePath);
|
|
239
|
+
const normalizedPath = path.resolve(normalizedBase, filePath);
|
|
240
|
+
const relativePath = path.relative(normalizedBase, normalizedPath);
|
|
241
|
+
if (this.basePath && (relativePath === '..' || relativePath.startsWith(`..${path.sep}`) || path.isAbsolute(relativePath))) {
|
|
242
|
+
throw new PathTraversalError(filePath, ['Path escapes base directory'], 'critical');
|
|
243
|
+
}
|
|
244
|
+
// Absolute checkout prefixes are not user-controlled depth beneath the root.
|
|
245
|
+
// Keep validating the original spelling so encoded traversal remains blocked.
|
|
246
|
+
const baseDepth = this.basePath ? normalizedBase.split(/[\\/]/).filter(Boolean).length : 0;
|
|
238
247
|
// SEC-004 FIX: Validate path to prevent directory traversal
|
|
239
248
|
// For absolute paths, validate without basePath to avoid incorrect combination
|
|
240
249
|
// For relative paths, validate with basePath for proper containment check
|
|
241
250
|
const validation = validatePath(filePath, {
|
|
242
251
|
basePath: isAbsolutePath ? '' : this.basePath,
|
|
243
252
|
allowAbsolute: true,
|
|
253
|
+
maxDepth: 10 + (isAbsolutePath ? baseDepth : 0),
|
|
244
254
|
// Allow common development file extensions
|
|
245
255
|
deniedExtensions: ['.exe', '.bat', '.cmd', '.ps1', '.dll', '.so'],
|
|
246
256
|
});
|
|
247
257
|
if (!validation.valid) {
|
|
248
258
|
throw new PathTraversalError(filePath, [validation.error || 'Path validation failed'], validation.riskLevel);
|
|
249
259
|
}
|
|
250
|
-
|
|
251
|
-
if (isAbsolutePath && this.basePath) {
|
|
252
|
-
const normalizedBase = path.resolve(this.basePath);
|
|
253
|
-
const normalizedPath = path.resolve(filePath);
|
|
254
|
-
if (!normalizedPath.startsWith(normalizedBase)) {
|
|
255
|
-
throw new PathTraversalError(filePath, ['Path escapes base directory'], 'critical');
|
|
256
|
-
}
|
|
260
|
+
if (isAbsolutePath)
|
|
257
261
|
return normalizedPath;
|
|
258
|
-
}
|
|
259
262
|
// Use the normalized path from validation if available
|
|
260
263
|
if (validation.normalizedPath) {
|
|
261
264
|
return validation.normalizedPath;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Provides efficient caching of LLM responses to reduce costs and latency
|
|
6
6
|
* for repeated queries. Uses LRU (Least Recently Used) eviction policy.
|
|
7
7
|
*/
|
|
8
|
-
import { CacheEntry, LLMCacheConfig, LLMCacheStats, LLMResponse, EmbeddingResponse, CompletionResponse } from './interfaces';
|
|
8
|
+
import { CacheEntry, LLMCacheConfig, LLMCacheStats, LLMResponse, EmbeddingResponse, CompletionResponse, type GenerateOptions } from './interfaces';
|
|
9
9
|
/**
|
|
10
10
|
* Default cache configuration
|
|
11
11
|
*/
|
|
@@ -14,6 +14,7 @@ export declare const DEFAULT_CACHE_CONFIG: LLMCacheConfig;
|
|
|
14
14
|
* Type for cacheable response types
|
|
15
15
|
*/
|
|
16
16
|
export type CacheableResponse = LLMResponse | EmbeddingResponse | CompletionResponse;
|
|
17
|
+
type CacheKeyOptions = Pick<GenerateOptions, 'model' | 'temperature' | 'maxTokens' | 'systemPrompt' | 'stopSequences' | 'effort' | 'preferredProvider'>;
|
|
17
18
|
/**
|
|
18
19
|
* LRU Cache implementation for LLM responses
|
|
19
20
|
*/
|
|
@@ -28,12 +29,7 @@ export declare class LLMCache<T = CacheableResponse> {
|
|
|
28
29
|
/**
|
|
29
30
|
* Generate a cache key from request parameters
|
|
30
31
|
*/
|
|
31
|
-
static generateKey(type: 'generation' | 'embedding' | 'completion', input: string, options?:
|
|
32
|
-
model?: string;
|
|
33
|
-
temperature?: number;
|
|
34
|
-
maxTokens?: number;
|
|
35
|
-
systemPrompt?: string;
|
|
36
|
-
}): string;
|
|
32
|
+
static generateKey(type: 'generation' | 'embedding' | 'completion', input: string, options?: CacheKeyOptions): string;
|
|
37
33
|
/**
|
|
38
34
|
* Get a cached value
|
|
39
35
|
*/
|
|
@@ -99,21 +95,11 @@ export declare class LLMResponseCache {
|
|
|
99
95
|
/**
|
|
100
96
|
* Get a cached generation response
|
|
101
97
|
*/
|
|
102
|
-
getGeneration(input: string, options?:
|
|
103
|
-
model?: string;
|
|
104
|
-
temperature?: number;
|
|
105
|
-
maxTokens?: number;
|
|
106
|
-
systemPrompt?: string;
|
|
107
|
-
}): LLMResponse | undefined;
|
|
98
|
+
getGeneration(input: string, options?: CacheKeyOptions): LLMResponse | undefined;
|
|
108
99
|
/**
|
|
109
100
|
* Cache a generation response
|
|
110
101
|
*/
|
|
111
|
-
setGeneration(input: string, response: LLMResponse, options?:
|
|
112
|
-
model?: string;
|
|
113
|
-
temperature?: number;
|
|
114
|
-
maxTokens?: number;
|
|
115
|
-
systemPrompt?: string;
|
|
116
|
-
}, ttlMs?: number): void;
|
|
102
|
+
setGeneration(input: string, response: LLMResponse, options?: CacheKeyOptions, ttlMs?: number): void;
|
|
117
103
|
/**
|
|
118
104
|
* Get a cached embedding response
|
|
119
105
|
*/
|
|
@@ -129,19 +115,11 @@ export declare class LLMResponseCache {
|
|
|
129
115
|
/**
|
|
130
116
|
* Get a cached completion response
|
|
131
117
|
*/
|
|
132
|
-
getCompletion(prompt: string, options?:
|
|
133
|
-
model?: string;
|
|
134
|
-
temperature?: number;
|
|
135
|
-
maxTokens?: number;
|
|
136
|
-
}): CompletionResponse | undefined;
|
|
118
|
+
getCompletion(prompt: string, options?: CacheKeyOptions): CompletionResponse | undefined;
|
|
137
119
|
/**
|
|
138
120
|
* Cache a completion response
|
|
139
121
|
*/
|
|
140
|
-
setCompletion(prompt: string, response: CompletionResponse, options?:
|
|
141
|
-
model?: string;
|
|
142
|
-
temperature?: number;
|
|
143
|
-
maxTokens?: number;
|
|
144
|
-
}, ttlMs?: number): void;
|
|
122
|
+
setCompletion(prompt: string, response: CompletionResponse, options?: CacheKeyOptions, ttlMs?: number): void;
|
|
145
123
|
/**
|
|
146
124
|
* Get combined cache statistics
|
|
147
125
|
*/
|
|
@@ -160,4 +138,5 @@ export declare class LLMResponseCache {
|
|
|
160
138
|
*/
|
|
161
139
|
pruneExpired(): number;
|
|
162
140
|
}
|
|
141
|
+
export {};
|
|
163
142
|
//# sourceMappingURL=cache.d.ts.map
|
package/dist/shared/llm/cache.js
CHANGED
|
@@ -42,6 +42,10 @@ export class LLMCache {
|
|
|
42
42
|
options?.systemPrompt ?? '',
|
|
43
43
|
input,
|
|
44
44
|
];
|
|
45
|
+
const outputOptions = [options?.stopSequences, options?.effort, options?.preferredProvider];
|
|
46
|
+
if (outputOptions.some(value => value !== undefined)) {
|
|
47
|
+
parts.push(JSON.stringify(outputOptions));
|
|
48
|
+
}
|
|
45
49
|
// Encode field boundaries before hashing: prompt text may contain delimiters.
|
|
46
50
|
const hash = createHash('sha256').update(JSON.stringify(parts)).digest('hex');
|
|
47
51
|
return `${type}:${hash}`;
|
|
@@ -220,14 +224,14 @@ export class LLMCache {
|
|
|
220
224
|
if (this.accessOrder.length === 0) {
|
|
221
225
|
// Fallback: delete first entry
|
|
222
226
|
const firstKey = this.cache.keys().next().value;
|
|
223
|
-
if (firstKey) {
|
|
227
|
+
if (firstKey !== undefined) {
|
|
224
228
|
this.cache.delete(firstKey);
|
|
225
229
|
this.evictions++;
|
|
226
230
|
}
|
|
227
231
|
return;
|
|
228
232
|
}
|
|
229
233
|
const lruKey = this.accessOrder.shift();
|
|
230
|
-
if (lruKey) {
|
|
234
|
+
if (lruKey !== undefined) {
|
|
231
235
|
this.cache.delete(lruKey);
|
|
232
236
|
this.evictions++;
|
|
233
237
|
}
|
|
@@ -244,7 +244,8 @@ export class CostTracker {
|
|
|
244
244
|
for (const record of relevantRecords) {
|
|
245
245
|
totalCost += record.cost.totalCost;
|
|
246
246
|
totalTokens += record.usage.totalTokens;
|
|
247
|
-
byProvider[record.provider]
|
|
247
|
+
const providerCost = Object.hasOwn(byProvider, record.provider) ? byProvider[record.provider] : 0;
|
|
248
|
+
byProvider[record.provider] = providerCost + record.cost.totalCost;
|
|
248
249
|
byModel[record.model] = (byModel[record.model] || 0) + record.cost.totalCost;
|
|
249
250
|
}
|
|
250
251
|
return {
|
|
@@ -207,12 +207,7 @@ export class ProviderManager {
|
|
|
207
207
|
// Check cache first
|
|
208
208
|
if (!options?.skipCache) {
|
|
209
209
|
const inputStr = typeof input === 'string' ? input : JSON.stringify(input);
|
|
210
|
-
const cached = this.cache.getGeneration(inputStr,
|
|
211
|
-
model: options?.model,
|
|
212
|
-
temperature: options?.temperature,
|
|
213
|
-
maxTokens: options?.maxTokens,
|
|
214
|
-
systemPrompt: options?.systemPrompt,
|
|
215
|
-
});
|
|
210
|
+
const cached = this.cache.getGeneration(inputStr, options);
|
|
216
211
|
if (cached) {
|
|
217
212
|
return { ...cached, cached: true };
|
|
218
213
|
}
|
|
@@ -224,12 +219,7 @@ export class ProviderManager {
|
|
|
224
219
|
// Cache the response
|
|
225
220
|
if (!options?.skipCache) {
|
|
226
221
|
const inputStr = typeof input === 'string' ? input : JSON.stringify(input);
|
|
227
|
-
this.cache.setGeneration(inputStr, response,
|
|
228
|
-
model: options?.model,
|
|
229
|
-
temperature: options?.temperature,
|
|
230
|
-
maxTokens: options?.maxTokens,
|
|
231
|
-
systemPrompt: options?.systemPrompt,
|
|
232
|
-
});
|
|
222
|
+
this.cache.setGeneration(inputStr, response, options);
|
|
233
223
|
}
|
|
234
224
|
// Track cost (in-process) and persist to the cross-process ledger.
|
|
235
225
|
this.costTracker.recordUsage(response.provider, response.model, response.usage, response.requestId);
|
|
@@ -265,11 +255,7 @@ export class ProviderManager {
|
|
|
265
255
|
await this.ensureInitialized();
|
|
266
256
|
// Check cache first
|
|
267
257
|
if (!options?.skipCache) {
|
|
268
|
-
const cached = this.cache.getCompletion(prompt,
|
|
269
|
-
model: options?.model,
|
|
270
|
-
temperature: options?.temperature,
|
|
271
|
-
maxTokens: options?.maxTokens,
|
|
272
|
-
});
|
|
258
|
+
const cached = this.cache.getCompletion(prompt, options);
|
|
273
259
|
if (cached) {
|
|
274
260
|
return { ...cached, cached: true };
|
|
275
261
|
}
|
|
@@ -279,11 +265,7 @@ export class ProviderManager {
|
|
|
279
265
|
const response = await this.executeWithFailover('complete', async (provider) => provider.complete(prompt, options));
|
|
280
266
|
// Cache the response
|
|
281
267
|
if (!options?.skipCache) {
|
|
282
|
-
this.cache.setCompletion(prompt, response,
|
|
283
|
-
model: options?.model,
|
|
284
|
-
temperature: options?.temperature,
|
|
285
|
-
maxTokens: options?.maxTokens,
|
|
286
|
-
});
|
|
268
|
+
this.cache.setCompletion(prompt, response, options);
|
|
287
269
|
}
|
|
288
270
|
// ADR-123: persist to the cross-process ledger (completion has usage too).
|
|
289
271
|
this.costTracker.recordUsage(response.provider, response.model, response.usage, `complete-${response.model}-${Date.now()}`);
|
|
@@ -191,7 +191,10 @@ export class GeminiProvider {
|
|
|
191
191
|
totalTokens: usage.totalTokens,
|
|
192
192
|
estimatedCostUsd: cost.totalCost,
|
|
193
193
|
});
|
|
194
|
-
|
|
194
|
+
// A blocked prompt has no candidates; preserve it as a terminal result.
|
|
195
|
+
const blocked = this.isPromptBlocked(data.promptFeedback);
|
|
196
|
+
const candidate = blocked ? undefined : data.candidates[0];
|
|
197
|
+
const content = candidate?.content?.parts
|
|
195
198
|
?.map(p => p.text ?? '')
|
|
196
199
|
.join('') ?? '';
|
|
197
200
|
return {
|
|
@@ -201,7 +204,7 @@ export class GeminiProvider {
|
|
|
201
204
|
usage,
|
|
202
205
|
cost,
|
|
203
206
|
latencyMs,
|
|
204
|
-
finishReason: this.mapFinishReason(
|
|
207
|
+
finishReason: blocked ? 'content_filter' : this.mapFinishReason(candidate?.finishReason),
|
|
205
208
|
cached: false,
|
|
206
209
|
requestId,
|
|
207
210
|
};
|
|
@@ -269,10 +272,10 @@ export class GeminiProvider {
|
|
|
269
272
|
buffer = lines.pop() || '';
|
|
270
273
|
for (const line of lines) {
|
|
271
274
|
const trimmed = line.trim();
|
|
272
|
-
if (!trimmed || !trimmed.startsWith('data:
|
|
275
|
+
if (!trimmed || !trimmed.startsWith('data:'))
|
|
273
276
|
continue;
|
|
274
277
|
try {
|
|
275
|
-
const chunk = safeJsonParse(trimmed.slice(
|
|
278
|
+
const chunk = safeJsonParse(trimmed.slice(5).trimStart());
|
|
276
279
|
const text = chunk.candidates?.[0]?.content?.parts
|
|
277
280
|
?.map(p => p.text ?? '')
|
|
278
281
|
.join('') ?? '';
|
|
@@ -280,7 +283,10 @@ export class GeminiProvider {
|
|
|
280
283
|
fullContent += text;
|
|
281
284
|
yield text;
|
|
282
285
|
}
|
|
283
|
-
if (chunk.
|
|
286
|
+
if (this.isPromptBlocked(chunk.promptFeedback)) {
|
|
287
|
+
finishReason = 'content_filter';
|
|
288
|
+
}
|
|
289
|
+
else if (chunk.candidates?.[0]?.finishReason) {
|
|
284
290
|
finishReason = this.mapFinishReason(chunk.candidates[0].finishReason);
|
|
285
291
|
}
|
|
286
292
|
if (chunk.usageMetadata) {
|
|
@@ -479,6 +485,9 @@ export class GeminiProvider {
|
|
|
479
485
|
parts: [{ text: m.content }],
|
|
480
486
|
}));
|
|
481
487
|
}
|
|
488
|
+
isPromptBlocked(feedback) {
|
|
489
|
+
return !!feedback?.blockReason && feedback.blockReason !== 'BLOCK_REASON_UNSPECIFIED';
|
|
490
|
+
}
|
|
482
491
|
/**
|
|
483
492
|
* Map Gemini finish reason to standard format
|
|
484
493
|
*/
|
|
@@ -299,11 +299,14 @@ export class OpenRouterProvider {
|
|
|
299
299
|
buffer = lines.pop() || '';
|
|
300
300
|
for (const line of lines) {
|
|
301
301
|
const trimmed = line.trim();
|
|
302
|
-
if (!trimmed || trimmed
|
|
302
|
+
if (!trimmed || !trimmed.startsWith('data:'))
|
|
303
303
|
continue;
|
|
304
|
-
|
|
304
|
+
const data = trimmed.slice(5).trimStart();
|
|
305
|
+
if (data === '[DONE]')
|
|
306
|
+
continue;
|
|
307
|
+
if (trimmed.startsWith('data:')) {
|
|
305
308
|
try {
|
|
306
|
-
const chunk = safeJsonParse(
|
|
309
|
+
const chunk = safeJsonParse(data);
|
|
307
310
|
const delta = chunk.choices[0]?.delta;
|
|
308
311
|
if (delta?.content) {
|
|
309
312
|
fullContent += delta.content;
|
|
@@ -76,7 +76,13 @@ export class SystemMetricsCollector {
|
|
|
76
76
|
*/
|
|
77
77
|
collectProcessMetrics() {
|
|
78
78
|
const memUsage = process.memoryUsage();
|
|
79
|
-
const
|
|
79
|
+
const currentCpuUsage = process.cpuUsage();
|
|
80
|
+
const cpuUsage = this.lastCpuUsage
|
|
81
|
+
? {
|
|
82
|
+
user: currentCpuUsage.user - this.lastCpuUsage.user,
|
|
83
|
+
system: currentCpuUsage.system - this.lastCpuUsage.system,
|
|
84
|
+
}
|
|
85
|
+
: currentCpuUsage;
|
|
80
86
|
// Calculate CPU percentage
|
|
81
87
|
const now = Date.now();
|
|
82
88
|
const elapsedMs = this.lastCpuTime > 0 ? now - this.lastCpuTime : 1000;
|
|
@@ -85,7 +91,7 @@ export class SystemMetricsCollector {
|
|
|
85
91
|
const totalCpuUs = cpuUsage.user + cpuUsage.system;
|
|
86
92
|
const cpuPercent = (totalCpuUs / elapsedUs) * 100;
|
|
87
93
|
// Update last values
|
|
88
|
-
this.lastCpuUsage =
|
|
94
|
+
this.lastCpuUsage = currentCpuUsage;
|
|
89
95
|
this.lastCpuTime = now;
|
|
90
96
|
// Calculate memory percentage
|
|
91
97
|
const totalMem = os.totalmem();
|
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Agentic QE v3 - Unified Retry Engine
|
|
3
|
-
* IMP-03: Retry Engine with Exponential Backoff
|
|
4
|
-
*
|
|
5
|
-
* Provides a single, well-tested retry loop with exponential backoff,
|
|
6
|
-
* jitter, abort signal support, and retryable-error classification.
|
|
7
|
-
*
|
|
8
|
-
* The circuit breaker (circuit-breaker.ts) is a separate concern that
|
|
9
|
-
* receives success/failure signals from callers — this engine does NOT
|
|
10
|
-
* import or depend on it. Integration is planned for a later phase.
|
|
11
|
-
*/
|
|
1
|
+
import { isCallerInputError } from './error-utils.js';
|
|
12
2
|
// ---------------------------------------------------------------------------
|
|
13
3
|
// Defaults
|
|
14
4
|
// ---------------------------------------------------------------------------
|
|
@@ -59,7 +49,7 @@ const NON_RETRYABLE_HTTP_STATUSES = new Set([400, 401, 403, 404, 422]);
|
|
|
59
49
|
* Returns `false` for recognised non-retryable client errors (4xx).
|
|
60
50
|
*/
|
|
61
51
|
export function isRetryableError(error) {
|
|
62
|
-
if (error == null)
|
|
52
|
+
if (error == null || isCallerInputError(error))
|
|
63
53
|
return false;
|
|
64
54
|
// --- code property (errno) -------------------------------------------
|
|
65
55
|
const code = error.code;
|