@mcp-graph-workflow/mcp-graph 5.2.0 → 5.4.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 (244) hide show
  1. package/dist/api/router.d.ts +0 -1
  2. package/dist/api/router.d.ts.map +1 -1
  3. package/dist/api/router.js +4 -5
  4. package/dist/api/router.js.map +1 -1
  5. package/dist/api/routes/benchmark.d.ts.map +1 -1
  6. package/dist/api/routes/benchmark.js +47 -2
  7. package/dist/api/routes/benchmark.js.map +1 -1
  8. package/dist/api/routes/code-graph.d.ts +12 -0
  9. package/dist/api/routes/code-graph.d.ts.map +1 -0
  10. package/dist/api/routes/code-graph.js +154 -0
  11. package/dist/api/routes/code-graph.js.map +1 -0
  12. package/dist/api/routes/context.d.ts.map +1 -1
  13. package/dist/api/routes/context.js +75 -0
  14. package/dist/api/routes/context.js.map +1 -1
  15. package/dist/api/routes/folder.d.ts +1 -4
  16. package/dist/api/routes/folder.d.ts.map +1 -1
  17. package/dist/api/routes/folder.js +19 -17
  18. package/dist/api/routes/folder.js.map +1 -1
  19. package/dist/api/routes/integrations.d.ts.map +1 -1
  20. package/dist/api/routes/integrations.js +60 -16
  21. package/dist/api/routes/integrations.js.map +1 -1
  22. package/dist/api/routes/knowledge.js +1 -1
  23. package/dist/api/routes/knowledge.js.map +1 -1
  24. package/dist/api/routes/skills.d.ts +2 -1
  25. package/dist/api/routes/skills.d.ts.map +1 -1
  26. package/dist/api/routes/skills.js +194 -4
  27. package/dist/api/routes/skills.js.map +1 -1
  28. package/dist/cli/commands/index-cmd.js +5 -5
  29. package/dist/cli/commands/index-cmd.js.map +1 -1
  30. package/dist/core/code/code-indexer.d.ts +20 -0
  31. package/dist/core/code/code-indexer.d.ts.map +1 -0
  32. package/dist/core/code/code-indexer.js +161 -0
  33. package/dist/core/code/code-indexer.js.map +1 -0
  34. package/dist/core/code/code-search.d.ts +16 -0
  35. package/dist/core/code/code-search.d.ts.map +1 -0
  36. package/dist/core/code/code-search.js +77 -0
  37. package/dist/core/code/code-search.js.map +1 -0
  38. package/dist/core/code/code-store.d.ts +35 -0
  39. package/dist/core/code/code-store.d.ts.map +1 -0
  40. package/dist/core/code/code-store.js +228 -0
  41. package/dist/core/code/code-store.js.map +1 -0
  42. package/dist/core/code/code-types.d.ts +209 -0
  43. package/dist/core/code/code-types.d.ts.map +1 -0
  44. package/dist/core/code/code-types.js +94 -0
  45. package/dist/core/code/code-types.js.map +1 -0
  46. package/dist/core/code/graph-traversal.d.ts +27 -0
  47. package/dist/core/code/graph-traversal.d.ts.map +1 -0
  48. package/dist/core/code/graph-traversal.js +122 -0
  49. package/dist/core/code/graph-traversal.js.map +1 -0
  50. package/dist/core/code/process-detector.d.ts +11 -0
  51. package/dist/core/code/process-detector.d.ts.map +1 -0
  52. package/dist/core/code/process-detector.js +65 -0
  53. package/dist/core/code/process-detector.js.map +1 -0
  54. package/dist/core/code/ts-analyzer.d.ts +12 -0
  55. package/dist/core/code/ts-analyzer.d.ts.map +1 -0
  56. package/dist/core/code/ts-analyzer.js +331 -0
  57. package/dist/core/code/ts-analyzer.js.map +1 -0
  58. package/dist/core/config/ai-memory-generator.d.ts.map +1 -1
  59. package/dist/core/config/ai-memory-generator.js +149 -61
  60. package/dist/core/config/ai-memory-generator.js.map +1 -1
  61. package/dist/core/config/config-loader.d.ts.map +1 -1
  62. package/dist/core/config/config-loader.js +2 -10
  63. package/dist/core/config/config-loader.js.map +1 -1
  64. package/dist/core/config/config-schema.d.ts +1 -2
  65. package/dist/core/config/config-schema.d.ts.map +1 -1
  66. package/dist/core/config/config-schema.js +2 -3
  67. package/dist/core/config/config-schema.js.map +1 -1
  68. package/dist/core/context/compact-context.d.ts +51 -0
  69. package/dist/core/context/compact-context.d.ts.map +1 -1
  70. package/dist/core/context/compact-context.js +292 -0
  71. package/dist/core/context/compact-context.js.map +1 -1
  72. package/dist/core/context/context-assembler.d.ts +1 -1
  73. package/dist/core/context/context-assembler.js +1 -1
  74. package/dist/core/doctor/doctor-checks.d.ts +1 -1
  75. package/dist/core/doctor/doctor-checks.js +21 -21
  76. package/dist/core/doctor/doctor-checks.js.map +1 -1
  77. package/dist/core/events/event-types.d.ts +18 -1
  78. package/dist/core/events/event-types.d.ts.map +1 -1
  79. package/dist/core/graph/graph-types.d.ts +1 -0
  80. package/dist/core/graph/graph-types.d.ts.map +1 -1
  81. package/dist/core/insights/bottleneck-detector.js +1 -1
  82. package/dist/core/insights/bottleneck-detector.js.map +1 -1
  83. package/dist/core/integrations/enriched-context.d.ts +10 -6
  84. package/dist/core/integrations/enriched-context.d.ts.map +1 -1
  85. package/dist/core/integrations/enriched-context.js +35 -35
  86. package/dist/core/integrations/enriched-context.js.map +1 -1
  87. package/dist/core/integrations/integration-orchestrator.js +2 -2
  88. package/dist/core/integrations/integration-orchestrator.js.map +1 -1
  89. package/dist/core/integrations/mcp-deps-installer.d.ts +1 -1
  90. package/dist/core/integrations/mcp-deps-installer.d.ts.map +1 -1
  91. package/dist/core/integrations/mcp-deps-installer.js +1 -60
  92. package/dist/core/integrations/mcp-deps-installer.js.map +1 -1
  93. package/dist/core/integrations/mcp-servers-config.d.ts +1 -1
  94. package/dist/core/integrations/mcp-servers-config.d.ts.map +1 -1
  95. package/dist/core/integrations/mcp-servers-config.js +0 -17
  96. package/dist/core/integrations/mcp-servers-config.js.map +1 -1
  97. package/dist/core/integrations/tool-status.d.ts +8 -3
  98. package/dist/core/integrations/tool-status.d.ts.map +1 -1
  99. package/dist/core/integrations/tool-status.js +38 -48
  100. package/dist/core/integrations/tool-status.js.map +1 -1
  101. package/dist/core/memory/memory-migrator.d.ts +15 -0
  102. package/dist/core/memory/memory-migrator.d.ts.map +1 -0
  103. package/dist/core/memory/memory-migrator.js +64 -0
  104. package/dist/core/memory/memory-migrator.js.map +1 -0
  105. package/dist/core/memory/memory-reader.d.ts +30 -0
  106. package/dist/core/memory/memory-reader.d.ts.map +1 -0
  107. package/dist/core/memory/memory-reader.js +106 -0
  108. package/dist/core/memory/memory-reader.js.map +1 -0
  109. package/dist/core/planner/lifecycle-phase.d.ts +1 -0
  110. package/dist/core/planner/lifecycle-phase.d.ts.map +1 -1
  111. package/dist/core/planner/lifecycle-phase.js +11 -8
  112. package/dist/core/planner/lifecycle-phase.js.map +1 -1
  113. package/dist/core/rag/memory-indexer.d.ts +16 -0
  114. package/dist/core/rag/memory-indexer.d.ts.map +1 -0
  115. package/dist/core/rag/{serena-indexer.js → memory-indexer.js} +12 -12
  116. package/dist/core/rag/memory-indexer.js.map +1 -0
  117. package/dist/core/rag/{serena-rag-query.d.ts → memory-rag-query.d.ts} +11 -9
  118. package/dist/core/rag/memory-rag-query.d.ts.map +1 -0
  119. package/dist/core/rag/{serena-rag-query.js → memory-rag-query.js} +18 -15
  120. package/dist/core/rag/memory-rag-query.js.map +1 -0
  121. package/dist/core/rag/skill-indexer.d.ts +16 -0
  122. package/dist/core/rag/skill-indexer.d.ts.map +1 -0
  123. package/dist/core/rag/skill-indexer.js +98 -0
  124. package/dist/core/rag/skill-indexer.js.map +1 -0
  125. package/dist/core/skills/built-in-skills.d.ts +26 -0
  126. package/dist/core/skills/built-in-skills.d.ts.map +1 -0
  127. package/dist/core/skills/built-in-skills.js +467 -0
  128. package/dist/core/skills/built-in-skills.js.map +1 -0
  129. package/dist/core/skills/self-healing-listener.d.ts +22 -0
  130. package/dist/core/skills/self-healing-listener.d.ts.map +1 -0
  131. package/dist/core/skills/self-healing-listener.js +102 -0
  132. package/dist/core/skills/self-healing-listener.js.map +1 -0
  133. package/dist/core/skills/skill-store.d.ts +14 -0
  134. package/dist/core/skills/skill-store.d.ts.map +1 -0
  135. package/dist/core/skills/skill-store.js +109 -0
  136. package/dist/core/skills/skill-store.js.map +1 -0
  137. package/dist/core/store/knowledge-store.d.ts +1 -1
  138. package/dist/core/store/knowledge-store.js +1 -1
  139. package/dist/core/store/migrations.d.ts.map +1 -1
  140. package/dist/core/store/migrations.js +128 -0
  141. package/dist/core/store/migrations.js.map +1 -1
  142. package/dist/core/store/path-resolver.d.ts +38 -0
  143. package/dist/core/store/path-resolver.d.ts.map +1 -0
  144. package/dist/core/store/path-resolver.js +92 -0
  145. package/dist/core/store/path-resolver.js.map +1 -0
  146. package/dist/core/store/sqlite-store.d.ts +21 -0
  147. package/dist/core/store/sqlite-store.d.ts.map +1 -1
  148. package/dist/core/store/sqlite-store.js +81 -30
  149. package/dist/core/store/sqlite-store.js.map +1 -1
  150. package/dist/core/store/tool-token-store.d.ts +39 -0
  151. package/dist/core/store/tool-token-store.d.ts.map +1 -0
  152. package/dist/core/store/tool-token-store.js +79 -0
  153. package/dist/core/store/tool-token-store.js.map +1 -0
  154. package/dist/core/utils/constants.d.ts +10 -0
  155. package/dist/core/utils/constants.d.ts.map +1 -1
  156. package/dist/core/utils/constants.js +12 -0
  157. package/dist/core/utils/constants.js.map +1 -1
  158. package/dist/mcp/app-factory.d.ts +0 -1
  159. package/dist/mcp/app-factory.d.ts.map +1 -1
  160. package/dist/mcp/app-factory.js +2 -2
  161. package/dist/mcp/app-factory.js.map +1 -1
  162. package/dist/mcp/lifecycle-wrapper.d.ts +3 -1
  163. package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -1
  164. package/dist/mcp/lifecycle-wrapper.js +41 -1
  165. package/dist/mcp/lifecycle-wrapper.js.map +1 -1
  166. package/dist/mcp/server.js +19 -14
  167. package/dist/mcp/server.js.map +1 -1
  168. package/dist/mcp/tools/index.d.ts.map +1 -1
  169. package/dist/mcp/tools/index.js +6 -0
  170. package/dist/mcp/tools/index.js.map +1 -1
  171. package/dist/mcp/tools/list-skills.d.ts +7 -0
  172. package/dist/mcp/tools/list-skills.d.ts.map +1 -0
  173. package/dist/mcp/tools/list-skills.js +68 -0
  174. package/dist/mcp/tools/list-skills.js.map +1 -0
  175. package/dist/mcp/tools/manage-skill.d.ts +8 -0
  176. package/dist/mcp/tools/manage-skill.d.ts.map +1 -0
  177. package/dist/mcp/tools/manage-skill.js +149 -0
  178. package/dist/mcp/tools/manage-skill.js.map +1 -0
  179. package/dist/mcp/tools/memory.d.ts +8 -0
  180. package/dist/mcp/tools/memory.d.ts.map +1 -0
  181. package/dist/mcp/tools/memory.js +106 -0
  182. package/dist/mcp/tools/memory.js.map +1 -0
  183. package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -1
  184. package/dist/mcp/tools/reindex-knowledge.js +11 -7
  185. package/dist/mcp/tools/reindex-knowledge.js.map +1 -1
  186. package/dist/schemas/graph.schema.d.ts +2 -0
  187. package/dist/schemas/graph.schema.d.ts.map +1 -1
  188. package/dist/schemas/graph.schema.js +1 -0
  189. package/dist/schemas/graph.schema.js.map +1 -1
  190. package/dist/schemas/knowledge.schema.d.ts +4 -0
  191. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  192. package/dist/schemas/knowledge.schema.js +1 -1
  193. package/dist/schemas/knowledge.schema.js.map +1 -1
  194. package/dist/schemas/skill.schema.d.ts +57 -0
  195. package/dist/schemas/skill.schema.d.ts.map +1 -0
  196. package/dist/schemas/skill.schema.js +24 -0
  197. package/dist/schemas/skill.schema.js.map +1 -0
  198. package/dist/web/dashboard/dist/assets/benchmark-tab-BW4QxI49.js +1 -0
  199. package/dist/web/dashboard/dist/assets/constants-kpH_c6vY.js +1 -0
  200. package/dist/web/dashboard/dist/assets/context-tab-C5RAlXNW.js +1 -0
  201. package/dist/web/dashboard/dist/assets/gitnexus-tab-BnxxYl2F.js +430 -0
  202. package/dist/web/dashboard/dist/assets/graph-tab-Cv_wQ6Az.js +1 -0
  203. package/dist/web/dashboard/dist/assets/graph-utils-Ds1zJyD1.js +7 -0
  204. package/dist/web/dashboard/dist/assets/index-BAeZDWWy.js +53 -0
  205. package/dist/web/dashboard/dist/assets/index-Bic_URMs.js +17 -0
  206. package/dist/web/dashboard/dist/assets/index-DQqYFXms.css +1 -0
  207. package/dist/web/dashboard/dist/assets/insights-tab-U_ATOqPu.js +52 -0
  208. package/dist/web/dashboard/dist/assets/{logs-tab-Cxpcv_ni.js → logs-tab-B8psCXuB.js} +1 -1
  209. package/dist/web/dashboard/dist/assets/memories-tab-DcWok2by.js +1 -0
  210. package/dist/web/dashboard/dist/assets/prd-backlog-tab-CjftveTc.js +1 -0
  211. package/dist/web/dashboard/dist/assets/skills-tab-Ddp1w4vS.js +1 -0
  212. package/dist/web/dashboard/dist/index.html +2 -2
  213. package/package.json +2 -2
  214. package/dist/api/routes/gitnexus.d.ts +0 -12
  215. package/dist/api/routes/gitnexus.d.ts.map +0 -1
  216. package/dist/api/routes/gitnexus.js +0 -164
  217. package/dist/api/routes/gitnexus.js.map +0 -1
  218. package/dist/core/integrations/gitnexus-launcher.d.ts +0 -67
  219. package/dist/core/integrations/gitnexus-launcher.d.ts.map +0 -1
  220. package/dist/core/integrations/gitnexus-launcher.js +0 -268
  221. package/dist/core/integrations/gitnexus-launcher.js.map +0 -1
  222. package/dist/core/integrations/gitnexus-queries.d.ts +0 -55
  223. package/dist/core/integrations/gitnexus-queries.d.ts.map +0 -1
  224. package/dist/core/integrations/gitnexus-queries.js +0 -168
  225. package/dist/core/integrations/gitnexus-queries.js.map +0 -1
  226. package/dist/core/integrations/serena-reader.d.ts +0 -18
  227. package/dist/core/integrations/serena-reader.d.ts.map +0 -1
  228. package/dist/core/integrations/serena-reader.js +0 -68
  229. package/dist/core/integrations/serena-reader.js.map +0 -1
  230. package/dist/core/rag/serena-indexer.d.ts +0 -16
  231. package/dist/core/rag/serena-indexer.d.ts.map +0 -1
  232. package/dist/core/rag/serena-indexer.js.map +0 -1
  233. package/dist/core/rag/serena-rag-query.d.ts.map +0 -1
  234. package/dist/core/rag/serena-rag-query.js.map +0 -1
  235. package/dist/web/dashboard/dist/assets/benchmark-tab-DE6hAHVG.js +0 -1
  236. package/dist/web/dashboard/dist/assets/constants-BIEJOBya.js +0 -1
  237. package/dist/web/dashboard/dist/assets/gitnexus-tab-DsBjJHx8.js +0 -312
  238. package/dist/web/dashboard/dist/assets/graph-tab-C09DzeZ_.js +0 -1
  239. package/dist/web/dashboard/dist/assets/graph-utils-D4LFspTf.js +0 -23
  240. package/dist/web/dashboard/dist/assets/index-B2fTJ4AS.js +0 -53
  241. package/dist/web/dashboard/dist/assets/index-CkqEqKiH.css +0 -1
  242. package/dist/web/dashboard/dist/assets/insights-tab-Bm7CDckb.js +0 -1
  243. package/dist/web/dashboard/dist/assets/prd-backlog-tab-X84Rj-IB.js +0 -1
  244. package/dist/web/dashboard/dist/assets/serena-tab-BunULNvw.js +0 -1
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Code indexer — orchestrates: walk files → analyze → store.
3
+ * Supports incremental reindexing by clearing per-file data before reinserting.
4
+ */
5
+ import { readdirSync } from "node:fs";
6
+ import path from "node:path";
7
+ import { analyzeFile } from "./ts-analyzer.js";
8
+ import { now } from "../utils/time.js";
9
+ import { logger } from "../utils/logger.js";
10
+ const TS_EXTENSIONS = new Set([".ts", ".tsx", ".js", ".jsx", ".mts", ".cts"]);
11
+ const IGNORED_DIRS = new Set(["node_modules", "dist", ".git", "coverage", ".next", ".nuxt"]);
12
+ export class CodeIndexer {
13
+ store;
14
+ projectId;
15
+ constructor(store, projectId) {
16
+ this.store = store;
17
+ this.projectId = projectId;
18
+ }
19
+ /**
20
+ * Index all TypeScript/JavaScript files in a directory tree.
21
+ */
22
+ indexDirectory(dirPath, basePath) {
23
+ const files = walkDirectory(dirPath);
24
+ logger.info("code-indexer:start", {
25
+ directory: dirPath,
26
+ fileCount: files.length,
27
+ });
28
+ return this.indexFiles(files, basePath);
29
+ }
30
+ /**
31
+ * Index specific files.
32
+ */
33
+ indexFiles(filePaths, basePath) {
34
+ let totalSymbols = 0;
35
+ let totalRelations = 0;
36
+ let fileCount = 0;
37
+ for (const filePath of filePaths) {
38
+ const ext = path.extname(filePath);
39
+ if (!TS_EXTENSIONS.has(ext))
40
+ continue;
41
+ try {
42
+ const relativePath = path.relative(basePath, filePath);
43
+ // Clear existing data for this file (incremental)
44
+ this.store.deleteSymbolsByFile(relativePath, this.projectId);
45
+ const result = analyzeFile(filePath, basePath);
46
+ if (result.symbols.length === 0)
47
+ continue;
48
+ // Insert symbols
49
+ const symbolsWithProject = result.symbols.map((s) => ({
50
+ ...s,
51
+ projectId: this.projectId,
52
+ modulePath: extractModulePath(s.file),
53
+ }));
54
+ const symCount = this.store.insertSymbolsBulk(symbolsWithProject);
55
+ totalSymbols += symCount;
56
+ // Insert relations — need to resolve symbol IDs
57
+ if (result.relations.length > 0) {
58
+ const resolvedRelations = resolveRelationIds(result.relations, result.symbols, this.store, this.projectId);
59
+ if (resolvedRelations.length > 0) {
60
+ const relCount = this.store.insertRelationsBulk(resolvedRelations);
61
+ totalRelations += relCount;
62
+ }
63
+ }
64
+ fileCount++;
65
+ }
66
+ catch (err) {
67
+ logger.warn("code-indexer:file-error", {
68
+ file: filePath,
69
+ error: err instanceof Error ? err.message : String(err),
70
+ });
71
+ }
72
+ }
73
+ // Update metadata
74
+ this.store.upsertIndexMeta({
75
+ projectId: this.projectId,
76
+ lastIndexed: now(),
77
+ fileCount,
78
+ symbolCount: totalSymbols,
79
+ relationCount: totalRelations,
80
+ });
81
+ logger.info("code-indexer:done", {
82
+ fileCount,
83
+ symbolCount: totalSymbols,
84
+ relationCount: totalRelations,
85
+ });
86
+ return { fileCount, symbolCount: totalSymbols, relationCount: totalRelations };
87
+ }
88
+ }
89
+ // ── Helpers ──────────────────────────────────────────
90
+ function walkDirectory(dir) {
91
+ const files = [];
92
+ function recurse(currentDir) {
93
+ let entries;
94
+ try {
95
+ entries = readdirSync(currentDir, { withFileTypes: true });
96
+ }
97
+ catch {
98
+ return;
99
+ }
100
+ for (const entry of entries) {
101
+ if (entry.name.startsWith("."))
102
+ continue;
103
+ if (IGNORED_DIRS.has(entry.name))
104
+ continue;
105
+ const fullPath = path.join(currentDir, entry.name);
106
+ if (entry.isDirectory()) {
107
+ recurse(fullPath);
108
+ }
109
+ else if (entry.isFile() && TS_EXTENSIONS.has(path.extname(entry.name))) {
110
+ // Skip test files and declaration files
111
+ if (entry.name.endsWith(".test.ts") || entry.name.endsWith(".d.ts") || entry.name.endsWith(".spec.ts")) {
112
+ continue;
113
+ }
114
+ files.push(fullPath);
115
+ }
116
+ }
117
+ }
118
+ recurse(dir);
119
+ return files;
120
+ }
121
+ function extractModulePath(file) {
122
+ const dir = path.dirname(file);
123
+ if (dir === "." || dir === "")
124
+ return "root";
125
+ // Normalize: src/core/utils → core/utils
126
+ return dir.replace(/^src\//, "");
127
+ }
128
+ /**
129
+ * Resolve symbolic relation references (symbol names) to actual stored IDs.
130
+ * For belongs_to/extends/implements, both symbols are in the same file.
131
+ * For calls/imports, the target may be in another file.
132
+ */
133
+ function resolveRelationIds(relations, fileSymbols, store, projectId) {
134
+ const resolved = [];
135
+ for (const rel of relations) {
136
+ // Find source symbol ID
137
+ const fromCandidates = store.findSymbolsByName(rel.fromSymbol, projectId);
138
+ // For file-level imports, fromSymbol is the file path
139
+ const from = fromCandidates.length > 0
140
+ ? fromCandidates[0]
141
+ : null;
142
+ // Find target symbol ID
143
+ const toCandidates = store.findSymbolsByName(rel.toSymbol, projectId);
144
+ const to = toCandidates.length > 0
145
+ ? toCandidates[0]
146
+ : null;
147
+ if (from && to) {
148
+ resolved.push({
149
+ projectId,
150
+ fromSymbol: from.id,
151
+ toSymbol: to.id,
152
+ type: rel.type,
153
+ file: rel.file,
154
+ line: rel.line,
155
+ metadata: rel.metadata,
156
+ });
157
+ }
158
+ }
159
+ return resolved;
160
+ }
161
+ //# sourceMappingURL=code-indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-indexer.js","sourceRoot":"","sources":["../../../src/core/code/code-indexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Code symbol search using FTS5 + optional TF-IDF reranking.
3
+ * Reuses patterns from core/search/fts-search.ts and core/search/tfidf.ts.
4
+ */
5
+ import type { CodeStore } from "./code-store.js";
6
+ import type { CodeSearchResult } from "./code-types.js";
7
+ export interface CodeSearchOptions {
8
+ limit?: number;
9
+ rerank?: boolean;
10
+ groupByModule?: boolean;
11
+ }
12
+ /**
13
+ * Search code symbols using FTS5 with optional TF-IDF reranking.
14
+ */
15
+ export declare function searchCodeSymbols(store: CodeStore, query: string, projectId: string, options?: CodeSearchOptions): CodeSearchResult[];
16
+ //# sourceMappingURL=code-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-search.d.ts","sourceRoot":"","sources":["../../../src/core/code/code-search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIxD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAmBD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,EAAE,CAyDpB"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Code symbol search using FTS5 + optional TF-IDF reranking.
3
+ * Reuses patterns from core/search/fts-search.ts and core/search/tfidf.ts.
4
+ */
5
+ import { rerankWithTfIdf } from "../search/tfidf.js";
6
+ import { logger } from "../utils/logger.js";
7
+ /**
8
+ * Sanitize user query for FTS5 — escape special characters.
9
+ */
10
+ function sanitizeFtsQuery(raw) {
11
+ const cleaned = raw
12
+ .replace(/[*"(){}[\]:^~!@#$%&|\\]/g, " ")
13
+ .replace(/\b(AND|OR|NOT|NEAR)\b/gi, " ")
14
+ .trim()
15
+ .replace(/\s+/g, " ");
16
+ if (!cleaned)
17
+ return '""';
18
+ const terms = cleaned.split(" ").filter(Boolean);
19
+ // Use prefix matching (*) for code symbol search — "validate" should match "validateNode"
20
+ return terms.map((t) => `"${t}"*`).join(" ");
21
+ }
22
+ /**
23
+ * Search code symbols using FTS5 with optional TF-IDF reranking.
24
+ */
25
+ export function searchCodeSymbols(store, query, projectId, options = {}) {
26
+ const { limit = 20, rerank = false, groupByModule = false } = options;
27
+ const sanitized = sanitizeFtsQuery(query);
28
+ logger.debug("code-search:start", { query, sanitized, rerank, groupByModule });
29
+ const startMs = performance.now();
30
+ const candidateLimit = rerank ? Math.min(limit * 3, 100) : limit;
31
+ const ftsResults = store.searchSymbols(sanitized, projectId, candidateLimit);
32
+ logger.debug("code-search:fts", {
33
+ resultCount: ftsResults.length,
34
+ durationMs: Math.round(performance.now() - startMs),
35
+ });
36
+ if (ftsResults.length === 0)
37
+ return [];
38
+ let results;
39
+ if (rerank) {
40
+ const candidates = ftsResults.map((r) => ({
41
+ id: r.symbol.id,
42
+ text: [r.symbol.name, r.symbol.file, r.symbol.signature ?? ""].join(" "),
43
+ }));
44
+ const reranked = rerankWithTfIdf(candidates, query, limit);
45
+ const symbolMap = new Map(ftsResults.map((r) => [r.symbol.id, r]));
46
+ results = [];
47
+ for (const r of reranked) {
48
+ const match = symbolMap.get(r.id);
49
+ if (!match)
50
+ continue;
51
+ results.push({
52
+ symbol: match.symbol,
53
+ score: r.score,
54
+ modulePath: match.symbol.modulePath,
55
+ });
56
+ }
57
+ }
58
+ else {
59
+ results = ftsResults.slice(0, limit).map((r) => ({
60
+ symbol: r.symbol,
61
+ score: r.score,
62
+ modulePath: r.symbol.modulePath,
63
+ }));
64
+ }
65
+ if (groupByModule) {
66
+ // Sort by module path for grouping
67
+ results.sort((a, b) => {
68
+ const ma = a.modulePath ?? "";
69
+ const mb = b.modulePath ?? "";
70
+ if (ma !== mb)
71
+ return ma.localeCompare(mb);
72
+ return b.score - a.score;
73
+ });
74
+ }
75
+ return results;
76
+ }
77
+ //# sourceMappingURL=code-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-search.js","sourceRoot":"","sources":["../../../src/core/code/code-search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ5C;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,OAAO,GAAG,GAAG;SAChB,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC;SACxC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC;SACvC,IAAI,EAAE;SACN,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,0FAA0F;IAC1F,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAgB,EAChB,KAAa,EACb,SAAiB,EACjB,UAA6B,EAAE;IAE/B,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,KAAK,EAAE,aAAa,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACtE,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAE/E,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACjE,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAE7E,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE;QAC9B,WAAW,EAAE,UAAU,CAAC,MAAM;QAC9B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;KACpD,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,IAAI,OAA2B,CAAC;IAEhC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE;YACf,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACzE,CAAC,CAAC,CAAC;QAEJ,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnE,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU;SAChC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,mCAAmC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpB,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;YAC9B,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * SQLite CRUD operations for code_symbols and code_relations tables.
3
+ * Uses the same Database instance from SqliteStore (shared DB).
4
+ */
5
+ import type Database from "better-sqlite3";
6
+ import type { CodeSymbol, CodeRelation, CodeIndexMeta } from "./code-types.js";
7
+ export declare class CodeStore {
8
+ private readonly db;
9
+ constructor(db: Database.Database);
10
+ insertSymbol(symbol: Omit<CodeSymbol, "id" | "indexedAt">): CodeSymbol;
11
+ insertSymbolsBulk(symbols: Omit<CodeSymbol, "id" | "indexedAt">[]): number;
12
+ getSymbol(id: string): CodeSymbol | null;
13
+ findSymbolsByName(name: string, projectId: string): CodeSymbol[];
14
+ findSymbolsByFile(file: string, projectId: string): CodeSymbol[];
15
+ findSymbolAtLine(file: string, line: number, projectId: string): CodeSymbol | null;
16
+ getAllSymbols(projectId: string, limit?: number): CodeSymbol[];
17
+ deleteSymbolsByFile(file: string, projectId: string): number;
18
+ deleteAllSymbols(projectId: string): void;
19
+ insertRelation(relation: Omit<CodeRelation, "id" | "indexedAt">): CodeRelation;
20
+ insertRelationsBulk(relations: Omit<CodeRelation, "id" | "indexedAt">[]): number;
21
+ getRelationsFrom(symbolId: string): CodeRelation[];
22
+ getRelationsTo(symbolId: string): CodeRelation[];
23
+ getRelationsBetween(fromId: string, toId: string): CodeRelation[];
24
+ getAllRelations(projectId: string, limit?: number): CodeRelation[];
25
+ searchSymbols(query: string, projectId: string, limit?: number): Array<{
26
+ symbol: CodeSymbol;
27
+ score: number;
28
+ }>;
29
+ getIndexMeta(projectId: string): CodeIndexMeta | null;
30
+ upsertIndexMeta(meta: CodeIndexMeta): void;
31
+ getSymbolCount(projectId: string): number;
32
+ getRelationCount(projectId: string): number;
33
+ getModulePaths(projectId: string): string[];
34
+ }
35
+ //# sourceMappingURL=code-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-store.d.ts","sourceRoot":"","sources":["../../../src/core/code/code-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAwF/E,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIlD,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,UAAU;IAyBtE,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM;IA8B1E,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAOxC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;IAOhE,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;IAOhE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IASlF,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,UAAU,EAAE;IAOpE,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAsB5D,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASzC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,YAAY;IAsB9E,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM;IA2BhF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE;IAOlD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE;IAOhD,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE;IAOjE,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAc,GAAG,YAAY,EAAE;IASzE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBjH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAOrD,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAwB1C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAOzC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAO3C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;CAM5C"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * SQLite CRUD operations for code_symbols and code_relations tables.
3
+ * Uses the same Database instance from SqliteStore (shared DB).
4
+ */
5
+ import { generateId } from "../utils/id.js";
6
+ import { now } from "../utils/time.js";
7
+ // ── Mappers ──────────────────────────────────────────────
8
+ function rowToSymbol(row) {
9
+ return {
10
+ id: row.id,
11
+ projectId: row.project_id,
12
+ name: row.name,
13
+ kind: row.kind,
14
+ file: row.file,
15
+ startLine: row.start_line,
16
+ endLine: row.end_line,
17
+ exported: row.exported === 1,
18
+ modulePath: row.module_path,
19
+ signature: row.signature,
20
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
21
+ indexedAt: row.indexed_at,
22
+ };
23
+ }
24
+ function rowToRelation(row) {
25
+ return {
26
+ id: row.id,
27
+ projectId: row.project_id,
28
+ fromSymbol: row.from_symbol,
29
+ toSymbol: row.to_symbol,
30
+ type: row.type,
31
+ file: row.file,
32
+ line: row.line,
33
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
34
+ indexedAt: row.indexed_at,
35
+ };
36
+ }
37
+ function rowToMeta(row) {
38
+ return {
39
+ projectId: row.project_id,
40
+ lastIndexed: row.last_indexed,
41
+ fileCount: row.file_count,
42
+ symbolCount: row.symbol_count,
43
+ relationCount: row.relation_count,
44
+ gitHash: row.git_hash,
45
+ };
46
+ }
47
+ // ── CodeStore ────────────────────────────────────────────
48
+ export class CodeStore {
49
+ db;
50
+ constructor(db) {
51
+ this.db = db;
52
+ }
53
+ // ── Symbols ──────────────────────────────────────
54
+ insertSymbol(symbol) {
55
+ const id = generateId("csym");
56
+ const indexedAt = now();
57
+ this.db
58
+ .prepare(`INSERT INTO code_symbols (id, project_id, name, kind, file, start_line, end_line, exported, module_path, signature, metadata, indexed_at)
59
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
60
+ .run(id, symbol.projectId, symbol.name, symbol.kind, symbol.file, symbol.startLine, symbol.endLine, symbol.exported ? 1 : 0, symbol.modulePath ?? null, symbol.signature ?? null, symbol.metadata ? JSON.stringify(symbol.metadata) : null, indexedAt);
61
+ return { ...symbol, id, indexedAt };
62
+ }
63
+ insertSymbolsBulk(symbols) {
64
+ const indexedAt = now();
65
+ const stmt = this.db.prepare(`INSERT INTO code_symbols (id, project_id, name, kind, file, start_line, end_line, exported, module_path, signature, metadata, indexed_at)
66
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
67
+ const insertMany = this.db.transaction((syms) => {
68
+ for (const s of syms) {
69
+ stmt.run(generateId("csym"), s.projectId, s.name, s.kind, s.file, s.startLine, s.endLine, s.exported ? 1 : 0, s.modulePath ?? null, s.signature ?? null, s.metadata ? JSON.stringify(s.metadata) : null, indexedAt);
70
+ }
71
+ return syms.length;
72
+ });
73
+ return insertMany(symbols);
74
+ }
75
+ getSymbol(id) {
76
+ const row = this.db
77
+ .prepare("SELECT * FROM code_symbols WHERE id = ?")
78
+ .get(id);
79
+ return row ? rowToSymbol(row) : null;
80
+ }
81
+ findSymbolsByName(name, projectId) {
82
+ const rows = this.db
83
+ .prepare("SELECT * FROM code_symbols WHERE name = ? AND project_id = ?")
84
+ .all(name, projectId);
85
+ return rows.map(rowToSymbol);
86
+ }
87
+ findSymbolsByFile(file, projectId) {
88
+ const rows = this.db
89
+ .prepare("SELECT * FROM code_symbols WHERE file = ? AND project_id = ?")
90
+ .all(file, projectId);
91
+ return rows.map(rowToSymbol);
92
+ }
93
+ findSymbolAtLine(file, line, projectId) {
94
+ const row = this.db
95
+ .prepare("SELECT * FROM code_symbols WHERE file = ? AND start_line <= ? AND end_line >= ? AND project_id = ? ORDER BY (end_line - start_line) ASC LIMIT 1")
96
+ .get(file, line, line, projectId);
97
+ return row ? rowToSymbol(row) : null;
98
+ }
99
+ getAllSymbols(projectId, limit = 5000) {
100
+ const rows = this.db
101
+ .prepare("SELECT * FROM code_symbols WHERE project_id = ? LIMIT ?")
102
+ .all(projectId, limit);
103
+ return rows.map(rowToSymbol);
104
+ }
105
+ deleteSymbolsByFile(file, projectId) {
106
+ // First delete relations referencing these symbols
107
+ const symbolIds = this.db
108
+ .prepare("SELECT id FROM code_symbols WHERE file = ? AND project_id = ?")
109
+ .all(file, projectId);
110
+ if (symbolIds.length === 0)
111
+ return 0;
112
+ const ids = symbolIds.map((r) => r.id);
113
+ const placeholders = ids.map(() => "?").join(",");
114
+ this.db
115
+ .prepare(`DELETE FROM code_relations WHERE from_symbol IN (${placeholders}) OR to_symbol IN (${placeholders})`)
116
+ .run(...ids, ...ids);
117
+ const result = this.db
118
+ .prepare("DELETE FROM code_symbols WHERE file = ? AND project_id = ?")
119
+ .run(file, projectId);
120
+ return result.changes;
121
+ }
122
+ deleteAllSymbols(projectId) {
123
+ this.db.transaction(() => {
124
+ this.db.prepare("DELETE FROM code_relations WHERE project_id = ?").run(projectId);
125
+ this.db.prepare("DELETE FROM code_symbols WHERE project_id = ?").run(projectId);
126
+ })();
127
+ }
128
+ // ── Relations ────────────────────────────────────
129
+ insertRelation(relation) {
130
+ const id = generateId("crel");
131
+ const indexedAt = now();
132
+ this.db
133
+ .prepare(`INSERT INTO code_relations (id, project_id, from_symbol, to_symbol, type, file, line, metadata, indexed_at)
134
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`)
135
+ .run(id, relation.projectId, relation.fromSymbol, relation.toSymbol, relation.type, relation.file ?? null, relation.line ?? null, relation.metadata ? JSON.stringify(relation.metadata) : null, indexedAt);
136
+ return { ...relation, id, indexedAt };
137
+ }
138
+ insertRelationsBulk(relations) {
139
+ const indexedAt = now();
140
+ const stmt = this.db.prepare(`INSERT INTO code_relations (id, project_id, from_symbol, to_symbol, type, file, line, metadata, indexed_at)
141
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);
142
+ const insertMany = this.db.transaction((rels) => {
143
+ for (const r of rels) {
144
+ stmt.run(generateId("crel"), r.projectId, r.fromSymbol, r.toSymbol, r.type, r.file ?? null, r.line ?? null, r.metadata ? JSON.stringify(r.metadata) : null, indexedAt);
145
+ }
146
+ return rels.length;
147
+ });
148
+ return insertMany(relations);
149
+ }
150
+ getRelationsFrom(symbolId) {
151
+ const rows = this.db
152
+ .prepare("SELECT * FROM code_relations WHERE from_symbol = ?")
153
+ .all(symbolId);
154
+ return rows.map(rowToRelation);
155
+ }
156
+ getRelationsTo(symbolId) {
157
+ const rows = this.db
158
+ .prepare("SELECT * FROM code_relations WHERE to_symbol = ?")
159
+ .all(symbolId);
160
+ return rows.map(rowToRelation);
161
+ }
162
+ getRelationsBetween(fromId, toId) {
163
+ const rows = this.db
164
+ .prepare("SELECT * FROM code_relations WHERE from_symbol = ? AND to_symbol = ?")
165
+ .all(fromId, toId);
166
+ return rows.map(rowToRelation);
167
+ }
168
+ getAllRelations(projectId, limit = 10000) {
169
+ const rows = this.db
170
+ .prepare("SELECT * FROM code_relations WHERE project_id = ? LIMIT ?")
171
+ .all(projectId, limit);
172
+ return rows.map(rowToRelation);
173
+ }
174
+ // ── FTS5 Search ──────────────────────────────────
175
+ searchSymbols(query, projectId, limit = 20) {
176
+ const rows = this.db
177
+ .prepare(`SELECT cs.*, rank AS score
178
+ FROM code_symbols_fts fts
179
+ JOIN code_symbols cs ON cs.rowid = fts.rowid
180
+ WHERE code_symbols_fts MATCH ? AND cs.project_id = ?
181
+ ORDER BY rank
182
+ LIMIT ?`)
183
+ .all(query, projectId, limit);
184
+ return rows.map((row) => ({
185
+ symbol: rowToSymbol(row),
186
+ score: Math.abs(row.score), // BM25 returns negative scores
187
+ }));
188
+ }
189
+ // ── Index Meta ───────────────────────────────────
190
+ getIndexMeta(projectId) {
191
+ const row = this.db
192
+ .prepare("SELECT * FROM code_index_meta WHERE project_id = ?")
193
+ .get(projectId);
194
+ return row ? rowToMeta(row) : null;
195
+ }
196
+ upsertIndexMeta(meta) {
197
+ this.db
198
+ .prepare(`INSERT INTO code_index_meta (project_id, last_indexed, file_count, symbol_count, relation_count, git_hash)
199
+ VALUES (?, ?, ?, ?, ?, ?)
200
+ ON CONFLICT(project_id) DO UPDATE SET
201
+ last_indexed = excluded.last_indexed,
202
+ file_count = excluded.file_count,
203
+ symbol_count = excluded.symbol_count,
204
+ relation_count = excluded.relation_count,
205
+ git_hash = excluded.git_hash`)
206
+ .run(meta.projectId, meta.lastIndexed, meta.fileCount, meta.symbolCount, meta.relationCount, meta.gitHash ?? null);
207
+ }
208
+ // ── Stats ────────────────────────────────────────
209
+ getSymbolCount(projectId) {
210
+ const row = this.db
211
+ .prepare("SELECT COUNT(*) as count FROM code_symbols WHERE project_id = ?")
212
+ .get(projectId);
213
+ return row.count;
214
+ }
215
+ getRelationCount(projectId) {
216
+ const row = this.db
217
+ .prepare("SELECT COUNT(*) as count FROM code_relations WHERE project_id = ?")
218
+ .get(projectId);
219
+ return row.count;
220
+ }
221
+ getModulePaths(projectId) {
222
+ const rows = this.db
223
+ .prepare("SELECT DISTINCT module_path FROM code_symbols WHERE project_id = ? AND module_path IS NOT NULL ORDER BY module_path")
224
+ .all(projectId);
225
+ return rows.map((r) => r.module_path);
226
+ }
227
+ }
228
+ //# sourceMappingURL=code-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-store.js","sourceRoot":"","sources":["../../../src/core/code/code-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAwCvC,4DAA4D;AAE5D,SAAS,WAAW,CAAC,GAAc;IACjC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAA0B;QACpC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,CAAC;QAC5B,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAA6B,CAAC,CAAC,CAAC,SAAS;QAC1F,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAgB;IACrC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,IAA4B;QACtC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAA6B,CAAC,CAAC,CAAC,SAAS;QAC1F,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,OAAO,EAAE,GAAG,CAAC,QAAQ;KACtB,CAAC;AACJ,CAAC;AAED,4DAA4D;AAE5D,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAEtD,oDAAoD;IAEpD,YAAY,CAAC,MAA4C;QACvD,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;qDAC6C,CAC9C;aACA,GAAG,CACF,EAAE,EACF,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,MAAM,CAAC,UAAU,IAAI,IAAI,EACzB,MAAM,CAAC,SAAS,IAAI,IAAI,EACxB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EACxD,SAAS,CACV,CAAC;QACJ,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;IACtC,CAAC;IAED,iBAAiB,CAAC,OAA+C;QAC/D,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;mDAC6C,CAC9C,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,IAAoB,EAAE,EAAE;YAC9D,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,GAAG,CACN,UAAU,CAAC,MAAM,CAAC,EAClB,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAClB,CAAC,CAAC,UAAU,IAAI,IAAI,EACpB,CAAC,CAAC,SAAS,IAAI,IAAI,EACnB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAC9C,SAAS,CACV,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,yCAAyC,CAAC;aAClD,GAAG,CAAC,EAAE,CAA0B,CAAC;QACpC,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAED,iBAAiB,CAAC,IAAY,EAAE,SAAiB;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,8DAA8D,CAAC;aACvE,GAAG,CAAC,IAAI,EAAE,SAAS,CAAgB,CAAC;QACvC,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,iBAAiB,CAAC,IAAY,EAAE,SAAiB;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,8DAA8D,CAAC;aACvE,GAAG,CAAC,IAAI,EAAE,SAAS,CAAgB,CAAC;QACvC,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,gBAAgB,CAAC,IAAY,EAAE,IAAY,EAAE,SAAiB;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN,iJAAiJ,CAClJ;aACA,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAA0B,CAAC;QAC7D,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAED,aAAa,CAAC,SAAiB,EAAE,QAAgB,IAAI;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,yDAAyD,CAAC;aAClE,GAAG,CAAC,SAAS,EAAE,KAAK,CAAgB,CAAC;QACxC,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,mBAAmB,CAAC,IAAY,EAAE,SAAiB;QACjD,mDAAmD;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,+DAA+D,CAAC;aACxE,GAAG,CAAC,IAAI,EAAE,SAAS,CAA0B,CAAC;QAEjD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAErC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAElD,IAAI,CAAC,EAAE;aACJ,OAAO,CAAC,oDAAoD,YAAY,sBAAsB,YAAY,GAAG,CAAC;aAC9G,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;QAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,4DAA4D,CAAC;aACrE,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAExB,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,gBAAgB,CAAC,SAAiB;QAChC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClF,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAED,oDAAoD;IAEpD,cAAc,CAAC,QAAgD;QAC7D,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;4CACoC,CACrC;aACA,GAAG,CACF,EAAE,EACF,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,IAAI,IAAI,IAAI,EACrB,QAAQ,CAAC,IAAI,IAAI,IAAI,EACrB,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAC5D,SAAS,CACV,CAAC;QACJ,OAAO,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;IACxC,CAAC;IAED,mBAAmB,CAAC,SAAmD;QACrE,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;0CACoC,CACrC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,IAAsB,EAAE,EAAE;YAChE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,GAAG,CACN,UAAU,CAAC,MAAM,CAAC,EAClB,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,UAAU,EACZ,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,IAAI,IAAI,IAAI,EACd,CAAC,CAAC,IAAI,IAAI,IAAI,EACd,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAC9C,SAAS,CACV,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,gBAAgB,CAAC,QAAgB;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,oDAAoD,CAAC;aAC7D,GAAG,CAAC,QAAQ,CAAkB,CAAC;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,cAAc,CAAC,QAAgB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,kDAAkD,CAAC;aAC3D,GAAG,CAAC,QAAQ,CAAkB,CAAC;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,mBAAmB,CAAC,MAAc,EAAE,IAAY;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,sEAAsE,CAAC;aAC/E,GAAG,CAAC,MAAM,EAAE,IAAI,CAAkB,CAAC;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,eAAe,CAAC,SAAiB,EAAE,QAAgB,KAAK;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,2DAA2D,CAAC;aACpE,GAAG,CAAC,SAAS,EAAE,KAAK,CAAkB,CAAC;QAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,oDAAoD;IAEpD,aAAa,CAAC,KAAa,EAAE,SAAiB,EAAE,QAAgB,EAAE;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;;iBAKS,CACV;aACA,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAyC,CAAC;QAExE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC;YACxB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,+BAA+B;SAC5D,CAAC,CAAC,CAAC;IACN,CAAC;IAED,oDAAoD;IAEpD,YAAY,CAAC,SAAiB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,oDAAoD,CAAC;aAC7D,GAAG,CAAC,SAAS,CAAwB,CAAC;QACzC,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAED,eAAe,CAAC,IAAmB;QACjC,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;;;;;;wCAOgC,CACjC;aACA,GAAG,CACF,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,OAAO,IAAI,IAAI,CACrB,CAAC;IACN,CAAC;IAED,oDAAoD;IAEpD,cAAc,CAAC,SAAiB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,iEAAiE,CAAC;aAC1E,GAAG,CAAC,SAAS,CAAsB,CAAC;QACvC,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,gBAAgB,CAAC,SAAiB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,mEAAmE,CAAC;aAC5E,GAAG,CAAC,SAAS,CAAsB,CAAC;QACvC,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,qHAAqH,CAAC;aAC9H,GAAG,CAAC,SAAS,CAAmC,CAAC;QACpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;CACF"}