skannr 0.1.1
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/.eslintrc.js +22 -0
- package/README.md +109 -0
- package/dist/agent-cli.d.ts +7 -0
- package/dist/agent-cli.d.ts.map +1 -0
- package/dist/agent-cli.js +364 -0
- package/dist/agent-cli.js.map +1 -0
- package/dist/agent.d.ts +115 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +340 -0
- package/dist/agent.js.map +1 -0
- package/dist/benchmark.d.ts +53 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +307 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/cache.d.ts +97 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +284 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +238 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +52 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +176 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/GenericAdapter.d.ts +10 -0
- package/dist/languages/GenericAdapter.d.ts.map +1 -0
- package/dist/languages/GenericAdapter.js +41 -0
- package/dist/languages/GenericAdapter.js.map +1 -0
- package/dist/languages/LanguageAdapter.d.ts +14 -0
- package/dist/languages/LanguageAdapter.d.ts.map +1 -0
- package/dist/languages/LanguageAdapter.js +3 -0
- package/dist/languages/LanguageAdapter.js.map +1 -0
- package/dist/languages/PythonAdapter.d.ts +10 -0
- package/dist/languages/PythonAdapter.d.ts.map +1 -0
- package/dist/languages/PythonAdapter.js +98 -0
- package/dist/languages/PythonAdapter.js.map +1 -0
- package/dist/languages/TypeScriptAdapter.d.ts +17 -0
- package/dist/languages/TypeScriptAdapter.d.ts.map +1 -0
- package/dist/languages/TypeScriptAdapter.js +321 -0
- package/dist/languages/TypeScriptAdapter.js.map +1 -0
- package/dist/languages/registry.d.ts +4 -0
- package/dist/languages/registry.d.ts.map +1 -0
- package/dist/languages/registry.js +86 -0
- package/dist/languages/registry.js.map +1 -0
- package/dist/mapper.d.ts +49 -0
- package/dist/mapper.d.ts.map +1 -0
- package/dist/mapper.js +386 -0
- package/dist/mapper.js.map +1 -0
- package/dist/ranker-enhanced.d.ts +37 -0
- package/dist/ranker-enhanced.d.ts.map +1 -0
- package/dist/ranker-enhanced.js +395 -0
- package/dist/ranker-enhanced.js.map +1 -0
- package/dist/ranker.d.ts +14 -0
- package/dist/ranker.d.ts.map +1 -0
- package/dist/ranker.js +105 -0
- package/dist/ranker.js.map +1 -0
- package/dist/rocket-chat-scope.d.ts +7 -0
- package/dist/rocket-chat-scope.d.ts.map +1 -0
- package/dist/rocket-chat-scope.js +95 -0
- package/dist/rocket-chat-scope.js.map +1 -0
- package/dist/scanner.d.ts +16 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +228 -0
- package/dist/scanner.js.map +1 -0
- package/dist/skeletonizer.d.ts +5 -0
- package/dist/skeletonizer.d.ts.map +1 -0
- package/dist/skeletonizer.js +52 -0
- package/dist/skeletonizer.js.map +1 -0
- package/dist/tokenizer.d.ts +9 -0
- package/dist/tokenizer.d.ts.map +1 -0
- package/dist/tokenizer.js +21 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/gemini-extension/GEMINI.md +26 -0
- package/gemini-extension/gemini-extension.json +12 -0
- package/gemini-extension/package.json +14 -0
- package/gemini-extension/src/server.ts +63 -0
- package/gemini-extension/tsconfig.json +14 -0
- package/jest.config.js +5 -0
- package/package.json +46 -0
- package/src/agent-cli.ts +383 -0
- package/src/agent.ts +344 -0
- package/src/benchmark.ts +389 -0
- package/src/cache.ts +317 -0
- package/src/cli.ts +223 -0
- package/src/config.ts +22 -0
- package/src/index.ts +215 -0
- package/src/languages/GenericAdapter.ts +44 -0
- package/src/languages/LanguageAdapter.ts +14 -0
- package/src/languages/PythonAdapter.ts +74 -0
- package/src/languages/TypeScriptAdapter.ts +338 -0
- package/src/languages/registry.ts +49 -0
- package/src/mapper.ts +448 -0
- package/src/ranker-enhanced.ts +460 -0
- package/src/ranker.ts +92 -0
- package/src/scanner.ts +201 -0
- package/src/skeletonizer.ts +16 -0
- package/src/tokenizer.ts +20 -0
- package/src/types.ts +71 -0
- package/tests/agent.tools.test.ts +81 -0
- package/tests/benchmark.test.ts +31 -0
- package/tests/fixtures/sample.py +17 -0
- package/tests/fixtures/sample.ts +13 -0
- package/tests/fixtures/src/api/routes.ts +1 -0
- package/tests/fixtures/src/auth/permission.ts +3 -0
- package/tests/ranker-enhanced.test.ts +68 -0
- package/tests/ranker.test.ts +75 -0
- package/tests/scanner.scope.test.ts +41 -0
- package/tests/setup-fixtures.js +29 -0
- package/tests/skeletonizer.test.ts +142 -0
- package/tsconfig.json +21 -0
- package/uca-landing/index.html +17 -0
- package/uca-landing/package.json +23 -0
- package/uca-landing/postcss.config.js +6 -0
- package/uca-landing/src/App.jsx +43 -0
- package/uca-landing/src/components/AgentMode.jsx +45 -0
- package/uca-landing/src/components/CliReference.jsx +49 -0
- package/uca-landing/src/components/Features.jsx +63 -0
- package/uca-landing/src/components/Footer.jsx +35 -0
- package/uca-landing/src/components/Hero.jsx +124 -0
- package/uca-landing/src/components/HowItWorks.jsx +60 -0
- package/uca-landing/src/components/Install.jsx +90 -0
- package/uca-landing/src/components/LanguageSupport.jsx +63 -0
- package/uca-landing/src/components/Navbar.jsx +86 -0
- package/uca-landing/src/components/Problem.jsx +51 -0
- package/uca-landing/src/components/Reveal.jsx +40 -0
- package/uca-landing/src/components/WorksWith.jsx +59 -0
- package/uca-landing/src/hooks/useScrollNav.js +13 -0
- package/uca-landing/src/hooks/useTypewriter.js +41 -0
- package/uca-landing/src/index.css +13 -0
- package/uca-landing/src/main.jsx +10 -0
- package/uca-landing/tailwind.config.js +68 -0
- package/uca-landing/vite.config.js +6 -0
package/dist/agent.js
ADDED
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Gemini AI Agent Integration for Code Analysis
|
|
4
|
+
* This module provides tool definitions and agent setup for agentic code analysis
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.CodeAnalysisAgent = exports.analyzeFileDependenciesTool = exports.searchSymbolsTool = exports.getSymbolDetailsTool = void 0;
|
|
41
|
+
exports.createCodeAnalysisAgent = createCodeAnalysisAgent;
|
|
42
|
+
const generative_ai_1 = require("@google/generative-ai");
|
|
43
|
+
const mapper_1 = require("./mapper");
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
/**
|
|
47
|
+
* Tool definition for getting symbol details
|
|
48
|
+
*/
|
|
49
|
+
exports.getSymbolDetailsTool = {
|
|
50
|
+
name: 'get_symbol_details',
|
|
51
|
+
description: `Retrieve the full implementation of a code symbol (function, method, class) from the original source file.
|
|
52
|
+
Use this when you need to see the actual implementation of a function or method that was marked with [SYMBOL:...] in the skeleton.
|
|
53
|
+
The symbolId is in the format "ClassName.methodName" or "functionName" for top-level functions.`,
|
|
54
|
+
parameters: {
|
|
55
|
+
type: generative_ai_1.SchemaType.OBJECT,
|
|
56
|
+
properties: {
|
|
57
|
+
symbolId: {
|
|
58
|
+
type: generative_ai_1.SchemaType.STRING,
|
|
59
|
+
description: 'The symbol identifier from the skeleton code (e.g., "AuthService.login" or "sendMessage")',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
required: ['symbolId'],
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Tool definition for searching code symbols
|
|
67
|
+
*/
|
|
68
|
+
exports.searchSymbolsTool = {
|
|
69
|
+
name: 'search_symbols',
|
|
70
|
+
description: `Search for available symbols in the generated skeletons. Returns a list of matching symbols that can be retrieved using get_symbol_details.
|
|
71
|
+
Use this to discover what functions/methods are available before requesting their full implementation.`,
|
|
72
|
+
parameters: {
|
|
73
|
+
type: generative_ai_1.SchemaType.OBJECT,
|
|
74
|
+
properties: {
|
|
75
|
+
query: {
|
|
76
|
+
type: generative_ai_1.SchemaType.STRING,
|
|
77
|
+
description: 'Search query to match against symbol names, file paths, or signatures',
|
|
78
|
+
},
|
|
79
|
+
symbolType: {
|
|
80
|
+
type: generative_ai_1.SchemaType.STRING,
|
|
81
|
+
description: 'Optional filter by symbol type: function, method, constructor, arrow-function, variable',
|
|
82
|
+
enum: ['function', 'method', 'constructor', 'arrow-function', 'variable'],
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
required: ['query'],
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Tool definition for analyzing file dependencies
|
|
90
|
+
*/
|
|
91
|
+
exports.analyzeFileDependenciesTool = {
|
|
92
|
+
name: 'analyze_file_dependencies',
|
|
93
|
+
description: `Analyze import/export relationships for a specific file from the skeleton.
|
|
94
|
+
Use this to understand what other files a given file depends on.`,
|
|
95
|
+
parameters: {
|
|
96
|
+
type: generative_ai_1.SchemaType.OBJECT,
|
|
97
|
+
properties: {
|
|
98
|
+
filePath: {
|
|
99
|
+
type: generative_ai_1.SchemaType.STRING,
|
|
100
|
+
description: 'Relative path to the file (as shown in the skeleton)',
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
required: ['filePath'],
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Code Analysis Agent
|
|
108
|
+
*/
|
|
109
|
+
class CodeAnalysisAgent {
|
|
110
|
+
genAI;
|
|
111
|
+
mapping = null;
|
|
112
|
+
model;
|
|
113
|
+
constructor(apiKey, modelName = 'gemini-2.0-flash-exp') {
|
|
114
|
+
this.genAI = new generative_ai_1.GoogleGenerativeAI(apiKey);
|
|
115
|
+
this.model = this.genAI.getGenerativeModel({
|
|
116
|
+
model: modelName,
|
|
117
|
+
tools: [
|
|
118
|
+
{
|
|
119
|
+
functionDeclarations: [
|
|
120
|
+
exports.getSymbolDetailsTool,
|
|
121
|
+
exports.searchSymbolsTool,
|
|
122
|
+
exports.analyzeFileDependenciesTool,
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Load symbol mapping
|
|
130
|
+
*/
|
|
131
|
+
loadMapping(mappingPath) {
|
|
132
|
+
if (!fs.existsSync(mappingPath)) {
|
|
133
|
+
throw new Error(`Mapping file not found: ${mappingPath}`);
|
|
134
|
+
}
|
|
135
|
+
this.mapping = (0, mapper_1.loadMappingFromFile)(mappingPath);
|
|
136
|
+
console.log(`Loaded mapping with ${Object.keys(this.mapping.files).length} files`);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Handle tool calls from the model
|
|
140
|
+
*/
|
|
141
|
+
async handleToolCall(functionCall) {
|
|
142
|
+
const { name, args } = functionCall;
|
|
143
|
+
switch (name) {
|
|
144
|
+
case 'get_symbol_details':
|
|
145
|
+
return this.handleGetSymbolDetails(args.symbolId);
|
|
146
|
+
case 'search_symbols':
|
|
147
|
+
return this.handleSearchSymbols(args.query, args.symbolType);
|
|
148
|
+
case 'analyze_file_dependencies':
|
|
149
|
+
return this.handleAnalyzeFileDependencies(args.filePath);
|
|
150
|
+
default:
|
|
151
|
+
return { error: `Unknown tool: ${name}` };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get symbol details
|
|
156
|
+
*/
|
|
157
|
+
handleGetSymbolDetails(symbolId) {
|
|
158
|
+
if (!this.mapping) {
|
|
159
|
+
return { error: 'No mapping loaded. Please load a mapping file first.' };
|
|
160
|
+
}
|
|
161
|
+
const result = (0, mapper_1.getSymbolDetails)(symbolId, this.mapping);
|
|
162
|
+
if (!result) {
|
|
163
|
+
return { error: `Symbol not found: ${symbolId}` };
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
symbolId,
|
|
167
|
+
content: result.content,
|
|
168
|
+
location: {
|
|
169
|
+
file: result.location.filePath,
|
|
170
|
+
lines: `${result.location.startLine}-${result.location.endLine}`,
|
|
171
|
+
type: result.location.symbolType,
|
|
172
|
+
parentClass: result.location.parentClass,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Search symbols
|
|
178
|
+
*/
|
|
179
|
+
handleSearchSymbols(query, symbolType) {
|
|
180
|
+
if (!this.mapping) {
|
|
181
|
+
return { error: 'No mapping loaded. Please load a mapping file first.' };
|
|
182
|
+
}
|
|
183
|
+
const results = [];
|
|
184
|
+
const queryLower = query.toLowerCase();
|
|
185
|
+
for (const [filePath, fileInfo] of Object.entries(this.mapping.files)) {
|
|
186
|
+
for (const symbol of fileInfo.symbols) {
|
|
187
|
+
// Filter by type if specified
|
|
188
|
+
if (symbolType && symbol.symbolType !== symbolType) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
// Check if query matches
|
|
192
|
+
const matchesName = symbol.symbolName.toLowerCase().includes(queryLower);
|
|
193
|
+
const matchesFile = filePath.toLowerCase().includes(queryLower);
|
|
194
|
+
const matchesSignature = symbol.signature?.toLowerCase().includes(queryLower);
|
|
195
|
+
if (matchesName || matchesFile || matchesSignature) {
|
|
196
|
+
results.push({
|
|
197
|
+
symbolId: symbol.symbolId,
|
|
198
|
+
name: symbol.symbolName,
|
|
199
|
+
type: symbol.symbolType,
|
|
200
|
+
file: filePath,
|
|
201
|
+
parentClass: symbol.parentClass,
|
|
202
|
+
signature: symbol.signature,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
query,
|
|
209
|
+
count: results.length,
|
|
210
|
+
results: results.slice(0, 20), // Limit to 20 results
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Analyze file dependencies
|
|
215
|
+
*/
|
|
216
|
+
handleAnalyzeFileDependencies(filePath) {
|
|
217
|
+
if (!this.mapping) {
|
|
218
|
+
return { error: 'No mapping loaded. Please load a mapping file first.' };
|
|
219
|
+
}
|
|
220
|
+
const fileInfo = this.mapping.files[filePath];
|
|
221
|
+
if (!fileInfo) {
|
|
222
|
+
return { error: `File not found in mapping: ${filePath}` };
|
|
223
|
+
}
|
|
224
|
+
// Read the original file to extract imports
|
|
225
|
+
const fullPath = path.join(this.mapping.rootPath, filePath);
|
|
226
|
+
if (!fs.existsSync(fullPath)) {
|
|
227
|
+
return { error: `Source file not found: ${fullPath}` };
|
|
228
|
+
}
|
|
229
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
230
|
+
const importRegex = /import\s+(?:{[^}]*}|[^;]+)\s+from\s+['"]([^'"]+)['"]/g;
|
|
231
|
+
const imports = [];
|
|
232
|
+
let match;
|
|
233
|
+
while ((match = importRegex.exec(content)) !== null) {
|
|
234
|
+
imports.push(match[1]);
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
file: filePath,
|
|
238
|
+
imports,
|
|
239
|
+
symbolCount: fileInfo.symbols.length,
|
|
240
|
+
symbols: fileInfo.symbols.map(s => ({
|
|
241
|
+
id: s.symbolId,
|
|
242
|
+
name: s.symbolName,
|
|
243
|
+
type: s.symbolType,
|
|
244
|
+
})),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Start a conversation with the agent
|
|
249
|
+
*/
|
|
250
|
+
async chat(userMessage, skeletonContext) {
|
|
251
|
+
if (!this.mapping) {
|
|
252
|
+
throw new Error('No mapping loaded. Call loadMapping() first.');
|
|
253
|
+
}
|
|
254
|
+
let context = userMessage;
|
|
255
|
+
if (skeletonContext) {
|
|
256
|
+
context = [
|
|
257
|
+
'You are a code analysis assistant.',
|
|
258
|
+
'Base your answer on the provided skeletons and tool results.',
|
|
259
|
+
'If evidence is insufficient, say so explicitly.',
|
|
260
|
+
'Include a final section titled "Evidence" with bullet points that reference concrete files or symbols used.',
|
|
261
|
+
'',
|
|
262
|
+
'Here are the code skeletons for context:',
|
|
263
|
+
skeletonContext,
|
|
264
|
+
'',
|
|
265
|
+
`User question: ${userMessage}`,
|
|
266
|
+
].join('\n');
|
|
267
|
+
}
|
|
268
|
+
const chat = this.model.startChat({
|
|
269
|
+
history: [],
|
|
270
|
+
});
|
|
271
|
+
let response = await chat.sendMessage(context);
|
|
272
|
+
let responseText = '';
|
|
273
|
+
// Handle function calls in a loop
|
|
274
|
+
while (response.response.functionCalls()) {
|
|
275
|
+
const functionCalls = response.response.functionCalls();
|
|
276
|
+
const functionResponses = [];
|
|
277
|
+
for (const call of functionCalls) {
|
|
278
|
+
console.log(`[Agent] Calling tool: ${call.name}(${JSON.stringify(call.args)})`);
|
|
279
|
+
const result = await this.handleToolCall(call);
|
|
280
|
+
functionResponses.push({
|
|
281
|
+
name: call.name,
|
|
282
|
+
response: result,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
// Send function responses back to the model
|
|
286
|
+
response = await chat.sendMessage(functionResponses);
|
|
287
|
+
}
|
|
288
|
+
responseText = response.response.text();
|
|
289
|
+
return responseText;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Local wrapper for symbol search without model invocation.
|
|
293
|
+
*/
|
|
294
|
+
searchSymbols(query, symbolType) {
|
|
295
|
+
return this.handleSearchSymbols(query, symbolType);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Local wrapper for fetching symbol implementation by ID.
|
|
299
|
+
*/
|
|
300
|
+
getSymbolDetails(symbolId) {
|
|
301
|
+
return this.handleGetSymbolDetails(symbolId);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Local wrapper for file dependency analysis.
|
|
305
|
+
*/
|
|
306
|
+
analyzeFileDependencies(filePath) {
|
|
307
|
+
return this.handleAnalyzeFileDependencies(filePath);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Get statistics about the loaded mapping
|
|
311
|
+
*/
|
|
312
|
+
getStats() {
|
|
313
|
+
if (!this.mapping) {
|
|
314
|
+
return { error: 'No mapping loaded' };
|
|
315
|
+
}
|
|
316
|
+
let totalSymbols = 0;
|
|
317
|
+
const symbolTypes = {};
|
|
318
|
+
for (const fileInfo of Object.values(this.mapping.files)) {
|
|
319
|
+
totalSymbols += fileInfo.symbols.length;
|
|
320
|
+
for (const symbol of fileInfo.symbols) {
|
|
321
|
+
symbolTypes[symbol.symbolType] = (symbolTypes[symbol.symbolType] || 0) + 1;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
rootPath: this.mapping.rootPath,
|
|
326
|
+
generatedAt: this.mapping.generatedAt,
|
|
327
|
+
totalFiles: Object.keys(this.mapping.files).length,
|
|
328
|
+
totalSymbols,
|
|
329
|
+
symbolsByType: symbolTypes,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
exports.CodeAnalysisAgent = CodeAnalysisAgent;
|
|
334
|
+
/**
|
|
335
|
+
* Helper function to create an agent instance
|
|
336
|
+
*/
|
|
337
|
+
function createCodeAnalysisAgent(apiKey, modelName) {
|
|
338
|
+
return new CodeAnalysisAgent(apiKey, modelName);
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark script for code-analyzer
|
|
3
|
+
* Runs against a repository root to measure token reduction.
|
|
4
|
+
* Compares full-scan token cost vs skeletonized analysis across representative queries.
|
|
5
|
+
*/
|
|
6
|
+
interface BenchmarkScenario {
|
|
7
|
+
moduleKey: string;
|
|
8
|
+
query: string;
|
|
9
|
+
limit: number;
|
|
10
|
+
}
|
|
11
|
+
interface BenchmarkResult {
|
|
12
|
+
projectName: string;
|
|
13
|
+
projectRoot: string;
|
|
14
|
+
query: string;
|
|
15
|
+
allFilesCount: number;
|
|
16
|
+
allFilesTotalTokens: number;
|
|
17
|
+
analyzedFileCount: number;
|
|
18
|
+
analyzedOriginalTokens: number;
|
|
19
|
+
analyzedSkeletonTokens: number;
|
|
20
|
+
tokenReductionVsFullScan: number;
|
|
21
|
+
tokenReductionVsTopN: number;
|
|
22
|
+
top1KeywordCoverage: number;
|
|
23
|
+
avgTopKKeywordCoverage: number;
|
|
24
|
+
pathIntentMatchRate: number;
|
|
25
|
+
directoryDiversity: number;
|
|
26
|
+
enhancedRanking: boolean;
|
|
27
|
+
executionTimeMs: number;
|
|
28
|
+
topFiles: {
|
|
29
|
+
path: string;
|
|
30
|
+
score: number;
|
|
31
|
+
originalTokens: number;
|
|
32
|
+
skeletonTokens: number;
|
|
33
|
+
reductionPct: number;
|
|
34
|
+
}[];
|
|
35
|
+
}
|
|
36
|
+
export declare const BENCHMARK_SCENARIOS: BenchmarkScenario[];
|
|
37
|
+
/**
|
|
38
|
+
* Run a single benchmark scenario
|
|
39
|
+
*/
|
|
40
|
+
declare function benchmarkProject(appRoot: string, moduleKey: string, projectName: string, query: string, options?: {
|
|
41
|
+
limit?: number;
|
|
42
|
+
enhancedRanking?: boolean;
|
|
43
|
+
}): Promise<BenchmarkResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Format results for console output
|
|
46
|
+
*/
|
|
47
|
+
declare function formatResults(results: BenchmarkResult[]): string;
|
|
48
|
+
/**
|
|
49
|
+
* Save benchmark output to JSON
|
|
50
|
+
*/
|
|
51
|
+
declare function saveResults(results: BenchmarkResult[], outputPath: string): void;
|
|
52
|
+
export { benchmarkProject, formatResults, saveResults };
|
|
53
|
+
//# sourceMappingURL=benchmark.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAE5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,wBAAwB,EAAE,MAAM,CAAC;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;KACtB,EAAE,CAAC;CACL;AA2DD,eAAO,MAAM,mBAAmB,EAAE,iBAAiB,EAIlD,CAAC;AA+BF;;GAEG;AACH,iBAAe,gBAAgB,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1D,OAAO,CAAC,eAAe,CAAC,CAwE1B;AAED;;GAEG;AACH,iBAAS,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAkEzD;AAED;;GAEG;AACH,iBAAS,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAsBzE;AAuED,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC"}
|