src-mcp 1.0.1 → 1.0.2
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/dist/bin.d.mts +1 -0
- package/dist/bin.mjs +205 -0
- package/dist/bin.mjs.map +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +8 -0
- package/dist/index.mjs.map +1 -0
- package/dist/server-B2Ms4jQx.mjs +3889 -0
- package/dist/server-B2Ms4jQx.mjs.map +1 -0
- package/package.json +10 -9
- package/dist/bin.d.ts +0 -3
- package/dist/bin.d.ts.map +0 -1
- package/dist/bin.js +0 -4
- package/dist/bin.js.map +0 -1
- package/dist/cli/adapter.d.ts +0 -7
- package/dist/cli/adapter.d.ts.map +0 -1
- package/dist/cli/adapter.js +0 -39
- package/dist/cli/adapter.js.map +0 -1
- package/dist/cli/commands/index.d.ts +0 -24
- package/dist/cli/commands/index.d.ts.map +0 -1
- package/dist/cli/commands/index.js +0 -13
- package/dist/cli/commands/index.js.map +0 -1
- package/dist/cli/commands/serve.command.d.ts +0 -21
- package/dist/cli/commands/serve.command.d.ts.map +0 -1
- package/dist/cli/commands/serve.command.js +0 -62
- package/dist/cli/commands/serve.command.js.map +0 -1
- package/dist/cli/commands/version.command.d.ts +0 -2
- package/dist/cli/commands/version.command.d.ts.map +0 -1
- package/dist/cli/commands/version.command.js +0 -12
- package/dist/cli/commands/version.command.js.map +0 -1
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -15
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/parser.d.ts +0 -7
- package/dist/cli/parser.d.ts.map +0 -1
- package/dist/cli/parser.js +0 -99
- package/dist/cli/parser.js.map +0 -1
- package/dist/config/index.d.ts +0 -24
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -38
- package/dist/config/index.js.map +0 -1
- package/dist/core/ast/index.d.ts +0 -82
- package/dist/core/ast/index.d.ts.map +0 -1
- package/dist/core/ast/index.js +0 -204
- package/dist/core/ast/index.js.map +0 -1
- package/dist/core/ast/types.d.ts +0 -152
- package/dist/core/ast/types.d.ts.map +0 -1
- package/dist/core/ast/types.js +0 -5
- package/dist/core/ast/types.js.map +0 -1
- package/dist/core/constants.d.ts +0 -17
- package/dist/core/constants.d.ts.map +0 -1
- package/dist/core/constants.js +0 -49
- package/dist/core/constants.js.map +0 -1
- package/dist/core/embeddings/callgraph.d.ts +0 -98
- package/dist/core/embeddings/callgraph.d.ts.map +0 -1
- package/dist/core/embeddings/callgraph.js +0 -415
- package/dist/core/embeddings/callgraph.js.map +0 -1
- package/dist/core/embeddings/chunker.d.ts +0 -37
- package/dist/core/embeddings/chunker.d.ts.map +0 -1
- package/dist/core/embeddings/chunker.js +0 -298
- package/dist/core/embeddings/chunker.js.map +0 -1
- package/dist/core/embeddings/client.d.ts +0 -30
- package/dist/core/embeddings/client.d.ts.map +0 -1
- package/dist/core/embeddings/client.js +0 -65
- package/dist/core/embeddings/client.js.map +0 -1
- package/dist/core/embeddings/crossfile.d.ts +0 -58
- package/dist/core/embeddings/crossfile.d.ts.map +0 -1
- package/dist/core/embeddings/crossfile.js +0 -202
- package/dist/core/embeddings/crossfile.js.map +0 -1
- package/dist/core/embeddings/enricher.d.ts +0 -53
- package/dist/core/embeddings/enricher.d.ts.map +0 -1
- package/dist/core/embeddings/enricher.js +0 -308
- package/dist/core/embeddings/enricher.js.map +0 -1
- package/dist/core/embeddings/index.d.ts +0 -13
- package/dist/core/embeddings/index.d.ts.map +0 -1
- package/dist/core/embeddings/index.js +0 -20
- package/dist/core/embeddings/index.js.map +0 -1
- package/dist/core/embeddings/reranker.d.ts +0 -41
- package/dist/core/embeddings/reranker.d.ts.map +0 -1
- package/dist/core/embeddings/reranker.js +0 -117
- package/dist/core/embeddings/reranker.js.map +0 -1
- package/dist/core/embeddings/store.d.ts +0 -93
- package/dist/core/embeddings/store.d.ts.map +0 -1
- package/dist/core/embeddings/store.js +0 -304
- package/dist/core/embeddings/store.js.map +0 -1
- package/dist/core/embeddings/types.d.ts +0 -77
- package/dist/core/embeddings/types.d.ts.map +0 -1
- package/dist/core/embeddings/types.js +0 -5
- package/dist/core/embeddings/types.js.map +0 -1
- package/dist/core/embeddings/watcher.d.ts +0 -130
- package/dist/core/embeddings/watcher.d.ts.map +0 -1
- package/dist/core/embeddings/watcher.js +0 -448
- package/dist/core/embeddings/watcher.js.map +0 -1
- package/dist/core/fallback/index.d.ts +0 -26
- package/dist/core/fallback/index.d.ts.map +0 -1
- package/dist/core/fallback/index.js +0 -76
- package/dist/core/fallback/index.js.map +0 -1
- package/dist/core/parser/index.d.ts +0 -64
- package/dist/core/parser/index.d.ts.map +0 -1
- package/dist/core/parser/index.js +0 -205
- package/dist/core/parser/index.js.map +0 -1
- package/dist/core/parser/languages.d.ts +0 -26
- package/dist/core/parser/languages.d.ts.map +0 -1
- package/dist/core/parser/languages.js +0 -101
- package/dist/core/parser/languages.js.map +0 -1
- package/dist/core/queries/helpers.d.ts +0 -72
- package/dist/core/queries/helpers.d.ts.map +0 -1
- package/dist/core/queries/helpers.js +0 -101
- package/dist/core/queries/helpers.js.map +0 -1
- package/dist/core/queries/index.d.ts +0 -144
- package/dist/core/queries/index.d.ts.map +0 -1
- package/dist/core/queries/index.js +0 -396
- package/dist/core/queries/index.js.map +0 -1
- package/dist/core/queries/loader.d.ts +0 -46
- package/dist/core/queries/loader.d.ts.map +0 -1
- package/dist/core/queries/loader.js +0 -216
- package/dist/core/queries/loader.js.map +0 -1
- package/dist/core/queries/patterns.d.ts +0 -10
- package/dist/core/queries/patterns.d.ts.map +0 -1
- package/dist/core/queries/patterns.js +0 -112
- package/dist/core/queries/patterns.js.map +0 -1
- package/dist/core/symbols/index.d.ts +0 -70
- package/dist/core/symbols/index.d.ts.map +0 -1
- package/dist/core/symbols/index.js +0 -359
- package/dist/core/symbols/index.js.map +0 -1
- package/dist/core/unified/index.d.ts +0 -118
- package/dist/core/unified/index.d.ts.map +0 -1
- package/dist/core/unified/index.js +0 -428
- package/dist/core/unified/index.js.map +0 -1
- package/dist/core/utils/assets.d.ts +0 -34
- package/dist/core/utils/assets.d.ts.map +0 -1
- package/dist/core/utils/assets.js +0 -85
- package/dist/core/utils/assets.js.map +0 -1
- package/dist/core/utils/cache.d.ts +0 -43
- package/dist/core/utils/cache.d.ts.map +0 -1
- package/dist/core/utils/cache.js +0 -60
- package/dist/core/utils/cache.js.map +0 -1
- package/dist/core/utils/index.d.ts +0 -7
- package/dist/core/utils/index.d.ts.map +0 -1
- package/dist/core/utils/index.js +0 -10
- package/dist/core/utils/index.js.map +0 -1
- package/dist/core/utils/tsconfig.d.ts +0 -34
- package/dist/core/utils/tsconfig.d.ts.map +0 -1
- package/dist/core/utils/tsconfig.js +0 -173
- package/dist/core/utils/tsconfig.js.map +0 -1
- package/dist/features/analyze-file/index.d.ts +0 -15
- package/dist/features/analyze-file/index.d.ts.map +0 -1
- package/dist/features/analyze-file/index.js +0 -164
- package/dist/features/analyze-file/index.js.map +0 -1
- package/dist/features/get-call-graph/index.d.ts +0 -24
- package/dist/features/get-call-graph/index.d.ts.map +0 -1
- package/dist/features/get-call-graph/index.js +0 -246
- package/dist/features/get-call-graph/index.js.map +0 -1
- package/dist/features/get-index-status/index.d.ts +0 -20
- package/dist/features/get-index-status/index.d.ts.map +0 -1
- package/dist/features/get-index-status/index.js +0 -90
- package/dist/features/get-index-status/index.js.map +0 -1
- package/dist/features/index-codebase/index.d.ts +0 -24
- package/dist/features/index-codebase/index.d.ts.map +0 -1
- package/dist/features/index-codebase/index.js +0 -283
- package/dist/features/index-codebase/index.js.map +0 -1
- package/dist/features/index.d.ts +0 -15
- package/dist/features/index.d.ts.map +0 -1
- package/dist/features/index.js +0 -28
- package/dist/features/index.js.map +0 -1
- package/dist/features/info/index.d.ts +0 -19
- package/dist/features/info/index.d.ts.map +0 -1
- package/dist/features/info/index.js +0 -41
- package/dist/features/info/index.js.map +0 -1
- package/dist/features/list-symbols/index.d.ts +0 -22
- package/dist/features/list-symbols/index.d.ts.map +0 -1
- package/dist/features/list-symbols/index.js +0 -74
- package/dist/features/list-symbols/index.js.map +0 -1
- package/dist/features/parse-ast/index.d.ts +0 -12
- package/dist/features/parse-ast/index.d.ts.map +0 -1
- package/dist/features/parse-ast/index.js +0 -71
- package/dist/features/parse-ast/index.js.map +0 -1
- package/dist/features/query-code/index.d.ts +0 -23
- package/dist/features/query-code/index.d.ts.map +0 -1
- package/dist/features/query-code/index.js +0 -96
- package/dist/features/query-code/index.js.map +0 -1
- package/dist/features/search-code/index.d.ts +0 -39
- package/dist/features/search-code/index.d.ts.map +0 -1
- package/dist/features/search-code/index.js +0 -258
- package/dist/features/search-code/index.js.map +0 -1
- package/dist/features/types.d.ts +0 -14
- package/dist/features/types.d.ts.map +0 -1
- package/dist/features/types.js +0 -2
- package/dist/features/types.js.map +0 -1
- package/dist/features/update-index/index.d.ts +0 -24
- package/dist/features/update-index/index.d.ts.map +0 -1
- package/dist/features/update-index/index.js +0 -358
- package/dist/features/update-index/index.js.map +0 -1
- package/dist/features/utils/content.d.ts +0 -30
- package/dist/features/utils/content.d.ts.map +0 -1
- package/dist/features/utils/content.js +0 -49
- package/dist/features/utils/content.js.map +0 -1
- package/dist/features/utils/index.d.ts +0 -6
- package/dist/features/utils/index.d.ts.map +0 -1
- package/dist/features/utils/index.js +0 -8
- package/dist/features/utils/index.js.map +0 -1
- package/dist/features/utils/result.d.ts +0 -37
- package/dist/features/utils/result.d.ts.map +0 -1
- package/dist/features/utils/result.js +0 -53
- package/dist/features/utils/result.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +0 -1
- package/dist/prompts/index.d.ts +0 -9
- package/dist/prompts/index.d.ts.map +0 -1
- package/dist/prompts/index.js +0 -188
- package/dist/prompts/index.js.map +0 -1
- package/dist/resources/index.d.ts +0 -3
- package/dist/resources/index.d.ts.map +0 -1
- package/dist/resources/index.js +0 -17
- package/dist/resources/index.js.map +0 -1
- package/dist/server.d.ts +0 -4
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -24
- package/dist/server.js.map +0 -1
- package/dist/tools/adapter.d.ts +0 -4
- package/dist/tools/adapter.d.ts.map +0 -1
- package/dist/tools/adapter.js +0 -28
- package/dist/tools/adapter.js.map +0 -1
- package/dist/tools/index.d.ts +0 -5
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -9
- package/dist/tools/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -20
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -2
- package/dist/types/index.js.map +0 -1
- package/dist/utils/colors.d.ts +0 -24
- package/dist/utils/colors.d.ts.map +0 -1
- package/dist/utils/colors.js +0 -30
- package/dist/utils/colors.js.map +0 -1
- package/dist/utils/index.d.ts +0 -4
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -4
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -8
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -57
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/spinner.d.ts +0 -11
- package/dist/utils/spinner.d.ts.map +0 -1
- package/dist/utils/spinner.js +0 -36
- package/dist/utils/spinner.js.map +0 -1
|
@@ -1,415 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Call graph extraction and storage
|
|
3
|
-
*
|
|
4
|
-
* Extracts function call relationships from code using tree-sitter
|
|
5
|
-
* to build a graph showing which functions call which.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Persistent caching in .src-index/call-graph.json
|
|
9
|
-
* - Hash-based invalidation for changed files
|
|
10
|
-
*/
|
|
11
|
-
import { Query } from "web-tree-sitter";
|
|
12
|
-
import * as fs from "node:fs";
|
|
13
|
-
import * as path from "node:path";
|
|
14
|
-
import * as crypto from "node:crypto";
|
|
15
|
-
import { parseCode } from "@core/parser";
|
|
16
|
-
import { extractSymbols } from "@core/symbols";
|
|
17
|
-
import { registerCache } from "@core/utils";
|
|
18
|
-
import { logger } from "@utils";
|
|
19
|
-
/**
|
|
20
|
-
* Compute SHA-256 hash of content
|
|
21
|
-
*/
|
|
22
|
-
function computeHash(content) {
|
|
23
|
-
return crypto.createHash("sha256").update(content).digest("hex").slice(0, 16);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Get call graph cache path for a directory
|
|
27
|
-
*/
|
|
28
|
-
function getCachePath(directory) {
|
|
29
|
-
return path.join(directory, ".src-index", "call-graph.json");
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Save call graph to persistent cache
|
|
33
|
-
*/
|
|
34
|
-
function saveCallGraphCache(directory, graph, fileHashes) {
|
|
35
|
-
try {
|
|
36
|
-
const cachePath = getCachePath(directory);
|
|
37
|
-
const cacheDir = path.dirname(cachePath);
|
|
38
|
-
// Ensure cache directory exists
|
|
39
|
-
if (!fs.existsSync(cacheDir)) {
|
|
40
|
-
fs.mkdirSync(cacheDir, { recursive: true });
|
|
41
|
-
}
|
|
42
|
-
const serialized = {
|
|
43
|
-
nodes: Object.fromEntries(graph.nodes),
|
|
44
|
-
files: graph.files,
|
|
45
|
-
edgeCount: graph.edgeCount,
|
|
46
|
-
fileHashes,
|
|
47
|
-
timestamp: Date.now(),
|
|
48
|
-
};
|
|
49
|
-
fs.writeFileSync(cachePath, JSON.stringify(serialized), "utf-8");
|
|
50
|
-
logger.debug(`Call graph cache saved: ${String(graph.nodes.size)} nodes`);
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
// Silently ignore cache save errors (directory not writable, etc.)
|
|
54
|
-
logger.debug("Call graph cache save skipped: directory not writable");
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Load call graph from persistent cache if valid
|
|
59
|
-
*/
|
|
60
|
-
function loadCallGraphCache(directory, currentHashes) {
|
|
61
|
-
const cachePath = getCachePath(directory);
|
|
62
|
-
if (!fs.existsSync(cachePath)) {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
try {
|
|
66
|
-
const content = fs.readFileSync(cachePath, "utf-8");
|
|
67
|
-
const cached = JSON.parse(content);
|
|
68
|
-
// Validate hashes - check if any file has changed
|
|
69
|
-
const cachedFiles = new Set(Object.keys(cached.fileHashes));
|
|
70
|
-
const currentFiles = new Set(Object.keys(currentHashes));
|
|
71
|
-
// Check for added or removed files
|
|
72
|
-
if (cachedFiles.size !== currentFiles.size) {
|
|
73
|
-
logger.debug("Call graph cache invalid: file count changed");
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
// Check for modified files
|
|
77
|
-
for (const [filePath, hash] of Object.entries(currentHashes)) {
|
|
78
|
-
if (cached.fileHashes[filePath] !== hash) {
|
|
79
|
-
logger.debug(`Call graph cache invalid: ${filePath} changed`);
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
// Cache is valid - restore the Map
|
|
84
|
-
const nodes = new Map(Object.entries(cached.nodes));
|
|
85
|
-
logger.debug(`Call graph cache loaded: ${String(nodes.size)} nodes`);
|
|
86
|
-
return {
|
|
87
|
-
nodes,
|
|
88
|
-
files: cached.files,
|
|
89
|
-
edgeCount: cached.edgeCount,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
logger.debug(`Failed to load call graph cache: ${error instanceof Error ? error.message : String(error)}`);
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
const callGraphCache = new Map();
|
|
98
|
-
/**
|
|
99
|
-
* Clear the call graph cache
|
|
100
|
-
*/
|
|
101
|
-
export function clearCallGraphCache() {
|
|
102
|
-
callGraphCache.clear();
|
|
103
|
-
}
|
|
104
|
-
// Register cache for centralized clearing
|
|
105
|
-
registerCache("embeddings:callGraphCache", clearCallGraphCache);
|
|
106
|
-
/**
|
|
107
|
-
* Extract function calls from a tree-sitter node
|
|
108
|
-
*/
|
|
109
|
-
function extractCallsFromTree(tree, languageInstance, language) {
|
|
110
|
-
const callsBySymbol = new Map();
|
|
111
|
-
// Query patterns for function calls in different languages
|
|
112
|
-
const callPatterns = {
|
|
113
|
-
typescript: `
|
|
114
|
-
(call_expression
|
|
115
|
-
function: [(identifier) @callee
|
|
116
|
-
(member_expression property: (property_identifier) @callee)]
|
|
117
|
-
arguments: (arguments) @args)
|
|
118
|
-
`,
|
|
119
|
-
javascript: `
|
|
120
|
-
(call_expression
|
|
121
|
-
function: [(identifier) @callee
|
|
122
|
-
(member_expression property: (property_identifier) @callee)]
|
|
123
|
-
arguments: (arguments) @args)
|
|
124
|
-
`,
|
|
125
|
-
python: `
|
|
126
|
-
(call
|
|
127
|
-
function: [(identifier) @callee
|
|
128
|
-
(attribute attribute: (identifier) @callee)]
|
|
129
|
-
arguments: (argument_list) @args)
|
|
130
|
-
`,
|
|
131
|
-
go: `
|
|
132
|
-
(call_expression
|
|
133
|
-
function: [(identifier) @callee
|
|
134
|
-
(selector_expression field: (field_identifier) @callee)]
|
|
135
|
-
arguments: (argument_list) @args)
|
|
136
|
-
`,
|
|
137
|
-
};
|
|
138
|
-
const pattern = callPatterns[language];
|
|
139
|
-
if (!pattern) {
|
|
140
|
-
return callsBySymbol;
|
|
141
|
-
}
|
|
142
|
-
try {
|
|
143
|
-
const query = new Query(languageInstance, pattern);
|
|
144
|
-
const matches = query.matches(tree.rootNode);
|
|
145
|
-
// Extract callee names from matches
|
|
146
|
-
const callCaptures = [];
|
|
147
|
-
for (const match of matches) {
|
|
148
|
-
for (const capture of match.captures) {
|
|
149
|
-
if (capture.name === "callee") {
|
|
150
|
-
callCaptures.push({
|
|
151
|
-
callee: capture.node.text,
|
|
152
|
-
position: {
|
|
153
|
-
line: capture.node.startPosition.row + 1,
|
|
154
|
-
column: capture.node.startPosition.column,
|
|
155
|
-
offset: capture.node.startIndex,
|
|
156
|
-
},
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
// For now, store all calls without symbol association
|
|
162
|
-
// A more sophisticated approach would track which symbol contains each call
|
|
163
|
-
if (callCaptures.length > 0) {
|
|
164
|
-
callsBySymbol.set("__global__", callCaptures.map((c) => ({
|
|
165
|
-
callee: c.callee,
|
|
166
|
-
position: c.position,
|
|
167
|
-
})));
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
logger.debug(`Failed to extract calls for ${language}: ${error instanceof Error ? error.message : String(error)}`);
|
|
172
|
-
}
|
|
173
|
-
return callsBySymbol;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Associate calls with their containing symbols
|
|
177
|
-
*/
|
|
178
|
-
function associateCallsWithSymbols(symbols, allCalls) {
|
|
179
|
-
const callsBySymbol = new Map();
|
|
180
|
-
// Sort symbols by start offset for efficient lookup
|
|
181
|
-
const sortedSymbols = [...symbols]
|
|
182
|
-
.filter((s) => s.type === "function" || s.type === "method")
|
|
183
|
-
.sort((a, b) => a.start.offset - b.start.offset);
|
|
184
|
-
for (const call of allCalls) {
|
|
185
|
-
// Find the symbol that contains this call
|
|
186
|
-
let containingSymbol = null;
|
|
187
|
-
for (const symbol of sortedSymbols) {
|
|
188
|
-
if (call.position.offset >= symbol.start.offset &&
|
|
189
|
-
call.position.offset <= symbol.end.offset) {
|
|
190
|
-
containingSymbol = symbol;
|
|
191
|
-
}
|
|
192
|
-
else if (call.position.offset < symbol.start.offset) {
|
|
193
|
-
// Calls are sorted by position, so we can break early
|
|
194
|
-
break;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
const symbolName = containingSymbol?.name ?? "__global__";
|
|
198
|
-
const existing = callsBySymbol.get(symbolName) ?? [];
|
|
199
|
-
existing.push(call);
|
|
200
|
-
callsBySymbol.set(symbolName, existing);
|
|
201
|
-
}
|
|
202
|
-
return callsBySymbol;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Analyze a file and extract call graph data
|
|
206
|
-
*/
|
|
207
|
-
export async function analyzeFileForCallGraph(filePath, content) {
|
|
208
|
-
// Check cache
|
|
209
|
-
const cached = callGraphCache.get(filePath);
|
|
210
|
-
if (cached) {
|
|
211
|
-
return cached;
|
|
212
|
-
}
|
|
213
|
-
try {
|
|
214
|
-
const parseResult = await parseCode(content, { filePath });
|
|
215
|
-
const { symbols } = extractSymbols(parseResult.tree, parseResult.languageInstance, parseResult.language);
|
|
216
|
-
const callsMap = extractCallsFromTree(parseResult.tree, parseResult.languageInstance, parseResult.language);
|
|
217
|
-
// Get all calls and associate with symbols
|
|
218
|
-
const allCalls = callsMap.get("__global__") ?? [];
|
|
219
|
-
const callsBySymbol = associateCallsWithSymbols(symbols, allCalls);
|
|
220
|
-
const data = {
|
|
221
|
-
symbols,
|
|
222
|
-
calls: callsBySymbol,
|
|
223
|
-
};
|
|
224
|
-
callGraphCache.set(filePath, data);
|
|
225
|
-
return data;
|
|
226
|
-
}
|
|
227
|
-
catch (error) {
|
|
228
|
-
logger.debug(`Failed to analyze ${filePath} for call graph: ${error instanceof Error ? error.message : String(error)}`);
|
|
229
|
-
return null;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Build a call graph from multiple files
|
|
234
|
-
*
|
|
235
|
-
* Uses persistent caching with hash-based invalidation for performance.
|
|
236
|
-
*/
|
|
237
|
-
export async function buildCallGraph(files) {
|
|
238
|
-
if (files.length === 0) {
|
|
239
|
-
return { nodes: new Map(), files: [], edgeCount: 0 };
|
|
240
|
-
}
|
|
241
|
-
// Compute hashes for all files
|
|
242
|
-
const fileHashes = {};
|
|
243
|
-
for (const file of files) {
|
|
244
|
-
fileHashes[file.path] = computeHash(file.content);
|
|
245
|
-
}
|
|
246
|
-
// Determine base directory from common path prefix
|
|
247
|
-
const baseDir = findCommonDirectory(files.map((f) => f.path));
|
|
248
|
-
// Try to load from persistent cache
|
|
249
|
-
const cached = loadCallGraphCache(baseDir, fileHashes);
|
|
250
|
-
if (cached) {
|
|
251
|
-
return cached;
|
|
252
|
-
}
|
|
253
|
-
// Build the call graph
|
|
254
|
-
const nodes = new Map();
|
|
255
|
-
const filePaths = [];
|
|
256
|
-
let edgeCount = 0;
|
|
257
|
-
// First pass: collect all symbols
|
|
258
|
-
for (const file of files) {
|
|
259
|
-
filePaths.push(file.path);
|
|
260
|
-
const data = await analyzeFileForCallGraph(file.path, file.content);
|
|
261
|
-
if (!data) {
|
|
262
|
-
continue;
|
|
263
|
-
}
|
|
264
|
-
// Create nodes for all functions/methods
|
|
265
|
-
for (const symbol of data.symbols) {
|
|
266
|
-
if (symbol.type === "function" || symbol.type === "method") {
|
|
267
|
-
const qualifiedName = `${file.path}:${symbol.name}`;
|
|
268
|
-
nodes.set(qualifiedName, {
|
|
269
|
-
name: symbol.name,
|
|
270
|
-
qualifiedName,
|
|
271
|
-
filePath: file.path,
|
|
272
|
-
type: symbol.type,
|
|
273
|
-
start: symbol.start,
|
|
274
|
-
end: symbol.end,
|
|
275
|
-
calls: [],
|
|
276
|
-
calledBy: [],
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
// Second pass: build edges
|
|
282
|
-
for (const file of files) {
|
|
283
|
-
const data = callGraphCache.get(file.path);
|
|
284
|
-
if (!data) {
|
|
285
|
-
continue;
|
|
286
|
-
}
|
|
287
|
-
for (const [symbolName, calls] of data.calls) {
|
|
288
|
-
const callerKey = `${file.path}:${symbolName}`;
|
|
289
|
-
const callerNode = nodes.get(callerKey);
|
|
290
|
-
if (!callerNode && symbolName !== "__global__") {
|
|
291
|
-
continue;
|
|
292
|
-
}
|
|
293
|
-
for (const call of calls) {
|
|
294
|
-
// Try to find the callee in our nodes
|
|
295
|
-
// This is a simplified approach - in reality we'd need to resolve imports
|
|
296
|
-
for (const [nodeKey, node] of nodes) {
|
|
297
|
-
if (node.name === call.callee) {
|
|
298
|
-
// Add edge
|
|
299
|
-
if (callerNode) {
|
|
300
|
-
callerNode.calls.push(nodeKey);
|
|
301
|
-
}
|
|
302
|
-
node.calledBy.push(callerKey);
|
|
303
|
-
edgeCount++;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
const graph = {
|
|
310
|
-
nodes,
|
|
311
|
-
files: filePaths,
|
|
312
|
-
edgeCount,
|
|
313
|
-
};
|
|
314
|
-
// Save to persistent cache
|
|
315
|
-
saveCallGraphCache(baseDir, graph, fileHashes);
|
|
316
|
-
return graph;
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Find common directory from a list of file paths
|
|
320
|
-
*/
|
|
321
|
-
function findCommonDirectory(paths) {
|
|
322
|
-
if (paths.length === 0) {
|
|
323
|
-
return ".";
|
|
324
|
-
}
|
|
325
|
-
const firstPathStr = paths[0];
|
|
326
|
-
if (!firstPathStr) {
|
|
327
|
-
return ".";
|
|
328
|
-
}
|
|
329
|
-
if (paths.length === 1) {
|
|
330
|
-
return path.dirname(firstPathStr);
|
|
331
|
-
}
|
|
332
|
-
// Normalize paths and split into segments
|
|
333
|
-
const segments = paths.map((p) => path.normalize(p).split(path.sep));
|
|
334
|
-
const firstPath = segments[0];
|
|
335
|
-
if (!firstPath) {
|
|
336
|
-
return ".";
|
|
337
|
-
}
|
|
338
|
-
// Find common prefix
|
|
339
|
-
let commonLength = 0;
|
|
340
|
-
for (let i = 0; i < firstPath.length; i++) {
|
|
341
|
-
const segment = firstPath[i];
|
|
342
|
-
if (segment && segments.every((s) => s[i] === segment)) {
|
|
343
|
-
commonLength = i + 1;
|
|
344
|
-
}
|
|
345
|
-
else {
|
|
346
|
-
break;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
// Build common directory path
|
|
350
|
-
const commonSegments = firstPath.slice(0, commonLength);
|
|
351
|
-
const commonDir = commonSegments.join(path.sep);
|
|
352
|
-
// If the common path is a file, return its directory
|
|
353
|
-
if (commonDir &&
|
|
354
|
-
fs.existsSync(commonDir) &&
|
|
355
|
-
fs.statSync(commonDir).isFile()) {
|
|
356
|
-
return path.dirname(commonDir);
|
|
357
|
-
}
|
|
358
|
-
return commonDir || ".";
|
|
359
|
-
}
|
|
360
|
-
/**
|
|
361
|
-
* Get callers and callees for a specific function
|
|
362
|
-
*/
|
|
363
|
-
export function getCallContext(graph, filePath, functionName) {
|
|
364
|
-
const qualifiedName = `${filePath}:${functionName}`;
|
|
365
|
-
const node = graph.nodes.get(qualifiedName);
|
|
366
|
-
if (!node) {
|
|
367
|
-
return null;
|
|
368
|
-
}
|
|
369
|
-
const callers = [];
|
|
370
|
-
const callees = [];
|
|
371
|
-
for (const callerKey of node.calledBy) {
|
|
372
|
-
const caller = graph.nodes.get(callerKey);
|
|
373
|
-
if (caller) {
|
|
374
|
-
callers.push(caller);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
for (const calleeKey of node.calls) {
|
|
378
|
-
const callee = graph.nodes.get(calleeKey);
|
|
379
|
-
if (callee) {
|
|
380
|
-
callees.push(callee);
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
return { callers, callees };
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Format call context as a string for enrichment
|
|
387
|
-
*/
|
|
388
|
-
export function formatCallContext(callers, callees, maxItems = 5) {
|
|
389
|
-
const lines = [];
|
|
390
|
-
if (callers.length > 0) {
|
|
391
|
-
const callerNames = callers
|
|
392
|
-
.slice(0, maxItems)
|
|
393
|
-
.map((c) => c.name)
|
|
394
|
-
.join(", ");
|
|
395
|
-
lines.push(`Called by: ${callerNames}`);
|
|
396
|
-
}
|
|
397
|
-
if (callees.length > 0) {
|
|
398
|
-
const calleeNames = callees
|
|
399
|
-
.slice(0, maxItems)
|
|
400
|
-
.map((c) => c.name)
|
|
401
|
-
.join(", ");
|
|
402
|
-
lines.push(`Calls: ${calleeNames}`);
|
|
403
|
-
}
|
|
404
|
-
return lines.join("\n");
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* Get call graph cache statistics
|
|
408
|
-
*/
|
|
409
|
-
export function getCallGraphCacheStats() {
|
|
410
|
-
return {
|
|
411
|
-
files: callGraphCache.size,
|
|
412
|
-
entries: Array.from(callGraphCache.keys()),
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
//# sourceMappingURL=callgraph.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"callgraph.js","sourceRoot":"","sources":["../../../src/core/embeddings/callgraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Code chunker for splitting source files into embeddable chunks
|
|
3
|
-
*
|
|
4
|
-
* Uses tree-sitter for semantic chunking based on symbols (functions, classes, etc.)
|
|
5
|
-
* This produces much better embeddings than character-based splitting.
|
|
6
|
-
*/
|
|
7
|
-
import type { CodeChunk, EmbeddingConfig } from "./types";
|
|
8
|
-
/**
|
|
9
|
-
* Detect language from file extension
|
|
10
|
-
*/
|
|
11
|
-
export declare function detectLanguage(filePath: string): string;
|
|
12
|
-
/**
|
|
13
|
-
* Chunk a source file using tree-sitter for semantic boundaries
|
|
14
|
-
*
|
|
15
|
-
* Strategy:
|
|
16
|
-
* 1. Parse file with tree-sitter and extract symbols
|
|
17
|
-
* 2. Each function/class/method becomes its own chunk
|
|
18
|
-
* 3. Code between symbols (imports, top-level code) is grouped together
|
|
19
|
-
* 4. Large symbols are split at line boundaries if they exceed maxSize
|
|
20
|
-
*/
|
|
21
|
-
export declare function chunkFile(filePath: string, content: string, config: Pick<EmbeddingConfig, "defaultChunkSize" | "defaultChunkOverlap">): Promise<CodeChunk[]>;
|
|
22
|
-
/**
|
|
23
|
-
* Chunk multiple files
|
|
24
|
-
*/
|
|
25
|
-
export declare function chunkFiles(files: {
|
|
26
|
-
path: string;
|
|
27
|
-
content: string;
|
|
28
|
-
}[], config: Pick<EmbeddingConfig, "defaultChunkSize" | "defaultChunkOverlap">): Promise<CodeChunk[]>;
|
|
29
|
-
/**
|
|
30
|
-
* Supported file extensions for indexing
|
|
31
|
-
*/
|
|
32
|
-
export declare const SUPPORTED_EXTENSIONS: string[];
|
|
33
|
-
/**
|
|
34
|
-
* Check if a file should be indexed
|
|
35
|
-
*/
|
|
36
|
-
export declare function shouldIndexFile(filePath: string): boolean;
|
|
37
|
-
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../../src/core/embeddings/chunker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAkB1D;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2CvD;AA6GD;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,kBAAkB,GAAG,qBAAqB,CAAC,GACxE,OAAO,CAAC,SAAS,EAAE,CAAC,CAmItB;AAuCD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,EAC1C,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,kBAAkB,GAAG,qBAAqB,CAAC,GACxE,OAAO,CAAC,SAAS,EAAE,CAAC,CAStB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,UAwBhC,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGzD"}
|