@mcp-graph-workflow/mcp-graph 5.11.0 → 5.13.0

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 (101) hide show
  1. package/dist/api/routes/code-graph.d.ts.map +1 -1
  2. package/dist/api/routes/code-graph.js +163 -0
  3. package/dist/api/routes/code-graph.js.map +1 -1
  4. package/dist/core/code/code-indexer.d.ts +5 -3
  5. package/dist/core/code/code-indexer.d.ts.map +1 -1
  6. package/dist/core/code/code-indexer.js +57 -10
  7. package/dist/core/code/code-indexer.js.map +1 -1
  8. package/dist/core/code/code-types.d.ts +8 -0
  9. package/dist/core/code/code-types.d.ts.map +1 -1
  10. package/dist/core/code/code-types.js.map +1 -1
  11. package/dist/core/code/graph-traversal.d.ts +15 -0
  12. package/dist/core/code/graph-traversal.d.ts.map +1 -1
  13. package/dist/core/code/graph-traversal.js +53 -0
  14. package/dist/core/code/graph-traversal.js.map +1 -1
  15. package/dist/core/code/ts-analyzer.d.ts +6 -1
  16. package/dist/core/code/ts-analyzer.d.ts.map +1 -1
  17. package/dist/core/code/ts-analyzer.js +8 -0
  18. package/dist/core/code/ts-analyzer.js.map +1 -1
  19. package/dist/core/config/config-schema.d.ts +8 -0
  20. package/dist/core/config/config-schema.d.ts.map +1 -1
  21. package/dist/core/config/config-schema.js +3 -1
  22. package/dist/core/config/config-schema.js.map +1 -1
  23. package/dist/core/context/context-assembler.d.ts +2 -0
  24. package/dist/core/context/context-assembler.d.ts.map +1 -1
  25. package/dist/core/context/context-assembler.js +15 -0
  26. package/dist/core/context/context-assembler.js.map +1 -1
  27. package/dist/core/lsp/language-detector.d.ts +11 -0
  28. package/dist/core/lsp/language-detector.d.ts.map +1 -0
  29. package/dist/core/lsp/language-detector.js +149 -0
  30. package/dist/core/lsp/language-detector.js.map +1 -0
  31. package/dist/core/lsp/lsp-analyzer.d.ts +16 -0
  32. package/dist/core/lsp/lsp-analyzer.d.ts.map +1 -0
  33. package/dist/core/lsp/lsp-analyzer.js +30 -0
  34. package/dist/core/lsp/lsp-analyzer.js.map +1 -0
  35. package/dist/core/lsp/lsp-bridge.d.ts +40 -0
  36. package/dist/core/lsp/lsp-bridge.d.ts.map +1 -0
  37. package/dist/core/lsp/lsp-bridge.js +349 -0
  38. package/dist/core/lsp/lsp-bridge.js.map +1 -0
  39. package/dist/core/lsp/lsp-cache.d.ts +33 -0
  40. package/dist/core/lsp/lsp-cache.d.ts.map +1 -0
  41. package/dist/core/lsp/lsp-cache.js +134 -0
  42. package/dist/core/lsp/lsp-cache.js.map +1 -0
  43. package/dist/core/lsp/lsp-client.d.ts +47 -0
  44. package/dist/core/lsp/lsp-client.d.ts.map +1 -0
  45. package/dist/core/lsp/lsp-client.js +256 -0
  46. package/dist/core/lsp/lsp-client.js.map +1 -0
  47. package/dist/core/lsp/lsp-diagnostics.d.ts +40 -0
  48. package/dist/core/lsp/lsp-diagnostics.d.ts.map +1 -0
  49. package/dist/core/lsp/lsp-diagnostics.js +113 -0
  50. package/dist/core/lsp/lsp-diagnostics.js.map +1 -0
  51. package/dist/core/lsp/lsp-server-manager.d.ts +56 -0
  52. package/dist/core/lsp/lsp-server-manager.d.ts.map +1 -0
  53. package/dist/core/lsp/lsp-server-manager.js +330 -0
  54. package/dist/core/lsp/lsp-server-manager.js.map +1 -0
  55. package/dist/core/lsp/lsp-types.d.ts +130 -0
  56. package/dist/core/lsp/lsp-types.d.ts.map +1 -0
  57. package/dist/core/lsp/lsp-types.js +131 -0
  58. package/dist/core/lsp/lsp-types.js.map +1 -0
  59. package/dist/core/lsp/server-registry.d.ts +19 -0
  60. package/dist/core/lsp/server-registry.d.ts.map +1 -0
  61. package/dist/core/lsp/server-registry.js +188 -0
  62. package/dist/core/lsp/server-registry.js.map +1 -0
  63. package/dist/core/rag/multi-strategy-retrieval.d.ts +6 -0
  64. package/dist/core/rag/multi-strategy-retrieval.d.ts.map +1 -1
  65. package/dist/core/rag/multi-strategy-retrieval.js +31 -3
  66. package/dist/core/rag/multi-strategy-retrieval.js.map +1 -1
  67. package/dist/core/store/migrations.d.ts.map +1 -1
  68. package/dist/core/store/migrations.js +21 -0
  69. package/dist/core/store/migrations.js.map +1 -1
  70. package/dist/mcp/tools/code-intelligence.d.ts +15 -0
  71. package/dist/mcp/tools/code-intelligence.d.ts.map +1 -0
  72. package/dist/mcp/tools/code-intelligence.js +276 -0
  73. package/dist/mcp/tools/code-intelligence.js.map +1 -0
  74. package/dist/mcp/tools/index.d.ts.map +1 -1
  75. package/dist/mcp/tools/index.js +4 -0
  76. package/dist/mcp/tools/index.js.map +1 -1
  77. package/dist/schemas/knowledge.schema.d.ts +2 -0
  78. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  79. package/dist/schemas/knowledge.schema.js +1 -1
  80. package/dist/schemas/knowledge.schema.js.map +1 -1
  81. package/dist/web/dashboard/dist/assets/{benchmark-tab-DE9sF83l.js → benchmark-tab-BEhOzJlc.js} +1 -1
  82. package/dist/web/dashboard/dist/assets/{context-tab-BDBUYfAA.js → context-tab-ByaP4N46.js} +1 -1
  83. package/dist/web/dashboard/dist/assets/{gitnexus-tab-Yn1v6B3B.js → gitnexus-tab-DJRcS3G4.js} +1 -1
  84. package/dist/web/dashboard/dist/assets/{graph-section-C6dzE7Vr.js → graph-section-BaZ4D0V3.js} +1 -1
  85. package/dist/web/dashboard/dist/assets/{graph-tab-eIpG9sGq.js → graph-tab-DtcApd98.js} +1 -1
  86. package/dist/web/dashboard/dist/assets/{graph-utils-Cq350VUG.js → graph-utils-D63XCNDU.js} +1 -1
  87. package/dist/web/dashboard/dist/assets/index-CArYPWPp.css +1 -0
  88. package/dist/web/dashboard/dist/assets/{index-ruquw1ns.js → index-DQtPV3qe.js} +1 -1
  89. package/dist/web/dashboard/dist/assets/{index-BjE9IIVd.js → index-HSRYSwKs.js} +1 -1
  90. package/dist/web/dashboard/dist/assets/{index-CsH_Hv51.js → index-kFRgiPES.js} +27 -27
  91. package/dist/web/dashboard/dist/assets/{insights-tab-iSZItsRP.js → insights-tab-T0-9T-Z4.js} +1 -1
  92. package/dist/web/dashboard/dist/assets/{journey-tab-GXibD334.js → journey-tab-mvsQLYuc.js} +1 -1
  93. package/dist/web/dashboard/dist/assets/{logs-tab-DROI_l7-.js → logs-tab-HnGNd4kM.js} +1 -1
  94. package/dist/web/dashboard/dist/assets/{memories-tab-DUMqEP5R.js → memories-tab-DFzupuld.js} +1 -1
  95. package/dist/web/dashboard/dist/assets/{prd-backlog-tab-DIQ0Fmr_.js → prd-backlog-tab-D6rg9QUS.js} +1 -1
  96. package/dist/web/dashboard/dist/assets/{siebel-tab-Ci5KiOA6.js → siebel-tab-_cudpzBi.js} +3 -3
  97. package/dist/web/dashboard/dist/assets/{skills-tab-EfuAQFRT.js → skills-tab-wVTeNO96.js} +1 -1
  98. package/dist/web/dashboard/dist/assets/{style-DF9Y1aXX.js → style-B2fcRCDQ.js} +1 -1
  99. package/dist/web/dashboard/dist/index.html +2 -2
  100. package/package.json +1 -1
  101. package/dist/web/dashboard/dist/assets/index-p238Jynp.css +0 -1
@@ -0,0 +1,349 @@
1
+ /**
2
+ * LspBridge — High-level API that routes LSP operations to the correct
3
+ * language server via LspServerManager, with caching via LspCache.
4
+ *
5
+ * Provides goToDefinition, findReferences, hover, rename, call hierarchy,
6
+ * document symbols, and diagnostics — all with graceful degradation when
7
+ * a language server is unavailable.
8
+ */
9
+ import { statSync } from "node:fs";
10
+ import path from "node:path";
11
+ import { createHash } from "node:crypto";
12
+ import { logger } from "../utils/logger.js";
13
+ // ---------------------------------------------------------------------------
14
+ // Symbol kind mapping (LSP spec numbers → readable strings)
15
+ // ---------------------------------------------------------------------------
16
+ const SYMBOL_KIND_MAP = {
17
+ 1: "File", 2: "Module", 3: "Namespace", 4: "Package",
18
+ 5: "Class", 6: "Method", 7: "Property", 8: "Field",
19
+ 9: "Constructor", 10: "Enum", 11: "Interface", 12: "Function",
20
+ 13: "Variable", 14: "Constant", 15: "String", 16: "Number",
21
+ 17: "Boolean", 18: "Array", 19: "Object", 20: "Key",
22
+ 21: "Null", 22: "EnumMember", 23: "Struct", 24: "Event",
23
+ 25: "Operator", 26: "TypeParameter",
24
+ };
25
+ // ---------------------------------------------------------------------------
26
+ // LspBridge
27
+ // ---------------------------------------------------------------------------
28
+ export class LspBridge {
29
+ manager;
30
+ cache;
31
+ diagnostics;
32
+ basePath;
33
+ constructor(manager, cache, diagnostics, basePath) {
34
+ this.manager = manager;
35
+ this.cache = cache;
36
+ this.diagnostics = diagnostics;
37
+ this.basePath = basePath;
38
+ }
39
+ // -----------------------------------------------------------------------
40
+ // Public API
41
+ // -----------------------------------------------------------------------
42
+ async goToDefinition(file, line, character) {
43
+ const raw = await this.executeWithCache("definition", file, line, character, "textDocument/definition", {
44
+ textDocument: { uri: this.toFileUri(file) },
45
+ position: { line: line - 1, character },
46
+ });
47
+ if (!raw) {
48
+ return [];
49
+ }
50
+ const locations = Array.isArray(raw) ? raw : [raw];
51
+ return locations.map((loc) => this.normalizeLocation(loc));
52
+ }
53
+ async findReferences(file, line, character) {
54
+ const raw = await this.executeWithCache("references", file, line, character, "textDocument/references", {
55
+ textDocument: { uri: this.toFileUri(file) },
56
+ position: { line: line - 1, character },
57
+ context: { includeDeclaration: true },
58
+ });
59
+ if (!raw) {
60
+ return [];
61
+ }
62
+ return raw.map((loc) => this.normalizeLocation(loc));
63
+ }
64
+ async hover(file, line, character) {
65
+ const raw = await this.executeWithCache("hover", file, line, character, "textDocument/hover", {
66
+ textDocument: { uri: this.toFileUri(file) },
67
+ position: { line: line - 1, character },
68
+ });
69
+ if (!raw) {
70
+ return null;
71
+ }
72
+ return this.normalizeHover(raw);
73
+ }
74
+ async rename(file, line, character, newName) {
75
+ // Rename is NEVER cached — it is a write operation.
76
+ const client = await this.manager.getClientForFile(path.resolve(this.basePath, file));
77
+ if (!client) {
78
+ logger.warn("lsp-bridge:rename no server available", { file });
79
+ return null;
80
+ }
81
+ try {
82
+ const raw = await client.sendRequest("textDocument/rename", {
83
+ textDocument: { uri: this.toFileUri(file) },
84
+ position: { line: line - 1, character },
85
+ newName,
86
+ });
87
+ if (!raw) {
88
+ return null;
89
+ }
90
+ return this.normalizeWorkspaceEdit(raw);
91
+ }
92
+ catch (err) {
93
+ logger.error("lsp-bridge:rename failed", {
94
+ file,
95
+ error: err instanceof Error ? err.message : String(err),
96
+ });
97
+ return null;
98
+ }
99
+ }
100
+ async callHierarchyIncoming(file, line, character) {
101
+ const client = await this.manager.getClientForFile(path.resolve(this.basePath, file));
102
+ if (!client) {
103
+ logger.warn("lsp-bridge:callHierarchyIncoming no server available", { file });
104
+ return [];
105
+ }
106
+ try {
107
+ // Step 1: prepareCallHierarchy
108
+ const items = await client.sendRequest("textDocument/prepareCallHierarchy", {
109
+ textDocument: { uri: this.toFileUri(file) },
110
+ position: { line: line - 1, character },
111
+ });
112
+ if (!items || items.length === 0) {
113
+ return [];
114
+ }
115
+ // Step 2: incomingCalls for the first item
116
+ const incoming = await client.sendRequest("callHierarchy/incomingCalls", { item: items[0] });
117
+ if (!incoming) {
118
+ return [];
119
+ }
120
+ return incoming.map((call) => this.normalizeCallHierarchyItem(call.from));
121
+ }
122
+ catch (err) {
123
+ logger.error("lsp-bridge:callHierarchyIncoming failed", {
124
+ file,
125
+ error: err instanceof Error ? err.message : String(err),
126
+ });
127
+ return [];
128
+ }
129
+ }
130
+ async callHierarchyOutgoing(file, line, character) {
131
+ const client = await this.manager.getClientForFile(path.resolve(this.basePath, file));
132
+ if (!client) {
133
+ logger.warn("lsp-bridge:callHierarchyOutgoing no server available", { file });
134
+ return [];
135
+ }
136
+ try {
137
+ // Step 1: prepareCallHierarchy
138
+ const items = await client.sendRequest("textDocument/prepareCallHierarchy", {
139
+ textDocument: { uri: this.toFileUri(file) },
140
+ position: { line: line - 1, character },
141
+ });
142
+ if (!items || items.length === 0) {
143
+ return [];
144
+ }
145
+ // Step 2: outgoingCalls for the first item
146
+ const outgoing = await client.sendRequest("callHierarchy/outgoingCalls", { item: items[0] });
147
+ if (!outgoing) {
148
+ return [];
149
+ }
150
+ return outgoing.map((call) => this.normalizeCallHierarchyItem(call.to));
151
+ }
152
+ catch (err) {
153
+ logger.error("lsp-bridge:callHierarchyOutgoing failed", {
154
+ file,
155
+ error: err instanceof Error ? err.message : String(err),
156
+ });
157
+ return [];
158
+ }
159
+ }
160
+ async getDocumentSymbols(file) {
161
+ const raw = await this.executeWithCache("documentSymbol", file, 0, 0, "textDocument/documentSymbol", {
162
+ textDocument: { uri: this.toFileUri(file) },
163
+ });
164
+ if (!raw) {
165
+ return [];
166
+ }
167
+ return raw.map((sym) => this.normalizeDocumentSymbol(file, sym));
168
+ }
169
+ async getDiagnostics(file) {
170
+ // Diagnostics are pushed by the server, not requested — return from collector.
171
+ return this.diagnostics.getForFile(file);
172
+ }
173
+ async getLanguageStatus() {
174
+ return this.manager.getStatus();
175
+ }
176
+ // -----------------------------------------------------------------------
177
+ // Private helpers — cache-aware execution
178
+ // -----------------------------------------------------------------------
179
+ async executeWithCache(operation, file, line, character, lspMethod, params) {
180
+ const absPath = path.resolve(this.basePath, file);
181
+ const mtime = this.getFileMtime(absPath);
182
+ const cacheKey = this.getCacheKey(operation, file, line, character);
183
+ // 1. Check cache
184
+ if (this.cache && mtime) {
185
+ const cached = this.cache.get("default", cacheKey, mtime);
186
+ if (cached != null) {
187
+ logger.debug("lsp-bridge:cache-hit", { operation, file });
188
+ return cached;
189
+ }
190
+ }
191
+ // 2. Get client
192
+ const client = await this.manager.getClientForFile(absPath);
193
+ if (!client) {
194
+ logger.warn("lsp-bridge:no-server", { operation, file });
195
+ return null;
196
+ }
197
+ // 3. Send LSP request
198
+ try {
199
+ const result = await client.sendRequest(lspMethod, params);
200
+ // 4. Cache result
201
+ if (this.cache && mtime && result != null) {
202
+ const languageId = this.inferLanguageId(file);
203
+ this.cache.set("default", cacheKey, operation, languageId, file, result, mtime);
204
+ }
205
+ return result;
206
+ }
207
+ catch (err) {
208
+ logger.error("lsp-bridge:request-failed", {
209
+ operation,
210
+ file,
211
+ lspMethod,
212
+ error: err instanceof Error ? err.message : String(err),
213
+ });
214
+ return null;
215
+ }
216
+ }
217
+ // -----------------------------------------------------------------------
218
+ // Private helpers — key generation and file utilities
219
+ // -----------------------------------------------------------------------
220
+ getCacheKey(operation, file, line, character) {
221
+ return createHash("sha256")
222
+ .update(operation + ":" + file + ":" + line + ":" + character)
223
+ .digest("hex");
224
+ }
225
+ getFileMtime(absPath) {
226
+ try {
227
+ const stat = statSync(absPath);
228
+ return stat.mtimeMs.toString();
229
+ }
230
+ catch {
231
+ return "";
232
+ }
233
+ }
234
+ toFileUri(file) {
235
+ return "file://" + path.resolve(this.basePath, file);
236
+ }
237
+ fromFileUri(uri) {
238
+ const absPath = uri.replace(/^file:\/\//, "");
239
+ return path.relative(this.basePath, absPath);
240
+ }
241
+ inferLanguageId(file) {
242
+ const ext = path.extname(file).replace(/^\./, "");
243
+ const extMap = {
244
+ ts: "typescript", tsx: "typescript", js: "typescript", jsx: "typescript",
245
+ py: "python", pyi: "python",
246
+ rs: "rust",
247
+ go: "go",
248
+ java: "java",
249
+ rb: "ruby",
250
+ cs: "csharp",
251
+ cpp: "cpp", cc: "cpp", cxx: "cpp", c: "cpp", h: "cpp", hpp: "cpp",
252
+ lua: "lua",
253
+ zig: "zig",
254
+ ex: "elixir", exs: "elixir",
255
+ css: "css", scss: "css", less: "css",
256
+ };
257
+ return extMap[ext] ?? ext;
258
+ }
259
+ // -----------------------------------------------------------------------
260
+ // Private helpers — result normalization
261
+ // -----------------------------------------------------------------------
262
+ normalizeLocation(raw) {
263
+ return {
264
+ file: this.fromFileUri(raw.uri),
265
+ startLine: raw.range.start.line + 1,
266
+ startCharacter: raw.range.start.character,
267
+ endLine: raw.range.end.line + 1,
268
+ endCharacter: raw.range.end.character,
269
+ };
270
+ }
271
+ normalizeHover(raw) {
272
+ const contents = raw.contents;
273
+ if (typeof contents === "string") {
274
+ return { signature: contents };
275
+ }
276
+ if (Array.isArray(contents)) {
277
+ const parts = contents.map((c) => typeof c === "string" ? c : c.value);
278
+ return {
279
+ signature: parts[0] ?? "",
280
+ documentation: parts.slice(1).join("\n") || undefined,
281
+ language: typeof contents[0] === "object" ? contents[0].kind : undefined,
282
+ };
283
+ }
284
+ // MarkupContent: { kind, value }
285
+ return {
286
+ signature: contents.value,
287
+ language: contents.kind === "markdown" ? "markdown" : undefined,
288
+ };
289
+ }
290
+ normalizeWorkspaceEdit(raw) {
291
+ const changes = [];
292
+ // Handle `changes` format
293
+ if (raw.changes) {
294
+ for (const [uri, edits] of Object.entries(raw.changes)) {
295
+ const file = this.fromFileUri(uri);
296
+ for (const edit of edits) {
297
+ changes.push({
298
+ file,
299
+ startLine: edit.range.start.line + 1,
300
+ startCharacter: edit.range.start.character,
301
+ endLine: edit.range.end.line + 1,
302
+ endCharacter: edit.range.end.character,
303
+ newText: edit.newText,
304
+ });
305
+ }
306
+ }
307
+ }
308
+ // Handle `documentChanges` format
309
+ if (raw.documentChanges) {
310
+ for (const docChange of raw.documentChanges) {
311
+ const file = this.fromFileUri(docChange.textDocument.uri);
312
+ for (const edit of docChange.edits) {
313
+ changes.push({
314
+ file,
315
+ startLine: edit.range.start.line + 1,
316
+ startCharacter: edit.range.start.character,
317
+ endLine: edit.range.end.line + 1,
318
+ endCharacter: edit.range.end.character,
319
+ newText: edit.newText,
320
+ });
321
+ }
322
+ }
323
+ }
324
+ return { changes };
325
+ }
326
+ normalizeCallHierarchyItem(raw) {
327
+ return {
328
+ name: raw.name,
329
+ kind: SYMBOL_KIND_MAP[raw.kind] ?? `Unknown(${raw.kind})`,
330
+ file: this.fromFileUri(raw.uri),
331
+ startLine: raw.range.start.line + 1,
332
+ endLine: raw.range.end.line + 1,
333
+ };
334
+ }
335
+ normalizeDocumentSymbol(file, raw) {
336
+ const result = {
337
+ name: raw.name,
338
+ kind: SYMBOL_KIND_MAP[raw.kind] ?? `Unknown(${raw.kind})`,
339
+ file,
340
+ startLine: raw.range.start.line + 1,
341
+ endLine: raw.range.end.line + 1,
342
+ };
343
+ if (raw.children && raw.children.length > 0) {
344
+ result.children = raw.children.map((child) => this.normalizeDocumentSymbol(file, child));
345
+ }
346
+ return result;
347
+ }
348
+ }
349
+ //# sourceMappingURL=lsp-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-bridge.js","sourceRoot":"","sources":["../../../src/core/lsp/lsp-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type Database from "better-sqlite3";
2
+ /**
3
+ * SQLite-backed cache for LSP results with mtime-based invalidation.
4
+ *
5
+ * Each entry is keyed by (project_id, cache_key) and stores the JSON-serialized
6
+ * result alongside the file's mtime at cache time. A `get()` that receives a
7
+ * different mtime than what was stored is treated as a cache miss.
8
+ */
9
+ export declare class LspCache {
10
+ private readonly db;
11
+ constructor(db: Database.Database);
12
+ /** Create the lsp_cache table if not exists (for standalone usage outside migration). */
13
+ private ensureTable;
14
+ /** Get cached result. Returns null if not found or file mtime changed. */
15
+ get(projectId: string, cacheKey: string, currentMtime: string): unknown | null;
16
+ /** Store a result in cache. */
17
+ set(projectId: string, cacheKey: string, operation: string, languageId: string, filePath: string, result: unknown, fileMtime: string): void;
18
+ /** Invalidate all cache entries for a file (both entries FROM and REFERENCING the file). */
19
+ invalidateFile(projectId: string, filePath: string): number;
20
+ /** Invalidate all cache entries for a language. */
21
+ invalidateLanguage(projectId: string, languageId: string): number;
22
+ /** Invalidate all cache entries for a project. */
23
+ invalidateAll(projectId: string): number;
24
+ /** Remove expired/old entries. Returns count of pruned rows. */
25
+ prune(maxAgeDays?: number): number;
26
+ /** Get cache stats: total entries, per-language, per-operation. */
27
+ getStats(projectId: string): {
28
+ total: number;
29
+ byLanguage: Record<string, number>;
30
+ byOperation: Record<string, number>;
31
+ };
32
+ }
33
+ //# sourceMappingURL=lsp-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-cache.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/lsp-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C;;;;;;GAMG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAQlD,yFAAyF;IACzF,OAAO,CAAC,WAAW;IA0BnB,0EAA0E;IAC1E,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAmB9E,+BAA+B;IAC/B,GAAG,CACD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,GAChB,IAAI;IAmBP,4FAA4F;IAC5F,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAY3D,mDAAmD;IACnD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IASjE,kDAAkD;IAClD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAaxC,gEAAgE;IAChE,KAAK,CAAC,UAAU,GAAE,MAAU,GAAG,MAAM;IAgBrC,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG;QAC3B,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACrC;CA+BF"}
@@ -0,0 +1,134 @@
1
+ import { logger } from "../utils/logger.js";
2
+ /**
3
+ * SQLite-backed cache for LSP results with mtime-based invalidation.
4
+ *
5
+ * Each entry is keyed by (project_id, cache_key) and stores the JSON-serialized
6
+ * result alongside the file's mtime at cache time. A `get()` that receives a
7
+ * different mtime than what was stored is treated as a cache miss.
8
+ */
9
+ export class LspCache {
10
+ db;
11
+ constructor(db) {
12
+ this.db = db;
13
+ this.ensureTable();
14
+ }
15
+ /* ------------------------------------------------------------------ */
16
+ /* DDL — table + indexes */
17
+ /* ------------------------------------------------------------------ */
18
+ /** Create the lsp_cache table if not exists (for standalone usage outside migration). */
19
+ ensureTable() {
20
+ this.db.exec(`
21
+ CREATE TABLE IF NOT EXISTS lsp_cache (
22
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
23
+ project_id TEXT NOT NULL,
24
+ cache_key TEXT NOT NULL,
25
+ operation TEXT NOT NULL,
26
+ language_id TEXT NOT NULL,
27
+ file_path TEXT NOT NULL,
28
+ result_json TEXT NOT NULL,
29
+ file_mtime TEXT NOT NULL,
30
+ created_at TEXT NOT NULL,
31
+ UNIQUE(project_id, cache_key)
32
+ );
33
+
34
+ CREATE INDEX IF NOT EXISTS idx_lsp_cache_file ON lsp_cache(project_id, file_path);
35
+ CREATE INDEX IF NOT EXISTS idx_lsp_cache_lang ON lsp_cache(project_id, language_id);
36
+ `);
37
+ logger.debug("lsp-cache:ensureTable", { status: "ok" });
38
+ }
39
+ /* ------------------------------------------------------------------ */
40
+ /* Read */
41
+ /* ------------------------------------------------------------------ */
42
+ /** Get cached result. Returns null if not found or file mtime changed. */
43
+ get(projectId, cacheKey, currentMtime) {
44
+ const row = this.db
45
+ .prepare(`SELECT result_json FROM lsp_cache
46
+ WHERE project_id = ? AND cache_key = ? AND file_mtime = ?`)
47
+ .get(projectId, cacheKey, currentMtime);
48
+ if (!row) {
49
+ return null;
50
+ }
51
+ return JSON.parse(row.result_json);
52
+ }
53
+ /* ------------------------------------------------------------------ */
54
+ /* Write */
55
+ /* ------------------------------------------------------------------ */
56
+ /** Store a result in cache. */
57
+ set(projectId, cacheKey, operation, languageId, filePath, result, fileMtime) {
58
+ const resultJson = JSON.stringify(result);
59
+ const createdAt = new Date().toISOString();
60
+ this.db
61
+ .prepare(`INSERT OR REPLACE INTO lsp_cache
62
+ (project_id, cache_key, operation, language_id, file_path, result_json, file_mtime, created_at)
63
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
64
+ .run(projectId, cacheKey, operation, languageId, filePath, resultJson, fileMtime, createdAt);
65
+ logger.debug("lsp-cache:set", { projectId, cacheKey, operation, languageId, filePath });
66
+ }
67
+ /* ------------------------------------------------------------------ */
68
+ /* Invalidation */
69
+ /* ------------------------------------------------------------------ */
70
+ /** Invalidate all cache entries for a file (both entries FROM and REFERENCING the file). */
71
+ invalidateFile(projectId, filePath) {
72
+ const result = this.db
73
+ .prepare(`DELETE FROM lsp_cache
74
+ WHERE project_id = ? AND (file_path = ? OR result_json LIKE '%' || ? || '%')`)
75
+ .run(projectId, filePath, filePath);
76
+ logger.debug("lsp-cache:invalidateFile", { projectId, filePath, deleted: result.changes });
77
+ return result.changes;
78
+ }
79
+ /** Invalidate all cache entries for a language. */
80
+ invalidateLanguage(projectId, languageId) {
81
+ const result = this.db
82
+ .prepare(`DELETE FROM lsp_cache WHERE project_id = ? AND language_id = ?`)
83
+ .run(projectId, languageId);
84
+ logger.debug("lsp-cache:invalidateLanguage", { projectId, languageId, deleted: result.changes });
85
+ return result.changes;
86
+ }
87
+ /** Invalidate all cache entries for a project. */
88
+ invalidateAll(projectId) {
89
+ const result = this.db
90
+ .prepare(`DELETE FROM lsp_cache WHERE project_id = ?`)
91
+ .run(projectId);
92
+ logger.debug("lsp-cache:invalidateAll", { projectId, deleted: result.changes });
93
+ return result.changes;
94
+ }
95
+ /* ------------------------------------------------------------------ */
96
+ /* Maintenance */
97
+ /* ------------------------------------------------------------------ */
98
+ /** Remove expired/old entries. Returns count of pruned rows. */
99
+ prune(maxAgeDays = 7) {
100
+ const result = this.db
101
+ .prepare(`DELETE FROM lsp_cache
102
+ WHERE created_at < datetime('now', '-' || ? || ' days')`)
103
+ .run(maxAgeDays);
104
+ logger.info("lsp-cache:prune", { maxAgeDays, pruned: result.changes });
105
+ return result.changes;
106
+ }
107
+ /* ------------------------------------------------------------------ */
108
+ /* Stats */
109
+ /* ------------------------------------------------------------------ */
110
+ /** Get cache stats: total entries, per-language, per-operation. */
111
+ getStats(projectId) {
112
+ const totalRow = this.db
113
+ .prepare(`SELECT COUNT(*) as cnt FROM lsp_cache WHERE project_id = ?`)
114
+ .get(projectId);
115
+ const langRows = this.db
116
+ .prepare(`SELECT language_id, COUNT(*) as cnt FROM lsp_cache
117
+ WHERE project_id = ? GROUP BY language_id`)
118
+ .all(projectId);
119
+ const opRows = this.db
120
+ .prepare(`SELECT operation, COUNT(*) as cnt FROM lsp_cache
121
+ WHERE project_id = ? GROUP BY operation`)
122
+ .all(projectId);
123
+ const byLanguage = {};
124
+ for (const row of langRows) {
125
+ byLanguage[row.language_id] = row.cnt;
126
+ }
127
+ const byOperation = {};
128
+ for (const row of opRows) {
129
+ byOperation[row.operation] = row.cnt;
130
+ }
131
+ return { total: totalRow.cnt, byLanguage, byOperation };
132
+ }
133
+ }
134
+ //# sourceMappingURL=lsp-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-cache.js","sourceRoot":"","sources":["../../../src/core/lsp/lsp-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * LspClient — Generic JSON-RPC 2.0 client over stdio.
3
+ *
4
+ * Communicates with ANY Language Server Protocol server by spawning
5
+ * it as a child process and exchanging JSON-RPC 2.0 messages via
6
+ * Content-Length framed stdio.
7
+ */
8
+ import { EventEmitter } from "node:events";
9
+ export declare class LspClient extends EventEmitter {
10
+ private readonly command;
11
+ private readonly args;
12
+ private readonly requestTimeoutMs;
13
+ private process;
14
+ private nextId;
15
+ private pending;
16
+ private buffer;
17
+ private _ready;
18
+ constructor(command: string, args: string[], requestTimeoutMs?: number);
19
+ /** Whether the child process is running and ready for messages. */
20
+ get ready(): boolean;
21
+ /** PID of the child process (if running). */
22
+ get pid(): number | undefined;
23
+ /** Spawn the child process. Does NOT send `initialize`. */
24
+ start(): Promise<void>;
25
+ /** Send `shutdown` request + `exit` notification, then wait for exit. */
26
+ stop(): Promise<void>;
27
+ /** Send a JSON-RPC request and wait for the corresponding response. */
28
+ sendRequest<T = unknown>(method: string, params?: unknown): Promise<T>;
29
+ /** Send a JSON-RPC notification (fire-and-forget, no response expected). */
30
+ sendNotification(method: string, params?: unknown): void;
31
+ /** Kill the child process immediately (SIGKILL). */
32
+ kill(): void;
33
+ /** Encode a JSON-RPC message with Content-Length header. */
34
+ private encode;
35
+ /**
36
+ * Parse incoming data from stdout, extracting complete JSON-RPC messages.
37
+ *
38
+ * Handles chunked delivery: data is accumulated in an internal buffer
39
+ * and complete messages are extracted as they become available.
40
+ */
41
+ private handleData;
42
+ /** Process a single parsed JSON-RPC message (response or notification). */
43
+ private handleMessage;
44
+ /** Reject all pending requests with the given error. */
45
+ private rejectAll;
46
+ }
47
+ //# sourceMappingURL=lsp-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-client.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/lsp-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiD3C,qBAAa,SAAU,SAAQ,YAAY;IAQvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IATnC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAS;gBAGJ,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,gBAAgB,GAAE,MAAe;IAKpD,mEAAmE;IACnE,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,6CAA6C;IAC7C,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,CAE5B;IAED,2DAA2D;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD5B,yEAAyE;IACnE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoC3B,uEAAuE;IACjE,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IA8B5E,4EAA4E;IAC5E,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAgBxD,oDAAoD;IACpD,IAAI,IAAI,IAAI;IAYZ,4DAA4D;IAC5D,OAAO,CAAC,MAAM;IAOd;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAmClB,2EAA2E;IAC3E,OAAO,CAAC,aAAa;IAqCrB,wDAAwD;IACxD,OAAO,CAAC,SAAS;CAQlB"}