agentic-qe 3.12.1 → 3.12.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/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +87 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-D657MKZY.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-P4VYM5KK.js → agent-booster-wasm-XFAQATTH.js} +2 -2
- package/dist/cli/chunks/{agent-handler-PBQ7L2TO.js → agent-handler-2ZV4CA3U.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-UPWO3X6V.js → agent-memory-branch-6WGP7F5T.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-AFR6OZJK.js +2 -0
- package/dist/cli/chunks/{arena-QYTP3FG6.js → arena-FWX7XZAE.js} +4 -4
- package/dist/cli/chunks/{arena-LEUTILZ7.js → arena-KJUNQK4N.js} +2 -2
- package/dist/cli/chunks/{audit-TB6M2YLK.js → audit-YFUDEOKN.js} +3 -3
- package/dist/cli/chunks/base-K5QRGZWE.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-62RTSHAY.js → better-sqlite3-FE55OGYB.js} +2 -2
- package/dist/cli/chunks/brain-handler-ZCK4WTPK.js +89 -0
- package/dist/cli/chunks/{branch-enumerator-WEIP3DXB.js → branch-enumerator-HTVINRYG.js} +2 -2
- package/dist/cli/chunks/{browser-HY6VLXHZ.js → browser-WUL2B77M.js} +2 -2
- package/dist/cli/chunks/browser-workflow-ZMMKCGYW.js +2 -0
- package/dist/cli/chunks/{chunk-NHRBKOYD.js → chunk-2CPJCXV6.js} +2 -2
- package/dist/cli/chunks/{chunk-D72N5V2S.js → chunk-2HCMRGMO.js} +2 -2
- package/dist/cli/chunks/{chunk-UBPJQKYS.js → chunk-2LNDU7AW.js} +2 -2
- package/dist/cli/chunks/{chunk-ONSNNY6J.js → chunk-2OX74DOO.js} +1 -1
- package/dist/cli/chunks/{chunk-QORWBION.js → chunk-2YDZXFO2.js} +2 -2
- package/dist/cli/chunks/{chunk-QJXUK54J.js → chunk-32L7DKNQ.js} +2 -2
- package/dist/cli/chunks/{chunk-UZXDYT6O.js → chunk-3YC4YUGB.js} +2 -2
- package/dist/cli/chunks/{chunk-NOCPO55P.js → chunk-4EHW4TNA.js} +2 -2
- package/dist/cli/chunks/{chunk-QZBPXJ5C.js → chunk-4HP7N6SP.js} +2 -2
- package/dist/cli/chunks/{chunk-XTAXSKPC.js → chunk-5FAWIIWF.js} +2 -2
- package/dist/cli/chunks/{chunk-YGB3MT3R.js → chunk-67BCEHU5.js} +1 -1
- package/dist/cli/chunks/{chunk-3W2FZXFD.js → chunk-6E47R27C.js} +1 -1
- package/dist/cli/chunks/{chunk-74VIADSJ.js → chunk-6HQDPDN5.js} +2 -2
- package/dist/cli/chunks/chunk-6SQ72FG7.js +2 -0
- package/dist/cli/chunks/{chunk-RJ7TU2MP.js → chunk-6SUSRXXF.js} +1 -1
- package/dist/cli/chunks/{chunk-FFSS3Y6W.js → chunk-72QQDR3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-CP4GSICY.js → chunk-7Q74K3HZ.js} +1 -1
- package/dist/cli/chunks/{chunk-UEC53US3.js → chunk-7WF3TW3G.js} +4 -4
- package/dist/cli/chunks/chunk-7XUM4LBC.js +2 -0
- package/dist/cli/chunks/{chunk-UGPBL7LX.js → chunk-ADQFQBFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-BALFQQB7.js → chunk-AIWRYWK2.js} +2 -2
- package/dist/cli/chunks/{chunk-XJTGLG7G.js → chunk-AZ24ONMX.js} +1 -1
- package/dist/cli/chunks/{chunk-LRWBOJ5Y.js → chunk-BDGKB2PT.js} +2 -2
- package/dist/cli/chunks/{chunk-NK2Z6FGF.js → chunk-BEPP57C2.js} +2 -2
- package/dist/cli/chunks/{chunk-HGKSU4QV.js → chunk-BQ2K4BPD.js} +2 -2
- package/dist/cli/chunks/{chunk-QOAI6ETC.js → chunk-BSNNTOHY.js} +3 -3
- package/dist/cli/chunks/chunk-CHFTHSMM.js +9 -0
- package/dist/cli/chunks/{chunk-IHWWZOHP.js → chunk-CL6SNCFF.js} +1 -1
- package/dist/cli/chunks/{chunk-7N2SCRWJ.js → chunk-CXMOIE7D.js} +2 -2
- package/dist/cli/chunks/{chunk-PZ3Q34OT.js → chunk-CYSBM52D.js} +2 -2
- package/dist/cli/chunks/{chunk-X2CEX4KC.js → chunk-D4GMAUTP.js} +10 -10
- package/dist/cli/chunks/{chunk-JDZIBSMY.js → chunk-DCYBV6HV.js} +1 -1
- package/dist/cli/chunks/chunk-DDYP6FBC.js +2 -0
- package/dist/cli/chunks/{chunk-SFQFBLWQ.js → chunk-DHUZHT5D.js} +1 -1
- package/dist/cli/chunks/{chunk-X2K3BTI4.js → chunk-DMD6WVJ2.js} +2 -2
- package/dist/cli/chunks/{chunk-GW3M7GQH.js → chunk-DTZFZ5M7.js} +2 -2
- package/dist/cli/chunks/{chunk-WBDV4V3H.js → chunk-DW7OI5IF.js} +2 -2
- package/dist/cli/chunks/{chunk-CYYT6YEV.js → chunk-DZ775UGW.js} +2 -2
- package/dist/cli/chunks/{chunk-BNMV5DCM.js → chunk-E2U3LTGM.js} +1 -1
- package/dist/cli/chunks/{chunk-KQV5644J.js → chunk-E53UR2EW.js} +3 -3
- package/dist/cli/chunks/{chunk-XYV6YUWS.js → chunk-EH7TSJPS.js} +2 -2
- package/dist/cli/chunks/{chunk-42GFB7VX.js → chunk-EHO52NKU.js} +2 -2
- package/dist/cli/chunks/{chunk-75AVUS5U.js → chunk-EOUJ6X5H.js} +1 -1
- package/dist/cli/chunks/{chunk-ZNITDSWL.js → chunk-FHHCH7WL.js} +1 -1
- package/dist/cli/chunks/{chunk-PQ4NSXZM.js → chunk-FJACKKRL.js} +2 -2
- package/dist/cli/chunks/{chunk-45QNHMTP.js → chunk-FTM562PF.js} +1 -1
- package/dist/cli/chunks/{chunk-4KI72C2E.js → chunk-FXOOOJQD.js} +1 -1
- package/dist/cli/chunks/chunk-G5OGKVLO.js +2 -0
- package/dist/cli/chunks/{chunk-42PYEEYQ.js → chunk-GGTCD4MA.js} +1 -1
- package/dist/cli/chunks/{chunk-GASACVTU.js → chunk-GMFFMJD6.js} +2 -2
- package/dist/cli/chunks/{chunk-JRNDFC23.js → chunk-GS6G7AVS.js} +2 -2
- package/dist/cli/chunks/{chunk-BKKJEKNT.js → chunk-GV2BS5NC.js} +2 -2
- package/dist/cli/chunks/{chunk-JRHRC2MP.js → chunk-HGJQSTQD.js} +1 -1
- package/dist/cli/chunks/{chunk-M5P5WNXA.js → chunk-HJ2LG5IH.js} +1 -1
- package/dist/cli/chunks/{chunk-UR655D4K.js → chunk-HJ4U64BL.js} +2 -2
- package/dist/cli/chunks/chunk-ILRKO6A5.js +43 -0
- package/dist/cli/chunks/{chunk-LZ6TJ7XL.js → chunk-IWQHQLT6.js} +2 -2
- package/dist/cli/chunks/{chunk-SHKOPOPD.js → chunk-J2RJOJ5Q.js} +1 -1
- package/dist/cli/chunks/{chunk-JIM4VSLF.js → chunk-KA4EAMMQ.js} +3 -3
- package/dist/cli/chunks/{chunk-6432JORM.js → chunk-KE3RK35K.js} +1 -1
- package/dist/cli/chunks/{chunk-VTFYY4SH.js → chunk-KGHSKDC7.js} +2 -2
- package/dist/cli/chunks/{chunk-3I3Z4C5X.js → chunk-KKOFH26C.js} +1 -1
- package/dist/cli/chunks/{chunk-AGWKCY42.js → chunk-KNWBRMLL.js} +2 -2
- package/dist/cli/chunks/{chunk-C7HGYLNF.js → chunk-KRS4KGX5.js} +2 -2
- package/dist/cli/chunks/{chunk-VHJCQBD2.js → chunk-KVHCWH4H.js} +2 -2
- package/dist/cli/chunks/{chunk-N3PSRG6F.js → chunk-KXKACV3E.js} +2 -2
- package/dist/cli/chunks/{chunk-BLU7OLQZ.js → chunk-L2X3BWMN.js} +2 -2
- package/dist/cli/chunks/{chunk-4U5MJX2H.js → chunk-L6GZGEFQ.js} +2 -2
- package/dist/cli/chunks/{chunk-DSNFOX22.js → chunk-LCM7TY76.js} +2 -2
- package/dist/cli/chunks/{chunk-NVXSM7UO.js → chunk-LGYEOYQJ.js} +2 -2
- package/dist/cli/chunks/{chunk-J4IAMQZI.js → chunk-LHAUFY4Y.js} +2 -2
- package/dist/cli/chunks/{chunk-OJORNYN3.js → chunk-LNIHLNW4.js} +3 -3
- package/dist/cli/chunks/{chunk-PRA73XZY.js → chunk-M32DTUZM.js} +2 -2
- package/dist/cli/chunks/{chunk-GGF5FZWS.js → chunk-M7W6VJ65.js} +1 -1
- package/dist/cli/chunks/{chunk-HZGFER4N.js → chunk-MB7TZQW3.js} +3 -3
- package/dist/cli/chunks/{chunk-RIASOMB2.js → chunk-MOX25RZQ.js} +2 -2
- package/dist/cli/chunks/{chunk-BPM7NEHS.js → chunk-MOXKKY5Q.js} +6 -6
- package/dist/cli/chunks/{chunk-UKF4V7LE.js → chunk-MS6VOSPY.js} +5 -5
- package/dist/cli/chunks/{chunk-QXZOUETY.js → chunk-MSDIIRLM.js} +2 -2
- package/dist/cli/chunks/{chunk-BBNQDHGF.js → chunk-MZ7SIO6R.js} +2 -2
- package/dist/cli/chunks/{chunk-HDI3FD4G.js → chunk-N4ML23ZG.js} +1 -1
- package/dist/cli/chunks/{chunk-7KHIOWBN.js → chunk-NAMJGRGC.js} +1 -1
- package/dist/cli/chunks/{chunk-IE6FDICX.js → chunk-NJDLJ3KD.js} +2 -2
- package/dist/cli/chunks/{chunk-4LKQZW2H.js → chunk-NKTLKMUB.js} +1 -1
- package/dist/cli/chunks/{chunk-CXUHD2O5.js → chunk-NLDLUHOF.js} +2 -2
- package/dist/cli/chunks/{chunk-XDRAU3W6.js → chunk-NOSQI2OW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZCDGLNJ7.js → chunk-NT66CT73.js} +2 -2
- package/dist/cli/chunks/{chunk-JWZNWVLG.js → chunk-NX522PRH.js} +2 -2
- package/dist/cli/chunks/{chunk-O65OPAZH.js → chunk-OBL6W4Z5.js} +2 -2
- package/dist/cli/chunks/chunk-OPG2HV2W.js +2 -0
- package/dist/cli/chunks/{chunk-BCBITOMT.js → chunk-PDX7IYTJ.js} +2 -2
- package/dist/cli/chunks/{chunk-IC6SOVGO.js → chunk-PEHEANAM.js} +2 -2
- package/dist/cli/chunks/{chunk-J6ZCULWG.js → chunk-PPUDKQ4X.js} +2 -2
- package/dist/cli/chunks/{chunk-WPEGG6DX.js → chunk-PSDH7CIL.js} +1 -1
- package/dist/cli/chunks/{chunk-NTMN2ZJY.js → chunk-PTPN6HQ7.js} +2 -2
- package/dist/cli/chunks/{chunk-C2K4LQI5.js → chunk-PXCJDB7J.js} +1 -1
- package/dist/cli/chunks/{chunk-WPG5LXR7.js → chunk-QILF6BZH.js} +2 -2
- package/dist/cli/chunks/{chunk-BAHXVVX3.js → chunk-R6WMGSEK.js} +2 -2
- package/dist/cli/chunks/{chunk-2PQ7YADF.js → chunk-RE42RJYR.js} +2 -2
- package/dist/cli/chunks/{chunk-BWNMAXV7.js → chunk-RLBNAB6Y.js} +1 -1
- package/dist/cli/chunks/{chunk-BXIJY6SB.js → chunk-ROFCS47F.js} +1 -1
- package/dist/cli/chunks/{chunk-7KK6XSYK.js → chunk-RSZOCQOL.js} +2 -2
- package/dist/cli/chunks/{chunk-NEXJUTHF.js → chunk-S47YGWXK.js} +2 -2
- package/dist/cli/chunks/{chunk-5H5A74U2.js → chunk-SFS3UHNF.js} +1 -1
- package/dist/cli/chunks/{chunk-U5ITD7ZD.js → chunk-SGMJ277D.js} +1 -1
- package/dist/cli/chunks/{chunk-OXVAGR64.js → chunk-SPI4LUJ6.js} +2 -2
- package/dist/cli/chunks/{chunk-FBYFDD7L.js → chunk-SV7J5FDW.js} +2 -2
- package/dist/cli/chunks/{chunk-S42RFOZJ.js → chunk-TP3UAWMB.js} +2 -2
- package/dist/cli/chunks/{chunk-OEXSBR72.js → chunk-TXLPOXAN.js} +1 -1
- package/dist/cli/chunks/{chunk-R4A6PY5D.js → chunk-UAPUA6OY.js} +2 -2
- package/dist/cli/chunks/{chunk-55MQ2SFP.js → chunk-UGW23T6S.js} +2 -2
- package/dist/cli/chunks/{chunk-774X6OJY.js → chunk-UGXHMQ6P.js} +2 -2
- package/dist/cli/chunks/{chunk-GLO53MUQ.js → chunk-UIHZ34SJ.js} +2 -2
- package/dist/cli/chunks/{chunk-TMPRR3FZ.js → chunk-ULQCEM7K.js} +2 -2
- package/dist/cli/chunks/{chunk-YNXQMJGJ.js → chunk-UZ7FXVH5.js} +1 -1
- package/dist/cli/chunks/{chunk-LAJHHR3Q.js → chunk-VFYMWDSJ.js} +1 -1
- package/dist/cli/chunks/{chunk-XS6BIOPQ.js → chunk-VSD6JE2H.js} +2 -2
- package/dist/cli/chunks/{chunk-MIAY35K6.js → chunk-VUCVSKJC.js} +2 -2
- package/dist/cli/chunks/{chunk-I4BZLVFE.js → chunk-WBZNLFTV.js} +3 -3
- package/dist/cli/chunks/{chunk-PDS5P5QD.js → chunk-WFPGIP4N.js} +2 -2
- package/dist/cli/chunks/{chunk-PZZDAECU.js → chunk-WKE6WL5C.js} +3 -3
- package/dist/cli/chunks/{chunk-VFRWLSQO.js → chunk-WQASUQ5P.js} +1 -1
- package/dist/cli/chunks/{chunk-GXMNCW2M.js → chunk-WUE53ZPH.js} +1 -1
- package/dist/cli/chunks/{chunk-UBWSYDO5.js → chunk-XBOCRCC6.js} +1 -1
- package/dist/cli/chunks/{chunk-HHMTQQUE.js → chunk-XDHGCBTS.js} +2 -2
- package/dist/cli/chunks/chunk-XQ5JT7KM.js +3 -0
- package/dist/cli/chunks/{chunk-USTUWUCE.js → chunk-XUUVAAHV.js} +2 -2
- package/dist/cli/chunks/{chunk-6RX5QZMU.js → chunk-XZGOXLZH.js} +1 -1
- package/dist/cli/chunks/{chunk-DQ3J7ZT6.js → chunk-Y5L37K7X.js} +2 -2
- package/dist/cli/chunks/{chunk-5HMGDB7B.js → chunk-Y625LP6K.js} +3 -3
- package/dist/cli/chunks/{chunk-REJGZP27.js → chunk-Y6XNISHP.js} +2 -2
- package/dist/cli/chunks/{chunk-LF5XOYR7.js → chunk-YDYKFSD2.js} +11 -11
- package/dist/cli/chunks/{chunk-U55X2ZUM.js → chunk-YEC55GO5.js} +2 -2
- package/dist/cli/chunks/{chunk-6ONUCDVL.js → chunk-YOG5KQZF.js} +2 -2
- package/dist/cli/chunks/{chunk-6BCVKCG5.js → chunk-YUDGQZJN.js} +2 -2
- package/dist/cli/chunks/{chunk-EOBZJDJR.js → chunk-Z3SXMYVI.js} +3 -3
- package/dist/cli/chunks/chunk-ZFLE4D4X.js +18 -0
- package/dist/cli/chunks/{chunk-W52R3G22.js → chunk-ZGKQCUPB.js} +2 -2
- package/dist/cli/chunks/{chunk-MCUILJ33.js → chunk-ZTKCGEB6.js} +1 -1
- package/dist/cli/chunks/{ci-IU5HVUL5.js → ci-MMLUV6L6.js} +2 -2
- package/dist/cli/chunks/{ci-output-CLI4A43F.js → ci-output-25GS6RXR.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-ZR5OFMW7.js → circuit-breaker-4OWAN6R6.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-UBMA6ZHJ.js → claude-flow-setup-LR3SRBX6.js} +2 -2
- package/dist/cli/chunks/client-WI7RRUZO.js +2 -0
- package/dist/cli/chunks/{cline-installer-EWYELOBI.js → cline-installer-YSZWRZUI.js} +2 -2
- package/dist/cli/chunks/{code-YSPF4MXN.js → code-UUWUIXI7.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-WW5OKSTN.js → code-index-extractor-2LSPQORU.js} +2 -2
- package/dist/cli/chunks/{codex-installer-GLADK5PY.js → codex-installer-E5BVXZVA.js} +2 -2
- package/dist/cli/chunks/{completions-2KTWZ3AK.js → completions-YKXBKZSO.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-KMX4OWKB.js → complexity-analyzer-HNT2QRWB.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-4FHU4OEJ.js → continuedev-installer-AW5VCB66.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-AKR4WE7B.js → copilot-installer-B6SVZXQT.js} +2 -2
- package/dist/cli/chunks/core-handlers-T6URR57V.js +2 -0
- package/dist/cli/chunks/{cost-tracker-BUJ6WEWY.js → cost-tracker-POZMBN2V.js} +2 -2
- package/dist/cli/chunks/{coverage-OB6HVQS4.js → coverage-V5BGPN5Q.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-WHTTKHWM.js +2 -0
- package/dist/cli/chunks/{cursor-installer-3AOE4O3Q.js → cursor-installer-EYBI4QVK.js} +2 -2
- package/dist/cli/chunks/{daemon-4RAL5URG.js → daemon-CF6ENQB2.js} +3 -3
- package/dist/cli/chunks/{daemon-JGSPLYGO.js → daemon-HKARXY2W.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-DSBTHIMH.js → dag-attention-scheduler-XIL5IAP7.js} +2 -2
- package/dist/cli/chunks/{detect-6CVW2VUQ.js → detect-RRX2U2KK.js} +2 -2
- package/dist/cli/chunks/{dist-node-EWPKBTYA.js → dist-node-DOANNRCS.js} +2 -2
- package/dist/cli/chunks/{domain-handler-HLVIJU25.js → domain-handler-QMTJV5OR.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-7Y3BR3YU.js → domain-transfer-FSNH75XW.js} +2 -2
- package/dist/cli/chunks/dream-QUL6SURC.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-ZMJ3263X.js → embed-and-insert-pattern-NI7PGONV.js} +2 -2
- package/dist/cli/chunks/eval-6ZAF2RY3.js +17 -0
- package/dist/cli/chunks/{experience-capture-middleware-OGJ3JOSQ.js → experience-capture-middleware-JMXR7N5G.js} +3 -3
- package/dist/cli/chunks/{fast-paths-5XCY3Y6U.js → fast-paths-YB7XZZ76.js} +2 -2
- package/dist/cli/chunks/{feature-flags-R5V2FRJR.js → feature-flags-2RC4GFC4.js} +2 -2
- package/dist/cli/chunks/{feature-flags-VULQI6KY.js → feature-flags-KJSP7KR6.js} +2 -2
- package/dist/cli/chunks/{file-discovery-HW33C3HC.js → file-discovery-SUPBXFYI.js} +2 -2
- package/dist/cli/chunks/{fleet-NH3XR5OY.js → fleet-KSXFOLFW.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-L3XMLPTG.js → gnn-wrapper-DFZ5KPPK.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-TIQFBT4D.js → heartbeat-handler-G3EADK2H.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-VZNKE33K.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-LGWLDZLC.js +2 -0
- package/dist/cli/chunks/hnsw-index-66FOOI7U.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-YL2SUIPA.js → hnsw-legacy-bridge-MA676GER.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-IPKCAVLS.js → hnswlib-node-SKTT5KIH.js} +2 -2
- package/dist/cli/chunks/{hooks-UR2ZF54G.js → hooks-HTCPMZNZ.js} +10 -10
- package/dist/cli/chunks/hybrid-router-I5MEVQDF.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-NX45AOPY.js → hypergraph-engine-QPB3IH4A.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-LUM4YI4K.js → hypergraph-handler-GBFSVD7N.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-K6ANYIY3.js +2 -0
- package/dist/cli/chunks/{init-handler-YTKKNTVV.js → init-handler-XYBTBCPD.js} +6 -6
- package/dist/cli/chunks/init-wizard-URHGXJ32.js +2 -0
- package/dist/cli/chunks/kernel-OKI5ZY5P.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-ZW7DVH7T.js → kilocode-installer-LY6JOBFY.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-IA7INW4N.js → kiro-installer-JF6NXTJL.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-VQQSK7T5.js +2 -0
- package/dist/cli/chunks/{learning-4AZ5PGTT.js → learning-BIISN67N.js} +3 -3
- package/dist/cli/chunks/{llm-router-WQ4E3AOP.js → llm-router-YZUNVZQE.js} +5 -5
- package/dist/cli/chunks/llm-router-service-TISH33SY.js +2 -0
- package/dist/cli/chunks/{load-4FAH7CZO.js → load-MTWNBNLL.js} +2 -2
- package/dist/cli/chunks/load-test-KWKWC4Q7.js +2 -0
- package/dist/cli/chunks/{mcp-KLLHI6DG.js → mcp-37PYMNHQ.js} +2 -2
- package/dist/cli/chunks/{memory-Q5HLIUC6.js → memory-IXUUDCI3.js} +5 -5
- package/dist/cli/chunks/memory-backend-JSQQMXVS.js +2 -0
- package/dist/cli/chunks/memory-handlers-RM2VOFJX.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-ABI73AFV.js → multi-model-executor-RKKS5XYG.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-KRPQ6JOJ.js → opencode-installer-3VXI5MTR.js} +2 -2
- package/dist/cli/chunks/{orchestrator-SUPEONRG.js → orchestrator-UO3ZOGFZ.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-SXBIUKE5.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-R4GKK6RZ.js → pattern-usage-recorder-YJKRL2GI.js} +2 -2
- package/dist/cli/chunks/{pipeline-LCUETNGD.js → pipeline-GJQJKXWX.js} +2 -2
- package/dist/cli/chunks/{platform-WJDIB4X3.js → platform-RHVCZK6C.js} +2 -2
- package/dist/cli/chunks/{plugin-2X5NY2RF.js → plugin-ZKAIW7O6.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-3T665QC6.js → prime-radiant-advanced-wasm-4X3DSKQV.js} +2 -2
- package/dist/cli/chunks/protocol-executor-D3Q5P3WY.js +2 -0
- package/dist/cli/chunks/{protocol-handler-JTXRF7GU.js → protocol-handler-KKYQZMB2.js} +2 -2
- package/dist/cli/chunks/{prove-BFPWWPOC.js → prove-OD6RPKWX.js} +2 -2
- package/dist/cli/chunks/provider-manager-2EIX7E5Q.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-ITOW2ZHC.js +2 -0
- package/dist/cli/chunks/{quality-F7UZU4RN.js → quality-ZRWBXCKO.js} +2 -2
- package/dist/cli/chunks/{quality-gate-R5L4UZIX.js → quality-gate-Y6BWQV7J.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-TO5X2EXL.js +2 -0
- package/dist/cli/chunks/{real-embeddings-LZD6HTQF.js → real-embeddings-YYEUO4P2.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-6TTG7VSH.js → roocode-installer-JBCPS3FK.js} +2 -2
- package/dist/cli/chunks/router-GZJQEJU3.js +2 -0
- package/dist/cli/chunks/routing-feedback-CRXSKFNS.js +2 -0
- package/dist/cli/chunks/{routing-handler-SW442GK7.js → routing-handler-KTPJOSBJ.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-CLFGKXMW.js → ruvector-commands-SCZZVRE7.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-EVPPXXXS.js → rvf-dual-writer-IP7GELQJ.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-NOHDIRIP.js → rvf-migration-adapter-WLFTDARU.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-BYJ3M7WZ.js → rvf-migration-coordinator-MGFDQ5WD.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-WHADT5HX.js +2 -0
- package/dist/cli/chunks/rvf-store-integrity-OTOAGT5W.js +2 -0
- package/dist/cli/chunks/safe-db-MIZ2OFWC.js +2 -0
- package/dist/cli/chunks/schedule-XFILYTYC.js +2 -0
- package/dist/cli/chunks/scheduler-EIPJ777A.js +2 -0
- package/dist/cli/chunks/{security-IXDKBPSG.js → security-B2CLZKRB.js} +3 -3
- package/dist/cli/chunks/shared-rvf-adapter-2PMFAQMN.js +2 -0
- package/dist/cli/chunks/{shared-rvf-dual-writer-FFKBKYNL.js → shared-rvf-dual-writer-B6P732AV.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-PFU3GSRD.js +2 -0
- package/dist/cli/chunks/status-handler-M6SN2W2D.js +47 -0
- package/dist/cli/chunks/{structural-health-55X6BTLT.js → structural-health-YCCTGI3K.js} +2 -2
- package/dist/cli/chunks/{sync-BUGDXW3Y.js → sync-3SDMVAIU.js} +2 -2
- package/dist/cli/chunks/{sync-NUG67HGK.js → sync-KSRF77ID.js} +2 -2
- package/dist/cli/chunks/{task-handler-T6ZKXV4S.js → task-handler-MIKRB2SL.js} +2 -2
- package/dist/cli/chunks/{task-handlers-H63TB2UI.js → task-handlers-YXKRUBQ4.js} +3 -3
- package/dist/cli/chunks/{test-VEK76SBT.js → test-MLOLQCB7.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-QZM6PNZH.js → test-scheduling-3KXESUZS.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-6V2PMDBJ.js +2 -0
- package/dist/cli/chunks/{token-usage-OBY6UEUR.js → token-usage-DP6THJ3I.js} +2 -2
- package/dist/cli/chunks/{transformers-EFNY2MRX.js → transformers-QFOBOP2Y.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-EU2S5NVM.js → tree-sitter-wasm-parser-COK2XERS.js} +2 -2
- package/dist/cli/chunks/{types-3DYRKX23.js → types-PYHUCVOZ.js} +2 -2
- package/dist/cli/chunks/unified-memory-OUVCMFGK.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-YGQPOHXB.js +2 -0
- package/dist/cli/chunks/unified-persistence-GFRZVDOW.js +2 -0
- package/dist/cli/chunks/{upgrade-H5V53FRF.js → upgrade-ONP2HNGL.js} +2 -2
- package/dist/cli/chunks/{validate-IL22VB5I.js → validate-NWSICDAY.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-WZKECK3W.js → validate-swarm-KXS5P3U7.js} +2 -2
- package/dist/cli/chunks/{vibium-KKM23OTQ.js → vibium-TZSGZRCQ.js} +2 -2
- package/dist/cli/chunks/visual-security-LVOOYQ64.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-NJM5YBOY.js → web-tree-sitter-V2FADNRA.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-SLP43TVT.js → windsurf-installer-GQM7KWDC.js} +2 -2
- package/dist/cli/chunks/{witness-chain-XBEPT4XD.js → witness-chain-GTITDIA2.js} +2 -2
- package/dist/cli/chunks/witness-chain-QNFPV4UL.js +2 -0
- package/dist/cli/chunks/{witness-key-manager-DAAMNYOW.js → witness-key-manager-AHRM2M52.js} +2 -2
- package/dist/cli/chunks/{workflow-SZOOU6D3.js → workflow-XCGHEL3I.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-MIVBCALG.js +2 -0
- package/dist/cli/chunks/{wrappers-I2CBKWGF.js → wrappers-VGO2GO4J.js} +2 -2
- package/dist/cli/commands/eval.js +73 -3
- package/dist/cli/commands/llm-router.js +2 -0
- package/dist/cli/handlers/status-handler.d.ts +5 -0
- package/dist/cli/handlers/status-handler.js +35 -0
- package/dist/coordination/consensus/providers/index.js +11 -0
- package/dist/integrations/ruvector/brain-rvf-exporter.js +115 -13
- package/dist/integrations/ruvector/rvf-dual-writer.js +20 -3
- package/dist/integrations/ruvector/rvf-store-integrity.d.ts +49 -0
- package/dist/integrations/ruvector/rvf-store-integrity.js +137 -0
- package/dist/integrations/ruvector/shared-rvf-adapter.js +23 -5
- package/dist/learning/pattern-store.js +23 -5
- package/dist/learning/qe-flywheel/platform-signer.d.ts +32 -0
- package/dist/learning/qe-flywheel/platform-signer.js +60 -0
- package/dist/learning/qe-flywheel/receipt.js +9 -2
- package/dist/mcp/bundle.js +425 -406
- package/dist/shared/llm/billing-modes.d.ts +24 -0
- package/dist/shared/llm/billing-modes.js +56 -0
- package/dist/shared/llm/cost-tracker.js +2 -0
- package/dist/shared/llm/interfaces.d.ts +61 -3
- package/dist/shared/llm/provider-manager.d.ts +34 -0
- package/dist/shared/llm/provider-manager.js +152 -3
- package/dist/shared/llm/providers/claude-code.d.ts +57 -0
- package/dist/shared/llm/providers/claude-code.js +312 -0
- package/dist/shared/llm/providers/cognitum.d.ts +64 -0
- package/dist/shared/llm/providers/cognitum.js +369 -0
- package/dist/shared/llm/providers/index.d.ts +2 -0
- package/dist/shared/llm/providers/index.js +2 -0
- package/dist/shared/llm/router/config-store.d.ts +31 -11
- package/dist/shared/llm/router/config-store.js +82 -12
- package/dist/shared/llm/router/hybrid-router.js +16 -0
- package/dist/shared/llm/router/types.js +7 -0
- package/dist/shared/llm/spend-ledger.d.ts +64 -0
- package/dist/shared/llm/spend-ledger.js +115 -0
- package/dist/shared/llm/translation/message-formatter.js +2 -0
- package/dist/shared/llm/translation/prompt-translator.js +2 -0
- package/dist/shared/llm/translation/tool-translator.js +2 -0
- package/dist/validation/index.d.ts +1 -0
- package/dist/validation/index.js +2 -0
- package/dist/validation/provider-llm-executor.d.ts +45 -0
- package/dist/validation/provider-llm-executor.js +98 -0
- package/package.json +2 -2
- package/dist/cli/chunks/adapter-X4UEC6UJ.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-5FG7JCY7.js +0 -2
- package/dist/cli/chunks/base-CWPMFSZG.js +0 -2
- package/dist/cli/chunks/brain-handler-JF3OK35F.js +0 -89
- package/dist/cli/chunks/browser-workflow-A77OFBVY.js +0 -2
- package/dist/cli/chunks/chunk-CDVKFAYP.js +0 -18
- package/dist/cli/chunks/chunk-CJTXZI37.js +0 -2
- package/dist/cli/chunks/chunk-FNMEVLSN.js +0 -2
- package/dist/cli/chunks/chunk-P7G5LGUE.js +0 -3
- package/dist/cli/chunks/chunk-R7XEACKR.js +0 -2
- package/dist/cli/chunks/chunk-RAS7WRN5.js +0 -24
- package/dist/cli/chunks/chunk-TGIKKD43.js +0 -9
- package/dist/cli/chunks/client-KKCFGD7R.js +0 -2
- package/dist/cli/chunks/core-handlers-KRSSJEO5.js +0 -2
- package/dist/cli/chunks/cross-domain-router-27QGWU27.js +0 -2
- package/dist/cli/chunks/dream-M6K47Q4H.js +0 -2
- package/dist/cli/chunks/eval-73XW2WJD.js +0 -15
- package/dist/cli/chunks/heartbeat-scheduler-URXBF5RW.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-WWAGM6HK.js +0 -2
- package/dist/cli/chunks/hnsw-index-UFV2HSZE.js +0 -2
- package/dist/cli/chunks/hybrid-router-3U6Q6OTL.js +0 -2
- package/dist/cli/chunks/impact-analyzer-EUEX6ZRO.js +0 -2
- package/dist/cli/chunks/init-wizard-POKY2LRY.js +0 -2
- package/dist/cli/chunks/kernel-HPAONLZY.js +0 -2
- package/dist/cli/chunks/knowledge-graph-2WCUFG63.js +0 -2
- package/dist/cli/chunks/llm-router-service-D5VMG6SD.js +0 -2
- package/dist/cli/chunks/load-test-DHG26REU.js +0 -2
- package/dist/cli/chunks/memory-backend-GLWQ4DAL.js +0 -2
- package/dist/cli/chunks/memory-handlers-P72I4VV4.js +0 -2
- package/dist/cli/chunks/pattern-null-store-Y2YFTE3V.js +0 -2
- package/dist/cli/chunks/protocol-executor-HNT67NN5.js +0 -2
- package/dist/cli/chunks/provider-manager-5YGPZIEZ.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-Z5UGOA3F.js +0 -2
- package/dist/cli/chunks/queen-coordinator-P5LU5NWI.js +0 -2
- package/dist/cli/chunks/router-CRGHUAVR.js +0 -2
- package/dist/cli/chunks/routing-feedback-BVX5ZBCF.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-FZJSQOJM.js +0 -2
- package/dist/cli/chunks/safe-db-USYNEOC6.js +0 -2
- package/dist/cli/chunks/schedule-KCRCQ3PS.js +0 -2
- package/dist/cli/chunks/scheduler-CX3UHI4U.js +0 -2
- package/dist/cli/chunks/shared-rvf-adapter-VCOK3OVD.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-K23C4TFH.js +0 -2
- package/dist/cli/chunks/status-handler-M5W64S5U.js +0 -46
- package/dist/cli/chunks/token-bootstrap-W5IAMJW4.js +0 -2
- package/dist/cli/chunks/unified-memory-NCDBQLLF.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-T7NSGQ2H.js +0 -2
- package/dist/cli/chunks/unified-persistence-XUAYDCMM.js +0 -2
- package/dist/cli/chunks/visual-security-3TUC4GPP.js +0 -2
- package/dist/cli/chunks/witness-chain-QLOKUZXC.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-6JAYTZ7L.js +0 -2
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 — Claude Code (subscription) Provider (ADR-123, issue #557)
|
|
3
|
+
*
|
|
4
|
+
* Runs QE analysis on the user's Claude Pro/Max subscription by shelling out
|
|
5
|
+
* to the Claude Code CLI (`claude -p --output-format json`) instead of calling
|
|
6
|
+
* `api.anthropic.com` with a paid API key. The CLI authenticates with the
|
|
7
|
+
* user's existing OAuth login and draws from the subscription's shared usage
|
|
8
|
+
* allowance, so the worst case is "hit the plan rate limit and pause" rather
|
|
9
|
+
* than a surprise per-token bill.
|
|
10
|
+
*
|
|
11
|
+
* LOAD-BEARING: the child process env has ANTHROPIC_API_KEY / CLAUDE_API_KEY /
|
|
12
|
+
* ANTHROPIC_AUTH_TOKEN stripped. If any is present, the CLI silently reverts
|
|
13
|
+
* to API-key billing and this provider would be a lie. `parity` test coverage
|
|
14
|
+
* asserts the strip.
|
|
15
|
+
*/
|
|
16
|
+
import { spawn } from 'node:child_process';
|
|
17
|
+
import { createLLMError, } from '../interfaces';
|
|
18
|
+
import { TokenMetricsCollector } from '../../../learning/token-tracker.js';
|
|
19
|
+
/** Env vars whose presence flips the CLI from subscription to API billing. */
|
|
20
|
+
export const API_BILLING_ENV_VARS = [
|
|
21
|
+
'ANTHROPIC_API_KEY',
|
|
22
|
+
'CLAUDE_API_KEY',
|
|
23
|
+
'ANTHROPIC_AUTH_TOKEN',
|
|
24
|
+
];
|
|
25
|
+
export const DEFAULT_CLAUDE_CODE_CONFIG = {
|
|
26
|
+
model: 'sonnet',
|
|
27
|
+
maxTokens: 4096,
|
|
28
|
+
temperature: 0.7,
|
|
29
|
+
timeoutMs: 120000,
|
|
30
|
+
maxRetries: 1,
|
|
31
|
+
binaryPath: 'claude',
|
|
32
|
+
maxConcurrency: 2,
|
|
33
|
+
disallowedTools: ['Bash', 'Edit', 'Write', 'NotebookEdit', 'WebFetch', 'WebSearch', 'Task'],
|
|
34
|
+
};
|
|
35
|
+
export class ClaudeCodeProvider {
|
|
36
|
+
type = 'claude-code';
|
|
37
|
+
name = 'Claude Code (subscription)';
|
|
38
|
+
billingMode = 'subscription';
|
|
39
|
+
config;
|
|
40
|
+
requestId = 0;
|
|
41
|
+
availabilityCache;
|
|
42
|
+
active = 0;
|
|
43
|
+
queue = [];
|
|
44
|
+
constructor(config = {}) {
|
|
45
|
+
this.config = { ...DEFAULT_CLAUDE_CODE_CONFIG, ...config };
|
|
46
|
+
const envConc = Number.parseInt(process.env.AQE_CLAUDE_CODE_CONCURRENCY ?? '', 10);
|
|
47
|
+
if (Number.isFinite(envConc) && envConc > 0) {
|
|
48
|
+
this.config.maxConcurrency = envConc;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async isAvailable() {
|
|
52
|
+
// Cache for 60s — spawning `claude --version` per call is wasteful.
|
|
53
|
+
const now = Date.now();
|
|
54
|
+
if (this.availabilityCache && now - this.availabilityCache.at < 60_000) {
|
|
55
|
+
return this.availabilityCache.available;
|
|
56
|
+
}
|
|
57
|
+
let available = false;
|
|
58
|
+
try {
|
|
59
|
+
const { code } = await this.runProcess(['--version'], undefined, 5000);
|
|
60
|
+
available = code === 0;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
available = false;
|
|
64
|
+
}
|
|
65
|
+
this.availabilityCache = { at: now, available };
|
|
66
|
+
return available;
|
|
67
|
+
}
|
|
68
|
+
async healthCheck() {
|
|
69
|
+
const start = Date.now();
|
|
70
|
+
const available = await this.isAvailable();
|
|
71
|
+
const latencyMs = Date.now() - start;
|
|
72
|
+
if (!available) {
|
|
73
|
+
return {
|
|
74
|
+
healthy: false,
|
|
75
|
+
latencyMs,
|
|
76
|
+
error: `Claude Code CLI ("${this.config.binaryPath}") not found or not runnable. ` +
|
|
77
|
+
`Install Claude Code and log in with your Pro/Max account.`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
healthy: true,
|
|
82
|
+
latencyMs,
|
|
83
|
+
models: this.getSupportedModels(),
|
|
84
|
+
details: { binaryPath: this.config.binaryPath, billing: 'subscription' },
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async generate(input, options) {
|
|
88
|
+
const model = this.toCliModel(options?.model ?? this.config.model);
|
|
89
|
+
const requestId = `claude-code-${++this.requestId}-${Date.now()}`;
|
|
90
|
+
const { prompt, systemPrompt } = this.flatten(input, options?.systemPrompt);
|
|
91
|
+
const args = ['-p', '--output-format', 'json', '--model', model];
|
|
92
|
+
if (systemPrompt) {
|
|
93
|
+
args.push('--append-system-prompt', systemPrompt);
|
|
94
|
+
}
|
|
95
|
+
const disallowed = this.config.disallowedTools ?? [];
|
|
96
|
+
if (disallowed.length > 0) {
|
|
97
|
+
args.push('--disallowedTools', ...disallowed);
|
|
98
|
+
}
|
|
99
|
+
const start = Date.now();
|
|
100
|
+
const timeoutMs = options?.timeoutMs ?? this.config.timeoutMs ?? 120000;
|
|
101
|
+
const { code, stdout, stderr } = await this.withConcurrency(() => this.runProcess(args, prompt, timeoutMs));
|
|
102
|
+
const latencyMs = Date.now() - start;
|
|
103
|
+
if (code !== 0 && !stdout.trim()) {
|
|
104
|
+
throw this.classifyError(stderr || `claude exited with code ${code}`, model);
|
|
105
|
+
}
|
|
106
|
+
let data;
|
|
107
|
+
try {
|
|
108
|
+
data = JSON.parse(stdout);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
throw createLLMError(`Could not parse claude -p JSON output: ${stdout.slice(0, 200)}`, 'PROVIDER_UNAVAILABLE', { provider: 'claude-code', model, retryable: true });
|
|
112
|
+
}
|
|
113
|
+
if (data.is_error) {
|
|
114
|
+
throw this.classifyError(data.result ?? data.api_error_status ?? 'claude error', model);
|
|
115
|
+
}
|
|
116
|
+
const u = data.usage ?? {};
|
|
117
|
+
const usage = {
|
|
118
|
+
promptTokens: u.input_tokens ?? 0,
|
|
119
|
+
completionTokens: u.output_tokens ?? 0,
|
|
120
|
+
totalTokens: (u.input_tokens ?? 0) + (u.output_tokens ?? 0),
|
|
121
|
+
cacheCreationTokens: u.cache_creation_input_tokens ?? 0,
|
|
122
|
+
cacheReadTokens: u.cache_read_input_tokens ?? 0,
|
|
123
|
+
};
|
|
124
|
+
// The concrete model that actually served the request (modelUsage key).
|
|
125
|
+
const resolvedModel = (data.modelUsage && Object.keys(data.modelUsage)[0]) || model;
|
|
126
|
+
TokenMetricsCollector.recordTokenUsage(requestId, 'claude-code-provider', 'llm', 'generate', {
|
|
127
|
+
inputTokens: usage.promptTokens,
|
|
128
|
+
outputTokens: usage.completionTokens,
|
|
129
|
+
totalTokens: usage.totalTokens,
|
|
130
|
+
// Subscription: no marginal API charge. total_cost_usd is the
|
|
131
|
+
// API-equivalent figure, recorded for visibility only, not billed.
|
|
132
|
+
estimatedCostUsd: 0,
|
|
133
|
+
});
|
|
134
|
+
return {
|
|
135
|
+
content: data.result ?? '',
|
|
136
|
+
model: resolvedModel,
|
|
137
|
+
provider: 'claude-code',
|
|
138
|
+
usage,
|
|
139
|
+
// Subscription billing: marginal monetary cost is $0. The figure is
|
|
140
|
+
// authoritative (we know the subscription doesn't bill per token), so
|
|
141
|
+
// it's a provider receipt, not a local estimate.
|
|
142
|
+
cost: { inputCost: 0, outputCost: 0, totalCost: 0, currency: 'USD', source: 'provider-receipt' },
|
|
143
|
+
latencyMs,
|
|
144
|
+
finishReason: this.mapFinishReason(data.stop_reason),
|
|
145
|
+
cached: false,
|
|
146
|
+
requestId,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
async embed(_text, _options) {
|
|
150
|
+
throw createLLMError('Claude Code provider does not support embeddings. Use openai, ollama, or cognitum.', 'MODEL_NOT_FOUND', { provider: 'claude-code', retryable: false });
|
|
151
|
+
}
|
|
152
|
+
async complete(prompt, options) {
|
|
153
|
+
const response = await this.generate(prompt, {
|
|
154
|
+
model: options?.model,
|
|
155
|
+
temperature: options?.temperature ?? 0.2,
|
|
156
|
+
maxTokens: options?.maxTokens ?? 256,
|
|
157
|
+
});
|
|
158
|
+
return {
|
|
159
|
+
completion: response.content,
|
|
160
|
+
model: response.model,
|
|
161
|
+
provider: 'claude-code',
|
|
162
|
+
usage: response.usage,
|
|
163
|
+
latencyMs: response.latencyMs,
|
|
164
|
+
cached: response.cached,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
getConfig() {
|
|
168
|
+
return { ...this.config };
|
|
169
|
+
}
|
|
170
|
+
getSupportedModels() {
|
|
171
|
+
return ['opus', 'sonnet', 'haiku'];
|
|
172
|
+
}
|
|
173
|
+
getCostPerToken() {
|
|
174
|
+
// Subscription — no per-token monetary cost.
|
|
175
|
+
return { input: 0, output: 0 };
|
|
176
|
+
}
|
|
177
|
+
async dispose() {
|
|
178
|
+
// No persistent resources.
|
|
179
|
+
}
|
|
180
|
+
// -- internals -------------------------------------------------------------
|
|
181
|
+
/** Map an AQE canonical/model id to a CLI alias the `claude` binary accepts. */
|
|
182
|
+
toCliModel(model) {
|
|
183
|
+
const m = model.toLowerCase();
|
|
184
|
+
if (m.includes('opus'))
|
|
185
|
+
return 'opus';
|
|
186
|
+
if (m.includes('haiku'))
|
|
187
|
+
return 'haiku';
|
|
188
|
+
if (m.includes('sonnet'))
|
|
189
|
+
return 'sonnet';
|
|
190
|
+
return model;
|
|
191
|
+
}
|
|
192
|
+
flatten(input, systemPromptOpt) {
|
|
193
|
+
if (typeof input === 'string') {
|
|
194
|
+
return { prompt: input, systemPrompt: systemPromptOpt };
|
|
195
|
+
}
|
|
196
|
+
const systemParts = input.filter((m) => m.role === 'system').map((m) => m.content);
|
|
197
|
+
if (systemPromptOpt)
|
|
198
|
+
systemParts.unshift(systemPromptOpt);
|
|
199
|
+
const convo = input
|
|
200
|
+
.filter((m) => m.role !== 'system')
|
|
201
|
+
.map((m) => `${m.role === 'assistant' ? 'Assistant' : 'User'}: ${m.content}`)
|
|
202
|
+
.join('\n\n');
|
|
203
|
+
return {
|
|
204
|
+
prompt: convo,
|
|
205
|
+
systemPrompt: systemParts.length > 0 ? systemParts.join('\n\n') : undefined,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
mapFinishReason(reason) {
|
|
209
|
+
switch (reason) {
|
|
210
|
+
case 'max_tokens':
|
|
211
|
+
return 'length';
|
|
212
|
+
case 'end_turn':
|
|
213
|
+
case 'stop_sequence':
|
|
214
|
+
default:
|
|
215
|
+
return 'stop';
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
classifyError(message, model) {
|
|
219
|
+
const lower = message.toLowerCase();
|
|
220
|
+
if (lower.includes('rate limit') ||
|
|
221
|
+
lower.includes('usage limit') ||
|
|
222
|
+
lower.includes('429') ||
|
|
223
|
+
lower.includes('quota')) {
|
|
224
|
+
// The *desired* failure mode: plan limit reached → pause and retry later.
|
|
225
|
+
return createLLMError(message, 'RATE_LIMITED', {
|
|
226
|
+
provider: 'claude-code',
|
|
227
|
+
model,
|
|
228
|
+
retryable: true,
|
|
229
|
+
retryAfterMs: 60_000,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
return createLLMError(message, 'PROVIDER_UNAVAILABLE', {
|
|
233
|
+
provider: 'claude-code',
|
|
234
|
+
model,
|
|
235
|
+
retryable: true,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Build the child env with API-billing keys stripped (LOAD-BEARING).
|
|
240
|
+
* Exported logic tested by parity/env-strip tests.
|
|
241
|
+
*/
|
|
242
|
+
static childEnv(base = process.env) {
|
|
243
|
+
const env = { ...base };
|
|
244
|
+
for (const key of API_BILLING_ENV_VARS) {
|
|
245
|
+
delete env[key];
|
|
246
|
+
}
|
|
247
|
+
return env;
|
|
248
|
+
}
|
|
249
|
+
runProcess(args, stdin, timeoutMs) {
|
|
250
|
+
return new Promise((resolve, reject) => {
|
|
251
|
+
const child = spawn(this.config.binaryPath ?? 'claude', args, {
|
|
252
|
+
env: ClaudeCodeProvider.childEnv(),
|
|
253
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
254
|
+
});
|
|
255
|
+
let stdout = '';
|
|
256
|
+
let stderr = '';
|
|
257
|
+
let settled = false;
|
|
258
|
+
const timer = setTimeout(() => {
|
|
259
|
+
if (settled)
|
|
260
|
+
return;
|
|
261
|
+
settled = true;
|
|
262
|
+
child.kill('SIGKILL');
|
|
263
|
+
reject(createLLMError('claude -p timed out', 'TIMEOUT', {
|
|
264
|
+
provider: 'claude-code',
|
|
265
|
+
retryable: true,
|
|
266
|
+
}));
|
|
267
|
+
}, timeoutMs);
|
|
268
|
+
child.stdout.on('data', (d) => (stdout += d.toString()));
|
|
269
|
+
child.stderr.on('data', (d) => (stderr += d.toString()));
|
|
270
|
+
child.on('error', (err) => {
|
|
271
|
+
if (settled)
|
|
272
|
+
return;
|
|
273
|
+
settled = true;
|
|
274
|
+
clearTimeout(timer);
|
|
275
|
+
reject(createLLMError(`Failed to spawn claude: ${err.message}`, 'PROVIDER_UNAVAILABLE', {
|
|
276
|
+
provider: 'claude-code',
|
|
277
|
+
retryable: false,
|
|
278
|
+
cause: err,
|
|
279
|
+
}));
|
|
280
|
+
});
|
|
281
|
+
child.on('close', (code) => {
|
|
282
|
+
if (settled)
|
|
283
|
+
return;
|
|
284
|
+
settled = true;
|
|
285
|
+
clearTimeout(timer);
|
|
286
|
+
resolve({ code: code ?? 0, stdout, stderr });
|
|
287
|
+
});
|
|
288
|
+
if (stdin !== undefined) {
|
|
289
|
+
child.stdin.write(stdin);
|
|
290
|
+
}
|
|
291
|
+
child.stdin.end();
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/** Simple semaphore so we don't spawn unbounded `claude` subprocesses. */
|
|
295
|
+
async withConcurrency(fn) {
|
|
296
|
+
const limit = this.config.maxConcurrency ?? 2;
|
|
297
|
+
if (this.active >= limit) {
|
|
298
|
+
await new Promise((resolve) => this.queue.push(resolve));
|
|
299
|
+
}
|
|
300
|
+
this.active++;
|
|
301
|
+
try {
|
|
302
|
+
return await fn();
|
|
303
|
+
}
|
|
304
|
+
finally {
|
|
305
|
+
this.active--;
|
|
306
|
+
const next = this.queue.shift();
|
|
307
|
+
if (next)
|
|
308
|
+
next();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 — Cognitum Provider (ADR-123)
|
|
3
|
+
*
|
|
4
|
+
* api.cognitum.one is an OpenAI-compatible (and Anthropic-compatible) LLM
|
|
5
|
+
* gateway with two properties that matter for issue #557:
|
|
6
|
+
* 1. Every response carries an `x_cognitum` receipt with an authoritative
|
|
7
|
+
* per-request `price_usd` — so cost is a provider receipt, not a local
|
|
8
|
+
* price-table estimate.
|
|
9
|
+
* 2. It enforces a server-side hard spend cap (`/v1/usage` → `hardCapUsd`),
|
|
10
|
+
* so the worst case is "provider pauses at the cap", not a surprise bill.
|
|
11
|
+
*
|
|
12
|
+
* Models are tiers (`cognitum-auto|low|mid|high`); the gateway resolves each
|
|
13
|
+
* to a concrete model and reports it back in the receipt (`resolved_model`).
|
|
14
|
+
*/
|
|
15
|
+
import { LLMProvider, LLMProviderType, BillingMode, CognitumConfig, Message, GenerateOptions, EmbedOptions, CompleteOptions, LLMResponse, EmbeddingResponse, CompletionResponse, HealthCheckResult } from '../interfaces';
|
|
16
|
+
export type { CognitumConfig };
|
|
17
|
+
export declare const DEFAULT_COGNITUM_CONFIG: CognitumConfig;
|
|
18
|
+
/** Server-side budget snapshot from GET /v1/usage. */
|
|
19
|
+
export interface CognitumBudget {
|
|
20
|
+
servingBudgetUsd: number;
|
|
21
|
+
hardCapUsd: number;
|
|
22
|
+
committedUsd: number;
|
|
23
|
+
headroomUsd: number;
|
|
24
|
+
status: string;
|
|
25
|
+
headroomExhausted: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare class CognitumProvider implements LLMProvider {
|
|
28
|
+
readonly type: LLMProviderType;
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly billingMode: BillingMode;
|
|
31
|
+
private config;
|
|
32
|
+
private requestId;
|
|
33
|
+
constructor(config?: Partial<CognitumConfig>);
|
|
34
|
+
isAvailable(): Promise<boolean>;
|
|
35
|
+
healthCheck(): Promise<HealthCheckResult>;
|
|
36
|
+
generate(input: string | Message[], options?: GenerateOptions): Promise<LLMResponse>;
|
|
37
|
+
embed(text: string, options?: EmbedOptions): Promise<EmbeddingResponse>;
|
|
38
|
+
complete(prompt: string, options?: CompleteOptions): Promise<CompletionResponse>;
|
|
39
|
+
getConfig(): CognitumConfig;
|
|
40
|
+
getSupportedModels(): string[];
|
|
41
|
+
getCostPerToken(): {
|
|
42
|
+
input: number;
|
|
43
|
+
output: number;
|
|
44
|
+
};
|
|
45
|
+
dispose(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* ADR-123: read the provider's server-side budget so `aqe health` and the
|
|
48
|
+
* billing notice can show real remaining headroom. Returns undefined on any
|
|
49
|
+
* failure (best-effort — never throws).
|
|
50
|
+
*/
|
|
51
|
+
getRemoteBudget(): Promise<CognitumBudget | undefined>;
|
|
52
|
+
/** Build a CostInfo from the authoritative receipt price. */
|
|
53
|
+
private receiptCost;
|
|
54
|
+
private getApiKey;
|
|
55
|
+
private getBaseUrl;
|
|
56
|
+
private getHeaders;
|
|
57
|
+
private formatMessages;
|
|
58
|
+
private mapFinishReason;
|
|
59
|
+
private toApiError;
|
|
60
|
+
private fetchWithTimeout;
|
|
61
|
+
private fetchWithRetry;
|
|
62
|
+
private sleep;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=cognitum.d.ts.map
|