agentic-qe 3.9.36 → 3.10.1
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 +147 -0
- package/README.md +35 -8
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-3JS2CN7C.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-L6D36M77.js → agent-booster-wasm-FZLWOPSX.js} +2 -2
- package/dist/cli/chunks/{agent-handler-3JNKP4OI.js → agent-handler-KAGRVCKS.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-QBRBX7O4.js → agent-memory-branch-JJKFEXQW.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-Q4GFNGU6.js +2 -0
- package/dist/cli/chunks/{audit-M4W43TXQ.js → audit-DN5SY4JJ.js} +2 -2
- package/dist/cli/chunks/base-Q3MAL22Y.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-NN6GB2YD.js → better-sqlite3-XGPW4HK5.js} +2 -2
- package/dist/cli/chunks/{brain-handler-WQN7C55Z.js → brain-handler-O7MP5BGY.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-BOTGLI7M.js → branch-enumerator-ZPTN5J6V.js} +2 -2
- package/dist/cli/chunks/{browser-ZFZCR7LP.js → browser-PAZE2JSD.js} +2 -2
- package/dist/cli/chunks/browser-workflow-JX3M2UWG.js +2 -0
- package/dist/cli/chunks/{chunk-DTJHO3WI.js → chunk-25QGPRWN.js} +2 -2
- package/dist/cli/chunks/{chunk-IF4ZZ2HD.js → chunk-2ETDES5W.js} +2 -2
- package/dist/cli/chunks/{chunk-556GYKN5.js → chunk-2KTRRSKD.js} +2 -2
- package/dist/cli/chunks/{chunk-TOZ6WUAB.js → chunk-2S4XHK26.js} +2 -2
- package/dist/cli/chunks/{chunk-O4C3JEOR.js → chunk-2TDWCXZ6.js} +2 -2
- package/dist/cli/chunks/{chunk-YUFUGGXY.js → chunk-2UN4DOBJ.js} +2 -2
- package/dist/cli/chunks/{chunk-CLATNP57.js → chunk-32R7EA7B.js} +3 -3
- package/dist/cli/chunks/{chunk-NYU4YD5V.js → chunk-3YOPJ7DY.js} +2 -2
- package/dist/cli/chunks/{chunk-SCBWRKPE.js → chunk-4AWJ5PE4.js} +1 -1
- package/dist/cli/chunks/{chunk-TCDGJYM2.js → chunk-57NJQV57.js} +1 -1
- package/dist/cli/chunks/{chunk-ZK6GXL5J.js → chunk-5EU2VQK3.js} +2 -2
- package/dist/cli/chunks/{chunk-6M2POFDF.js → chunk-5KFCH7RH.js} +1 -1
- package/dist/cli/chunks/{chunk-CSDGFQKW.js → chunk-5OTYBWRL.js} +2 -2
- package/dist/cli/chunks/{chunk-I7BXATQ6.js → chunk-5ZCVMR5E.js} +2 -2
- package/dist/cli/chunks/{chunk-MEQ4OPSL.js → chunk-622MIAOR.js} +3 -3
- package/dist/cli/chunks/{chunk-YKZ3ZJWT.js → chunk-6A2NIR2E.js} +2 -2
- package/dist/cli/chunks/{chunk-BI54GWTK.js → chunk-6D57DWQ6.js} +2 -2
- package/dist/cli/chunks/{chunk-CK5TGFII.js → chunk-6E7GI2UB.js} +1 -1
- package/dist/cli/chunks/{chunk-6BHUKCLI.js → chunk-6LRCMFLV.js} +2 -2
- package/dist/cli/chunks/{chunk-2AANIKDG.js → chunk-6QFONVEE.js} +2 -2
- package/dist/cli/chunks/{chunk-OO2JHVMS.js → chunk-6VQ5MFJ6.js} +3 -3
- package/dist/cli/chunks/{chunk-Z5A2ENBC.js → chunk-6ZRMQXVL.js} +2 -2
- package/dist/cli/chunks/{chunk-QYUWWTE3.js → chunk-7CKVAYP3.js} +1 -1
- package/dist/cli/chunks/{chunk-TG44VKO3.js → chunk-7MSYTHZM.js} +2 -2
- package/dist/cli/chunks/{chunk-EAMKH35X.js → chunk-7SQD2TTQ.js} +1 -1
- package/dist/cli/chunks/{chunk-GLI5EN6O.js → chunk-AABKTWXC.js} +2 -2
- package/dist/cli/chunks/{chunk-AJ2VFSLX.js → chunk-AUVC3DDB.js} +2 -2
- package/dist/cli/chunks/{chunk-P4VQTIJE.js → chunk-BECU52UY.js} +3 -3
- package/dist/cli/chunks/chunk-BF7MUYWC.js +2 -0
- package/dist/cli/chunks/{chunk-VENEJ3UI.js → chunk-BGBSYF3K.js} +2 -2
- package/dist/cli/chunks/{chunk-W2DF6FNE.js → chunk-BN7ERYXI.js} +1 -1
- package/dist/cli/chunks/{chunk-LPVRFVSC.js → chunk-CKECJH2A.js} +2 -2
- package/dist/cli/chunks/{chunk-FK4B2HIW.js → chunk-COZDJLIL.js} +1 -1
- package/dist/cli/chunks/{chunk-2EWOYVH3.js → chunk-CR4ERDS2.js} +2 -2
- package/dist/cli/chunks/chunk-DMIYWPQQ.js +2 -0
- package/dist/cli/chunks/{chunk-QXM3PRVR.js → chunk-DQIS6J77.js} +2 -2
- package/dist/cli/chunks/{chunk-P7IOH7L4.js → chunk-DVOH75S4.js} +1 -1
- package/dist/cli/chunks/{chunk-DKBBMZWB.js → chunk-EBQ6YKP2.js} +2 -2
- package/dist/cli/chunks/{chunk-SJ3SHZUC.js → chunk-ECPB7IAH.js} +4 -4
- package/dist/cli/chunks/{chunk-QH7K2UPP.js → chunk-EIROAH6N.js} +2 -2
- package/dist/cli/chunks/{chunk-AH3TKDVW.js → chunk-ELUERFGA.js} +2 -2
- package/dist/cli/chunks/{chunk-ZBY4HSHR.js → chunk-ELZ67OHQ.js} +2 -2
- package/dist/cli/chunks/{chunk-HHGZ4LXC.js → chunk-EO4B5GS4.js} +1 -1
- package/dist/cli/chunks/{chunk-5ZTY5JJX.js → chunk-EUJHHXE6.js} +2 -2
- package/dist/cli/chunks/{chunk-MFPVS2KP.js → chunk-F3OVFA6W.js} +9 -9
- package/dist/cli/chunks/{chunk-RDXIRE2I.js → chunk-FJSR2U65.js} +2 -2
- package/dist/cli/chunks/{chunk-TU2PSEDW.js → chunk-G3BQU3Q6.js} +2 -2
- package/dist/cli/chunks/{chunk-BNFW4LMD.js → chunk-G5DTENO3.js} +2 -2
- package/dist/cli/chunks/{chunk-IMP43AXO.js → chunk-GMKGLZJU.js} +2 -2
- package/dist/cli/chunks/{chunk-Y4ERDIPP.js → chunk-GRG3OP34.js} +2 -2
- package/dist/cli/chunks/{chunk-PYCYZYIL.js → chunk-GRYXNWPF.js} +4 -4
- package/dist/cli/chunks/{chunk-GW7HWFWQ.js → chunk-GTGONWGX.js} +1 -1
- package/dist/cli/chunks/{chunk-AH3UC4IV.js → chunk-GTRXZJNX.js} +2 -2
- package/dist/cli/chunks/{chunk-QAGAEAKM.js → chunk-GXJ4BCGC.js} +2 -2
- package/dist/cli/chunks/{chunk-EXBJCDFM.js → chunk-H22MMMYY.js} +2 -2
- package/dist/cli/chunks/{chunk-FZA674BT.js → chunk-H44WD7QX.js} +2 -2
- package/dist/cli/chunks/{chunk-NKBCAW27.js → chunk-HPNEZ7YN.js} +1 -1
- package/dist/cli/chunks/{chunk-EXUT2LCP.js → chunk-HRDGN3OK.js} +1 -1
- package/dist/cli/chunks/{chunk-O5JNHH2D.js → chunk-IHDUWPFY.js} +2 -2
- package/dist/cli/chunks/{chunk-GFMSAL5Y.js → chunk-IITKJCPK.js} +2 -2
- package/dist/cli/chunks/{chunk-AY2LLGZN.js → chunk-IJ4BUSJN.js} +4 -4
- package/dist/cli/chunks/{chunk-NKA3X6VT.js → chunk-IK6AJX3C.js} +1 -1
- package/dist/cli/chunks/{chunk-D5CLABLM.js → chunk-IPRDHKSI.js} +2 -2
- package/dist/cli/chunks/{chunk-BGD65PL4.js → chunk-JLKHPIQF.js} +1 -1
- package/dist/cli/chunks/chunk-K22TPWOJ.js +3 -0
- package/dist/cli/chunks/{chunk-6DACR7QY.js → chunk-K4T3RDCB.js} +2 -2
- package/dist/cli/chunks/{chunk-LUFY3GGI.js → chunk-KCTH5MHE.js} +2 -2
- package/dist/cli/chunks/{chunk-7ZCDG3IM.js → chunk-KEC5FBAW.js} +1 -1
- package/dist/cli/chunks/{chunk-PY4B37U3.js → chunk-KKNBYXYA.js} +1 -1
- package/dist/cli/chunks/{chunk-X6UGFKHW.js → chunk-KRXKU54J.js} +2 -2
- package/dist/cli/chunks/{provider-manager-VPS4W7KG.js → chunk-KZJXVIAW.js} +13 -13
- package/dist/cli/chunks/{chunk-C2JK5O55.js → chunk-LF7URN2X.js} +2 -2
- package/dist/cli/chunks/{chunk-CAGRQR2U.js → chunk-MQYTW2IN.js} +2 -2
- package/dist/cli/chunks/{chunk-KI6RXKP4.js → chunk-MVGVD6LS.js} +2 -2
- package/dist/cli/chunks/{chunk-U6QAKKNB.js → chunk-NDCPEXDN.js} +2 -2
- package/dist/cli/chunks/{chunk-PUZAIRMY.js → chunk-NOCYYXK4.js} +2 -2
- package/dist/cli/chunks/{chunk-L3JJ52N6.js → chunk-NPSBMDVU.js} +2 -2
- package/dist/cli/chunks/{chunk-U7B4WCBY.js → chunk-NQZYUH6S.js} +1 -1
- package/dist/cli/chunks/{chunk-4R3WXD4U.js → chunk-NRLT44YB.js} +1 -1
- package/dist/cli/chunks/{chunk-FSDUNGYM.js → chunk-OC3OJWLB.js} +2 -2
- package/dist/cli/chunks/{chunk-5ECOD4O6.js → chunk-OQP5OFRR.js} +1 -1
- package/dist/cli/chunks/{chunk-7TO7NTLT.js → chunk-OVENSL64.js} +210 -210
- package/dist/cli/chunks/{chunk-5SYH5QMQ.js → chunk-P7T5Y735.js} +2 -2
- package/dist/cli/chunks/{chunk-RCU5L7FF.js → chunk-PLRSKAFZ.js} +2 -2
- package/dist/cli/chunks/{chunk-74DA4P5K.js → chunk-PUXDXIUE.js} +1 -1
- package/dist/cli/chunks/{chunk-A3TOJ4KN.js → chunk-PW6MOFXG.js} +2 -2
- package/dist/cli/chunks/chunk-PXFQSVA2.js +12 -0
- package/dist/cli/chunks/{chunk-5MSZREOD.js → chunk-Q24OJX44.js} +2 -2
- package/dist/cli/chunks/{chunk-XNXFEMWT.js → chunk-Q5VHBI4U.js} +1 -1
- package/dist/cli/chunks/{chunk-HOZNVDFF.js → chunk-QNW335PD.js} +2 -2
- package/dist/cli/chunks/{chunk-ESIE3MT5.js → chunk-RPL6K623.js} +3 -3
- package/dist/cli/chunks/{chunk-JFDNNXIX.js → chunk-RRLQFFCO.js} +4 -4
- package/dist/cli/chunks/{chunk-G6Q66YLG.js → chunk-RWYW573C.js} +3 -3
- package/dist/cli/chunks/{chunk-CJQT3MYN.js → chunk-SLNGJW4G.js} +1 -1
- package/dist/cli/chunks/{chunk-PGRDHDEJ.js → chunk-SQBB2DC6.js} +1 -1
- package/dist/cli/chunks/{chunk-GWLLNJ64.js → chunk-T3UXMPXX.js} +1 -1
- package/dist/cli/chunks/{chunk-MJJAHA2T.js → chunk-TFNLXAK5.js} +1 -1
- package/dist/cli/chunks/{chunk-YE42UTLT.js → chunk-TL5F2S3Z.js} +2 -2
- package/dist/cli/chunks/{chunk-JA7YARLP.js → chunk-TNGGVMPQ.js} +1 -1
- package/dist/cli/chunks/{chunk-YMB4YVFX.js → chunk-TNVYKYTO.js} +3 -3
- package/dist/cli/chunks/{chunk-FYJE4QLL.js → chunk-TP77PNN6.js} +2 -2
- package/dist/cli/chunks/{chunk-2KMCRASK.js → chunk-TX7SNQKL.js} +1 -1
- package/dist/cli/chunks/{chunk-TK7TGVVQ.js → chunk-UDFLR7GR.js} +1 -1
- package/dist/cli/chunks/{chunk-G7YDYXQH.js → chunk-UDVX34ZG.js} +2 -2
- package/dist/cli/chunks/{chunk-5RPHV7Y3.js → chunk-UU2Q6XWF.js} +1 -1
- package/dist/cli/chunks/{chunk-27FNROZ2.js → chunk-VKRMVTWU.js} +49 -49
- package/dist/cli/chunks/{chunk-AWC7G2D3.js → chunk-VOIWDPIU.js} +2 -2
- package/dist/cli/chunks/chunk-VPCE5CIT.js +2 -0
- package/dist/cli/chunks/{chunk-6M44C43I.js → chunk-W2DT3CDE.js} +2 -2
- package/dist/cli/chunks/{chunk-GAC4MD6S.js → chunk-W6ZF2CPN.js} +1 -1
- package/dist/cli/chunks/{chunk-5OAAJUGO.js → chunk-WDTCCPK4.js} +1 -1
- package/dist/cli/chunks/{chunk-NMHULQAV.js → chunk-WL2J6ECN.js} +2 -2
- package/dist/cli/chunks/chunk-WMG5F6R6.js +2 -0
- package/dist/cli/chunks/{chunk-MAHLTWGV.js → chunk-WO7KYT3X.js} +2 -2
- package/dist/cli/chunks/{chunk-5M63H6RY.js → chunk-WPNZSL4S.js} +1 -1
- package/dist/cli/chunks/{chunk-X6IEQVSF.js → chunk-WQEZKAUR.js} +2 -2
- package/dist/cli/chunks/{chunk-BUVY7IGM.js → chunk-WS4XVJHI.js} +1 -1
- package/dist/cli/chunks/{chunk-66636UWH.js → chunk-XGUQYVJR.js} +2 -2
- package/dist/cli/chunks/{chunk-3CIQ6CQ4.js → chunk-XKOKMS5A.js} +2 -2
- package/dist/cli/chunks/{chunk-TXSVZYFA.js → chunk-XRK7FBTY.js} +2 -2
- package/dist/cli/chunks/{chunk-QMUTKI34.js → chunk-Y2DPXMOR.js} +1 -1
- package/dist/cli/chunks/{chunk-F57OUXHJ.js → chunk-Y357YFLF.js} +2 -2
- package/dist/cli/chunks/{chunk-EDG4NEET.js → chunk-YGRTMAWB.js} +1 -1
- package/dist/cli/chunks/{chunk-LIE24NRL.js → chunk-YPOTBXPU.js} +2 -2
- package/dist/cli/chunks/{chunk-F5IVWV2P.js → chunk-YYWIA5FX.js} +1 -1
- package/dist/cli/chunks/{chunk-OLBYILKU.js → chunk-ZEMXMDD3.js} +2 -2
- package/dist/cli/chunks/{chunk-DCXFHBHS.js → chunk-ZTMWJQTZ.js} +2 -2
- package/dist/cli/chunks/{ci-YA6SQ3PU.js → ci-EHRUN7O6.js} +2 -2
- package/dist/cli/chunks/{ci-output-KKHXCQI4.js → ci-output-EXDXVXKB.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-RTBCXGKA.js → circuit-breaker-LM4QRAAL.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-CRV3Y6LO.js → claude-flow-setup-ZHUCZVW7.js} +2 -2
- package/dist/cli/chunks/client-PA3UJIHH.js +2 -0
- package/dist/cli/chunks/{cline-installer-IS2VLXQS.js → cline-installer-WMFLQOW2.js} +2 -2
- package/dist/cli/chunks/{code-3CSNTK5O.js → code-L7KRLU5E.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-P2YXEJGV.js → code-index-extractor-FTMUYQC6.js} +2 -2
- package/dist/cli/chunks/{codex-installer-QGDV2CAQ.js → codex-installer-B3F6WI3Z.js} +2 -2
- package/dist/cli/chunks/{completions-TYECEYHY.js → completions-3JZQRNB6.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-GA5KSFF2.js → complexity-analyzer-LB2FFEKX.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-NW5Y4ZMI.js → continuedev-installer-WH6IMV7R.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-E5BIBYG6.js → copilot-installer-NOIEOFJM.js} +2 -2
- package/dist/cli/chunks/{cost-tracker-JLSEY4ID.js → cost-tracker-IKX2VYSA.js} +2 -2
- package/dist/cli/chunks/{coverage-4TH275AN.js → coverage-TD37CYSY.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-BVJRP2ZX.js +2 -0
- package/dist/cli/chunks/{cursor-installer-4SXSE5YT.js → cursor-installer-4NSVGRM5.js} +2 -2
- package/dist/cli/chunks/{daemon-7T4RZQH6.js → daemon-LYDV7NRW.js} +3 -3
- package/dist/cli/chunks/{daemon-U6MP4P6S.js → daemon-UWEBUIDT.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-DT2V46XR.js → dag-attention-scheduler-NECJGCHC.js} +2 -2
- package/dist/cli/chunks/{detect-WHSTB4QT.js → detect-4XGC7ILO.js} +2 -2
- package/dist/cli/chunks/{dist-node-4LC2RJXW.js → dist-node-GGJDXRKJ.js} +2 -2
- package/dist/cli/chunks/{domain-handler-A2LOOU7Y.js → domain-handler-UOFONAUT.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-4RJTMB3Y.js → domain-transfer-6JLNOYPA.js} +2 -2
- package/dist/cli/chunks/dream-BXZUEIW2.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-PR3KTT24.js → embed-and-insert-pattern-ZM75DQ4J.js} +2 -2
- package/dist/cli/chunks/{eval-2HRBMOOB.js → eval-CYZJTHEB.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-X46IYOSD.js → experience-capture-middleware-RBOJLDUB.js} +3 -3
- package/dist/cli/chunks/{fast-paths-LYYYU362.js → fast-paths-S5BWZR3L.js} +2 -2
- package/dist/cli/chunks/{feature-flags-RNAMQPUN.js → feature-flags-6E7H3NYP.js} +2 -2
- package/dist/cli/chunks/{feature-flags-TKDXIHOH.js → feature-flags-DUNQPDU3.js} +2 -2
- package/dist/cli/chunks/{file-discovery-MKGGMDIW.js → file-discovery-PFFKDGYG.js} +2 -2
- package/dist/cli/chunks/{fleet-OY4IBCZG.js → fleet-RCDZZFXN.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-G5OGHVAQ.js → gnn-wrapper-5AG3WDWF.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-N7IUATSD.js → heartbeat-handler-O2KAEX4Y.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-LEKAWFJF.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-2TCEG5M2.js +2 -0
- package/dist/cli/chunks/hnsw-index-VDPUTEES.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-TMCMZDVF.js → hnsw-legacy-bridge-C7FG6YGW.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-SPABZYYQ.js → hnswlib-node-YX6OOBN6.js} +2 -2
- package/dist/cli/chunks/{hooks-5QDXEZ25.js → hooks-FUHNE2P7.js} +10 -10
- package/dist/cli/chunks/hybrid-router-2EMDIYIG.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-QQYKS2F3.js → hypergraph-engine-LQRYBNPV.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-YXFNXMRF.js → hypergraph-handler-AFFNLZVD.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-HFD6CPWC.js +2 -0
- package/dist/cli/chunks/{init-handler-SFFSDGEF.js → init-handler-BQ6IDBX4.js} +6 -6
- package/dist/cli/chunks/init-wizard-552QIVRC.js +2 -0
- package/dist/cli/chunks/kernel-5DN6O6EE.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-QFRYXQYY.js → kilocode-installer-KS72HUSG.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-7L2EYEOR.js → kiro-installer-2ZEFLGRX.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-76Y77MB6.js +2 -0
- package/dist/cli/chunks/{learning-7TVVL5UH.js → learning-GGHGJ6B6.js} +3 -3
- package/dist/cli/chunks/llm-router-LP6K5BJF.js +36 -0
- package/dist/cli/chunks/llm-router-service-4O6GCEFH.js +2 -0
- package/dist/cli/chunks/{load-Y46RO7BF.js → load-2MLKXOT2.js} +2 -2
- package/dist/cli/chunks/load-test-FCI2IWRJ.js +2 -0
- package/dist/cli/chunks/{mcp-PYNP2S5O.js → mcp-CDJBJG5H.js} +2 -2
- package/dist/cli/chunks/{memory-DAVXW5OP.js → memory-4LAX7JZS.js} +5 -5
- package/dist/cli/chunks/memory-backend-MKNCBNDE.js +2 -0
- package/dist/cli/chunks/memory-handlers-OBAFR4WV.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-7ECJRCM3.js → multi-model-executor-SLJV73HE.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-H7QOONUC.js → opencode-installer-M76SONWV.js} +2 -2
- package/dist/cli/chunks/{orchestrator-TSJ2F3MG.js → orchestrator-TJPUDJMP.js} +5 -5
- package/dist/cli/chunks/{pipeline-SXR4MRY7.js → pipeline-2PVNFT6J.js} +2 -2
- package/dist/cli/chunks/{platform-7NOS56VD.js → platform-KCSEDKEE.js} +2 -2
- package/dist/cli/chunks/{plugin-VLSWBGJN.js → plugin-QX47QF5U.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-7ZHSOP7H.js → prime-radiant-advanced-wasm-L6VWL7VR.js} +2 -2
- package/dist/cli/chunks/protocol-executor-IA7WNT23.js +2 -0
- package/dist/cli/chunks/{protocol-handler-LWNYDM4D.js → protocol-handler-WDNJDEUE.js} +2 -2
- package/dist/cli/chunks/{prove-JYFW3OBB.js → prove-3B75DA3S.js} +2 -2
- package/dist/cli/chunks/provider-manager-3K5KB5A6.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-V5Z3BBYY.js +2 -0
- package/dist/cli/chunks/{quality-FCAOFXZ2.js → quality-UGASS5WM.js} +2 -2
- package/dist/cli/chunks/queen-coordinator-QOMPA27Z.js +2 -0
- package/dist/cli/chunks/real-embeddings-COBP2LHS.js +2 -0
- package/dist/cli/chunks/{roocode-installer-ZVGJSAWD.js → roocode-installer-TOZ4VLFT.js} +2 -2
- package/dist/cli/chunks/router-P5RZUPC4.js +2 -0
- package/dist/cli/chunks/routing-feedback-3PS3OZQC.js +2 -0
- package/dist/cli/chunks/{routing-handler-AGDHK3A2.js → routing-handler-5TDVSILX.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-UGZINDCN.js → ruvector-commands-AM63KWQN.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-PW7H6G4V.js → rvf-dual-writer-UANIFE2M.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-ZKOTVCHJ.js → rvf-migration-adapter-LNPYWAPI.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-SCBEMOP3.js → rvf-migration-coordinator-U47L63DQ.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-TT7OJPKM.js +2 -0
- package/dist/cli/chunks/safe-db-PEW7VBAE.js +2 -0
- package/dist/cli/chunks/schedule-QHOTHBQE.js +2 -0
- package/dist/cli/chunks/scheduler-KXJBYTRT.js +2 -0
- package/dist/cli/chunks/{security-H7QX46VA.js → security-KDQ2AH7G.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-LWYHWJIA.js → shared-rvf-adapter-5MAGLLYJ.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-P2U424FB.js → shared-rvf-dual-writer-GF2OPPM5.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-TPXJK34J.js +2 -0
- package/dist/cli/chunks/{status-handler-UNX3RA3S.js → status-handler-XZKEL7LO.js} +2 -2
- package/dist/cli/chunks/{structural-health-65YV3M5E.js → structural-health-27QKWW25.js} +2 -2
- package/dist/cli/chunks/{sync-OZ7CHYYO.js → sync-INNKS6UK.js} +2 -2
- package/dist/cli/chunks/{sync-B4O3NDJ6.js → sync-V3HGPEJT.js} +2 -2
- package/dist/cli/chunks/{task-handler-NIG3USPG.js → task-handler-LDUVOM6G.js} +2 -2
- package/dist/cli/chunks/{task-handlers-Z2PI7BTO.js → task-handlers-HTCPV7OO.js} +3 -3
- package/dist/cli/chunks/{test-MNLYS3WS.js → test-PCUVGVJL.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-VCL6D6T7.js → test-scheduling-GYVXWCAA.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-DGMEU3W4.js → token-bootstrap-MJ2ANC4P.js} +2 -2
- package/dist/cli/chunks/{token-usage-IXTYAV5K.js → token-usage-ZREHROTF.js} +2 -2
- package/dist/cli/chunks/{transformers-5CWLXT2M.js → transformers-6B3FWFYL.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-W3FKJLJG.js → tree-sitter-wasm-parser-JVV234MN.js} +2 -2
- package/dist/cli/chunks/{types-NVOCAZCQ.js → types-MVZTJI2F.js} +2 -2
- package/dist/cli/chunks/unified-memory-ROS2NKR5.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-FLEUF3XO.js +2 -0
- package/dist/cli/chunks/unified-persistence-QC5L7UNQ.js +2 -0
- package/dist/cli/chunks/{upgrade-VJYD4U4X.js → upgrade-MKTFEILD.js} +2 -2
- package/dist/cli/chunks/{validate-CAKTCZ3T.js → validate-IABGALSW.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-H24JHUTN.js → validate-swarm-RHF53RF6.js} +2 -2
- package/dist/cli/chunks/{vibium-247XN6V3.js → vibium-RAKW6FMF.js} +2 -2
- package/dist/cli/chunks/visual-security-NLIOUQCR.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-3DOMHLRH.js → web-tree-sitter-PYK7F4JZ.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-S2MOA5TQ.js → windsurf-installer-S3U2HWZ4.js} +2 -2
- package/dist/cli/chunks/{witness-chain-CKLVPFLG.js → witness-chain-435NKQLB.js} +2 -2
- package/dist/cli/chunks/witness-chain-U7X6JX5J.js +2 -0
- package/dist/cli/chunks/{workflow-GU3IV2OD.js → workflow-5UHJCZ6J.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-APE6BAXH.js +2 -0
- package/dist/cli/chunks/{wrappers-74Y4EKW3.js → wrappers-RD3NCMLK.js} +2 -2
- package/dist/cli/commands/llm-router.js +83 -26
- package/dist/domains/chaos-resilience/coordinator.d.ts +2 -1
- package/dist/domains/chaos-resilience/coordinator.js +3 -2
- package/dist/domains/chaos-resilience/plugin.d.ts +4 -2
- package/dist/domains/chaos-resilience/plugin.js +8 -5
- package/dist/domains/code-intelligence/coordinator.d.ts +2 -1
- package/dist/domains/code-intelligence/coordinator.js +3 -2
- package/dist/domains/code-intelligence/plugin.d.ts +4 -2
- package/dist/domains/code-intelligence/plugin.js +8 -5
- package/dist/domains/contract-testing/coordinator.d.ts +2 -1
- package/dist/domains/contract-testing/coordinator.js +3 -2
- package/dist/domains/contract-testing/plugin.d.ts +4 -2
- package/dist/domains/contract-testing/plugin.js +8 -5
- package/dist/domains/coverage-analysis/coordinator.d.ts +2 -1
- package/dist/domains/coverage-analysis/coordinator.js +4 -3
- package/dist/domains/coverage-analysis/plugin.d.ts +3 -2
- package/dist/domains/coverage-analysis/plugin.js +4 -4
- package/dist/domains/defect-intelligence/coordinator.d.ts +2 -1
- package/dist/domains/defect-intelligence/coordinator.js +4 -3
- package/dist/domains/defect-intelligence/plugin.d.ts +4 -2
- package/dist/domains/defect-intelligence/plugin.js +9 -6
- package/dist/domains/learning-optimization/coordinator.d.ts +2 -1
- package/dist/domains/learning-optimization/coordinator.js +3 -2
- package/dist/domains/learning-optimization/plugin.d.ts +4 -2
- package/dist/domains/learning-optimization/plugin.js +8 -5
- package/dist/domains/quality-assessment/coordinator.d.ts +2 -1
- package/dist/domains/quality-assessment/coordinator.js +4 -3
- package/dist/domains/quality-assessment/plugin.d.ts +4 -2
- package/dist/domains/quality-assessment/plugin.js +10 -6
- package/dist/domains/requirements-validation/coordinator.d.ts +2 -1
- package/dist/domains/requirements-validation/coordinator.js +3 -2
- package/dist/domains/requirements-validation/plugin.d.ts +4 -2
- package/dist/domains/requirements-validation/plugin.js +8 -5
- package/dist/domains/security-compliance/coordinator.d.ts +2 -1
- package/dist/domains/security-compliance/coordinator.js +4 -2
- package/dist/domains/security-compliance/plugin.d.ts +4 -2
- package/dist/domains/security-compliance/plugin.js +11 -6
- package/dist/domains/test-execution/coordinator.d.ts +3 -2
- package/dist/domains/test-execution/coordinator.js +6 -5
- package/dist/domains/test-execution/plugin.d.ts +4 -2
- package/dist/domains/test-execution/plugin.js +6 -4
- package/dist/domains/test-generation/coordinator.d.ts +2 -1
- package/dist/domains/test-generation/coordinator.js +4 -3
- package/dist/domains/test-generation/plugin.d.ts +4 -2
- package/dist/domains/test-generation/plugin.js +12 -7
- package/dist/domains/visual-accessibility/coordinator.d.ts +2 -1
- package/dist/domains/visual-accessibility/coordinator.js +4 -3
- package/dist/domains/visual-accessibility/plugin.d.ts +4 -2
- package/dist/domains/visual-accessibility/plugin.js +9 -6
- package/dist/kernel/interfaces.d.ts +37 -0
- package/dist/kernel/kernel.d.ts +39 -0
- package/dist/kernel/kernel.js +157 -17
- package/dist/learning/embedder-endpoint-client.d.ts +133 -0
- package/dist/learning/embedder-endpoint-client.js +426 -0
- package/dist/learning/embedder-identity-store.d.ts +30 -0
- package/dist/learning/embedder-identity-store.js +136 -0
- package/dist/learning/qe-reasoning-bank.js +11 -3
- package/dist/learning/real-embeddings.d.ts +28 -0
- package/dist/learning/real-embeddings.js +130 -19
- package/dist/learning/sqlite-persistence.js +16 -3
- package/dist/mcp/bundle.js +455 -423
- package/dist/mcp/qe-tool-bridge.js +8 -1
- package/dist/mcp/tools/base.d.ts +56 -0
- package/dist/mcp/tools/base.js +104 -1
- package/dist/mcp/tools/chaos-resilience/inject.js +4 -2
- package/dist/mcp/tools/code-intelligence/analyze.js +5 -3
- package/dist/mcp/tools/contract-testing/validate.js +4 -2
- package/dist/mcp/tools/coverage-analysis/index.js +11 -5
- package/dist/mcp/tools/defect-intelligence/predict.js +5 -10
- package/dist/mcp/tools/learning-optimization/optimize.js +4 -2
- package/dist/mcp/tools/registry.js +8 -1
- package/dist/mcp/tools/test-generation/generate.js +10 -6
- package/dist/mcp/tools/visual-accessibility/index.js +7 -4
- package/dist/shared/llm/llm-router-service.d.ts +77 -0
- package/dist/shared/llm/llm-router-service.js +166 -0
- package/dist/shared/llm/providers/gemini.js +5 -2
- package/dist/shared/llm/router/config-store.d.ts +89 -0
- package/dist/shared/llm/router/config-store.js +261 -0
- package/dist/shared/llm/router/hybrid-router.js +33 -11
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-MISKG4JY.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-NDLBNM6C.js +0 -2
- package/dist/cli/chunks/base-OMDJAHGF.js +0 -2
- package/dist/cli/chunks/browser-workflow-XUG5Z5CJ.js +0 -2
- package/dist/cli/chunks/chunk-JD3VV2BD.js +0 -2
- package/dist/cli/chunks/chunk-USLHYNYG.js +0 -2
- package/dist/cli/chunks/chunk-ZYPSXPQ5.js +0 -2
- package/dist/cli/chunks/client-VXJRAW3W.js +0 -2
- package/dist/cli/chunks/cross-domain-router-AKHC7TFO.js +0 -2
- package/dist/cli/chunks/dream-FPWIC7KF.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-WHGMTRT7.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-IA2M5KDH.js +0 -2
- package/dist/cli/chunks/hnsw-index-UBXTXXLQ.js +0 -2
- package/dist/cli/chunks/hybrid-router-IY62NN7G.js +0 -2
- package/dist/cli/chunks/impact-analyzer-6PVCOS33.js +0 -2
- package/dist/cli/chunks/init-wizard-XHP5C6RD.js +0 -2
- package/dist/cli/chunks/kernel-YM5PY5SS.js +0 -2
- package/dist/cli/chunks/knowledge-graph-LTUOUHO7.js +0 -2
- package/dist/cli/chunks/llm-router-S3HHVPH4.js +0 -36
- package/dist/cli/chunks/load-test-CYCAQI3F.js +0 -2
- package/dist/cli/chunks/memory-backend-RW2OPAJU.js +0 -2
- package/dist/cli/chunks/memory-handlers-6COHVON7.js +0 -2
- package/dist/cli/chunks/protocol-executor-CREUYOBZ.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-J4DLHRJY.js +0 -2
- package/dist/cli/chunks/queen-coordinator-MGLNSTPY.js +0 -2
- package/dist/cli/chunks/real-embeddings-LE6YXNPZ.js +0 -2
- package/dist/cli/chunks/router-CXGPFUT2.js +0 -2
- package/dist/cli/chunks/routing-feedback-MZ73LFBP.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-T6JBPHTE.js +0 -2
- package/dist/cli/chunks/safe-db-DS4SKPYB.js +0 -2
- package/dist/cli/chunks/schedule-H2Q7XWAK.js +0 -2
- package/dist/cli/chunks/scheduler-PMZMKQIF.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-ONKEAMTQ.js +0 -2
- package/dist/cli/chunks/unified-memory-PNHI6I3R.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-CDV3UMBD.js +0 -2
- package/dist/cli/chunks/unified-persistence-FMCHCEZV.js +0 -2
- package/dist/cli/chunks/visual-security-3WRJQDUY.js +0 -2
- package/dist/cli/chunks/witness-chain-5ZKCKNRJ.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-OBSFY7YK.js +0 -2
package/dist/kernel/kernel.js
CHANGED
|
@@ -21,6 +21,7 @@ import { PluginCache } from '../plugins/cache';
|
|
|
21
21
|
import { CapturedExperienceBridge } from '../bridge/captured-experience-bridge.js';
|
|
22
22
|
import { DreamScheduler } from '../learning/dream/dream-scheduler.js';
|
|
23
23
|
import { createDreamEngine } from '../learning/dream/dream-engine.js';
|
|
24
|
+
import { createLLMRouterService, } from '../shared/llm/llm-router-service.js';
|
|
24
25
|
// Import domain plugin factories
|
|
25
26
|
import { createTestGenerationPlugin } from '../domains/test-generation/plugin';
|
|
26
27
|
import { createTestExecutionPlugin } from '../domains/test-execution/plugin';
|
|
@@ -44,21 +45,25 @@ import '../domains/security-compliance';
|
|
|
44
45
|
import '../domains/code-intelligence';
|
|
45
46
|
import '../domains/quality-assessment';
|
|
46
47
|
import { createEnterpriseIntegrationPlugin } from '../domains/enterprise-integration/plugin';
|
|
48
|
+
// NOTE: underlying createXxxPlugin signatures are updated in Phase 2.
|
|
49
|
+
// For Phase 1, the wrappers accept llmRouter but discard it — this
|
|
50
|
+
// keeps the kernel boot path internally consistent without forcing
|
|
51
|
+
// 13 simultaneous domain-level changes.
|
|
47
52
|
const DOMAIN_FACTORIES = {
|
|
48
|
-
'test-generation': (eb, m, c) => createTestGenerationPlugin(eb, m, c),
|
|
49
|
-
'test-execution': (eb, m) => createTestExecutionPlugin(eb, m),
|
|
50
|
-
'coverage-analysis': (eb, m) => createCoverageAnalysisPlugin(eb, m),
|
|
51
|
-
'quality-assessment': (eb, m, c) => createQualityAssessmentPlugin(eb, m, c),
|
|
52
|
-
'defect-intelligence': (eb, m, c) => createDefectIntelligencePlugin(eb, m, c),
|
|
53
|
-
'requirements-validation': (eb, m, c) => createRequirementsValidationPlugin(eb, m, c),
|
|
54
|
-
'code-intelligence': (eb, m, c) => createCodeIntelligencePlugin(eb, m, c),
|
|
55
|
-
'security-compliance': (eb, m, c) => createSecurityCompliancePlugin(eb, m, c),
|
|
56
|
-
'contract-testing': (eb, m, c) => createContractTestingPlugin(eb, m, c),
|
|
57
|
-
'visual-accessibility': (eb, m, c) => createVisualAccessibilityPlugin(eb, m, c),
|
|
58
|
-
'chaos-resilience': (eb, m, c) => createChaosResiliencePlugin(eb, m, c),
|
|
59
|
-
'learning-optimization': (eb, m, c) => createLearningOptimizationPlugin(eb, m, c),
|
|
60
|
-
'enterprise-integration': (eb, m, c) => createEnterpriseIntegrationPlugin(eb, m, c),
|
|
61
|
-
'coordination': (eb, m, c) => createCoordinationPlugin(eb, m, c),
|
|
53
|
+
'test-generation': (eb, m, c, llmRouter) => createTestGenerationPlugin(eb, m, c, undefined, llmRouter),
|
|
54
|
+
'test-execution': (eb, m, _c, llmRouter) => createTestExecutionPlugin(eb, m, llmRouter),
|
|
55
|
+
'coverage-analysis': (eb, m, _c, llmRouter) => createCoverageAnalysisPlugin(eb, m, llmRouter),
|
|
56
|
+
'quality-assessment': (eb, m, c, llmRouter) => createQualityAssessmentPlugin(eb, m, c, undefined, llmRouter),
|
|
57
|
+
'defect-intelligence': (eb, m, c, llmRouter) => createDefectIntelligencePlugin(eb, m, c, undefined, llmRouter),
|
|
58
|
+
'requirements-validation': (eb, m, c, llmRouter) => createRequirementsValidationPlugin(eb, m, c, undefined, llmRouter),
|
|
59
|
+
'code-intelligence': (eb, m, c, llmRouter) => createCodeIntelligencePlugin(eb, m, c, undefined, llmRouter),
|
|
60
|
+
'security-compliance': (eb, m, c, llmRouter) => createSecurityCompliancePlugin(eb, m, c, undefined, llmRouter),
|
|
61
|
+
'contract-testing': (eb, m, c, llmRouter) => createContractTestingPlugin(eb, m, c, undefined, llmRouter),
|
|
62
|
+
'visual-accessibility': (eb, m, c, llmRouter) => createVisualAccessibilityPlugin(eb, m, c, undefined, llmRouter),
|
|
63
|
+
'chaos-resilience': (eb, m, c, llmRouter) => createChaosResiliencePlugin(eb, m, c, undefined, llmRouter),
|
|
64
|
+
'learning-optimization': (eb, m, c, llmRouter) => createLearningOptimizationPlugin(eb, m, c, undefined, llmRouter),
|
|
65
|
+
'enterprise-integration': (eb, m, c, _llmRouter) => createEnterpriseIntegrationPlugin(eb, m, c),
|
|
66
|
+
'coordination': (eb, m, c, _llmRouter) => createCoordinationPlugin(eb, m, c),
|
|
62
67
|
};
|
|
63
68
|
const DEFAULT_CONFIG = {
|
|
64
69
|
maxConcurrentAgents: AGENT_CONSTANTS.MAX_CONCURRENT_AGENTS,
|
|
@@ -93,6 +98,10 @@ export class QEKernelImpl {
|
|
|
93
98
|
// checkAndTriggerDream path so 10-second SQLite write transactions move
|
|
94
99
|
// out of short-lived hook subprocesses into the long-lived kernel.
|
|
95
100
|
_dreamScheduler;
|
|
101
|
+
// ADR-043: kernel singleton HybridRouter. Built during initialize() iff
|
|
102
|
+
// a provider key is in env or the project explicitly enables one.
|
|
103
|
+
_llmRouter;
|
|
104
|
+
_llmRouterBuild;
|
|
96
105
|
constructor(config = {}) {
|
|
97
106
|
this._config = { ...DEFAULT_CONFIG, ...config };
|
|
98
107
|
this._startTime = new Date();
|
|
@@ -118,6 +127,15 @@ export class QEKernelImpl {
|
|
|
118
127
|
get memory() {
|
|
119
128
|
return this._memory;
|
|
120
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* ADR-043: Get the LLM router built during initialize(). Returns
|
|
132
|
+
* undefined when llmRouter.enabled is false or no provider was
|
|
133
|
+
* available. Domain plugins receive this as their factory's 4th arg
|
|
134
|
+
* via DOMAIN_FACTORIES.
|
|
135
|
+
*/
|
|
136
|
+
get llmRouter() {
|
|
137
|
+
return this._llmRouter;
|
|
138
|
+
}
|
|
121
139
|
async initialize() {
|
|
122
140
|
if (this._initialized) {
|
|
123
141
|
return;
|
|
@@ -156,14 +174,20 @@ export class QEKernelImpl {
|
|
|
156
174
|
// Re-create plugins with the real memory backend
|
|
157
175
|
this._plugins = new DefaultPluginLoader(this._eventBus, this._memory, this._config.lazyLoading);
|
|
158
176
|
}
|
|
177
|
+
// ADR-043: Build the kernel-singleton LLM router before plugin
|
|
178
|
+
// factories are registered, so the closure on the next loop can
|
|
179
|
+
// capture it. Builds iff configured/auto-detected; null otherwise.
|
|
180
|
+
await this._initializeLLMRouter(projectRoot);
|
|
159
181
|
// Register domain factories for enabled domains
|
|
160
182
|
for (const domain of this._config.enabledDomains) {
|
|
161
183
|
const factory = DOMAIN_FACTORIES[domain];
|
|
162
184
|
if (factory) {
|
|
163
185
|
// Wrap factory to match PluginLoader signature (async)
|
|
164
186
|
this._plugins.registerFactory(domain, async (eventBus, memory) => {
|
|
165
|
-
// Create plugin synchronously, return as Promise
|
|
166
|
-
|
|
187
|
+
// Create plugin synchronously, return as Promise.
|
|
188
|
+
// ADR-043: pass the kernel singleton llmRouter as 4th arg —
|
|
189
|
+
// domain factories forward it to coordinators/services.
|
|
190
|
+
return Promise.resolve(factory(eventBus, memory, this._coordinator, this._llmRouter));
|
|
167
191
|
});
|
|
168
192
|
}
|
|
169
193
|
}
|
|
@@ -199,7 +223,9 @@ export class QEKernelImpl {
|
|
|
199
223
|
if (typeof createPlugin !== 'function') {
|
|
200
224
|
throw new Error(`Plugin "${manifest.name}" entry point must export a default function or "createPlugin" function`);
|
|
201
225
|
}
|
|
202
|
-
|
|
226
|
+
// ADR-043: forward llmRouter so external plugins can
|
|
227
|
+
// opt into LLM enhancement on the same terms as built-ins.
|
|
228
|
+
return createPlugin(eventBus, memory, this._coordinator, this._llmRouter);
|
|
203
229
|
});
|
|
204
230
|
}
|
|
205
231
|
}
|
|
@@ -310,6 +336,106 @@ export class QEKernelImpl {
|
|
|
310
336
|
}
|
|
311
337
|
this._initialized = true;
|
|
312
338
|
}
|
|
339
|
+
/**
|
|
340
|
+
* ADR-043: Build the kernel-singleton HybridRouter.
|
|
341
|
+
*
|
|
342
|
+
* Behavior is gated, in order:
|
|
343
|
+
* 1. AQE_LLM_ROUTER_DISABLED env var (kill-switch): if set to a truthy
|
|
344
|
+
* value, ALWAYS skip — even when config.llmRouter.enabled === true.
|
|
345
|
+
* This is the env-only opt-out for users who upgrade with a
|
|
346
|
+
* provider key already in env and don't want billing surprises.
|
|
347
|
+
* 2. config.llmRouter.enabled:
|
|
348
|
+
* 'auto' (default): build iff at least one provider key is in env,
|
|
349
|
+
* or the project's llm-config.json enables a provider
|
|
350
|
+
* true: attempt to build; emit error event if no provider
|
|
351
|
+
* false: skip entirely (sets _llmRouter to undefined)
|
|
352
|
+
*
|
|
353
|
+
* On any error we publish a structured kernel.llm-router.init-failed
|
|
354
|
+
* event so monitoring catches misconfiguration. We also keep the
|
|
355
|
+
* console.warn for direct visibility in dev. The kernel still boots —
|
|
356
|
+
* a kernel that boots without LLMs is strictly better than a kernel
|
|
357
|
+
* that won't boot — but the failure is now observable.
|
|
358
|
+
*/
|
|
359
|
+
async _initializeLLMRouter(projectRoot) {
|
|
360
|
+
// (1) Hard env kill-switch. Truthy values disable; falsy/empty pass.
|
|
361
|
+
// Same parse rule as src/mcp/tools/base.ts:isRouterKillSwitchSet
|
|
362
|
+
// so both code paths agree on what "disabled" means.
|
|
363
|
+
const killSwitch = (process.env.AQE_LLM_ROUTER_DISABLED ?? '').trim().toLowerCase();
|
|
364
|
+
if (killSwitch &&
|
|
365
|
+
killSwitch !== 'false' &&
|
|
366
|
+
killSwitch !== '0' &&
|
|
367
|
+
killSwitch !== 'no' &&
|
|
368
|
+
killSwitch !== 'off') {
|
|
369
|
+
this._llmRouter = undefined;
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
const llmCfg = this._config.llmRouter ?? {};
|
|
373
|
+
const enabled = llmCfg.enabled ?? 'auto';
|
|
374
|
+
if (enabled === false) {
|
|
375
|
+
this._llmRouter = undefined;
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
try {
|
|
379
|
+
const built = await createLLMRouterService({
|
|
380
|
+
projectRoot,
|
|
381
|
+
override: llmCfg.configOverride,
|
|
382
|
+
providerManager: llmCfg.providerManager,
|
|
383
|
+
});
|
|
384
|
+
if (!built) {
|
|
385
|
+
if (enabled === true) {
|
|
386
|
+
console.warn('[QEKernel] llmRouter.enabled=true but no provider available — ' +
|
|
387
|
+
'continuing without LLM router (domain services will skip LLM enhancement)');
|
|
388
|
+
await this._publishLLMRouterEvent('init-no-provider', {
|
|
389
|
+
reason: 'no provider available in env or disk config',
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
this._llmRouter = undefined;
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
this._llmRouterBuild = built;
|
|
396
|
+
this._llmRouter = built.router;
|
|
397
|
+
// Phase 5 wiring: register as shared singleton so MCP standalone
|
|
398
|
+
// tools see the same router instance (one cost tracker, one cache,
|
|
399
|
+
// one metric collector, one circuit breaker per provider).
|
|
400
|
+
try {
|
|
401
|
+
const { setSharedLLMRouter } = await import('../mcp/tools/base.js');
|
|
402
|
+
setSharedLLMRouter(built.router);
|
|
403
|
+
}
|
|
404
|
+
catch {
|
|
405
|
+
// MCP module not loaded — fine in CLI-only contexts.
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
catch (err) {
|
|
409
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
410
|
+
console.warn('[QEKernel] LLM router init failed; continuing without LLM enhancement:', msg);
|
|
411
|
+
await this._publishLLMRouterEvent('init-failed', {
|
|
412
|
+
error: msg,
|
|
413
|
+
stack: err instanceof Error ? err.stack : undefined,
|
|
414
|
+
});
|
|
415
|
+
this._llmRouter = undefined;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* ADR-043: emit a structured event on the kernel event bus when the
|
|
420
|
+
* LLM router can't be built. Observability hook for monitoring and
|
|
421
|
+
* alerting — a silent warn is not enough for production systems where
|
|
422
|
+
* "tests run without LLM analysis" is a quality regression worth
|
|
423
|
+
* paging on.
|
|
424
|
+
*/
|
|
425
|
+
async _publishLLMRouterEvent(type, payload) {
|
|
426
|
+
try {
|
|
427
|
+
await this._eventBus.publish({
|
|
428
|
+
id: randomUUID(),
|
|
429
|
+
type: `kernel.llm-router.${type}`,
|
|
430
|
+
timestamp: new Date(),
|
|
431
|
+
source: 'qe-kernel',
|
|
432
|
+
payload,
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
catch {
|
|
436
|
+
// Event bus publish failures during boot must not crash the kernel.
|
|
437
|
+
}
|
|
438
|
+
}
|
|
313
439
|
async dispose() {
|
|
314
440
|
// ADR-094: Stop the dream scheduler first so a dream-in-progress doesn't
|
|
315
441
|
// try to write to a disposed memory backend.
|
|
@@ -332,6 +458,20 @@ export class QEKernelImpl {
|
|
|
332
458
|
await this._coordinator.dispose();
|
|
333
459
|
await this._eventBus.dispose();
|
|
334
460
|
await this._memory.dispose();
|
|
461
|
+
// ADR-043: clear the shared LLM router singleton if we registered
|
|
462
|
+
// one. Prevents test isolation problems where a stale router from
|
|
463
|
+
// a previous kernel boot leaks into the next.
|
|
464
|
+
if (this._llmRouter) {
|
|
465
|
+
try {
|
|
466
|
+
const { resetSharedLLMRouter } = await import('../mcp/tools/base.js');
|
|
467
|
+
resetSharedLLMRouter();
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
// MCP module not loaded — fine.
|
|
471
|
+
}
|
|
472
|
+
this._llmRouter = undefined;
|
|
473
|
+
this._llmRouterBuild = undefined;
|
|
474
|
+
}
|
|
335
475
|
this._initialized = false;
|
|
336
476
|
}
|
|
337
477
|
getDomainAPI(domain) {
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External Embedder Endpoint Client (ADR-097)
|
|
3
|
+
*
|
|
4
|
+
* OpenAI-compatible `/v1/embeddings` client over HTTP and HTTP-over-Unix-socket.
|
|
5
|
+
* When `EmbeddingConfig.endpoint` is set, AQE skips loading `@huggingface/transformers`
|
|
6
|
+
* entirely and routes feature-extraction through this client.
|
|
7
|
+
*
|
|
8
|
+
* Design choices per ADR-097 (revised after devil's-advocate audit):
|
|
9
|
+
* - OpenAI wire format with `encoding_format: 'float'` pinned (interop with TEI /
|
|
10
|
+
* vLLM / llama.cpp / Ollama / LocalAI / LM Studio — float pin avoids the
|
|
11
|
+
* base64 default some servers ship).
|
|
12
|
+
* - HTTP + HTTP-over-Unix (one protocol, two transports — no NDJSON fork).
|
|
13
|
+
* - Hard-fail with circuit breaker on errors (no silent hash fallback).
|
|
14
|
+
* - L2-renormalize on receive (don't trust server claims).
|
|
15
|
+
* - Bearer auth from env only; URL userinfo stripped + warned on construct.
|
|
16
|
+
* - Probe + identity fingerprint required before `embed()`; breaker recovery
|
|
17
|
+
* invalidates identity so re-probe runs against a fresh endpoint.
|
|
18
|
+
* - True TCP connect timeout via socket-level setTimeout (not req.setTimeout).
|
|
19
|
+
* - TLS knobs (ca / cert / key / rejectUnauthorized / servername) for self-hosted.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Endpoint identity fingerprint — a SHA-256 of the L2-normalized canary embedding,
|
|
23
|
+
* truncated to the first 16 hex chars. Stable for a given (model, quantization, server)
|
|
24
|
+
* tuple. Changes signal a configuration drift the operator must investigate.
|
|
25
|
+
*/
|
|
26
|
+
export interface EndpointIdentity {
|
|
27
|
+
/** Embedding dimension reported by the endpoint */
|
|
28
|
+
dim: number;
|
|
29
|
+
/** Stable fingerprint of the canary embedding (model + quantization signature) */
|
|
30
|
+
fingerprint: string;
|
|
31
|
+
/** Endpoint URL that produced this fingerprint (redacted — no userinfo) */
|
|
32
|
+
endpoint: string;
|
|
33
|
+
}
|
|
34
|
+
/** TLS configuration knobs passed through to https.Agent. */
|
|
35
|
+
export interface EmbedderTlsOptions {
|
|
36
|
+
/** Trusted CA bundle (PEM) or path-loaded buffer. */
|
|
37
|
+
ca?: string | Buffer | Array<string | Buffer>;
|
|
38
|
+
/** Client cert (PEM). */
|
|
39
|
+
cert?: string | Buffer;
|
|
40
|
+
/** Client key (PEM). */
|
|
41
|
+
key?: string | Buffer;
|
|
42
|
+
/** Default true — set false ONLY for explicit dev/test workflows. */
|
|
43
|
+
rejectUnauthorized?: boolean;
|
|
44
|
+
/** SNI override (e.g. for cert-pinned hosts behind an IP). */
|
|
45
|
+
servername?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface EmbedderEndpointClientOptions {
|
|
48
|
+
/** Endpoint URL: http(s)://host:port or unix:/path/to.sock */
|
|
49
|
+
endpoint: string;
|
|
50
|
+
/** Bearer token for Authorization header (typically from AQE_EMBEDDER_TOKEN env) */
|
|
51
|
+
token?: string;
|
|
52
|
+
/** Model identifier sent in the OpenAI request body */
|
|
53
|
+
model?: string;
|
|
54
|
+
/** Expected embedding dimension; probe fails if mismatched */
|
|
55
|
+
expectedDim?: number;
|
|
56
|
+
/** Connect timeout in ms (default 5000). True TCP connect timeout — not idle. */
|
|
57
|
+
connectTimeoutMs?: number;
|
|
58
|
+
/** Per-request timeout in ms (default 30000). Idle-after-connect. */
|
|
59
|
+
requestTimeoutMs?: number;
|
|
60
|
+
/** Circuit breaker: failures within window before tripping (default 3) */
|
|
61
|
+
failureThreshold?: number;
|
|
62
|
+
/** Circuit breaker: failure window in ms (default 60_000) */
|
|
63
|
+
failureWindowMs?: number;
|
|
64
|
+
/** TLS overrides for https transport. Ignored for http/unix. */
|
|
65
|
+
tlsOptions?: EmbedderTlsOptions;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Parsed endpoint — either an HTTP(S) URL or a Unix socket path.
|
|
69
|
+
*/
|
|
70
|
+
interface ParsedEndpoint {
|
|
71
|
+
transport: 'http' | 'https' | 'unix';
|
|
72
|
+
socketPath?: string;
|
|
73
|
+
host?: string;
|
|
74
|
+
port?: number;
|
|
75
|
+
protocol?: 'http:' | 'https:';
|
|
76
|
+
/** URL with userinfo stripped, safe for logs. */
|
|
77
|
+
safeUrl: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Strip user:password@ from a URL for safe logging.
|
|
81
|
+
* Returns the original string for non-URL inputs (unix paths).
|
|
82
|
+
*/
|
|
83
|
+
export declare function redactEndpoint(endpoint: string): string;
|
|
84
|
+
export declare function parseEndpoint(endpoint: string): ParsedEndpoint;
|
|
85
|
+
/**
|
|
86
|
+
* OpenAI-compatible embeddings client with keep-alive, circuit breaker, and identity probe.
|
|
87
|
+
*/
|
|
88
|
+
export declare class EmbedderEndpointClient {
|
|
89
|
+
private readonly parsed;
|
|
90
|
+
private readonly agent;
|
|
91
|
+
private readonly breaker;
|
|
92
|
+
private readonly opts;
|
|
93
|
+
private cachedIdentity;
|
|
94
|
+
/** True while a probe is in flight — prevents the embed() lazy-probe race. */
|
|
95
|
+
private probeInFlight;
|
|
96
|
+
constructor(options: EmbedderEndpointClientOptions);
|
|
97
|
+
/** Public, redacted endpoint URL for logs/metrics. */
|
|
98
|
+
getSafeEndpoint(): string;
|
|
99
|
+
/**
|
|
100
|
+
* Embed an array of texts. Returns L2-normalized vectors in input order.
|
|
101
|
+
*
|
|
102
|
+
* Gated on `probe()` — if no cached identity exists, probe is run first so the
|
|
103
|
+
* dim/identity boundary check fires on every cold path. Concurrent embed calls
|
|
104
|
+
* share a single in-flight probe.
|
|
105
|
+
*
|
|
106
|
+
* Throws on error — callers MUST NOT fall back to hash embeddings, which would
|
|
107
|
+
* poison the HNSW index with non-comparable vectors.
|
|
108
|
+
*/
|
|
109
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
110
|
+
/**
|
|
111
|
+
* Probe the endpoint by embedding a fixed canary. Returns identity fingerprint.
|
|
112
|
+
* Asserts dim === expectedDim. Throws loud on mismatch.
|
|
113
|
+
* Public so operators can re-probe on demand; idempotent under concurrency.
|
|
114
|
+
*/
|
|
115
|
+
probe(): Promise<EndpointIdentity>;
|
|
116
|
+
private ensureProbed;
|
|
117
|
+
private doProbe;
|
|
118
|
+
getCachedIdentity(): EndpointIdentity | null;
|
|
119
|
+
getBreakerState(): {
|
|
120
|
+
open: boolean;
|
|
121
|
+
failures: number;
|
|
122
|
+
trippedAt: number | null;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Close the underlying keep-alive agent. Tests should call this in afterEach.
|
|
126
|
+
*/
|
|
127
|
+
close(): void;
|
|
128
|
+
private decodeAndNormalize;
|
|
129
|
+
private postEmbeddings;
|
|
130
|
+
private request;
|
|
131
|
+
}
|
|
132
|
+
export {};
|
|
133
|
+
//# sourceMappingURL=embedder-endpoint-client.d.ts.map
|