agentic-qe 3.10.2 → 3.10.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/release/SKILL.md +10 -10
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +55 -0
- package/assets/grammars/tree-sitter-c_sharp.wasm +0 -0
- package/assets/grammars/tree-sitter-java.wasm +0 -0
- package/assets/grammars/tree-sitter-javascript.wasm +0 -0
- package/assets/grammars/tree-sitter-python.wasm +0 -0
- package/assets/grammars/tree-sitter-rust.wasm +0 -0
- package/assets/grammars/tree-sitter-swift.wasm +0 -0
- package/assets/grammars/tree-sitter-tsx.wasm +0 -0
- package/assets/grammars/tree-sitter-typescript.wasm +0 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/agents/claim-verifier/claim-verifier-service.js +4 -2
- package/dist/agents/claim-verifier/verifiers/test-verifier.js +31 -23
- package/dist/agents/devils-advocate/agent.js +1 -1
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-BHPUKMJ5.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-DHSIPFTH.js → agent-booster-wasm-NGC6LSQP.js} +2 -2
- package/dist/cli/chunks/{agent-handler-FPQVHGGT.js → agent-handler-P2IJE4GK.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-OLOF5ZHV.js → agent-memory-branch-JXRJ5GKQ.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-JQ5WD2HM.js +2 -0
- package/dist/cli/chunks/{audit-ALRYPHGP.js → audit-BMQ3VESB.js} +2 -2
- package/dist/cli/chunks/base-E32WLGY2.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-ZGSUMHDC.js → better-sqlite3-HP4JZS6K.js} +2 -2
- package/dist/cli/chunks/{brain-handler-ROZUHCOT.js → brain-handler-SACNDFSW.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-VK7G4NKJ.js → branch-enumerator-LFOTVUDA.js} +2 -2
- package/dist/cli/chunks/{browser-Q2S75M2F.js → browser-FK7PRF3W.js} +2 -2
- package/dist/cli/chunks/browser-workflow-LNNXXAJG.js +2 -0
- package/dist/cli/chunks/{chunk-UWXH2UQK.js → chunk-2EQVYYBF.js} +2 -2
- package/dist/cli/chunks/{chunk-JF53LRBL.js → chunk-2L73WXA4.js} +2 -2
- package/dist/cli/chunks/{chunk-5HB54RUS.js → chunk-2ULVCLOW.js} +2 -2
- package/dist/cli/chunks/{chunk-UUFOHMUG.js → chunk-3HBWDG62.js} +2 -2
- package/dist/cli/chunks/{chunk-22D6VBPD.js → chunk-3JAOFKEU.js} +2 -2
- package/dist/cli/chunks/{chunk-XPCNUX2U.js → chunk-3LRK7PYN.js} +2 -2
- package/dist/cli/chunks/{chunk-WNR2KAUH.js → chunk-3RZL4QTT.js} +2 -2
- package/dist/cli/chunks/chunk-3VF3HCG4.js +2 -0
- package/dist/cli/chunks/{chunk-3Z4FHA2E.js → chunk-3X2ZQ55B.js} +4 -4
- package/dist/cli/chunks/{chunk-YACT5WFC.js → chunk-4CYLSXA6.js} +2 -2
- package/dist/cli/chunks/{chunk-7QRMARM7.js → chunk-4OUAHZX2.js} +2 -2
- package/dist/cli/chunks/{chunk-G5U6Q42D.js → chunk-4QFAUSWQ.js} +2 -2
- package/dist/cli/chunks/{chunk-SJH3HYNC.js → chunk-5ER3COX3.js} +2 -2
- package/dist/cli/chunks/{chunk-LZCBSFAU.js → chunk-5EWWA4QP.js} +4 -4
- package/dist/cli/chunks/{chunk-VSUTI4G6.js → chunk-5G5AAEFF.js} +2 -2
- package/dist/cli/chunks/{chunk-7V5UHLNY.js → chunk-5IBJURYB.js} +3 -3
- package/dist/cli/chunks/chunk-5LON3MLI.js +2 -0
- package/dist/cli/chunks/{chunk-3RHHKYUR.js → chunk-5SGEOO2F.js} +2 -2
- package/dist/cli/chunks/{chunk-6NZHEM4V.js → chunk-6B4S7PKP.js} +3 -3
- package/dist/cli/chunks/{chunk-MEY43PIQ.js → chunk-6FL3GN4T.js} +2 -2
- package/dist/cli/chunks/{chunk-Y63MBMOV.js → chunk-6GCOIIHY.js} +2 -2
- package/dist/cli/chunks/{chunk-EQBEGDTG.js → chunk-6Q2PPOOF.js} +1 -1
- package/dist/cli/chunks/{chunk-PXTDEO65.js → chunk-6ZK24V2Y.js} +2 -2
- package/dist/cli/chunks/{chunk-7Z46RDDV.js → chunk-72LE6PHL.js} +3 -3
- package/dist/cli/chunks/{chunk-SVYTN2GT.js → chunk-7RMZAVGO.js} +2 -2
- package/dist/cli/chunks/{chunk-S3OZ7XSY.js → chunk-7SEHQTYD.js} +1 -1
- package/dist/cli/chunks/{chunk-UYYBPWU3.js → chunk-7YYTTWGY.js} +1 -1
- package/dist/cli/chunks/{chunk-DRWGK3YO.js → chunk-7ZSPCGTI.js} +2 -2
- package/dist/cli/chunks/{chunk-UVU7XLJY.js → chunk-ADV4DH3W.js} +5 -5
- package/dist/cli/chunks/{chunk-FO43SQXP.js → chunk-AEJVOJPT.js} +2 -2
- package/dist/cli/chunks/{chunk-ETN5563K.js → chunk-B5MMDMH6.js} +2 -2
- package/dist/cli/chunks/{chunk-ZXTO4C7R.js → chunk-BO2OV2RH.js} +2 -2
- package/dist/cli/chunks/{chunk-TJKDATEU.js → chunk-BT3QLWII.js} +2 -2
- package/dist/cli/chunks/{chunk-AV7KYE5P.js → chunk-BWP3UVPE.js} +5 -5
- package/dist/cli/chunks/{chunk-PEK6NGVJ.js → chunk-C6BBRM2J.js} +1 -1
- package/dist/cli/chunks/{chunk-ORF2UKQH.js → chunk-CAMEFWRK.js} +1 -1
- package/dist/cli/chunks/{chunk-EVCOCGVJ.js → chunk-CNEWYJKT.js} +4 -4
- package/dist/cli/chunks/{chunk-MYWQTCS4.js → chunk-CTDO2UB2.js} +1 -1
- package/dist/cli/chunks/{chunk-2OH3ALYB.js → chunk-D2FBUOAR.js} +1 -1
- package/dist/cli/chunks/{chunk-ZDHMZPSL.js → chunk-DF3MJ2YL.js} +1 -1
- package/dist/cli/chunks/{chunk-7SJX4CFK.js → chunk-DY5KEOHX.js} +1 -1
- package/dist/cli/chunks/{chunk-DZZEHPSJ.js → chunk-E2BJT6A7.js} +3 -3
- package/dist/cli/chunks/{chunk-2244IFZA.js → chunk-EETVN2OJ.js} +1 -1
- package/dist/cli/chunks/{chunk-FY3CUPNN.js → chunk-ERYMAYJW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZK2BH23O.js → chunk-FJGSEPFL.js} +2 -2
- package/dist/cli/chunks/{chunk-HJORBNXW.js → chunk-FLTPHVZ3.js} +1 -1
- package/dist/cli/chunks/{chunk-RLXTBL3H.js → chunk-FND6V2RV.js} +22 -22
- package/dist/cli/chunks/{chunk-PIZYRPMT.js → chunk-FU77CDEM.js} +2 -2
- package/dist/cli/chunks/{chunk-HA63NBFK.js → chunk-GELF4ILR.js} +37 -37
- package/dist/cli/chunks/{chunk-U3EUH6LX.js → chunk-GHNNJHH3.js} +2 -2
- package/dist/cli/chunks/{chunk-NZO4WUSO.js → chunk-GJUGSH7T.js} +3 -3
- package/dist/cli/chunks/{chunk-QJ2EHLJ2.js → chunk-GL3HZN3O.js} +1 -1
- package/dist/cli/chunks/{chunk-MMIQ5DMA.js → chunk-H56AROF2.js} +2 -2
- package/dist/cli/chunks/{chunk-AWFIEGR3.js → chunk-HAO3SPOE.js} +2 -2
- package/dist/cli/chunks/{chunk-MNUTRAUV.js → chunk-HM523MTQ.js} +1 -1
- package/dist/cli/chunks/{chunk-IICTTDAA.js → chunk-HMFEPKAR.js} +2 -2
- package/dist/cli/chunks/{chunk-4GTDW2XL.js → chunk-HQJMCTWN.js} +2 -2
- package/dist/cli/chunks/{chunk-5PL7WTCU.js → chunk-HRLXU4LH.js} +2 -2
- package/dist/cli/chunks/{chunk-5WJ3FWL4.js → chunk-HWM2XJ3P.js} +24 -24
- package/dist/cli/chunks/{chunk-BQCSCAUC.js → chunk-I42R57ON.js} +2 -2
- package/dist/cli/chunks/chunk-IL2KOW5W.js +2 -0
- package/dist/cli/chunks/{chunk-QSE67XJO.js → chunk-IRR7YA3Q.js} +2 -2
- package/dist/cli/chunks/{chunk-FPAW77XV.js → chunk-JD2PG4KS.js} +1 -1
- package/dist/cli/chunks/{chunk-LQTWPSYL.js → chunk-JE3C7JYN.js} +1 -1
- package/dist/cli/chunks/{chunk-6KSCXPPL.js → chunk-JLL27IGU.js} +2 -2
- package/dist/cli/chunks/{chunk-7DKYCVJI.js → chunk-JOLDCS6X.js} +2 -2
- package/dist/cli/chunks/{chunk-YNNOY3XN.js → chunk-JP63XACW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZQUXNG5X.js → chunk-JSFYPLMQ.js} +2 -2
- package/dist/cli/chunks/{chunk-MNV3E5KY.js → chunk-JTF6D2RJ.js} +4 -4
- package/dist/cli/chunks/{chunk-OXCEUR5F.js → chunk-JTZ3Q2QS.js} +2 -2
- package/dist/cli/chunks/{chunk-OPFN5LFT.js → chunk-JXIPRMAY.js} +4 -4
- package/dist/cli/chunks/{chunk-XDU624HU.js → chunk-KG5SM36Y.js} +1 -1
- package/dist/cli/chunks/{chunk-SW4OKUTC.js → chunk-KTRB3L53.js} +2 -2
- package/dist/cli/chunks/{chunk-MCZHKXB4.js → chunk-L74CHKFR.js} +2 -2
- package/dist/cli/chunks/{chunk-2EDWGHDA.js → chunk-LZ6TNTGO.js} +2 -2
- package/dist/cli/chunks/{chunk-5PRFFHFV.js → chunk-M5CDW2ZH.js} +2 -2
- package/dist/cli/chunks/{chunk-PYIHZXCI.js → chunk-MBSJ5G4I.js} +4 -4
- package/dist/cli/chunks/{chunk-OIRZJCZY.js → chunk-MC7K44M4.js} +2 -2
- package/dist/cli/chunks/{chunk-2JDLQWSV.js → chunk-MQOFFRTA.js} +2 -2
- package/dist/cli/chunks/{chunk-4BXGVM2C.js → chunk-N7IBYDW5.js} +1 -1
- package/dist/cli/chunks/{chunk-MCOFJHSJ.js → chunk-NEYYLAYS.js} +5 -5
- package/dist/cli/chunks/{chunk-A5RMQG4N.js → chunk-NNVXHC74.js} +3 -3
- package/dist/cli/chunks/{chunk-QBRHKTFT.js → chunk-NNZMEYLT.js} +1 -1
- package/dist/cli/chunks/{chunk-WDMPJ2M2.js → chunk-NRCL3WCP.js} +2 -2
- package/dist/cli/chunks/{chunk-ZGNZJJFF.js → chunk-NXPFGPHV.js} +1 -1
- package/dist/cli/chunks/{chunk-AH7FXNFE.js → chunk-NZHOKLII.js} +3 -3
- package/dist/cli/chunks/{chunk-EA7ZSN3V.js → chunk-OG7CWWFR.js} +1 -1
- package/dist/cli/chunks/{chunk-YWZHMXTO.js → chunk-OPDTDKN3.js} +2 -2
- package/dist/cli/chunks/{chunk-24LUQICS.js → chunk-OX4R55T3.js} +2 -2
- package/dist/cli/chunks/{chunk-QEPFXY6G.js → chunk-PFCAMX6H.js} +1 -1
- package/dist/cli/chunks/{chunk-DMQPO43S.js → chunk-PL5SLO2W.js} +1 -1
- package/dist/cli/chunks/{chunk-XGBAHAGC.js → chunk-PZHZPX3O.js} +4 -4
- package/dist/cli/chunks/{chunk-HJME6G5M.js → chunk-Q7EBD24B.js} +1 -1
- package/dist/cli/chunks/{chunk-4F3ZTXHP.js → chunk-QEODION5.js} +2 -2
- package/dist/cli/chunks/{chunk-AIUSZC6K.js → chunk-QM65UGPV.js} +2 -2
- package/dist/cli/chunks/{chunk-HHCYSAH3.js → chunk-QWG76RHA.js} +2 -2
- package/dist/cli/chunks/{chunk-5QHSLWLP.js → chunk-R5ONQAQL.js} +2 -2
- package/dist/cli/chunks/{chunk-S3ZO7JXS.js → chunk-RNF47IJ5.js} +4 -4
- package/dist/cli/chunks/{chunk-AOI67HA3.js → chunk-RTDHWOAG.js} +1 -1
- package/dist/cli/chunks/{chunk-C2M74HCN.js → chunk-RZCAA2PZ.js} +1 -1
- package/dist/cli/chunks/{chunk-7IVQ6OVR.js → chunk-SL6YZAT4.js} +2 -2
- package/dist/cli/chunks/{chunk-KB5L5TTF.js → chunk-SNTMAVPH.js} +5 -5
- package/dist/cli/chunks/{chunk-XTCUN36Z.js → chunk-SWOG3PBD.js} +2 -2
- package/dist/cli/chunks/{chunk-7IZ2OPC2.js → chunk-T63EK6GH.js} +2 -2
- package/dist/cli/chunks/chunk-U6UK3UMX.js +59 -0
- package/dist/cli/chunks/{chunk-7SWD3D6Y.js → chunk-U7NMPZE2.js} +2 -2
- package/dist/cli/chunks/{chunk-THRTUW4Z.js → chunk-UDV4YB42.js} +1 -1
- package/dist/cli/chunks/{chunk-CV2SBMBW.js → chunk-UHDBM7QS.js} +2 -2
- package/dist/cli/chunks/{chunk-CIRPP7RQ.js → chunk-UIJFU4KD.js} +2 -2
- package/dist/cli/chunks/{chunk-L7VIX22Y.js → chunk-USFZ4IJD.js} +2 -2
- package/dist/cli/chunks/{chunk-CMACGG4Z.js → chunk-UZL366ZI.js} +1 -1
- package/dist/cli/chunks/{chunk-QQNCSEZG.js → chunk-VDTFRMES.js} +2 -2
- package/dist/cli/chunks/{chunk-6ZFHIKQG.js → chunk-VIWIO27R.js} +3 -3
- package/dist/cli/chunks/{chunk-YI6GNRQM.js → chunk-VRXY4T22.js} +2 -2
- package/dist/cli/chunks/{chunk-WSVUSIAZ.js → chunk-WPVCSFDA.js} +2 -2
- package/dist/cli/chunks/{chunk-X2VAOIUY.js → chunk-WWD5IWTV.js} +1 -1
- package/dist/cli/chunks/{chunk-WZJUMJ2S.js → chunk-X2B7SANM.js} +1 -1
- package/dist/cli/chunks/{chunk-R2O6OKT2.js → chunk-X3RJ6SFC.js} +1 -1
- package/dist/cli/chunks/{chunk-OWQ6HEYI.js → chunk-XTP2GHI7.js} +2 -2
- package/dist/cli/chunks/{chunk-XRJECWZE.js → chunk-YDDZJCKY.js} +1 -1
- package/dist/cli/chunks/{chunk-HO37VP4O.js → chunk-YDKYLNKZ.js} +1 -1
- package/dist/cli/chunks/{chunk-ON4D4TJ4.js → chunk-YIYV2JB6.js} +2 -2
- package/dist/cli/chunks/{chunk-RNREAOY4.js → chunk-YX2HY4MX.js} +2 -2
- package/dist/cli/chunks/{chunk-XDSA7YUQ.js → chunk-YXH2CVAF.js} +1 -1
- package/dist/cli/chunks/{chunk-XMJTTF5N.js → chunk-YYAPO3CU.js} +3 -3
- package/dist/cli/chunks/{chunk-STEGWLH5.js → chunk-Z2K5IZM6.js} +2 -2
- package/dist/cli/chunks/{chunk-OIEQF7PG.js → chunk-ZG4P3DTL.js} +2 -2
- package/dist/cli/chunks/{chunk-CTDLI2ON.js → chunk-ZXQNE4QV.js} +1 -1
- package/dist/cli/chunks/{ci-PYCRCL7G.js → ci-AWZ3S5OT.js} +6 -6
- package/dist/cli/chunks/{ci-output-EKQQFE2D.js → ci-output-JLCYTIMT.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-RH3Q2MJO.js → circuit-breaker-BJDKBDIL.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-DUDXB4VV.js → claude-flow-setup-KKOP5ZMO.js} +2 -2
- package/dist/cli/chunks/client-2UKBYFX4.js +2 -0
- package/dist/cli/chunks/{cline-installer-3Q4WIWUG.js → cline-installer-7M525SEA.js} +2 -2
- package/dist/cli/chunks/{code-E4Q6DGOO.js → code-27SUVJDO.js} +20 -19
- package/dist/cli/chunks/{code-index-extractor-2PCISUOW.js → code-index-extractor-TTQQZLAK.js} +2 -2
- package/dist/cli/chunks/{codex-installer-YNNNOLJ6.js → codex-installer-GHNGNPKP.js} +2 -2
- package/dist/cli/chunks/{completions-2F7TUFBD.js → completions-JPJD24DG.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-2B6MHO7W.js → complexity-analyzer-Q74EJV33.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-ENOKRU5M.js → continuedev-installer-ULTRDIML.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-6YD2KM5F.js → copilot-installer-EK52X4CG.js} +2 -2
- package/dist/cli/chunks/{cost-tracker-FCH4QOEA.js → cost-tracker-2GKBRYXL.js} +2 -2
- package/dist/cli/chunks/{coverage-JTOXZE3T.js → coverage-YCLC3W2A.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-FPM3L27L.js +2 -0
- package/dist/cli/chunks/{cursor-installer-QZFBUGLQ.js → cursor-installer-B3ALFW5E.js} +2 -2
- package/dist/cli/chunks/{daemon-M422U3ZA.js → daemon-YWINEHG4.js} +4 -4
- package/dist/cli/chunks/{daemon-K4QFB5FQ.js → daemon-ZKEBVLJA.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-BXAAW33V.js → dag-attention-scheduler-OQPJ6ULA.js} +2 -2
- package/dist/cli/chunks/{detect-UGSWIOAD.js → detect-YMYIQH3Q.js} +2 -2
- package/dist/cli/chunks/{dist-node-FN3HX3OK.js → dist-node-R4FAYQRY.js} +2 -2
- package/dist/cli/chunks/{domain-handler-7PP7VYA7.js → domain-handler-IGWXLF2S.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-XZM44W7I.js → domain-transfer-A7YNO76C.js} +2 -2
- package/dist/cli/chunks/dream-XM33US3V.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-JZVERJ5L.js → embed-and-insert-pattern-KODZAS7Y.js} +2 -2
- package/dist/cli/chunks/{eval-466NFF2D.js → eval-ALQW7Q2S.js} +3 -3
- package/dist/cli/chunks/{experience-capture-middleware-I7IQCC7V.js → experience-capture-middleware-3WK4RXWK.js} +3 -3
- package/dist/cli/chunks/{fast-paths-34OICNZA.js → fast-paths-PQWDFIJZ.js} +2 -2
- package/dist/cli/chunks/{feature-flags-X5WBBWSO.js → feature-flags-6X33B3WX.js} +2 -2
- package/dist/cli/chunks/{feature-flags-6UBIVTAD.js → feature-flags-JRUAZCND.js} +2 -2
- package/dist/cli/chunks/{file-discovery-NLMDBWXX.js → file-discovery-SA3YU3IH.js} +2 -2
- package/dist/cli/chunks/{fleet-W7CYCHDI.js → fleet-7TXCAOKQ.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-K4VTAG5X.js → gnn-wrapper-ZKNYACEC.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-ZGKF2Z6T.js → heartbeat-handler-KRZRZ23F.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-GM3M2MTG.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-K62GEHIL.js +2 -0
- package/dist/cli/chunks/hnsw-index-VCAK3TWN.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-ELDRLKK5.js → hnsw-legacy-bridge-LVHQ5SG7.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-5BT5FO64.js → hnswlib-node-64EGGWIC.js} +2 -2
- package/dist/cli/chunks/{hooks-T4CBINAV.js → hooks-6Y3UHYI2.js} +12 -12
- package/dist/cli/chunks/hybrid-router-432QNCNG.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-UWFW3XP5.js → hypergraph-engine-2EZBZMFK.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-PK2BI46K.js → hypergraph-handler-GLPWYII2.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-VTSISNN4.js +2 -0
- package/dist/cli/chunks/{init-handler-HNG6KJOU.js → init-handler-ZSDO5VMA.js} +6 -6
- package/dist/cli/chunks/init-wizard-COB5AH7Q.js +2 -0
- package/dist/cli/chunks/kernel-ROK7X5FM.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-25V7FEJ4.js → kilocode-installer-ATYSDWIV.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-7RMTTCQB.js → kiro-installer-K66YT6PC.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-YUWIDIWW.js +2 -0
- package/dist/cli/chunks/{learning-XQC2MG2R.js → learning-BVYCC4RI.js} +3 -3
- package/dist/cli/chunks/{llm-router-6KTTONH4.js → llm-router-VBCXE6DN.js} +12 -12
- package/dist/cli/chunks/llm-router-service-7VLXJ7VE.js +2 -0
- package/dist/cli/chunks/{load-BV64P3AL.js → load-AREDQE2U.js} +2 -2
- package/dist/cli/chunks/load-test-32524DL3.js +2 -0
- package/dist/cli/chunks/{mcp-U5ZN77TA.js → mcp-NG6H6UC5.js} +2 -2
- package/dist/cli/chunks/{memory-WB5BNBK7.js → memory-Y65EHG6N.js} +5 -5
- package/dist/cli/chunks/memory-backend-BI2V5AAB.js +2 -0
- package/dist/cli/chunks/memory-handlers-NSOFWVFN.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-3X3W3UTY.js → multi-model-executor-VRPRFUZT.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-TTTMG7ZZ.js → opencode-installer-CKQXPM5R.js} +3 -3
- package/dist/cli/chunks/{orchestrator-BLCGSHMZ.js → orchestrator-I7JBKD6G.js} +8 -8
- package/dist/cli/chunks/{pipeline-DZPGMRG7.js → pipeline-MV2RWCBI.js} +2 -2
- package/dist/cli/chunks/{platform-EVMZAUNV.js → platform-VU5P3SOG.js} +2 -2
- package/dist/cli/chunks/{plugin-OR55K4HT.js → plugin-6TERLKCB.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-4ODV27HD.js → prime-radiant-advanced-wasm-WIUIN2DL.js} +2 -2
- package/dist/cli/chunks/protocol-executor-2UPB7SPI.js +2 -0
- package/dist/cli/chunks/{protocol-handler-ZOTI5PID.js → protocol-handler-HKWBGARO.js} +2 -2
- package/dist/cli/chunks/{prove-DIMBYJ7V.js → prove-7CQPHBRJ.js} +2 -2
- package/dist/cli/chunks/provider-manager-PDT37MIJ.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-AQQ2BI4V.js +2 -0
- package/dist/cli/chunks/{quality-7MX4VL6M.js → quality-VLUVXKVG.js} +2 -2
- package/dist/cli/chunks/queen-coordinator-6DVDVEU4.js +2 -0
- package/dist/cli/chunks/{real-embeddings-YPUHWRN2.js → real-embeddings-JPZ64KK2.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-WG5AU4QM.js → roocode-installer-NONVB3UE.js} +2 -2
- package/dist/cli/chunks/router-O2G4KQ6L.js +2 -0
- package/dist/cli/chunks/routing-feedback-TAGTD3KQ.js +2 -0
- package/dist/cli/chunks/{routing-handler-LZB4MN2K.js → routing-handler-YYXDT4J2.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-YE4ADBMC.js → ruvector-commands-5PFMNDLR.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-QS5ATW4C.js → rvf-dual-writer-TF6H7AXH.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-YIGKSBD3.js → rvf-migration-adapter-VNGIUZCO.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-2NDCWP7F.js → rvf-migration-coordinator-VA52YAIY.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-46GRWQJR.js +2 -0
- package/dist/cli/chunks/safe-db-LNIPXXHH.js +2 -0
- package/dist/cli/chunks/schedule-AUH3ZALY.js +2 -0
- package/dist/cli/chunks/scheduler-KK3OYPWW.js +2 -0
- package/dist/cli/chunks/{security-HT4SUT24.js → security-62HEETBF.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-4IZOJL33.js → shared-rvf-adapter-XWTQPGCT.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-ZKFO7CBY.js → shared-rvf-dual-writer-JTZK7LRD.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-CYESP7NG.js +2 -0
- package/dist/cli/chunks/{status-handler-AMEMKBI4.js → status-handler-LSUPUKRF.js} +2 -2
- package/dist/cli/chunks/{structural-health-RBADRLC3.js → structural-health-Z75A666N.js} +2 -2
- package/dist/cli/chunks/{sync-PCB23M4K.js → sync-M3O4T3A3.js} +2 -2
- package/dist/cli/chunks/{sync-ARDDLQBS.js → sync-VI37UHHH.js} +2 -2
- package/dist/cli/chunks/{task-handler-J26FSCH5.js → task-handler-AQBSZAQC.js} +2 -2
- package/dist/cli/chunks/{task-handlers-AQRLR6BL.js → task-handlers-BOZP247V.js} +3 -3
- package/dist/cli/chunks/{test-YXWSIOSB.js → test-FTEGPNN2.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-XY532GI4.js → test-scheduling-IGR4U2VQ.js} +4 -4
- package/dist/cli/chunks/{token-bootstrap-KL2QIQ36.js → token-bootstrap-2DFRVMBM.js} +2 -2
- package/dist/cli/chunks/{token-usage-2MJVE4DT.js → token-usage-VCHV47EO.js} +3 -3
- package/dist/cli/chunks/{transformers-QSNTOD2Z.js → transformers-M27QSNFH.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-IIGEJYFU.js +2 -0
- package/dist/cli/chunks/{types-RNKRSYMO.js → types-RQFPUUKA.js} +2 -2
- package/dist/cli/chunks/unified-memory-RISHEANP.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-2IKXGMNZ.js +2 -0
- package/dist/cli/chunks/unified-persistence-ZTTUJNTU.js +2 -0
- package/dist/cli/chunks/{upgrade-EKJHIFWP.js → upgrade-VJMYX3AL.js} +2 -2
- package/dist/cli/chunks/{validate-KS4T7LWC.js → validate-ML7HUAU5.js} +4 -4
- package/dist/cli/chunks/{validate-swarm-SKKWRP2H.js → validate-swarm-RCR6EYRC.js} +7 -7
- package/dist/cli/chunks/{vibium-FLUQO4IF.js → vibium-ZOOS3W5L.js} +2 -2
- package/dist/cli/chunks/visual-security-D66DTAO5.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-UMC63DWD.js → web-tree-sitter-2YPGYLWK.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-V3FQGJIQ.js → windsurf-installer-GOJWUWC5.js} +2 -2
- package/dist/cli/chunks/{witness-chain-GE74TLSO.js → witness-chain-3MGSS3Q4.js} +2 -2
- package/dist/cli/chunks/witness-chain-RHWHHDLV.js +2 -0
- package/dist/cli/chunks/{workflow-4YZ2RPWA.js → workflow-B5Q77BI4.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-OQMFW2TC.js +2 -0
- package/dist/cli/chunks/{wrappers-37NLMKPE.js → wrappers-MM5VLEPG.js} +2 -2
- package/dist/cli/commands/code.js +6 -0
- package/dist/cli/commands/learning.js +5 -5
- package/dist/cli/commands/llm-router.js +1 -1
- package/dist/cli/commands/workflow.js +1 -0
- package/dist/coordination/consensus/providers/native-learning-provider.d.ts +1 -1
- package/dist/coordination/consensus/providers/ollama-provider.d.ts +1 -1
- package/dist/coordination/consensus/providers/openrouter-provider.d.ts +1 -1
- package/dist/coordination/handlers/code-intelligence-handlers.js +6 -0
- package/dist/coordination/mincut/neural-goap.js +24 -20
- package/dist/coordination/protocols/code-intelligence-index.js +31 -25
- package/dist/coordination/queen-coordinator.js +4 -0
- package/dist/coordination/queen-work-stealing.js +1 -2
- package/dist/domains/chaos-resilience/coordinator.js +19 -15
- package/dist/domains/chaos-resilience/services/chaos-engineer.js +5 -2
- package/dist/domains/chaos-resilience/services/load-tester.js +15 -11
- package/dist/domains/code-intelligence/interfaces.d.ts +5 -0
- package/dist/domains/code-intelligence/services/c4-model/index.js +12 -6
- package/dist/domains/code-intelligence/services/impact-analyzer.js +6 -2
- package/dist/domains/code-intelligence/services/knowledge-graph.d.ts +42 -0
- package/dist/domains/code-intelligence/services/knowledge-graph.js +278 -93
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +8 -2
- package/dist/domains/contract-testing/coordinator.js +1 -1
- package/dist/domains/coverage-analysis/coordinator.js +4 -2
- package/dist/domains/learning-optimization/coordinator.js +1 -0
- package/dist/domains/quality-assessment/coherence/gate-controller.js +32 -26
- package/dist/domains/requirements-validation/coordinator.js +1 -0
- package/dist/domains/test-execution/services/e2e/wait-condition-handler.js +1 -1
- package/dist/domains/test-execution/services/retry-handler.js +18 -12
- package/dist/domains/test-generation/coordinator.js +1 -1
- package/dist/domains/test-generation/services/pattern-matcher.js +7 -5
- package/dist/domains/test-generation/services/test-generator.js +3 -2
- package/dist/domains/visual-accessibility/coordinator.js +24 -20
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/init/phases/12-verification.js +3 -3
- package/dist/integrations/agentic-flow/model-router/router.js +1 -1
- package/dist/integrations/embeddings/base/EmbeddingGenerator.js +11 -7
- package/dist/integrations/ruvector/hypergraph-engine.js +2 -2
- package/dist/integrations/ruvector/spectral-math.js +2 -2
- package/dist/integrations/ruvector/spectral-sparsifier.js +1 -1
- package/dist/kernel/kernel.js +1 -1
- package/dist/kernel/unified-memory-hnsw.js +1 -0
- package/dist/learning/experience-capture.js +1 -1
- package/dist/learning/qe-reasoning-bank.js +9 -1
- package/dist/learning/qe-unified-memory.js +8 -6
- package/dist/mcp/bundle.js +354 -354
- package/dist/mcp/handlers/core-handlers.js +2 -2
- package/dist/mcp/handlers/cross-phase-handlers.js +5 -3
- package/dist/mcp/handlers/handler-factory.d.ts +5 -0
- package/dist/mcp/handlers/handler-factory.js +44 -4
- package/dist/mcp/http-server.js +1 -0
- package/dist/mcp/protocol-server.js +2 -2
- package/dist/mcp/tools/code-intelligence/analyze.js +1 -1
- package/dist/mcp/tools/learning-optimization/optimize.js +1 -1
- package/dist/mcp/tools/qx-analysis/heuristics-engine.js +195 -173
- package/dist/mcp/tools/visual-accessibility/index.js +1 -1
- package/dist/mcp/transport/websocket/websocket-transport.js +1 -0
- package/dist/optimization/auto-tuner.js +1 -1
- package/dist/planning/goap-planner.js +1 -0
- package/dist/routing/agent-dependency-graph.js +4 -1
- package/dist/shared/llm/router/config-store.js +1 -1
- package/dist/shared/metrics/system-metrics.js +6 -4
- package/dist/shared/parsers/tree-sitter-wasm-parser.d.ts +12 -0
- package/dist/shared/parsers/tree-sitter-wasm-parser.js +35 -0
- package/dist/shared/parsers/treesitter-ts-extractor.d.ts +39 -0
- package/dist/shared/parsers/treesitter-ts-extractor.js +196 -0
- package/dist/shared/utils/safe-expression-evaluator.js +8 -5
- package/dist/sync/cloud/postgres-writer.js +2 -0
- package/dist/sync/readers/json-reader.js +1 -1
- package/dist/test-scheduling/git-aware/test-selector.js +1 -1
- package/dist/workers/quality-daemon/index.js +26 -24
- package/package.json +5 -4
- package/dist/cli/chunks/adapter-CR6J5C76.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-2MNTHMB6.js +0 -2
- package/dist/cli/chunks/base-AOQNGMTL.js +0 -2
- package/dist/cli/chunks/browser-workflow-UJ4A2ZXO.js +0 -2
- package/dist/cli/chunks/chunk-FO73PZVU.js +0 -2
- package/dist/cli/chunks/chunk-I677W5BT.js +0 -59
- package/dist/cli/chunks/chunk-IAZEDWRX.js +0 -2
- package/dist/cli/chunks/client-RDPWGOSA.js +0 -2
- package/dist/cli/chunks/cross-domain-router-4K5ZVZEZ.js +0 -2
- package/dist/cli/chunks/dream-RPNWM7VS.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-JBCXMMZO.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-3SC2HZIG.js +0 -2
- package/dist/cli/chunks/hnsw-index-FQORAR6K.js +0 -2
- package/dist/cli/chunks/hybrid-router-6CBFDXPR.js +0 -2
- package/dist/cli/chunks/impact-analyzer-SOEFVZWG.js +0 -2
- package/dist/cli/chunks/init-wizard-3E4IU5M4.js +0 -2
- package/dist/cli/chunks/kernel-GFZP4G5J.js +0 -2
- package/dist/cli/chunks/knowledge-graph-BKRKBU26.js +0 -2
- package/dist/cli/chunks/llm-router-service-KE4IGZPP.js +0 -2
- package/dist/cli/chunks/load-test-VSYJV2AO.js +0 -2
- package/dist/cli/chunks/memory-backend-B72RGHRF.js +0 -2
- package/dist/cli/chunks/memory-handlers-NWCH7AUO.js +0 -2
- package/dist/cli/chunks/protocol-executor-V3F37FPO.js +0 -2
- package/dist/cli/chunks/provider-manager-2PN72TT6.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-P665QNIR.js +0 -2
- package/dist/cli/chunks/queen-coordinator-XD4F7BGB.js +0 -2
- package/dist/cli/chunks/router-4SSNWDJC.js +0 -2
- package/dist/cli/chunks/routing-feedback-O2JSIBW6.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-WIUHYXRB.js +0 -2
- package/dist/cli/chunks/safe-db-WL5Y7ZNS.js +0 -2
- package/dist/cli/chunks/schedule-U7QDGU5A.js +0 -2
- package/dist/cli/chunks/scheduler-LXKGQYXA.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-4KFO3SEB.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-QJOKHOIW.js +0 -2
- package/dist/cli/chunks/unified-memory-7AS4LIEF.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-GREESNJX.js +0 -2
- package/dist/cli/chunks/unified-persistence-BPJOMZOA.js +0 -2
- package/dist/cli/chunks/visual-security-BW662FHQ.js +0 -2
- package/dist/cli/chunks/witness-chain-OXVDLNVT.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-KKNR46XV.js +0 -2
|
@@ -9,6 +9,9 @@ import { FileReader } from '../../../shared/io';
|
|
|
9
9
|
import { NomicEmbedder } from '../../../shared/embeddings';
|
|
10
10
|
import { toErrorMessage, toError } from '../../../shared/error-utils.js';
|
|
11
11
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
12
|
+
import { existsSync, statSync } from 'fs';
|
|
13
|
+
import { dirname, resolve as resolvePath, join as joinPath } from 'path';
|
|
14
|
+
import { extractTsJs } from '../../../shared/parsers/treesitter-ts-extractor.js';
|
|
12
15
|
const DEFAULT_CONFIG = {
|
|
13
16
|
maxNodes: 100000,
|
|
14
17
|
maxEdgesPerNode: 500,
|
|
@@ -26,11 +29,25 @@ const DEFAULT_CONFIG = {
|
|
|
26
29
|
* ADR-051: Added LLM enhancement for AI-powered knowledge extraction
|
|
27
30
|
*/
|
|
28
31
|
const logger = LoggerFactory.create('code-intelligence/knowledge-graph');
|
|
32
|
+
/**
|
|
33
|
+
* File extensions for which the knowledge graph has a real entity/import
|
|
34
|
+
* extractor (the TypeScript Compiler API). Files outside this set are indexed
|
|
35
|
+
* as bare file nodes with no dependency edges — `index` warns about them so the
|
|
36
|
+
* downstream 0-edge result in `deps` is not silently misleading (#511 req #2).
|
|
37
|
+
*/
|
|
38
|
+
const DEP_EXTRACTOR_EXTENSIONS = new Set(['ts', 'tsx', 'js', 'jsx']);
|
|
29
39
|
export class KnowledgeGraphService {
|
|
30
40
|
config;
|
|
31
41
|
memory;
|
|
32
42
|
nodeCache = new Map();
|
|
33
43
|
edgeIndex = new Map();
|
|
44
|
+
/**
|
|
45
|
+
* Lazily-hydrated flat list of all persisted edges (#511).
|
|
46
|
+
* Edges are persisted per-process during index(); cross-process reads
|
|
47
|
+
* (deps/search/impact) hydrate this once and filter by source/target.
|
|
48
|
+
* Invalidated on createEdge()/clear() to avoid serving stale data.
|
|
49
|
+
*/
|
|
50
|
+
allEdgesCache;
|
|
34
51
|
tsParser;
|
|
35
52
|
fileReader;
|
|
36
53
|
embedder;
|
|
@@ -66,6 +83,18 @@ export class KnowledgeGraphService {
|
|
|
66
83
|
isKnowledgeGraphDependencies(arg) {
|
|
67
84
|
return arg.memory !== undefined;
|
|
68
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Storage options that pin every KG kv operation to a fixed, tool-independent
|
|
88
|
+
* namespace (the configured `code-intelligence:kg`) instead of the backend's
|
|
89
|
+
* default (`qe-kernel` for the CLI, `mcp-tools` for MCP). This gives CLI↔MCP
|
|
90
|
+
* parity — a graph indexed by one tool is readable by the other — and makes
|
|
91
|
+
* the init existence checks (`SELECT ... WHERE namespace = 'code-intelligence:kg'`)
|
|
92
|
+
* actually find the data (#511). Reads and writes MUST both pass this, or a
|
|
93
|
+
* write under the namespace cannot be read back (issue #491 Bug 2).
|
|
94
|
+
*/
|
|
95
|
+
get nsOpts() {
|
|
96
|
+
return { namespace: this.config.namespace };
|
|
97
|
+
}
|
|
69
98
|
/**
|
|
70
99
|
* Index files into the knowledge graph
|
|
71
100
|
*/
|
|
@@ -74,6 +103,10 @@ export class KnowledgeGraphService {
|
|
|
74
103
|
const errors = [];
|
|
75
104
|
let nodesCreated = 0;
|
|
76
105
|
let edgesCreated = 0;
|
|
106
|
+
// #511 req #2: count files indexed under a language with no dependency
|
|
107
|
+
// extractor, keyed by extension, so we can warn loudly instead of silently
|
|
108
|
+
// reporting a graph that `deps` then shows as 0 edges.
|
|
109
|
+
const unsupportedByExt = new Map();
|
|
77
110
|
try {
|
|
78
111
|
const { paths, incremental = false, includeTests = true, languages } = request;
|
|
79
112
|
// Clear existing graph if not incremental
|
|
@@ -93,8 +126,12 @@ export class KnowledgeGraphService {
|
|
|
93
126
|
if (!includeTests && this.isTestFile(path)) {
|
|
94
127
|
continue;
|
|
95
128
|
}
|
|
129
|
+
const ext = this.getFileExtension(path);
|
|
130
|
+
if (!DEP_EXTRACTOR_EXTENSIONS.has(ext)) {
|
|
131
|
+
unsupportedByExt.set(ext || '(none)', (unsupportedByExt.get(ext || '(none)') ?? 0) + 1);
|
|
132
|
+
}
|
|
96
133
|
// Index the file
|
|
97
|
-
const result = await this.indexFile(path);
|
|
134
|
+
const result = await this.indexFile(path, incremental);
|
|
98
135
|
nodesCreated += result.nodes;
|
|
99
136
|
edgesCreated += result.edges;
|
|
100
137
|
}
|
|
@@ -106,6 +143,19 @@ export class KnowledgeGraphService {
|
|
|
106
143
|
}
|
|
107
144
|
}
|
|
108
145
|
const duration = Date.now() - startTime;
|
|
146
|
+
// #511 req #2: surface a loud warning for unsupported languages so the
|
|
147
|
+
// caller understands why `deps`/`impact` will be empty for those files.
|
|
148
|
+
const warnings = [];
|
|
149
|
+
if (unsupportedByExt.size > 0) {
|
|
150
|
+
const supported = Array.from(DEP_EXTRACTOR_EXTENSIONS).join(', ');
|
|
151
|
+
for (const [ext, count] of unsupportedByExt) {
|
|
152
|
+
const msg = `${count} file(s) with extension '.${ext}' were indexed as plain ` +
|
|
153
|
+
`nodes: no dependency extractor for this language, so 'deps'/'impact' ` +
|
|
154
|
+
`will report 0 edges for them. Supported: ${supported}.`;
|
|
155
|
+
warnings.push(msg);
|
|
156
|
+
logger.warn(msg);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
109
159
|
// Store indexing metadata
|
|
110
160
|
await this.storeIndexMetadata({
|
|
111
161
|
filesIndexed: paths.length - errors.length,
|
|
@@ -120,6 +170,7 @@ export class KnowledgeGraphService {
|
|
|
120
170
|
edgesCreated,
|
|
121
171
|
duration,
|
|
122
172
|
errors,
|
|
173
|
+
warnings,
|
|
123
174
|
});
|
|
124
175
|
}
|
|
125
176
|
catch (error) {
|
|
@@ -180,7 +231,7 @@ export class KnowledgeGraphService {
|
|
|
180
231
|
}
|
|
181
232
|
// Load from memory
|
|
182
233
|
const key = `${this.config.namespace}:node:${nodeId}`;
|
|
183
|
-
const node = await this.memory.get(key);
|
|
234
|
+
const node = await this.memory.get(key, this.nsOpts);
|
|
184
235
|
if (node) {
|
|
185
236
|
this.nodeCache.set(nodeId, node);
|
|
186
237
|
}
|
|
@@ -190,34 +241,83 @@ export class KnowledgeGraphService {
|
|
|
190
241
|
* Get edges for a node
|
|
191
242
|
*/
|
|
192
243
|
async getEdges(nodeId, direction) {
|
|
193
|
-
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
244
|
+
// Hydrate the full edge set from persistence once, then filter in-memory.
|
|
245
|
+
// This is required for cross-process reads (deps/search run as separate
|
|
246
|
+
// CLI processes from index) and for correct incoming/both lookups, which
|
|
247
|
+
// the old source-keyed edgeIndex could not serve (#511).
|
|
248
|
+
const allEdges = await this.loadAllEdges();
|
|
249
|
+
return this.filterEdgesByDirection(allEdges, nodeId, direction);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Load all persisted edges into a flat cache (#511).
|
|
253
|
+
* Cached for the lifetime of the read; invalidated by createEdge()/clear().
|
|
254
|
+
*/
|
|
255
|
+
async loadAllEdges() {
|
|
256
|
+
if (this.allEdgesCache) {
|
|
257
|
+
return this.allEdgesCache;
|
|
198
258
|
}
|
|
199
|
-
|
|
259
|
+
const edges = [];
|
|
200
260
|
const pattern = `${this.config.namespace}:edge:*`;
|
|
201
|
-
const keys = await this.memory.search(pattern, this.
|
|
261
|
+
const keys = await this.memory.search(pattern, Number.MAX_SAFE_INTEGER, this.nsOpts);
|
|
202
262
|
for (const key of keys) {
|
|
203
|
-
const edge = await this.memory.get(key);
|
|
263
|
+
const edge = await this.memory.get(key, this.nsOpts);
|
|
204
264
|
if (edge) {
|
|
205
|
-
|
|
206
|
-
(direction !== 'incoming' && edge.source === nodeId);
|
|
207
|
-
if (matches) {
|
|
208
|
-
edges.push(edge);
|
|
209
|
-
}
|
|
265
|
+
edges.push(edge);
|
|
210
266
|
}
|
|
211
267
|
}
|
|
268
|
+
this.allEdgesCache = edges;
|
|
212
269
|
return edges;
|
|
213
270
|
}
|
|
214
271
|
/**
|
|
215
272
|
* Clear the knowledge graph
|
|
216
273
|
*/
|
|
217
274
|
async clear() {
|
|
218
|
-
// Cache-only: just clear in-memory caches, no kv_store cleanup needed
|
|
219
275
|
this.nodeCache.clear();
|
|
220
276
|
this.edgeIndex.clear();
|
|
277
|
+
this.allEdgesCache = undefined;
|
|
278
|
+
// Delete persisted nodes/edges so a non-incremental re-index does not
|
|
279
|
+
// accumulate stale graph state across runs (#511). Scoped to the KG
|
|
280
|
+
// namespace's :node:/:edge: keys only — never touches learning data.
|
|
281
|
+
for (const prefix of [
|
|
282
|
+
`${this.config.namespace}:node:`,
|
|
283
|
+
`${this.config.namespace}:edge:`,
|
|
284
|
+
]) {
|
|
285
|
+
const keys = await this.memory.search(`${prefix}*`, Number.MAX_SAFE_INTEGER, this.nsOpts);
|
|
286
|
+
for (const key of keys) {
|
|
287
|
+
await this.memory.delete(key, this.nsOpts);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Remove a single file's contribution to the graph (#511).
|
|
293
|
+
*
|
|
294
|
+
* Deletes the file node, its entity nodes, and edges that ORIGINATE from the
|
|
295
|
+
* file or its entities (contains + outgoing imports). Incoming edges (other
|
|
296
|
+
* files importing this one) are left intact — they belong to those files and
|
|
297
|
+
* remain valid until those files are themselves re-indexed. Used for
|
|
298
|
+
* incremental re-indexing so stale entities/imports don't persist.
|
|
299
|
+
*/
|
|
300
|
+
async removeFileFromGraph(filePath) {
|
|
301
|
+
const fileNodeId = this.pathToNodeId(filePath);
|
|
302
|
+
const ns = this.config.namespace;
|
|
303
|
+
// Delete the file node and all of its entity nodes (`:node:<file>` and
|
|
304
|
+
// `:node:<file>:<type>:<name>`).
|
|
305
|
+
const nodeKeys = await this.memory.search(`${ns}:node:${fileNodeId}*`, Number.MAX_SAFE_INTEGER, this.nsOpts);
|
|
306
|
+
for (const key of nodeKeys) {
|
|
307
|
+
await this.memory.delete(key, this.nsOpts);
|
|
308
|
+
this.nodeCache.delete(key.slice(`${ns}:node:`.length));
|
|
309
|
+
}
|
|
310
|
+
// Delete edges whose source is the file node or one of its entity nodes.
|
|
311
|
+
const edgeKeys = await this.memory.search(`${ns}:edge:*`, Number.MAX_SAFE_INTEGER, this.nsOpts);
|
|
312
|
+
for (const key of edgeKeys) {
|
|
313
|
+
const edge = await this.memory.get(key, this.nsOpts);
|
|
314
|
+
if (edge && (edge.source === fileNodeId || edge.source.startsWith(`${fileNodeId}:`))) {
|
|
315
|
+
await this.memory.delete(key, this.nsOpts);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// Drop the file's source-keyed cache entry and invalidate the flat cache.
|
|
319
|
+
this.edgeIndex.delete(fileNodeId);
|
|
320
|
+
this.allEdgesCache = undefined;
|
|
221
321
|
}
|
|
222
322
|
// ============================================================================
|
|
223
323
|
// ADR-051: LLM Enhancement Methods
|
|
@@ -409,9 +509,22 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
409
509
|
// ============================================================================
|
|
410
510
|
// Private Helper Methods
|
|
411
511
|
// ============================================================================
|
|
412
|
-
async indexFile(filePath) {
|
|
512
|
+
async indexFile(filePath, incremental = false) {
|
|
413
513
|
let nodesCreated = 0;
|
|
414
514
|
let edgesCreated = 0;
|
|
515
|
+
// #511: evict any cached content for this file before reading it. The
|
|
516
|
+
// FileReader caches content for 5 min, so in a long-lived process (e.g. the
|
|
517
|
+
// MCP server) a re-index would otherwise extract entities/imports from the
|
|
518
|
+
// STALE pre-edit text. Eviction guarantees fresh reads; the two reads within
|
|
519
|
+
// this method (entities + imports) still share one cache fill, so they stay
|
|
520
|
+
// mutually consistent.
|
|
521
|
+
this.fileReader.invalidateCache(filePath);
|
|
522
|
+
// #511: on an incremental re-index, drop this file's prior nodes/edges
|
|
523
|
+
// first so renamed/removed entities and stale outgoing imports don't
|
|
524
|
+
// linger as phantom dependencies. (A full index already cleared everything.)
|
|
525
|
+
if (incremental) {
|
|
526
|
+
await this.removeFileFromGraph(filePath);
|
|
527
|
+
}
|
|
415
528
|
// Create file node
|
|
416
529
|
const fileNode = await this.createFileNode(filePath);
|
|
417
530
|
nodesCreated++;
|
|
@@ -428,8 +541,12 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
428
541
|
// Extract imports/dependencies
|
|
429
542
|
const imports = await this.extractImports(filePath);
|
|
430
543
|
for (const importPath of imports) {
|
|
431
|
-
//
|
|
432
|
-
|
|
544
|
+
// Resolve relative specifiers to the actual file so the import edge
|
|
545
|
+
// targets the imported file's node id (#511). Without this, an edge to
|
|
546
|
+
// './math' never matches the '/abs/path/math.ts' file node and the
|
|
547
|
+
// dependency graph stays disconnected (all nodes degree-0).
|
|
548
|
+
const resolvedPath = this.resolveImportPath(importPath, filePath);
|
|
549
|
+
const targetNodeId = this.pathToNodeId(resolvedPath);
|
|
433
550
|
await this.createEdge(fileNode.id, targetNodeId, 'import');
|
|
434
551
|
edgesCreated++;
|
|
435
552
|
}
|
|
@@ -519,11 +636,14 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
519
636
|
target: targetId,
|
|
520
637
|
type,
|
|
521
638
|
};
|
|
522
|
-
//
|
|
523
|
-
// Update edge index
|
|
639
|
+
// Update in-memory edge index (source-keyed, used during same-process index)
|
|
524
640
|
const sourceEdges = this.edgeIndex.get(sourceId) || [];
|
|
525
641
|
sourceEdges.push(edge);
|
|
526
642
|
this.edgeIndex.set(sourceId, sourceEdges);
|
|
643
|
+
// Persist so cross-process reads (deps/search/impact) see the graph (#511).
|
|
644
|
+
await this.memory.set(`${this.config.namespace}:edge:${edgeId}`, edge, this.nsOpts);
|
|
645
|
+
// Invalidate hydrated read cache so subsequent getEdges() reflects this write.
|
|
646
|
+
this.allEdgesCache = undefined;
|
|
527
647
|
return edge;
|
|
528
648
|
}
|
|
529
649
|
async storeNode(node) {
|
|
@@ -537,70 +657,67 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
537
657
|
this.edgeIndex.delete(firstKey);
|
|
538
658
|
}
|
|
539
659
|
}
|
|
540
|
-
// Cache-only: KG is rebuilt from source on each init, no need for kv_store persistence
|
|
541
660
|
this.nodeCache.set(node.id, node);
|
|
661
|
+
// Persist so cross-process reads (deps/search/impact) see the graph (#511).
|
|
662
|
+
await this.memory.set(`${this.config.namespace}:node:${node.id}`, node, this.nsOpts);
|
|
542
663
|
}
|
|
543
664
|
async extractEntities(filePath) {
|
|
544
665
|
const extension = this.getFileExtension(filePath);
|
|
545
666
|
const entities = [];
|
|
546
|
-
//
|
|
547
|
-
|
|
667
|
+
// TS/JS files: prefer the bundled tree-sitter WASM grammars (typescript-free,
|
|
668
|
+
// works out of the box), and fall back to the TypeScript compiler API only if
|
|
669
|
+
// tree-sitter is unavailable AND `typescript` happens to be installed (#511).
|
|
670
|
+
if (DEP_EXTRACTOR_EXTENSIONS.has(extension)) {
|
|
548
671
|
const fileResult = await this.fileReader.readFile(filePath);
|
|
672
|
+
const fileName = this.getFileName(filePath);
|
|
549
673
|
if (fileResult.success) {
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
name: cls.name,
|
|
569
|
-
line: cls.startLine,
|
|
570
|
-
visibility: 'public',
|
|
571
|
-
isAsync: false,
|
|
572
|
-
});
|
|
573
|
-
// Add class methods as entities
|
|
574
|
-
for (const method of cls.methods) {
|
|
575
|
-
entities.push({
|
|
576
|
-
type: 'function',
|
|
577
|
-
name: `${cls.name}.${method.name}`,
|
|
578
|
-
line: method.startLine,
|
|
579
|
-
visibility: method.visibility,
|
|
580
|
-
isAsync: method.isAsync,
|
|
581
|
-
});
|
|
674
|
+
let extracted = false;
|
|
675
|
+
// Primary: tree-sitter
|
|
676
|
+
try {
|
|
677
|
+
const ts = await extractTsJs(fileResult.value, extension);
|
|
678
|
+
if (ts) {
|
|
679
|
+
for (const f of ts.functions) {
|
|
680
|
+
entities.push({ type: 'function', name: f.name, line: f.startLine, visibility: f.visibility, isAsync: f.isAsync });
|
|
681
|
+
}
|
|
682
|
+
for (const c of ts.classes) {
|
|
683
|
+
entities.push({ type: 'class', name: c.name, line: c.startLine, visibility: 'public', isAsync: false });
|
|
684
|
+
for (const m of c.methods) {
|
|
685
|
+
entities.push({ type: 'function', name: `${c.name}.${m.name}`, line: m.startLine, visibility: m.visibility, isAsync: m.isAsync });
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
for (const iface of ts.interfaces) {
|
|
689
|
+
entities.push({ type: 'interface', name: iface.name, line: iface.startLine, visibility: 'public', isAsync: false });
|
|
690
|
+
}
|
|
691
|
+
extracted = true;
|
|
582
692
|
}
|
|
583
693
|
}
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
for (const iface of interfaces) {
|
|
587
|
-
entities.push({
|
|
588
|
-
type: 'interface',
|
|
589
|
-
name: iface.name,
|
|
590
|
-
line: iface.startLine,
|
|
591
|
-
visibility: 'public',
|
|
592
|
-
isAsync: false,
|
|
593
|
-
});
|
|
694
|
+
catch {
|
|
695
|
+
// tree-sitter unavailable — fall through to the TS compiler path
|
|
594
696
|
}
|
|
595
|
-
//
|
|
697
|
+
// Fallback: TypeScript compiler API (only when tree-sitter didn't run).
|
|
698
|
+
if (!extracted) {
|
|
699
|
+
try {
|
|
700
|
+
const ast = this.tsParser.parseFile(fileName, fileResult.value);
|
|
701
|
+
for (const func of this.tsParser.extractFunctions(ast)) {
|
|
702
|
+
entities.push({ type: 'function', name: func.name, line: func.startLine, visibility: 'public', isAsync: func.isAsync });
|
|
703
|
+
}
|
|
704
|
+
for (const cls of this.tsParser.extractClasses(ast)) {
|
|
705
|
+
entities.push({ type: 'class', name: cls.name, line: cls.startLine, visibility: 'public', isAsync: false });
|
|
706
|
+
for (const method of cls.methods) {
|
|
707
|
+
entities.push({ type: 'function', name: `${cls.name}.${method.name}`, line: method.startLine, visibility: method.visibility, isAsync: method.isAsync });
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
for (const iface of this.tsParser.extractInterfaces(ast)) {
|
|
711
|
+
entities.push({ type: 'interface', name: iface.name, line: iface.startLine, visibility: 'public', isAsync: false });
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
catch {
|
|
715
|
+
// Neither tree-sitter nor the TypeScript compiler is available.
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
// If nothing was extracted, record a module entity for the file.
|
|
596
719
|
if (entities.length === 0) {
|
|
597
|
-
entities.push({
|
|
598
|
-
type: 'module',
|
|
599
|
-
name: fileName.replace(/\.[^.]+$/, ''),
|
|
600
|
-
line: 1,
|
|
601
|
-
visibility: 'public',
|
|
602
|
-
isAsync: false,
|
|
603
|
-
});
|
|
720
|
+
entities.push({ type: 'module', name: fileName.replace(/\.[^.]+$/, ''), line: 1, visibility: 'public', isAsync: false });
|
|
604
721
|
}
|
|
605
722
|
}
|
|
606
723
|
else {
|
|
@@ -700,19 +817,35 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
700
817
|
async extractImports(filePath) {
|
|
701
818
|
const extension = this.getFileExtension(filePath);
|
|
702
819
|
const importPaths = [];
|
|
703
|
-
//
|
|
704
|
-
if (
|
|
820
|
+
// TS/JS: tree-sitter primary (typescript-free), TS compiler fallback (#511).
|
|
821
|
+
if (DEP_EXTRACTOR_EXTENSIONS.has(extension)) {
|
|
705
822
|
const fileResult = await this.fileReader.readFile(filePath);
|
|
706
823
|
if (fileResult.success) {
|
|
707
824
|
const fileName = this.getFileName(filePath);
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
825
|
+
let modules = null;
|
|
826
|
+
// Primary: tree-sitter
|
|
827
|
+
try {
|
|
828
|
+
const ts = await extractTsJs(fileResult.value, extension);
|
|
829
|
+
if (ts)
|
|
830
|
+
modules = ts.imports;
|
|
831
|
+
}
|
|
832
|
+
catch {
|
|
833
|
+
modules = null;
|
|
834
|
+
}
|
|
835
|
+
// Fallback: TypeScript compiler API
|
|
836
|
+
if (modules === null) {
|
|
837
|
+
try {
|
|
838
|
+
const ast = this.tsParser.parseFile(fileName, fileResult.value);
|
|
839
|
+
modules = this.tsParser.extractImports(ast).map((i) => i.module);
|
|
840
|
+
}
|
|
841
|
+
catch {
|
|
842
|
+
modules = [];
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
for (const module of modules) {
|
|
713
846
|
// Skip node built-ins for now
|
|
714
|
-
if (!
|
|
715
|
-
importPaths.push(
|
|
847
|
+
if (!module.startsWith('node:')) {
|
|
848
|
+
importPaths.push(module);
|
|
716
849
|
}
|
|
717
850
|
}
|
|
718
851
|
}
|
|
@@ -807,9 +940,9 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
807
940
|
async findNodesByLabel(label, limit) {
|
|
808
941
|
const nodes = [];
|
|
809
942
|
const pattern = `${this.config.namespace}:node:*`;
|
|
810
|
-
const keys = await this.memory.search(pattern, limit * 2);
|
|
943
|
+
const keys = await this.memory.search(pattern, limit * 2, this.nsOpts);
|
|
811
944
|
for (const key of keys) {
|
|
812
|
-
const node = await this.memory.get(key);
|
|
945
|
+
const node = await this.memory.get(key, this.nsOpts);
|
|
813
946
|
if (node && node.label === label) {
|
|
814
947
|
nodes.push(node);
|
|
815
948
|
if (nodes.length >= limit)
|
|
@@ -847,10 +980,10 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
847
980
|
// Fallback to keyword matching
|
|
848
981
|
const keywords = query.toLowerCase().split(/\s+/);
|
|
849
982
|
const pattern = `${this.config.namespace}:node:*`;
|
|
850
|
-
const keys = await this.memory.search(pattern, limit * 3);
|
|
983
|
+
const keys = await this.memory.search(pattern, limit * 3, this.nsOpts);
|
|
851
984
|
const nodes = [];
|
|
852
985
|
for (const key of keys) {
|
|
853
|
-
const node = await this.memory.get(key);
|
|
986
|
+
const node = await this.memory.get(key, this.nsOpts);
|
|
854
987
|
if (node) {
|
|
855
988
|
const nodeText = JSON.stringify(node.properties).toLowerCase();
|
|
856
989
|
if (keywords.some((kw) => nodeText.includes(kw))) {
|
|
@@ -882,7 +1015,12 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
882
1015
|
visited.add(file);
|
|
883
1016
|
path.push(file);
|
|
884
1017
|
const nodeId = this.pathToNodeId(file);
|
|
885
|
-
|
|
1018
|
+
// Only true dependency edges (import/call/extends/implements) belong in a
|
|
1019
|
+
// dependency map — exclude structural 'contains' (file→entity) edges so the
|
|
1020
|
+
// graph stays a file-to-file dependency view and entities don't leak in as
|
|
1021
|
+
// pseudo file nodes (#511).
|
|
1022
|
+
const DEPENDENCY_EDGE_TYPES = new Set(['import', 'call', 'extends', 'implements']);
|
|
1023
|
+
const fileEdges = (await this.getEdges(nodeId, direction)).filter((e) => DEPENDENCY_EDGE_TYPES.has(e.type));
|
|
886
1024
|
// Create dependency node
|
|
887
1025
|
const inDegree = fileEdges.filter((e) => e.target === nodeId).length;
|
|
888
1026
|
const outDegree = fileEdges.filter((e) => e.source === nodeId).length;
|
|
@@ -903,10 +1041,15 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
903
1041
|
if (!edges.some((e) => e.source === depEdge.source && e.target === depEdge.target)) {
|
|
904
1042
|
edges.push(depEdge);
|
|
905
1043
|
}
|
|
906
|
-
//
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
1044
|
+
// Recurse only along directed-forward (outgoing) edges so the traversal
|
|
1045
|
+
// path represents a real directed dependency chain. Following 'both'
|
|
1046
|
+
// adjacency backwards fabricated cycles like A→B→A (#511). Incoming
|
|
1047
|
+
// neighbours are still surfaced as edges/degrees above and are visited
|
|
1048
|
+
// as their own top-level entries.
|
|
1049
|
+
if (edge.source !== nodeId) {
|
|
1050
|
+
continue;
|
|
1051
|
+
}
|
|
1052
|
+
const nextFile = this.nodeIdToPath(edge.target);
|
|
910
1053
|
if (nextFile) {
|
|
911
1054
|
await this.traverseDependencies(nextFile, direction, depth - 1, visited, nodes, edges, path, cycles);
|
|
912
1055
|
}
|
|
@@ -968,7 +1111,8 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
968
1111
|
return edge.target === nodeId;
|
|
969
1112
|
if (direction === 'outgoing')
|
|
970
1113
|
return edge.source === nodeId;
|
|
971
|
-
|
|
1114
|
+
// 'both': edge touches nodeId on either end
|
|
1115
|
+
return edge.source === nodeId || edge.target === nodeId;
|
|
972
1116
|
});
|
|
973
1117
|
}
|
|
974
1118
|
async storeIndexMetadata(_metadata) {
|
|
@@ -1015,6 +1159,47 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
1015
1159
|
pathToNodeId(path) {
|
|
1016
1160
|
return path.replace(/[/\\]/g, ':').replace(/\./g, '_');
|
|
1017
1161
|
}
|
|
1162
|
+
/**
|
|
1163
|
+
* Resolve an import specifier to a concrete file path (#511).
|
|
1164
|
+
*
|
|
1165
|
+
* Relative specifiers ('./math', '../util') are resolved against the
|
|
1166
|
+
* importing file's directory and probed for the usual TS/JS extensions and
|
|
1167
|
+
* index files, so the resulting node id matches the imported file's node.
|
|
1168
|
+
* Bare package specifiers ('react', '@scope/pkg') are returned unchanged and
|
|
1169
|
+
* become external dependency nodes.
|
|
1170
|
+
*/
|
|
1171
|
+
resolveImportPath(importPath, fromFile) {
|
|
1172
|
+
if (!importPath.startsWith('.')) {
|
|
1173
|
+
return importPath;
|
|
1174
|
+
}
|
|
1175
|
+
const base = resolvePath(dirname(fromFile), importPath);
|
|
1176
|
+
const candidates = [
|
|
1177
|
+
base,
|
|
1178
|
+
`${base}.ts`,
|
|
1179
|
+
`${base}.tsx`,
|
|
1180
|
+
`${base}.js`,
|
|
1181
|
+
`${base}.jsx`,
|
|
1182
|
+
`${base}.mjs`,
|
|
1183
|
+
`${base}.cjs`,
|
|
1184
|
+
joinPath(base, 'index.ts'),
|
|
1185
|
+
joinPath(base, 'index.tsx'),
|
|
1186
|
+
joinPath(base, 'index.js'),
|
|
1187
|
+
joinPath(base, 'index.jsx'),
|
|
1188
|
+
];
|
|
1189
|
+
for (const candidate of candidates) {
|
|
1190
|
+
try {
|
|
1191
|
+
if (existsSync(candidate) && statSync(candidate).isFile()) {
|
|
1192
|
+
return candidate;
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
catch {
|
|
1196
|
+
// ignore unreadable candidates and keep probing
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
// Fall back to a '.ts' sibling so extensionless imports still link to a
|
|
1200
|
+
// stable node id even when the file cannot be found on disk.
|
|
1201
|
+
return `${base}.ts`;
|
|
1202
|
+
}
|
|
1018
1203
|
nodeIdToPath(nodeId) {
|
|
1019
1204
|
// Reverse the nodeId transformation
|
|
1020
1205
|
const path = nodeId.replace(/:/g, '/').replace(/_(?=[^_]*$)/, '.');
|
|
@@ -105,8 +105,14 @@ export class SemanticAnalyzerService {
|
|
|
105
105
|
...metadata,
|
|
106
106
|
indexedAt: new Date().toISOString(),
|
|
107
107
|
});
|
|
108
|
-
// Store content for retrieval
|
|
109
|
-
|
|
108
|
+
// Store content for retrieval.
|
|
109
|
+
// The key is already fully namespace-qualified, so do NOT also pass a
|
|
110
|
+
// {namespace} store option: every read path (semanticSearch/findSimilar/
|
|
111
|
+
// exact/fuzzy) and the storeVector() embedding write use the default
|
|
112
|
+
// namespace, and a write with {namespace} could not be read back without
|
|
113
|
+
// the same option (issue #491 Bug 2) — which silently dropped every
|
|
114
|
+
// search result (#511 follow-up).
|
|
115
|
+
await this.memory.set(`${this.config.namespace}:content:${this.fileToKey(file)}`, { file, content, metadata });
|
|
110
116
|
return ok(undefined);
|
|
111
117
|
}
|
|
112
118
|
catch (error) {
|
|
@@ -859,7 +859,7 @@ export class ContractTestingCoordinator extends BaseDomainCoordinator {
|
|
|
859
859
|
// Get SARSA prediction for ordering strategy
|
|
860
860
|
const prediction = await this.sarsaAlgorithm.predict(state);
|
|
861
861
|
// Apply the suggested ordering strategy
|
|
862
|
-
|
|
862
|
+
const prioritized = [...contracts];
|
|
863
863
|
let strategy = 'default';
|
|
864
864
|
switch (prediction.action.type) {
|
|
865
865
|
case 'sequence-early':
|
|
@@ -682,8 +682,10 @@ export class CoverageAnalysisCoordinator extends BaseDomainCoordinator {
|
|
|
682
682
|
case 'daily':
|
|
683
683
|
return `${year}-${month}-${day}`;
|
|
684
684
|
case 'weekly':
|
|
685
|
-
|
|
686
|
-
|
|
685
|
+
{
|
|
686
|
+
const weekNum = Math.floor(day / 7);
|
|
687
|
+
return `${year}-${month}-W${weekNum}`;
|
|
688
|
+
}
|
|
687
689
|
case 'monthly':
|
|
688
690
|
return `${year}-${month}`;
|
|
689
691
|
}
|
|
@@ -12,6 +12,7 @@ import { LearningOptimizationEvents, createEvent, } from '../../shared/events/do
|
|
|
12
12
|
import { LearningCoordinatorService, TransferSpecialistService, MetricsOptimizerService, ProductionIntelService, } from './services/index.js';
|
|
13
13
|
import { createPersistentSONAEngine, } from '../../integrations/ruvector/sona-persistence.js';
|
|
14
14
|
import { createDreamScheduler, createDreamEngine, } from '../../learning/dream/index.js';
|
|
15
|
+
// V3 Integration: MinCut Awareness (ADR-047) - only import types needed beyond base
|
|
15
16
|
// CQ-002: Base domain coordinator
|
|
16
17
|
import { BaseDomainCoordinator, } from '../base-domain-coordinator.js';
|
|
17
18
|
// CQ-004: Extracted modules
|