@mcp-graph-workflow/mcp-graph 5.28.1 → 5.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/core/code/analyzer-factory.d.ts +15 -0
  2. package/dist/core/code/analyzer-factory.d.ts.map +1 -0
  3. package/dist/core/code/analyzer-factory.js +57 -0
  4. package/dist/core/code/analyzer-factory.js.map +1 -0
  5. package/dist/core/code/code-search.d.ts +1 -0
  6. package/dist/core/code/code-search.d.ts.map +1 -1
  7. package/dist/core/code/code-search.js +11 -5
  8. package/dist/core/code/code-search.js.map +1 -1
  9. package/dist/core/code/code-store.d.ts +1 -0
  10. package/dist/core/code/code-store.d.ts.map +1 -1
  11. package/dist/core/code/code-store.js +16 -6
  12. package/dist/core/code/code-store.js.map +1 -1
  13. package/dist/core/code/code-types.d.ts +53 -0
  14. package/dist/core/code/code-types.d.ts.map +1 -1
  15. package/dist/core/code/code-types.js +15 -0
  16. package/dist/core/code/code-types.js.map +1 -1
  17. package/dist/core/code/treesitter/reference-content.d.ts +34 -0
  18. package/dist/core/code/treesitter/reference-content.d.ts.map +1 -0
  19. package/dist/core/code/treesitter/reference-content.js +302 -0
  20. package/dist/core/code/treesitter/reference-content.js.map +1 -0
  21. package/dist/core/code/treesitter/treesitter-analyzer.d.ts +21 -0
  22. package/dist/core/code/treesitter/treesitter-analyzer.d.ts.map +1 -0
  23. package/dist/core/code/treesitter/treesitter-analyzer.js +414 -0
  24. package/dist/core/code/treesitter/treesitter-analyzer.js.map +1 -0
  25. package/dist/core/code/treesitter/treesitter-manager.d.ts +32 -0
  26. package/dist/core/code/treesitter/treesitter-manager.d.ts.map +1 -0
  27. package/dist/core/code/treesitter/treesitter-manager.js +155 -0
  28. package/dist/core/code/treesitter/treesitter-manager.js.map +1 -0
  29. package/dist/core/planner/lifecycle-phase.js +1 -1
  30. package/dist/core/planner/lifecycle-phase.js.map +1 -1
  31. package/dist/core/rag/code-context-indexer.d.ts +2 -0
  32. package/dist/core/rag/code-context-indexer.d.ts.map +1 -1
  33. package/dist/core/rag/code-context-indexer.js +33 -16
  34. package/dist/core/rag/code-context-indexer.js.map +1 -1
  35. package/dist/core/store/migrations.d.ts.map +1 -1
  36. package/dist/core/store/migrations.js +43 -0
  37. package/dist/core/store/migrations.js.map +1 -1
  38. package/dist/mcp/server.js +3 -1
  39. package/dist/mcp/server.js.map +1 -1
  40. package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -1
  41. package/dist/mcp/tools/reindex-knowledge.js +9 -2
  42. package/dist/mcp/tools/reindex-knowledge.js.map +1 -1
  43. package/package.json +12 -1
@@ -0,0 +1,414 @@
1
+ /**
2
+ * TreeSitterAnalyzer — Multi-language code analyzer using web-tree-sitter.
3
+ * Implements CodeAnalyzer interface. Extracts symbols, relations,
4
+ * docstrings, visibility, and source snippets from any supported language.
5
+ *
6
+ * Uses LANGUAGE_REFERENCES for deterministic, rule-based extraction.
7
+ * AI is never used here — pure AST parsing.
8
+ */
9
+ import { readFileSync } from "node:fs";
10
+ import path from "node:path";
11
+ import { logger } from "../../utils/logger.js";
12
+ import { TreeSitterManager, resetTreeSitterLoader } from "./treesitter-manager.js";
13
+ import { LANGUAGE_REFERENCES, SUPPORTED_LANGUAGES } from "./reference-content.js";
14
+ export { resetTreeSitterLoader };
15
+ // ── Extension → language mapping ─────────────────────────
16
+ function buildExtensionMap() {
17
+ const map = new Map();
18
+ for (const ref of Object.values(LANGUAGE_REFERENCES)) {
19
+ for (const ext of ref.extensions) {
20
+ map.set(ext, ref.languageId);
21
+ }
22
+ }
23
+ return map;
24
+ }
25
+ const EXTENSION_MAP = buildExtensionMap();
26
+ // ── Symbol extraction helpers ────────────────────────────
27
+ function getNodeName(node) {
28
+ // Try common field names for the symbol name
29
+ const nameNode = node.childForFieldName?.("name");
30
+ if (nameNode)
31
+ return nameNode.text;
32
+ return null;
33
+ }
34
+ function getSourceSnippet(node, maxLines = 20) {
35
+ const text = node.text;
36
+ const lines = text.split("\n");
37
+ return lines.slice(0, maxLines).join("\n");
38
+ }
39
+ function getPrecedingComment(node, languageId) {
40
+ const ref = LANGUAGE_REFERENCES[languageId];
41
+ if (!ref)
42
+ return null;
43
+ let sibling = node.previousNamedSibling;
44
+ const commentLines = [];
45
+ while (sibling) {
46
+ const type = sibling.type;
47
+ if (type === "comment" || type === "line_comment" || type === "block_comment") {
48
+ const text = sibling.text;
49
+ if (ref.docstringPattern.commentRegex.test(text)) {
50
+ commentLines.unshift(text);
51
+ sibling = sibling.previousNamedSibling;
52
+ continue;
53
+ }
54
+ }
55
+ break;
56
+ }
57
+ if (commentLines.length === 0)
58
+ return null;
59
+ // Clean comment markers
60
+ return commentLines
61
+ .map((line) => line.replace(/^\/\/\/?\s?|^\/\*\*?\s?|\*\/\s?$|^\s*\*\s?|^#\s?|^---?\s?/gm, "").trim())
62
+ .filter(Boolean)
63
+ .join("\n");
64
+ }
65
+ function getPythonDocstring(node) {
66
+ // Python docstrings: first expression_statement > string in body block
67
+ const body = node.childForFieldName?.("body");
68
+ if (!body)
69
+ return null;
70
+ const firstChild = body.firstNamedChild;
71
+ if (!firstChild)
72
+ return null;
73
+ if (firstChild.type === "expression_statement") {
74
+ const stringNode = firstChild.firstNamedChild;
75
+ if (stringNode && stringNode.type === "string") {
76
+ const text = stringNode.text;
77
+ // Strip triple quotes
78
+ return text.replace(/^["']{3}\s*|["']{3}\s*$/g, "").trim();
79
+ }
80
+ }
81
+ return null;
82
+ }
83
+ function detectVisibility(name, node, languageId) {
84
+ const ref = LANGUAGE_REFERENCES[languageId];
85
+ if (!ref)
86
+ return "public";
87
+ switch (ref.visibilityRules.exportDetection) {
88
+ case "underscore_prefix":
89
+ if (name.startsWith("__") && !name.endsWith("__"))
90
+ return "private";
91
+ if (name.startsWith("_"))
92
+ return "private";
93
+ return "public";
94
+ case "uppercase_first":
95
+ return /^[A-Z]/.test(name) ? "public" : "package";
96
+ case "pub_keyword": {
97
+ // Check for visibility_modifier child
98
+ const visMod = node.children?.find((c) => c.type === "visibility_modifier");
99
+ if (visMod) {
100
+ const text = visMod.text;
101
+ if (text === "pub")
102
+ return "public";
103
+ if (text.includes("crate"))
104
+ return "internal";
105
+ if (text.includes("super"))
106
+ return "protected";
107
+ }
108
+ return "private";
109
+ }
110
+ case "modifier_keyword": {
111
+ // Check for modifiers node or direct visibility_modifier
112
+ const mods = node.children?.find((c) => c.type === "modifiers" || c.type === "modifier" || c.type === "visibility_modifier");
113
+ if (mods) {
114
+ const text = mods.text;
115
+ if (text.includes("public"))
116
+ return "public";
117
+ if (text.includes("private"))
118
+ return "private";
119
+ if (text.includes("protected"))
120
+ return "protected";
121
+ if (text.includes("internal"))
122
+ return "internal";
123
+ }
124
+ return ref.visibilityRules.defaultVisibility;
125
+ }
126
+ case "access_specifier":
127
+ case "static_keyword":
128
+ case "return_table":
129
+ case "visibility_section":
130
+ return ref.visibilityRules.defaultVisibility;
131
+ default:
132
+ return "public";
133
+ }
134
+ }
135
+ function detectExported(name, languageId, visibility) {
136
+ const ref = LANGUAGE_REFERENCES[languageId];
137
+ if (!ref)
138
+ return true;
139
+ switch (ref.visibilityRules.exportDetection) {
140
+ case "uppercase_first":
141
+ return /^[A-Z]/.test(name);
142
+ case "underscore_prefix":
143
+ return !name.startsWith("_");
144
+ case "pub_keyword":
145
+ return visibility === "public";
146
+ case "modifier_keyword":
147
+ return visibility === "public";
148
+ default:
149
+ return true;
150
+ }
151
+ }
152
+ function extractSymbolsFromNode(node, ctx) {
153
+ const type = node.type;
154
+ const ref = LANGUAGE_REFERENCES[ctx.languageId];
155
+ // ── Symbol extraction by node type ─────────────────
156
+ let symbolKind = null;
157
+ // Map node types to symbol kinds using reference
158
+ if (ref) {
159
+ for (const [kind, nodeType] of Object.entries(ref.symbolNodeTypes)) {
160
+ if (type === nodeType) {
161
+ symbolKind = kind;
162
+ break;
163
+ }
164
+ }
165
+ }
166
+ // Special handling for type_spec in Go (wraps struct_type, interface_type)
167
+ if (ctx.languageId === "go" && type === "type_spec") {
168
+ const typeChild = node.childForFieldName?.("type");
169
+ if (typeChild) {
170
+ if (typeChild.type === "struct_type")
171
+ symbolKind = "struct";
172
+ else if (typeChild.type === "interface_type")
173
+ symbolKind = "interface";
174
+ else
175
+ symbolKind = "type_alias";
176
+ }
177
+ }
178
+ // Go: type_declaration wraps type_spec
179
+ if (ctx.languageId === "go" && type === "type_declaration") {
180
+ for (const child of node.namedChildren ?? []) {
181
+ extractSymbolsFromNode(child, ctx);
182
+ }
183
+ return;
184
+ }
185
+ // Python decorated_definition — extract the inner definition
186
+ if (ctx.languageId === "python" && type === "decorated_definition") {
187
+ const defNode = node.childForFieldName?.("definition");
188
+ if (defNode) {
189
+ extractSymbolsFromNode(defNode, ctx);
190
+ }
191
+ return;
192
+ }
193
+ if (symbolKind) {
194
+ const name = getNodeName(node);
195
+ if (name) {
196
+ const visibility = detectVisibility(name, node, ctx.languageId);
197
+ const exported = detectExported(name, ctx.languageId, visibility);
198
+ // Docstring extraction
199
+ let docstring = null;
200
+ if (ctx.languageId === "python") {
201
+ docstring = getPythonDocstring(node);
202
+ }
203
+ if (!docstring) {
204
+ docstring = getPrecedingComment(node, ctx.languageId);
205
+ }
206
+ const startLine = (node.startPosition?.row ?? 0) + 1;
207
+ const endLine = (node.endPosition?.row ?? 0) + 1;
208
+ // Determine if it's a method (function inside class)
209
+ let resolvedKind = symbolKind;
210
+ if (symbolKind === "function" && ctx.parentName) {
211
+ resolvedKind = "method";
212
+ }
213
+ ctx.symbols.push({
214
+ name,
215
+ kind: resolvedKind,
216
+ file: ctx.file,
217
+ startLine,
218
+ endLine,
219
+ exported,
220
+ language: ctx.languageId,
221
+ docstring: docstring ?? undefined,
222
+ sourceSnippet: getSourceSnippet(node),
223
+ visibility,
224
+ });
225
+ // Recurse into class/struct bodies for methods
226
+ if (["class", "struct"].includes(symbolKind)) {
227
+ const body = node.childForFieldName?.("body");
228
+ if (body) {
229
+ for (const child of body.namedChildren ?? []) {
230
+ extractSymbolsFromNode(child, { ...ctx, parentName: name });
231
+ }
232
+ }
233
+ return;
234
+ }
235
+ // Recurse into function body for call detection
236
+ const body = node.childForFieldName?.("body");
237
+ if (body) {
238
+ extractRelationsFromSubtree(body, ctx, name);
239
+ }
240
+ return;
241
+ }
242
+ }
243
+ // ── Relation extraction ────────────────────────────
244
+ // Imports
245
+ if (ref && ref.importNodeTypes.includes(type)) {
246
+ const importTarget = extractImportTarget(node, ctx.languageId);
247
+ if (importTarget) {
248
+ ctx.relations.push({
249
+ fromSymbol: ctx.file,
250
+ toSymbol: importTarget,
251
+ type: "imports",
252
+ file: ctx.file,
253
+ line: (node.startPosition?.row ?? 0) + 1,
254
+ });
255
+ }
256
+ }
257
+ // Calls (function/method invocations)
258
+ if (type === "call" || type === "call_expression" || type === "method_invocation" || type === "function_call") {
259
+ const callTarget = extractCallTarget(node);
260
+ if (callTarget) {
261
+ ctx.relations.push({
262
+ fromSymbol: ctx.parentName ?? ctx.file,
263
+ toSymbol: callTarget,
264
+ type: "calls",
265
+ file: ctx.file,
266
+ line: (node.startPosition?.row ?? 0) + 1,
267
+ });
268
+ }
269
+ }
270
+ // ── Recurse into children ──────────────────────────
271
+ for (const child of node.namedChildren ?? []) {
272
+ extractSymbolsFromNode(child, ctx);
273
+ }
274
+ }
275
+ /** Recursively extract only relations (calls) from a subtree — used for function bodies. */
276
+ function extractRelationsFromSubtree(node, ctx, scopeName) {
277
+ const type = node.type;
278
+ if (type === "call" || type === "call_expression" || type === "method_invocation" || type === "function_call") {
279
+ const callTarget = extractCallTarget(node);
280
+ if (callTarget) {
281
+ ctx.relations.push({
282
+ fromSymbol: scopeName,
283
+ toSymbol: callTarget,
284
+ type: "calls",
285
+ file: ctx.file,
286
+ line: (node.startPosition?.row ?? 0) + 1,
287
+ });
288
+ }
289
+ }
290
+ for (const child of node.namedChildren ?? []) {
291
+ extractRelationsFromSubtree(child, ctx, scopeName);
292
+ }
293
+ }
294
+ function extractImportTarget(node, languageId) {
295
+ if (languageId === "python") {
296
+ // import os → module_name field or name
297
+ const moduleName = node.childForFieldName?.("module_name");
298
+ if (moduleName)
299
+ return moduleName.text;
300
+ const nameNode = node.childForFieldName?.("name");
301
+ if (nameNode)
302
+ return nameNode.text;
303
+ }
304
+ if (languageId === "go") {
305
+ // import_spec → path field
306
+ for (const child of node.namedChildren ?? []) {
307
+ if (child.type === "import_spec") {
308
+ const pathNode = child.childForFieldName?.("path");
309
+ if (pathNode)
310
+ return pathNode.text.replace(/"/g, "");
311
+ }
312
+ }
313
+ }
314
+ if (languageId === "rust") {
315
+ const arg = node.childForFieldName?.("argument");
316
+ if (arg)
317
+ return arg.text;
318
+ }
319
+ if (languageId === "java" || languageId === "kotlin") {
320
+ const nameNode = node.childForFieldName?.("name") ?? node.namedChildren?.[0];
321
+ if (nameNode)
322
+ return nameNode.text;
323
+ }
324
+ // Generic fallback: first named child text
325
+ const first = node.firstNamedChild;
326
+ if (first)
327
+ return first.text;
328
+ return null;
329
+ }
330
+ function extractCallTarget(node) {
331
+ const funcNode = node.childForFieldName?.("function");
332
+ if (funcNode) {
333
+ // Simple identifier: foo()
334
+ if (funcNode.type === "identifier")
335
+ return funcNode.text;
336
+ // Attribute access: obj.method() — extract method name
337
+ const attr = funcNode.childForFieldName?.("attribute");
338
+ if (attr)
339
+ return attr.text;
340
+ // Property: obj.method → field
341
+ const field = funcNode.childForFieldName?.("field");
342
+ if (field)
343
+ return field.text;
344
+ }
345
+ // Java: method_invocation has "name" field
346
+ const nameNode = node.childForFieldName?.("name");
347
+ if (nameNode && nameNode.type === "identifier")
348
+ return nameNode.text;
349
+ return null;
350
+ }
351
+ // ── TreeSitterAnalyzer class ─────────────────────────────
352
+ export class TreeSitterAnalyzer {
353
+ manager;
354
+ languages;
355
+ extensions;
356
+ constructor() {
357
+ this.manager = new TreeSitterManager();
358
+ this.languages = [...SUPPORTED_LANGUAGES];
359
+ this.extensions = [...new Set(Object.values(LANGUAGE_REFERENCES).flatMap((r) => r.extensions))];
360
+ }
361
+ /** Initialize the tree-sitter WASM runtime. Must be called before analyzeFile. */
362
+ async initialize() {
363
+ await this.manager.initialize();
364
+ }
365
+ async analyzeFile(filePath, basePath) {
366
+ const relativePath = path.relative(basePath, filePath);
367
+ const ext = path.extname(filePath);
368
+ const languageId = EXTENSION_MAP.get(ext);
369
+ if (!languageId) {
370
+ return { file: relativePath, symbols: [], relations: [] };
371
+ }
372
+ const parser = await this.manager.getParser(languageId);
373
+ if (!parser) {
374
+ logger.debug("treesitter-analyzer:no-parser", { languageId, file: relativePath });
375
+ return { file: relativePath, symbols: [], relations: [] };
376
+ }
377
+ let content;
378
+ try {
379
+ content = readFileSync(filePath, "utf-8");
380
+ }
381
+ catch {
382
+ logger.debug("treesitter-analyzer:read-error", { file: relativePath });
383
+ return { file: relativePath, symbols: [], relations: [] };
384
+ }
385
+ const tree = parser.parse(content);
386
+ if (!tree) {
387
+ return { file: relativePath, symbols: [], relations: [] };
388
+ }
389
+ const ctx = {
390
+ languageId,
391
+ file: relativePath,
392
+ symbols: [],
393
+ relations: [],
394
+ content,
395
+ parentName: null,
396
+ };
397
+ // Walk the AST root
398
+ for (const child of tree.rootNode.namedChildren ?? []) {
399
+ extractSymbolsFromNode(child, ctx);
400
+ }
401
+ logger.debug("treesitter-analyzer:analyzed", {
402
+ file: relativePath,
403
+ languageId,
404
+ symbols: String(ctx.symbols.length),
405
+ relations: String(ctx.relations.length),
406
+ });
407
+ return {
408
+ file: relativePath,
409
+ symbols: ctx.symbols,
410
+ relations: ctx.relations,
411
+ };
412
+ }
413
+ }
414
+ //# sourceMappingURL=treesitter-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treesitter-analyzer.js","sourceRoot":"","sources":["../../../../src/core/code/treesitter/treesitter-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * TreeSitterManager — Lazy-loads web-tree-sitter WASM runtime and
3
+ * caches Parser instances per language. Grammars are loaded on-demand
4
+ * from npm packages (tree-sitter-{lang}).
5
+ *
6
+ * Pattern: same lazy-loading approach as ts-analyzer.ts loadTypeScript().
7
+ * Graceful degradation: missing grammar → returns null, never throws.
8
+ */
9
+ type ParserInstance = any;
10
+ /** Check if web-tree-sitter is available at runtime. */
11
+ export declare function isTreeSitterAvailable(): Promise<boolean>;
12
+ /** Reset loader state (for testing). */
13
+ export declare function resetTreeSitterLoader(): void;
14
+ export declare class TreeSitterManager {
15
+ private parsers;
16
+ private failedLanguages;
17
+ /** Initialize the WASM runtime. Safe to call multiple times. */
18
+ initialize(): Promise<void>;
19
+ /**
20
+ * Get a parser for a specific language. Returns null if:
21
+ * - web-tree-sitter is not available
22
+ * - Grammar WASM not installed for this language
23
+ * - Language is not in the registry
24
+ */
25
+ getParser(languageId: string): Promise<ParserInstance | null>;
26
+ /** Check if a language has a grammar registered. */
27
+ isLanguageSupported(languageId: string): boolean;
28
+ /** Get list of all registered language IDs. */
29
+ getSupportedLanguages(): string[];
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=treesitter-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treesitter-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/code/treesitter/treesitter-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,KAAK,cAAc,GAAG,GAAG,CAAC;AAsD1B,wDAAwD;AACxD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG9D;AAED,wCAAwC;AACxC,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AA4BD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,eAAe,CAA0B;IAEjD,gEAAgE;IAC1D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;;OAKG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAqDnE,oDAAoD;IACpD,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIhD,+CAA+C;IAC/C,qBAAqB,IAAI,MAAM,EAAE;CAGlC"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * TreeSitterManager — Lazy-loads web-tree-sitter WASM runtime and
3
+ * caches Parser instances per language. Grammars are loaded on-demand
4
+ * from npm packages (tree-sitter-{lang}).
5
+ *
6
+ * Pattern: same lazy-loading approach as ts-analyzer.ts loadTypeScript().
7
+ * Graceful degradation: missing grammar → returns null, never throws.
8
+ */
9
+ import { join } from "node:path";
10
+ import { existsSync } from "node:fs";
11
+ import { logger } from "../../utils/logger.js";
12
+ // ── Grammar registry ─────────────────────────────────────
13
+ /** Maps languageId → npm package name + wasm file name */
14
+ const GRAMMAR_REGISTRY = {
15
+ python: { pkg: "tree-sitter-python", wasm: "tree-sitter-python.wasm" },
16
+ go: { pkg: "tree-sitter-go", wasm: "tree-sitter-go.wasm" },
17
+ rust: { pkg: "tree-sitter-rust", wasm: "tree-sitter-rust.wasm" },
18
+ java: { pkg: "tree-sitter-java", wasm: "tree-sitter-java.wasm" },
19
+ c: { pkg: "tree-sitter-c", wasm: "tree-sitter-c.wasm" },
20
+ cpp: { pkg: "tree-sitter-cpp", wasm: "tree-sitter-cpp.wasm" },
21
+ ruby: { pkg: "tree-sitter-ruby", wasm: "tree-sitter-ruby.wasm" },
22
+ php: { pkg: "tree-sitter-php", wasm: "tree-sitter-php.wasm" },
23
+ csharp: { pkg: "tree-sitter-c-sharp", wasm: "tree-sitter-c_sharp.wasm" },
24
+ lua: { pkg: "tree-sitter-lua", wasm: "tree-sitter-lua.wasm" },
25
+ };
26
+ let tsModule = null;
27
+ let initAttempted = false;
28
+ async function loadWebTreeSitter() {
29
+ if (tsModule)
30
+ return tsModule;
31
+ if (initAttempted)
32
+ return null;
33
+ initAttempted = true;
34
+ try {
35
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
+ const mod = await import("web-tree-sitter");
37
+ // web-tree-sitter exports { Parser, Language, ... } — init() is on Parser
38
+ const ParserClass = mod.Parser ?? mod.default;
39
+ const LanguageClass = mod.Language;
40
+ await ParserClass.init();
41
+ tsModule = { ParserClass, LanguageClass };
42
+ logger.info("treesitter-manager:init", { message: "web-tree-sitter WASM runtime loaded" });
43
+ return tsModule;
44
+ }
45
+ catch (err) {
46
+ logger.warn("treesitter-manager:unavailable", {
47
+ message: "web-tree-sitter not found — multi-language code analysis disabled",
48
+ error: String(err),
49
+ });
50
+ return null;
51
+ }
52
+ }
53
+ /** Check if web-tree-sitter is available at runtime. */
54
+ export async function isTreeSitterAvailable() {
55
+ const result = await loadWebTreeSitter();
56
+ return result !== null;
57
+ }
58
+ /** Reset loader state (for testing). */
59
+ export function resetTreeSitterLoader() {
60
+ tsModule = null;
61
+ initAttempted = false;
62
+ }
63
+ // ── Resolve grammar WASM path ────────────────────────────
64
+ function resolveGrammarPath(languageId) {
65
+ const entry = GRAMMAR_REGISTRY[languageId];
66
+ if (!entry)
67
+ return null;
68
+ try {
69
+ // Resolve the package path via require.resolve
70
+ const pkgMain = require.resolve(`${entry.pkg}/package.json`);
71
+ const pkgDir = pkgMain.replace(/[/\\]package\.json$/, "");
72
+ const wasmPath = join(pkgDir, entry.wasm);
73
+ if (existsSync(wasmPath)) {
74
+ return wasmPath;
75
+ }
76
+ logger.debug("treesitter-manager:wasm-not-found", { languageId, wasmPath });
77
+ return null;
78
+ }
79
+ catch {
80
+ logger.debug("treesitter-manager:pkg-not-found", { languageId, pkg: entry.pkg });
81
+ return null;
82
+ }
83
+ }
84
+ // ── TreeSitterManager class ──────────────────────────────
85
+ export class TreeSitterManager {
86
+ parsers = new Map();
87
+ failedLanguages = new Set();
88
+ /** Initialize the WASM runtime. Safe to call multiple times. */
89
+ async initialize() {
90
+ await loadWebTreeSitter();
91
+ }
92
+ /**
93
+ * Get a parser for a specific language. Returns null if:
94
+ * - web-tree-sitter is not available
95
+ * - Grammar WASM not installed for this language
96
+ * - Language is not in the registry
97
+ */
98
+ async getParser(languageId) {
99
+ // Check cache
100
+ const cached = this.parsers.get(languageId);
101
+ if (cached)
102
+ return cached;
103
+ // Already failed for this language — don't retry
104
+ if (this.failedLanguages.has(languageId))
105
+ return null;
106
+ // Not in registry
107
+ if (!GRAMMAR_REGISTRY[languageId]) {
108
+ this.failedLanguages.add(languageId);
109
+ return null;
110
+ }
111
+ // Load WASM runtime
112
+ const wts = await loadWebTreeSitter();
113
+ if (!wts)
114
+ return null;
115
+ // Resolve grammar path
116
+ const wasmPath = resolveGrammarPath(languageId);
117
+ if (!wasmPath) {
118
+ this.failedLanguages.add(languageId);
119
+ logger.info("treesitter-manager:grammar-unavailable", {
120
+ languageId,
121
+ message: `Grammar for ${languageId} not installed — skipping`,
122
+ });
123
+ return null;
124
+ }
125
+ try {
126
+ const language = await wts.LanguageClass.load(wasmPath);
127
+ const parser = new wts.ParserClass();
128
+ parser.setLanguage(language);
129
+ // Cache the parser
130
+ this.parsers.set(languageId, parser);
131
+ logger.info("treesitter-manager:parser-loaded", {
132
+ languageId,
133
+ wasmPath,
134
+ });
135
+ return parser;
136
+ }
137
+ catch (err) {
138
+ this.failedLanguages.add(languageId);
139
+ logger.warn("treesitter-manager:parser-load-failed", {
140
+ languageId,
141
+ error: String(err),
142
+ });
143
+ return null;
144
+ }
145
+ }
146
+ /** Check if a language has a grammar registered. */
147
+ isLanguageSupported(languageId) {
148
+ return languageId in GRAMMAR_REGISTRY;
149
+ }
150
+ /** Get list of all registered language IDs. */
151
+ getSupportedLanguages() {
152
+ return Object.keys(GRAMMAR_REGISTRY);
153
+ }
154
+ }
155
+ //# sourceMappingURL=treesitter-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treesitter-manager.js","sourceRoot":"","sources":["../../../../src/core/code/treesitter/treesitter-manager.ts"],"names":[],"mappings":"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"}
@@ -412,7 +412,7 @@ export const PHASE_PREREQUISITES = {
412
412
  triggerCondition: (args) => args.status === "done",
413
413
  requiredTools: [
414
414
  { tool: "context", scope: "node" },
415
- { tool: "rag_context", scope: "node" },
415
+ { tool: "rag_context", scope: "project" },
416
416
  { tool: "analyze", args: "implement_done", scope: "node" },
417
417
  ],
418
418
  description: "Antes de done: chamar `context` + `rag_context` + `analyze(implement_done)`",