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.
@@ -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
- * Uses OpenRouter to perform AI-powered code review
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
- * Load file contents for AI analysis
19
- * Respects size limits and filters appropriately
20
+ * Run a single AI pass
20
21
  */
21
- private loadFileContents;
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;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAqB,MAAM,yBAAyB,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAW3C;;GAEG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAK9B,OAAO,CAAC,MAAM;IAJ1B,QAAQ,CAAC,IAAI,QAAQ;IACrB,QAAQ,CAAC,KAAK,EAAG,IAAI,CAAU;IAC/B,QAAQ,CAAC,WAAW,6CAA6C;gBAE7C,MAAM,EAAE,QAAQ;IAI9B,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAyFhE;;;OAGG;YACW,gBAAgB;CAyC/B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAE7D;AAGD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
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"}