codesift-mcp 0.1.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.
- package/LICENSE +21 -0
- package/README.md +241 -0
- package/dist/cli/args.d.ts +13 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +79 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands.d.ts +4 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +336 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +271 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -0
- package/dist/parser/extractors/go.d.ts +4 -0
- package/dist/parser/extractors/go.d.ts.map +1 -0
- package/dist/parser/extractors/go.js +185 -0
- package/dist/parser/extractors/go.js.map +1 -0
- package/dist/parser/extractors/javascript.d.ts +9 -0
- package/dist/parser/extractors/javascript.d.ts.map +1 -0
- package/dist/parser/extractors/javascript.js +10 -0
- package/dist/parser/extractors/javascript.js.map +1 -0
- package/dist/parser/extractors/markdown.d.ts +15 -0
- package/dist/parser/extractors/markdown.d.ts.map +1 -0
- package/dist/parser/extractors/markdown.js +217 -0
- package/dist/parser/extractors/markdown.js.map +1 -0
- package/dist/parser/extractors/prisma.d.ts +17 -0
- package/dist/parser/extractors/prisma.d.ts.map +1 -0
- package/dist/parser/extractors/prisma.js +121 -0
- package/dist/parser/extractors/prisma.js.map +1 -0
- package/dist/parser/extractors/python.d.ts +4 -0
- package/dist/parser/extractors/python.d.ts.map +1 -0
- package/dist/parser/extractors/python.js +203 -0
- package/dist/parser/extractors/python.js.map +1 -0
- package/dist/parser/extractors/rust.d.ts +4 -0
- package/dist/parser/extractors/rust.d.ts.map +1 -0
- package/dist/parser/extractors/rust.js +178 -0
- package/dist/parser/extractors/rust.js.map +1 -0
- package/dist/parser/extractors/typescript.d.ts +4 -0
- package/dist/parser/extractors/typescript.d.ts.map +1 -0
- package/dist/parser/extractors/typescript.js +296 -0
- package/dist/parser/extractors/typescript.js.map +1 -0
- package/dist/parser/languages/tree-sitter-css.wasm +0 -0
- package/dist/parser/languages/tree-sitter-go.wasm +0 -0
- package/dist/parser/languages/tree-sitter-java.wasm +0 -0
- package/dist/parser/languages/tree-sitter-javascript.wasm +0 -0
- package/dist/parser/languages/tree-sitter-json.wasm +0 -0
- package/dist/parser/languages/tree-sitter-php.wasm +0 -0
- package/dist/parser/languages/tree-sitter-python.wasm +0 -0
- package/dist/parser/languages/tree-sitter-ruby.wasm +0 -0
- package/dist/parser/languages/tree-sitter-rust.wasm +0 -0
- package/dist/parser/languages/tree-sitter-tsx.wasm +0 -0
- package/dist/parser/languages/tree-sitter-typescript.wasm +0 -0
- package/dist/parser/parser-manager.d.ts +6 -0
- package/dist/parser/parser-manager.d.ts.map +1 -0
- package/dist/parser/parser-manager.js +60 -0
- package/dist/parser/parser-manager.js.map +1 -0
- package/dist/parser/symbol-extractor.d.ts +22 -0
- package/dist/parser/symbol-extractor.d.ts.map +1 -0
- package/dist/parser/symbol-extractor.js +115 -0
- package/dist/parser/symbol-extractor.js.map +1 -0
- package/dist/retrieval/codebase-retrieval.d.ts +27 -0
- package/dist/retrieval/codebase-retrieval.d.ts.map +1 -0
- package/dist/retrieval/codebase-retrieval.js +472 -0
- package/dist/retrieval/codebase-retrieval.js.map +1 -0
- package/dist/search/bm25.d.ts +22 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +179 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/chunker.d.ts +9 -0
- package/dist/search/chunker.d.ts.map +1 -0
- package/dist/search/chunker.js +91 -0
- package/dist/search/chunker.js.map +1 -0
- package/dist/search/hybrid.d.ts +16 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +51 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/semantic.d.ts +44 -0
- package/dist/search/semantic.d.ts.map +1 -0
- package/dist/search/semantic.js +194 -0
- package/dist/search/semantic.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +285 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/chunk-store.d.ts +32 -0
- package/dist/storage/chunk-store.d.ts.map +1 -0
- package/dist/storage/chunk-store.js +144 -0
- package/dist/storage/chunk-store.js.map +1 -0
- package/dist/storage/embedding-store.d.ts +41 -0
- package/dist/storage/embedding-store.d.ts.map +1 -0
- package/dist/storage/embedding-store.js +149 -0
- package/dist/storage/embedding-store.js.map +1 -0
- package/dist/storage/index-store.d.ts +23 -0
- package/dist/storage/index-store.d.ts.map +1 -0
- package/dist/storage/index-store.js +95 -0
- package/dist/storage/index-store.js.map +1 -0
- package/dist/storage/registry.d.ts +35 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +99 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/usage-stats.d.ts +32 -0
- package/dist/storage/usage-stats.d.ts.map +1 -0
- package/dist/storage/usage-stats.js +180 -0
- package/dist/storage/usage-stats.js.map +1 -0
- package/dist/storage/usage-tracker.d.ts +35 -0
- package/dist/storage/usage-tracker.d.ts.map +1 -0
- package/dist/storage/usage-tracker.js +245 -0
- package/dist/storage/usage-tracker.js.map +1 -0
- package/dist/storage/watcher.d.ts +12 -0
- package/dist/storage/watcher.d.ts.map +1 -0
- package/dist/storage/watcher.js +66 -0
- package/dist/storage/watcher.js.map +1 -0
- package/dist/tools/context-tools.d.ts +31 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +219 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/diff-tools.d.ts +22 -0
- package/dist/tools/diff-tools.d.ts.map +1 -0
- package/dist/tools/diff-tools.js +165 -0
- package/dist/tools/diff-tools.js.map +1 -0
- package/dist/tools/generate-tools.d.ts +11 -0
- package/dist/tools/generate-tools.d.ts.map +1 -0
- package/dist/tools/generate-tools.js +135 -0
- package/dist/tools/generate-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +60 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +313 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/index-tools.d.ts +39 -0
- package/dist/tools/index-tools.d.ts.map +1 -0
- package/dist/tools/index-tools.js +451 -0
- package/dist/tools/index-tools.js.map +1 -0
- package/dist/tools/outline-tools.d.ts +59 -0
- package/dist/tools/outline-tools.d.ts.map +1 -0
- package/dist/tools/outline-tools.js +342 -0
- package/dist/tools/outline-tools.js.map +1 -0
- package/dist/tools/search-tools.d.ts +29 -0
- package/dist/tools/search-tools.d.ts.map +1 -0
- package/dist/tools/search-tools.js +309 -0
- package/dist/tools/search-tools.js.map +1 -0
- package/dist/tools/symbol-tools.d.ts +24 -0
- package/dist/tools/symbol-tools.d.ts.map +1 -0
- package/dist/tools/symbol-tools.js +172 -0
- package/dist/tools/symbol-tools.js.map +1 -0
- package/dist/types.d.ts +91 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git-validation.d.ts +11 -0
- package/dist/utils/git-validation.d.ts.map +1 -0
- package/dist/utils/git-validation.js +19 -0
- package/dist/utils/git-validation.js.map +1 -0
- package/dist/utils/test-file.d.ts +11 -0
- package/dist/utils/test-file.d.ts.map +1 -0
- package/dist/utils/test-file.js +27 -0
- package/dist/utils/test-file.js.map +1 -0
- package/package.json +62 -0
- package/src/parser/languages/tree-sitter-css.wasm +0 -0
- package/src/parser/languages/tree-sitter-go.wasm +0 -0
- package/src/parser/languages/tree-sitter-java.wasm +0 -0
- package/src/parser/languages/tree-sitter-javascript.wasm +0 -0
- package/src/parser/languages/tree-sitter-json.wasm +0 -0
- package/src/parser/languages/tree-sitter-php.wasm +0 -0
- package/src/parser/languages/tree-sitter-python.wasm +0 -0
- package/src/parser/languages/tree-sitter-ruby.wasm +0 -0
- package/src/parser/languages/tree-sitter-rust.wasm +0 -0
- package/src/parser/languages/tree-sitter-tsx.wasm +0 -0
- package/src/parser/languages/tree-sitter-typescript.wasm +0 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
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
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
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
|
+
// ---------------------------------------------------------------------------
|
|
276
|
+
async function main() {
|
|
277
|
+
const transport = new StdioServerTransport();
|
|
278
|
+
await server.connect(transport);
|
|
279
|
+
console.error("CodeSift MCP server started");
|
|
280
|
+
}
|
|
281
|
+
main().catch((err) => {
|
|
282
|
+
console.error("Fatal error starting CodeSift MCP server:", err);
|
|
283
|
+
process.exit(1);
|
|
284
|
+
});
|
|
285
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG5E,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;SACpE;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAI,QAAgB,EAAE,IAA6B,EAAE,EAAoB;IACxF,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAC1C,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAC1C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;YACpE,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,UAAU,EAAE,CAAC;AAEb,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,cAAc,EACd,wEAAwE,EACxE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACjE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC3E,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,CAClD,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE;IACrB,WAAW,EAAE,IAAI,CAAC,WAAW;IAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;CAClC,CAAC,CACH,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,yCAAyC,EACzC;IACE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC5D,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,CAChD,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;IAClB,MAAM,EAAE,IAAI,CAAC,MAAM;IACnB,aAAa,EAAE,IAAI,CAAC,aAAa;CAClC,CAAC,CACH,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,6CAA6C,EAC7C,EAAE,EACF,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,CAC/D,CAAC;AAEF,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,2EAA2E,EAC3E;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;CAC3E,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CACvF,CAAC;AAEF,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,0EAA0E,EAC1E;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACjD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IACrF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IAC5E,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAC1F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IACzF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;CACpH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,EAAE,GAAG,EAAE,CACpD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE;IACnC,IAAI,EAAE,IAAI,CAAC,IAA8B;IACzC,YAAY,EAAE,IAAI,CAAC,YAAY;IAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;IACnC,KAAK,EAAE,IAAI,CAAC,KAAK;IACjB,YAAY,EAAE,IAAI,CAAC,YAAY;CAChC,CAAC,CACH,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,aAAa,EACb,mDAAmD,EACnD;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC3D,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACxE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IAC1F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IAC5E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;CACxG,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,CACjD,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE;IAChC,KAAK,EAAE,IAAI,CAAC,KAAK;IACjB,aAAa,EAAE,IAAI,CAAC,aAAa;IACjC,YAAY,EAAE,IAAI,CAAC,YAAY;IAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;CAC9B,CAAC,CACH,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,eAAe,EACf,gIAAgI,EAChI;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACjF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACjF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC5E,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC;IACzH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;CAClG,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,CACnD,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE;IACrB,WAAW,EAAE,IAAI,CAAC,WAAW;IAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;IAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;IACjB,OAAO,EAAE,IAAI,CAAC,OAAO;IACrB,WAAW,EAAE,IAAI,CAAC,WAAW;CAC9B,CAAC,CACH,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,uEAAuE,EACvE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CAC3E,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CACtG,CAAC;AAEF,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,wEAAwE,EACxE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;CACnD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CACtF,CAAC;AAEF,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,iEAAiE,EACjE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAC3D,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAC3F,CAAC;AAEF,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,aAAa,EACb,wDAAwD,EACxD;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CACxE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAC9F,CAAC;AAEF,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,eAAe,EACf,4EAA4E,EAC5E;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAChE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;CAC9F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,CACnD,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CACtD,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,qDAAqD,EACrD;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IAC7E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;CAC7E,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,CACrD,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAC/D,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,qLAAqL,EACrL;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC/D,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAC9F,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;IAC3G,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;CACvG,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,EAAE,GAAG,EAAE,CACtD,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAsB,EAAE;IACvE,KAAK,EAAE,IAAI,CAAC,KAAK;IACjB,cAAc,EAAE,IAAI,CAAC,cAAc;IACnC,aAAa,EAAE,IAAI,CAAC,aAAa;CAClC,CAAC,CACH,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,+IAA+I,EAC/I;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;IACvF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IACtE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IACjF,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;CACjH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,CACrD,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE;IACpC,KAAK,EAAE,IAAI,CAAC,KAAK;IACjB,KAAK,EAAE,IAAI,CAAC,KAAK;IACjB,cAAc,EAAE,IAAI,CAAC,cAAc;CACpC,CAAC,CACH,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,mEAAmE,EACnE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;IACtF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CACzF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,EAAE,GAAG,EAAE,CACtD,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAC1D,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,wEAAwE,EACxE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAChF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;CAC/E,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,mBAAmB,EAAE,IAAI,EAAE,GAAG,EAAE,CACvD,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CACnD,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,cAAc,EACd,+DAA+D,EAC/D;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACrD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CAClF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,CAClD,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAC/C,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,yEAAyE,EACzE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACrD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CAClF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,CACrD,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAClD,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,qEAAqE,EACrE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACvE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,EAAE,GAAG,EAAE,CACxD,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAC9C,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,mMAAmM,EACnM;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAClD,OAAO,EAAE,CAAC;SACP,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;SACnD,QAAQ,CAAC,kHAAkH,CAAC;IAC/H,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CAClG,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,EAAE,GAAG,EAAE,CACxD,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAC9D,EAAE,CACJ,CAAC;AAEF,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,aAAa,EACb,wFAAwF,EACxF,EAAE,EACF,KAAK,IAAI,EAAE;IACT,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,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;AAC/C,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,32 @@
|
|
|
1
|
+
import type { CodeChunk } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Derive the chunk ndjson path from the index path.
|
|
4
|
+
* {hash}.index.json → {hash}.chunks.ndjson
|
|
5
|
+
*/
|
|
6
|
+
export declare function getChunkPath(indexPath: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Derive the chunk-embedding ndjson path from the index path.
|
|
9
|
+
* {hash}.index.json → {hash}.chunk-embeddings.ndjson
|
|
10
|
+
*/
|
|
11
|
+
export declare function getChunkEmbeddingPath(indexPath: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Save all chunks atomically as ndjson.
|
|
14
|
+
* File: ~/.codesift/{hash}.chunks.ndjson
|
|
15
|
+
*/
|
|
16
|
+
export declare function saveChunks(chunkPath: string, chunks: CodeChunk[]): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Load all chunks from an ndjson file.
|
|
19
|
+
* Returns a Map of chunkId → CodeChunk, or null if file not found.
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadChunks(chunkPath: string): Promise<Map<string, CodeChunk> | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Save all chunk embeddings atomically as ndjson.
|
|
24
|
+
* File: ~/.codesift/{hash}.chunk-embeddings.ndjson
|
|
25
|
+
*/
|
|
26
|
+
export declare function saveChunkEmbeddings(embeddingPath: string, embeddings: Map<string, Float32Array>): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Load all chunk embeddings from an ndjson file.
|
|
29
|
+
* Returns a Map of chunkId → Float32Array, or null if file not found / empty.
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadChunkEmbeddings(embeddingPath: string): Promise<Map<string, Float32Array> | null>;
|
|
32
|
+
//# sourceMappingURL=chunk-store.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { readFile, writeFile, rename, mkdir, unlink } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Path helpers
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
/**
|
|
7
|
+
* Derive the chunk ndjson path from the index path.
|
|
8
|
+
* {hash}.index.json → {hash}.chunks.ndjson
|
|
9
|
+
*/
|
|
10
|
+
export function getChunkPath(indexPath) {
|
|
11
|
+
return indexPath.replace(/\.index\.json$/, ".chunks.ndjson");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Derive the chunk-embedding ndjson path from the index path.
|
|
15
|
+
* {hash}.index.json → {hash}.chunk-embeddings.ndjson
|
|
16
|
+
*/
|
|
17
|
+
export function getChunkEmbeddingPath(indexPath) {
|
|
18
|
+
return indexPath.replace(/\.index\.json$/, ".chunk-embeddings.ndjson");
|
|
19
|
+
}
|
|
20
|
+
function isChunkLine(value) {
|
|
21
|
+
if (typeof value !== "object" || value === null)
|
|
22
|
+
return false;
|
|
23
|
+
const obj = value;
|
|
24
|
+
return (typeof obj["id"] === "string" &&
|
|
25
|
+
typeof obj["file"] === "string" &&
|
|
26
|
+
typeof obj["startLine"] === "number" &&
|
|
27
|
+
typeof obj["endLine"] === "number" &&
|
|
28
|
+
typeof obj["text"] === "string" &&
|
|
29
|
+
typeof obj["tokenCount"] === "number");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Save all chunks atomically as ndjson.
|
|
33
|
+
* File: ~/.codesift/{hash}.chunks.ndjson
|
|
34
|
+
*/
|
|
35
|
+
export async function saveChunks(chunkPath, chunks) {
|
|
36
|
+
const dir = dirname(chunkPath);
|
|
37
|
+
await mkdir(dir, { recursive: true });
|
|
38
|
+
const lines = chunks.map((c) => JSON.stringify({
|
|
39
|
+
id: c.id,
|
|
40
|
+
file: c.file,
|
|
41
|
+
startLine: c.startLine,
|
|
42
|
+
endLine: c.endLine,
|
|
43
|
+
text: c.text,
|
|
44
|
+
tokenCount: c.tokenCount,
|
|
45
|
+
}));
|
|
46
|
+
const tmpPath = `${chunkPath}.tmp.${Date.now()}`;
|
|
47
|
+
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
|
+
}
|
|
59
|
+
}
|
|
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) {
|
|
65
|
+
try {
|
|
66
|
+
const raw = await readFile(chunkPath, "utf-8");
|
|
67
|
+
const map = new Map();
|
|
68
|
+
for (const line of raw.split("\n")) {
|
|
69
|
+
const trimmed = line.trim();
|
|
70
|
+
if (!trimmed)
|
|
71
|
+
continue;
|
|
72
|
+
try {
|
|
73
|
+
const parsed = JSON.parse(trimmed);
|
|
74
|
+
if (isChunkLine(parsed)) {
|
|
75
|
+
map.set(parsed.id, parsed);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Skip malformed lines
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return map.size > 0 ? map : null;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Save all chunk embeddings atomically as ndjson.
|
|
90
|
+
* File: ~/.codesift/{hash}.chunk-embeddings.ndjson
|
|
91
|
+
*/
|
|
92
|
+
export async function saveChunkEmbeddings(embeddingPath, embeddings) {
|
|
93
|
+
const dir = dirname(embeddingPath);
|
|
94
|
+
await mkdir(dir, { recursive: true });
|
|
95
|
+
const lines = [];
|
|
96
|
+
for (const [id, vec] of embeddings) {
|
|
97
|
+
lines.push(JSON.stringify({ id, vec: Array.from(vec) }));
|
|
98
|
+
}
|
|
99
|
+
const tmpPath = `${embeddingPath}.tmp.${Date.now()}`;
|
|
100
|
+
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
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Load all chunk embeddings from an ndjson file.
|
|
115
|
+
* Returns a Map of chunkId → Float32Array, or null if file not found / empty.
|
|
116
|
+
*/
|
|
117
|
+
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
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=chunk-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-store.js","sourceRoot":"","sources":["../../src/storage/chunk-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { EmbeddingMeta } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Get the embedding file path from an index path.
|
|
4
|
+
* {hash}.index.json → {hash}.embeddings.ndjson
|
|
5
|
+
*/
|
|
6
|
+
export declare function getEmbeddingPath(indexPath: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Get the embedding metadata file path.
|
|
9
|
+
* {hash}.index.json → {hash}.embeddings.meta.json
|
|
10
|
+
*/
|
|
11
|
+
export declare function getEmbeddingMetaPath(indexPath: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Load all embeddings from an ndjson file.
|
|
14
|
+
* Returns a Map of symbolId → Float32Array vector.
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadEmbeddings(embeddingPath: string): Promise<Map<string, Float32Array>>;
|
|
17
|
+
/**
|
|
18
|
+
* Save all embeddings atomically to an ndjson file.
|
|
19
|
+
*/
|
|
20
|
+
export declare function saveEmbeddings(embeddingPath: string, embeddings: Map<string, Float32Array>): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Save embedding metadata atomically.
|
|
23
|
+
*/
|
|
24
|
+
export declare function saveEmbeddingMeta(metaPath: string, meta: EmbeddingMeta): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Load embedding metadata.
|
|
27
|
+
* Returns null if not found or invalid.
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadEmbeddingMeta(metaPath: string): Promise<EmbeddingMeta | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Batch-embed symbols using the given provider, appending to existing embeddings.
|
|
32
|
+
* Only embeds symbols that don't already have an embedding.
|
|
33
|
+
*
|
|
34
|
+
* @param symbolTexts - Map of symbolId → text to embed
|
|
35
|
+
* @param existing - Existing embeddings to skip
|
|
36
|
+
* @param embedFn - The provider's embed function
|
|
37
|
+
* @param batchSize - How many texts per API call
|
|
38
|
+
* @returns Map of symbolId → Float32Array (existing + new)
|
|
39
|
+
*/
|
|
40
|
+
export declare function batchEmbed(symbolTexts: Map<string, string>, existing: Map<string, Float32Array>, embedFn: (texts: string[]) => Promise<number[][]>, batchSize: number): Promise<Map<string, Float32Array>>;
|
|
41
|
+
//# sourceMappingURL=embedding-store.d.ts.map
|
|
@@ -0,0 +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"}
|