lamps-code-review 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/analyzer/ai/context.d.ts +29 -0
- package/dist/core/analyzer/ai/context.d.ts.map +1 -0
- package/dist/core/analyzer/ai/context.js +413 -0
- package/dist/core/analyzer/ai/context.js.map +1 -0
- package/dist/core/analyzer/ai/index.d.ts +24 -6
- package/dist/core/analyzer/ai/index.d.ts.map +1 -1
- package/dist/core/analyzer/ai/index.js +157 -97
- package/dist/core/analyzer/ai/index.js.map +1 -1
- package/dist/core/analyzer/ai/passes.d.ts +14 -0
- package/dist/core/analyzer/ai/passes.d.ts.map +1 -0
- package/dist/core/analyzer/ai/passes.js +202 -0
- package/dist/core/analyzer/ai/passes.js.map +1 -0
- package/dist/core/analyzer/ai/slices.d.ts +40 -0
- package/dist/core/analyzer/ai/slices.d.ts.map +1 -0
- package/dist/core/analyzer/ai/slices.js +263 -0
- package/dist/core/analyzer/ai/slices.js.map +1 -0
- package/dist/core/analyzer/dependency/index.d.ts +64 -0
- package/dist/core/analyzer/dependency/index.d.ts.map +1 -0
- package/dist/core/analyzer/dependency/index.js +402 -0
- package/dist/core/analyzer/dependency/index.js.map +1 -0
- package/dist/core/analyzer/index.d.ts +1 -0
- package/dist/core/analyzer/index.d.ts.map +1 -1
- package/dist/core/analyzer/index.js +16 -7
- package/dist/core/analyzer/index.js.map +1 -1
- package/dist/types/index.d.ts +78 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Builder
|
|
3
|
+
* Builds smart, focused context for each AI pass
|
|
4
|
+
*/
|
|
5
|
+
import type { AnalysisContext, AnalysisResult, DependencyGraph, FileInfo, Finding, ReviewContext } from '../../../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Build context for the architecture pass
|
|
8
|
+
* Focus: File tree, entry points, config files, high-level structure
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildArchitectureContext(context: AnalysisContext, graph: DependencyGraph): Promise<ReviewContext>;
|
|
11
|
+
/**
|
|
12
|
+
* Build context for the deep-dive pass
|
|
13
|
+
* Focus: High-priority files, static analysis hotspots, high-connectivity modules
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildDeepDiveContext(context: AnalysisContext, graph: DependencyGraph, staticFindings: Finding[], architectureFindings: Finding[]): Promise<ReviewContext>;
|
|
16
|
+
/**
|
|
17
|
+
* Build context for the security pass
|
|
18
|
+
* Focus: Auth, API routes, data handling, sensitive operations
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildSecurityContext(context: AnalysisContext, graph: DependencyGraph): Promise<ReviewContext>;
|
|
21
|
+
/**
|
|
22
|
+
* Get dependency graph from analysis results
|
|
23
|
+
*/
|
|
24
|
+
export declare function getDependencyGraphFromResults(results: AnalysisResult[]): DependencyGraph | null;
|
|
25
|
+
/**
|
|
26
|
+
* Create an empty dependency graph for fallback
|
|
27
|
+
*/
|
|
28
|
+
export declare function createEmptyGraph(files: FileInfo[]): DependencyGraph;
|
|
29
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,eAAe,EAEf,QAAQ,EACR,OAAO,EACP,aAAa,EAGd,MAAM,yBAAyB,CAAC;AAcjC;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,aAAa,CAAC,CAsFxB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,eAAe,EACtB,cAAc,EAAE,OAAO,EAAE,EACzB,oBAAoB,EAAE,OAAO,EAAE,GAC9B,OAAO,CAAC,aAAa,CAAC,CA4FxB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,aAAa,CAAC,CA6FxB;AAmGD;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,eAAe,GAAG,IAAI,CAe/F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,eAAe,CAsBnE"}
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Context Builder
|
|
4
|
+
* Builds smart, focused context for each AI pass
|
|
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.buildArchitectureContext = buildArchitectureContext;
|
|
41
|
+
exports.buildDeepDiveContext = buildDeepDiveContext;
|
|
42
|
+
exports.buildSecurityContext = buildSecurityContext;
|
|
43
|
+
exports.getDependencyGraphFromResults = getDependencyGraphFromResults;
|
|
44
|
+
exports.createEmptyGraph = createEmptyGraph;
|
|
45
|
+
const fs = __importStar(require("node:fs"));
|
|
46
|
+
const index_js_1 = require("../dependency/index.js");
|
|
47
|
+
const slices_js_1 = require("./slices.js");
|
|
48
|
+
/** Token budget for each pass */
|
|
49
|
+
const TOKEN_BUDGETS = {
|
|
50
|
+
architecture: 15000,
|
|
51
|
+
'deep-dive': 40000,
|
|
52
|
+
security: 25000,
|
|
53
|
+
};
|
|
54
|
+
/** File size threshold for slicing (50KB) */
|
|
55
|
+
const SLICE_THRESHOLD = 50 * 1024;
|
|
56
|
+
/**
|
|
57
|
+
* Build context for the architecture pass
|
|
58
|
+
* Focus: File tree, entry points, config files, high-level structure
|
|
59
|
+
*/
|
|
60
|
+
async function buildArchitectureContext(context, graph) {
|
|
61
|
+
const files = [];
|
|
62
|
+
const budget = TOKEN_BUDGETS.architecture;
|
|
63
|
+
let usedTokens = 0;
|
|
64
|
+
// 1. Add file tree (paths only) - always include
|
|
65
|
+
const fileTree = buildFileTree(context.files);
|
|
66
|
+
const treeTokens = (0, slices_js_1.estimateTokens)(fileTree);
|
|
67
|
+
usedTokens += treeTokens;
|
|
68
|
+
// 2. Add package.json / pyproject.toml (critical for understanding project)
|
|
69
|
+
const packageFiles = ['package.json', 'pyproject.toml', 'requirements.txt'];
|
|
70
|
+
for (const pkgFile of packageFiles) {
|
|
71
|
+
const file = context.files.find((f) => f.relativePath === pkgFile);
|
|
72
|
+
if (file) {
|
|
73
|
+
const content = await loadContent(file);
|
|
74
|
+
if (content) {
|
|
75
|
+
const tokens = (0, slices_js_1.estimateTokens)(content);
|
|
76
|
+
if (usedTokens + tokens < budget) {
|
|
77
|
+
files.push({
|
|
78
|
+
path: file.relativePath,
|
|
79
|
+
content,
|
|
80
|
+
reason: 'Package configuration',
|
|
81
|
+
priority: 100,
|
|
82
|
+
});
|
|
83
|
+
usedTokens += tokens;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// 3. Add entry point files (full content if small, slices if large)
|
|
89
|
+
const entryFiles = graph.entryPoints
|
|
90
|
+
.map((p) => context.files.find((f) => f.relativePath === p))
|
|
91
|
+
.filter((f) => f !== undefined)
|
|
92
|
+
.slice(0, 5); // Limit to 5 entry points
|
|
93
|
+
for (const file of entryFiles) {
|
|
94
|
+
const contextFile = await buildContextFile(file, 'Entry point', budget - usedTokens);
|
|
95
|
+
if (contextFile) {
|
|
96
|
+
files.push(contextFile);
|
|
97
|
+
usedTokens += (0, slices_js_1.estimateTokens)(contextFile.content || contextFile.slices?.map((s) => s.content).join('\n') || '');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// 4. Add config files
|
|
101
|
+
const configFiles = graph.configFiles
|
|
102
|
+
.map((p) => context.files.find((f) => f.relativePath === p))
|
|
103
|
+
.filter((f) => f !== undefined)
|
|
104
|
+
.slice(0, 5);
|
|
105
|
+
for (const file of configFiles) {
|
|
106
|
+
const contextFile = await buildContextFile(file, 'Configuration', budget - usedTokens);
|
|
107
|
+
if (contextFile) {
|
|
108
|
+
files.push(contextFile);
|
|
109
|
+
usedTokens += (0, slices_js_1.estimateTokens)(contextFile.content || '');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// 5. Add README if exists
|
|
113
|
+
const readme = context.files.find((f) => /readme\.md$/i.test(f.relativePath));
|
|
114
|
+
if (readme) {
|
|
115
|
+
const content = await loadContent(readme);
|
|
116
|
+
if (content) {
|
|
117
|
+
const tokens = (0, slices_js_1.estimateTokens)(content);
|
|
118
|
+
if (usedTokens + tokens < budget) {
|
|
119
|
+
files.push({
|
|
120
|
+
path: readme.relativePath,
|
|
121
|
+
content,
|
|
122
|
+
reason: 'Project documentation',
|
|
123
|
+
priority: 50,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
pass: 'architecture',
|
|
130
|
+
files,
|
|
131
|
+
metadata: {
|
|
132
|
+
totalFiles: context.files.length,
|
|
133
|
+
totalTokenEstimate: usedTokens,
|
|
134
|
+
frameworks: context.frameworks.frameworks.map((f) => f.framework),
|
|
135
|
+
focusAreas: ['Project structure', 'Dependencies', 'Entry points', 'Configuration'],
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Build context for the deep-dive pass
|
|
141
|
+
* Focus: High-priority files, static analysis hotspots, high-connectivity modules
|
|
142
|
+
*/
|
|
143
|
+
async function buildDeepDiveContext(context, graph, staticFindings, architectureFindings) {
|
|
144
|
+
const files = [];
|
|
145
|
+
const budget = TOKEN_BUDGETS['deep-dive'];
|
|
146
|
+
let usedTokens = 0;
|
|
147
|
+
// Get files sorted by priority
|
|
148
|
+
const sortedNodes = Array.from(graph.files.values())
|
|
149
|
+
.filter((n) => n.category !== 'test' && n.category !== 'config')
|
|
150
|
+
.sort((a, b) => (b.priority || 0) - (a.priority || 0));
|
|
151
|
+
// 1. Files with static analysis findings (highest priority)
|
|
152
|
+
const filesWithFindings = new Set(staticFindings.map((f) => f.file));
|
|
153
|
+
const flaggedFiles = context.files.filter((f) => filesWithFindings.has(f.relativePath));
|
|
154
|
+
for (const file of flaggedFiles) {
|
|
155
|
+
const fileFindings = staticFindings.filter((f) => f.file === file.relativePath);
|
|
156
|
+
const contextFile = await buildContextFile(file, `Static analysis flagged (${fileFindings.length} issues)`, budget - usedTokens, fileFindings);
|
|
157
|
+
if (contextFile) {
|
|
158
|
+
files.push(contextFile);
|
|
159
|
+
usedTokens += (0, slices_js_1.estimateTokens)(contextFile.content || contextFile.slices?.map((s) => s.content).join('\n') || '');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// 2. Files mentioned in architecture findings
|
|
163
|
+
const mentionedFiles = extractMentionedFiles(architectureFindings, context.files);
|
|
164
|
+
for (const file of mentionedFiles) {
|
|
165
|
+
if (!files.find((f) => f.path === file.relativePath)) {
|
|
166
|
+
const contextFile = await buildContextFile(file, 'Flagged in architecture review', budget - usedTokens);
|
|
167
|
+
if (contextFile) {
|
|
168
|
+
files.push(contextFile);
|
|
169
|
+
usedTokens += (0, slices_js_1.estimateTokens)(contextFile.content || contextFile.slices?.map((s) => s.content).join('\n') || '');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// 3. High-connectivity files (many importedBy)
|
|
174
|
+
const highConnectivity = sortedNodes
|
|
175
|
+
.filter((n) => n.importedBy.length >= 3)
|
|
176
|
+
.slice(0, 10);
|
|
177
|
+
for (const node of highConnectivity) {
|
|
178
|
+
const file = context.files.find((f) => f.relativePath === node.path);
|
|
179
|
+
if (file && !files.find((f) => f.path === file.relativePath)) {
|
|
180
|
+
const contextFile = await buildContextFile(file, `High connectivity (${node.importedBy.length} dependents)`, budget - usedTokens);
|
|
181
|
+
if (contextFile) {
|
|
182
|
+
files.push(contextFile);
|
|
183
|
+
usedTokens += (0, slices_js_1.estimateTokens)(contextFile.content || contextFile.slices?.map((s) => s.content).join('\n') || '');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// 4. Fill remaining budget with high-priority files
|
|
188
|
+
for (const node of sortedNodes) {
|
|
189
|
+
if (usedTokens >= budget * 0.9)
|
|
190
|
+
break; // Leave 10% buffer
|
|
191
|
+
const file = context.files.find((f) => f.relativePath === node.path);
|
|
192
|
+
if (file && !files.find((f) => f.path === file.relativePath)) {
|
|
193
|
+
const contextFile = await buildContextFile(file, `Priority score: ${node.priority}`, budget - usedTokens);
|
|
194
|
+
if (contextFile) {
|
|
195
|
+
files.push(contextFile);
|
|
196
|
+
usedTokens += (0, slices_js_1.estimateTokens)(contextFile.content || contextFile.slices?.map((s) => s.content).join('\n') || '');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
pass: 'deep-dive',
|
|
202
|
+
files,
|
|
203
|
+
metadata: {
|
|
204
|
+
totalFiles: files.length,
|
|
205
|
+
totalTokenEstimate: usedTokens,
|
|
206
|
+
frameworks: context.frameworks.frameworks.map((f) => f.framework),
|
|
207
|
+
focusAreas: ['Code quality', 'Bugs', 'Performance', 'Best practices'],
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Build context for the security pass
|
|
213
|
+
* Focus: Auth, API routes, data handling, sensitive operations
|
|
214
|
+
*/
|
|
215
|
+
async function buildSecurityContext(context, graph) {
|
|
216
|
+
const files = [];
|
|
217
|
+
const budget = TOKEN_BUDGETS.security;
|
|
218
|
+
let usedTokens = 0;
|
|
219
|
+
// Security-sensitive file patterns
|
|
220
|
+
const securityPatterns = [
|
|
221
|
+
/auth/i,
|
|
222
|
+
/login/i,
|
|
223
|
+
/session/i,
|
|
224
|
+
/token/i,
|
|
225
|
+
/password/i,
|
|
226
|
+
/secret/i,
|
|
227
|
+
/credential/i,
|
|
228
|
+
/middleware/i,
|
|
229
|
+
/permission/i,
|
|
230
|
+
/role/i,
|
|
231
|
+
/crypto/i,
|
|
232
|
+
/encrypt/i,
|
|
233
|
+
/hash/i,
|
|
234
|
+
/sanitize/i,
|
|
235
|
+
/validate/i,
|
|
236
|
+
];
|
|
237
|
+
// 1. API route files
|
|
238
|
+
const apiFiles = graph.apiFiles
|
|
239
|
+
.map((p) => context.files.find((f) => f.relativePath === p))
|
|
240
|
+
.filter((f) => f !== undefined);
|
|
241
|
+
for (const file of apiFiles) {
|
|
242
|
+
const contextFile = await buildContextFile(file, 'API route', budget - usedTokens);
|
|
243
|
+
if (contextFile) {
|
|
244
|
+
files.push(contextFile);
|
|
245
|
+
usedTokens += (0, slices_js_1.estimateTokens)(contextFile.content || contextFile.slices?.map((s) => s.content).join('\n') || '');
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// 2. Security-sensitive files by name
|
|
249
|
+
const securityFiles = context.files.filter((f) => securityPatterns.some((p) => p.test(f.relativePath)));
|
|
250
|
+
for (const file of securityFiles) {
|
|
251
|
+
if (!files.find((f) => f.path === file.relativePath)) {
|
|
252
|
+
const contextFile = await buildContextFile(file, 'Security-sensitive file', budget - usedTokens);
|
|
253
|
+
if (contextFile) {
|
|
254
|
+
files.push(contextFile);
|
|
255
|
+
usedTokens += (0, slices_js_1.estimateTokens)(contextFile.content || contextFile.slices?.map((s) => s.content).join('\n') || '');
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// 3. Environment/config files (for secrets exposure check)
|
|
260
|
+
const envFiles = context.files.filter((f) => /\.env\.example|\.env\.sample|config.*\.(ts|js|json)$/i.test(f.relativePath));
|
|
261
|
+
for (const file of envFiles) {
|
|
262
|
+
if (!files.find((f) => f.path === file.relativePath)) {
|
|
263
|
+
const contextFile = await buildContextFile(file, 'Environment/Config', budget - usedTokens);
|
|
264
|
+
if (contextFile) {
|
|
265
|
+
files.push(contextFile);
|
|
266
|
+
usedTokens += (0, slices_js_1.estimateTokens)(contextFile.content || '');
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// 4. Database/model files
|
|
271
|
+
const dbPatterns = [/model/i, /schema/i, /database/i, /db\./i, /migration/i, /query/i];
|
|
272
|
+
const dbFiles = context.files.filter((f) => dbPatterns.some((p) => p.test(f.relativePath)));
|
|
273
|
+
for (const file of dbFiles) {
|
|
274
|
+
if (!files.find((f) => f.path === file.relativePath) && usedTokens < budget * 0.9) {
|
|
275
|
+
const contextFile = await buildContextFile(file, 'Database/Model', budget - usedTokens);
|
|
276
|
+
if (contextFile) {
|
|
277
|
+
files.push(contextFile);
|
|
278
|
+
usedTokens += (0, slices_js_1.estimateTokens)(contextFile.content || contextFile.slices?.map((s) => s.content).join('\n') || '');
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
pass: 'security',
|
|
284
|
+
files,
|
|
285
|
+
metadata: {
|
|
286
|
+
totalFiles: files.length,
|
|
287
|
+
totalTokenEstimate: usedTokens,
|
|
288
|
+
frameworks: context.frameworks.frameworks.map((f) => f.framework),
|
|
289
|
+
focusAreas: ['Authentication', 'Authorization', 'Input validation', 'Data exposure', 'Injection vulnerabilities'],
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Build a context file entry
|
|
295
|
+
* Uses full content for small files, slices for large files
|
|
296
|
+
*/
|
|
297
|
+
async function buildContextFile(file, reason, remainingBudget, findings) {
|
|
298
|
+
const content = await loadContent(file);
|
|
299
|
+
if (!content)
|
|
300
|
+
return null;
|
|
301
|
+
const tokens = (0, slices_js_1.estimateTokens)(content);
|
|
302
|
+
// If file is small and fits in budget, include full content
|
|
303
|
+
if (file.size < SLICE_THRESHOLD && tokens < remainingBudget) {
|
|
304
|
+
return {
|
|
305
|
+
path: file.relativePath,
|
|
306
|
+
content,
|
|
307
|
+
reason,
|
|
308
|
+
priority: 50,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
// For large files, extract slices
|
|
312
|
+
const slices = (0, slices_js_1.extractSlices)(content, file.relativePath, {
|
|
313
|
+
staticFindings: findings,
|
|
314
|
+
includeExports: true,
|
|
315
|
+
includeSecurity: true,
|
|
316
|
+
includeDefinitions: true,
|
|
317
|
+
maxTotalSize: Math.min(remainingBudget * 4, 20000), // Rough char limit
|
|
318
|
+
});
|
|
319
|
+
const reconstructed = (0, slices_js_1.reconstructSliceContent)(content, slices);
|
|
320
|
+
const sliceContent = reconstructed.map((s) => s.content).join('\n');
|
|
321
|
+
const sliceTokens = (0, slices_js_1.estimateTokens)(sliceContent);
|
|
322
|
+
if (sliceTokens > remainingBudget)
|
|
323
|
+
return null;
|
|
324
|
+
// If slices are almost as big as the file, just use full content
|
|
325
|
+
if (sliceTokens > tokens * 0.8 && tokens < remainingBudget) {
|
|
326
|
+
return {
|
|
327
|
+
path: file.relativePath,
|
|
328
|
+
content,
|
|
329
|
+
reason,
|
|
330
|
+
priority: 50,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
return {
|
|
334
|
+
path: file.relativePath,
|
|
335
|
+
slices: reconstructed,
|
|
336
|
+
reason: `${reason} (sliced)`,
|
|
337
|
+
priority: 50,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Load file content
|
|
342
|
+
*/
|
|
343
|
+
async function loadContent(file) {
|
|
344
|
+
if (file.content)
|
|
345
|
+
return file.content;
|
|
346
|
+
try {
|
|
347
|
+
return await fs.promises.readFile(file.path, 'utf-8');
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Build a file tree string representation
|
|
355
|
+
*/
|
|
356
|
+
function buildFileTree(files) {
|
|
357
|
+
const paths = files.map((f) => f.relativePath).sort();
|
|
358
|
+
return paths.join('\n');
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Extract files mentioned in findings
|
|
362
|
+
*/
|
|
363
|
+
function extractMentionedFiles(findings, allFiles) {
|
|
364
|
+
const mentioned = [];
|
|
365
|
+
for (const finding of findings) {
|
|
366
|
+
if (finding.file) {
|
|
367
|
+
const file = allFiles.find((f) => f.relativePath === finding.file);
|
|
368
|
+
if (file && !mentioned.includes(file)) {
|
|
369
|
+
mentioned.push(file);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return mentioned;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Get dependency graph from analysis results
|
|
377
|
+
*/
|
|
378
|
+
function getDependencyGraphFromResults(results) {
|
|
379
|
+
const depResult = results.find((r) => r.analyzerName === 'dependency');
|
|
380
|
+
if (!depResult?.metadata?.dependencyGraph)
|
|
381
|
+
return null;
|
|
382
|
+
try {
|
|
383
|
+
return (0, index_js_1.deserializeGraph)(depResult.metadata.dependencyGraph);
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Create an empty dependency graph for fallback
|
|
391
|
+
*/
|
|
392
|
+
function createEmptyGraph(files) {
|
|
393
|
+
const graph = {
|
|
394
|
+
files: new Map(),
|
|
395
|
+
entryPoints: [],
|
|
396
|
+
configFiles: [],
|
|
397
|
+
testFiles: [],
|
|
398
|
+
apiFiles: [],
|
|
399
|
+
};
|
|
400
|
+
for (const file of files) {
|
|
401
|
+
graph.files.set(file.relativePath, {
|
|
402
|
+
path: file.relativePath,
|
|
403
|
+
imports: [],
|
|
404
|
+
importedBy: [],
|
|
405
|
+
exports: [],
|
|
406
|
+
category: 'other',
|
|
407
|
+
size: file.size,
|
|
408
|
+
priority: 50,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
return graph;
|
|
412
|
+
}
|
|
413
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AI Analyzer module
|
|
3
|
-
*
|
|
3
|
+
* Multi-pass AI-powered code review using OpenRouter
|
|
4
4
|
*/
|
|
5
5
|
import type { AnalysisContext, AnalysisResult, AIConfig } from '../../../types/index.js';
|
|
6
6
|
import { BaseAnalyzer } from '../types.js';
|
|
7
7
|
/**
|
|
8
|
-
* AI-powered code analyzer using OpenRouter
|
|
8
|
+
* Multi-pass AI-powered code analyzer using OpenRouter
|
|
9
9
|
*/
|
|
10
10
|
export declare class AIAnalyzer extends BaseAnalyzer {
|
|
11
11
|
private config;
|
|
12
12
|
readonly name = "ai";
|
|
13
13
|
readonly phase: "ai";
|
|
14
|
-
readonly description = "AI-powered code review using OpenRouter";
|
|
14
|
+
readonly description = "Multi-pass AI-powered code review using OpenRouter";
|
|
15
|
+
/** Store static analysis findings from previous phase */
|
|
16
|
+
private staticFindings;
|
|
15
17
|
constructor(config: AIConfig);
|
|
16
18
|
analyze(context: AnalysisContext): Promise<AnalysisResult>;
|
|
17
19
|
/**
|
|
18
|
-
*
|
|
19
|
-
* Respects size limits and filters appropriately
|
|
20
|
+
* Run a single AI pass
|
|
20
21
|
*/
|
|
21
|
-
private
|
|
22
|
+
private runPass;
|
|
23
|
+
/**
|
|
24
|
+
* Get dependency graph from context or previous results
|
|
25
|
+
*/
|
|
26
|
+
private getDependencyGraph;
|
|
27
|
+
/**
|
|
28
|
+
* Get static findings from previous phase
|
|
29
|
+
*/
|
|
30
|
+
private getStaticFindings;
|
|
31
|
+
/**
|
|
32
|
+
* Deduplicate findings from multiple passes
|
|
33
|
+
* Keeps the highest severity if duplicates found
|
|
34
|
+
*/
|
|
35
|
+
private deduplicateFindings;
|
|
36
|
+
/**
|
|
37
|
+
* Normalize message for deduplication comparison
|
|
38
|
+
*/
|
|
39
|
+
private normalizeMessage;
|
|
22
40
|
}
|
|
23
41
|
/**
|
|
24
42
|
* Create an AI analyzer with the given configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,QAAQ,EAMT,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAc3C;;GAEG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAQ9B,OAAO,CAAC,MAAM;IAP1B,QAAQ,CAAC,IAAI,QAAQ;IACrB,QAAQ,CAAC,KAAK,EAAG,IAAI,CAAU;IAC/B,QAAQ,CAAC,WAAW,wDAAwD;IAE5E,yDAAyD;IACzD,OAAO,CAAC,cAAc,CAAiB;gBAEnB,MAAM,EAAE,QAAQ;IAI9B,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IA8GhE;;OAEG;YACW,OAAO;IA+DrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA2B3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAOzB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAE7D;AAGD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|