@mrxkun/mcfast-mcp 3.3.5 → 3.3.7
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/README.md +25 -11
- package/package.json +1 -1
- package/src/index.js +271 -153
- package/src/strategies/fuzzy-patch.js +415 -125
- package/src/strategies/tree-sitter/languages.js +40 -21
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tree-sitter Language Loader
|
|
2
|
+
* Tree-sitter Language Loader (v4.0+)
|
|
3
|
+
*
|
|
4
|
+
* Performance Optimization:
|
|
5
|
+
* - Cache Parser instances per language to avoid WASM re-initialization overhead
|
|
6
|
+
* - Reusing parsers significantly reduces latency for repeated operations
|
|
3
7
|
*/
|
|
4
8
|
import path from 'path';
|
|
5
9
|
import { createRequire } from 'module';
|
|
@@ -12,36 +16,31 @@ const require = createRequire(import.meta.url);
|
|
|
12
16
|
const _Parser = require('web-tree-sitter');
|
|
13
17
|
|
|
14
18
|
let Parser = _Parser;
|
|
15
|
-
// If default export exists, use it
|
|
16
19
|
if (Parser.default) {
|
|
17
20
|
Parser = Parser.default;
|
|
18
21
|
}
|
|
19
|
-
// If Parser property exists and Parser itself isn't the constructor
|
|
20
22
|
if (typeof Parser !== 'function' && Parser.Parser) {
|
|
21
23
|
Parser = Parser.Parser;
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
let isInitialized = false;
|
|
25
27
|
const languageCache = new Map();
|
|
28
|
+
const parserCache = new Map();
|
|
26
29
|
|
|
27
|
-
// Map internal language IDs to WASM filenames
|
|
28
30
|
const WASM_MAP = {
|
|
29
31
|
'go': 'tree-sitter-go.wasm',
|
|
30
32
|
'rust': 'tree-sitter-rust.wasm',
|
|
31
33
|
'java': 'tree-sitter-java.wasm',
|
|
32
34
|
'javascript': 'tree-sitter-javascript.wasm',
|
|
33
|
-
'typescript': 'tree-sitter-javascript.wasm',
|
|
35
|
+
'typescript': 'tree-sitter-javascript.wasm',
|
|
34
36
|
'python': 'tree-sitter-python.wasm',
|
|
35
37
|
'cpp': 'tree-sitter-cpp.wasm',
|
|
36
|
-
'c': 'tree-sitter-cpp.wasm',
|
|
38
|
+
'c': 'tree-sitter-cpp.wasm',
|
|
37
39
|
'csharp': 'tree-sitter-c-sharp.wasm',
|
|
38
40
|
'php': 'tree-sitter-php.wasm',
|
|
39
41
|
'ruby': 'tree-sitter-ruby.wasm',
|
|
40
42
|
};
|
|
41
43
|
|
|
42
|
-
/**
|
|
43
|
-
* Initialize web-tree-sitter
|
|
44
|
-
*/
|
|
45
44
|
async function init() {
|
|
46
45
|
if (isInitialized) return;
|
|
47
46
|
try {
|
|
@@ -52,7 +51,6 @@ async function init() {
|
|
|
52
51
|
isInitialized = true;
|
|
53
52
|
} catch (e) {
|
|
54
53
|
console.error('Failed to initialize web-tree-sitter:', e);
|
|
55
|
-
// Fallback: try without explicit path (may work if in same dir)
|
|
56
54
|
try {
|
|
57
55
|
await Parser.init();
|
|
58
56
|
isInitialized = true;
|
|
@@ -62,10 +60,6 @@ async function init() {
|
|
|
62
60
|
}
|
|
63
61
|
}
|
|
64
62
|
|
|
65
|
-
/**
|
|
66
|
-
* Load language parser
|
|
67
|
-
* @param {string} language - 'go', 'rust', 'java', etc.
|
|
68
|
-
*/
|
|
69
63
|
export async function loadLanguage(language) {
|
|
70
64
|
if (!isInitialized) await init();
|
|
71
65
|
|
|
@@ -78,12 +72,7 @@ export async function loadLanguage(language) {
|
|
|
78
72
|
throw new Error(`Unsupported tree-sitter language: ${language}`);
|
|
79
73
|
}
|
|
80
74
|
|
|
81
|
-
// Resolve path to wasm file
|
|
82
|
-
// Assuming this file is at packages/mcp-client/src/strategies/tree-sitter/languages.js
|
|
83
|
-
// and wasm files are at packages/mcp-client/src/strategies/tree-sitter/wasm/
|
|
84
75
|
const wasmPath = path.resolve(__dirname, 'wasm', wasmFile);
|
|
85
|
-
|
|
86
|
-
// Resolve Language class
|
|
87
76
|
let Language = Parser.Language;
|
|
88
77
|
if (!Language && _Parser.Language) {
|
|
89
78
|
Language = _Parser.Language;
|
|
@@ -94,20 +83,50 @@ export async function loadLanguage(language) {
|
|
|
94
83
|
languageCache.set(language, lang);
|
|
95
84
|
return lang;
|
|
96
85
|
} catch (e) {
|
|
97
|
-
// Fallback for different environments where __dirname might behave differently
|
|
98
|
-
// Try relative path if absolute fails, or check common locations
|
|
99
86
|
console.error(`Failed to load language ${language} from ${wasmPath}`, e);
|
|
100
87
|
throw e;
|
|
101
88
|
}
|
|
102
89
|
}
|
|
103
90
|
|
|
91
|
+
/**
|
|
92
|
+
* Get cached Parser instance for language (v4.0 optimization)
|
|
93
|
+
* Reuses Parser instances instead of creating new ones each time
|
|
94
|
+
*/
|
|
104
95
|
export async function getParser(language) {
|
|
96
|
+
if (!isInitialized) await init();
|
|
97
|
+
|
|
98
|
+
if (parserCache.has(language)) {
|
|
99
|
+
return parserCache.get(language);
|
|
100
|
+
}
|
|
101
|
+
|
|
105
102
|
const lang = await loadLanguage(language);
|
|
106
103
|
const parser = new Parser();
|
|
107
104
|
parser.setLanguage(lang);
|
|
105
|
+
parserCache.set(language, parser);
|
|
108
106
|
return parser;
|
|
109
107
|
}
|
|
110
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Clear parser cache (useful for testing or memory management)
|
|
111
|
+
*/
|
|
112
|
+
export function clearParserCache() {
|
|
113
|
+
for (const parser of parserCache.values()) {
|
|
114
|
+
parser.delete?.();
|
|
115
|
+
}
|
|
116
|
+
parserCache.clear();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Get cache statistics
|
|
121
|
+
*/
|
|
122
|
+
export function getCacheStats() {
|
|
123
|
+
return {
|
|
124
|
+
languagesLoaded: languageCache.size,
|
|
125
|
+
parsersCached: parserCache.size,
|
|
126
|
+
supportedLanguages: Object.keys(WASM_MAP)
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
111
130
|
/**
|
|
112
131
|
* Get compiled query for language
|
|
113
132
|
*/
|