@mcp-graph-workflow/mcp-graph 5.10.0 → 5.12.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 (256) 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/api/routes/siebel.d.ts.map +1 -1
  5. package/dist/api/routes/siebel.js +170 -0
  6. package/dist/api/routes/siebel.js.map +1 -1
  7. package/dist/core/code/code-indexer.d.ts +5 -3
  8. package/dist/core/code/code-indexer.d.ts.map +1 -1
  9. package/dist/core/code/code-indexer.js +57 -10
  10. package/dist/core/code/code-indexer.js.map +1 -1
  11. package/dist/core/code/code-types.d.ts +8 -0
  12. package/dist/core/code/code-types.d.ts.map +1 -1
  13. package/dist/core/code/code-types.js.map +1 -1
  14. package/dist/core/code/graph-traversal.d.ts +15 -0
  15. package/dist/core/code/graph-traversal.d.ts.map +1 -1
  16. package/dist/core/code/graph-traversal.js +53 -0
  17. package/dist/core/code/graph-traversal.js.map +1 -1
  18. package/dist/core/code/ts-analyzer.d.ts +6 -1
  19. package/dist/core/code/ts-analyzer.d.ts.map +1 -1
  20. package/dist/core/code/ts-analyzer.js +8 -0
  21. package/dist/core/code/ts-analyzer.js.map +1 -1
  22. package/dist/core/config/config-schema.d.ts +8 -0
  23. package/dist/core/config/config-schema.d.ts.map +1 -1
  24. package/dist/core/config/config-schema.js +3 -1
  25. package/dist/core/config/config-schema.js.map +1 -1
  26. package/dist/core/context/context-assembler.d.ts +2 -0
  27. package/dist/core/context/context-assembler.d.ts.map +1 -1
  28. package/dist/core/context/context-assembler.js +15 -0
  29. package/dist/core/context/context-assembler.js.map +1 -1
  30. package/dist/core/lsp/language-detector.d.ts +11 -0
  31. package/dist/core/lsp/language-detector.d.ts.map +1 -0
  32. package/dist/core/lsp/language-detector.js +149 -0
  33. package/dist/core/lsp/language-detector.js.map +1 -0
  34. package/dist/core/lsp/lsp-analyzer.d.ts +16 -0
  35. package/dist/core/lsp/lsp-analyzer.d.ts.map +1 -0
  36. package/dist/core/lsp/lsp-analyzer.js +30 -0
  37. package/dist/core/lsp/lsp-analyzer.js.map +1 -0
  38. package/dist/core/lsp/lsp-bridge.d.ts +40 -0
  39. package/dist/core/lsp/lsp-bridge.d.ts.map +1 -0
  40. package/dist/core/lsp/lsp-bridge.js +349 -0
  41. package/dist/core/lsp/lsp-bridge.js.map +1 -0
  42. package/dist/core/lsp/lsp-cache.d.ts +33 -0
  43. package/dist/core/lsp/lsp-cache.d.ts.map +1 -0
  44. package/dist/core/lsp/lsp-cache.js +134 -0
  45. package/dist/core/lsp/lsp-cache.js.map +1 -0
  46. package/dist/core/lsp/lsp-client.d.ts +47 -0
  47. package/dist/core/lsp/lsp-client.d.ts.map +1 -0
  48. package/dist/core/lsp/lsp-client.js +256 -0
  49. package/dist/core/lsp/lsp-client.js.map +1 -0
  50. package/dist/core/lsp/lsp-diagnostics.d.ts +40 -0
  51. package/dist/core/lsp/lsp-diagnostics.d.ts.map +1 -0
  52. package/dist/core/lsp/lsp-diagnostics.js +113 -0
  53. package/dist/core/lsp/lsp-diagnostics.js.map +1 -0
  54. package/dist/core/lsp/lsp-server-manager.d.ts +56 -0
  55. package/dist/core/lsp/lsp-server-manager.d.ts.map +1 -0
  56. package/dist/core/lsp/lsp-server-manager.js +330 -0
  57. package/dist/core/lsp/lsp-server-manager.js.map +1 -0
  58. package/dist/core/lsp/lsp-types.d.ts +130 -0
  59. package/dist/core/lsp/lsp-types.d.ts.map +1 -0
  60. package/dist/core/lsp/lsp-types.js +131 -0
  61. package/dist/core/lsp/lsp-types.js.map +1 -0
  62. package/dist/core/lsp/server-registry.d.ts +19 -0
  63. package/dist/core/lsp/server-registry.d.ts.map +1 -0
  64. package/dist/core/lsp/server-registry.js +188 -0
  65. package/dist/core/lsp/server-registry.js.map +1 -0
  66. package/dist/core/rag/multi-strategy-retrieval.d.ts +6 -0
  67. package/dist/core/rag/multi-strategy-retrieval.d.ts.map +1 -1
  68. package/dist/core/rag/multi-strategy-retrieval.js +31 -3
  69. package/dist/core/rag/multi-strategy-retrieval.js.map +1 -1
  70. package/dist/core/rag/siebel-indexer.d.ts.map +1 -1
  71. package/dist/core/rag/siebel-indexer.js +57 -1
  72. package/dist/core/rag/siebel-indexer.js.map +1 -1
  73. package/dist/core/rag/wsdl-indexer.d.ts +16 -0
  74. package/dist/core/rag/wsdl-indexer.d.ts.map +1 -0
  75. package/dist/core/rag/wsdl-indexer.js +115 -0
  76. package/dist/core/rag/wsdl-indexer.js.map +1 -0
  77. package/dist/core/siebel/auto-wiring.d.ts +29 -0
  78. package/dist/core/siebel/auto-wiring.d.ts.map +1 -0
  79. package/dist/core/siebel/auto-wiring.js +211 -0
  80. package/dist/core/siebel/auto-wiring.js.map +1 -0
  81. package/dist/core/siebel/best-practices.d.ts +16 -0
  82. package/dist/core/siebel/best-practices.d.ts.map +1 -0
  83. package/dist/core/siebel/best-practices.js +92 -0
  84. package/dist/core/siebel/best-practices.js.map +1 -0
  85. package/dist/core/siebel/change-simulator.d.ts +32 -0
  86. package/dist/core/siebel/change-simulator.d.ts.map +1 -0
  87. package/dist/core/siebel/change-simulator.js +138 -0
  88. package/dist/core/siebel/change-simulator.js.map +1 -0
  89. package/dist/core/siebel/clone-adapt.d.ts +21 -0
  90. package/dist/core/siebel/clone-adapt.d.ts.map +1 -0
  91. package/dist/core/siebel/clone-adapt.js +157 -0
  92. package/dist/core/siebel/clone-adapt.js.map +1 -0
  93. package/dist/core/siebel/code-review.d.ts +36 -0
  94. package/dist/core/siebel/code-review.d.ts.map +1 -0
  95. package/dist/core/siebel/code-review.js +239 -0
  96. package/dist/core/siebel/code-review.js.map +1 -0
  97. package/dist/core/siebel/complexity-metrics.d.ts +24 -0
  98. package/dist/core/siebel/complexity-metrics.d.ts.map +1 -0
  99. package/dist/core/siebel/complexity-metrics.js +41 -0
  100. package/dist/core/siebel/complexity-metrics.js.map +1 -0
  101. package/dist/core/siebel/context-enrichment.d.ts +18 -0
  102. package/dist/core/siebel/context-enrichment.d.ts.map +1 -0
  103. package/dist/core/siebel/context-enrichment.js +91 -0
  104. package/dist/core/siebel/context-enrichment.js.map +1 -0
  105. package/dist/core/siebel/cross-project-analyzer.d.ts +30 -0
  106. package/dist/core/siebel/cross-project-analyzer.d.ts.map +1 -0
  107. package/dist/core/siebel/cross-project-analyzer.js +108 -0
  108. package/dist/core/siebel/cross-project-analyzer.js.map +1 -0
  109. package/dist/core/siebel/definition-of-ready.d.ts +25 -0
  110. package/dist/core/siebel/definition-of-ready.d.ts.map +1 -0
  111. package/dist/core/siebel/definition-of-ready.js +164 -0
  112. package/dist/core/siebel/definition-of-ready.js.map +1 -0
  113. package/dist/core/siebel/escript-crossref.d.ts +18 -0
  114. package/dist/core/siebel/escript-crossref.d.ts.map +1 -0
  115. package/dist/core/siebel/escript-crossref.js +50 -0
  116. package/dist/core/siebel/escript-crossref.js.map +1 -0
  117. package/dist/core/siebel/escript-generator.d.ts +33 -0
  118. package/dist/core/siebel/escript-generator.d.ts.map +1 -0
  119. package/dist/core/siebel/escript-generator.js +200 -0
  120. package/dist/core/siebel/escript-generator.js.map +1 -0
  121. package/dist/core/siebel/escript-patterns.d.ts +20 -0
  122. package/dist/core/siebel/escript-patterns.d.ts.map +1 -0
  123. package/dist/core/siebel/escript-patterns.js +69 -0
  124. package/dist/core/siebel/escript-patterns.js.map +1 -0
  125. package/dist/core/siebel/escript-refactor.d.ts +23 -0
  126. package/dist/core/siebel/escript-refactor.d.ts.map +1 -0
  127. package/dist/core/siebel/escript-refactor.js +270 -0
  128. package/dist/core/siebel/escript-refactor.js.map +1 -0
  129. package/dist/core/siebel/field-suggestion.d.ts +29 -0
  130. package/dist/core/siebel/field-suggestion.d.ts.map +1 -0
  131. package/dist/core/siebel/field-suggestion.js +105 -0
  132. package/dist/core/siebel/field-suggestion.js.map +1 -0
  133. package/dist/core/siebel/health-check.d.ts +21 -0
  134. package/dist/core/siebel/health-check.d.ts.map +1 -0
  135. package/dist/core/siebel/health-check.js +51 -0
  136. package/dist/core/siebel/health-check.js.map +1 -0
  137. package/dist/core/siebel/integration-test-gen.d.ts +26 -0
  138. package/dist/core/siebel/integration-test-gen.d.ts.map +1 -0
  139. package/dist/core/siebel/integration-test-gen.js +131 -0
  140. package/dist/core/siebel/integration-test-gen.js.map +1 -0
  141. package/dist/core/siebel/lov-mapper.d.ts +23 -0
  142. package/dist/core/siebel/lov-mapper.d.ts.map +1 -0
  143. package/dist/core/siebel/lov-mapper.js +42 -0
  144. package/dist/core/siebel/lov-mapper.js.map +1 -0
  145. package/dist/core/siebel/migration-package.d.ts +38 -0
  146. package/dist/core/siebel/migration-package.d.ts.map +1 -0
  147. package/dist/core/siebel/migration-package.js +276 -0
  148. package/dist/core/siebel/migration-package.js.map +1 -0
  149. package/dist/core/siebel/naming-convention-validator.d.ts +38 -0
  150. package/dist/core/siebel/naming-convention-validator.d.ts.map +1 -0
  151. package/dist/core/siebel/naming-convention-validator.js +165 -0
  152. package/dist/core/siebel/naming-convention-validator.js.map +1 -0
  153. package/dist/core/siebel/object-erd.d.ts +28 -0
  154. package/dist/core/siebel/object-erd.d.ts.map +1 -0
  155. package/dist/core/siebel/object-erd.js +82 -0
  156. package/dist/core/siebel/object-erd.js.map +1 -0
  157. package/dist/core/siebel/orphan-detector.d.ts +21 -0
  158. package/dist/core/siebel/orphan-detector.d.ts.map +1 -0
  159. package/dist/core/siebel/orphan-detector.js +64 -0
  160. package/dist/core/siebel/orphan-detector.js.map +1 -0
  161. package/dist/core/siebel/pattern-analyzer.d.ts +32 -0
  162. package/dist/core/siebel/pattern-analyzer.d.ts.map +1 -0
  163. package/dist/core/siebel/pattern-analyzer.js +155 -0
  164. package/dist/core/siebel/pattern-analyzer.js.map +1 -0
  165. package/dist/core/siebel/profileattr-flow.d.ts +26 -0
  166. package/dist/core/siebel/profileattr-flow.d.ts.map +1 -0
  167. package/dist/core/siebel/profileattr-flow.js +50 -0
  168. package/dist/core/siebel/profileattr-flow.js.map +1 -0
  169. package/dist/core/siebel/runtime-dep-builder.d.ts +9 -0
  170. package/dist/core/siebel/runtime-dep-builder.d.ts.map +1 -0
  171. package/dist/core/siebel/runtime-dep-builder.js +47 -0
  172. package/dist/core/siebel/runtime-dep-builder.js.map +1 -0
  173. package/dist/core/siebel/scaffold-generator.d.ts +25 -0
  174. package/dist/core/siebel/scaffold-generator.d.ts.map +1 -0
  175. package/dist/core/siebel/scaffold-generator.js +278 -0
  176. package/dist/core/siebel/scaffold-generator.js.map +1 -0
  177. package/dist/core/siebel/siebel-context-builder.d.ts +10 -0
  178. package/dist/core/siebel/siebel-context-builder.d.ts.map +1 -0
  179. package/dist/core/siebel/siebel-context-builder.js +75 -0
  180. package/dist/core/siebel/siebel-context-builder.js.map +1 -0
  181. package/dist/core/siebel/siebel-rag-booster.d.ts +19 -0
  182. package/dist/core/siebel/siebel-rag-booster.d.ts.map +1 -0
  183. package/dist/core/siebel/siebel-rag-booster.js +41 -0
  184. package/dist/core/siebel/siebel-rag-booster.js.map +1 -0
  185. package/dist/core/siebel/siebel-validators.d.ts +73 -0
  186. package/dist/core/siebel/siebel-validators.d.ts.map +1 -0
  187. package/dist/core/siebel/siebel-validators.js +269 -0
  188. package/dist/core/siebel/siebel-validators.js.map +1 -0
  189. package/dist/core/siebel/sif-batch-importer.d.ts +27 -0
  190. package/dist/core/siebel/sif-batch-importer.d.ts.map +1 -0
  191. package/dist/core/siebel/sif-batch-importer.js +68 -0
  192. package/dist/core/siebel/sif-batch-importer.js.map +1 -0
  193. package/dist/core/siebel/sif-diff.d.ts +57 -0
  194. package/dist/core/siebel/sif-diff.d.ts.map +1 -0
  195. package/dist/core/siebel/sif-diff.js +198 -0
  196. package/dist/core/siebel/sif-diff.js.map +1 -0
  197. package/dist/core/siebel/sif-parser.d.ts.map +1 -1
  198. package/dist/core/siebel/sif-parser.js +86 -0
  199. package/dist/core/siebel/sif-parser.js.map +1 -1
  200. package/dist/core/siebel/similarity-detector.d.ts +20 -0
  201. package/dist/core/siebel/similarity-detector.d.ts.map +1 -0
  202. package/dist/core/siebel/similarity-detector.js +83 -0
  203. package/dist/core/siebel/similarity-detector.js.map +1 -0
  204. package/dist/core/siebel/template-learner.d.ts +25 -0
  205. package/dist/core/siebel/template-learner.d.ts.map +1 -0
  206. package/dist/core/siebel/template-learner.js +129 -0
  207. package/dist/core/siebel/template-learner.js.map +1 -0
  208. package/dist/core/siebel/troubleshoot.d.ts +37 -0
  209. package/dist/core/siebel/troubleshoot.d.ts.map +1 -0
  210. package/dist/core/siebel/troubleshoot.js +249 -0
  211. package/dist/core/siebel/troubleshoot.js.map +1 -0
  212. package/dist/core/siebel/wsdl-correlation.d.ts +22 -0
  213. package/dist/core/siebel/wsdl-correlation.d.ts.map +1 -0
  214. package/dist/core/siebel/wsdl-correlation.js +64 -0
  215. package/dist/core/siebel/wsdl-correlation.js.map +1 -0
  216. package/dist/core/siebel/wsdl-parser.d.ts +57 -0
  217. package/dist/core/siebel/wsdl-parser.d.ts.map +1 -0
  218. package/dist/core/siebel/wsdl-parser.js +226 -0
  219. package/dist/core/siebel/wsdl-parser.js.map +1 -0
  220. package/dist/core/siebel/wsdl-to-sif.d.ts +22 -0
  221. package/dist/core/siebel/wsdl-to-sif.d.ts.map +1 -0
  222. package/dist/core/siebel/wsdl-to-sif.js +184 -0
  223. package/dist/core/siebel/wsdl-to-sif.js.map +1 -0
  224. package/dist/core/store/migrations.d.ts.map +1 -1
  225. package/dist/core/store/migrations.js +21 -0
  226. package/dist/core/store/migrations.js.map +1 -1
  227. package/dist/mcp/tools/code-intelligence.d.ts +15 -0
  228. package/dist/mcp/tools/code-intelligence.d.ts.map +1 -0
  229. package/dist/mcp/tools/code-intelligence.js +276 -0
  230. package/dist/mcp/tools/code-intelligence.js.map +1 -0
  231. package/dist/mcp/tools/index.d.ts.map +1 -1
  232. package/dist/mcp/tools/index.js +4 -0
  233. package/dist/mcp/tools/index.js.map +1 -1
  234. package/dist/mcp/tools/siebel-analyze.d.ts.map +1 -1
  235. package/dist/mcp/tools/siebel-analyze.js +89 -6
  236. package/dist/mcp/tools/siebel-analyze.js.map +1 -1
  237. package/dist/mcp/tools/siebel-composer.d.ts.map +1 -1
  238. package/dist/mcp/tools/siebel-composer.js +40 -3
  239. package/dist/mcp/tools/siebel-composer.js.map +1 -1
  240. package/dist/mcp/tools/siebel-generate-sif.d.ts.map +1 -1
  241. package/dist/mcp/tools/siebel-generate-sif.js +188 -3
  242. package/dist/mcp/tools/siebel-generate-sif.js.map +1 -1
  243. package/dist/mcp/tools/siebel-search.js +1 -1
  244. package/dist/mcp/tools/siebel-search.js.map +1 -1
  245. package/dist/mcp/tools/siebel-validate.d.ts.map +1 -1
  246. package/dist/mcp/tools/siebel-validate.js +94 -5
  247. package/dist/mcp/tools/siebel-validate.js.map +1 -1
  248. package/dist/schemas/knowledge.schema.d.ts +6 -0
  249. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  250. package/dist/schemas/knowledge.schema.js +2 -1
  251. package/dist/schemas/knowledge.schema.js.map +1 -1
  252. package/dist/schemas/siebel.schema.d.ts +42 -0
  253. package/dist/schemas/siebel.schema.d.ts.map +1 -1
  254. package/dist/schemas/siebel.schema.js +4 -0
  255. package/dist/schemas/siebel.schema.js.map +1 -1
  256. package/package.json +2 -2
@@ -0,0 +1,30 @@
1
+ /**
2
+ * LspAnalyzer — CodeAnalyzer implementation backed by Language Server Protocol.
3
+ * Stub implementation: returns empty symbols/relations for now.
4
+ * Full LSP-based analysis (documentSymbol → CodeSymbol mapping) will be
5
+ * implemented when integration testing with real language servers is in place.
6
+ */
7
+ import { logger } from "../utils/logger.js";
8
+ export class LspAnalyzer {
9
+ client;
10
+ languages;
11
+ extensions;
12
+ constructor(client, languages, extensions) {
13
+ this.client = client;
14
+ this.languages = languages;
15
+ this.extensions = extensions;
16
+ }
17
+ async analyzeFile(filePath, basePath) {
18
+ logger.debug("lsp-analyzer:analyze", { filePath, languages: this.languages.join(",") });
19
+ // Normalize path separators for cross-platform compatibility
20
+ const relative = filePath
21
+ .replace(basePath + "/", "")
22
+ .replace(basePath + "\\", "");
23
+ return {
24
+ file: relative,
25
+ symbols: [],
26
+ relations: [],
27
+ };
28
+ }
29
+ }
30
+ //# sourceMappingURL=lsp-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-analyzer.js","sourceRoot":"","sources":["../../../src/core/lsp/lsp-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,WAAW;IAKH;IAJV,SAAS,CAAW;IACpB,UAAU,CAAW;IAE9B,YACmB,MAAiB,EAClC,SAAmB,EACnB,UAAoB;QAFH,WAAM,GAAN,MAAM,CAAW;QAIlC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,QAAgB;QAClD,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAExF,6DAA6D;QAC7D,MAAM,QAAQ,GAAG,QAAQ;aACtB,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,EAAE,CAAC;aAC3B,OAAO,CAAC,QAAQ,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;QAEhC,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,EAAE;SACd,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,40 @@
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 type { LspLocation, LspHoverResult, LspDiagnostic, LspCallHierarchyItem, LspDocumentSymbol, LspServerState, LspWorkspaceEdit } from "./lsp-types.js";
10
+ import type { LspServerManager } from "./lsp-server-manager.js";
11
+ import type { LspCache } from "./lsp-cache.js";
12
+ import type { LspDiagnosticsCollector } from "./lsp-diagnostics.js";
13
+ export declare class LspBridge {
14
+ private readonly manager;
15
+ private readonly cache;
16
+ private readonly diagnostics;
17
+ private readonly basePath;
18
+ constructor(manager: LspServerManager, cache: LspCache | null, diagnostics: LspDiagnosticsCollector, basePath: string);
19
+ goToDefinition(file: string, line: number, character: number): Promise<LspLocation[]>;
20
+ findReferences(file: string, line: number, character: number): Promise<LspLocation[]>;
21
+ hover(file: string, line: number, character: number): Promise<LspHoverResult | null>;
22
+ rename(file: string, line: number, character: number, newName: string): Promise<LspWorkspaceEdit | null>;
23
+ callHierarchyIncoming(file: string, line: number, character: number): Promise<LspCallHierarchyItem[]>;
24
+ callHierarchyOutgoing(file: string, line: number, character: number): Promise<LspCallHierarchyItem[]>;
25
+ getDocumentSymbols(file: string): Promise<LspDocumentSymbol[]>;
26
+ getDiagnostics(file: string): Promise<LspDiagnostic[]>;
27
+ getLanguageStatus(): Promise<Map<string, LspServerState>>;
28
+ private executeWithCache;
29
+ private getCacheKey;
30
+ private getFileMtime;
31
+ private toFileUri;
32
+ private fromFileUri;
33
+ private inferLanguageId;
34
+ private normalizeLocation;
35
+ private normalizeHover;
36
+ private normalizeWorkspaceEdit;
37
+ private normalizeCallHierarchyItem;
38
+ private normalizeDocumentSymbol;
39
+ }
40
+ //# sourceMappingURL=lsp-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-bridge.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/lsp-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EAEd,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAwFpE,qBAAa,SAAS;IAElB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAHR,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,QAAQ,GAAG,IAAI,EACtB,WAAW,EAAE,uBAAuB,EACpC,QAAQ,EAAE,MAAM;IAO7B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAqBrF,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAqBrF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAoBpF,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAmC7B,qBAAqB,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA4C5B,qBAAqB,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA4C5B,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAmB9D,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAKtD,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YAQjD,gBAAgB;IAsD9B,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,uBAAuB;CAiBhC"}
@@ -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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"}