atlas-pipeline-mcp 1.0.20 → 1.0.21

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,385 @@
1
+ /**
2
+ * Atlas Server - Performance Profiling and Analysis Tool
3
+ *
4
+ * Advanced performance profiling for code optimization:
5
+ * - Time complexity analysis
6
+ * - Space complexity analysis
7
+ * - Benchmark generation
8
+ * - Memory leak detection
9
+ * - CPU hotspot identification
10
+ * - I/O bottleneck detection
11
+ * - Algorithm efficiency suggestions
12
+ * - Big-O notation analysis
13
+ *
14
+ * @module profiler
15
+ * @author Nishant Unavane
16
+ * @version 1.0.0
17
+ */
18
+ import { getActiveProvider, isNoLLMMode } from '../providers/index.js';
19
+ import { logger, createTimer } from '../utils.js';
20
+ import { z } from 'zod';
21
+ // ============================================================================
22
+ // Validation Schema
23
+ // ============================================================================
24
+ const ProfileOptionsSchema = z.object({
25
+ code: z.string().min(1).max(500000),
26
+ language: z.string().min(1),
27
+ filePath: z.string().optional(),
28
+ analyzeTime: z.boolean().optional(),
29
+ analyzeSpace: z.boolean().optional(),
30
+ detectLeaks: z.boolean().optional(),
31
+ identifyHotspots: z.boolean().optional(),
32
+ generateBenchmark: z.boolean().optional(),
33
+ inputSizes: z.array(z.number()).optional(),
34
+ expectedInputSize: z.enum(['small', 'medium', 'large', 'huge']).optional(),
35
+ constraints: z.array(z.string()).optional(),
36
+ });
37
+ // ============================================================================
38
+ // Static Code Analysis
39
+ // ============================================================================
40
+ /**
41
+ * Analyze code structure for performance patterns
42
+ */
43
+ function analyzeCodeStructure(code, language) {
44
+ // Count loops
45
+ const loopPatterns = /\b(for|while|forEach|map|filter|reduce|each)\b/gi;
46
+ const loops = (code.match(loopPatterns) || []).length;
47
+ // Detect nested loops (simplified)
48
+ const nestedLoopPattern = /\b(for|while)\b[^{]*{[^}]*(for|while)\b/gis;
49
+ const nestedLoops = (code.match(nestedLoopPattern) || []).length;
50
+ // Detect recursion
51
+ const functionNames = [...code.matchAll(/(?:function|def|fn)\s+(\w+)/g)].map(m => m[1]);
52
+ const recursiveCalls = functionNames.filter(name => new RegExp(`\\b${name}\\s*\\(`).test(code)).length;
53
+ // Detect I/O operations
54
+ const ioOperations = [];
55
+ // File I/O
56
+ if (code.match(/\b(readFile|writeFile|open|read|write|createWriteStream)\b/i)) {
57
+ ioOperations.push({
58
+ type: 'file',
59
+ operation: 'File I/O detected',
60
+ isBlocking: code.includes('Sync') || code.includes('await'),
61
+ isRepeated: /\b(for|while)[^{]*{[^}]*(read|write)/i.test(code),
62
+ });
63
+ }
64
+ // Network I/O
65
+ if (code.match(/\b(fetch|axios|request|http\.get|http\.post)\b/i)) {
66
+ ioOperations.push({
67
+ type: 'network',
68
+ operation: 'Network request detected',
69
+ isBlocking: code.includes('await') || code.includes('.then('),
70
+ isRepeated: /\b(for|while)[^{]*{[^}]*(fetch|request)/i.test(code),
71
+ });
72
+ }
73
+ // Database operations
74
+ if (code.match(/\b(query|execute|find|findOne|insert|update|delete|aggregate)\b/i)) {
75
+ ioOperations.push({
76
+ type: 'database',
77
+ operation: 'Database query detected',
78
+ isBlocking: true,
79
+ isRepeated: /\b(for|while)[^{]*{[^}]*(query|find)/i.test(code),
80
+ });
81
+ }
82
+ return { loops, nestedLoops, recursiveCalls, ioOperations };
83
+ }
84
+ /**
85
+ * Estimate Big-O complexity from code structure
86
+ */
87
+ function estimateComplexity(structure) {
88
+ const { loops, nestedLoops, recursiveCalls, ioOperations } = structure;
89
+ let timeComplexity = 'O(1)';
90
+ let spaceComplexity = 'O(1)';
91
+ let confidence = 0.6;
92
+ // Time complexity estimation
93
+ if (nestedLoops >= 3) {
94
+ timeComplexity = 'O(n³) or worse';
95
+ confidence = 0.7;
96
+ }
97
+ else if (nestedLoops >= 2) {
98
+ timeComplexity = 'O(n²)';
99
+ confidence = 0.75;
100
+ }
101
+ else if (nestedLoops === 1 || loops > 1) {
102
+ timeComplexity = 'O(n log n) or O(n²)';
103
+ confidence = 0.65;
104
+ }
105
+ else if (loops === 1) {
106
+ timeComplexity = 'O(n)';
107
+ confidence = 0.8;
108
+ }
109
+ else if (recursiveCalls > 0) {
110
+ timeComplexity = 'O(2ⁿ) or O(n!)';
111
+ confidence = 0.5;
112
+ }
113
+ // Space complexity estimation
114
+ if (recursiveCalls > 0) {
115
+ spaceComplexity = 'O(n) recursion stack';
116
+ confidence = Math.min(confidence, 0.7);
117
+ }
118
+ else if (loops > 0) {
119
+ spaceComplexity = 'O(n) or O(1)';
120
+ confidence = Math.min(confidence, 0.6);
121
+ }
122
+ return { time: timeComplexity, space: spaceComplexity, confidence };
123
+ }
124
+ /**
125
+ * Detect memory leak patterns
126
+ */
127
+ function detectMemoryLeaks(code, language) {
128
+ let riskScore = 0;
129
+ // Global variable accumulation
130
+ if (code.match(/\b(global|window)\.\w+\s*=\s*\[/)) {
131
+ riskScore += 3;
132
+ }
133
+ // Event listeners without cleanup
134
+ if (code.match(/addEventListener/) && !code.match(/removeEventListener/)) {
135
+ riskScore += 2;
136
+ }
137
+ // Timers without cleanup
138
+ if ((code.match(/setInterval|setTimeout/) || []).length >
139
+ (code.match(/clearInterval|clearTimeout/) || []).length) {
140
+ riskScore += 2;
141
+ }
142
+ // Circular references
143
+ if (code.match(/\w+\.\w+\s*=\s*\w+/) && code.match(/\w+\.\w+\s*=\s*this/)) {
144
+ riskScore += 1;
145
+ }
146
+ // Unbounded collections
147
+ if (code.match(/\[\]\.push|Map\(\)|Set\(\)/) && !code.match(/clear|delete|splice/)) {
148
+ riskScore += 2;
149
+ }
150
+ if (riskScore >= 6)
151
+ return 'high';
152
+ if (riskScore >= 4)
153
+ return 'medium';
154
+ if (riskScore >= 2)
155
+ return 'low';
156
+ return 'none';
157
+ }
158
+ // ============================================================================
159
+ // Main Profile Function
160
+ // ============================================================================
161
+ /**
162
+ * Comprehensive performance profiling and analysis
163
+ */
164
+ export async function profileCode(options) {
165
+ const timer = createTimer();
166
+ const { code, language, filePath, analyzeTime = true, analyzeSpace = true, detectLeaks = true, identifyHotspots = true, generateBenchmark = false, inputSizes = [10, 100, 1000, 10000], expectedInputSize = 'medium', constraints = [], } = ProfileOptionsSchema.parse(options);
167
+ logger.info({ language, filePath }, 'Starting performance profiling');
168
+ const warnings = [];
169
+ // Static analysis
170
+ const structure = analyzeCodeStructure(code, language);
171
+ const complexity = estimateComplexity(structure);
172
+ const memoryLeakRisk = detectLeaks ? detectMemoryLeaks(code, language) : 'none';
173
+ // Build analysis prompt
174
+ const prompt = `You are a performance optimization expert with 50 years of experience. Analyze this ${language} code for performance.
175
+
176
+ **Code:**
177
+ \`\`\`${language}
178
+ ${code}
179
+ \`\`\`
180
+
181
+ **Static Analysis:**
182
+ - Loops detected: ${structure.loops}
183
+ - Nested loops: ${structure.nestedLoops}
184
+ - Recursive calls: ${structure.recursiveCalls}
185
+ - I/O operations: ${structure.ioOperations.length}
186
+ - Estimated time complexity: ${complexity.time}
187
+ - Estimated space complexity: ${complexity.space}
188
+ - Memory leak risk: ${memoryLeakRisk}
189
+ - Expected input size: ${expectedInputSize}
190
+
191
+ **I/O Operations:**
192
+ ${structure.ioOperations.map(io => `- ${io.type} (${io.isBlocking ? 'blocking' : 'non-blocking'}${io.isRepeated ? ', repeated' : ''})`).join('\n') || '- None detected'}
193
+
194
+ **Constraints:**
195
+ ${constraints.length > 0 ? constraints.join('\n') : '- None specified'}
196
+
197
+ **Tasks:**
198
+ 1. Analyze time complexity (Big-O notation) for best, average, and worst cases
199
+ 2. Analyze space complexity
200
+ 3. Identify performance hotspots (CPU, memory, I/O)
201
+ 4. Provide optimization suggestions ranked by impact
202
+ 5. ${generateBenchmark ? 'Generate benchmark code' : ''}
203
+
204
+ **Format your response as:**
205
+
206
+ TIME_COMPLEXITY:
207
+ Best: O(...)
208
+ Average: O(...)
209
+ Worst: O(...)
210
+ Explanation: [why this complexity]
211
+
212
+ SPACE_COMPLEXITY:
213
+ Best: O(...)
214
+ Average: O(...)
215
+ Worst: O(...)
216
+ Explanation: [why this complexity]
217
+
218
+ HOTSPOTS:
219
+ - [location]: [type] - [description] - Impact: [X%]
220
+ ...
221
+
222
+ OPTIMIZATIONS:
223
+ Priority 1: [category] - [description] - Gain: [X%]
224
+ Priority 2: [category] - [description] - Gain: [X%]
225
+ ...
226
+
227
+ ${generateBenchmark ? `BENCHMARK:
228
+ \`\`\`${language}
229
+ [benchmark code here]
230
+ \`\`\`
231
+ ` : ''}`;
232
+ let analysis = {
233
+ timeComplexity: {
234
+ bigO: complexity.time,
235
+ bestCase: complexity.time,
236
+ averageCase: complexity.time,
237
+ worstCase: complexity.time,
238
+ explanation: 'Static analysis estimate',
239
+ confidence: complexity.confidence,
240
+ },
241
+ spaceComplexity: {
242
+ bigO: complexity.space,
243
+ bestCase: complexity.space,
244
+ averageCase: complexity.space,
245
+ worstCase: complexity.space,
246
+ explanation: 'Static analysis estimate',
247
+ confidence: complexity.confidence,
248
+ },
249
+ potentialBottlenecks: [],
250
+ memoryLeakRisk,
251
+ ioOperations: structure.ioOperations,
252
+ };
253
+ let hotspots = [];
254
+ let suggestions = [];
255
+ let benchmarkCode;
256
+ if (isNoLLMMode()) {
257
+ warnings.push('No LLM provider - using static analysis only');
258
+ // Add basic suggestions based on static analysis
259
+ if (structure.nestedLoops >= 2) {
260
+ suggestions.push({
261
+ priority: 9,
262
+ category: 'algorithm',
263
+ description: 'Nested loops detected - consider using hash maps or better algorithm',
264
+ estimatedGain: '10-100x faster',
265
+ });
266
+ }
267
+ if (structure.ioOperations.some(io => io.isRepeated)) {
268
+ suggestions.push({
269
+ priority: 10,
270
+ category: 'io',
271
+ description: 'Repeated I/O operations in loop - batch or cache results',
272
+ estimatedGain: '5-50x faster',
273
+ });
274
+ }
275
+ if (memoryLeakRisk === 'high' || memoryLeakRisk === 'medium') {
276
+ suggestions.push({
277
+ priority: 8,
278
+ category: 'memory',
279
+ description: 'High memory leak risk - add cleanup for timers/listeners',
280
+ estimatedGain: 'Prevents memory growth',
281
+ });
282
+ }
283
+ }
284
+ else {
285
+ const provider = await getActiveProvider();
286
+ try {
287
+ const response = await provider.complete(prompt, {
288
+ maxTokens: 3000,
289
+ temperature: 0.2,
290
+ });
291
+ const responseText = response.text;
292
+ // Parse time complexity
293
+ const timeMatch = responseText.match(/TIME_COMPLEXITY:\s*Best:\s*([^\n]+)\s*Average:\s*([^\n]+)\s*Worst:\s*([^\n]+)\s*Explanation:\s*([^\n]+)/i);
294
+ if (timeMatch && timeMatch[1] && timeMatch[2] && timeMatch[3] && timeMatch[4]) {
295
+ analysis.timeComplexity = {
296
+ bigO: timeMatch[2].trim(),
297
+ bestCase: timeMatch[1].trim(),
298
+ averageCase: timeMatch[2].trim(),
299
+ worstCase: timeMatch[3].trim(),
300
+ explanation: timeMatch[4].trim(),
301
+ confidence: 0.85,
302
+ };
303
+ }
304
+ // Parse space complexity
305
+ const spaceMatch = responseText.match(/SPACE_COMPLEXITY:\s*Best:\s*([^\n]+)\s*Average:\s*([^\n]+)\s*Worst:\s*([^\n]+)\s*Explanation:\s*([^\n]+)/i);
306
+ if (spaceMatch && spaceMatch[1] && spaceMatch[2] && spaceMatch[3] && spaceMatch[4]) {
307
+ analysis.spaceComplexity = {
308
+ bigO: spaceMatch[2].trim(),
309
+ bestCase: spaceMatch[1].trim(),
310
+ averageCase: spaceMatch[2].trim(),
311
+ worstCase: spaceMatch[3].trim(),
312
+ explanation: spaceMatch[4].trim(),
313
+ confidence: 0.85,
314
+ };
315
+ }
316
+ // Parse hotspots
317
+ const hotspotsMatch = responseText.match(/HOTSPOTS:\s*([\s\S]*?)(?:OPTIMIZATIONS:|$)/i);
318
+ if (hotspotsMatch && hotspotsMatch[1]) {
319
+ const hotspotLines = hotspotsMatch[1].trim().split('\n')
320
+ .filter((line) => line.trim().startsWith('-'));
321
+ hotspots = hotspotLines.map((line) => {
322
+ const clean = line.replace(/^-\s*/, '').trim();
323
+ const parts = clean.split(' - ');
324
+ return {
325
+ location: parts[0] || 'Unknown',
326
+ type: parts[1]?.toLowerCase() || 'cpu',
327
+ severity: 'high',
328
+ description: parts[2] || clean,
329
+ estimatedImpact: parts[3] || 'Unknown',
330
+ };
331
+ });
332
+ }
333
+ // Parse optimizations
334
+ const optsMatch = responseText.match(/OPTIMIZATIONS:\s*([\s\S]*?)(?:BENCHMARK:|$)/i);
335
+ if (optsMatch && optsMatch[1]) {
336
+ const optLines = optsMatch[1].trim().split('\n')
337
+ .filter((line) => /Priority\s+\d+:/i.test(line));
338
+ suggestions = optLines.map((line) => {
339
+ const priorityMatch = line.match(/Priority\s+(\d+):/i);
340
+ const priority = priorityMatch ? parseInt(priorityMatch[1] || '5') : 5;
341
+ const parts = line.split(' - ');
342
+ const categoryPart = parts[0]?.split(':')[1]?.trim() || 'algorithm';
343
+ return {
344
+ priority,
345
+ category: categoryPart.toLowerCase(),
346
+ description: parts[1] || line,
347
+ estimatedGain: parts[2] || 'Unknown',
348
+ };
349
+ }).sort((a, b) => b.priority - a.priority);
350
+ }
351
+ // Parse benchmark code
352
+ if (generateBenchmark) {
353
+ const benchMatch = responseText.match(/BENCHMARK:\s*```[\w]*\s*([\s\S]*?)```/i);
354
+ if (benchMatch && benchMatch[1]) {
355
+ benchmarkCode = benchMatch[1].trim();
356
+ }
357
+ }
358
+ }
359
+ catch (error) {
360
+ logger.error({ error }, 'Profiling failed');
361
+ warnings.push(`LLM error: ${error instanceof Error ? error.message : 'Unknown'}`);
362
+ }
363
+ }
364
+ const executionTimeMs = timer.elapsed();
365
+ logger.info({
366
+ timeComplexity: analysis.timeComplexity.bigO,
367
+ hotspots: hotspots.length,
368
+ suggestions: suggestions.length,
369
+ executionTimeMs
370
+ }, 'Profiling completed');
371
+ return {
372
+ code,
373
+ analysis,
374
+ hotspots,
375
+ suggestions,
376
+ benchmarkCode,
377
+ executionTimeMs,
378
+ warnings,
379
+ };
380
+ }
381
+ // ============================================================================
382
+ // Export
383
+ // ============================================================================
384
+ export default profileCode;
385
+ //# sourceMappingURL=profiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.js","sourceRoot":"","sources":["../../src/tools/profiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqGxB,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACpC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACxC,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACzC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1C,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC1E,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAAY,EAAE,QAAgB;IAM1D,cAAc;IACd,MAAM,YAAY,GAAG,kDAAkD,CAAC;IACxE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAEtD,mCAAmC;IACnC,MAAM,iBAAiB,GAAG,4CAA4C,CAAC;IACvE,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjE,mBAAmB;IACnB,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACjD,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3C,CAAC,MAAM,CAAC;IAET,wBAAwB;IACxB,MAAM,YAAY,GAAkB,EAAE,CAAC;IAEvC,WAAW;IACX,IAAI,IAAI,CAAC,KAAK,CAAC,6DAA6D,CAAC,EAAE,CAAC;QAC9E,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,mBAAmB;YAC9B,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC3D,UAAU,EAAE,uCAAuC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;IAED,cAAc;IACd,IAAI,IAAI,CAAC,KAAK,CAAC,iDAAiD,CAAC,EAAE,CAAC;QAClE,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,0BAA0B;YACrC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7D,UAAU,EAAE,0CAA0C,CAAC,IAAI,CAAC,IAAI,CAAC;SAClE,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,IAAI,IAAI,CAAC,KAAK,CAAC,kEAAkE,CAAC,EAAE,CAAC;QACnF,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,yBAAyB;YACpC,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,uCAAuC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,SAAkD;IAK5E,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IAEvE,IAAI,cAAc,GAAG,MAAM,CAAC;IAC5B,IAAI,eAAe,GAAG,MAAM,CAAC;IAC7B,IAAI,UAAU,GAAG,GAAG,CAAC;IAErB,6BAA6B;IAC7B,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,cAAc,GAAG,gBAAgB,CAAC;QAClC,UAAU,GAAG,GAAG,CAAC;IACnB,CAAC;SAAM,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QAC5B,cAAc,GAAG,OAAO,CAAC;QACzB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;SAAM,IAAI,WAAW,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,cAAc,GAAG,qBAAqB,CAAC;QACvC,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;SAAM,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QACvB,cAAc,GAAG,MAAM,CAAC;QACxB,UAAU,GAAG,GAAG,CAAC;IACnB,CAAC;SAAM,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QAC9B,cAAc,GAAG,gBAAgB,CAAC;QAClC,UAAU,GAAG,GAAG,CAAC;IACnB,CAAC;IAED,8BAA8B;IAC9B,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,eAAe,GAAG,sBAAsB,CAAC;QACzC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;SAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACrB,eAAe,GAAG,cAAc,CAAC;QACjC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,QAAgB;IACvD,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,+BAA+B;IAC/B,IAAI,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE,CAAC;QAClD,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACzE,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM;QACnD,CAAC,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5D,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,sBAAsB;IACtB,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC1E,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,wBAAwB;IACxB,IAAI,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACnF,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAuB;IACvD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAE5B,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,WAAW,GAAG,IAAI,EAClB,YAAY,GAAG,IAAI,EACnB,WAAW,GAAG,IAAI,EAClB,gBAAgB,GAAG,IAAI,EACvB,iBAAiB,GAAG,KAAK,EACzB,UAAU,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,EACnC,iBAAiB,GAAG,QAAQ,EAC5B,WAAW,GAAG,EAAE,GACjB,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,gCAAgC,CAAC,CAAC;IAEtE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,kBAAkB;IAClB,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAEhF,wBAAwB;IACxB,MAAM,MAAM,GAAG,uFAAuF,QAAQ;;;QAGxG,QAAQ;EACd,IAAI;;;;oBAIc,SAAS,CAAC,KAAK;kBACjB,SAAS,CAAC,WAAW;qBAClB,SAAS,CAAC,cAAc;oBACzB,SAAS,CAAC,YAAY,CAAC,MAAM;+BAClB,UAAU,CAAC,IAAI;gCACd,UAAU,CAAC,KAAK;sBAC1B,cAAc;yBACX,iBAAiB;;;EAGxC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB;;;EAGrK,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB;;;;;;;KAOjE,iBAAiB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;EAyBrD,iBAAiB,CAAC,CAAC,CAAC;QACd,QAAQ;;;CAGf,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAEP,IAAI,QAAQ,GAAwB;QAClC,cAAc,EAAE;YACd,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,QAAQ,EAAE,UAAU,CAAC,IAAI;YACzB,WAAW,EAAE,UAAU,CAAC,IAAI;YAC5B,SAAS,EAAE,UAAU,CAAC,IAAI;YAC1B,WAAW,EAAE,0BAA0B;YACvC,UAAU,EAAE,UAAU,CAAC,UAAU;SAClC;QACD,eAAe,EAAE;YACf,IAAI,EAAE,UAAU,CAAC,KAAK;YACtB,QAAQ,EAAE,UAAU,CAAC,KAAK;YAC1B,WAAW,EAAE,UAAU,CAAC,KAAK;YAC7B,SAAS,EAAE,UAAU,CAAC,KAAK;YAC3B,WAAW,EAAE,0BAA0B;YACvC,UAAU,EAAE,UAAU,CAAC,UAAU;SAClC;QACD,oBAAoB,EAAE,EAAE;QACxB,cAAc;QACd,YAAY,EAAE,SAAS,CAAC,YAAY;KACrC,CAAC;IAEF,IAAI,QAAQ,GAAyB,EAAE,CAAC;IACxC,IAAI,WAAW,GAA6B,EAAE,CAAC;IAC/C,IAAI,aAAiC,CAAC;IAEtC,IAAI,WAAW,EAAE,EAAE,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAE9D,iDAAiD;QACjD,IAAI,SAAS,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;YAC/B,WAAW,CAAC,IAAI,CAAC;gBACf,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,WAAW;gBACrB,WAAW,EAAE,sEAAsE;gBACnF,aAAa,EAAE,gBAAgB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YACrD,WAAW,CAAC,IAAI,CAAC;gBACf,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,0DAA0D;gBACvE,aAAa,EAAE,cAAc;aAC9B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,cAAc,KAAK,MAAM,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;YAC7D,WAAW,CAAC,IAAI,CAAC;gBACf,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,0DAA0D;gBACvE,aAAa,EAAE,wBAAwB;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE;gBAC/C,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,GAAG;aACjB,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;YAEnC,wBAAwB;YACxB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,0GAA0G,CAAC,CAAC;YACjJ,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9E,QAAQ,CAAC,cAAc,GAAG;oBACxB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBACzB,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC7B,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBAChC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC9B,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBAChC,UAAU,EAAE,IAAI;iBACjB,CAAC;YACJ,CAAC;YAED,yBAAyB;YACzB,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,2GAA2G,CAAC,CAAC;YACnJ,IAAI,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnF,QAAQ,CAAC,eAAe,GAAG;oBACzB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC1B,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC9B,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBACjC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC/B,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBACjC,UAAU,EAAE,IAAI;iBACjB,CAAC;YACJ,CAAC;YAED,iBAAiB;YACjB,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACxF,IAAI,aAAa,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtC,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;qBACrD,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEzD,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;oBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACjC,OAAO;wBACL,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS;wBAC/B,IAAI,EAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAU,IAAI,KAAK;wBAC/C,QAAQ,EAAE,MAAe;wBACzB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK;wBAC9B,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS;qBACvC,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;YAED,sBAAsB;YACtB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YACrF,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;qBAC7C,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAE3D,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;oBAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAChC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC;oBAEpE,OAAO;wBACL,QAAQ;wBACR,QAAQ,EAAE,YAAY,CAAC,WAAW,EAA0B;wBAC5D,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;wBAC7B,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS;qBACrC,CAAC;gBACJ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YACvD,CAAC;YAED,uBAAuB;YACvB,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAChF,IAAI,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChC,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,cAAc,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC;QACV,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI;QAC5C,QAAQ,EAAE,QAAQ,CAAC,MAAM;QACzB,WAAW,EAAE,WAAW,CAAC,MAAM;QAC/B,eAAe;KAChB,EAAE,qBAAqB,CAAC,CAAC;IAE1B,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,aAAa;QACb,eAAe;QACf,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,eAAe,WAAW,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Atlas Server - AI-Powered Code Refactoring Tool
3
+ *
4
+ * Advanced refactoring capabilities beyond simple code cleanup:
5
+ * - Pattern detection (design patterns, anti-patterns)
6
+ * - Complexity reduction (cyclomatic complexity analysis)
7
+ * - SOLID principles enforcement
8
+ * - Performance hotspot identification
9
+ * - Automated Extract Method/Class/Interface
10
+ * - Dead code elimination
11
+ * - Type inference and migration
12
+ * - Dependency injection suggestions
13
+ *
14
+ * @module refactor
15
+ * @author Nishant Unavane
16
+ * @version 1.0.0
17
+ */
18
+ export interface RefactorOptions {
19
+ code: string;
20
+ language: string;
21
+ filePath?: string;
22
+ targets?: RefactorTarget[];
23
+ maxComplexity?: number;
24
+ enforceSOLID?: boolean;
25
+ preserveBehavior?: boolean;
26
+ addTypes?: boolean;
27
+ modernize?: boolean;
28
+ projectContext?: string;
29
+ dependencies?: string[];
30
+ }
31
+ export type RefactorTarget = 'complexity' | 'duplication' | 'naming' | 'structure' | 'performance' | 'solid' | 'patterns' | 'types' | 'async' | 'functional' | 'deadcode';
32
+ export interface RefactorResult {
33
+ originalCode: string;
34
+ refactoredCode: string;
35
+ changes: RefactorChange[];
36
+ metrics: CodeMetrics;
37
+ suggestions: string[];
38
+ executionTimeMs: number;
39
+ warnings: string[];
40
+ }
41
+ export interface RefactorChange {
42
+ type: RefactorTarget;
43
+ description: string;
44
+ lineNumber: number;
45
+ impact: 'high' | 'medium' | 'low';
46
+ autoApplicable: boolean;
47
+ }
48
+ export interface CodeMetrics {
49
+ linesOfCode: number;
50
+ cyclomaticComplexity: number;
51
+ maintainabilityIndex: number;
52
+ duplicatedLines: number;
53
+ functionCount: number;
54
+ classCount: number;
55
+ commentRatio: number;
56
+ testCoverage?: number;
57
+ }
58
+ /**
59
+ * AI-powered code refactoring with pattern detection
60
+ */
61
+ export declare function refactorCode(options: RefactorOptions): Promise<RefactorResult>;
62
+ export default refactorCode;
63
+ //# sourceMappingURL=refactor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor.d.ts","sourceRoot":"","sources":["../../src/tools/refactor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAWH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAG3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,cAAc,GACtB,YAAY,GACZ,aAAa,GACb,QAAQ,GACR,WAAW,GACX,aAAa,GACb,OAAO,GACP,UAAU,GACV,OAAO,GACP,OAAO,GACP,YAAY,GACZ,UAAU,CAAC;AAEf,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA0HD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoLpF;AA2BD,eAAe,YAAY,CAAC"}