@opencodereview/core 2.0.1 → 2.1.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.
Files changed (73) hide show
  1. package/dist/ai/v4/index.d.ts +3 -1
  2. package/dist/ai/v4/index.d.ts.map +1 -1
  3. package/dist/ai/v4/index.js +2 -0
  4. package/dist/ai/v4/index.js.map +1 -1
  5. package/dist/ai/v4/llm/index.d.ts +1 -0
  6. package/dist/ai/v4/llm/index.d.ts.map +1 -1
  7. package/dist/ai/v4/llm/index.js +1 -0
  8. package/dist/ai/v4/llm/index.js.map +1 -1
  9. package/dist/ai/v4/llm/provider-factory.d.ts +59 -0
  10. package/dist/ai/v4/llm/provider-factory.d.ts.map +1 -0
  11. package/dist/ai/v4/llm/provider-factory.js +87 -0
  12. package/dist/ai/v4/llm/provider-factory.js.map +1 -0
  13. package/dist/ai/v4/pipeline.d.ts.map +1 -1
  14. package/dist/ai/v4/pipeline.js +2 -8
  15. package/dist/ai/v4/pipeline.js.map +1 -1
  16. package/dist/ai/v4/types.d.ts +42 -7
  17. package/dist/ai/v4/types.d.ts.map +1 -1
  18. package/dist/ai/v4/types.js +40 -1
  19. package/dist/ai/v4/types.js.map +1 -1
  20. package/dist/ai-healer/auto-fix-engine.d.ts +98 -0
  21. package/dist/ai-healer/auto-fix-engine.d.ts.map +1 -0
  22. package/dist/ai-healer/auto-fix-engine.js +371 -0
  23. package/dist/ai-healer/auto-fix-engine.js.map +1 -0
  24. package/dist/ai-healer/heal-reporter.d.ts +22 -0
  25. package/dist/ai-healer/heal-reporter.d.ts.map +1 -0
  26. package/dist/ai-healer/heal-reporter.js +137 -0
  27. package/dist/ai-healer/heal-reporter.js.map +1 -0
  28. package/dist/ai-healer/ide-rules-generator.d.ts +46 -0
  29. package/dist/ai-healer/ide-rules-generator.d.ts.map +1 -0
  30. package/dist/ai-healer/ide-rules-generator.js +214 -0
  31. package/dist/ai-healer/ide-rules-generator.js.map +1 -0
  32. package/dist/config/v4-config.d.ts +3 -1
  33. package/dist/config/v4-config.d.ts.map +1 -1
  34. package/dist/config/v4-config.js.map +1 -1
  35. package/dist/detectors/registry/go-packages.d.ts +16 -0
  36. package/dist/detectors/registry/go-packages.d.ts.map +1 -0
  37. package/dist/detectors/registry/go-packages.js +181 -0
  38. package/dist/detectors/registry/go-packages.js.map +1 -0
  39. package/dist/detectors/registry/java-packages.d.ts +16 -0
  40. package/dist/detectors/registry/java-packages.d.ts.map +1 -0
  41. package/dist/detectors/registry/java-packages.js +144 -0
  42. package/dist/detectors/registry/java-packages.js.map +1 -0
  43. package/dist/detectors/registry/kotlin-packages.d.ts +15 -0
  44. package/dist/detectors/registry/kotlin-packages.d.ts.map +1 -0
  45. package/dist/detectors/registry/kotlin-packages.js +125 -0
  46. package/dist/detectors/registry/kotlin-packages.js.map +1 -0
  47. package/dist/detectors/registry/python-packages.d.ts +16 -0
  48. package/dist/detectors/registry/python-packages.d.ts.map +1 -0
  49. package/dist/detectors/registry/python-packages.js +113 -0
  50. package/dist/detectors/registry/python-packages.js.map +1 -0
  51. package/dist/detectors/v4/index.d.ts +5 -0
  52. package/dist/detectors/v4/index.d.ts.map +1 -1
  53. package/dist/detectors/v4/index.js +10 -0
  54. package/dist/detectors/v4/index.js.map +1 -1
  55. package/dist/detectors/v4/language-specific.d.ts +47 -0
  56. package/dist/detectors/v4/language-specific.d.ts.map +1 -0
  57. package/dist/detectors/v4/language-specific.js +560 -0
  58. package/dist/detectors/v4/language-specific.js.map +1 -0
  59. package/dist/detectors/v4/security-pattern.d.ts.map +1 -1
  60. package/dist/detectors/v4/security-pattern.js +91 -0
  61. package/dist/detectors/v4/security-pattern.js.map +1 -1
  62. package/dist/detectors/v4/stale-api.d.ts.map +1 -1
  63. package/dist/detectors/v4/stale-api.js +21 -0
  64. package/dist/detectors/v4/stale-api.js.map +1 -1
  65. package/dist/index.d.ts +6 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +4 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/scanner/v4-scanner.d.ts +3 -1
  70. package/dist/scanner/v4-scanner.d.ts.map +1 -1
  71. package/dist/scanner/v4-scanner.js +1 -0
  72. package/dist/scanner/v4-scanner.js.map +1 -1
  73. package/package.json +22 -10
@@ -0,0 +1,371 @@
1
+ /**
2
+ * AI Auto-Fix Engine
3
+ *
4
+ * Executes AI-powered fixes on files that scored below the threshold.
5
+ * Uses existing AI providers (Ollama/OpenAI) and PromptBuilder.
6
+ */
7
+ import { readFileSync, writeFileSync, copyFileSync, mkdirSync, existsSync } from 'node:fs';
8
+ import { resolve, dirname, join } from 'node:path';
9
+ import { OllamaProvider } from '../ai/ollama-provider.js';
10
+ import { PromptBuilder } from './prompt-builder.js';
11
+ // ─── Diff Utility ──────────────────────────────────────────────────
12
+ /**
13
+ * Generate a simple unified-style diff between two strings.
14
+ */
15
+ export function simpleDiff(original, fixed, filename) {
16
+ const origLines = original.split('\n');
17
+ const fixedLines = fixed.split('\n');
18
+ const lines = [];
19
+ lines.push(`--- ${filename} (original)`);
20
+ lines.push(`+++ ${filename} (fixed)`);
21
+ // Simple line-by-line diff
22
+ const maxLen = Math.max(origLines.length, fixedLines.length);
23
+ let contextLines = 0;
24
+ let inHunk = false;
25
+ let hunkStart = 0;
26
+ for (let i = 0; i < maxLen; i++) {
27
+ const origLine = i < origLines.length ? origLines[i] : null;
28
+ const fixedLine = i < fixedLines.length ? fixedLines[i] : null;
29
+ if (origLine !== fixedLine) {
30
+ if (!inHunk) {
31
+ hunkStart = Math.max(0, i - 2);
32
+ lines.push(`@@ -${hunkStart + 1},${Math.min(3, origLines.length - hunkStart)} +${hunkStart + 1},${Math.min(3, fixedLines.length - hunkStart)} @@`);
33
+ // Context lines before
34
+ for (let c = hunkStart; c < i; c++) {
35
+ lines.push(` ${origLines[c]}`);
36
+ }
37
+ inHunk = true;
38
+ }
39
+ if (origLine !== null)
40
+ lines.push(`-${origLine}`);
41
+ if (fixedLine !== null)
42
+ lines.push(`+${fixedLine}`);
43
+ contextLines = 0;
44
+ }
45
+ else {
46
+ contextLines++;
47
+ if (inHunk && contextLines > 2) {
48
+ inHunk = false;
49
+ }
50
+ if (inHunk) {
51
+ lines.push(` ${origLine}`);
52
+ }
53
+ }
54
+ }
55
+ return lines.join('\n');
56
+ }
57
+ // ─── AI Code Generation ────────────────────────────────────────────
58
+ /**
59
+ * Call an AI provider to generate fixed code based on a prompt and source.
60
+ */
61
+ async function generateFixedCode(prompt, source, filename, options) {
62
+ const fullPrompt = `${prompt}
63
+
64
+ Here is the file content to fix:
65
+
66
+ \`\`\`
67
+ ${source}
68
+ \`\`\`
69
+
70
+ Return ONLY the complete fixed file content. Do NOT include explanations, markdown fences, or any text outside the code block. Return the raw code only.`;
71
+ // Try providers based on strategy
72
+ const strategy = options.strategy || 'local-first';
73
+ if (strategy === 'local-first' || strategy === 'local-only') {
74
+ try {
75
+ const result = await callOllama(fullPrompt, options);
76
+ return { code: result, provider: 'ollama', model: options.ollamaModel || 'codellama:13b' };
77
+ }
78
+ catch (err) {
79
+ if (strategy === 'local-only')
80
+ throw err;
81
+ // Fall through to remote
82
+ }
83
+ }
84
+ if (strategy === 'remote-first' || strategy === 'remote-only') {
85
+ try {
86
+ const result = await callOpenAI(fullPrompt, options);
87
+ return { code: result, provider: 'openai', model: options.openaiModel || 'gpt-4o-mini' };
88
+ }
89
+ catch (err) {
90
+ if (strategy === 'remote-only')
91
+ throw err;
92
+ }
93
+ }
94
+ // Try remaining provider as fallback
95
+ try {
96
+ const result = await callOllama(fullPrompt, options);
97
+ return { code: result, provider: 'ollama', model: options.ollamaModel || 'codellama:13b' };
98
+ }
99
+ catch {
100
+ // Fall through to OpenAI
101
+ }
102
+ const result = await callOpenAI(fullPrompt, options);
103
+ return { code: result, provider: 'openai', model: options.openaiModel || 'gpt-4o-mini' };
104
+ }
105
+ async function callOllama(prompt, options) {
106
+ const provider = new OllamaProvider({
107
+ endpoint: options.ollamaUrl || process.env.OCR_OLLAMA_URL,
108
+ model: options.ollamaModel || process.env.OCR_OLLAMA_MODEL || 'codellama:13b',
109
+ });
110
+ const controller = new AbortController();
111
+ const timeout = setTimeout(() => controller.abort(), 120_000);
112
+ try {
113
+ const res = await fetch(`${provider['endpoint']}/api/generate`, {
114
+ method: 'POST',
115
+ headers: { 'Content-Type': 'application/json' },
116
+ body: JSON.stringify({
117
+ model: provider['model'],
118
+ prompt,
119
+ stream: false,
120
+ options: { temperature: 0.1, num_predict: 8192 },
121
+ }),
122
+ signal: controller.signal,
123
+ });
124
+ clearTimeout(timeout);
125
+ if (!res.ok) {
126
+ const errText = await res.text().catch(() => 'unknown error');
127
+ throw new Error(`Ollama API error ${res.status}: ${errText}`);
128
+ }
129
+ const data = (await res.json());
130
+ return extractCode(data.response);
131
+ }
132
+ catch (err) {
133
+ clearTimeout(timeout);
134
+ throw err;
135
+ }
136
+ }
137
+ async function callOpenAI(prompt, options) {
138
+ const apiKey = options.openaiKey || process.env.OCR_API_KEY || process.env.OPENAI_API_KEY || '';
139
+ const model = options.openaiModel || 'gpt-4o-mini';
140
+ const endpoint = options.openaiEndpoint || 'https://api.openai.com/v1';
141
+ if (!apiKey) {
142
+ throw new Error('No API key configured for OpenAI. Set OCR_API_KEY or --ai-remote-key.');
143
+ }
144
+ const controller = new AbortController();
145
+ const timeout = setTimeout(() => controller.abort(), 120_000);
146
+ try {
147
+ const res = await fetch(`${endpoint}/chat/completions`, {
148
+ method: 'POST',
149
+ headers: {
150
+ 'Content-Type': 'application/json',
151
+ Authorization: `Bearer ${apiKey}`,
152
+ },
153
+ body: JSON.stringify({
154
+ model,
155
+ messages: [
156
+ { role: 'system', content: 'You are an expert code fixer. Return ONLY the fixed code, no explanations.' },
157
+ { role: 'user', content: prompt },
158
+ ],
159
+ temperature: 0.1,
160
+ max_tokens: 8192,
161
+ }),
162
+ signal: controller.signal,
163
+ });
164
+ clearTimeout(timeout);
165
+ if (!res.ok) {
166
+ const errText = await res.text().catch(() => 'unknown error');
167
+ throw new Error(`OpenAI API error ${res.status}: ${errText}`);
168
+ }
169
+ const data = (await res.json());
170
+ return extractCode(data.choices?.[0]?.message?.content || '');
171
+ }
172
+ catch (err) {
173
+ clearTimeout(timeout);
174
+ throw err;
175
+ }
176
+ }
177
+ /**
178
+ * Extract code from AI response (may contain markdown fences or explanations).
179
+ */
180
+ function extractCode(response) {
181
+ // Try to extract from code block
182
+ const codeBlockMatch = response.match(/```(?:\w+)?\s*\n([\s\S]*?)\n```/);
183
+ if (codeBlockMatch) {
184
+ return codeBlockMatch[1].trim();
185
+ }
186
+ // If response starts with code-like content, use it directly
187
+ const trimmed = response.trim();
188
+ if (trimmed.startsWith('import ') || trimmed.startsWith('const ') || trimmed.startsWith('function ') ||
189
+ trimmed.startsWith('export ') || trimmed.startsWith('class ') || trimmed.startsWith('#') ||
190
+ trimmed.startsWith('from ') || trimmed.startsWith('package ') || trimmed.startsWith('<') ||
191
+ trimmed.startsWith('"""') || trimmed.startsWith("'")) {
192
+ return trimmed;
193
+ }
194
+ // Fallback: return as-is
195
+ return trimmed;
196
+ }
197
+ // ─── AutoFixEngine ─────────────────────────────────────────────────
198
+ export class AutoFixEngine {
199
+ promptBuilder;
200
+ constructor() {
201
+ this.promptBuilder = new PromptBuilder();
202
+ }
203
+ /**
204
+ * Heal all files with issues in a scan report.
205
+ */
206
+ async heal(report, options) {
207
+ const threshold = options.threshold ?? 95;
208
+ const results = [];
209
+ const errors = [];
210
+ // Filter files that need healing
211
+ const filesToHeal = report.files.filter(f => f.totalScore < threshold);
212
+ if (filesToHeal.length === 0) {
213
+ return {
214
+ filesScanned: report.totalFiles,
215
+ filesToHeal: 0,
216
+ filesHealed: 0,
217
+ issuesFixed: 0,
218
+ avgScoreImprovement: 0,
219
+ results: [],
220
+ providerName: 'none',
221
+ modelName: 'none',
222
+ timestamp: new Date().toISOString(),
223
+ errors: [],
224
+ };
225
+ }
226
+ // Process each file
227
+ for (const file of filesToHeal) {
228
+ try {
229
+ const result = await this.healFile(file, options);
230
+ if (result) {
231
+ results.push(result);
232
+ }
233
+ }
234
+ catch (err) {
235
+ const msg = `Failed to heal ${file.file}: ${err instanceof Error ? err.message : String(err)}`;
236
+ errors.push(msg);
237
+ // Continue with next file
238
+ }
239
+ }
240
+ // Compute report
241
+ const filesHealed = results.filter(r => r.patches.length > 0).length;
242
+ const totalImprovement = results.reduce((sum, r) => sum + (r.fixedScore - r.originalScore), 0);
243
+ const avgImprovement = results.length > 0 ? totalImprovement / results.length : 0;
244
+ // Count "issues fixed" by summing the score improvements
245
+ const issuesFixed = results.reduce((sum, r) => sum + r.changes, 0);
246
+ return {
247
+ filesScanned: report.totalFiles,
248
+ filesToHeal: filesToHeal.length,
249
+ filesHealed,
250
+ issuesFixed,
251
+ avgScoreImprovement: Math.round(avgImprovement * 10) / 10,
252
+ results,
253
+ providerName: results[0]?.patches[0] ? (options.provider || 'auto') : 'none',
254
+ modelName: results[0] ? 'n/a' : 'none',
255
+ timestamp: new Date().toISOString(),
256
+ errors,
257
+ };
258
+ }
259
+ /**
260
+ * Heal a single file.
261
+ */
262
+ async healFile(file, options) {
263
+ const projectRoot = resolve(options.projectRoot);
264
+ const filePath = resolve(projectRoot, file.file);
265
+ // Read source
266
+ if (!existsSync(filePath)) {
267
+ throw new Error(`File not found: ${file.file}`);
268
+ }
269
+ const source = readFileSync(filePath, 'utf-8');
270
+ // Build fix prompt
271
+ const fixPrompt = this.buildFixPrompt(file, source);
272
+ // If output-prompts mode, just write the prompt file
273
+ if (options.outputPrompts) {
274
+ const outputDir = resolve(options.outputPrompts);
275
+ mkdirSync(outputDir, { recursive: true });
276
+ const promptPath = join(outputDir, `${file.file.replace(/[/\\]/g, '__')}.prompt.md`);
277
+ writeFileSync(promptPath, fixPrompt, 'utf-8');
278
+ return {
279
+ file: file.file,
280
+ originalScore: file.totalScore,
281
+ fixedScore: file.totalScore,
282
+ changes: 0,
283
+ patches: [],
284
+ errors: [],
285
+ };
286
+ }
287
+ // Call AI
288
+ const { code: fixedCode, provider: providerName, model: modelName } = await generateFixedCode(fixPrompt, source, file.file, options);
289
+ // Generate patch
290
+ const diff = simpleDiff(source, fixedCode, file.file);
291
+ const patch = {
292
+ file: file.file,
293
+ original: source,
294
+ fixed: fixedCode,
295
+ diff,
296
+ };
297
+ // Apply patch (unless dry-run)
298
+ if (!options.dryRun && source !== fixedCode) {
299
+ // Backup original
300
+ try {
301
+ copyFileSync(filePath, `${filePath}.bak`);
302
+ }
303
+ catch {
304
+ // Ignore backup errors
305
+ }
306
+ writeFileSync(filePath, fixedCode, 'utf-8');
307
+ }
308
+ // Count changes (lines changed)
309
+ const origLines = source.split('\n');
310
+ const fixedLines = fixedCode.split('\n');
311
+ let changes = 0;
312
+ const maxLen = Math.max(origLines.length, fixedLines.length);
313
+ for (let i = 0; i < maxLen; i++) {
314
+ if (origLines[i] !== fixedLines[i])
315
+ changes++;
316
+ }
317
+ return {
318
+ file: file.file,
319
+ originalScore: file.totalScore,
320
+ fixedScore: options.dryRun ? file.totalScore : Math.min(100, file.totalScore + Math.round(changes * 0.5)),
321
+ changes,
322
+ patches: source !== fixedCode ? [patch] : [],
323
+ errors: [],
324
+ };
325
+ }
326
+ /**
327
+ * Apply patches to files (batch mode).
328
+ */
329
+ async applyPatches(patches, projectRoot) {
330
+ for (const patch of patches) {
331
+ const filePath = resolve(projectRoot, patch.file);
332
+ mkdirSync(dirname(filePath), { recursive: true });
333
+ try {
334
+ copyFileSync(filePath, `${filePath}.bak`);
335
+ }
336
+ catch {
337
+ // Ignore backup errors
338
+ }
339
+ writeFileSync(filePath, patch.fixed, 'utf-8');
340
+ }
341
+ }
342
+ /**
343
+ * Build a fix prompt for a file using PromptBuilder + source context.
344
+ */
345
+ buildFixPrompt(file, source) {
346
+ // Use PromptBuilder's prompt as the base
347
+ // Create a minimal AggregateScore for the single file
348
+ const miniReport = {
349
+ overallScore: file.totalScore,
350
+ grade: file.grade,
351
+ totalFiles: 1,
352
+ passedFiles: 0,
353
+ failedFiles: 1,
354
+ files: [file],
355
+ passed: false,
356
+ timestamp: new Date().toISOString(),
357
+ };
358
+ const prompts = this.promptBuilder.buildPrompts(miniReport);
359
+ if (prompts.length === 0)
360
+ return '';
361
+ let fixPrompt = prompts[0].prompt;
362
+ // Enhance with source file summary
363
+ const lines = source.split('\n');
364
+ fixPrompt += `\n\n### File Statistics\n`;
365
+ fixPrompt += `- Total lines: ${lines.length}\n`;
366
+ fixPrompt += `- File extension: ${file.file.split('.').pop()}\n`;
367
+ return fixPrompt;
368
+ }
369
+ }
370
+ export default AutoFixEngine;
371
+ //# sourceMappingURL=auto-fix-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fix-engine.js","sourceRoot":"","sources":["../../src/ai-healer/auto-fix-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,OAAO,EAAY,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA0EpD,sEAAsE;AAEtE;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,KAAa,EAAE,QAAgB;IAC1E,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,aAAa,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,UAAU,CAAC,CAAC;IAEtC,2BAA2B;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;gBACnJ,uBAAuB;gBACvB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACjC,CAAC;gBACD,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;YACD,IAAI,QAAQ,KAAK,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YAClD,IAAI,SAAS,KAAK,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;YACpD,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,YAAY,EAAE,CAAC;YACf,IAAI,MAAM,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,GAAG,KAAK,CAAC;YACjB,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC,IAAI,QAAS,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,sEAAsE;AAEtE;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,MAAc,EACd,MAAc,EACd,QAAgB,EAChB,OAAoB;IAEpB,MAAM,UAAU,GAAG,GAAG,MAAM;;;;;EAK5B,MAAM;;;yJAGiJ,CAAC;IAExJ,kCAAkC;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;IAEnD,IAAI,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,eAAe,EAAE,CAAC;QAC7F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,QAAQ,KAAK,YAAY;gBAAE,MAAM,GAAG,CAAC;YACzC,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;QAC3F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,QAAQ,KAAK,aAAa;gBAAE,MAAM,GAAG,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,eAAe,EAAE,CAAC;IAC7F,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;AAC3F,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,OAAoB;IAC5D,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC;QAClC,QAAQ,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QACzD,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,eAAe;KAC9E,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC;gBACxB,MAAM;gBACN,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE;aACjD,CAAC;YACF,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;QACxD,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,OAAoB;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;IAChG,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,aAAa,CAAC;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,2BAA2B,CAAC;IAEvE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,mBAAmB,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,4EAA4E,EAAE;oBACzG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;iBAClC;gBACD,WAAW,EAAE,GAAG;gBAChB,UAAU,EAAE,IAAI;aACjB,CAAC;YACF,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyD,CAAC;QACxF,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,QAAgB;IACnC,iCAAiC;IACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACzE,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,6DAA6D;IAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC;QAChG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QACxF,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QACxF,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,yBAAyB;IACzB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,sEAAsE;AAEtE,MAAM,OAAO,aAAa;IAChB,aAAa,CAAgB;IAErC;QACE,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,MAAsB,EAAE,OAAoB;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,iCAAiC;QACjC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;QAEvE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,YAAY,EAAE,MAAM,CAAC,UAAU;gBAC/B,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,mBAAmB,EAAE,CAAC;gBACtB,OAAO,EAAE,EAAE;gBACX,YAAY,EAAE,MAAM;gBACpB,SAAS,EAAE,MAAM;gBACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,MAAM,EAAE,EAAE;aACX,CAAC;QACJ,CAAC;QAED,oBAAoB;QACpB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAClD,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,kBAAkB,IAAI,CAAC,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/F,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,0BAA0B;YAC5B,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QACrE,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/F,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAElF,yDAAyD;QACzD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEnE,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,UAAU;YAC/B,WAAW,EAAE,WAAW,CAAC,MAAM;YAC/B,WAAW;YACX,WAAW;YACX,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,GAAG,EAAE;YACzD,OAAO;YACP,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;YAC5E,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YACtC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAe,EAAE,OAAoB;QAClD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjD,cAAc;QACd,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE/C,mBAAmB;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEpD,qDAAqD;QACrD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACjD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACrF,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAE9C,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,aAAa,EAAE,IAAI,CAAC,UAAU;gBAC9B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE;aACX,CAAC;QACJ,CAAC;QAED,UAAU;QACV,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,iBAAiB,CAC3F,SAAS,EACT,MAAM,EACN,IAAI,CAAC,IAAI,EACT,OAAO,CACR,CAAC;QAEF,iBAAiB;QACjB,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,KAAK,GAAc;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,SAAS;YAChB,IAAI;SACL,CAAC;QAEF,+BAA+B;QAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,kBAAkB;YAClB,IAAI,CAAC;gBACH,YAAY,CAAC,QAAQ,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;YACD,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAED,gCAAgC;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC;gBAAE,OAAO,EAAE,CAAC;QAChD,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,aAAa,EAAE,IAAI,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;YACzG,OAAO;YACP,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YAC5C,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAoB,EAAE,WAAmB;QAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,YAAY,CAAC,QAAQ,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;YACD,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAAe,EAAE,MAAc;QACpD,yCAAyC;QACzC,sDAAsD;QACtD,MAAM,UAAU,GAAmB;YACjC,YAAY,EAAE,IAAI,CAAC,UAAU;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,KAAK,EAAE,CAAC,IAAI,CAAC;YACb,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAElC,mCAAmC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,SAAS,IAAI,2BAA2B,CAAC;QACzC,SAAS,IAAI,kBAAkB,KAAK,CAAC,MAAM,IAAI,CAAC;QAChD,SAAS,IAAI,qBAAqB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC;QAEjE,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Heal Report Generator
3
+ *
4
+ * Generates markdown reports for the AI auto-fix process.
5
+ */
6
+ import type { HealReport } from './auto-fix-engine.js';
7
+ import type { AggregateScore } from '../scorer/scoring-engine.js';
8
+ export interface ReportOptions {
9
+ includeDiff?: boolean;
10
+ }
11
+ export declare class HealReporter {
12
+ /**
13
+ * Generate a markdown report for the heal operation.
14
+ */
15
+ generateReport(healReport: HealReport, options?: ReportOptions): string;
16
+ /**
17
+ * Generate a SARIF report for the heal operation.
18
+ */
19
+ generateSARIF(healReport: HealReport, aggregateBefore?: AggregateScore): string;
20
+ }
21
+ export default HealReporter;
22
+ //# sourceMappingURL=heal-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heal-reporter.d.ts","sourceRoot":"","sources":["../../src/ai-healer/heal-reporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAIlE,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID,qBAAa,YAAY;IACvB;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM;IA0EvE;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,cAAc,GAAG,MAAM;CAwDhF;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Heal Report Generator
3
+ *
4
+ * Generates markdown reports for the AI auto-fix process.
5
+ */
6
+ // ─── Reporter ──────────────────────────────────────────────────────
7
+ export class HealReporter {
8
+ /**
9
+ * Generate a markdown report for the heal operation.
10
+ */
11
+ generateReport(healReport, options) {
12
+ const lines = [];
13
+ lines.push('# AI Auto-Fix Report');
14
+ lines.push('');
15
+ lines.push('## Summary');
16
+ lines.push('');
17
+ lines.push(`- Files scanned: ${healReport.filesScanned}`);
18
+ lines.push(`- Files healed: ${healReport.filesHealed}`);
19
+ lines.push(`- Issues fixed: ${healReport.issuesFixed}`);
20
+ lines.push(`- Average score improvement: +${healReport.avgScoreImprovement}`);
21
+ lines.push(`- AI provider: ${healReport.providerName}/${healReport.modelName}`);
22
+ lines.push('');
23
+ // Fixed files
24
+ const fixedFiles = healReport.results.filter(r => r.patches.length > 0);
25
+ if (fixedFiles.length > 0) {
26
+ lines.push('## Fixed Files');
27
+ lines.push('');
28
+ for (const result of fixedFiles) {
29
+ lines.push(`### ${result.file}`);
30
+ lines.push(`- Score: ${result.originalScore} → ${result.fixedScore} (+${result.fixedScore - result.originalScore})`);
31
+ lines.push(`- Changes: ${result.changes} line(s)`);
32
+ if (result.errors.length > 0) {
33
+ for (const err of result.errors) {
34
+ lines.push(`- ⚠ ${err}`);
35
+ }
36
+ }
37
+ lines.push('');
38
+ }
39
+ }
40
+ // Remaining issues
41
+ const failedFiles = healReport.results.filter(r => r.patches.length === 0);
42
+ if (failedFiles.length > 0) {
43
+ lines.push('## Remaining Issues');
44
+ lines.push('');
45
+ for (const result of failedFiles) {
46
+ lines.push(`### ${result.file}`);
47
+ lines.push(`- Score: ${result.originalScore} (not healed)`);
48
+ if (result.errors.length > 0) {
49
+ for (const err of result.errors) {
50
+ lines.push(`- Error: ${err}`);
51
+ }
52
+ }
53
+ lines.push('');
54
+ }
55
+ }
56
+ // Errors
57
+ if (healReport.errors.length > 0) {
58
+ lines.push('## Errors');
59
+ lines.push('');
60
+ for (const err of healReport.errors) {
61
+ lines.push(`- ${err}`);
62
+ }
63
+ lines.push('');
64
+ }
65
+ // Diff appendix
66
+ if (options?.includeDiff) {
67
+ lines.push('## Diffs');
68
+ lines.push('');
69
+ for (const result of fixedFiles) {
70
+ lines.push(`### ${result.file}`);
71
+ lines.push('```diff');
72
+ lines.push(result.patches[0].diff);
73
+ lines.push('```');
74
+ lines.push('');
75
+ }
76
+ }
77
+ return lines.join('\n');
78
+ }
79
+ /**
80
+ * Generate a SARIF report for the heal operation.
81
+ */
82
+ generateSARIF(healReport, aggregateBefore) {
83
+ const results = [];
84
+ for (const result of healReport.results) {
85
+ if (result.patches.length > 0) {
86
+ results.push({
87
+ ruleId: 'ocr-auto-fixed',
88
+ level: 'note',
89
+ message: {
90
+ text: `Auto-fixed by AI. Score: ${result.originalScore} → ${result.fixedScore} (+${result.fixedScore - result.originalScore}). Changes: ${result.changes} line(s).`,
91
+ },
92
+ locations: [{
93
+ physicalLocation: {
94
+ artifactLocation: { uri: result.file },
95
+ },
96
+ }],
97
+ fixNotifications: result.patches.map(patch => ({
98
+ description: {
99
+ text: `Applied fix to ${patch.file}`,
100
+ },
101
+ })),
102
+ });
103
+ }
104
+ }
105
+ const sarif = {
106
+ $schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json',
107
+ version: '2.1.0',
108
+ runs: [{
109
+ tool: {
110
+ driver: {
111
+ name: 'Open Code Review — AI Auto-Fix',
112
+ version: '2.0.0',
113
+ informationUri: 'https://github.com/raye-deng/open-code-review',
114
+ rules: [
115
+ {
116
+ id: 'ocr-auto-fixed',
117
+ shortDescription: { text: 'File auto-fixed by AI' },
118
+ },
119
+ ],
120
+ },
121
+ },
122
+ results,
123
+ invocation: {
124
+ executionSuccessful: healReport.errors.length === 0,
125
+ endTimeUtc: healReport.timestamp,
126
+ toolConfigurationNotifications: healReport.errors.map(err => ({
127
+ level: 'error',
128
+ message: { text: err },
129
+ })),
130
+ },
131
+ }],
132
+ };
133
+ return JSON.stringify(sarif, null, 2);
134
+ }
135
+ }
136
+ export default HealReporter;
137
+ //# sourceMappingURL=heal-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heal-reporter.js","sourceRoot":"","sources":["../../src/ai-healer/heal-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * IDE Rules Generator
3
+ *
4
+ * Generates rule files for AI coding assistants (Cursor, Copilot, Augment)
5
+ * based on scan/heal results so they avoid repeating detected issues.
6
+ */
7
+ import type { AggregateScore } from '../scorer/scoring-engine.js';
8
+ import type { HealReport } from './auto-fix-engine.js';
9
+ export interface IDERulesOptions {
10
+ projectRoot: string;
11
+ /** Scan report (required) */
12
+ report: AggregateScore;
13
+ /** Optional heal report (includes fix details) */
14
+ healReport?: HealReport;
15
+ }
16
+ export declare class IDERulesGenerator {
17
+ /**
18
+ * Generate IDE rule files for all supported assistants.
19
+ */
20
+ generateAll(options: IDERulesOptions): {
21
+ path: string;
22
+ content: string;
23
+ }[];
24
+ /**
25
+ * Write IDE rule files to disk.
26
+ */
27
+ writeAll(options: IDERulesOptions): string[];
28
+ /**
29
+ * Generate Cursor rules file.
30
+ */
31
+ generateCursorRules(options: IDERulesOptions): string;
32
+ /**
33
+ * Generate GitHub Copilot instructions file.
34
+ */
35
+ generateCopilotInstructions(options: IDERulesOptions): string;
36
+ /**
37
+ * Generate Augment instructions file.
38
+ */
39
+ generateAugmentInstructions(options: IDERulesOptions): string;
40
+ /**
41
+ * Extract common issue patterns from the report.
42
+ */
43
+ private extractPatterns;
44
+ }
45
+ export default IDERulesGenerator;
46
+ //# sourceMappingURL=ide-rules-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide-rules-generator.d.ts","sourceRoot":"","sources":["../../src/ai-healer/ide-rules-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIvD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,kDAAkD;IAClD,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAID,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;IAe1E;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE;IAc5C;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM;IAsErD;;OAEG;IACH,2BAA2B,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM;IAmC7D;;OAEG;IACH,2BAA2B,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM;IA6B7D;;OAEG;IACH,OAAO,CAAC,eAAe;CAgDxB;AAED,eAAe,iBAAiB,CAAC"}