agentic-qe 3.9.2 → 3.9.4
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/CHANGELOG.md +53 -0
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-5ODIX6ZG.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-AKAOHSCX.js → agent-booster-wasm-MGGEPROV.js} +2 -2
- package/dist/cli/chunks/{agent-handler-MTGPOUVP.js → agent-handler-AFHYFQXV.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-UFPKWUFK.js → agent-memory-branch-SQ3KDIG6.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-PWGRS6KK.js +2 -0
- package/dist/cli/chunks/{audit-VBEZHNHO.js → audit-SM5CK2K5.js} +2 -2
- package/dist/cli/chunks/base-TJGIYR7L.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-IRPHIXRU.js → better-sqlite3-UGOYRNXI.js} +2 -2
- package/dist/cli/chunks/{brain-handler-7EO3FFRZ.js → brain-handler-SKXTB63O.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-MZRGP35N.js → branch-enumerator-77NSOLNK.js} +2 -2
- package/dist/cli/chunks/{browser-VSIWQE7J.js → browser-MCE5DWPV.js} +2 -2
- package/dist/cli/chunks/browser-workflow-GUR7RLFP.js +2 -0
- package/dist/cli/chunks/{chunk-5RL66XSH.js → chunk-27FNBMUC.js} +2 -2
- package/dist/cli/chunks/{chunk-FRJLP7IB.js → chunk-27P4VTCY.js} +2 -2
- package/dist/cli/chunks/{chunk-2VVV73PW.js → chunk-2JLKOGNU.js} +1 -1
- package/dist/cli/chunks/{chunk-PJFLO37I.js → chunk-2MQMXI7C.js} +2 -2
- package/dist/cli/chunks/{chunk-BKCTNRC5.js → chunk-3MN7E6HY.js} +2 -2
- package/dist/cli/chunks/{chunk-BY47GV4T.js → chunk-3MRFR534.js} +2 -2
- package/dist/cli/chunks/{chunk-563PJBDM.js → chunk-3RHIPCBG.js} +2 -2
- package/dist/cli/chunks/{chunk-WXWY2GAF.js → chunk-3SPYUOSS.js} +2 -2
- package/dist/cli/chunks/{chunk-5AUKULWO.js → chunk-4BQTEPAD.js} +2 -2
- package/dist/cli/chunks/{chunk-N3F3CX4V.js → chunk-4GJAYXB7.js} +2 -2
- package/dist/cli/chunks/{chunk-7NOIIC7G.js → chunk-4TZTGYBQ.js} +1 -1
- package/dist/cli/chunks/{chunk-VL7YOOC2.js → chunk-53M65YFH.js} +2 -2
- package/dist/cli/chunks/{chunk-QNBQBSAI.js → chunk-54OLXGXJ.js} +2 -2
- package/dist/cli/chunks/{chunk-HW4ISY5B.js → chunk-5UKAEBKC.js} +3 -3
- package/dist/cli/chunks/{chunk-CQP7ZFME.js → chunk-72EC26AS.js} +2 -2
- package/dist/cli/chunks/{chunk-J4BS6IWE.js → chunk-7EL65Y27.js} +1 -1
- package/dist/cli/chunks/{chunk-PFNFC43Q.js → chunk-7FJIIB4H.js} +1 -1
- package/dist/cli/chunks/{chunk-AKSJQ6B3.js → chunk-7ST2YENJ.js} +2 -2
- package/dist/cli/chunks/{chunk-SNVM4YJS.js → chunk-7ZXNJT4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-BOH22AKC.js → chunk-A6ZBQCYB.js} +2 -2
- package/dist/cli/chunks/{chunk-VHVWAXCF.js → chunk-B252DDC5.js} +1 -1
- package/dist/cli/chunks/{chunk-2EC5Z2J4.js → chunk-B6HLXE3D.js} +9 -9
- package/dist/cli/chunks/{chunk-L5WZUPZF.js → chunk-BH5XPYA3.js} +2 -2
- package/dist/cli/chunks/{chunk-LMMEUVE5.js → chunk-BZ22GI4E.js} +1 -1
- package/dist/cli/chunks/{chunk-YXCU4CJX.js → chunk-C2HGOUEB.js} +1 -1
- package/dist/cli/chunks/{chunk-JV7LX6OT.js → chunk-C3BXT3ZC.js} +4 -4
- package/dist/cli/chunks/{chunk-3GZKAORV.js → chunk-C567IO5M.js} +2 -2
- package/dist/cli/chunks/{chunk-SCF7NRVE.js → chunk-COIRFVFO.js} +1 -1
- package/dist/cli/chunks/{chunk-RITN3XR4.js → chunk-DHJJJ24V.js} +2 -2
- package/dist/cli/chunks/{chunk-RC5CPXON.js → chunk-DLMEBVLF.js} +2 -2
- package/dist/cli/chunks/{chunk-XFMKJ3UD.js → chunk-DZHGYZJP.js} +1 -1
- package/dist/cli/chunks/{chunk-V6XBAZNH.js → chunk-EEARIB4C.js} +1 -1
- package/dist/cli/chunks/{chunk-NM6TIEJ3.js → chunk-EFD2J6GG.js} +3 -3
- package/dist/cli/chunks/{chunk-Z5HXGVXZ.js → chunk-EHGTXIT7.js} +1 -1
- package/dist/cli/chunks/{chunk-QODE4LM6.js → chunk-ENKPW6MA.js} +2 -2
- package/dist/cli/chunks/{chunk-4PKXIBX2.js → chunk-EZTUUOVI.js} +1 -1
- package/dist/cli/chunks/{chunk-SDTVHR63.js → chunk-F6AU2MAZ.js} +2 -2
- package/dist/cli/chunks/{chunk-GK72GUHA.js → chunk-G6RTCJFY.js} +2 -2
- package/dist/cli/chunks/{chunk-E25S5E2D.js → chunk-G72E5DL3.js} +1 -1
- package/dist/cli/chunks/{chunk-FUIHWBVF.js → chunk-GAG2P4I2.js} +1 -1
- package/dist/cli/chunks/{chunk-KDDZYXP4.js → chunk-GQ7DCSKS.js} +2 -2
- package/dist/cli/chunks/{chunk-WG4GHAML.js → chunk-GSKZL36U.js} +2 -2
- package/dist/cli/chunks/{chunk-Z2IKNC5M.js → chunk-GT35EJKR.js} +1 -1
- package/dist/cli/chunks/{chunk-56IWS2KY.js → chunk-GVFHRHXC.js} +2 -2
- package/dist/cli/chunks/{chunk-CCYMJKWX.js → chunk-GX7MEHQ2.js} +1 -1
- package/dist/cli/chunks/{chunk-4UH25U4O.js → chunk-HKTNFHWI.js} +1 -1
- package/dist/cli/chunks/{chunk-X6LCMOGC.js → chunk-IGJ472XJ.js} +2 -2
- package/dist/cli/chunks/{chunk-XH53ARZD.js → chunk-IQE6GOH6.js} +2 -2
- package/dist/cli/chunks/{chunk-RJROC5M3.js → chunk-J222JLZ6.js} +2 -2
- package/dist/cli/chunks/{chunk-DSE57A5N.js → chunk-J6KBI5NW.js} +1 -1
- package/dist/cli/chunks/{chunk-CQBSGYRA.js → chunk-J72Q6ERO.js} +2 -2
- package/dist/cli/chunks/{chunk-ICDXWIFZ.js → chunk-JMBUIVVE.js} +1 -1
- package/dist/cli/chunks/{chunk-6SOJVEU7.js → chunk-JVUNZBKX.js} +2 -2
- package/dist/cli/chunks/{chunk-MN742FIH.js → chunk-KELYPHMV.js} +2 -2
- package/dist/cli/chunks/{chunk-DHE66JRR.js → chunk-KSMQH2CV.js} +1 -1
- package/dist/cli/chunks/{chunk-GPLERTZU.js → chunk-LH3ZL2OK.js} +2 -2
- package/dist/cli/chunks/{chunk-GITD7SRQ.js → chunk-LW3DV23G.js} +2 -2
- package/dist/cli/chunks/chunk-MDFXPCBO.js +2 -0
- package/dist/cli/chunks/{chunk-KZUJBZ7B.js → chunk-MGRE767N.js} +2 -2
- package/dist/cli/chunks/{chunk-DBE34QES.js → chunk-MN2MYLVW.js} +2 -2
- package/dist/cli/chunks/{chunk-25LFUL2K.js → chunk-MR5I6UR2.js} +2 -2
- package/dist/cli/chunks/{chunk-S3RDH5CI.js → chunk-MS6LTE4L.js} +2 -2
- package/dist/cli/chunks/{chunk-QEQTC4WQ.js → chunk-MUX762XZ.js} +2 -2
- package/dist/cli/chunks/{chunk-4Z27TRQF.js → chunk-NEYZXYFH.js} +2 -2
- package/dist/cli/chunks/{chunk-7SLN2JGP.js → chunk-NRH2QE4X.js} +3 -3
- package/dist/cli/chunks/{chunk-CL3K5EJK.js → chunk-NS4CCCTZ.js} +2 -2
- package/dist/cli/chunks/{chunk-NJY7ZA77.js → chunk-NZ5LY2BT.js} +1 -1
- package/dist/cli/chunks/{chunk-UKDOMLBI.js → chunk-O6QAOPUA.js} +3 -3
- package/dist/cli/chunks/{chunk-QPRVX4H2.js → chunk-OHZ6RJLS.js} +2 -2
- package/dist/cli/chunks/{chunk-DNLMZTE2.js → chunk-ONOYANDX.js} +1 -1
- package/dist/cli/chunks/chunk-OZC42UMD.js +2 -0
- package/dist/cli/chunks/{chunk-34U7JDCN.js → chunk-P3EOWBME.js} +2 -2
- package/dist/cli/chunks/{chunk-4DAOZQ3V.js → chunk-Q2ZYUIS2.js} +2 -2
- package/dist/cli/chunks/{chunk-RQGYJK7H.js → chunk-Q6FSXNQP.js} +2 -2
- package/dist/cli/chunks/{chunk-X35GP7TR.js → chunk-QEYPK7KS.js} +1 -1
- package/dist/cli/chunks/{chunk-T5GV6UIO.js → chunk-QOU4R6AF.js} +2 -2
- package/dist/cli/chunks/{chunk-KZTO5EVM.js → chunk-QPC4STR6.js} +2 -2
- package/dist/cli/chunks/{chunk-4FT3PND7.js → chunk-QVZSIFSJ.js} +3 -3
- package/dist/cli/chunks/{chunk-GCMVJS5X.js → chunk-RAZ2PGZD.js} +2 -2
- package/dist/cli/chunks/{chunk-727BDQ3K.js → chunk-RE6XD6RI.js} +2 -2
- package/dist/cli/chunks/{chunk-STE42EMB.js → chunk-RGRYL4MG.js} +2 -2
- package/dist/cli/chunks/{chunk-XYJL6DKI.js → chunk-RN3SN4ZC.js} +2 -2
- package/dist/cli/chunks/{chunk-JOVINE23.js → chunk-RPYUKEAH.js} +2 -2
- package/dist/cli/chunks/{chunk-5L6AU3QK.js → chunk-RRQEIGLS.js} +2 -2
- package/dist/cli/chunks/{chunk-VUAO4VFC.js → chunk-RS7ZGWHV.js} +2 -2
- package/dist/cli/chunks/{chunk-KTYUCZEM.js → chunk-RTC3ZCPK.js} +5 -5
- package/dist/cli/chunks/{chunk-4LA7IW3V.js → chunk-RUJU5XEQ.js} +1 -1
- package/dist/cli/chunks/{chunk-SRRFWTNF.js → chunk-SHJZ3YNX.js} +2 -2
- package/dist/cli/chunks/{chunk-FAXVVLPL.js → chunk-SKWI5QBM.js} +2 -2
- package/dist/cli/chunks/{chunk-NRCKGXJJ.js → chunk-TNWTQWLL.js} +1 -1
- package/dist/cli/chunks/{chunk-KBA7FBK3.js → chunk-TT2TB6UF.js} +3 -3
- package/dist/cli/chunks/{chunk-Z54EO6E6.js → chunk-U7YC7VCM.js} +2 -2
- package/dist/cli/chunks/{chunk-TKF447CW.js → chunk-UJLSCJJS.js} +1 -1
- package/dist/cli/chunks/{chunk-MY4LMIG7.js → chunk-UPJZRDZK.js} +2 -2
- package/dist/cli/chunks/{chunk-KQTJ2YLI.js → chunk-UUL3D5HR.js} +4 -4
- package/dist/cli/chunks/{chunk-TTOE336G.js → chunk-V57PXZIK.js} +3 -3
- package/dist/cli/chunks/{chunk-SGAW2WLI.js → chunk-VBXJBXMG.js} +4 -4
- package/dist/cli/chunks/{chunk-BIVIPF4O.js → chunk-VBYREHZI.js} +1 -1
- package/dist/cli/chunks/{chunk-PNL5G6TE.js → chunk-VFXTZWNF.js} +2 -2
- package/dist/cli/chunks/{chunk-2WBCYSUN.js → chunk-VSNPI2NO.js} +8 -8
- package/dist/cli/chunks/{chunk-Y6O7CDLI.js → chunk-WHT46PJM.js} +2 -2
- package/dist/cli/chunks/{chunk-L5YEPSDU.js → chunk-XB5HXTL4.js} +2 -2
- package/dist/cli/chunks/{chunk-4FMHBBG5.js → chunk-XYVMKCSI.js} +1 -1
- package/dist/cli/chunks/{chunk-AA33R5U4.js → chunk-YDJKQKQH.js} +2 -2
- package/dist/cli/chunks/{chunk-4D2ZG2QO.js → chunk-YS6C2Q4F.js} +1 -1
- package/dist/cli/chunks/{chunk-65M7C6SH.js → chunk-Z75DMTMI.js} +1 -1
- package/dist/cli/chunks/{chunk-Q4A72ZTV.js → chunk-ZKWNZ3ZK.js} +2 -2
- package/dist/cli/chunks/{chunk-2Z2TFEOL.js → chunk-ZODUKKPC.js} +2 -2
- package/dist/cli/chunks/{chunk-KNVAAVHH.js → chunk-ZQSEPDIJ.js} +2 -2
- package/dist/cli/chunks/{chunk-QIH3E775.js → chunk-ZW5DRPZY.js} +2 -2
- package/dist/cli/chunks/{ci-2BCOBWFG.js → ci-THZEECIQ.js} +2 -2
- package/dist/cli/chunks/{ci-output-FB4OJHAC.js → ci-output-G6QLGL4S.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-NEEFZTMB.js → claude-flow-setup-5MTYQM34.js} +2 -2
- package/dist/cli/chunks/client-IFMC3AYQ.js +2 -0
- package/dist/cli/chunks/{cline-installer-ODO2PS4K.js → cline-installer-E2LF2DQS.js} +2 -2
- package/dist/cli/chunks/{code-NSOF62VE.js → code-QRF7ZGXG.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-YQL5XN52.js → code-index-extractor-II6IRWU6.js} +2 -2
- package/dist/cli/chunks/{codex-installer-SPEY6VYT.js → codex-installer-LGOQ23ZS.js} +2 -2
- package/dist/cli/chunks/{completions-OWKBUMBE.js → completions-LB2RR2OQ.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-PGTXKP73.js → complexity-analyzer-PUIPIRX3.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-KGOXAC7L.js → continuedev-installer-HQAEAQZU.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-BF3UA3TG.js → copilot-installer-3PKCX5K5.js} +2 -2
- package/dist/cli/chunks/{cost-tracker-2HDJ66E2.js → cost-tracker-JG3SZ2Q3.js} +2 -2
- package/dist/cli/chunks/{coverage-KPA2PHIN.js → coverage-D3PZTOKT.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-2LPBUUWY.js +2 -0
- package/dist/cli/chunks/{cursor-installer-7CDZFHTV.js → cursor-installer-UY6GWKTO.js} +2 -2
- package/dist/cli/chunks/{daemon-4BPGCKDJ.js → daemon-UNO3LRRN.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-2MAVGSBB.js → dag-attention-scheduler-S2MXANYL.js} +2 -2
- package/dist/cli/chunks/{detect-WRPWTGP5.js → detect-DU2FTRKR.js} +2 -2
- package/dist/cli/chunks/{domain-handler-JZVSJ7AG.js → domain-handler-KPNO36LF.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-XGIZOR2X.js → domain-transfer-6X3ZZF6A.js} +2 -2
- package/dist/cli/chunks/dream-NGRDMOTE.js +2 -0
- package/dist/cli/chunks/esm-node-3COTOSO3.js +2 -0
- package/dist/cli/chunks/{eval-T7YPAS4G.js → eval-6RXEDTBZ.js} +2 -2
- package/dist/cli/chunks/{fast-paths-QECJTKCQ.js → fast-paths-FYODFGZB.js} +2 -2
- package/dist/cli/chunks/{feature-flags-LIFURSFZ.js → feature-flags-YOULURDA.js} +2 -2
- package/dist/cli/chunks/{feature-flags-R4QZYTIW.js → feature-flags-ZJ42B4IL.js} +2 -2
- package/dist/cli/chunks/{file-discovery-4W3K3W4C.js → file-discovery-KOL7FSBQ.js} +2 -2
- package/dist/cli/chunks/{fleet-NLLQWCI5.js → fleet-22I74LGD.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-XEII72LN.js → gnn-wrapper-DFHTHLIZ.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-DJ65RE5D.js → heartbeat-handler-SQ6VYEAA.js} +4 -4
- package/dist/cli/chunks/{heartbeat-scheduler-H664265Q.js → heartbeat-scheduler-W6PQJ5SG.js} +2 -2
- package/dist/cli/chunks/hnsw-adapter-BASJNTEV.js +2 -0
- package/dist/cli/chunks/hnsw-index-NFN2AUIX.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-SQIDTWAA.js → hnsw-legacy-bridge-AYTRT54U.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-WICYCU5U.js → hnswlib-node-4IA56UH4.js} +2 -2
- package/dist/cli/chunks/{hooks-GZUHUD63.js → hooks-T6UMR72X.js} +6 -6
- package/dist/cli/chunks/{hypergraph-engine-MLCDZ6BL.js → hypergraph-engine-WVPYKMFY.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-NNDDI4R3.js → hypergraph-handler-NB6GL4CR.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-ZMQXHQDV.js +2 -0
- package/dist/cli/chunks/init-handler-UOFNBXEP.js +68 -0
- package/dist/cli/chunks/init-wizard-QHAA4GWF.js +2 -0
- package/dist/cli/chunks/kernel-SNJFYN3T.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-EPZFFPFE.js → kilocode-installer-VWMNI4QX.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-5VACG3HU.js → kiro-installer-RNM47FV5.js} +15 -15
- package/dist/cli/chunks/knowledge-graph-EP5UTODP.js +2 -0
- package/dist/cli/chunks/{learning-6FITK6XY.js → learning-L4RB5XYP.js} +3 -3
- package/dist/cli/chunks/{llm-router-4DDC6AKJ.js → llm-router-BZYZL3YI.js} +2 -2
- package/dist/cli/chunks/{load-KGDNVUBX.js → load-4UGEGRMO.js} +2 -2
- package/dist/cli/chunks/load-test-KMMRHABK.js +2 -0
- package/dist/cli/chunks/mcp-FWWZIWCI.js +2 -0
- package/dist/cli/chunks/{memory-II4I4QMO.js → memory-5OXPMXU6.js} +5 -5
- package/dist/cli/chunks/memory-backend-Q5MWPMDE.js +2 -0
- package/dist/cli/chunks/{memory-handlers-TQXTOJGQ.js → memory-handlers-JS7BTWJK.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-EU6JCWBW.js → opencode-installer-BS5TQKHB.js} +2 -2
- package/dist/cli/chunks/orchestrator-G6BUZ6QE.js +370 -0
- package/dist/cli/chunks/{pipeline-MPZJWYKK.js → pipeline-3MZ5COPR.js} +2 -2
- package/dist/cli/chunks/{platform-YH35ZZFZ.js → platform-TKD4JCUG.js} +2 -2
- package/dist/cli/chunks/{plugin-B7JYZFNQ.js → plugin-XXJ7R6SY.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-KTUK6UE2.js → prime-radiant-advanced-wasm-JLJ6NKIP.js} +2 -2
- package/dist/cli/chunks/protocol-executor-ORFR4WJ3.js +2 -0
- package/dist/cli/chunks/{protocol-handler-3NXMVU34.js → protocol-handler-ZLYGQPHG.js} +2 -2
- package/dist/cli/chunks/{prove-H5LMGSUC.js → prove-E2WZ335X.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-PLTOH4SG.js +2 -0
- package/dist/cli/chunks/{quality-RCWHY6GO.js → quality-6MHHBINU.js} +2 -2
- package/dist/cli/chunks/queen-coordinator-L3TRAX7H.js +2 -0
- package/dist/cli/chunks/{real-embeddings-NKH4VURF.js → real-embeddings-QN5BY3WS.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-SB7QJYM3.js → roocode-installer-GTVII272.js} +2 -2
- package/dist/cli/chunks/router-3PBJJLRQ.js +2 -0
- package/dist/cli/chunks/routing-feedback-Q775MZ3Z.js +2 -0
- package/dist/cli/chunks/{routing-handler-SY7GKG2W.js → routing-handler-HYKZ3ISS.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-HATTO3UQ.js → ruvector-commands-LBWHPUTZ.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-D57EXQUD.js → rvf-dual-writer-TVCJ2Y6N.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-OWDYN6KD.js → rvf-migration-adapter-34ITXLU3.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-SIQVJB5S.js → rvf-migration-coordinator-SX2C7777.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-HLY2652E.js +2 -0
- package/dist/cli/chunks/safe-db-CCKCBZ5I.js +2 -0
- package/dist/cli/chunks/schedule-WZ5VV55N.js +2 -0
- package/dist/cli/chunks/scheduler-6PIKLCH7.js +2 -0
- package/dist/cli/chunks/{security-DS3XLZWN.js → security-7A4EW77M.js} +3 -3
- package/dist/cli/chunks/shared-rvf-adapter-VCJNSACZ.js +2 -0
- package/dist/cli/chunks/{shared-rvf-dual-writer-YB7AH6XJ.js → shared-rvf-dual-writer-27L4R5WK.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-HMXYD56G.js +2 -0
- package/dist/cli/chunks/{status-handler-TUYHE4FT.js → status-handler-JN6PRYLD.js} +2 -2
- package/dist/cli/chunks/{structural-health-XNGBNRRD.js → structural-health-JSY3DY7H.js} +2 -2
- package/dist/cli/chunks/{sync-K6CIRKBB.js → sync-ET3LYW2V.js} +10 -10
- package/dist/cli/chunks/{task-handler-7PJY67DR.js → task-handler-R24MR74L.js} +2 -2
- package/dist/cli/chunks/{task-handlers-WB5CDWUR.js → task-handlers-YNPEEPPZ.js} +2 -2
- package/dist/cli/chunks/{test-WV5ALEBB.js → test-7BZXFZCT.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-N55ZGGA2.js → test-scheduling-EVIFD5EY.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-SINWHAKR.js → token-bootstrap-QYYQRXM5.js} +2 -2
- package/dist/cli/chunks/{token-usage-R7TGEVGL.js → token-usage-H4OZA77I.js} +2 -2
- package/dist/cli/chunks/{transformers-6DBLXPV7.js → transformers-ILQFO5HZ.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-7C7FKMQW.js → tree-sitter-wasm-parser-KTST5NWH.js} +2 -2
- package/dist/cli/chunks/{types-VNPMOKQT.js → types-4Z7XELU6.js} +2 -2
- package/dist/cli/chunks/unified-memory-RBHCTAWW.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-UBF5PT6D.js +2 -0
- package/dist/cli/chunks/unified-persistence-ZIJDP6GW.js +2 -0
- package/dist/cli/chunks/{validate-53MNIRAF.js → validate-GSQCH6VN.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-ZY4RGUFO.js → validate-swarm-SP2RPOYD.js} +2 -2
- package/dist/cli/chunks/{vibium-PBADBIV6.js → vibium-2SGOFYTF.js} +2 -2
- package/dist/cli/chunks/visual-security-WKIWOUTH.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-O7VI6RLB.js → web-tree-sitter-QSQ27UTH.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-HV3C3TAD.js → windsurf-installer-NIEH46E2.js} +2 -2
- package/dist/cli/chunks/witness-chain-4BRX3GGH.js +2 -0
- package/dist/cli/chunks/{witness-chain-4WIMYP4X.js → witness-chain-62GJTCT5.js} +2 -2
- package/dist/cli/chunks/{workflow-5RVAQ4TM.js → workflow-WZMV2MGW.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-G6VU7QZ4.js +2 -0
- package/dist/cli/chunks/{wrappers-RRHCCA3E.js → wrappers-LNTV533I.js} +2 -2
- package/dist/cli/commands/init.js +2 -0
- package/dist/cli/commands/mcp.js +27 -17
- package/dist/cli/commands/sync.js +25 -8
- package/dist/cli/handlers/init-handler.d.ts +1 -0
- package/dist/cli/handlers/init-handler.js +2 -0
- package/dist/init/governance-installer.js +46 -14
- package/dist/init/kiro-installer.js +15 -2
- package/dist/init/orchestrator.js +1 -0
- package/dist/init/phases/06-code-intelligence.d.ts +46 -1
- package/dist/init/phases/06-code-intelligence.js +164 -10
- package/dist/init/phases/10-workers.d.ts +0 -14
- package/dist/init/phases/10-workers.js +19 -164
- package/dist/init/phases/phase-interface.d.ts +9 -0
- package/dist/kernel/hnsw-adapter.d.ts +14 -0
- package/dist/kernel/hnsw-adapter.js +25 -1
- package/dist/kernel/hnsw-index-provider.d.ts +16 -0
- package/dist/kernel/native-hnsw-backend.d.ts +11 -0
- package/dist/kernel/native-hnsw-backend.js +20 -0
- package/dist/kernel/progressive-hnsw-backend.d.ts +9 -0
- package/dist/kernel/progressive-hnsw-backend.js +41 -12
- package/dist/kernel/unified-memory.js +10 -0
- package/dist/mcp/bundle.js +216 -216
- package/dist/optimization/token-optimizer-service.d.ts +31 -2
- package/dist/optimization/token-optimizer-service.js +85 -23
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-53WBPKXU.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-MV7NGY24.js +0 -2
- package/dist/cli/chunks/base-DZVGMQN2.js +0 -2
- package/dist/cli/chunks/browser-workflow-3J5YNMEI.js +0 -2
- package/dist/cli/chunks/chunk-LCAA6H4J.js +0 -2
- package/dist/cli/chunks/chunk-XIBVVZGB.js +0 -2
- package/dist/cli/chunks/client-EF555KYW.js +0 -2
- package/dist/cli/chunks/cross-domain-router-GXFNK5TS.js +0 -2
- package/dist/cli/chunks/dream-3IKF5XH4.js +0 -2
- package/dist/cli/chunks/esm-node-DHAE52OW.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-DML5KXQR.js +0 -2
- package/dist/cli/chunks/hnsw-index-BUPPGVR6.js +0 -2
- package/dist/cli/chunks/impact-analyzer-DPTMJRYS.js +0 -2
- package/dist/cli/chunks/init-handler-IJ6BHE6A.js +0 -68
- package/dist/cli/chunks/init-wizard-35PUDJPW.js +0 -2
- package/dist/cli/chunks/kernel-2HZ44ZJ4.js +0 -2
- package/dist/cli/chunks/knowledge-graph-JL62G72U.js +0 -2
- package/dist/cli/chunks/load-test-LN245SSD.js +0 -2
- package/dist/cli/chunks/mcp-4LETGVIV.js +0 -2
- package/dist/cli/chunks/memory-backend-SVM7YRIE.js +0 -2
- package/dist/cli/chunks/orchestrator-YLMGJVSP.js +0 -371
- package/dist/cli/chunks/protocol-executor-IEN2XB4L.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-Q3ZV3JRG.js +0 -2
- package/dist/cli/chunks/queen-coordinator-E6ON3JUR.js +0 -2
- package/dist/cli/chunks/router-WMC3LZ3C.js +0 -2
- package/dist/cli/chunks/routing-feedback-VKCZRCE3.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-C7NBH5UN.js +0 -2
- package/dist/cli/chunks/safe-db-5KLXCNXN.js +0 -2
- package/dist/cli/chunks/schedule-HAWWOXWB.js +0 -2
- package/dist/cli/chunks/scheduler-HTRDY5BC.js +0 -2
- package/dist/cli/chunks/shared-rvf-adapter-6I2Z5UGL.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-WNNRGTGG.js +0 -2
- package/dist/cli/chunks/unified-memory-72SKVZ7Y.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-TMN2L77W.js +0 -2
- package/dist/cli/chunks/unified-persistence-MDN3SRCR.js +0 -2
- package/dist/cli/chunks/visual-security-TRBCXPIB.js +0 -2
- package/dist/cli/chunks/witness-chain-JOI2YYGK.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-2NQ72S3C.js +0 -2
|
@@ -29,6 +29,7 @@ export class InitHandler {
|
|
|
29
29
|
.option('-u, --upgrade', 'Upgrade existing installation (overwrite skills, agents, validation)')
|
|
30
30
|
.option('--minimal', 'Minimal configuration (skip optional features)')
|
|
31
31
|
.option('--skip-patterns', 'Skip loading pre-trained patterns')
|
|
32
|
+
.option('--skip-code-index', 'Skip code intelligence pre-scan (run `aqe code index` later)')
|
|
32
33
|
.option('--with-n8n', 'Install n8n workflow testing agents and skills')
|
|
33
34
|
.option('--with-opencode', 'Include OpenCode agent/skill provisioning')
|
|
34
35
|
.option('--with-kiro', 'Include AWS Kiro IDE integration (agents, skills, hooks, steering)')
|
|
@@ -97,6 +98,7 @@ export class InitHandler {
|
|
|
97
98
|
upgrade: options.upgrade,
|
|
98
99
|
minimal: options.minimal,
|
|
99
100
|
skipPatterns: options.skipPatterns,
|
|
101
|
+
skipCodeIndex: options.skipCodeIndex,
|
|
100
102
|
withN8n: options.withN8n,
|
|
101
103
|
withOpenCode: options.withOpencode,
|
|
102
104
|
withKiro: options.withKiro,
|
|
@@ -13,28 +13,60 @@ import { existsSync, mkdirSync, readdirSync, copyFileSync } from 'fs';
|
|
|
13
13
|
import { join, dirname } from 'path';
|
|
14
14
|
import { fileURLToPath } from 'url';
|
|
15
15
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
16
|
+
import { findPackageRoot } from './find-package-root.js';
|
|
16
17
|
// ============================================================================
|
|
17
18
|
// Constants
|
|
18
19
|
// ============================================================================
|
|
19
20
|
const __filename = fileURLToPath(import.meta.url);
|
|
20
21
|
const __dirname = dirname(__filename);
|
|
21
22
|
/**
|
|
22
|
-
* Path to bundled governance assets
|
|
23
|
+
* Path to bundled governance assets.
|
|
24
|
+
*
|
|
25
|
+
* fix/init-v3-9-4: In v3.9.1 this function was missed when skills-installer,
|
|
26
|
+
* agents-installer, opencode-installer, and n8n-installer were migrated to
|
|
27
|
+
* findPackageRoot(). The old fixed-depth `__dirname + '../../'` traversals
|
|
28
|
+
* work when the file is compiled as a standalone ESM module at
|
|
29
|
+
* `dist/init/governance-installer.js`, but they silently break when esbuild
|
|
30
|
+
* code-splitting bundles this module into a chunk under
|
|
31
|
+
* `dist/cli/chunks/chunk-XXX.js` — at which point `__dirname` points to
|
|
32
|
+
* the chunks directory and both candidate traversals land outside the
|
|
33
|
+
* package. That made the governance phase throw "Governance assets not
|
|
34
|
+
* found. Package may be corrupted." during phase 13 of `aqe init`, which
|
|
35
|
+
* the orchestrator caught and reported as `x Install governance
|
|
36
|
+
* configuration (1ms)` on cf-devpod.
|
|
37
|
+
*
|
|
38
|
+
* Resolution order (each path is checked with existsSync):
|
|
39
|
+
* 1. Dev tree fixed paths — work when running from src/ or the
|
|
40
|
+
* standalone-compiled dist/init/.
|
|
41
|
+
* 2. findPackageRoot() walk-up — finds the nearest package.json with
|
|
42
|
+
* name=agentic-qe regardless of bundle depth. This is the correct
|
|
43
|
+
* path for all production installs.
|
|
44
|
+
* 3. Consumer's node_modules — covers edge cases where the package is a
|
|
45
|
+
* transitive dep.
|
|
46
|
+
* 4. process.cwd() fallback — dev tree when running from project root.
|
|
23
47
|
*/
|
|
24
48
|
function getGovernanceAssetsPath() {
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
49
|
+
// 1. Dev tree fixed paths (src/init/ and standalone dist/init/)
|
|
50
|
+
const candidates = [
|
|
51
|
+
join(__dirname, '../../assets/governance'),
|
|
52
|
+
join(__dirname, '../assets/governance'),
|
|
53
|
+
];
|
|
54
|
+
// 2. Walk up to the package root (works for chunk-split bundles)
|
|
55
|
+
const packageRoot = findPackageRoot(import.meta.url);
|
|
56
|
+
if (packageRoot) {
|
|
57
|
+
candidates.push(join(packageRoot, 'assets/governance'));
|
|
58
|
+
candidates.push(join(packageRoot, 'dist/assets/governance'));
|
|
59
|
+
}
|
|
60
|
+
// 3. Consumer's node_modules
|
|
61
|
+
candidates.push(join(process.cwd(), 'node_modules/agentic-qe/assets/governance'));
|
|
62
|
+
// 4. Fallback to cwd (dev tree running from project root)
|
|
63
|
+
candidates.push(join(process.cwd(), 'assets/governance'));
|
|
64
|
+
for (const c of candidates) {
|
|
65
|
+
if (existsSync(c))
|
|
66
|
+
return c;
|
|
67
|
+
}
|
|
68
|
+
throw new Error('Governance assets not found. Package may be corrupted. ' +
|
|
69
|
+
`Searched: ${candidates.join(', ')}`);
|
|
38
70
|
}
|
|
39
71
|
// ============================================================================
|
|
40
72
|
// Installer
|
|
@@ -9,6 +9,7 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, } from
|
|
|
9
9
|
import { join, dirname } from 'path';
|
|
10
10
|
import { fileURLToPath } from 'url';
|
|
11
11
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
12
|
+
import { findPackageRoot } from './find-package-root.js';
|
|
12
13
|
// ESM compatibility
|
|
13
14
|
const __filename = fileURLToPath(import.meta.url);
|
|
14
15
|
const __dirname = dirname(__filename);
|
|
@@ -35,12 +36,24 @@ export class KiroInstaller {
|
|
|
35
36
|
// Source Directory Detection
|
|
36
37
|
// ==========================================================================
|
|
37
38
|
findOpenCodeDir() {
|
|
39
|
+
// fix/init-v3-9-4: same chunk-split bundle regression as
|
|
40
|
+
// governance-installer. Walk up to the agentic-qe package root
|
|
41
|
+
// via findPackageRoot() instead of using fragile __dirname + '../..'
|
|
42
|
+
// traversals that break when this module is bundled into a chunk
|
|
43
|
+
// under dist/cli/chunks/.
|
|
38
44
|
const possiblePaths = [
|
|
39
|
-
//
|
|
45
|
+
// Dev tree fixed paths (src/init/ and standalone dist/init/)
|
|
40
46
|
join(__dirname, '../../.opencode'),
|
|
41
|
-
// NPM package location
|
|
42
47
|
join(__dirname, '../../assets/opencode'),
|
|
43
48
|
];
|
|
49
|
+
// Walk up to the package root (works for chunk-split bundles)
|
|
50
|
+
const packageRoot = findPackageRoot(import.meta.url);
|
|
51
|
+
if (packageRoot) {
|
|
52
|
+
possiblePaths.push(join(packageRoot, '.opencode'));
|
|
53
|
+
possiblePaths.push(join(packageRoot, 'assets/opencode'));
|
|
54
|
+
}
|
|
55
|
+
// Consumer's node_modules
|
|
56
|
+
possiblePaths.push(join(process.cwd(), 'node_modules/agentic-qe/assets/opencode'), join(process.cwd(), 'node_modules/agentic-qe/.opencode'));
|
|
44
57
|
for (const p of possiblePaths) {
|
|
45
58
|
if (existsSync(p) && (existsSync(join(p, 'agents')) || existsSync(join(p, 'skills')))) {
|
|
46
59
|
return p;
|
|
@@ -31,6 +31,7 @@ export class ModularInitOrchestrator {
|
|
|
31
31
|
autoMode: options.autoMode,
|
|
32
32
|
upgrade: options.upgrade,
|
|
33
33
|
skipPatterns: options.skipPatterns,
|
|
34
|
+
skipCodeIndex: options.skipCodeIndex,
|
|
34
35
|
minimal: options.minimal,
|
|
35
36
|
withN8n: options.withN8n,
|
|
36
37
|
withOpenCode: options.withOpenCode,
|
|
@@ -8,8 +8,10 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { BasePhase, type InitContext } from './phase-interface.js';
|
|
10
10
|
export interface CodeIntelligenceResult {
|
|
11
|
-
status: 'indexed' | 'existing' | 'skipped' | 'error';
|
|
11
|
+
status: 'indexed' | 'existing' | 'skipped' | 'error' | 'timeout';
|
|
12
12
|
entries: number;
|
|
13
|
+
/** Last file the indexer touched before a timeout, if any. Used for diagnostics. */
|
|
14
|
+
timeoutFile?: string;
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
15
17
|
* Code Intelligence phase - builds knowledge graph
|
|
@@ -20,6 +22,19 @@ export declare class CodeIntelligencePhase extends BasePhase<CodeIntelligenceRes
|
|
|
20
22
|
readonly order = 60;
|
|
21
23
|
readonly critical = false;
|
|
22
24
|
readonly requiresPhases: readonly ["database"];
|
|
25
|
+
/**
|
|
26
|
+
* Opt-out gate: v3.9.4 escape hatch for users whose code intelligence
|
|
27
|
+
* pre-scan stalls on native calls that the phase-level watchdog can't
|
|
28
|
+
* interrupt (because Node's event loop is blocked inside synchronous
|
|
29
|
+
* NAPI code). Setting `AQE_SKIP_CODE_INDEX=1` or passing
|
|
30
|
+
* `--skip-code-index` to `aqe init` bypasses this phase entirely.
|
|
31
|
+
* Lazy on-demand indexing still works when the user runs
|
|
32
|
+
* `aqe code index` or `aqe memory search` afterwards.
|
|
33
|
+
*
|
|
34
|
+
* See https://github.com/proffesor-for-testing/agentic-qe/issues/XXX
|
|
35
|
+
* for the tracking issue on the proper killable-worker fix.
|
|
36
|
+
*/
|
|
37
|
+
shouldRun(context: InitContext): Promise<boolean>;
|
|
23
38
|
protected run(context: InitContext): Promise<CodeIntelligenceResult>;
|
|
24
39
|
/**
|
|
25
40
|
* Check if code intelligence index exists (uses provided db connection)
|
|
@@ -38,8 +53,38 @@ export declare class CodeIntelligencePhase extends BasePhase<CodeIntelligenceRes
|
|
|
38
53
|
* - Dependency analysis (impact of changes)
|
|
39
54
|
* - Test target discovery (what tests cover what code)
|
|
40
55
|
* - Token reduction (search KG instead of reading entire files)
|
|
56
|
+
*
|
|
57
|
+
* fix/init-v3-9-3 Fix 5: The whole scan is wrapped in a phase-level
|
|
58
|
+
* watchdog. Inside, each file is indexed via `indexOneFile()` with a
|
|
59
|
+
* per-file timeout so a single pathological file or a native-layer
|
|
60
|
+
* stall (e.g. @ruvector/rvf-node fsync on an overlay filesystem) can
|
|
61
|
+
* never block the init command indefinitely. Progress is logged every
|
|
62
|
+
* PROGRESS_LOG_INTERVAL files so operators can see exactly where the
|
|
63
|
+
* indexer is — and, if a timeout fires, which file was responsible.
|
|
41
64
|
*/
|
|
42
65
|
private runCodeIntelligenceScan;
|
|
66
|
+
/**
|
|
67
|
+
* Drive file-by-file indexing with per-file and phase-level timeouts.
|
|
68
|
+
*
|
|
69
|
+
* fix/init-v3-9-3 Fix 5. This method is the reason v3.9.3 can survive
|
|
70
|
+
* pathological files and native-layer stalls that hung v3.9.1/v3.9.2.
|
|
71
|
+
*
|
|
72
|
+
* Invariants:
|
|
73
|
+
* - A single file cannot block longer than PER_FILE_TIMEOUT_MS.
|
|
74
|
+
* - The whole loop cannot block longer than PHASE_TIMEOUT_MS.
|
|
75
|
+
* - Progress is observable via structured log lines.
|
|
76
|
+
* - Partial results are kept — on timeout we return the entries
|
|
77
|
+
* indexed so far, not zero.
|
|
78
|
+
*/
|
|
79
|
+
private runBoundedScan;
|
|
80
|
+
/**
|
|
81
|
+
* Race a promise against a timer. On timeout, rejects with a tagged
|
|
82
|
+
* error so the caller can distinguish timeouts from real failures.
|
|
83
|
+
*
|
|
84
|
+
* The tagged error prefix 'AQE_PER_FILE_TIMEOUT' is matched in
|
|
85
|
+
* runBoundedScan to differentiate per-file timeouts from other errors.
|
|
86
|
+
*/
|
|
87
|
+
private withTimeout;
|
|
43
88
|
/**
|
|
44
89
|
* Build hypergraph from indexed files.
|
|
45
90
|
* Uses shared extractor to populate hypergraph_nodes/hypergraph_edges in memory.db.
|
|
@@ -12,6 +12,20 @@ import { safeJsonParse } from '../../shared/safe-json.js';
|
|
|
12
12
|
import { openDatabase } from '../../shared/safe-db.js';
|
|
13
13
|
import { BasePhase, } from './phase-interface.js';
|
|
14
14
|
import { createMemoryBackend } from '../../kernel/memory-factory.js';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Watchdog configuration (fix/init-v3-9-3 Fix 5)
|
|
17
|
+
//
|
|
18
|
+
// These are deliberately generous. Normal codebases of 10k+ entities index
|
|
19
|
+
// in under 3 seconds on a laptop. The caps exist so that a pathological file
|
|
20
|
+
// or a native-layer stall (e.g. on an overlay filesystem) can't hang the
|
|
21
|
+
// entire init command indefinitely. When a cap fires the phase returns
|
|
22
|
+
// gracefully with status='timeout', the warning names the last file, and the
|
|
23
|
+
// user can open an issue with that exact filename.
|
|
24
|
+
// ============================================================================
|
|
25
|
+
/** Per-file timeout. A single file must not take longer than this to index. */
|
|
26
|
+
const PER_FILE_TIMEOUT_MS = 30_000;
|
|
27
|
+
/** Whole-phase timeout. The full KG build must not take longer than this. */
|
|
28
|
+
const PHASE_TIMEOUT_MS = 180_000;
|
|
15
29
|
/** Patterns to exclude from code intelligence scanning */
|
|
16
30
|
const SCAN_IGNORE_PATTERNS = [
|
|
17
31
|
'**/node_modules/**',
|
|
@@ -52,6 +66,32 @@ export class CodeIntelligencePhase extends BasePhase {
|
|
|
52
66
|
order = 60;
|
|
53
67
|
critical = false;
|
|
54
68
|
requiresPhases = ['database'];
|
|
69
|
+
/**
|
|
70
|
+
* Opt-out gate: v3.9.4 escape hatch for users whose code intelligence
|
|
71
|
+
* pre-scan stalls on native calls that the phase-level watchdog can't
|
|
72
|
+
* interrupt (because Node's event loop is blocked inside synchronous
|
|
73
|
+
* NAPI code). Setting `AQE_SKIP_CODE_INDEX=1` or passing
|
|
74
|
+
* `--skip-code-index` to `aqe init` bypasses this phase entirely.
|
|
75
|
+
* Lazy on-demand indexing still works when the user runs
|
|
76
|
+
* `aqe code index` or `aqe memory search` afterwards.
|
|
77
|
+
*
|
|
78
|
+
* See https://github.com/proffesor-for-testing/agentic-qe/issues/XXX
|
|
79
|
+
* for the tracking issue on the proper killable-worker fix.
|
|
80
|
+
*/
|
|
81
|
+
async shouldRun(context) {
|
|
82
|
+
const envSkip = process.env.AQE_SKIP_CODE_INDEX;
|
|
83
|
+
if (envSkip === '1' || envSkip === 'true') {
|
|
84
|
+
context.services.log(' Code intelligence skipped (AQE_SKIP_CODE_INDEX=1)');
|
|
85
|
+
context.services.log(' Run `aqe code index` later to build the KG on demand.');
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
if (context.options.skipCodeIndex) {
|
|
89
|
+
context.services.log(' Code intelligence skipped (--skip-code-index)');
|
|
90
|
+
context.services.log(' Run `aqe code index` later to build the KG on demand.');
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
55
95
|
async run(context) {
|
|
56
96
|
const { projectRoot } = context;
|
|
57
97
|
const dbPath = join(projectRoot, '.agentic-qe', 'memory.db');
|
|
@@ -133,6 +173,14 @@ export class CodeIntelligencePhase extends BasePhase {
|
|
|
133
173
|
* - Dependency analysis (impact of changes)
|
|
134
174
|
* - Test target discovery (what tests cover what code)
|
|
135
175
|
* - Token reduction (search KG instead of reading entire files)
|
|
176
|
+
*
|
|
177
|
+
* fix/init-v3-9-3 Fix 5: The whole scan is wrapped in a phase-level
|
|
178
|
+
* watchdog. Inside, each file is indexed via `indexOneFile()` with a
|
|
179
|
+
* per-file timeout so a single pathological file or a native-layer
|
|
180
|
+
* stall (e.g. @ruvector/rvf-node fsync on an overlay filesystem) can
|
|
181
|
+
* never block the init command indefinitely. Progress is logged every
|
|
182
|
+
* PROGRESS_LOG_INTERVAL files so operators can see exactly where the
|
|
183
|
+
* indexer is — and, if a timeout fires, which file was responsible.
|
|
136
184
|
*/
|
|
137
185
|
async runCodeIntelligenceScan(projectRoot, context, incremental, changedFiles) {
|
|
138
186
|
try {
|
|
@@ -164,29 +212,135 @@ export class CodeIntelligencePhase extends BasePhase {
|
|
|
164
212
|
});
|
|
165
213
|
filesToIndex = files.map(f => join(projectRoot, f));
|
|
166
214
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
});
|
|
215
|
+
context.services.log(` Scanning ${filesToIndex.length} source files...`);
|
|
216
|
+
// Race the whole scan against a phase-level watchdog. If the cap
|
|
217
|
+
// fires, we stop eating files and report how far we got.
|
|
218
|
+
const scanResult = await this.runBoundedScan(kgService, filesToIndex, incremental, context);
|
|
172
219
|
kgService.destroy();
|
|
173
220
|
await memory.dispose();
|
|
174
|
-
if (
|
|
175
|
-
|
|
221
|
+
if (scanResult.status === 'timeout') {
|
|
222
|
+
context.services.warn(` ⚠ Code intelligence pre-scan exceeded ${PHASE_TIMEOUT_MS / 1000}s phase cap. ` +
|
|
223
|
+
`Indexed ${scanResult.entries} entries before timeout. ` +
|
|
224
|
+
`Last file: ${scanResult.timeoutFile ?? '(unknown)'}. ` +
|
|
225
|
+
`Init is continuing — re-run 'aqe code index' later, or report this file to ` +
|
|
226
|
+
`https://github.com/proffesor-for-testing/agentic-qe/issues.`);
|
|
227
|
+
return scanResult;
|
|
228
|
+
}
|
|
229
|
+
if (scanResult.status === 'indexed') {
|
|
176
230
|
const label = incremental ? 'Delta indexed' : 'Indexed';
|
|
177
|
-
context.services.log(` ${label} ${entries} entries to ${dbPath}`);
|
|
231
|
+
context.services.log(` ${label} ${scanResult.entries} entries to ${dbPath}`);
|
|
178
232
|
// Also populate the hypergraph tables (hypergraph_nodes/hypergraph_edges)
|
|
179
233
|
// so CLI/MCP hypergraph queries work immediately after init
|
|
180
234
|
await this.buildHypergraph(dbPath, filesToIndex, context);
|
|
181
|
-
return { status: 'indexed', entries };
|
|
182
235
|
}
|
|
183
|
-
return
|
|
236
|
+
return scanResult;
|
|
184
237
|
}
|
|
185
238
|
catch (error) {
|
|
186
239
|
context.services.warn(`Code intelligence scan warning: ${error}`);
|
|
187
240
|
return { status: 'skipped', entries: 0 };
|
|
188
241
|
}
|
|
189
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* Drive file-by-file indexing with per-file and phase-level timeouts.
|
|
245
|
+
*
|
|
246
|
+
* fix/init-v3-9-3 Fix 5. This method is the reason v3.9.3 can survive
|
|
247
|
+
* pathological files and native-layer stalls that hung v3.9.1/v3.9.2.
|
|
248
|
+
*
|
|
249
|
+
* Invariants:
|
|
250
|
+
* - A single file cannot block longer than PER_FILE_TIMEOUT_MS.
|
|
251
|
+
* - The whole loop cannot block longer than PHASE_TIMEOUT_MS.
|
|
252
|
+
* - Progress is observable via structured log lines.
|
|
253
|
+
* - Partial results are kept — on timeout we return the entries
|
|
254
|
+
* indexed so far, not zero.
|
|
255
|
+
*/
|
|
256
|
+
async runBoundedScan(kgService, filesToIndex, incremental, context) {
|
|
257
|
+
// Use the public index() with a one-file array per call so we can
|
|
258
|
+
// attach a per-file timeout and log progress.
|
|
259
|
+
let totalNodes = 0;
|
|
260
|
+
let totalEdges = 0;
|
|
261
|
+
let processed = 0;
|
|
262
|
+
let lastFile = '';
|
|
263
|
+
const startedAt = Date.now();
|
|
264
|
+
let timedOut = false;
|
|
265
|
+
// Clear once up-front if this is a full rebuild. The per-file calls
|
|
266
|
+
// below must not clear between files.
|
|
267
|
+
if (!incremental) {
|
|
268
|
+
await kgService.clear();
|
|
269
|
+
}
|
|
270
|
+
// Project-relative path helper for shorter per-file log lines.
|
|
271
|
+
const projectRoot = context.projectRoot;
|
|
272
|
+
const rel = (p) => p.startsWith(projectRoot) ? p.slice(projectRoot.length + 1) : p;
|
|
273
|
+
for (const file of filesToIndex) {
|
|
274
|
+
// Phase-level cap. Checked between files so in-flight work can
|
|
275
|
+
// still complete bounded by its own per-file cap.
|
|
276
|
+
//
|
|
277
|
+
// IMPORTANT: This check only fires BETWEEN file iterations. If a
|
|
278
|
+
// single call to kgService.index() blocks the Node event loop
|
|
279
|
+
// inside synchronous native code (e.g. an @ruvector/router
|
|
280
|
+
// native insert stalls on a specific vector shape), this check
|
|
281
|
+
// never runs and the phase appears to hang past PHASE_TIMEOUT_MS.
|
|
282
|
+
// That's the v3.9.3 failure mode observed on ruview. See
|
|
283
|
+
// shouldRun() for the v3.9.4 AQE_SKIP_CODE_INDEX escape hatch
|
|
284
|
+
// and the tracking issue for the killable-worker proper fix.
|
|
285
|
+
if (Date.now() - startedAt > PHASE_TIMEOUT_MS) {
|
|
286
|
+
timedOut = true;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
lastFile = file;
|
|
290
|
+
// fix/init-v3-9-4 Fix B: log EVERY file *before* we start
|
|
291
|
+
// processing it, not at 100-file intervals. This is the single
|
|
292
|
+
// most important diagnostic — when the next hang happens, the
|
|
293
|
+
// last log line will name the exact file that stalls, which is
|
|
294
|
+
// the data we need to fix the underlying native cause.
|
|
295
|
+
context.services.log(` [${processed + 1}/${filesToIndex.length}] ${rel(file)}`);
|
|
296
|
+
try {
|
|
297
|
+
const indexResult = await this.withTimeout(kgService.index({
|
|
298
|
+
paths: [file],
|
|
299
|
+
incremental: true, // don't clear — we already cleared above
|
|
300
|
+
includeTests: true,
|
|
301
|
+
}), PER_FILE_TIMEOUT_MS, file);
|
|
302
|
+
if (indexResult.success) {
|
|
303
|
+
totalNodes += indexResult.value.nodesCreated;
|
|
304
|
+
totalEdges += indexResult.value.edgesCreated;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
309
|
+
if (message.startsWith('AQE_PER_FILE_TIMEOUT')) {
|
|
310
|
+
// Skip the pathological file, log, and keep going.
|
|
311
|
+
context.services.warn(` ⚠ Skipped ${rel(file)} — indexing exceeded ${PER_FILE_TIMEOUT_MS / 1000}s`);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
context.services.warn(` ⚠ Failed to index ${rel(file)}: ${message}`);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
processed++;
|
|
318
|
+
}
|
|
319
|
+
const entries = totalNodes + totalEdges;
|
|
320
|
+
if (timedOut) {
|
|
321
|
+
return { status: 'timeout', entries, timeoutFile: lastFile };
|
|
322
|
+
}
|
|
323
|
+
return { status: 'indexed', entries };
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Race a promise against a timer. On timeout, rejects with a tagged
|
|
327
|
+
* error so the caller can distinguish timeouts from real failures.
|
|
328
|
+
*
|
|
329
|
+
* The tagged error prefix 'AQE_PER_FILE_TIMEOUT' is matched in
|
|
330
|
+
* runBoundedScan to differentiate per-file timeouts from other errors.
|
|
331
|
+
*/
|
|
332
|
+
withTimeout(promise, timeoutMs, fileLabel) {
|
|
333
|
+
return new Promise((resolve, reject) => {
|
|
334
|
+
const timer = setTimeout(() => {
|
|
335
|
+
reject(new Error(`AQE_PER_FILE_TIMEOUT: ${fileLabel}`));
|
|
336
|
+
}, timeoutMs);
|
|
337
|
+
// unref so the timer doesn't keep the event loop alive if the
|
|
338
|
+
// promise resolves via the fast path.
|
|
339
|
+
if (typeof timer.unref === 'function')
|
|
340
|
+
timer.unref();
|
|
341
|
+
promise.then((v) => { clearTimeout(timer); resolve(v); }, (e) => { clearTimeout(timer); reject(e); });
|
|
342
|
+
});
|
|
343
|
+
}
|
|
190
344
|
/**
|
|
191
345
|
* Build hypergraph from indexed files.
|
|
192
346
|
* Uses shared extractor to populate hypergraph_nodes/hypergraph_edges in memory.db.
|
|
@@ -22,19 +22,5 @@ export declare class WorkersPhase extends BasePhase<WorkersResult> {
|
|
|
22
22
|
readonly requiresPhases: readonly ["configuration"];
|
|
23
23
|
shouldRun(context: InitContext): Promise<boolean>;
|
|
24
24
|
protected run(context: InitContext): Promise<WorkersResult>;
|
|
25
|
-
/**
|
|
26
|
-
* Start the MCP daemon in the background
|
|
27
|
-
*/
|
|
28
|
-
private startDaemon;
|
|
29
|
-
/**
|
|
30
|
-
* Find the aqe-mcp command
|
|
31
|
-
*
|
|
32
|
-
* Search order:
|
|
33
|
-
* 1. Local aqe-mcp binary (node_modules/.bin/)
|
|
34
|
-
* 2. Local bundled MCP server (node_modules/agentic-qe/dist/)
|
|
35
|
-
* 3. Local aqe CLI binary with mcp subcommand
|
|
36
|
-
* 4. npx fallback (uses aqe mcp subcommand)
|
|
37
|
-
*/
|
|
38
|
-
private findMcpCommand;
|
|
39
25
|
}
|
|
40
26
|
//# sourceMappingURL=10-workers.d.ts.map
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* Phase 10: Workers
|
|
3
3
|
* Configures background workers for continuous monitoring
|
|
4
4
|
*/
|
|
5
|
-
import { existsSync, mkdirSync, writeFileSync
|
|
5
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
6
6
|
import { join } from 'path';
|
|
7
|
-
import { spawn } from 'child_process';
|
|
8
7
|
import { BasePhase, } from './phase-interface.js';
|
|
9
8
|
/**
|
|
10
9
|
* Workers phase - configures background workers
|
|
@@ -183,174 +182,30 @@ try {
|
|
|
183
182
|
writeFileSync(stopScriptPath, stopScript);
|
|
184
183
|
context.services.log(` Workers dir: ${workersDir}`);
|
|
185
184
|
context.services.log(` Workers: ${config.workers.enabled.join(', ')}`);
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
context.services.log(` Note: ${daemonError}`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
catch (error) {
|
|
206
|
-
// Non-blocking error - MCP works fine when Claude Code starts it
|
|
207
|
-
daemonError = error instanceof Error ? error.message : 'Unknown error';
|
|
208
|
-
context.services.log(` MCP daemon: skipped (Claude Code will start it)`);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
185
|
+
context.services.log(` Registry: ${registryPath}`);
|
|
186
|
+
// MCP daemon startup is Claude Code's job, not init's.
|
|
187
|
+
//
|
|
188
|
+
// fix/init-v3-9-3 Fix 3: Previously this phase spawned `aqe mcp` as
|
|
189
|
+
// a detached child to pre-warm the MCP server. That spawn raced the
|
|
190
|
+
// init process for the same RVF / native HNSW file locks, producing
|
|
191
|
+
// the cascade of errors seen in v3.9.1 and v3.9.2:
|
|
192
|
+
// • RVF error 0x0303: FsyncFailed (child couldn't open patterns.rvf)
|
|
193
|
+
// • VectorDb creation failed: Database already open
|
|
194
|
+
// • Error: Could not find MCP server entry point
|
|
195
|
+
//
|
|
196
|
+
// The canonical path is .mcp.json (written by phase 08). Claude Code
|
|
197
|
+
// reads it and starts `aqe mcp` on demand when a user actually opens
|
|
198
|
+
// the project. Users who want to run the daemon manually can use the
|
|
199
|
+
// generated `.agentic-qe/workers/start-daemon.cjs` helper script or
|
|
200
|
+
// the `aqe daemon` subcommand.
|
|
211
201
|
return {
|
|
212
202
|
workersDir,
|
|
213
203
|
workersConfigured: config.workers.enabled.length,
|
|
214
204
|
registryPath,
|
|
215
|
-
daemonStarted,
|
|
216
|
-
daemonPid,
|
|
217
|
-
daemonError,
|
|
205
|
+
daemonStarted: false,
|
|
206
|
+
daemonPid: null,
|
|
218
207
|
};
|
|
219
208
|
}
|
|
220
|
-
/**
|
|
221
|
-
* Start the MCP daemon in the background
|
|
222
|
-
*/
|
|
223
|
-
async startDaemon(workersDir, projectRoot, context) {
|
|
224
|
-
const pidFile = join(workersDir, 'daemon.pid');
|
|
225
|
-
const logFile = join(workersDir, 'daemon.log');
|
|
226
|
-
// Check if already running
|
|
227
|
-
if (existsSync(pidFile)) {
|
|
228
|
-
try {
|
|
229
|
-
const existingPid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);
|
|
230
|
-
// Check if process is running
|
|
231
|
-
process.kill(existingPid, 0);
|
|
232
|
-
return { started: true, pid: existingPid, error: 'Already running' };
|
|
233
|
-
}
|
|
234
|
-
catch {
|
|
235
|
-
// PID file exists but process not running, continue
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// Try to find aqe-mcp command
|
|
239
|
-
const mcpCommand = await this.findMcpCommand(projectRoot);
|
|
240
|
-
if (!mcpCommand) {
|
|
241
|
-
return {
|
|
242
|
-
started: false,
|
|
243
|
-
pid: null,
|
|
244
|
-
error: 'aqe-mcp not found. Install globally with: npm install -g agentic-qe',
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
return new Promise((resolve) => {
|
|
248
|
-
try {
|
|
249
|
-
// Set up environment
|
|
250
|
-
const env = {
|
|
251
|
-
...process.env,
|
|
252
|
-
AQE_STORAGE_PATH: '.agentic-qe',
|
|
253
|
-
AQE_LEARNING_ENABLED: 'true',
|
|
254
|
-
AQE_WORKERS_ENABLED: 'true',
|
|
255
|
-
AQE_HTTP_PORT: '0',
|
|
256
|
-
};
|
|
257
|
-
// Spawn the MCP server as a detached process
|
|
258
|
-
const child = spawn(mcpCommand.command, mcpCommand.args, {
|
|
259
|
-
cwd: projectRoot,
|
|
260
|
-
env,
|
|
261
|
-
detached: true,
|
|
262
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
263
|
-
});
|
|
264
|
-
// Give the process a moment to start
|
|
265
|
-
let started = false;
|
|
266
|
-
let errorOutput = '';
|
|
267
|
-
child.stderr?.on('data', (data) => {
|
|
268
|
-
errorOutput += data.toString();
|
|
269
|
-
});
|
|
270
|
-
child.on('error', (error) => {
|
|
271
|
-
resolve({
|
|
272
|
-
started: false,
|
|
273
|
-
pid: null,
|
|
274
|
-
error: error.message,
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
// Wait a short time to see if the process starts successfully
|
|
278
|
-
setTimeout(() => {
|
|
279
|
-
// Check if process is still alive
|
|
280
|
-
try {
|
|
281
|
-
if (child.pid) {
|
|
282
|
-
process.kill(child.pid, 0); // Check if alive (throws if not)
|
|
283
|
-
// Write PID file
|
|
284
|
-
writeFileSync(pidFile, child.pid.toString(), 'utf-8');
|
|
285
|
-
// Log startup
|
|
286
|
-
const logEntry = `[${new Date().toISOString()}] MCP daemon started with PID: ${child.pid}\n`;
|
|
287
|
-
writeFileSync(logFile, logEntry, { flag: 'a' });
|
|
288
|
-
// Unref so the parent can exit
|
|
289
|
-
child.unref();
|
|
290
|
-
resolve({
|
|
291
|
-
started: true,
|
|
292
|
-
pid: child.pid,
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
else {
|
|
296
|
-
resolve({
|
|
297
|
-
started: false,
|
|
298
|
-
pid: null,
|
|
299
|
-
error: errorOutput || 'No PID assigned',
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
catch {
|
|
304
|
-
// Process died - check error output
|
|
305
|
-
const errMsg = errorOutput.includes('ERR_MODULE_NOT_FOUND')
|
|
306
|
-
? 'Missing dependencies. Run: npm install agentic-qe'
|
|
307
|
-
: errorOutput || 'Process exited immediately';
|
|
308
|
-
resolve({
|
|
309
|
-
started: false,
|
|
310
|
-
pid: null,
|
|
311
|
-
error: errMsg,
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
}, 1500);
|
|
315
|
-
}
|
|
316
|
-
catch (error) {
|
|
317
|
-
resolve({
|
|
318
|
-
started: false,
|
|
319
|
-
pid: null,
|
|
320
|
-
error: error instanceof Error ? error.message : 'Spawn failed',
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Find the aqe-mcp command
|
|
327
|
-
*
|
|
328
|
-
* Search order:
|
|
329
|
-
* 1. Local aqe-mcp binary (node_modules/.bin/)
|
|
330
|
-
* 2. Local bundled MCP server (node_modules/agentic-qe/dist/)
|
|
331
|
-
* 3. Local aqe CLI binary with mcp subcommand
|
|
332
|
-
* 4. npx fallback (uses aqe mcp subcommand)
|
|
333
|
-
*/
|
|
334
|
-
async findMcpCommand(projectRoot) {
|
|
335
|
-
// Try local node_modules aqe-mcp binary first
|
|
336
|
-
const localMcpBin = join(projectRoot, 'node_modules', '.bin', 'aqe-mcp');
|
|
337
|
-
if (existsSync(localMcpBin)) {
|
|
338
|
-
return { command: localMcpBin, args: [] };
|
|
339
|
-
}
|
|
340
|
-
// Try local node_modules bundle (alternative path)
|
|
341
|
-
const localBundle = join(projectRoot, 'node_modules', 'agentic-qe', 'dist', 'mcp', 'bundle.js');
|
|
342
|
-
if (existsSync(localBundle)) {
|
|
343
|
-
return { command: 'node', args: [localBundle] };
|
|
344
|
-
}
|
|
345
|
-
// Try local aqe CLI binary with mcp subcommand
|
|
346
|
-
const localAqeBin = join(projectRoot, 'node_modules', '.bin', 'aqe');
|
|
347
|
-
if (existsSync(localAqeBin)) {
|
|
348
|
-
return { command: localAqeBin, args: ['mcp'] };
|
|
349
|
-
}
|
|
350
|
-
// Fallback to npx with aqe mcp subcommand
|
|
351
|
-
// The CLI now has an 'mcp' command that starts the MCP server
|
|
352
|
-
return { command: 'npx', args: ['--yes', 'agentic-qe', 'mcp'] };
|
|
353
|
-
}
|
|
354
209
|
}
|
|
355
210
|
// Instance exported from index.ts
|
|
356
211
|
//# sourceMappingURL=10-workers.js.map
|