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
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.
|
|
2
|
-
import{a,b,c,d,e,f,g}from"./chunk-
|
|
1
|
+
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.3");process.exit(0)}
|
|
2
|
+
import{a,b,c,d,e,f,g}from"./chunk-GV2BS5NC.js";import"./chunk-G5OGKVLO.js";import"./chunk-4EHW4TNA.js";import"./chunk-XUUVAAHV.js";import"./chunk-SGMJ277D.js";export{c as PersistentWitnessChain,a as SPRTAccumulator,b as WitnessChain,f as createPersistentWitnessChain,e as createWitnessChain,d as createWitnessChainSQLitePersistence,g as isWitnessChainFeatureEnabled};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.3");process.exit(0)}
|
|
2
|
+
import{a,b,c,d,e,f,g,h,i}from"./chunk-DZ775UGW.js";import"./chunk-SPI4LUJ6.js";import"./chunk-NOSQI2OW.js";import"./chunk-FJACKKRL.js";import"./chunk-L2X3BWMN.js";import"./chunk-G5OGKVLO.js";import"./chunk-4EHW4TNA.js";import"./chunk-NJDLJ3KD.js";import"./chunk-OBL6W4Z5.js";import"./chunk-2LNDU7AW.js";import"./chunk-ULQCEM7K.js";import"./chunk-UAPUA6OY.js";import"./chunk-GS6G7AVS.js";import"./chunk-YUDGQZJN.js";import"./chunk-HJ4U64BL.js";import"./chunk-CYSBM52D.js";import"./chunk-NLDLUHOF.js";import"./chunk-PEHEANAM.js";import"./chunk-XUUVAAHV.js";import"./chunk-SGMJ277D.js";export{a as GENESIS_PREV_HASH,f as WitnessChain,i as _resetWitnessChainForTests,h as createWitnessChain,g as getWitnessChain,d as hashWith,e as serializeEntry,b as sha256,c as shake256};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.
|
|
2
|
-
import{a,b,c}from"./chunk-
|
|
1
|
+
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.3");process.exit(0)}
|
|
2
|
+
import{a,b,c}from"./chunk-SPI4LUJ6.js";import"./chunk-NJDLJ3KD.js";import"./chunk-SGMJ277D.js";export{a as WitnessKeyManager,c as _resetDefaultWitnessKeyManagerForTests,b as getDefaultWitnessKeyManager};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.
|
|
2
|
-
import"./chunk-
|
|
1
|
+
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.3");process.exit(0)}
|
|
2
|
+
import"./chunk-DMD6WVJ2.js";import{b as $}from"./chunk-FTM562PF.js";import{d as R}from"./chunk-S47YGWXK.js";import{b as k,c as C,d as b}from"./chunk-BEPP57C2.js";import{c as W}from"./chunk-OBL6W4Z5.js";import"./chunk-NKTLKMUB.js";import"./chunk-2LNDU7AW.js";import"./chunk-SGMJ277D.js";import{Command as O}from"commander";import o from"chalk";function P(d,a){let m=d.indexOf("=");return m>0&&(a[d.substring(0,m)]=d.substring(m+1)),a}function x(d,a,m){let y=new O("workflow").description("Manage QE workflows and pipelines (ADR-041)");return y.command("run <file>").description("Execute a QE pipeline from YAML file").option("-w, --watch","Watch execution progress").option("-v, --verbose","Show detailed output").option("--params <json>","Additional parameters as JSON","{}").action(async(t,l)=>{if(!await m())return;let e=await import("fs"),c=(await import("path")).resolve(t);try{console.log(o.blue(`
|
|
3
3
|
Running workflow from: ${t}
|
|
4
4
|
`));let s=k(c);if(!s.success||!s.workflow){console.log(o.red("Failed to parse pipeline:"));for(let w of s.errors)console.log(o.red(` ${w}`));await a(1)}let r={...W(l.params,"params")};if(s.pipeline){for(let w of s.pipeline.stages)if(w.params)for(let[S,h]of Object.entries(w.params))r[S]=h}if(!d.workflowOrchestrator.getWorkflow(s.workflow.id)){let w=d.workflowOrchestrator.registerWorkflow(s.workflow);w.success||(console.log(o.red(`Failed to register workflow: ${w.error.message}`)),await a(1))}let n=await d.workflowOrchestrator.executeWorkflow(s.workflow.id,r);if(!n.success){console.log(o.red(`Failed to start workflow: ${n.error.message}`)),await a(1);return}let p=n.value;if(console.log(o.cyan(` Execution ID: ${p}`)),console.log(o.gray(` Workflow: ${s.workflow.name}`)),console.log(o.gray(` Stages: ${s.workflow.steps.length}`)),console.log(""),l.watch){console.log(o.blue(`Workflow Progress:
|
|
5
5
|
`));let w,S=Date.now();for(;;){let g=d.workflowOrchestrator.getWorkflowStatus(p);if(!g)break;if(!w||w.progress!==g.progress||w.status!==g.status||JSON.stringify(w.currentSteps)!==JSON.stringify(g.currentSteps)){process.stdout.write("\r\x1B[K");let v="\u2588".repeat(Math.floor(g.progress/5))+"\u2591".repeat(20-Math.floor(g.progress/5)),D=g.status==="completed"?o.green:g.status==="failed"?o.red:g.status==="running"?o.yellow:o.gray;console.log(` [${v}] ${g.progress}% - ${D(g.status)}`),g.currentSteps.length>0&&l.verbose&&console.log(o.gray(` Running: ${g.currentSteps.join(", ")}`)),w=g}if(g.status==="completed"||g.status==="failed"||g.status==="cancelled")break;await new Promise(v=>setTimeout(v,500))}let h=d.workflowOrchestrator.getWorkflowStatus(p);if(h){console.log("");let g=h.duration||Date.now()-S;h.status==="completed"?(console.log(o.green("Workflow completed successfully")),console.log(o.gray(` Duration: ${$(g)}`)),console.log(o.gray(` Completed: ${h.completedSteps.length} stages`)),h.skippedSteps.length>0&&console.log(o.yellow(` Skipped: ${h.skippedSteps.length} stages`))):h.status==="failed"?(console.log(o.red("Workflow failed")),console.log(o.red(` Error: ${h.error}`)),console.log(o.gray(` Failed stages: ${h.failedSteps.join(", ")}`))):console.log(o.yellow(`Workflow ${h.status}`))}}else console.log(o.green("Workflow execution started")),console.log(o.gray(` Use 'aqe workflow status ${p}' to check progress`));console.log(""),await a(0)}catch(s){console.error(o.red(`
|
|
@@ -35,10 +35,10 @@ Workflow cancelled: ${t}
|
|
|
35
35
|
`)):console.log(o.red(`
|
|
36
36
|
Failed to cancel workflow: ${l.error.message}
|
|
37
37
|
`)),await a(l.success?0:1)}catch(l){console.error(o.red(`
|
|
38
|
-
Failed to cancel workflow:`),l),await a(1)}}),y.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:t}=await import("./browser-workflow-
|
|
38
|
+
Failed to cancel workflow:`),l),await a(1)}}),y.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:t}=await import("./browser-workflow-ZMMKCGYW.js"),e=await new t().invoke({});if(e.success&&e.data){console.log(o.blue(`
|
|
39
39
|
Browser Workflow Templates:
|
|
40
40
|
`));for(let u of e.data.availableTemplates)console.log(` ${o.cyan(u)}`);console.log("")}else console.log(o.red(`Failed: ${e.error||"Unknown error"}`));await a(0)}catch(t){console.error(o.red(`
|
|
41
|
-
Failed:`),t),await a(1)}}),y.command("browser-load [template]").description("Load and validate a browser workflow template or inline YAML").option("--yaml <yaml>","Inline YAML workflow definition").option("-v, --var <key=value>","Variable override (repeatable)",P,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(t,l)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-
|
|
41
|
+
Failed:`),t),await a(1)}}),y.command("browser-load [template]").description("Load and validate a browser workflow template or inline YAML").option("--yaml <yaml>","Inline YAML workflow definition").option("-v, --var <key=value>","Variable override (repeatable)",P,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(t,l)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-ZMMKCGYW.js"),{writeOutput:u,toJSON:c}=await import("./ci-output-25GS6RXR.js"),s=new e,f={variables:l.var||{}};if(l.yaml)f.workflowYaml=l.yaml;else if(t)if(t.endsWith(".yaml")||t.endsWith(".yml")){let i=await import("fs"),p=(await import("path")).resolve(t);i.existsSync(p)||(console.log(o.red(`
|
|
42
42
|
File not found: ${p}
|
|
43
43
|
`)),await a(1)),f.workflowYaml=i.readFileSync(p,"utf-8")}else f.templateName=t;else console.log(o.red(`
|
|
44
44
|
Provide a template name or --yaml. Use "workflow browser-list" to see templates.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.3");process.exit(0)}
|
|
2
|
+
import{a,b,c,d}from"./chunk-PDX7IYTJ.js";import"./chunk-Y6XNISHP.js";import"./chunk-NOSQI2OW.js";import"./chunk-FJACKKRL.js";import"./chunk-L2X3BWMN.js";import"./chunk-G5OGKVLO.js";import"./chunk-4EHW4TNA.js";import"./chunk-NJDLJ3KD.js";import"./chunk-OBL6W4Z5.js";import"./chunk-NKTLKMUB.js";import"./chunk-2LNDU7AW.js";import"./chunk-EOUJ6X5H.js";import"./chunk-ULQCEM7K.js";import"./chunk-UAPUA6OY.js";import"./chunk-GS6G7AVS.js";import"./chunk-YUDGQZJN.js";import"./chunk-HJ4U64BL.js";import"./chunk-CYSBM52D.js";import"./chunk-NLDLUHOF.js";import"./chunk-PEHEANAM.js";import"./chunk-XUUVAAHV.js";import"./chunk-SGMJ277D.js";export{b as DEFAULT_WORKFLOW_CONFIG,a as WorkflowEvents,c as WorkflowOrchestrator,d as createWorkflowOrchestrator};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.
|
|
2
|
-
import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v as L,w as M,x as N}from"./chunk-
|
|
1
|
+
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.3");process.exit(0)}
|
|
2
|
+
import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v as L,w as M,x as N}from"./chunk-QILF6BZH.js";import{a as v,b as w,c as x,d as y,e as z,f as A,g as B,h as C,i as D,j as E,k as F,l as G,m as H,n as I,o as J,p as K}from"./chunk-YOG5KQZF.js";import"./chunk-NOSQI2OW.js";import"./chunk-FJACKKRL.js";import"./chunk-L2X3BWMN.js";import"./chunk-G5OGKVLO.js";import"./chunk-4EHW4TNA.js";import"./chunk-NJDLJ3KD.js";import"./chunk-OBL6W4Z5.js";import"./chunk-2LNDU7AW.js";import"./chunk-ULQCEM7K.js";import"./chunk-UAPUA6OY.js";import"./chunk-GS6G7AVS.js";import"./chunk-YUDGQZJN.js";import"./chunk-HJ4U64BL.js";import"./chunk-CYSBM52D.js";import"./chunk-NLDLUHOF.js";import"./chunk-PEHEANAM.js";import"./chunk-XUUVAAHV.js";import"./chunk-SGMJ277D.js";export{z as GNNLayerFactory,i as QEFlashAttention,x as QEGNNEmbeddingIndex,y as QEGNNIndexFactory,a as QESONA,e as QE_FLASH_ATTENTION_CONFIG,g as QE_PERFORMANCE_TARGETS,f as QE_SONA_CONFIG,A as TensorCompressionFactory,u as batchComputeAttention,K as batchDifferentiableSearch,M as checkRuvectorPackagesAvailable,c as createDomainQESONA,j as createQEFlashAttention,b as createQESONA,D as getDifferentiableSearch,F as getGetCompressionLevel,E as getHierarchicalForward,G as getInit,h as getOptimalBlockConfig,k as getQEFlashAttentionConfig,n as getRuvectorDotProductAttention,m as getRuvectorFlashAttention,p as getRuvectorHyperbolicAttention,B as getRuvectorLayer,q as getRuvectorLinearAttention,r as getRuvectorMoEAttention,o as getRuvectorMultiHeadAttention,L as getRuvectorPackageVersions,C as getTensorCompress,l as getWorkloadTypes,N as initAllRuvectorPackages,w as initGNN,d as isAttentionAvailable,v as isGNNAvailable,s as toFloat32Array,H as toFloat32ArrayGNN,J as toIEmbedding,t as toNumberArrayAttn,I as toNumberArrayGNN};
|
|
@@ -15,7 +15,8 @@ import chalk from 'chalk';
|
|
|
15
15
|
import * as fs from 'fs';
|
|
16
16
|
import * as path from 'path';
|
|
17
17
|
import * as yaml from 'yaml';
|
|
18
|
-
import { createParallelEvalRunner, DEFAULT_PARALLEL_EVAL_CONFIG, } from '../../validation/parallel-eval-runner.js';
|
|
18
|
+
import { createParallelEvalRunner, DEFAULT_PARALLEL_EVAL_CONFIG, MockLLMExecutor, } from '../../validation/parallel-eval-runner.js';
|
|
19
|
+
import { resolveEvalExecutor } from '../../validation/provider-llm-executor.js';
|
|
19
20
|
import { createCommandEvalRunner, isCommandEvalSuite, } from '../../validation/command-eval-runner.js';
|
|
20
21
|
import { createSkillValidationLearner, } from '../../learning/skill-validation-learner.js';
|
|
21
22
|
import { createRealQEReasoningBank, } from '../../learning/real-qe-reasoning-bank.js';
|
|
@@ -54,6 +55,16 @@ const P2_SKILLS = [
|
|
|
54
55
|
/**
|
|
55
56
|
* Get skills for a specific tier
|
|
56
57
|
*/
|
|
58
|
+
/**
|
|
59
|
+
* ADR-123: propagate a `--max-budget-usd` flag to the provider layer via the
|
|
60
|
+
* AQE_MAX_BUDGET_USD env var, which ProviderManager reads as a per-run cap.
|
|
61
|
+
*/
|
|
62
|
+
function applyMaxBudget(maxBudgetUsd) {
|
|
63
|
+
if (typeof maxBudgetUsd === 'number' && Number.isFinite(maxBudgetUsd) && maxBudgetUsd > 0) {
|
|
64
|
+
process.env.AQE_MAX_BUDGET_USD = String(maxBudgetUsd);
|
|
65
|
+
console.log(chalk.gray(` Budget cap: $${maxBudgetUsd.toFixed(2)} for this run`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
57
68
|
function getSkillsByTier(tier) {
|
|
58
69
|
switch (tier) {
|
|
59
70
|
case 3:
|
|
@@ -295,6 +306,36 @@ async function handleRunCommand(options) {
|
|
|
295
306
|
}
|
|
296
307
|
process.exit(result.passed ? 0 : 1);
|
|
297
308
|
}
|
|
309
|
+
// Issue #557 follow-up: resolve a REAL LLM executor by default. `--mock`
|
|
310
|
+
// opts into canned responses (offline testing only). If neither a provider
|
|
311
|
+
// is configured nor --mock is passed, fail loudly rather than fabricate.
|
|
312
|
+
let executor;
|
|
313
|
+
let evalManager;
|
|
314
|
+
if (options.mock) {
|
|
315
|
+
console.log(chalk.yellow.bold(' ⚠️ MOCK MODE: canned responses, NOT real model output. Results are not valid eval evidence.'));
|
|
316
|
+
executor = new MockLLMExecutor();
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
const resolved = await resolveEvalExecutor();
|
|
320
|
+
if (!resolved.executor) {
|
|
321
|
+
console.error(chalk.red('\n Cannot run real eval: ') + (resolved.reason ?? 'no provider'));
|
|
322
|
+
process.exit(1);
|
|
323
|
+
}
|
|
324
|
+
executor = resolved.executor;
|
|
325
|
+
evalManager = resolved.manager;
|
|
326
|
+
const modeLabel = resolved.billingMode === 'subscription'
|
|
327
|
+
? chalk.green('subscription (no per-token charge)')
|
|
328
|
+
: resolved.billingMode === 'local'
|
|
329
|
+
? chalk.green('local (no cost)')
|
|
330
|
+
: resolved.billingMode === 'metered-capped'
|
|
331
|
+
? chalk.yellow('metered (server-side cap)')
|
|
332
|
+
: chalk.red('pay-per-token API');
|
|
333
|
+
console.log(` LLM provider: ${chalk.cyan(resolved.providerType)} billing: ${modeLabel}`);
|
|
334
|
+
if (process.env.AQE_MAX_BUDGET_USD) {
|
|
335
|
+
console.log(chalk.gray(` Budget cap: $${process.env.AQE_MAX_BUDGET_USD} for this run`));
|
|
336
|
+
}
|
|
337
|
+
console.log('');
|
|
338
|
+
}
|
|
298
339
|
const { runner, reasoningBank } = await initializeRunner();
|
|
299
340
|
try {
|
|
300
341
|
// Configure runner
|
|
@@ -305,7 +346,7 @@ async function handleRunCommand(options) {
|
|
|
305
346
|
timeout: options.timeout,
|
|
306
347
|
retryFailedTests: options.retry,
|
|
307
348
|
};
|
|
308
|
-
const customRunner = createParallelEvalRunner(createSkillValidationLearner(reasoningBank), config);
|
|
349
|
+
const customRunner = createParallelEvalRunner(createSkillValidationLearner(reasoningBank), config, executor);
|
|
309
350
|
// Set up progress reporting
|
|
310
351
|
if (options.verbose) {
|
|
311
352
|
customRunner.onProgress(displayProgress);
|
|
@@ -333,11 +374,30 @@ async function handleRunCommand(options) {
|
|
|
333
374
|
}
|
|
334
375
|
finally {
|
|
335
376
|
await reasoningBank.dispose();
|
|
377
|
+
if (evalManager)
|
|
378
|
+
await evalManager.dispose();
|
|
336
379
|
}
|
|
337
380
|
}
|
|
338
381
|
async function handleRunAllCommand(options) {
|
|
339
382
|
console.log(chalk.bold('\nAQE Parallel Eval Runner - Multi-Skill'));
|
|
340
383
|
console.log(chalk.dim('ADR-056 Phase 5: Worker Pool Pattern\n'));
|
|
384
|
+
// Issue #557 follow-up: real executor by default; --mock is offline-only.
|
|
385
|
+
let executor;
|
|
386
|
+
let evalManager;
|
|
387
|
+
if (options.mock) {
|
|
388
|
+
console.log(chalk.yellow.bold(' ⚠️ MOCK MODE: canned responses, NOT real model output. Results are not valid eval evidence.'));
|
|
389
|
+
executor = new MockLLMExecutor();
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
const resolved = await resolveEvalExecutor();
|
|
393
|
+
if (!resolved.executor) {
|
|
394
|
+
console.error(chalk.red('\n Cannot run real eval: ') + (resolved.reason ?? 'no provider'));
|
|
395
|
+
process.exit(1);
|
|
396
|
+
}
|
|
397
|
+
executor = resolved.executor;
|
|
398
|
+
evalManager = resolved.manager;
|
|
399
|
+
console.log(` LLM provider: ${chalk.cyan(resolved.providerType)} billing: ${resolved.billingMode}`);
|
|
400
|
+
}
|
|
341
401
|
const { runner, learner, reasoningBank } = await initializeRunner();
|
|
342
402
|
try {
|
|
343
403
|
// Get skills for tier
|
|
@@ -353,7 +413,7 @@ async function handleRunAllCommand(options) {
|
|
|
353
413
|
...DEFAULT_PARALLEL_EVAL_CONFIG,
|
|
354
414
|
maxWorkers: options.parallel ? options.workers : 1,
|
|
355
415
|
};
|
|
356
|
-
const customRunner = createParallelEvalRunner(learner, config);
|
|
416
|
+
const customRunner = createParallelEvalRunner(learner, config, executor);
|
|
357
417
|
// Run all evals
|
|
358
418
|
const results = await customRunner.runMultipleEvalsParallel(skills, models);
|
|
359
419
|
// Flatten results for display
|
|
@@ -394,6 +454,8 @@ async function handleRunAllCommand(options) {
|
|
|
394
454
|
}
|
|
395
455
|
finally {
|
|
396
456
|
await reasoningBank.dispose();
|
|
457
|
+
if (evalManager)
|
|
458
|
+
await evalManager.dispose();
|
|
397
459
|
}
|
|
398
460
|
}
|
|
399
461
|
async function handleStatusCommand(skill) {
|
|
@@ -531,7 +593,10 @@ export function createEvalCommand() {
|
|
|
531
593
|
.option('--no-retry', 'Disable retry of failed tests')
|
|
532
594
|
.option('-o, --output <path>', 'Output file path for results')
|
|
533
595
|
.option('-v, --verbose', 'Show progress during execution', false)
|
|
596
|
+
.option('--max-budget-usd <n>', 'ADR-123: cap total LLM spend for this run in USD (aborts with COST_LIMIT_EXCEEDED past the cap)', parseFloat)
|
|
597
|
+
.option('--mock', 'Use canned responses instead of real model calls (offline testing only — results are NOT valid eval evidence)', false)
|
|
534
598
|
.action(async (opts) => {
|
|
599
|
+
applyMaxBudget(opts.maxBudgetUsd);
|
|
535
600
|
await handleRunCommand({
|
|
536
601
|
skill: opts.skill,
|
|
537
602
|
model: opts.model,
|
|
@@ -542,6 +607,7 @@ export function createEvalCommand() {
|
|
|
542
607
|
retry: opts.retry !== false,
|
|
543
608
|
output: opts.output,
|
|
544
609
|
verbose: opts.verbose,
|
|
610
|
+
mock: opts.mock === true,
|
|
545
611
|
});
|
|
546
612
|
});
|
|
547
613
|
// Run all evals
|
|
@@ -554,7 +620,10 @@ export function createEvalCommand() {
|
|
|
554
620
|
.option('-w, --workers <n>', 'Number of parallel workers', parseInt, 5)
|
|
555
621
|
.option('-o, --output <path>', 'Output file path for report')
|
|
556
622
|
.option('-v, --verbose', 'Show progress during execution', false)
|
|
623
|
+
.option('--max-budget-usd <n>', 'ADR-123: cap total LLM spend for this run in USD (aborts with COST_LIMIT_EXCEEDED past the cap)', parseFloat)
|
|
624
|
+
.option('--mock', 'Use canned responses instead of real model calls (offline testing only — results are NOT valid eval evidence)', false)
|
|
557
625
|
.action(async (opts) => {
|
|
626
|
+
applyMaxBudget(opts.maxBudgetUsd);
|
|
558
627
|
await handleRunAllCommand({
|
|
559
628
|
skillsTier: opts.skillsTier,
|
|
560
629
|
models: opts.models,
|
|
@@ -562,6 +631,7 @@ export function createEvalCommand() {
|
|
|
562
631
|
workers: opts.workers,
|
|
563
632
|
output: opts.output,
|
|
564
633
|
verbose: opts.verbose,
|
|
634
|
+
mock: opts.mock === true,
|
|
565
635
|
});
|
|
566
636
|
});
|
|
567
637
|
// Status command
|
|
@@ -399,12 +399,14 @@ function formatCost(cost) {
|
|
|
399
399
|
function getDefaultModelForProvider(provider) {
|
|
400
400
|
const defaults = {
|
|
401
401
|
claude: 'claude-sonnet-4-6',
|
|
402
|
+
'claude-code': 'sonnet',
|
|
402
403
|
openai: 'gpt-4o',
|
|
403
404
|
ollama: 'llama3.1',
|
|
404
405
|
openrouter: 'anthropic/claude-sonnet-4',
|
|
405
406
|
gemini: 'gemini-2.0-pro',
|
|
406
407
|
'azure-openai': 'gpt-4o',
|
|
407
408
|
bedrock: 'anthropic.claude-sonnet-4-v1:0',
|
|
409
|
+
cognitum: 'cognitum-auto',
|
|
408
410
|
onnx: 'phi-4',
|
|
409
411
|
};
|
|
410
412
|
return defaults[provider] || '';
|
|
@@ -22,6 +22,11 @@ export interface DaemonLivenessStatus {
|
|
|
22
22
|
* tracks a *different*, in-process `QualityDaemon` instance that can't see a
|
|
23
23
|
* truly detached process across separate CLI invocations anyway.
|
|
24
24
|
*/
|
|
25
|
+
/**
|
|
26
|
+
* ADR-123 (issue #557): print how the active LLM provider bills, plus any
|
|
27
|
+
* configured per-run budget cap. Best-effort — never throws into `aqe health`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function printLlmBilling(): void;
|
|
25
30
|
export declare function checkDaemonLiveness(): DaemonLivenessStatus;
|
|
26
31
|
export declare class StatusHandler implements ICommandHandler {
|
|
27
32
|
readonly name = "status";
|
|
@@ -9,6 +9,8 @@ import { join } from 'node:path';
|
|
|
9
9
|
import { getStatusColor, formatUptime, } from './interfaces.js';
|
|
10
10
|
import { writeOutput, toJSON } from '../utils/ci-output.js';
|
|
11
11
|
import { findProjectRoot } from '../../kernel/unified-memory.js';
|
|
12
|
+
import { loadRouterConfig } from '../../shared/llm/router/config-store.js';
|
|
13
|
+
import { billingModeForType } from '../../shared/llm/billing-modes.js';
|
|
12
14
|
/**
|
|
13
15
|
* Check whether the detached background-worker daemon (`.agentic-qe/workers/
|
|
14
16
|
* start-daemon.cjs`, PID recorded in `daemon.pid` — see `10-workers.ts`) is
|
|
@@ -19,6 +21,36 @@ import { findProjectRoot } from '../../kernel/unified-memory.js';
|
|
|
19
21
|
* tracks a *different*, in-process `QualityDaemon` instance that can't see a
|
|
20
22
|
* truly detached process across separate CLI invocations anyway.
|
|
21
23
|
*/
|
|
24
|
+
/**
|
|
25
|
+
* ADR-123 (issue #557): print how the active LLM provider bills, plus any
|
|
26
|
+
* configured per-run budget cap. Best-effort — never throws into `aqe health`.
|
|
27
|
+
*/
|
|
28
|
+
export function printLlmBilling() {
|
|
29
|
+
try {
|
|
30
|
+
const config = loadRouterConfig();
|
|
31
|
+
const primary = config.defaultProvider;
|
|
32
|
+
const mode = billingModeForType(primary);
|
|
33
|
+
const modeLabel = {
|
|
34
|
+
'metered-api': `${chalk.red('●')} pay-per-token API key (no cap)`,
|
|
35
|
+
'metered-capped': `${chalk.yellow('●')} pay-per-token with server-side cap`,
|
|
36
|
+
subscription: `${chalk.green('●')} Claude subscription (no per-token charge)`,
|
|
37
|
+
local: `${chalk.green('●')} local (no cost)`,
|
|
38
|
+
};
|
|
39
|
+
console.log(chalk.blue('\n LLM Billing:'));
|
|
40
|
+
console.log(` Provider: ${chalk.cyan(primary)} ${modeLabel[mode] ?? mode}`);
|
|
41
|
+
const cap = Number.parseFloat(process.env.AQE_MAX_BUDGET_USD ?? '');
|
|
42
|
+
if (Number.isFinite(cap) && cap > 0) {
|
|
43
|
+
console.log(` Per-run budget cap: ${chalk.cyan('$' + cap.toFixed(2))}`);
|
|
44
|
+
}
|
|
45
|
+
else if (mode === 'metered-api') {
|
|
46
|
+
console.log(chalk.gray(' No budget cap set — use AQE_MAX_BUDGET_USD or --max-budget-usd.'));
|
|
47
|
+
console.log(chalk.gray(' Tip: AQE_LLM_PROVIDER=claude-code runs on your Claude subscription.'));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Billing display is informational; failures must not break health.
|
|
52
|
+
}
|
|
53
|
+
}
|
|
22
54
|
export function checkDaemonLiveness() {
|
|
23
55
|
try {
|
|
24
56
|
const pidFile = join(findProjectRoot(), '.agentic-qe', 'workers', 'daemon.pid');
|
|
@@ -291,6 +323,9 @@ export class HealthHandler {
|
|
|
291
323
|
else {
|
|
292
324
|
console.log(` ${chalk.red('\u25CF')} Not running (stale PID: ${daemon.pid ?? 'unknown'}) \u2014 learning/consolidation snapshots will not advance`);
|
|
293
325
|
}
|
|
326
|
+
// ADR-123 (issue #557): make LLM billing visible so a paid API key is
|
|
327
|
+
// never a silent surprise.
|
|
328
|
+
printLlmBilling();
|
|
294
329
|
}
|
|
295
330
|
console.log('');
|
|
296
331
|
await this.cleanupAndExit(0);
|
|
@@ -184,6 +184,17 @@ export function registerProvidersFromEnv(enableLogging = false) {
|
|
|
184
184
|
config.claude = {
|
|
185
185
|
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
186
186
|
};
|
|
187
|
+
// ADR-123 (issue #557): this consensus/multi-model-verification path bills
|
|
188
|
+
// the pay-per-token Anthropic API, not a Claude subscription, and has no
|
|
189
|
+
// budget cap of its own. Surface it so the spend isn't silent. (Full
|
|
190
|
+
// subscription + budget support for the consensus ModelProvider layer is
|
|
191
|
+
// tracked as ADR-123 follow-up — it uses a different interface than the
|
|
192
|
+
// shared LLM ProviderManager.)
|
|
193
|
+
if ((process.env.AQE_LLM_NO_BILLING_NOTICE ?? '') !== '1') {
|
|
194
|
+
// eslint-disable-next-line no-console
|
|
195
|
+
console.error('⚠️ Consensus verification will use the Anthropic API key (pay-per-token, ' +
|
|
196
|
+
'no budget cap). Unset ANTHROPIC_API_KEY to disable this path.');
|
|
197
|
+
}
|
|
187
198
|
}
|
|
188
199
|
// Detect OpenAI
|
|
189
200
|
if (process.env.OPENAI_API_KEY) {
|
|
@@ -3,11 +3,82 @@
|
|
|
3
3
|
* `.rvf` file using the @ruvector/rvf-node native binding via rvf-native-adapter.
|
|
4
4
|
* Falls back to JSONL directory format when the native binding is unavailable.
|
|
5
5
|
*/
|
|
6
|
-
import { existsSync, statSync, unlinkSync, writeFileSync } from 'fs';
|
|
7
|
-
import { resolve } from 'path';
|
|
6
|
+
import { existsSync, readdirSync, renameSync, statSync, unlinkSync, writeFileSync } from 'fs';
|
|
7
|
+
import { basename, dirname, join, resolve } from 'path';
|
|
8
8
|
import { createRvfStore, openRvfStore, openRvfStoreReadonly, isRvfNativeAvailable, } from './rvf-native-adapter.js';
|
|
9
9
|
import { sha256, tableExists, queryAll, domainFilterForColumn, ensureTargetTables, mergeGenericRow, mergeAppendOnlyRow, TABLE_CONFIGS, TABLE_BLOB_COLUMNS, PK_COLUMNS, CONFIDENCE_COLUMNS, TIMESTAMP_COLUMNS, serializeRowBlobs, deserializeRowBlobs, } from './brain-shared.js';
|
|
10
10
|
// --- Export ---
|
|
11
|
+
/**
|
|
12
|
+
* Sidecar suffixes that make up a complete store on disk. `''` is the store
|
|
13
|
+
* itself; the adapter writes `.idmap.json` on close, and we write the manifest.
|
|
14
|
+
*/
|
|
15
|
+
const RVF_STORE_SUFFIXES = ['', '.idmap.json', '.manifest.json'];
|
|
16
|
+
/**
|
|
17
|
+
* Everything an abandoned tmp export can leave behind. `.lock` is cleaned up
|
|
18
|
+
* but deliberately absent from RVF_STORE_SUFFIXES — renaming a lock into the
|
|
19
|
+
* final path is the very corruption this fix exists to prevent.
|
|
20
|
+
*/
|
|
21
|
+
const RVF_CLEANUP_SUFFIXES = [...RVF_STORE_SUFFIXES, '.lock'];
|
|
22
|
+
/** Best-effort removal of a store and its sidecars at `base`. */
|
|
23
|
+
function removeStoreFiles(base) {
|
|
24
|
+
for (const suffix of RVF_CLEANUP_SUFFIXES) {
|
|
25
|
+
try {
|
|
26
|
+
const p = `${base}${suffix}`;
|
|
27
|
+
if (existsSync(p))
|
|
28
|
+
unlinkSync(p);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// best-effort — a leftover tmp is inert, unlike a corrupt final store
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Remove tmp stores orphaned by killed exports (#563). Each interrupted export
|
|
37
|
+
* strands a full-size tmp store, so on a project where the checkpoint hook is
|
|
38
|
+
* killed regularly these would accumulate unbounded.
|
|
39
|
+
*
|
|
40
|
+
* Only tmps whose owning pid is gone are removed: a live pid means a concurrent
|
|
41
|
+
* export is mid-write, and deleting its tmp would corrupt exactly what this
|
|
42
|
+
* change exists to protect.
|
|
43
|
+
*/
|
|
44
|
+
function sweepStaleTmpFiles(outPath) {
|
|
45
|
+
const dir = dirname(outPath);
|
|
46
|
+
const prefix = `${basename(outPath)}.tmp.`;
|
|
47
|
+
let entries;
|
|
48
|
+
try {
|
|
49
|
+
entries = readdirSync(dir);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
for (const entry of entries) {
|
|
55
|
+
if (!entry.startsWith(prefix))
|
|
56
|
+
continue;
|
|
57
|
+
// `<name>.rvf.tmp.<pid>` and its `<...>.tmp.<pid>.idmap.json` siblings.
|
|
58
|
+
const pid = Number.parseInt(entry.slice(prefix.length).split('.')[0], 10);
|
|
59
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
60
|
+
continue;
|
|
61
|
+
if (pid !== process.pid && isPidAlive(pid))
|
|
62
|
+
continue;
|
|
63
|
+
try {
|
|
64
|
+
unlinkSync(join(dir, entry));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// best-effort
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** True when a process with `pid` exists (signal 0 probes without delivering). */
|
|
72
|
+
function isPidAlive(pid) {
|
|
73
|
+
try {
|
|
74
|
+
process.kill(pid, 0);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
// EPERM means it exists but belongs to another user — still alive.
|
|
79
|
+
return err.code === 'EPERM';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
11
82
|
/** Export brain state to a single `.rvf` file with vector embeddings + kernel. */
|
|
12
83
|
export function exportBrainToRvf(db, options, sourceDbLabel = 'memory.db') {
|
|
13
84
|
if (!isRvfNativeAvailable()) {
|
|
@@ -15,14 +86,20 @@ export function exportBrainToRvf(db, options, sourceDbLabel = 'memory.db') {
|
|
|
15
86
|
}
|
|
16
87
|
const outPath = resolve(options.outputPath);
|
|
17
88
|
const dimension = options.dimension ?? 384;
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
89
|
+
// Issue #563: build the store at a private tmp path and rename it over the
|
|
90
|
+
// final path only once it is closed and complete. The previous code deleted
|
|
91
|
+
// the old store and then built the new one in place, so any interruption
|
|
92
|
+
// (hook timeout, session teardown, SIGKILL) left a created-but-incomplete
|
|
93
|
+
// store that could neither be opened (ManifestNotFound) nor created over
|
|
94
|
+
// (FsyncFailed) — permanently disabling the RVF backend. With tmp+rename an
|
|
95
|
+
// interrupted export leaves the *previous* good store untouched and orphans
|
|
96
|
+
// only an inert tmp file, which the next export sweeps.
|
|
97
|
+
const tmpPath = `${outPath}.tmp.${process.pid}`;
|
|
98
|
+
sweepStaleTmpFiles(outPath);
|
|
99
|
+
removeStoreFiles(tmpPath);
|
|
24
100
|
// Create RVF container via adapter (handles idmap automatically)
|
|
25
|
-
const rvf = createRvfStore(
|
|
101
|
+
const rvf = createRvfStore(tmpPath, dimension);
|
|
102
|
+
let closed = false;
|
|
26
103
|
try {
|
|
27
104
|
// --- Export all tables using TABLE_CONFIGS ---
|
|
28
105
|
const allTableData = {};
|
|
@@ -153,12 +230,37 @@ export function exportBrainToRvf(db, options, sourceDbLabel = 'memory.db') {
|
|
|
153
230
|
catch { /* best-effort */ }
|
|
154
231
|
}
|
|
155
232
|
// Persist manifest as sidecar JSON alongside the .rvf file
|
|
156
|
-
|
|
157
|
-
|
|
233
|
+
writeFileSync(`${tmpPath}.manifest.json`, JSON.stringify(manifest, null, 2), 'utf-8');
|
|
234
|
+
// Close before promoting: close() flushes the store and writes the idmap
|
|
235
|
+
// sidecar, so renaming any earlier would publish an incomplete store.
|
|
236
|
+
rvf.close();
|
|
237
|
+
closed = true;
|
|
238
|
+
// Promote tmp → final. The store itself goes last: until it lands, the
|
|
239
|
+
// previous store (if any) is still the one on disk, and a crash mid-promote
|
|
240
|
+
// leaves the old store readable rather than a half-written new one.
|
|
241
|
+
for (const suffix of [...RVF_STORE_SUFFIXES].reverse()) {
|
|
242
|
+
const from = `${tmpPath}${suffix}`;
|
|
243
|
+
const to = `${outPath}${suffix}`;
|
|
244
|
+
if (existsSync(from)) {
|
|
245
|
+
renameSync(from, to);
|
|
246
|
+
}
|
|
247
|
+
else if (existsSync(to)) {
|
|
248
|
+
// No new sidecar produced — drop the stale one so it can't be read
|
|
249
|
+
// against the new store.
|
|
250
|
+
unlinkSync(to);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
158
253
|
return manifest;
|
|
159
254
|
}
|
|
160
|
-
|
|
161
|
-
|
|
255
|
+
catch (err) {
|
|
256
|
+
if (!closed) {
|
|
257
|
+
try {
|
|
258
|
+
rvf.close();
|
|
259
|
+
}
|
|
260
|
+
catch { /* best-effort */ }
|
|
261
|
+
}
|
|
262
|
+
removeStoreFiles(tmpPath);
|
|
263
|
+
throw err;
|
|
162
264
|
}
|
|
163
265
|
}
|
|
164
266
|
/** Legacy field-to-table mapping for older RVF exports. */
|
|
@@ -87,14 +87,31 @@ export class RvfDualWriter {
|
|
|
87
87
|
nativeAdapter = adapter.openRvfStore(this.config.rvfPath);
|
|
88
88
|
}
|
|
89
89
|
catch {
|
|
90
|
-
|
|
90
|
+
try {
|
|
91
|
+
nativeAdapter = adapter.createRvfStore(this.config.rvfPath, this.config.dimensions);
|
|
92
|
+
}
|
|
93
|
+
catch (createErr) {
|
|
94
|
+
// Issue #563: open failed *and* create failed, so the file on disk is
|
|
95
|
+
// provably unusable — the signature of an export killed mid-write
|
|
96
|
+
// (open → ManifestNotFound, create → FsyncFailed because the path
|
|
97
|
+
// exists). Previously this fell to the catch below and disabled RVF
|
|
98
|
+
// silently for the whole run. Quarantine and rebuild instead.
|
|
99
|
+
const { quarantineUnusableStore } = await import('./rvf-store-integrity.js');
|
|
100
|
+
const quarantined = quarantineUnusableStore(this.config.rvfPath, createErr instanceof Error ? createErr.message : String(createErr));
|
|
101
|
+
if (!quarantined)
|
|
102
|
+
throw createErr; // live peer, or nothing to move
|
|
103
|
+
nativeAdapter = adapter.createRvfStore(this.config.rvfPath, this.config.dimensions);
|
|
104
|
+
}
|
|
91
105
|
}
|
|
92
106
|
this.rvfStore = wrapNativeAdapter(nativeAdapter, this.config.dimensions);
|
|
93
107
|
this.rvfAvailable = true;
|
|
94
108
|
}
|
|
95
|
-
catch {
|
|
96
|
-
// Native adapter
|
|
109
|
+
catch (err) {
|
|
110
|
+
// Native adapter unavailable, or recovery itself failed. Degrade to
|
|
111
|
+
// sqlite-only — but say so, instead of vanishing silently (#563).
|
|
97
112
|
this.rvfAvailable = false;
|
|
113
|
+
console.warn(`[RVF] Dual-writer disabled for ${this.config.rvfPath}; falling back to SQLite: ` +
|
|
114
|
+
`${err instanceof Error ? err.message : String(err)}`);
|
|
98
115
|
}
|
|
99
116
|
}
|
|
100
117
|
/**
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RVF store integrity helpers (issue #563).
|
|
3
|
+
*
|
|
4
|
+
* An export that is killed mid-write leaves a store that was created but never
|
|
5
|
+
* completed. Such a file cannot be opened (`RVF error 0x0106: ManifestNotFound`)
|
|
6
|
+
* and cannot be created over either, because the path already exists
|
|
7
|
+
* (`RVF error 0x0303: FsyncFailed`). Both paths fail forever, so the RVF
|
|
8
|
+
* backend stays disabled for the life of the project until someone deletes the
|
|
9
|
+
* file by hand.
|
|
10
|
+
*
|
|
11
|
+
* Recovery has to be evidence-based rather than fingerprint-based. Measured
|
|
12
|
+
* against @ruvector/rvf-node 0.1.8:
|
|
13
|
+
*
|
|
14
|
+
* • A *valid, empty* store is 162 bytes with magic `SFVR` — byte-for-byte
|
|
15
|
+
* the size the issue reports as "truncated: header only". Size and magic
|
|
16
|
+
* therefore cannot distinguish a broken store from a healthy empty one.
|
|
17
|
+
* • `<store>.lock` is a 104-byte record with magic `FLVR` and the owning pid
|
|
18
|
+
* as a little-endian u32 at offset 4. `FLVR` in a lock is the *normal*
|
|
19
|
+
* case — the issue reads it as "RVF store bytes leaked into the lock", but
|
|
20
|
+
* the store magic is `SFVR`; a 104-byte `FLVR` lock is just a live-or-stale
|
|
21
|
+
* lock record.
|
|
22
|
+
*
|
|
23
|
+
* So the only sound trigger is "open failed *and* create failed": at that point
|
|
24
|
+
* the file is provably unusable. The lock's pid is used as a *guard* — if it is
|
|
25
|
+
* held by a live process, the store is presumed healthy and left alone.
|
|
26
|
+
*/
|
|
27
|
+
/** The pid recorded in `<rvfPath>.lock`, or null if there is no readable lock. */
|
|
28
|
+
export declare function readLockOwnerPid(rvfPath: string): number | null;
|
|
29
|
+
/**
|
|
30
|
+
* True when the store's lock is held by a process that is still running.
|
|
31
|
+
*
|
|
32
|
+
* Deliberately conservative: an unreadable or pid-less lock reports false (the
|
|
33
|
+
* caller's open already failed, so there is nothing to protect), while a live
|
|
34
|
+
* pid reports true and blocks recovery. Pid reuse can only produce a false
|
|
35
|
+
* "alive", which fails safe — we leave the store alone.
|
|
36
|
+
*/
|
|
37
|
+
export declare function isLockHeldByLiveProcess(rvfPath: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Move an unusable store and its sidecars aside so the next create succeeds.
|
|
40
|
+
* Returns the quarantine base path, or null if nothing was quarantined.
|
|
41
|
+
*
|
|
42
|
+
* Only call this once open *and* create have both failed — that is the proof
|
|
43
|
+
* the file is unusable. The store is a derived cache, rebuilt from the unified
|
|
44
|
+
* DB, so quarantining is recoverable; we move rather than delete because the
|
|
45
|
+
* bytes may hold writes that never reached SQLite, and they are the only
|
|
46
|
+
* evidence if this recurs.
|
|
47
|
+
*/
|
|
48
|
+
export declare function quarantineUnusableStore(rvfPath: string, reason: string): string | null;
|
|
49
|
+
//# sourceMappingURL=rvf-store-integrity.d.ts.map
|