codesift-mcp 0.1.0 → 0.2.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 (299) hide show
  1. package/LICENSE +66 -21
  2. package/README.md +346 -56
  3. package/dist/cli/args.d.ts +2 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +11 -0
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/commands.d.ts.map +1 -1
  8. package/dist/cli/commands.js +177 -67
  9. package/dist/cli/commands.js.map +1 -1
  10. package/dist/cli/help.d.ts +1 -1
  11. package/dist/cli/help.d.ts.map +1 -1
  12. package/dist/cli/help.js +157 -0
  13. package/dist/cli/help.js.map +1 -1
  14. package/dist/cli/hooks.d.ts +3 -0
  15. package/dist/cli/hooks.d.ts.map +1 -0
  16. package/dist/cli/hooks.js +163 -0
  17. package/dist/cli/hooks.js.map +1 -0
  18. package/dist/cli/setup.d.ts +25 -0
  19. package/dist/cli/setup.d.ts.map +1 -0
  20. package/dist/cli/setup.js +400 -0
  21. package/dist/cli/setup.js.map +1 -0
  22. package/dist/config.d.ts +2 -0
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +2 -0
  25. package/dist/config.js.map +1 -1
  26. package/dist/formatters-shortening.d.ts +7 -0
  27. package/dist/formatters-shortening.d.ts.map +1 -0
  28. package/dist/formatters-shortening.js +68 -0
  29. package/dist/formatters-shortening.js.map +1 -0
  30. package/dist/formatters.d.ts +314 -0
  31. package/dist/formatters.d.ts.map +1 -0
  32. package/dist/formatters.js +396 -0
  33. package/dist/formatters.js.map +1 -0
  34. package/dist/instructions.d.ts +6 -0
  35. package/dist/instructions.d.ts.map +1 -0
  36. package/dist/instructions.js +72 -0
  37. package/dist/instructions.js.map +1 -0
  38. package/dist/lsp/lsp-client.d.ts +21 -0
  39. package/dist/lsp/lsp-client.d.ts.map +1 -0
  40. package/dist/lsp/lsp-client.js +122 -0
  41. package/dist/lsp/lsp-client.js.map +1 -0
  42. package/dist/lsp/lsp-manager.d.ts +12 -0
  43. package/dist/lsp/lsp-manager.d.ts.map +1 -0
  44. package/dist/lsp/lsp-manager.js +82 -0
  45. package/dist/lsp/lsp-manager.js.map +1 -0
  46. package/dist/lsp/lsp-servers.d.ts +13 -0
  47. package/dist/lsp/lsp-servers.d.ts.map +1 -0
  48. package/dist/lsp/lsp-servers.js +57 -0
  49. package/dist/lsp/lsp-servers.js.map +1 -0
  50. package/dist/lsp/lsp-tools.d.ts +67 -0
  51. package/dist/lsp/lsp-tools.d.ts.map +1 -0
  52. package/dist/lsp/lsp-tools.js +359 -0
  53. package/dist/lsp/lsp-tools.js.map +1 -0
  54. package/dist/parser/extractors/_shared.d.ts +11 -0
  55. package/dist/parser/extractors/_shared.d.ts.map +1 -0
  56. package/dist/parser/extractors/_shared.js +38 -0
  57. package/dist/parser/extractors/_shared.js.map +1 -0
  58. package/dist/parser/extractors/astro.d.ts +15 -0
  59. package/dist/parser/extractors/astro.d.ts.map +1 -0
  60. package/dist/parser/extractors/astro.js +104 -0
  61. package/dist/parser/extractors/astro.js.map +1 -0
  62. package/dist/parser/extractors/conversation.d.ts +16 -0
  63. package/dist/parser/extractors/conversation.d.ts.map +1 -0
  64. package/dist/parser/extractors/conversation.js +196 -0
  65. package/dist/parser/extractors/conversation.js.map +1 -0
  66. package/dist/parser/extractors/go.d.ts.map +1 -1
  67. package/dist/parser/extractors/go.js +22 -45
  68. package/dist/parser/extractors/go.js.map +1 -1
  69. package/dist/parser/extractors/python.d.ts +1 -1
  70. package/dist/parser/extractors/python.d.ts.map +1 -1
  71. package/dist/parser/extractors/python.js +19 -50
  72. package/dist/parser/extractors/python.js.map +1 -1
  73. package/dist/parser/extractors/rust.d.ts +1 -1
  74. package/dist/parser/extractors/rust.d.ts.map +1 -1
  75. package/dist/parser/extractors/rust.js +7 -34
  76. package/dist/parser/extractors/rust.js.map +1 -1
  77. package/dist/parser/extractors/typescript.d.ts +1 -1
  78. package/dist/parser/extractors/typescript.d.ts.map +1 -1
  79. package/dist/parser/extractors/typescript.js +99 -68
  80. package/dist/parser/extractors/typescript.js.map +1 -1
  81. package/dist/parser/parser-manager.d.ts.map +1 -1
  82. package/dist/parser/parser-manager.js +12 -2
  83. package/dist/parser/parser-manager.js.map +1 -1
  84. package/dist/parser/symbol-extractor.d.ts +2 -0
  85. package/dist/parser/symbol-extractor.d.ts.map +1 -1
  86. package/dist/parser/symbol-extractor.js +2 -0
  87. package/dist/parser/symbol-extractor.js.map +1 -1
  88. package/dist/register-tools.d.ts +127 -0
  89. package/dist/register-tools.d.ts.map +1 -0
  90. package/dist/register-tools.js +1453 -0
  91. package/dist/register-tools.js.map +1 -0
  92. package/dist/retrieval/codebase-retrieval.d.ts +4 -26
  93. package/dist/retrieval/codebase-retrieval.d.ts.map +1 -1
  94. package/dist/retrieval/codebase-retrieval.js +105 -403
  95. package/dist/retrieval/codebase-retrieval.js.map +1 -1
  96. package/dist/retrieval/retrieval-constants.d.ts +27 -0
  97. package/dist/retrieval/retrieval-constants.d.ts.map +1 -0
  98. package/dist/retrieval/retrieval-constants.js +27 -0
  99. package/dist/retrieval/retrieval-constants.js.map +1 -0
  100. package/dist/retrieval/retrieval-schemas.d.ts +107 -0
  101. package/dist/retrieval/retrieval-schemas.d.ts.map +1 -0
  102. package/dist/retrieval/retrieval-schemas.js +102 -0
  103. package/dist/retrieval/retrieval-schemas.js.map +1 -0
  104. package/dist/retrieval/retrieval-utils.d.ts +40 -0
  105. package/dist/retrieval/retrieval-utils.d.ts.map +1 -0
  106. package/dist/retrieval/retrieval-utils.js +139 -0
  107. package/dist/retrieval/retrieval-utils.js.map +1 -0
  108. package/dist/retrieval/semantic-handlers.d.ts +8 -0
  109. package/dist/retrieval/semantic-handlers.d.ts.map +1 -0
  110. package/dist/retrieval/semantic-handlers.js +152 -0
  111. package/dist/retrieval/semantic-handlers.js.map +1 -0
  112. package/dist/search/bm25.d.ts +6 -1
  113. package/dist/search/bm25.d.ts.map +1 -1
  114. package/dist/search/bm25.js +95 -32
  115. package/dist/search/bm25.js.map +1 -1
  116. package/dist/search/chunker.d.ts +10 -0
  117. package/dist/search/chunker.d.ts.map +1 -1
  118. package/dist/search/chunker.js +63 -11
  119. package/dist/search/chunker.js.map +1 -1
  120. package/dist/search/reranker.d.ts +15 -0
  121. package/dist/search/reranker.d.ts.map +1 -0
  122. package/dist/search/reranker.js +126 -0
  123. package/dist/search/reranker.js.map +1 -0
  124. package/dist/search/semantic.d.ts +1 -1
  125. package/dist/search/semantic.d.ts.map +1 -1
  126. package/dist/search/semantic.js +40 -45
  127. package/dist/search/semantic.js.map +1 -1
  128. package/dist/server-helpers.d.ts +29 -0
  129. package/dist/server-helpers.d.ts.map +1 -0
  130. package/dist/server-helpers.js +312 -0
  131. package/dist/server-helpers.js.map +1 -0
  132. package/dist/server.d.ts +1 -1
  133. package/dist/server.d.ts.map +1 -1
  134. package/dist/server.js +11 -271
  135. package/dist/server.js.map +1 -1
  136. package/dist/storage/_shared.d.ts +9 -0
  137. package/dist/storage/_shared.d.ts.map +1 -0
  138. package/dist/storage/_shared.js +26 -0
  139. package/dist/storage/_shared.js.map +1 -0
  140. package/dist/storage/chunk-store.d.ts.map +1 -1
  141. package/dist/storage/chunk-store.js +23 -63
  142. package/dist/storage/chunk-store.js.map +1 -1
  143. package/dist/storage/embedding-store.d.ts +6 -3
  144. package/dist/storage/embedding-store.d.ts.map +1 -1
  145. package/dist/storage/embedding-store.js +54 -30
  146. package/dist/storage/embedding-store.js.map +1 -1
  147. package/dist/storage/graph-store.d.ts +48 -0
  148. package/dist/storage/graph-store.d.ts.map +1 -0
  149. package/dist/storage/graph-store.js +52 -0
  150. package/dist/storage/graph-store.js.map +1 -0
  151. package/dist/storage/index-store.d.ts +5 -0
  152. package/dist/storage/index-store.d.ts.map +1 -1
  153. package/dist/storage/index-store.js +28 -16
  154. package/dist/storage/index-store.js.map +1 -1
  155. package/dist/storage/registry.d.ts +4 -0
  156. package/dist/storage/registry.d.ts.map +1 -1
  157. package/dist/storage/registry.js +16 -16
  158. package/dist/storage/registry.js.map +1 -1
  159. package/dist/storage/usage-stats.d.ts +6 -0
  160. package/dist/storage/usage-stats.d.ts.map +1 -1
  161. package/dist/storage/usage-stats.js +59 -11
  162. package/dist/storage/usage-stats.js.map +1 -1
  163. package/dist/storage/usage-tracker.d.ts +3 -0
  164. package/dist/storage/usage-tracker.d.ts.map +1 -1
  165. package/dist/storage/usage-tracker.js +50 -132
  166. package/dist/storage/usage-tracker.js.map +1 -1
  167. package/dist/storage/watcher.d.ts +2 -1
  168. package/dist/storage/watcher.d.ts.map +1 -1
  169. package/dist/storage/watcher.js +16 -16
  170. package/dist/storage/watcher.js.map +1 -1
  171. package/dist/tools/ast-query-tools.d.ts +29 -0
  172. package/dist/tools/ast-query-tools.d.ts.map +1 -0
  173. package/dist/tools/ast-query-tools.js +110 -0
  174. package/dist/tools/ast-query-tools.js.map +1 -0
  175. package/dist/tools/boundary-tools.d.ts +31 -0
  176. package/dist/tools/boundary-tools.d.ts.map +1 -0
  177. package/dist/tools/boundary-tools.js +62 -0
  178. package/dist/tools/boundary-tools.js.map +1 -0
  179. package/dist/tools/clone-tools.d.ts +35 -0
  180. package/dist/tools/clone-tools.d.ts.map +1 -0
  181. package/dist/tools/clone-tools.js +181 -0
  182. package/dist/tools/clone-tools.js.map +1 -0
  183. package/dist/tools/community-tools.d.ts +23 -0
  184. package/dist/tools/community-tools.d.ts.map +1 -0
  185. package/dist/tools/community-tools.js +297 -0
  186. package/dist/tools/community-tools.js.map +1 -0
  187. package/dist/tools/complexity-tools.d.ts +34 -0
  188. package/dist/tools/complexity-tools.d.ts.map +1 -0
  189. package/dist/tools/complexity-tools.js +135 -0
  190. package/dist/tools/complexity-tools.js.map +1 -0
  191. package/dist/tools/context-tools.d.ts +44 -3
  192. package/dist/tools/context-tools.d.ts.map +1 -1
  193. package/dist/tools/context-tools.js +329 -99
  194. package/dist/tools/context-tools.js.map +1 -1
  195. package/dist/tools/conversation-tools.d.ts +107 -0
  196. package/dist/tools/conversation-tools.d.ts.map +1 -0
  197. package/dist/tools/conversation-tools.js +419 -0
  198. package/dist/tools/conversation-tools.js.map +1 -0
  199. package/dist/tools/coordinator-tools.d.ts +73 -0
  200. package/dist/tools/coordinator-tools.d.ts.map +1 -0
  201. package/dist/tools/coordinator-tools.js +153 -0
  202. package/dist/tools/coordinator-tools.js.map +1 -0
  203. package/dist/tools/cross-repo-tools.d.ts +43 -0
  204. package/dist/tools/cross-repo-tools.d.ts.map +1 -0
  205. package/dist/tools/cross-repo-tools.js +55 -0
  206. package/dist/tools/cross-repo-tools.js.map +1 -0
  207. package/dist/tools/diff-tools.d.ts +4 -1
  208. package/dist/tools/diff-tools.d.ts.map +1 -1
  209. package/dist/tools/diff-tools.js +23 -5
  210. package/dist/tools/diff-tools.js.map +1 -1
  211. package/dist/tools/frequency-tools.d.ts +46 -0
  212. package/dist/tools/frequency-tools.d.ts.map +1 -0
  213. package/dist/tools/frequency-tools.js +184 -0
  214. package/dist/tools/frequency-tools.js.map +1 -0
  215. package/dist/tools/generate-tools.d.ts.map +1 -1
  216. package/dist/tools/generate-tools.js +13 -2
  217. package/dist/tools/generate-tools.js.map +1 -1
  218. package/dist/tools/graph-tools.d.ts +44 -11
  219. package/dist/tools/graph-tools.d.ts.map +1 -1
  220. package/dist/tools/graph-tools.js +147 -104
  221. package/dist/tools/graph-tools.js.map +1 -1
  222. package/dist/tools/hotspot-tools.d.ts +24 -0
  223. package/dist/tools/hotspot-tools.d.ts.map +1 -0
  224. package/dist/tools/hotspot-tools.js +122 -0
  225. package/dist/tools/hotspot-tools.js.map +1 -0
  226. package/dist/tools/impact-tools.d.ts +13 -0
  227. package/dist/tools/impact-tools.d.ts.map +1 -0
  228. package/dist/tools/impact-tools.js +238 -0
  229. package/dist/tools/impact-tools.js.map +1 -0
  230. package/dist/tools/index-tools.d.ts +44 -3
  231. package/dist/tools/index-tools.d.ts.map +1 -1
  232. package/dist/tools/index-tools.js +530 -222
  233. package/dist/tools/index-tools.js.map +1 -1
  234. package/dist/tools/memory-tools.d.ts +35 -0
  235. package/dist/tools/memory-tools.d.ts.map +1 -0
  236. package/dist/tools/memory-tools.js +229 -0
  237. package/dist/tools/memory-tools.js.map +1 -0
  238. package/dist/tools/outline-tools.d.ts +24 -13
  239. package/dist/tools/outline-tools.d.ts.map +1 -1
  240. package/dist/tools/outline-tools.js +113 -87
  241. package/dist/tools/outline-tools.js.map +1 -1
  242. package/dist/tools/pattern-tools.d.ts +32 -0
  243. package/dist/tools/pattern-tools.d.ts.map +1 -0
  244. package/dist/tools/pattern-tools.js +116 -0
  245. package/dist/tools/pattern-tools.js.map +1 -0
  246. package/dist/tools/report-tools.d.ts +5 -0
  247. package/dist/tools/report-tools.d.ts.map +1 -0
  248. package/dist/tools/report-tools.js +167 -0
  249. package/dist/tools/report-tools.js.map +1 -0
  250. package/dist/tools/review-diff-tools.d.ts +148 -0
  251. package/dist/tools/review-diff-tools.d.ts.map +1 -0
  252. package/dist/tools/review-diff-tools.js +852 -0
  253. package/dist/tools/review-diff-tools.js.map +1 -0
  254. package/dist/tools/route-tools.d.ts +32 -0
  255. package/dist/tools/route-tools.d.ts.map +1 -0
  256. package/dist/tools/route-tools.js +276 -0
  257. package/dist/tools/route-tools.js.map +1 -0
  258. package/dist/tools/search-ranker.d.ts +5 -0
  259. package/dist/tools/search-ranker.d.ts.map +1 -0
  260. package/dist/tools/search-ranker.js +142 -0
  261. package/dist/tools/search-ranker.js.map +1 -0
  262. package/dist/tools/search-tools.d.ts +24 -1
  263. package/dist/tools/search-tools.d.ts.map +1 -1
  264. package/dist/tools/search-tools.js +459 -225
  265. package/dist/tools/search-tools.js.map +1 -1
  266. package/dist/tools/secret-tools.d.ts +104 -0
  267. package/dist/tools/secret-tools.d.ts.map +1 -0
  268. package/dist/tools/secret-tools.js +410 -0
  269. package/dist/tools/secret-tools.js.map +1 -0
  270. package/dist/tools/symbol-tools.d.ts +90 -2
  271. package/dist/tools/symbol-tools.d.ts.map +1 -1
  272. package/dist/tools/symbol-tools.js +576 -42
  273. package/dist/tools/symbol-tools.js.map +1 -1
  274. package/dist/types.d.ts +34 -1
  275. package/dist/types.d.ts.map +1 -1
  276. package/dist/utils/framework-detect.d.ts +5 -0
  277. package/dist/utils/framework-detect.d.ts.map +1 -0
  278. package/dist/utils/framework-detect.js +36 -0
  279. package/dist/utils/framework-detect.js.map +1 -0
  280. package/dist/utils/glob.d.ts +19 -0
  281. package/dist/utils/glob.d.ts.map +1 -0
  282. package/dist/utils/glob.js +74 -0
  283. package/dist/utils/glob.js.map +1 -0
  284. package/dist/utils/import-graph.d.ts +29 -0
  285. package/dist/utils/import-graph.d.ts.map +1 -0
  286. package/dist/utils/import-graph.js +125 -0
  287. package/dist/utils/import-graph.js.map +1 -0
  288. package/dist/utils/test-file.d.ts.map +1 -1
  289. package/dist/utils/test-file.js +1 -0
  290. package/dist/utils/test-file.js.map +1 -1
  291. package/dist/utils/walk.d.ts +45 -0
  292. package/dist/utils/walk.d.ts.map +1 -0
  293. package/dist/utils/walk.js +87 -0
  294. package/dist/utils/walk.js.map +1 -0
  295. package/package.json +10 -4
  296. package/rules/codesift.md +187 -0
  297. package/rules/codesift.mdc +192 -0
  298. package/rules/codex.md +187 -0
  299. package/rules/gemini.md +187 -0
package/dist/server.js CHANGED
@@ -1,282 +1,22 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
- import { z } from "zod";
4
3
  import { loadConfig } from "./config.js";
5
- import { indexFolder, indexRepo, listAllRepos, invalidateCache } from "./tools/index-tools.js";
6
- import { searchSymbols, searchText } from "./tools/search-tools.js";
7
- import { getFileTree, getFileOutline, getRepoOutline } from "./tools/outline-tools.js";
8
- import { getSymbol, getSymbols, findAndShow, findReferences } from "./tools/symbol-tools.js";
9
- import { traceCallChain, impactAnalysis } from "./tools/graph-tools.js";
10
- import { assembleContext, getKnowledgeMap } from "./tools/context-tools.js";
11
- import { diffOutline, changedSymbols } from "./tools/diff-tools.js";
12
- import { generateClaudeMd } from "./tools/generate-tools.js";
13
- import { codebaseRetrieval } from "./retrieval/codebase-retrieval.js";
14
- import { trackToolCall } from "./storage/usage-tracker.js";
15
- import { getUsageStats, formatUsageReport } from "./storage/usage-stats.js";
16
- // ---------------------------------------------------------------------------
17
- // Helpers
18
- // ---------------------------------------------------------------------------
19
- function errorResult(message) {
20
- return {
21
- content: [
22
- { type: "text", text: JSON.stringify({ error: message }) },
23
- ],
24
- isError: true,
25
- };
26
- }
27
- function wrapTool(toolName, args, fn) {
28
- return async () => {
29
- const start = performance.now();
30
- try {
31
- const data = await fn();
32
- const text = JSON.stringify(data, null, 2);
33
- const elapsed = performance.now() - start;
34
- trackToolCall(toolName, args, text, data, elapsed);
35
- return { content: [{ type: "text", text }] };
36
- }
37
- catch (err) {
38
- const elapsed = performance.now() - start;
39
- const message = err instanceof Error ? err.message : String(err);
40
- trackToolCall(toolName, args, message, { error: message }, elapsed);
41
- return errorResult(message);
42
- }
43
- };
44
- }
45
- // ---------------------------------------------------------------------------
46
- // Server setup
47
- // ---------------------------------------------------------------------------
4
+ import { registerTools } from "./register-tools.js";
5
+ import { autoDiscoverConversations } from "./tools/conversation-tools.js";
6
+ import { CODESIFT_INSTRUCTIONS } from "./instructions.js";
7
+ // Re-export for test compatibility
8
+ export { buildResponseHint, resetSessionState } from "./server-helpers.js";
48
9
  loadConfig();
49
- const server = new McpServer({
50
- name: "codesift-mcp",
51
- version: "0.1.0",
52
- });
53
- // ---------------------------------------------------------------------------
54
- // 1. index_folder
55
- // ---------------------------------------------------------------------------
56
- server.tool("index_folder", "Index a local folder, extracting symbols and building the search index", {
57
- path: z.string().describe("Absolute path to the folder to index"),
58
- incremental: z.boolean().optional().describe("Only re-index changed files"),
59
- include_paths: z.array(z.string()).optional().describe("Glob patterns to include"),
60
- }, async (args) => wrapTool("index_folder", args, () => indexFolder(args.path, {
61
- incremental: args.incremental,
62
- include_paths: args.include_paths,
63
- }))());
64
- // ---------------------------------------------------------------------------
65
- // 2. index_repo
66
- // ---------------------------------------------------------------------------
67
- server.tool("index_repo", "Clone and index a remote git repository", {
68
- url: z.string().describe("Git clone URL"),
69
- branch: z.string().optional().describe("Branch to checkout"),
70
- include_paths: z.array(z.string()).optional().describe("Glob patterns to include"),
71
- }, async (args) => wrapTool("index_repo", args, () => indexRepo(args.url, {
72
- branch: args.branch,
73
- include_paths: args.include_paths,
74
- }))());
75
- // ---------------------------------------------------------------------------
76
- // 3. list_repos
77
- // ---------------------------------------------------------------------------
78
- server.tool("list_repos", "List all indexed repositories with metadata", {}, async () => wrapTool("list_repos", {}, () => listAllRepos())());
79
- // ---------------------------------------------------------------------------
80
- // 4. invalidate_cache
81
- // ---------------------------------------------------------------------------
82
- server.tool("invalidate_cache", "Clear the index cache for a repository, forcing full re-index on next use", {
83
- repo: z.string().describe("Repository identifier (e.g. local/my-project)"),
84
- }, async (args) => wrapTool("invalidate_cache", args, () => invalidateCache(args.repo))());
85
- // ---------------------------------------------------------------------------
86
- // 5. search_symbols
87
- // ---------------------------------------------------------------------------
88
- server.tool("search_symbols", "Search for code symbols (functions, classes, types) by name or signature", {
89
- repo: z.string().describe("Repository identifier"),
90
- query: z.string().describe("Search query string"),
91
- kind: z.string().optional().describe("Filter by symbol kind (function, class, etc.)"),
92
- file_pattern: z.string().optional().describe("Glob pattern to filter files"),
93
- include_source: z.boolean().optional().describe("Include full source code of each symbol"),
94
- top_k: z.number().optional().describe("Maximum number of results to return (default 50)"),
95
- source_chars: z.number().optional().describe("Truncate each symbol's source to N characters (reduces output size)"),
96
- }, async (args) => wrapTool("search_symbols", args, () => searchSymbols(args.repo, args.query, {
97
- kind: args.kind,
98
- file_pattern: args.file_pattern,
99
- include_source: args.include_source,
100
- top_k: args.top_k,
101
- source_chars: args.source_chars,
102
- }))());
103
- // ---------------------------------------------------------------------------
104
- // 6. search_text
105
- // ---------------------------------------------------------------------------
106
- server.tool("search_text", "Full-text search across all files in a repository", {
107
- repo: z.string().describe("Repository identifier"),
108
- query: z.string().describe("Search query or regex pattern"),
109
- regex: z.boolean().optional().describe("Treat query as a regex pattern"),
110
- context_lines: z.number().optional().describe("Number of context lines around each match"),
111
- file_pattern: z.string().optional().describe("Glob pattern to filter files"),
112
- max_results: z.number().optional().describe("Maximum number of matching lines to return (default 500)"),
113
- }, async (args) => wrapTool("search_text", args, () => searchText(args.repo, args.query, {
114
- regex: args.regex,
115
- context_lines: args.context_lines,
116
- file_pattern: args.file_pattern,
117
- max_results: args.max_results,
118
- }))());
119
- // ---------------------------------------------------------------------------
120
- // 7. get_file_tree
121
- // ---------------------------------------------------------------------------
122
- server.tool("get_file_tree", "Get the file tree of a repository with symbol counts per file. Use compact=true for a flat list of paths (10-50x less output).", {
123
- repo: z.string().describe("Repository identifier"),
124
- path_prefix: z.string().optional().describe("Filter to a subtree by path prefix"),
125
- name_pattern: z.string().optional().describe("Glob pattern to filter file names"),
126
- depth: z.number().optional().describe("Maximum directory depth to traverse"),
127
- compact: z.boolean().optional().describe("Return flat list of {path, symbols} instead of nested tree (much less output)"),
128
- min_symbols: z.number().optional().describe("Only include files with at least this many symbols"),
129
- }, async (args) => wrapTool("get_file_tree", args, () => getFileTree(args.repo, {
130
- path_prefix: args.path_prefix,
131
- name_pattern: args.name_pattern,
132
- depth: args.depth,
133
- compact: args.compact,
134
- min_symbols: args.min_symbols,
135
- }))());
136
- // ---------------------------------------------------------------------------
137
- // 8. get_file_outline
138
- // ---------------------------------------------------------------------------
139
- server.tool("get_file_outline", "Get the symbol outline of a single file (functions, classes, exports)", {
140
- repo: z.string().describe("Repository identifier"),
141
- file_path: z.string().describe("Relative file path within the repository"),
142
- }, async (args) => wrapTool("get_file_outline", args, () => getFileOutline(args.repo, args.file_path))());
143
- // ---------------------------------------------------------------------------
144
- // 9. get_repo_outline
145
- // ---------------------------------------------------------------------------
146
- server.tool("get_repo_outline", "Get a high-level outline of the entire repository grouped by directory", {
147
- repo: z.string().describe("Repository identifier"),
148
- }, async (args) => wrapTool("get_repo_outline", args, () => getRepoOutline(args.repo))());
149
- // ---------------------------------------------------------------------------
150
- // 10. get_symbol
151
- // ---------------------------------------------------------------------------
152
- server.tool("get_symbol", "Retrieve a single symbol by its unique ID with full source code", {
153
- repo: z.string().describe("Repository identifier"),
154
- symbol_id: z.string().describe("Unique symbol identifier"),
155
- }, async (args) => wrapTool("get_symbol", args, () => getSymbol(args.repo, args.symbol_id))());
156
- // ---------------------------------------------------------------------------
157
- // 11. get_symbols
158
- // ---------------------------------------------------------------------------
159
- server.tool("get_symbols", "Retrieve multiple symbols by ID in a single batch call", {
160
- repo: z.string().describe("Repository identifier"),
161
- symbol_ids: z.array(z.string()).describe("Array of symbol identifiers"),
162
- }, async (args) => wrapTool("get_symbols", args, () => getSymbols(args.repo, args.symbol_ids))());
163
- // ---------------------------------------------------------------------------
164
- // 12. find_and_show
165
- // ---------------------------------------------------------------------------
166
- server.tool("find_and_show", "Find a symbol by name and show its source, optionally including references", {
167
- repo: z.string().describe("Repository identifier"),
168
- query: z.string().describe("Symbol name or query to search for"),
169
- include_refs: z.boolean().optional().describe("Include locations that reference this symbol"),
170
- }, async (args) => wrapTool("find_and_show", args, () => findAndShow(args.repo, args.query, args.include_refs))());
171
- // ---------------------------------------------------------------------------
172
- // 13. find_references
173
- // ---------------------------------------------------------------------------
174
- server.tool("find_references", "Find all references to a symbol across the codebase", {
175
- repo: z.string().describe("Repository identifier"),
176
- symbol_name: z.string().describe("Name of the symbol to find references for"),
177
- file_pattern: z.string().optional().describe("Glob pattern to filter files"),
178
- }, async (args) => wrapTool("find_references", args, () => findReferences(args.repo, args.symbol_name, args.file_pattern))());
179
- // ---------------------------------------------------------------------------
180
- // 14. trace_call_chain
181
- // ---------------------------------------------------------------------------
182
- server.tool("trace_call_chain", "Trace the call chain of a symbol — who calls it (callers) or what it calls (callees). Source code is excluded by default for compact output; set include_source=true to include it.", {
183
- repo: z.string().describe("Repository identifier"),
184
- symbol_name: z.string().describe("Name of the symbol to trace"),
185
- direction: z.enum(["callers", "callees"]).describe("Trace direction"),
186
- depth: z.number().optional().describe("Maximum depth to traverse the call graph (default: 1)"),
187
- include_source: z.boolean().optional().describe("Include full source code of each symbol (default: false)"),
188
- include_tests: z.boolean().optional().describe("Include test files in trace results (default: false)"),
189
- }, async (args) => wrapTool("trace_call_chain", args, () => traceCallChain(args.repo, args.symbol_name, args.direction, {
190
- depth: args.depth,
191
- include_source: args.include_source,
192
- include_tests: args.include_tests,
193
- }))());
194
- // ---------------------------------------------------------------------------
195
- // 15. impact_analysis
196
- // ---------------------------------------------------------------------------
197
- server.tool("impact_analysis", "Analyze the blast radius of recent git changes — which symbols and files are affected. Source code is excluded by default for compact output.", {
198
- repo: z.string().describe("Repository identifier"),
199
- since: z.string().describe("Git ref to compare from (e.g. HEAD~3, commit SHA, branch)"),
200
- depth: z.number().optional().describe("Depth of dependency traversal"),
201
- until: z.string().optional().describe("Git ref to compare to (defaults to HEAD)"),
202
- include_source: z.boolean().optional().describe("Include full source code of affected symbols (default: false)"),
203
- }, async (args) => wrapTool("impact_analysis", args, () => impactAnalysis(args.repo, args.since, {
204
- depth: args.depth,
205
- until: args.until,
206
- include_source: args.include_source,
207
- }))());
208
- // ---------------------------------------------------------------------------
209
- // 16. assemble_context
210
- // ---------------------------------------------------------------------------
211
- server.tool("assemble_context", "Assemble a focused code context for a query within a token budget", {
212
- repo: z.string().describe("Repository identifier"),
213
- query: z.string().describe("Natural language query describing what context is needed"),
214
- token_budget: z.number().optional().describe("Maximum tokens for the assembled context"),
215
- }, async (args) => wrapTool("assemble_context", args, () => assembleContext(args.repo, args.query, args.token_budget))());
216
- // ---------------------------------------------------------------------------
217
- // 17. get_knowledge_map
218
- // ---------------------------------------------------------------------------
219
- server.tool("get_knowledge_map", "Get the module dependency map showing how files and directories relate", {
220
- repo: z.string().describe("Repository identifier"),
221
- focus: z.string().optional().describe("Focus on a specific module or directory"),
222
- depth: z.number().optional().describe("Maximum depth of the dependency graph"),
223
- }, async (args) => wrapTool("get_knowledge_map", args, () => getKnowledgeMap(args.repo, args.focus, args.depth))());
224
- // ---------------------------------------------------------------------------
225
- // 18. diff_outline
226
- // ---------------------------------------------------------------------------
227
- server.tool("diff_outline", "Get a structural outline of what changed between two git refs", {
228
- repo: z.string().describe("Repository identifier"),
229
- since: z.string().describe("Git ref to compare from"),
230
- until: z.string().optional().describe("Git ref to compare to (defaults to HEAD)"),
231
- }, async (args) => wrapTool("diff_outline", args, () => diffOutline(args.repo, args.since, args.until))());
232
- // ---------------------------------------------------------------------------
233
- // 19. changed_symbols
234
- // ---------------------------------------------------------------------------
235
- server.tool("changed_symbols", "List symbols that were added, modified, or removed between two git refs", {
236
- repo: z.string().describe("Repository identifier"),
237
- since: z.string().describe("Git ref to compare from"),
238
- until: z.string().optional().describe("Git ref to compare to (defaults to HEAD)"),
239
- }, async (args) => wrapTool("changed_symbols", args, () => changedSymbols(args.repo, args.since, args.until))());
240
- // ---------------------------------------------------------------------------
241
- // 20. generate_claude_md
242
- // ---------------------------------------------------------------------------
243
- server.tool("generate_claude_md", "Generate a CLAUDE.md project summary file from the repository index", {
244
- repo: z.string().describe("Repository identifier"),
245
- output_path: z.string().optional().describe("Custom output file path"),
246
- }, async (args) => wrapTool("generate_claude_md", args, () => generateClaudeMd(args.repo, args.output_path))());
247
- // ---------------------------------------------------------------------------
248
- // 21. codebase_retrieval
249
- // ---------------------------------------------------------------------------
250
- server.tool("codebase_retrieval", "Batch multiple search and retrieval queries into a single call with shared token budget. Semantic and hybrid sub-queries exclude test files by default (set exclude_tests:false to include them).", {
251
- repo: z.string().describe("Repository identifier"),
252
- queries: z
253
- .array(z.object({ type: z.string() }).passthrough())
254
- .describe("Array of sub-queries (symbols, text, file_tree, outline, references, call_chain, impact, context, knowledge_map)"),
255
- token_budget: z.number().optional().describe("Maximum total tokens across all sub-query results"),
256
- }, async (args) => wrapTool("codebase_retrieval", args, () => codebaseRetrieval(args.repo, args.queries, args.token_budget))());
257
- // ---------------------------------------------------------------------------
258
- // 22. usage_stats
259
- // ---------------------------------------------------------------------------
260
- server.tool("usage_stats", "Show usage statistics for all CodeSift tool calls (call counts, tokens, timing, repos)", {}, async () => {
261
- try {
262
- const stats = await getUsageStats();
263
- const report = formatUsageReport(stats);
264
- return {
265
- content: [{ type: "text", text: report }],
266
- };
267
- }
268
- catch (err) {
269
- const message = err instanceof Error ? err.message : String(err);
270
- return errorResult(message);
271
- }
272
- });
273
- // ---------------------------------------------------------------------------
274
- // Main
275
- // ---------------------------------------------------------------------------
10
+ const server = new McpServer({ name: "codesift-mcp", version: "0.1.0" }, { instructions: CODESIFT_INSTRUCTIONS });
11
+ registerTools(server, { deferNonCore: true });
276
12
  async function main() {
277
13
  const transport = new StdioServerTransport();
278
14
  await server.connect(transport);
279
15
  console.error("CodeSift MCP server started");
16
+ // Auto-discover conversations for current project (background, non-blocking)
17
+ autoDiscoverConversations(process.cwd()).catch((err) => {
18
+ console.error("[codesift] conversation auto-discovery failed:", err);
19
+ });
280
20
  }
281
21
  main().catch((err) => {
282
22
  console.error("Fatal error starting CodeSift MCP server:", err);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,mCAAmC;AACnC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE3E,UAAU,EAAE,CAAC;AAEb,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,EAC1C,EAAE,YAAY,EAAE,qBAAqB,EAAE,CACxC,CAAC;AAEF,aAAa,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAE7C,6EAA6E;IAC7E,yBAAyB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAC9D,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Write content to a file atomically using a write-rename strategy.
3
+ * 1. Ensures the parent directory exists (mkdir -p).
4
+ * 2. Writes content to a temporary file adjacent to the target.
5
+ * 3. Renames the temp file to the target path (atomic on most filesystems).
6
+ * 4. On error, removes the temp file before re-throwing.
7
+ */
8
+ export declare function atomicWriteFile(targetPath: string, content: string): Promise<void>;
9
+ //# sourceMappingURL=_shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../src/storage/_shared.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -0,0 +1,26 @@
1
+ import { writeFile, rename, mkdir, unlink } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ /**
4
+ * Write content to a file atomically using a write-rename strategy.
5
+ * 1. Ensures the parent directory exists (mkdir -p).
6
+ * 2. Writes content to a temporary file adjacent to the target.
7
+ * 3. Renames the temp file to the target path (atomic on most filesystems).
8
+ * 4. On error, removes the temp file before re-throwing.
9
+ */
10
+ export async function atomicWriteFile(targetPath, content) {
11
+ const dir = dirname(targetPath);
12
+ await mkdir(dir, { recursive: true });
13
+ const tmpPath = `${targetPath}.tmp.${Date.now()}`;
14
+ try {
15
+ await writeFile(tmpPath, content, "utf-8");
16
+ await rename(tmpPath, targetPath);
17
+ }
18
+ catch (err) {
19
+ try {
20
+ await unlink(tmpPath);
21
+ }
22
+ catch { /* cleanup best-effort */ }
23
+ throw err;
24
+ }
25
+ }
26
+ //# sourceMappingURL=_shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../src/storage/_shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,OAAe;IAEf,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,GAAG,UAAU,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-store.d.ts","sourceRoot":"","sources":["../../src/storage/chunk-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AA4BD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAuBxC;AAWD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,CA4B3C"}
1
+ {"version":3,"file":"chunk-store.d.ts","sourceRoot":"","sources":["../../src/storage/chunk-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AA4BD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAcf;AAiCD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAMxC;AAWD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAQf;AAQD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,CAM3C"}
@@ -1,5 +1,5 @@
1
- import { readFile, writeFile, rename, mkdir, unlink } from "node:fs/promises";
2
- import { dirname } from "node:path";
1
+ import { readFile } from "node:fs/promises";
2
+ import { atomicWriteFile } from "./_shared.js";
3
3
  // ---------------------------------------------------------------------------
4
4
  // Path helpers
5
5
  // ---------------------------------------------------------------------------
@@ -33,8 +33,6 @@ function isChunkLine(value) {
33
33
  * File: ~/.codesift/{hash}.chunks.ndjson
34
34
  */
35
35
  export async function saveChunks(chunkPath, chunks) {
36
- const dir = dirname(chunkPath);
37
- await mkdir(dir, { recursive: true });
38
36
  const lines = chunks.map((c) => JSON.stringify({
39
37
  id: c.id,
40
38
  file: c.file,
@@ -43,27 +41,13 @@ export async function saveChunks(chunkPath, chunks) {
43
41
  text: c.text,
44
42
  tokenCount: c.tokenCount,
45
43
  }));
46
- const tmpPath = `${chunkPath}.tmp.${Date.now()}`;
47
44
  const data = lines.join("\n") + "\n";
48
- try {
49
- await writeFile(tmpPath, data, "utf-8");
50
- await rename(tmpPath, chunkPath);
51
- }
52
- catch (err) {
53
- try {
54
- await unlink(tmpPath);
55
- }
56
- catch { /* cleanup best-effort */ }
57
- throw err;
58
- }
45
+ await atomicWriteFile(chunkPath, data);
59
46
  }
60
- /**
61
- * Load all chunks from an ndjson file.
62
- * Returns a Map of chunkId → CodeChunk, or null if file not found.
63
- */
64
- export async function loadChunks(chunkPath) {
47
+ /** Generic NDJSON loader — reads file, parses each line, filters with a type guard, maps to value. */
48
+ async function loadNdjsonMap(filePath, guard, toEntry) {
65
49
  try {
66
- const raw = await readFile(chunkPath, "utf-8");
50
+ const raw = await readFile(filePath, "utf-8");
67
51
  const map = new Map();
68
52
  for (const line of raw.split("\n")) {
69
53
  const trimmed = line.trim();
@@ -71,8 +55,9 @@ export async function loadChunks(chunkPath) {
71
55
  continue;
72
56
  try {
73
57
  const parsed = JSON.parse(trimmed);
74
- if (isChunkLine(parsed)) {
75
- map.set(parsed.id, parsed);
58
+ if (guard(parsed)) {
59
+ const [key, value] = toEntry(parsed);
60
+ map.set(key, value);
76
61
  }
77
62
  }
78
63
  catch {
@@ -85,60 +70,35 @@ export async function loadChunks(chunkPath) {
85
70
  return null;
86
71
  }
87
72
  }
73
+ /**
74
+ * Load all chunks from an ndjson file.
75
+ * Returns a Map of chunkId → CodeChunk, or null if file not found.
76
+ */
77
+ export async function loadChunks(chunkPath) {
78
+ return loadNdjsonMap(chunkPath, isChunkLine, (parsed) => [parsed.id, parsed]);
79
+ }
88
80
  /**
89
81
  * Save all chunk embeddings atomically as ndjson.
90
82
  * File: ~/.codesift/{hash}.chunk-embeddings.ndjson
91
83
  */
92
84
  export async function saveChunkEmbeddings(embeddingPath, embeddings) {
93
- const dir = dirname(embeddingPath);
94
- await mkdir(dir, { recursive: true });
95
85
  const lines = [];
96
86
  for (const [id, vec] of embeddings) {
97
87
  lines.push(JSON.stringify({ id, vec: Array.from(vec) }));
98
88
  }
99
- const tmpPath = `${embeddingPath}.tmp.${Date.now()}`;
100
89
  const data = lines.join("\n") + "\n";
101
- try {
102
- await writeFile(tmpPath, data, "utf-8");
103
- await rename(tmpPath, embeddingPath);
104
- }
105
- catch (err) {
106
- try {
107
- await unlink(tmpPath);
108
- }
109
- catch { /* cleanup best-effort */ }
110
- throw err;
111
- }
90
+ await atomicWriteFile(embeddingPath, data);
91
+ }
92
+ function isChunkEmbeddingLine(parsed) {
93
+ return typeof parsed === "object" && parsed !== null &&
94
+ typeof parsed["id"] === "string" &&
95
+ Array.isArray(parsed["vec"]);
112
96
  }
113
97
  /**
114
98
  * Load all chunk embeddings from an ndjson file.
115
99
  * Returns a Map of chunkId → Float32Array, or null if file not found / empty.
116
100
  */
117
101
  export async function loadChunkEmbeddings(embeddingPath) {
118
- try {
119
- const raw = await readFile(embeddingPath, "utf-8");
120
- const map = new Map();
121
- for (const line of raw.split("\n")) {
122
- const trimmed = line.trim();
123
- if (!trimmed)
124
- continue;
125
- try {
126
- const parsed = JSON.parse(trimmed);
127
- if (typeof parsed === "object" && parsed !== null &&
128
- typeof parsed["id"] === "string" &&
129
- Array.isArray(parsed["vec"])) {
130
- const entry = parsed;
131
- map.set(entry.id, new Float32Array(entry.vec));
132
- }
133
- }
134
- catch {
135
- // Skip malformed lines
136
- }
137
- }
138
- return map.size > 0 ? map : null;
139
- }
140
- catch {
141
- return null;
142
- }
102
+ return loadNdjsonMap(embeddingPath, isChunkEmbeddingLine, (parsed) => [parsed.id, new Float32Array(parsed.vec)]);
143
103
  }
144
104
  //# sourceMappingURL=chunk-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-store.js","sourceRoot":"","sources":["../../src/storage/chunk-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chunk-store.js","sourceRoot":"","sources":["../../src/storage/chunk-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,0BAA0B,CAAC,CAAC;AACzE,CAAC;AAeD,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,QAAQ;QAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ;QAC/B,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,QAAQ;QACpC,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ;QAClC,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ;QAC/B,OAAO,GAAG,CAAC,YAAY,CAAC,KAAK,QAAQ,CACtC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAAiB,EACjB,MAAmB;IAEnB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,IAAI,CAAC,SAAS,CAAC;QACb,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,UAAU,EAAE,CAAC,CAAC,UAAU;KACL,CAAC,CACvB,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,sGAAsG;AACtG,KAAK,UAAU,aAAa,CAC1B,QAAgB,EAChB,KAAmC,EACnC,OAAoC;IAEpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAQ,CAAC;QAE5B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;oBAClB,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;oBACrC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAAiB;IAEjB,OAAO,aAAa,CAClB,SAAS,EACT,WAAW,EACX,CAAC,MAAM,EAAE,EAAE,CAAC,CAAE,MAAoB,CAAC,EAAE,EAAE,MAAmB,CAAC,CAC5D,CAAC;AACJ,CAAC;AAWD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,aAAqB,EACrB,UAAqC;IAErC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAA+B,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAe;IAC3C,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAClD,OAAQ,MAAkC,CAAC,IAAI,CAAC,KAAK,QAAQ;QAC7D,KAAK,CAAC,OAAO,CAAE,MAAkC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,aAAqB;IAErB,OAAO,aAAa,CAClB,aAAa,EACb,oBAAoB,EACpB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAE,MAA6B,CAAC,EAAE,EAAE,IAAI,YAAY,CAAE,MAA6B,CAAC,GAAG,CAAC,CAAC,CACtG,CAAC;AACJ,CAAC"}
@@ -15,7 +15,8 @@ export declare function getEmbeddingMetaPath(indexPath: string): string;
15
15
  */
16
16
  export declare function loadEmbeddings(embeddingPath: string): Promise<Map<string, Float32Array>>;
17
17
  /**
18
- * Save all embeddings atomically to an ndjson file.
18
+ * Save all embeddings to an ndjson file using streaming writes.
19
+ * Avoids building a single huge string (30K+ symbols × 1536 floats = >300MB).
19
20
  */
20
21
  export declare function saveEmbeddings(embeddingPath: string, embeddings: Map<string, Float32Array>): Promise<void>;
21
22
  /**
@@ -29,13 +30,15 @@ export declare function saveEmbeddingMeta(metaPath: string, meta: EmbeddingMeta)
29
30
  export declare function loadEmbeddingMeta(metaPath: string): Promise<EmbeddingMeta | null>;
30
31
  /**
31
32
  * Batch-embed symbols using the given provider, appending to existing embeddings.
32
- * Only embeds symbols that don't already have an embedding.
33
+ * Skips symbols whose ID exists AND content hash hasn't changed.
34
+ * Re-embeds symbols whose content changed even if ID is the same.
33
35
  *
34
36
  * @param symbolTexts - Map of symbolId → text to embed
35
37
  * @param existing - Existing embeddings to skip
36
38
  * @param embedFn - The provider's embed function
37
39
  * @param batchSize - How many texts per API call
40
+ * @param cacheKey - Optional key to track content hashes across calls
38
41
  * @returns Map of symbolId → Float32Array (existing + new)
39
42
  */
40
- export declare function batchEmbed(symbolTexts: Map<string, string>, existing: Map<string, Float32Array>, embedFn: (texts: string[]) => Promise<number[][]>, batchSize: number): Promise<Map<string, Float32Array>>;
43
+ export declare function batchEmbed(symbolTexts: Map<string, string>, existing: Map<string, Float32Array>, embedFn: (texts: string[]) => Promise<number[][]>, batchSize: number, cacheKey?: string): Promise<Map<string, Float32Array>>;
41
44
  //# sourceMappingURL=embedding-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"embedding-store.d.ts","sourceRoot":"","sources":["../../src/storage/embedding-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9D;AAOD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CA0BpC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAgB/B;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACnC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EACjD,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAkCpC"}
1
+ {"version":3,"file":"embedding-store.d.ts","sourceRoot":"","sources":["../../src/storage/embedding-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9D;AAOD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CA0BpC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAgB/B;AAeD;;;;;;;;;;;GAWG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACnC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EACjD,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CA2CpC"}