agentic-qe 3.15.1 → 3.15.3
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/brain-checkpoint.cjs +46 -6
- package/.claude/hooks/aqe-hook.cjs +280 -51
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +129 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/ag-ui/state-delta-cache.js +14 -5
- package/dist/adapters/trajectory-adapter.js +3 -1
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-WQSFQES5.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-XUHRLKWP.js → agent-booster-wasm-CYG3PKHH.js} +2 -2
- package/dist/cli/chunks/{agent-handler-CL7MJP5W.js → agent-handler-WTFYFZKL.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-F7RV72FC.js → agent-memory-branch-G6WE3ZXU.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-TDHBBADE.js +2 -0
- package/dist/cli/chunks/{arena-GRRNK7IN.js → arena-S72QW44C.js} +4 -4
- package/dist/cli/chunks/{arena-LHLVOQHW.js → arena-ZFXQEVUQ.js} +2 -2
- package/dist/cli/chunks/{audit-EOP2K34L.js → audit-KPYIEQJ3.js} +3 -3
- package/dist/cli/chunks/base-CZSB27VO.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-YERQ5DOL.js → better-sqlite3-L2M3TI5D.js} +2 -2
- package/dist/cli/chunks/{brain-handler-FBXBM5XE.js → brain-handler-FHKLQTB4.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-NWO6LNHB.js → branch-enumerator-3BSHOPOK.js} +2 -2
- package/dist/cli/chunks/{browser-EDCG7TNF.js → browser-JUIJPL6Y.js} +2 -2
- package/dist/cli/chunks/browser-workflow-AEMIS6PA.js +2 -0
- package/dist/cli/chunks/{chunk-ARWSPV2C.js → chunk-2GJJGO5D.js} +2 -2
- package/dist/cli/chunks/{chunk-SUFXUM6W.js → chunk-2M75CW5Q.js} +2 -2
- package/dist/cli/chunks/{chunk-ZX4I7IND.js → chunk-2MEWIXW4.js} +2 -2
- package/dist/cli/chunks/{chunk-VEKRK3R6.js → chunk-2TBHPYOU.js} +2 -2
- package/dist/cli/chunks/{chunk-OH4SKOAM.js → chunk-34Y4CIHD.js} +2 -2
- package/dist/cli/chunks/{chunk-JY6HWYC4.js → chunk-35VDOH4Y.js} +1 -1
- package/dist/cli/chunks/{chunk-NK2BR4QZ.js → chunk-366IBPZB.js} +2 -2
- package/dist/cli/chunks/{chunk-PZBYZV5M.js → chunk-3MNKYCLH.js} +1 -1
- package/dist/cli/chunks/chunk-3UUMGWHW.js +316 -0
- package/dist/cli/chunks/{chunk-REGPCPEJ.js → chunk-3Y4GX5FL.js} +2 -2
- package/dist/cli/chunks/{chunk-PGARKOE6.js → chunk-3ZTBV6M3.js} +1 -1
- package/dist/cli/chunks/{chunk-GUHJWBPN.js → chunk-4IYHYHTG.js} +2 -2
- package/dist/cli/chunks/{chunk-J2WALRWR.js → chunk-4JVVVKAX.js} +6 -6
- package/dist/cli/chunks/chunk-4N7YXTV3.js +4 -0
- package/dist/cli/chunks/{chunk-YM3GAJMN.js → chunk-4TM5K6EZ.js} +2 -2
- package/dist/cli/chunks/{chunk-IUGY6Z4Q.js → chunk-5LEUEWJY.js} +2 -2
- package/dist/cli/chunks/{chunk-Q7ONRZBD.js → chunk-5QUOM357.js} +1 -1
- package/dist/cli/chunks/{chunk-5B5TA3X4.js → chunk-5WOBFN2T.js} +2 -2
- package/dist/cli/chunks/{chunk-JEXPSOT2.js → chunk-6AKJ73X3.js} +2 -2
- package/dist/cli/chunks/{chunk-K4NB3MYN.js → chunk-6EQDA4EC.js} +2 -2
- package/dist/cli/chunks/{chunk-HU4QGCIJ.js → chunk-6TYTBQPV.js} +2 -2
- package/dist/cli/chunks/{chunk-RXKOZ6VS.js → chunk-6V6XVGCL.js} +3 -3
- package/dist/cli/chunks/{chunk-4KHSWNFW.js → chunk-6W6GZHQA.js} +6 -6
- package/dist/cli/chunks/{chunk-WTFVYFRZ.js → chunk-7IJVCDDC.js} +1 -1
- package/dist/cli/chunks/{chunk-T5K6ZCA6.js → chunk-7PDC4SKR.js} +1 -1
- package/dist/cli/chunks/{chunk-NF6SLLE6.js → chunk-7SWHW5AC.js} +20 -20
- package/dist/cli/chunks/{chunk-UE33MZOC.js → chunk-7TW5UGDP.js} +2 -2
- package/dist/cli/chunks/{chunk-4AEFJEZH.js → chunk-7UUSV2SK.js} +1 -1
- package/dist/cli/chunks/{chunk-WONHFDWF.js → chunk-A3IQU2ND.js} +2 -2
- package/dist/cli/chunks/{chunk-ALLABEUK.js → chunk-A5H7TF7C.js} +2 -2
- package/dist/cli/chunks/{chunk-C3BW3Q27.js → chunk-A6PII4R4.js} +1 -1
- package/dist/cli/chunks/{chunk-ZE6WJDXM.js → chunk-AEL4XJGJ.js} +2 -2
- package/dist/cli/chunks/{chunk-5QEXDXHQ.js → chunk-AOZJ6UUZ.js} +2 -2
- package/dist/cli/chunks/chunk-APV5UWTU.js +15 -0
- package/dist/cli/chunks/{chunk-YWX7KLNG.js → chunk-AQTQ24SK.js} +3 -3
- package/dist/cli/chunks/{chunk-PBWR2SKH.js → chunk-AS54N3H7.js} +2 -2
- package/dist/cli/chunks/chunk-ASUXS4N4.js +2 -0
- package/dist/cli/chunks/{chunk-JSHASVQ2.js → chunk-B23ROYST.js} +3 -3
- package/dist/cli/chunks/{chunk-NTLWHLAY.js → chunk-BDKQSEEY.js} +1 -1
- package/dist/cli/chunks/{chunk-VLL7ASGH.js → chunk-BO43BGHX.js} +2 -2
- package/dist/cli/chunks/{chunk-KP6LNSDO.js → chunk-CF3BPD2R.js} +161 -159
- package/dist/cli/chunks/{chunk-KTBA2HJC.js → chunk-CFXROOIU.js} +2 -2
- package/dist/cli/chunks/{chunk-SRXXPZVT.js → chunk-CNQUU6CF.js} +2 -2
- package/dist/cli/chunks/{chunk-OKS25EGZ.js → chunk-D5V6C3XG.js} +3 -3
- package/dist/cli/chunks/{chunk-ADEYBXAS.js → chunk-D6PUDLJ4.js} +2 -2
- package/dist/cli/chunks/{chunk-D3LREV4P.js → chunk-DE3QNPTG.js} +1 -1
- package/dist/cli/chunks/{chunk-TJCMG3QE.js → chunk-DH5NWHH2.js} +2 -2
- package/dist/cli/chunks/{chunk-GDSYJHVB.js → chunk-DLA3EHKJ.js} +1 -1
- package/dist/cli/chunks/{chunk-VGYLV6VD.js → chunk-DWG4TN6A.js} +1 -1
- package/dist/cli/chunks/{chunk-4KSCJ462.js → chunk-EBIMVSPH.js} +4 -4
- package/dist/cli/chunks/{chunk-4XEZ562Q.js → chunk-ED5HUPUR.js} +2 -2
- package/dist/cli/chunks/{chunk-CHX65QXY.js → chunk-EQGT4VLC.js} +1 -1
- package/dist/cli/chunks/{chunk-WFDDWRWY.js → chunk-F5BREV2Q.js} +8 -8
- package/dist/cli/chunks/{chunk-7FGSX4UD.js → chunk-FPFGN2Z5.js} +2 -2
- package/dist/cli/chunks/{chunk-3TZRJ5QD.js → chunk-FTUNC4EI.js} +3 -3
- package/dist/cli/chunks/chunk-FXTZXZCU.js +54 -0
- package/dist/cli/chunks/{chunk-DREYYJ7A.js → chunk-GJB3LPCS.js} +2 -2
- package/dist/cli/chunks/{chunk-4P7CGSRL.js → chunk-GPZH6OPP.js} +4 -4
- package/dist/cli/chunks/{chunk-NWNZMXNO.js → chunk-HR7RL4PB.js} +2 -2
- package/dist/cli/chunks/{chunk-NGDRSF6Y.js → chunk-HSR53REE.js} +2 -2
- package/dist/cli/chunks/{chunk-UOHZRR5C.js → chunk-HU474NXP.js} +1 -1
- package/dist/cli/chunks/{chunk-LI7N45GM.js → chunk-HV3ZVUHO.js} +1 -1
- package/dist/cli/chunks/{chunk-WPG6SW7C.js → chunk-HVIFA73X.js} +2 -2
- package/dist/cli/chunks/{chunk-6U6JQS4Z.js → chunk-HW4V7BVV.js} +2 -2
- package/dist/cli/chunks/{chunk-X6W35QXO.js → chunk-I5VJ3FBC.js} +2 -2
- package/dist/cli/chunks/{chunk-YTMWPGVR.js → chunk-IARE5VGI.js} +1 -1
- package/dist/cli/chunks/chunk-INVDDFJC.js +2 -0
- package/dist/cli/chunks/{chunk-RDI3W4H6.js → chunk-JJBTM4JO.js} +2 -2
- package/dist/cli/chunks/chunk-JVQK6NGI.js +14 -0
- package/dist/cli/chunks/{chunk-CFZJEOCD.js → chunk-K65X6CQA.js} +1 -1
- package/dist/cli/chunks/{chunk-6DF6X3SZ.js → chunk-KCBCYF7M.js} +2 -2
- package/dist/cli/chunks/{chunk-QOOADAT7.js → chunk-KGS6H2HB.js} +2 -2
- package/dist/cli/chunks/{chunk-TCJ65NPY.js → chunk-L6OSEWOS.js} +1 -1
- package/dist/cli/chunks/{chunk-BW7S6LIJ.js → chunk-LEB6O2IN.js} +2 -2
- package/dist/cli/chunks/{chunk-WHBDSJUE.js → chunk-LPZAB3N2.js} +3 -3
- package/dist/cli/chunks/{chunk-JYF3QF4C.js → chunk-M3ACHBC7.js} +2 -2
- package/dist/cli/chunks/{chunk-WQZR6DS6.js → chunk-M3ONCPSU.js} +2 -2
- package/dist/cli/chunks/{chunk-7B3XVVYP.js → chunk-MUSYQF53.js} +2 -2
- package/dist/cli/chunks/{chunk-6AVVC7Y3.js → chunk-MZDUBFLP.js} +1 -1
- package/dist/cli/chunks/{chunk-53HWWWFZ.js → chunk-NT6FYFJA.js} +2 -2
- package/dist/cli/chunks/{chunk-6WW6A6JM.js → chunk-O66D4NEJ.js} +2 -2
- package/dist/cli/chunks/{chunk-3NOSMJS4.js → chunk-OGARNKLS.js} +2 -2
- package/dist/cli/chunks/{chunk-KHVWIUAF.js → chunk-OKNMZLGB.js} +2 -2
- package/dist/cli/chunks/{chunk-XCVD57GW.js → chunk-OMHISPPF.js} +1 -1
- package/dist/cli/chunks/{chunk-N5OSH5JO.js → chunk-OT6SOPAL.js} +2 -2
- package/dist/cli/chunks/{chunk-ZZV6GR46.js → chunk-OTTTHNIT.js} +1 -1
- package/dist/cli/chunks/{chunk-XZGRHJGC.js → chunk-P36IODAM.js} +2 -2
- package/dist/cli/chunks/{chunk-JHKMUY4W.js → chunk-P6EGRAQG.js} +2 -2
- package/dist/cli/chunks/{chunk-5JJWVFUV.js → chunk-PBUWNMZ2.js} +1 -1
- package/dist/cli/chunks/{chunk-LQI5GVH7.js → chunk-POTVF6BY.js} +1 -1
- package/dist/cli/chunks/{chunk-N4HQ6FE2.js → chunk-POVP6O6K.js} +1 -1
- package/dist/cli/chunks/{chunk-P24ZBDZY.js → chunk-PPA53NJB.js} +2 -2
- package/dist/cli/chunks/{chunk-OABFAREV.js → chunk-PUPEKA2J.js} +2 -2
- package/dist/cli/chunks/{chunk-27S47AYK.js → chunk-QDQLL2QB.js} +2 -2
- package/dist/cli/chunks/{chunk-MEOAKMKF.js → chunk-QSVNVDA5.js} +1 -1
- package/dist/cli/chunks/{chunk-66HKJJFH.js → chunk-QUXX2DP7.js} +2 -2
- package/dist/cli/chunks/{chunk-TLUMENRZ.js → chunk-QVNMTMDJ.js} +2 -2
- package/dist/cli/chunks/{chunk-LDDIYDIP.js → chunk-QZBFMXO5.js} +54 -54
- package/dist/cli/chunks/{chunk-4THIRDBL.js → chunk-RDTR43YN.js} +2 -2
- package/dist/cli/chunks/{chunk-6MGJMGAD.js → chunk-RGD2CG23.js} +2 -2
- package/dist/cli/chunks/{chunk-V5RP2SU3.js → chunk-RQUSJEON.js} +2 -2
- package/dist/cli/chunks/{chunk-WYE3ICSL.js → chunk-RRSZ27A7.js} +2 -2
- package/dist/cli/chunks/{chunk-GUKBN3BS.js → chunk-RWLOERKK.js} +2 -2
- package/dist/cli/chunks/{chunk-5TEDVUEB.js → chunk-RWQDRPN5.js} +2 -2
- package/dist/cli/chunks/{chunk-2IPBCXTT.js → chunk-S7D4GD7H.js} +2 -2
- package/dist/cli/chunks/{chunk-FTHXV7N7.js → chunk-SKHP5WUP.js} +2 -2
- package/dist/cli/chunks/{chunk-QVTV47TM.js → chunk-SP2JO53K.js} +2 -2
- package/dist/cli/chunks/{chunk-UTFNHITI.js → chunk-SRDECRTL.js} +2 -2
- package/dist/cli/chunks/{chunk-HVAYG54D.js → chunk-TBVPNN65.js} +2 -2
- package/dist/cli/chunks/{chunk-JQVECGYL.js → chunk-U5AVZ3T2.js} +1 -1
- package/dist/cli/chunks/{chunk-EQ3BJS37.js → chunk-UCSGZVJX.js} +1 -1
- package/dist/cli/chunks/{chunk-5C4UYXQL.js → chunk-UGNTLSBL.js} +2 -2
- package/dist/cli/chunks/{chunk-W5NHBYYS.js → chunk-UTALYUMW.js} +2 -2
- package/dist/cli/chunks/{chunk-35XRY6ZW.js → chunk-UZDTRCVU.js} +9 -9
- package/dist/cli/chunks/{chunk-AVOYMVD6.js → chunk-V5NYGDSX.js} +2 -2
- package/dist/cli/chunks/{chunk-FQYXPSWD.js → chunk-VGN46ZT4.js} +2 -2
- package/dist/cli/chunks/{chunk-QMHWJBD3.js → chunk-VHBZADYK.js} +2 -2
- package/dist/cli/chunks/{chunk-54JYUOSR.js → chunk-VOKIUF7I.js} +1 -1
- package/dist/cli/chunks/{chunk-PDLVO3ZR.js → chunk-VRT736E3.js} +2 -2
- package/dist/cli/chunks/{chunk-DV7I6CRH.js → chunk-VUBLJBHQ.js} +2 -2
- package/dist/cli/chunks/{chunk-FRGNM6SW.js → chunk-VX7CQUO7.js} +2 -2
- package/dist/cli/chunks/{chunk-YDM2DPUU.js → chunk-W7EHNX3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-W5HQQTVH.js → chunk-WI7I6LMM.js} +1 -1
- package/dist/cli/chunks/{chunk-46DUU44C.js → chunk-WLOHTLHO.js} +2 -2
- package/dist/cli/chunks/{chunk-W6K77PQR.js → chunk-WQZBKLAG.js} +1 -1
- package/dist/cli/chunks/{chunk-UGUZFUQG.js → chunk-WSND64RL.js} +2 -2
- package/dist/cli/chunks/{chunk-PNK5KHSI.js → chunk-WSUYEVSY.js} +1 -1
- package/dist/cli/chunks/{chunk-FIIHSEXP.js → chunk-WTMLRMKW.js} +2 -2
- package/dist/cli/chunks/{chunk-OPBPFNBO.js → chunk-WW4RJ6BH.js} +2 -2
- package/dist/cli/chunks/{chunk-KBK4GBJQ.js → chunk-X335K4SU.js} +2 -2
- package/dist/cli/chunks/{chunk-NS4RIZ4F.js → chunk-X33LID2T.js} +1 -1
- package/dist/cli/chunks/{chunk-L5GEWKR3.js → chunk-XTGVGZ4J.js} +3 -3
- package/dist/cli/chunks/{chunk-CTLHNFPM.js → chunk-XV2TIODR.js} +1 -1
- package/dist/cli/chunks/{chunk-GAKVCN3C.js → chunk-XXW4KFBB.js} +1 -1
- package/dist/cli/chunks/{chunk-CTK7NMSJ.js → chunk-YCGU2LI7.js} +2 -2
- package/dist/cli/chunks/chunk-YGEC3PSD.js +2 -0
- package/dist/cli/chunks/{chunk-ARGMYSDY.js → chunk-YGKU2QRC.js} +1 -1
- package/dist/cli/chunks/{chunk-6Q7PWKWV.js → chunk-YHZGFWJE.js} +2 -2
- package/dist/cli/chunks/{chunk-V3ISBQ5Q.js → chunk-YJH7UFA2.js} +2 -2
- package/dist/cli/chunks/{chunk-A5LOELVV.js → chunk-YQ3ZW47V.js} +2 -2
- package/dist/cli/chunks/{chunk-25IWHVMW.js → chunk-YTRGMILO.js} +2 -2
- package/dist/cli/chunks/chunk-YW4GM36K.js +2 -0
- package/dist/cli/chunks/{chunk-JW2HNT3J.js → chunk-Z7JPWXW2.js} +2 -2
- package/dist/cli/chunks/{chunk-PZDI7WQ3.js → chunk-Z7UGEQ4G.js} +1 -1
- package/dist/cli/chunks/{chunk-TBCQWD5A.js → chunk-ZATQLTYL.js} +1 -1
- package/dist/cli/chunks/{chunk-DKWB4ERY.js → chunk-ZI6NJEBY.js} +1 -1
- package/dist/cli/chunks/{chunk-B3DWOR5R.js → chunk-ZJW4HRUA.js} +1 -1
- package/dist/cli/chunks/{chunk-X4PGLEPQ.js → chunk-ZL2GYU7H.js} +2 -2
- package/dist/cli/chunks/{ci-K7DG4GSO.js → ci-JPISJ25U.js} +3 -3
- package/dist/cli/chunks/{ci-output-EBSUG6HP.js → ci-output-DPHTFIGX.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-P6N6YIRZ.js → circuit-breaker-PQ65VU2M.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-P6EZPQZT.js → claude-flow-setup-GKHVO7AD.js} +2 -2
- package/dist/cli/chunks/client-BS7I637W.js +2 -0
- package/dist/cli/chunks/{cline-installer-EVZZ3EFY.js → cline-installer-HWMQZJ64.js} +2 -2
- package/dist/cli/chunks/{code-3WLBG2XK.js → code-OTY7BF3D.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-ZP6D4WL2.js → code-index-extractor-FG3TMHHR.js} +2 -2
- package/dist/cli/chunks/{codex-installer-XAUI4SB7.js → codex-installer-63JARKKS.js} +2 -2
- package/dist/cli/chunks/{completions-RHFNDDG3.js → completions-4ZHONFML.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-DCW7Q3OR.js → complexity-analyzer-FYHTJW5Y.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-53SQA5T6.js → continuedev-installer-ZAWDSUR3.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-SXXMFB6T.js → copilot-installer-5QK565JX.js} +2 -2
- package/dist/cli/chunks/core-handlers-UG7RMTK5.js +2 -0
- package/dist/cli/chunks/cost-tracker-AWWMPPBJ.js +2 -0
- package/dist/cli/chunks/{coverage-AWCS2SP7.js → coverage-SMFQEGKE.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-NX7F6TOF.js +2 -0
- package/dist/cli/chunks/{cursor-installer-4TYF5V5J.js → cursor-installer-3BL7JACV.js} +2 -2
- package/dist/cli/chunks/{daemon-CTZXGN5V.js → daemon-OJ624POF.js} +4 -4
- package/dist/cli/chunks/{daemon-OOY4H6RJ.js → daemon-R6ULBHHF.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-3WG24Q33.js → dag-attention-scheduler-J6I3LTMY.js} +2 -2
- package/dist/cli/chunks/{detect-O7MUZ6NX.js → detect-5Q5W33UR.js} +2 -2
- package/dist/cli/chunks/{dist-node-H4XI7BAF.js → dist-node-GJNW56NA.js} +2 -2
- package/dist/cli/chunks/{domain-handler-FU4WZ23B.js → domain-handler-IZQY2G44.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-XK26KYNJ.js → domain-plugins-PIGO3KI2.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-6B5NOVH6.js → domain-transfer-NU3B4FQG.js} +2 -2
- package/dist/cli/chunks/dream-GYEH57FW.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-XNZXPZNL.js → embed-and-insert-pattern-5QDDRPWV.js} +2 -2
- package/dist/cli/chunks/{eval-J3Q5TTI7.js → eval-TB5HOAUY.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-COKIGMXW.js → experience-capture-middleware-SIYVLKDE.js} +3 -3
- package/dist/cli/chunks/{fast-paths-IHWPJI6I.js → fast-paths-T7QELS6D.js} +2 -2
- package/dist/cli/chunks/{feature-flags-WUXFWZLR.js → feature-flags-T3CNNYMJ.js} +2 -2
- package/dist/cli/chunks/{feature-flags-G7ONDNTT.js → feature-flags-TNZ7ZAJV.js} +2 -2
- package/dist/cli/chunks/{file-discovery-JN3YMBOJ.js → file-discovery-M45P2ZCY.js} +2 -2
- package/dist/cli/chunks/{fleet-OUHUZJE4.js → fleet-DSBZPHBZ.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-PRH55ZT6.js → gnn-wrapper-EHODCF32.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-6YF35AQS.js → heartbeat-handler-V5DBVF7V.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-4TJ3T7LR.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-PHFK4EAP.js +2 -0
- package/dist/cli/chunks/hnsw-index-434XDDBH.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-7PAFSTJO.js → hnsw-legacy-bridge-IYKDYA2F.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-UETDZNNN.js → hnswlib-node-DKG4LW3X.js} +2 -2
- package/dist/cli/chunks/{hooks-QQNUKQAS.js → hooks-VKNMAILY.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-DYVJQENQ.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-5GDGE3ET.js → hypergraph-engine-AXZVP7A7.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-C3F2OJYA.js → hypergraph-handler-6EO6JN4Z.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-CBAST6M2.js +2 -0
- package/dist/cli/chunks/init-handler-N3NG3RHN.js +86 -0
- package/dist/cli/chunks/init-wizard-DWIJW7HY.js +2 -0
- package/dist/cli/chunks/kernel-AQGCS4X2.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-VLJENC76.js → kilocode-installer-JICGAHLM.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-UYPYM6LA.js → kiro-installer-VYBFP6ZH.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-2ICXFUUV.js +2 -0
- package/dist/cli/chunks/{learning-SFIWIG6Z.js → learning-3BHEZEPK.js} +3 -3
- package/dist/cli/chunks/{llm-router-V633KAS5.js → llm-router-GPTEZCUN.js} +4 -4
- package/dist/cli/chunks/llm-router-service-C47RGTH6.js +2 -0
- package/dist/cli/chunks/{load-UWZV4JRA.js → load-W5BIRPU4.js} +2 -2
- package/dist/cli/chunks/load-test-LRDAW3N6.js +2 -0
- package/dist/cli/chunks/{mcp-XVFHUKCP.js → mcp-EBV4DZPG.js} +2 -2
- package/dist/cli/chunks/{memory-BQ5652VK.js → memory-7F6YYKNL.js} +5 -5
- package/dist/cli/chunks/memory-backend-UFBAYPQ6.js +2 -0
- package/dist/cli/chunks/memory-handlers-OGLJHAAJ.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-X6AQ7VVR.js → multi-model-executor-3ZIA2YOL.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-N3V2Z4EF.js → opencode-installer-2XRZUTLR.js} +2 -2
- package/dist/cli/chunks/{orchestrator-KNEKS4F7.js → orchestrator-VSZVJUJW.js} +87 -28
- package/dist/cli/chunks/pattern-null-store-27FCITT3.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-MZIM6XWU.js → pattern-usage-recorder-I2IGVHRL.js} +2 -2
- package/dist/cli/chunks/{pipeline-LNLBKSXR.js → pipeline-5G3O6WBY.js} +2 -2
- package/dist/cli/chunks/{platform-OMUDXHD3.js → platform-6GUFDIA3.js} +2 -2
- package/dist/cli/chunks/{plugin-HGY6KKZW.js → plugin-GYXE4CIC.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-LZBHLQYN.js → prime-radiant-advanced-wasm-THX6JLGZ.js} +2 -2
- package/dist/cli/chunks/{project-root-VPSCDBMD.js → project-root-QJRBKZQU.js} +2 -2
- package/dist/cli/chunks/protocol-executor-XWXXTMEW.js +2 -0
- package/dist/cli/chunks/{protocol-handler-LZXT3TXU.js → protocol-handler-B54LRU26.js} +2 -2
- package/dist/cli/chunks/{prove-I4VKQEYQ.js → prove-PCY2WQOD.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-3RMYXENE.js +2 -0
- package/dist/cli/chunks/{quality-VVAWK2DD.js → quality-LPVDZC7U.js} +2 -2
- package/dist/cli/chunks/{quality-gate-RGXLWYT6.js → quality-gate-L3KXL6WE.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-AS6DZ7UJ.js +2 -0
- package/dist/cli/chunks/{real-embeddings-WM66PMQ6.js → real-embeddings-N3H523PJ.js} +2 -2
- package/dist/cli/chunks/{ref-validation-ZIWJNI6M.js → ref-validation-6BKDPHZ7.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-QYSI3STC.js → roocode-installer-NSGGTWXE.js} +2 -2
- package/dist/cli/chunks/router-OVNLNGHO.js +2 -0
- package/dist/cli/chunks/routing-feedback-TBOWEB6H.js +2 -0
- package/dist/cli/chunks/{routing-handler-BID3EOLE.js → routing-handler-SRQNUBG3.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-DXIFMF4W.js → ruvector-commands-2IGULGDE.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-YJYRCYGT.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-VMRQ2SFO.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-EV5E6SAO.js → rvf-migration-coordinator-ZD6WK5CK.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-B75L3ALW.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-IT6DCCJK.js → rvf-store-integrity-QULKUBBI.js} +2 -2
- package/dist/cli/chunks/safe-db-CRQHMCV6.js +2 -0
- package/dist/cli/chunks/schedule-L3DKJRXU.js +2 -0
- package/dist/cli/chunks/scheduler-VRHYUGY5.js +2 -0
- package/dist/cli/chunks/{security-AAFAEATQ.js → security-JW4EBARW.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-QIHSYHAF.js → shared-rvf-adapter-VQ7NJTGY.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-V7OZ6TBR.js → shared-rvf-dual-writer-SKTS52HK.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-JVAZETTL.js +2 -0
- package/dist/cli/chunks/{standalone-memory-ALZI6VPX.js → standalone-memory-3N4YJCSY.js} +2 -2
- package/dist/cli/chunks/{status-handler-DED5A3OW.js → status-handler-5BQ2IIDG.js} +2 -2
- package/dist/cli/chunks/{structural-health-CB7L3NWH.js → structural-health-WGYR2RJB.js} +2 -2
- package/dist/cli/chunks/{sync-QNPGETIO.js → sync-DLKSXTIR.js} +2 -2
- package/dist/cli/chunks/sync-R5OKUBTQ.js +2 -0
- package/dist/cli/chunks/{task-handler-CGHXYFIF.js → task-handler-Z5KNTSUX.js} +2 -2
- package/dist/cli/chunks/{task-handlers-A6BGQJIB.js → task-handlers-RZFMYFSC.js} +3 -3
- package/dist/cli/chunks/test-LHWKZJRN.js +34 -0
- package/dist/cli/chunks/test-scheduling-EN7WXUMS.js +15 -0
- package/dist/cli/chunks/token-bootstrap-4V3OO4EC.js +2 -0
- package/dist/cli/chunks/{token-usage-25BRFKJ5.js → token-usage-PFC2BYBS.js} +2 -2
- package/dist/cli/chunks/{transformers-TBVVSZMF.js → transformers-VZCC4SHC.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-N7KCOQT4.js → tree-sitter-wasm-parser-ZYDQXGKN.js} +2 -2
- package/dist/cli/chunks/{types-TFHWJGRK.js → types-I6AWHZZQ.js} +2 -2
- package/dist/cli/chunks/unified-memory-WOOCCIUM.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-PDDHFLUB.js +2 -0
- package/dist/cli/chunks/unified-persistence-6ETD3JSC.js +2 -0
- package/dist/cli/chunks/{upgrade-4VWQU7RD.js → upgrade-T7SG75PA.js} +2 -2
- package/dist/cli/chunks/{validate-FF7WVXMP.js → validate-YLYEHTY3.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-NRLH4EDC.js → validate-swarm-VTLTRUE3.js} +2 -2
- package/dist/cli/chunks/visual-security-O4OT2YPY.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-VVU3LULW.js → web-tree-sitter-JUM7ZY5M.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-Q2ZNWG2D.js → windsurf-installer-4KS2466T.js} +2 -2
- package/dist/cli/chunks/witness-chain-67JHPDCN.js +2 -0
- package/dist/cli/chunks/{witness-chain-FP3D4PQL.js → witness-chain-E4X6TOCT.js} +2 -2
- package/dist/cli/chunks/witness-chain-repair-MB53OZO6.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-LACGL6BK.js → witness-chain-verifier-LBWJHO7Y.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-GQZIB5ZE.js → witness-key-manager-5IHVMXHJ.js} +2 -2
- package/dist/cli/chunks/{workflow-JPA5Y7L6.js → workflow-XUQXIRNE.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-ZVFSNRYZ.js +2 -0
- package/dist/cli/chunks/wrappers-YVF5SQUN.js +2 -0
- package/dist/cli/commands/test.js +42 -9
- package/dist/cli/handlers/init-flags.d.ts +45 -0
- package/dist/cli/handlers/init-flags.js +35 -0
- package/dist/cli/handlers/init-handler.d.ts +6 -0
- package/dist/cli/handlers/init-handler.js +24 -10
- package/dist/cli/utils/generated-test-writer.d.ts +35 -0
- package/dist/cli/utils/generated-test-writer.js +44 -0
- package/dist/context/compiler.js +4 -1
- package/dist/coordination/consensus/providers/ollama-provider.js +16 -27
- package/dist/coordination/consensus/providers/openrouter-provider.js +13 -24
- package/dist/coordination/handlers/test-execution-handlers.js +4 -2
- package/dist/coordination/protocols/defect-investigation.js +4 -1
- package/dist/coordination/task-executor.js +4 -2
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +3 -3
- package/dist/domains/coverage-analysis/services/gap-detector.js +3 -1
- package/dist/domains/learning-optimization/services/learning-coordinator.js +4 -2
- package/dist/domains/test-execution/services/flaky-detector.js +8 -2
- package/dist/domains/test-execution/services/retry-handler.js +23 -20
- package/dist/domains/test-execution/services/test-executor.js +5 -2
- package/dist/domains/test-generation/services/test-generator.js +5 -2
- package/dist/governance/compliance-reporter.js +8 -7
- package/dist/governance/proof-envelope-integration.js +3 -1
- package/dist/init/claude-plugin-detection.d.ts +63 -0
- package/dist/init/claude-plugin-detection.js +118 -0
- package/dist/init/init-wizard-hooks.d.ts +6 -1
- package/dist/init/init-wizard-hooks.js +9 -1
- package/dist/init/init-wizard.d.ts +4 -0
- package/dist/init/init-wizard.js +3 -1
- package/dist/init/orchestrator.js +1 -0
- package/dist/init/phases/07-hooks.js +30 -4
- package/dist/init/phases/08-mcp.d.ts +7 -0
- package/dist/init/phases/08-mcp.js +22 -0
- package/dist/init/phases/10-workers.js +42 -6
- package/dist/init/phases/phase-interface.d.ts +5 -1
- package/dist/integrations/agentic-flow/onnx-embeddings/embedding-generator.d.ts +4 -1
- package/dist/integrations/agentic-flow/onnx-embeddings/embedding-generator.js +6 -2
- package/dist/integrations/browser/qe-dashboard/wasm-vector-store.js +2 -1
- package/dist/integrations/ruvector/coverage-router.d.ts +3 -1
- package/dist/integrations/ruvector/coverage-router.js +7 -6
- package/dist/integrations/ruvector/diff-risk-classifier.js +5 -4
- package/dist/integrations/ruvector/rvf-dual-writer.js +10 -1
- package/dist/integrations/vibium/runtime.js +2 -6
- package/dist/learning/dream/dream-engine.d.ts +5 -0
- package/dist/learning/dream/dream-engine.js +20 -3
- package/dist/learning/embedding-space.d.ts +18 -0
- package/dist/learning/embedding-space.js +33 -0
- package/dist/learning/rvf-pattern-store.js +19 -5
- package/dist/mcp/bundle.js +443 -441
- package/dist/mcp/handlers/domain-handler-configs.js +3 -1
- package/dist/mcp/handlers/handler-factory.js +7 -0
- package/dist/mcp/handlers/save-results-option.d.ts +97 -0
- package/dist/mcp/handlers/save-results-option.js +94 -0
- package/dist/mcp/protocol-server.js +23 -11
- package/dist/mcp/security/rate-limiter.d.ts +8 -1
- package/dist/mcp/security/rate-limiter.js +33 -4
- package/dist/mcp/services/session-resume.js +11 -0
- package/dist/mcp/services/session-store.d.ts +31 -2
- package/dist/mcp/services/session-store.js +84 -15
- package/dist/mcp/services/session-write-buffer.d.ts +55 -0
- package/dist/mcp/services/session-write-buffer.js +144 -0
- package/dist/mcp/types.d.ts +9 -0
- package/dist/memory/crdt/g-counter.js +10 -8
- package/dist/shared/embeddings/ollama-client.d.ts +1 -1
- package/dist/shared/embeddings/ollama-client.js +30 -31
- package/dist/shared/git/git-analyzer.d.ts +4 -1
- package/dist/shared/git/git-analyzer.js +9 -4
- package/dist/shared/llm/cost-tracker.js +8 -6
- package/dist/shared/llm/providers/azure-openai.js +5 -21
- package/dist/shared/llm/providers/bedrock.js +5 -21
- package/dist/shared/llm/providers/claude.js +5 -21
- package/dist/shared/llm/providers/cognitum.js +5 -17
- package/dist/shared/llm/providers/gemini.js +9 -23
- package/dist/shared/llm/providers/ollama.js +5 -21
- package/dist/shared/llm/providers/openai.js +5 -21
- package/dist/shared/llm/providers/openrouter.js +9 -23
- package/dist/shared/llm/providers/response-deadline.d.ts +3 -0
- package/dist/shared/llm/providers/response-deadline.js +100 -0
- package/dist/shared/llm/spend-ledger.js +3 -2
- package/dist/shared/metrics/code-metrics.d.ts +1 -0
- package/dist/shared/metrics/code-metrics.js +3 -44
- package/dist/shared/metrics/cognitive-complexity.d.ts +17 -0
- package/dist/shared/metrics/cognitive-complexity.js +108 -0
- package/dist/shared/npm-cli-invocation.d.ts +21 -0
- package/dist/shared/npm-cli-invocation.js +28 -0
- package/dist/shared/optional-module.js +24 -0
- package/dist/shared/test-runner-args.d.ts +42 -0
- package/dist/shared/test-runner-args.js +74 -0
- package/dist/shared/utils/safe-record.d.ts +18 -0
- package/dist/shared/utils/safe-record.js +28 -0
- package/dist/test-scheduling/executors/vitest-executor.js +23 -5
- package/dist/workers/quality-daemon/git-watcher.js +5 -0
- package/package.json +1 -1
- package/dist/adapters/ag-ui/json-patch-utils.d.ts +0 -136
- package/dist/adapters/ag-ui/json-patch-utils.js +0 -575
- package/dist/cli/chunks/adapter-Q6RPGMUE.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-JQPXIU7C.js +0 -2
- package/dist/cli/chunks/base-5SK64NXB.js +0 -2
- package/dist/cli/chunks/browser-workflow-WN7XNTCJ.js +0 -2
- package/dist/cli/chunks/chunk-2K3QFLX2.js +0 -2
- package/dist/cli/chunks/chunk-53C7TGC4.js +0 -4
- package/dist/cli/chunks/chunk-J4ULR4QR.js +0 -54
- package/dist/cli/chunks/chunk-R2ICZKQA.js +0 -2
- package/dist/cli/chunks/chunk-TR37Q7A6.js +0 -15
- package/dist/cli/chunks/chunk-XYZUBAR6.js +0 -316
- package/dist/cli/chunks/chunk-YDMPTCJ3.js +0 -14
- package/dist/cli/chunks/client-ZYH66YRI.js +0 -2
- package/dist/cli/chunks/core-handlers-XKSPHEHE.js +0 -2
- package/dist/cli/chunks/cost-tracker-CKLDQ5AZ.js +0 -2
- package/dist/cli/chunks/cross-domain-router-6VYNFQZA.js +0 -2
- package/dist/cli/chunks/dream-DRSSIHPP.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-FMICCNWK.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-4TGBNJEZ.js +0 -2
- package/dist/cli/chunks/hnsw-index-J4NSCPAZ.js +0 -2
- package/dist/cli/chunks/hybrid-backend-NKPA3QE7.js +0 -2
- package/dist/cli/chunks/impact-analyzer-MWX7XY7X.js +0 -2
- package/dist/cli/chunks/init-handler-C7ZBDAC5.js +0 -81
- package/dist/cli/chunks/init-wizard-EX5N5Q7X.js +0 -2
- package/dist/cli/chunks/kernel-EQLZDHDD.js +0 -2
- package/dist/cli/chunks/knowledge-graph-A3WSMQ6U.js +0 -2
- package/dist/cli/chunks/llm-router-service-A6XYWTL6.js +0 -2
- package/dist/cli/chunks/load-test-WF2PCXLI.js +0 -2
- package/dist/cli/chunks/memory-backend-BKGLI2RF.js +0 -2
- package/dist/cli/chunks/memory-handlers-PWI3G4P4.js +0 -2
- package/dist/cli/chunks/pattern-null-store-YTBLEH7D.js +0 -2
- package/dist/cli/chunks/protocol-executor-HFR2D54O.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-MYFBQUYV.js +0 -2
- package/dist/cli/chunks/queen-coordinator-CQQMOTIW.js +0 -2
- package/dist/cli/chunks/router-GKWLPA3N.js +0 -2
- package/dist/cli/chunks/routing-feedback-WA4D5JRF.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-H3ZXS5MA.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-J7MTCOQA.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-HXBY4VYI.js +0 -2
- package/dist/cli/chunks/safe-db-INVJ5LHR.js +0 -2
- package/dist/cli/chunks/schedule-XRIPPL52.js +0 -2
- package/dist/cli/chunks/scheduler-HBN3KPRW.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-6KNLT5Q2.js +0 -2
- package/dist/cli/chunks/sync-S6Z2U46T.js +0 -2
- package/dist/cli/chunks/test-IISTF5W6.js +0 -33
- package/dist/cli/chunks/test-scheduling-FKYX4OLF.js +0 -15
- package/dist/cli/chunks/token-bootstrap-OKO3JEKT.js +0 -2
- package/dist/cli/chunks/unified-memory-WVELSL6T.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-7P5MVKXD.js +0 -2
- package/dist/cli/chunks/unified-persistence-YLFCEWYY.js +0 -2
- package/dist/cli/chunks/visual-security-T5OM742H.js +0 -2
- package/dist/cli/chunks/witness-chain-D6X4OZP5.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-3LG4BF7C.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-OORDDKT3.js +0 -2
- package/dist/cli/chunks/wrappers-2B5NHICD.js +0 -2
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { randomUUID } from 'crypto';
|
|
9
9
|
import { getModelCost } from './model-registry.js';
|
|
10
|
+
import { addToCount, createSafeRecord } from '../utils/safe-record.js';
|
|
10
11
|
/**
|
|
11
12
|
* Token pricing per model (cost per 1M tokens in USD).
|
|
12
13
|
* Current-generation prices verified 2026-09-27 (Anthropic docs, OpenRouter
|
|
@@ -133,7 +134,8 @@ export const MODEL_PRICING = {
|
|
|
133
134
|
* as a free/local model.
|
|
134
135
|
*/
|
|
135
136
|
export function resolveModelPricing(model) {
|
|
136
|
-
|
|
137
|
+
// Own keys only: a model named `toString` must not resolve to the inherited method (#914).
|
|
138
|
+
const pricing = Object.hasOwn(MODEL_PRICING, model) ? MODEL_PRICING[model] : undefined;
|
|
137
139
|
if (pricing) {
|
|
138
140
|
return { input: pricing.input, output: pricing.output };
|
|
139
141
|
}
|
|
@@ -238,15 +240,15 @@ export class CostTracker {
|
|
|
238
240
|
gemini: 0,
|
|
239
241
|
cognitum: 0,
|
|
240
242
|
};
|
|
241
|
-
|
|
243
|
+
// Model and provider names are data, so buckets must not inherit from Object.prototype (#914).
|
|
244
|
+
const byModel = createSafeRecord();
|
|
242
245
|
let totalCost = 0;
|
|
243
246
|
let totalTokens = 0;
|
|
244
247
|
for (const record of relevantRecords) {
|
|
245
248
|
totalCost += record.cost.totalCost;
|
|
246
249
|
totalTokens += record.usage.totalTokens;
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
byModel[record.model] = (byModel[record.model] || 0) + record.cost.totalCost;
|
|
250
|
+
addToCount(byProvider, record.provider, record.cost.totalCost);
|
|
251
|
+
addToCount(byModel, record.model, record.cost.totalCost);
|
|
250
252
|
}
|
|
251
253
|
return {
|
|
252
254
|
period,
|
|
@@ -277,7 +279,7 @@ export class CostTracker {
|
|
|
277
279
|
getUsageByProvider(provider, period = 'all') {
|
|
278
280
|
const periodStart = this.getPeriodStart(new Date(), period);
|
|
279
281
|
const providerRecords = this.records.filter((r) => r.provider === provider && r.timestamp >= periodStart);
|
|
280
|
-
const models =
|
|
282
|
+
const models = createSafeRecord();
|
|
281
283
|
let totalCost = 0;
|
|
282
284
|
let totalTokens = 0;
|
|
283
285
|
for (const record of providerRecords) {
|
|
@@ -33,6 +33,7 @@ import { applyOpenAIParams } from '../openai-params.js';
|
|
|
33
33
|
import { TokenMetricsCollector } from '../../../learning/token-tracker.js';
|
|
34
34
|
import { toError } from '../../error-utils.js';
|
|
35
35
|
import { backoffDelay } from '../retry.js';
|
|
36
|
+
import { fetchWithResponseDeadline } from './response-deadline.js';
|
|
36
37
|
/**
|
|
37
38
|
* Default Azure OpenAI configuration
|
|
38
39
|
*/
|
|
@@ -492,27 +493,10 @@ export class AzureOpenAIProvider {
|
|
|
492
493
|
* Fetch with timeout
|
|
493
494
|
*/
|
|
494
495
|
async fetchWithTimeout(url, options, timeoutMs) {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
...options,
|
|
500
|
-
signal: controller.signal,
|
|
501
|
-
});
|
|
502
|
-
return response;
|
|
503
|
-
}
|
|
504
|
-
catch (error) {
|
|
505
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
506
|
-
throw createLLMError('Request timed out', 'TIMEOUT', {
|
|
507
|
-
provider: 'azure-openai',
|
|
508
|
-
retryable: true,
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
throw error;
|
|
512
|
-
}
|
|
513
|
-
finally {
|
|
514
|
-
clearTimeout(timeoutId);
|
|
515
|
-
}
|
|
496
|
+
return fetchWithResponseDeadline(url, options, timeoutMs, () => createLLMError('Request timed out', 'TIMEOUT', {
|
|
497
|
+
provider: 'azure-openai',
|
|
498
|
+
retryable: true,
|
|
499
|
+
}));
|
|
516
500
|
}
|
|
517
501
|
/**
|
|
518
502
|
* Fetch with retry logic
|
|
@@ -16,6 +16,7 @@ import { CostTracker } from '../cost-tracker.js';
|
|
|
16
16
|
import { TokenMetricsCollector } from '../../../learning/token-tracker.js';
|
|
17
17
|
import { toError } from '../../error-utils.js';
|
|
18
18
|
import { backoffDelay } from '../retry.js';
|
|
19
|
+
import { fetchWithResponseDeadline } from './response-deadline.js';
|
|
19
20
|
import { applyAnthropicParams } from '../anthropic-params.js';
|
|
20
21
|
/**
|
|
21
22
|
* Default Bedrock configuration
|
|
@@ -545,27 +546,10 @@ export class BedrockProvider {
|
|
|
545
546
|
* Fetch with timeout
|
|
546
547
|
*/
|
|
547
548
|
async fetchWithTimeout(url, options, timeoutMs) {
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
...options,
|
|
553
|
-
signal: controller.signal,
|
|
554
|
-
});
|
|
555
|
-
return response;
|
|
556
|
-
}
|
|
557
|
-
catch (error) {
|
|
558
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
559
|
-
throw createLLMError('Request timed out', 'TIMEOUT', {
|
|
560
|
-
provider: 'bedrock',
|
|
561
|
-
retryable: true,
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
throw error;
|
|
565
|
-
}
|
|
566
|
-
finally {
|
|
567
|
-
clearTimeout(timeoutId);
|
|
568
|
-
}
|
|
549
|
+
return fetchWithResponseDeadline(url, options, timeoutMs, () => createLLMError('Request timed out', 'TIMEOUT', {
|
|
550
|
+
provider: 'bedrock',
|
|
551
|
+
retryable: true,
|
|
552
|
+
}));
|
|
569
553
|
}
|
|
570
554
|
/**
|
|
571
555
|
* Sleep utility
|
|
@@ -10,6 +10,7 @@ import { CostTracker } from '../cost-tracker.js';
|
|
|
10
10
|
import { TokenMetricsCollector } from '../../../learning/token-tracker.js';
|
|
11
11
|
import { toError } from '../../error-utils.js';
|
|
12
12
|
import { backoffDelay } from '../retry.js';
|
|
13
|
+
import { fetchWithResponseDeadline } from './response-deadline.js';
|
|
13
14
|
import { applyAnthropicParams } from '../anthropic-params.js';
|
|
14
15
|
import { DEFAULT_SONNET_MODEL } from '../model-registry.js';
|
|
15
16
|
/**
|
|
@@ -357,27 +358,10 @@ export class ClaudeProvider {
|
|
|
357
358
|
* Fetch with timeout
|
|
358
359
|
*/
|
|
359
360
|
async fetchWithTimeout(url, options, timeoutMs) {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
...options,
|
|
365
|
-
signal: controller.signal,
|
|
366
|
-
});
|
|
367
|
-
return response;
|
|
368
|
-
}
|
|
369
|
-
catch (error) {
|
|
370
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
371
|
-
throw createLLMError('Request timed out', 'TIMEOUT', {
|
|
372
|
-
provider: 'claude',
|
|
373
|
-
retryable: true,
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
throw error;
|
|
377
|
-
}
|
|
378
|
-
finally {
|
|
379
|
-
clearTimeout(timeoutId);
|
|
380
|
-
}
|
|
361
|
+
return fetchWithResponseDeadline(url, options, timeoutMs, () => createLLMError('Request timed out', 'TIMEOUT', {
|
|
362
|
+
provider: 'claude',
|
|
363
|
+
retryable: true,
|
|
364
|
+
}));
|
|
381
365
|
}
|
|
382
366
|
/**
|
|
383
367
|
* Fetch with retry logic
|
|
@@ -16,6 +16,7 @@ import { createLLMError, } from '../interfaces.js';
|
|
|
16
16
|
import { TokenMetricsCollector } from '../../../learning/token-tracker.js';
|
|
17
17
|
import { toError } from '../../error-utils.js';
|
|
18
18
|
import { backoffDelay } from '../retry.js';
|
|
19
|
+
import { fetchWithResponseDeadline } from './response-deadline.js';
|
|
19
20
|
export const DEFAULT_COGNITUM_CONFIG = {
|
|
20
21
|
model: 'cognitum-auto',
|
|
21
22
|
maxTokens: 4096,
|
|
@@ -320,23 +321,10 @@ export class CognitumProvider {
|
|
|
320
321
|
}
|
|
321
322
|
}
|
|
322
323
|
async fetchWithTimeout(url, options, timeoutMs) {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
}
|
|
328
|
-
catch (error) {
|
|
329
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
330
|
-
throw createLLMError('Request timed out', 'TIMEOUT', {
|
|
331
|
-
provider: 'cognitum',
|
|
332
|
-
retryable: true,
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
throw error;
|
|
336
|
-
}
|
|
337
|
-
finally {
|
|
338
|
-
clearTimeout(timeoutId);
|
|
339
|
-
}
|
|
324
|
+
return fetchWithResponseDeadline(url, options, timeoutMs, () => createLLMError('Request timed out', 'TIMEOUT', {
|
|
325
|
+
provider: 'cognitum',
|
|
326
|
+
retryable: true,
|
|
327
|
+
}));
|
|
340
328
|
}
|
|
341
329
|
async fetchWithRetry(url, options, timeoutMs, maxRetries) {
|
|
342
330
|
let lastError;
|
|
@@ -12,6 +12,7 @@ import { createLLMError, } from '../interfaces.js';
|
|
|
12
12
|
import { TokenMetricsCollector } from '../../../learning/token-tracker.js';
|
|
13
13
|
import { toError } from '../../error-utils.js';
|
|
14
14
|
import { backoffDelay } from '../retry.js';
|
|
15
|
+
import { fetchWithResponseDeadline } from './response-deadline.js';
|
|
15
16
|
import { safeJsonParse } from '../../safe-json.js';
|
|
16
17
|
/**
|
|
17
18
|
* Default Gemini configuration
|
|
@@ -246,7 +247,7 @@ export class GeminiProvider {
|
|
|
246
247
|
method: 'POST',
|
|
247
248
|
headers: { 'Content-Type': 'application/json' },
|
|
248
249
|
body: JSON.stringify(body),
|
|
249
|
-
}, options?.timeoutMs ?? this.config.timeoutMs ?? 60000);
|
|
250
|
+
}, options?.timeoutMs ?? this.config.timeoutMs ?? 60000, 'idle');
|
|
250
251
|
if (!response.ok) {
|
|
251
252
|
const errorData = await response.json().catch(() => ({
|
|
252
253
|
error: { message: 'Unknown error', code: 0, status: 'UNKNOWN' },
|
|
@@ -304,6 +305,8 @@ export class GeminiProvider {
|
|
|
304
305
|
}
|
|
305
306
|
}
|
|
306
307
|
finally {
|
|
308
|
+
// Returning early from the generator must also release its request deadline.
|
|
309
|
+
await reader.cancel().catch(() => { });
|
|
307
310
|
reader.releaseLock();
|
|
308
311
|
}
|
|
309
312
|
const latencyMs = Date.now() - start;
|
|
@@ -574,28 +577,11 @@ export class GeminiProvider {
|
|
|
574
577
|
/**
|
|
575
578
|
* Fetch with timeout
|
|
576
579
|
*/
|
|
577
|
-
async fetchWithTimeout(url, options, timeoutMs) {
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
...options,
|
|
583
|
-
signal: controller.signal,
|
|
584
|
-
});
|
|
585
|
-
return response;
|
|
586
|
-
}
|
|
587
|
-
catch (error) {
|
|
588
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
589
|
-
throw createLLMError('Request timed out', 'TIMEOUT', {
|
|
590
|
-
provider: 'gemini',
|
|
591
|
-
retryable: true,
|
|
592
|
-
});
|
|
593
|
-
}
|
|
594
|
-
throw error;
|
|
595
|
-
}
|
|
596
|
-
finally {
|
|
597
|
-
clearTimeout(timeoutId);
|
|
598
|
-
}
|
|
580
|
+
async fetchWithTimeout(url, options, timeoutMs, bodyDeadline = 'absolute') {
|
|
581
|
+
return fetchWithResponseDeadline(url, options, timeoutMs, () => createLLMError('Request timed out', 'TIMEOUT', {
|
|
582
|
+
provider: 'gemini',
|
|
583
|
+
retryable: true,
|
|
584
|
+
}), bodyDeadline);
|
|
599
585
|
}
|
|
600
586
|
/**
|
|
601
587
|
* Fetch with retry logic
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Local LLM provider using Ollama for fast iteration and zero-cost development.
|
|
6
6
|
* Supports Llama, Mistral, CodeLlama, and other local models.
|
|
7
7
|
*/
|
|
8
|
+
import { fetchWithResponseDeadline } from './response-deadline.js';
|
|
8
9
|
import { createLLMError, } from '../interfaces.js';
|
|
9
10
|
import { CostTracker } from '../cost-tracker.js';
|
|
10
11
|
import { TokenMetricsCollector } from '../../../learning/token-tracker.js';
|
|
@@ -410,27 +411,10 @@ export class OllamaProvider {
|
|
|
410
411
|
* Fetch with timeout
|
|
411
412
|
*/
|
|
412
413
|
async fetchWithTimeout(url, options, timeoutMs) {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
...options,
|
|
418
|
-
signal: controller.signal,
|
|
419
|
-
});
|
|
420
|
-
return response;
|
|
421
|
-
}
|
|
422
|
-
catch (error) {
|
|
423
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
424
|
-
throw createLLMError('Request timed out', 'TIMEOUT', {
|
|
425
|
-
provider: 'ollama',
|
|
426
|
-
retryable: true,
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
throw error;
|
|
430
|
-
}
|
|
431
|
-
finally {
|
|
432
|
-
clearTimeout(timeoutId);
|
|
433
|
-
}
|
|
414
|
+
return fetchWithResponseDeadline(url, options, timeoutMs, () => createLLMError('Request timed out', 'TIMEOUT', {
|
|
415
|
+
provider: 'ollama',
|
|
416
|
+
retryable: true,
|
|
417
|
+
}));
|
|
434
418
|
}
|
|
435
419
|
}
|
|
436
420
|
//# sourceMappingURL=ollama.js.map
|
|
@@ -11,6 +11,7 @@ import { applyOpenAIParams } from '../openai-params.js';
|
|
|
11
11
|
import { TokenMetricsCollector } from '../../../learning/token-tracker.js';
|
|
12
12
|
import { toError } from '../../error-utils.js';
|
|
13
13
|
import { backoffDelay } from '../retry.js';
|
|
14
|
+
import { fetchWithResponseDeadline } from './response-deadline.js';
|
|
14
15
|
/**
|
|
15
16
|
* Default OpenAI configuration
|
|
16
17
|
*/
|
|
@@ -378,27 +379,10 @@ export class OpenAIProvider {
|
|
|
378
379
|
* Fetch with timeout
|
|
379
380
|
*/
|
|
380
381
|
async fetchWithTimeout(url, options, timeoutMs) {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
...options,
|
|
386
|
-
signal: controller.signal,
|
|
387
|
-
});
|
|
388
|
-
return response;
|
|
389
|
-
}
|
|
390
|
-
catch (error) {
|
|
391
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
392
|
-
throw createLLMError('Request timed out', 'TIMEOUT', {
|
|
393
|
-
provider: 'openai',
|
|
394
|
-
retryable: true,
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
throw error;
|
|
398
|
-
}
|
|
399
|
-
finally {
|
|
400
|
-
clearTimeout(timeoutId);
|
|
401
|
-
}
|
|
382
|
+
return fetchWithResponseDeadline(url, options, timeoutMs, () => createLLMError('Request timed out', 'TIMEOUT', {
|
|
383
|
+
provider: 'openai',
|
|
384
|
+
retryable: true,
|
|
385
|
+
}));
|
|
402
386
|
}
|
|
403
387
|
/**
|
|
404
388
|
* Fetch with retry logic
|
|
@@ -13,6 +13,7 @@ import { createLLMError, } from '../interfaces.js';
|
|
|
13
13
|
import { TokenMetricsCollector } from '../../../learning/token-tracker.js';
|
|
14
14
|
import { toError } from '../../error-utils.js';
|
|
15
15
|
import { backoffDelay } from '../retry.js';
|
|
16
|
+
import { fetchWithResponseDeadline } from './response-deadline.js';
|
|
16
17
|
import { safeJsonParse } from '../../safe-json.js';
|
|
17
18
|
import { resolveModelPricing } from '../cost-tracker.js';
|
|
18
19
|
/**
|
|
@@ -273,7 +274,7 @@ export class OpenRouterProvider {
|
|
|
273
274
|
method: 'POST',
|
|
274
275
|
headers: this.getHeaders(),
|
|
275
276
|
body: JSON.stringify(body),
|
|
276
|
-
}, options?.timeoutMs ?? this.config.timeoutMs ?? 60000);
|
|
277
|
+
}, options?.timeoutMs ?? this.config.timeoutMs ?? 60000, 'idle');
|
|
277
278
|
if (!response.ok) {
|
|
278
279
|
const errorData = await response.json().catch(() => ({
|
|
279
280
|
error: { message: 'Unknown error', type: 'unknown', code: null },
|
|
@@ -327,6 +328,8 @@ export class OpenRouterProvider {
|
|
|
327
328
|
}
|
|
328
329
|
}
|
|
329
330
|
finally {
|
|
331
|
+
// Returning early from the generator must also release its request deadline.
|
|
332
|
+
await reader.cancel().catch(() => { });
|
|
330
333
|
reader.releaseLock();
|
|
331
334
|
}
|
|
332
335
|
const latencyMs = Date.now() - start;
|
|
@@ -620,28 +623,11 @@ export class OpenRouterProvider {
|
|
|
620
623
|
/**
|
|
621
624
|
* Fetch with timeout
|
|
622
625
|
*/
|
|
623
|
-
async fetchWithTimeout(url, options, timeoutMs) {
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
...options,
|
|
629
|
-
signal: controller.signal,
|
|
630
|
-
});
|
|
631
|
-
return response;
|
|
632
|
-
}
|
|
633
|
-
catch (error) {
|
|
634
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
635
|
-
throw createLLMError('Request timed out', 'TIMEOUT', {
|
|
636
|
-
provider: 'openrouter',
|
|
637
|
-
retryable: true,
|
|
638
|
-
});
|
|
639
|
-
}
|
|
640
|
-
throw error;
|
|
641
|
-
}
|
|
642
|
-
finally {
|
|
643
|
-
clearTimeout(timeoutId);
|
|
644
|
-
}
|
|
626
|
+
async fetchWithTimeout(url, options, timeoutMs, bodyDeadline = 'absolute') {
|
|
627
|
+
return fetchWithResponseDeadline(url, options, timeoutMs, () => createLLMError('Request timed out', 'TIMEOUT', {
|
|
628
|
+
provider: 'openrouter',
|
|
629
|
+
retryable: true,
|
|
630
|
+
}), bodyDeadline);
|
|
645
631
|
}
|
|
646
632
|
/**
|
|
647
633
|
* Fetch with retry logic
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Bound headers and bodies; streaming callers may use an idle body deadline. */
|
|
2
|
+
export declare function fetchWithResponseDeadline(url: string, options: RequestInit, timeoutMs: number, timeoutError: () => Error, bodyDeadline?: 'absolute' | 'idle'): Promise<Response>;
|
|
3
|
+
//# sourceMappingURL=response-deadline.d.ts.map
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/** Bound headers and bodies; streaming callers may use an idle body deadline. */
|
|
2
|
+
export async function fetchWithResponseDeadline(url, options, timeoutMs, timeoutError, bodyDeadline = 'absolute') {
|
|
3
|
+
const abort = new AbortController();
|
|
4
|
+
let expired = false;
|
|
5
|
+
let expireBody;
|
|
6
|
+
const expire = () => {
|
|
7
|
+
expired = true;
|
|
8
|
+
const error = timeoutError();
|
|
9
|
+
expireBody?.(error);
|
|
10
|
+
abort.abort(error);
|
|
11
|
+
};
|
|
12
|
+
let timer = setTimeout(expire, timeoutMs);
|
|
13
|
+
const resetIdleDeadline = () => {
|
|
14
|
+
if (bodyDeadline !== 'idle')
|
|
15
|
+
return;
|
|
16
|
+
clearTimeout(timer);
|
|
17
|
+
timer = setTimeout(expire, timeoutMs);
|
|
18
|
+
timer.unref?.();
|
|
19
|
+
};
|
|
20
|
+
// A status-only caller must not keep a process alive until its deadline.
|
|
21
|
+
timer.unref?.();
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetch(url, { ...options, signal: abort.signal });
|
|
24
|
+
if (!response.body) {
|
|
25
|
+
clearTimeout(timer);
|
|
26
|
+
return response;
|
|
27
|
+
}
|
|
28
|
+
resetIdleDeadline();
|
|
29
|
+
const reader = response.body.getReader();
|
|
30
|
+
let finished = false;
|
|
31
|
+
const finish = () => {
|
|
32
|
+
finished = true;
|
|
33
|
+
clearTimeout(timer);
|
|
34
|
+
};
|
|
35
|
+
const body = new ReadableStream({
|
|
36
|
+
start(controller) {
|
|
37
|
+
expireBody = error => {
|
|
38
|
+
if (finished)
|
|
39
|
+
return;
|
|
40
|
+
finish();
|
|
41
|
+
controller.error(error);
|
|
42
|
+
// Cancel also settles any pending read before releasing its lock.
|
|
43
|
+
void reader.cancel(error).catch(() => { }).finally(() => reader.releaseLock());
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
async pull(controller) {
|
|
47
|
+
try {
|
|
48
|
+
const result = await reader.read();
|
|
49
|
+
if (finished)
|
|
50
|
+
return;
|
|
51
|
+
if (result.done) {
|
|
52
|
+
finish();
|
|
53
|
+
reader.releaseLock();
|
|
54
|
+
controller.close();
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
resetIdleDeadline();
|
|
58
|
+
controller.enqueue(result.value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (finished)
|
|
63
|
+
return;
|
|
64
|
+
finish();
|
|
65
|
+
reader.releaseLock();
|
|
66
|
+
controller.error(error);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
async cancel(reason) {
|
|
70
|
+
if (finished)
|
|
71
|
+
return;
|
|
72
|
+
finish();
|
|
73
|
+
try {
|
|
74
|
+
await reader.cancel(reason);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
reader.releaseLock();
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
}, { highWaterMark: 0 });
|
|
81
|
+
const bounded = new Response(body, {
|
|
82
|
+
status: response.status,
|
|
83
|
+
statusText: response.statusText,
|
|
84
|
+
headers: response.headers,
|
|
85
|
+
});
|
|
86
|
+
// Keep fetch metadata while using the bounded stream for body consumers.
|
|
87
|
+
for (const key of ['url', 'redirected', 'type']) {
|
|
88
|
+
Object.defineProperty(bounded, key, { value: response[key] });
|
|
89
|
+
}
|
|
90
|
+
return bounded;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
clearTimeout(timer);
|
|
94
|
+
if (expired || (error instanceof Error && error.name === 'AbortError')) {
|
|
95
|
+
throw timeoutError();
|
|
96
|
+
}
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=response-deadline.js.map
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* connections (one per process) to a WAL-mode DB is exactly the supported
|
|
18
18
|
* cross-process pattern.
|
|
19
19
|
*/
|
|
20
|
+
import { createSafeRecord } from '../utils/safe-record.js';
|
|
20
21
|
/** Bucket used for charges recorded without an agent context. */
|
|
21
22
|
export const UNATTRIBUTED_AGENT = '(unattributed)';
|
|
22
23
|
const CREATE_TABLE_SQL = `
|
|
@@ -127,7 +128,7 @@ export class SqliteSpendLedger {
|
|
|
127
128
|
.prepare(`SELECT COALESCE(agent_type, ?) AS agent, COALESCE(SUM(cost_usd), 0) AS total
|
|
128
129
|
FROM llm_spend WHERE ts >= ? GROUP BY COALESCE(agent_type, ?)`)
|
|
129
130
|
.all(UNATTRIBUTED_AGENT, nowMs - windowMs, UNATTRIBUTED_AGENT);
|
|
130
|
-
const out =
|
|
131
|
+
const out = createSafeRecord();
|
|
131
132
|
for (const r of rows)
|
|
132
133
|
out[r.agent] = r.total;
|
|
133
134
|
return out;
|
|
@@ -157,7 +158,7 @@ export class InMemorySpendLedger {
|
|
|
157
158
|
}
|
|
158
159
|
spentByAgentSince(windowMs, nowMs = Date.now()) {
|
|
159
160
|
const cutoff = nowMs - windowMs;
|
|
160
|
-
const out =
|
|
161
|
+
const out = createSafeRecord();
|
|
161
162
|
for (const e of this.entries) {
|
|
162
163
|
if (e.ts >= cutoff)
|
|
163
164
|
out[e.agent] = (out[e.agent] ?? 0) + e.costUsd;
|
|
@@ -63,6 +63,7 @@ export declare class CodeMetricsAnalyzer {
|
|
|
63
63
|
detectDuplication(files: string[], minLines?: number): Promise<DuplicationResult>;
|
|
64
64
|
private countLines;
|
|
65
65
|
private calculateCyclomaticComplexity;
|
|
66
|
+
/** SonarSource cognitive complexity heuristic; see ./cognitive-complexity.ts (#907). */
|
|
66
67
|
private calculateCognitiveComplexity;
|
|
67
68
|
private estimateCyclomaticComplexity;
|
|
68
69
|
private estimateCognitiveComplexity;
|
|
@@ -6,6 +6,7 @@ import { TypeScriptParser } from '../parsers/index.js';
|
|
|
6
6
|
import { FileReader } from '../io/index.js';
|
|
7
7
|
import { treeSitterRegistry } from '../parsers/multi-language-parser.js';
|
|
8
8
|
import { getLanguageFromExtension } from '../types/test-frameworks.js';
|
|
9
|
+
import { calculateCognitiveComplexity } from './cognitive-complexity.js';
|
|
9
10
|
// ============================================================================
|
|
10
11
|
// Code Metrics Analyzer
|
|
11
12
|
// ============================================================================
|
|
@@ -247,51 +248,9 @@ export class CodeMetricsAnalyzer {
|
|
|
247
248
|
}
|
|
248
249
|
return complexity;
|
|
249
250
|
}
|
|
251
|
+
/** SonarSource cognitive complexity heuristic; see ./cognitive-complexity.ts (#907). */
|
|
250
252
|
calculateCognitiveComplexity(code) {
|
|
251
|
-
|
|
252
|
-
let nestingLevel = 0;
|
|
253
|
-
const lines = code.split('\n');
|
|
254
|
-
for (const line of lines) {
|
|
255
|
-
const trimmed = line.trim();
|
|
256
|
-
// Increase nesting
|
|
257
|
-
if (/\bif\s*\(/.test(trimmed)) {
|
|
258
|
-
complexity += 1 + nestingLevel;
|
|
259
|
-
nestingLevel++;
|
|
260
|
-
}
|
|
261
|
-
if (/\belse\s+if\s*\(/.test(trimmed)) {
|
|
262
|
-
complexity += 1 + nestingLevel;
|
|
263
|
-
}
|
|
264
|
-
if (/\belse\s*{/.test(trimmed)) {
|
|
265
|
-
complexity += 1;
|
|
266
|
-
}
|
|
267
|
-
if (/\bfor\s*\(/.test(trimmed)) {
|
|
268
|
-
complexity += 1 + nestingLevel;
|
|
269
|
-
nestingLevel++;
|
|
270
|
-
}
|
|
271
|
-
if (/\bwhile\s*\(/.test(trimmed)) {
|
|
272
|
-
complexity += 1 + nestingLevel;
|
|
273
|
-
nestingLevel++;
|
|
274
|
-
}
|
|
275
|
-
if (/\bswitch\s*\(/.test(trimmed)) {
|
|
276
|
-
complexity += 1 + nestingLevel;
|
|
277
|
-
nestingLevel++;
|
|
278
|
-
}
|
|
279
|
-
if (/\bcatch\s*\(/.test(trimmed)) {
|
|
280
|
-
complexity += 1 + nestingLevel;
|
|
281
|
-
nestingLevel++;
|
|
282
|
-
}
|
|
283
|
-
if (/\?\s*[^:]/.test(trimmed)) {
|
|
284
|
-
complexity += 1 + nestingLevel; // Ternary
|
|
285
|
-
}
|
|
286
|
-
if (/&&|\|\|/.test(trimmed)) {
|
|
287
|
-
complexity += 1; // Boolean operators
|
|
288
|
-
}
|
|
289
|
-
// Track nesting via braces (simplified)
|
|
290
|
-
const openBraces = (trimmed.match(/{/g) || []).length;
|
|
291
|
-
const closeBraces = (trimmed.match(/}/g) || []).length;
|
|
292
|
-
nestingLevel = Math.max(0, nestingLevel + openBraces - closeBraces);
|
|
293
|
-
}
|
|
294
|
-
return complexity;
|
|
253
|
+
return calculateCognitiveComplexity(code);
|
|
295
254
|
}
|
|
296
255
|
estimateCyclomaticComplexity(code) {
|
|
297
256
|
// Fallback heuristic for non-parseable code
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Line-based cognitive complexity heuristic (SonarSource rules, issues #907).
|
|
3
|
+
* Known gaps (lambdas, labelled jumps, boolean sequences, ...) are tracked in #967.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Blank out comments and the contents of string, template and regex literals,
|
|
7
|
+
* keeping newlines and delimiters, so keywords and braces inside them are not counted.
|
|
8
|
+
*/
|
|
9
|
+
export declare function maskCommentsAndLiterals(code: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* `if`, loops, `switch`, `catch` and ternaries score +1 plus the nesting level;
|
|
12
|
+
* `else if` and `else` score a flat +1 (an `else if` is not also an `if`).
|
|
13
|
+
* Nesting rises only inside the braces of those structures, so a function
|
|
14
|
+
* body, try block or object literal adds no nesting bonus.
|
|
15
|
+
*/
|
|
16
|
+
export declare function calculateCognitiveComplexity(code: string): number;
|
|
17
|
+
//# sourceMappingURL=cognitive-complexity.d.ts.map
|