code-auditor-mcp 3.4.9 → 3.4.11

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 (130) hide show
  1. package/.claude-plugin/marketplace.json +10 -3
  2. package/CHANGELOG.md +81 -0
  3. package/dist/analyzers/analyzerUtils.d.ts.map +1 -1
  4. package/dist/analyzers/analyzerUtils.js +2 -1
  5. package/dist/analyzers/analyzerUtils.js.map +1 -1
  6. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +0 -2
  7. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -1
  8. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +74 -99
  9. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
  10. package/dist/analyzers/documentationAnalyzer.d.ts +1 -5
  11. package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
  12. package/dist/analyzers/documentationAnalyzer.js +13 -69
  13. package/dist/analyzers/documentationAnalyzer.js.map +1 -1
  14. package/dist/analyzers/invariantsAnalyzer.d.ts +1 -6
  15. package/dist/analyzers/invariantsAnalyzer.d.ts.map +1 -1
  16. package/dist/analyzers/invariantsAnalyzer.js +16 -41
  17. package/dist/analyzers/invariantsAnalyzer.js.map +1 -1
  18. package/dist/analyzers/reactAnalyzer.d.ts +20 -3
  19. package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
  20. package/dist/analyzers/reactAnalyzer.js +4 -165
  21. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  22. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -1
  23. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +43 -69
  24. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -1
  25. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +62 -0
  26. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  27. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +357 -3
  28. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  29. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +81 -69
  30. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  31. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +319 -325
  32. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  33. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
  34. package/dist/analyzers/universal/UniversalStylesAnalyzer.js +32 -37
  35. package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
  36. package/dist/auditRunner.d.ts +2 -7
  37. package/dist/auditRunner.d.ts.map +1 -1
  38. package/dist/auditRunner.js +306 -434
  39. package/dist/auditRunner.js.map +1 -1
  40. package/dist/cli.js +27 -5
  41. package/dist/cli.js.map +1 -1
  42. package/dist/codeIndexDB.d.ts +22 -0
  43. package/dist/codeIndexDB.d.ts.map +1 -1
  44. package/dist/codeIndexDB.js +92 -44
  45. package/dist/codeIndexDB.js.map +1 -1
  46. package/dist/config/defaults.js +3 -3
  47. package/dist/config/defaults.js.map +1 -1
  48. package/dist/conventions/conventionMiner.d.ts +5 -4
  49. package/dist/conventions/conventionMiner.d.ts.map +1 -1
  50. package/dist/conventions/conventionMiner.js +65 -25
  51. package/dist/conventions/conventionMiner.js.map +1 -1
  52. package/dist/dataPaths.js +1 -1
  53. package/dist/dataPaths.js.map +1 -1
  54. package/dist/invariants/index.d.ts +1 -1
  55. package/dist/invariants/index.d.ts.map +1 -1
  56. package/dist/invariants/index.js +1 -1
  57. package/dist/invariants/index.js.map +1 -1
  58. package/dist/invariants/ruleEngine.d.ts +38 -3
  59. package/dist/invariants/ruleEngine.d.ts.map +1 -1
  60. package/dist/invariants/ruleEngine.js +42 -174
  61. package/dist/invariants/ruleEngine.js.map +1 -1
  62. package/dist/languages/UniversalAnalyzer.d.ts +2 -2
  63. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
  64. package/dist/languages/UniversalAnalyzer.js +3 -1
  65. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  66. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +3 -0
  67. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
  68. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +60 -16
  69. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
  70. package/dist/mcp-tools-shared.d.ts.map +1 -1
  71. package/dist/mcp-tools-shared.js +10 -6
  72. package/dist/mcp-tools-shared.js.map +1 -1
  73. package/dist/mcp.js +0 -0
  74. package/dist/mcpAuditJobs.d.ts.map +1 -1
  75. package/dist/mcpAuditJobs.js +4 -1
  76. package/dist/mcpAuditJobs.js.map +1 -1
  77. package/dist/pipeline.d.ts +74 -0
  78. package/dist/pipeline.d.ts.map +1 -0
  79. package/dist/pipeline.js +620 -0
  80. package/dist/pipeline.js.bak +465 -0
  81. package/dist/pipeline.js.bak2 +465 -0
  82. package/dist/pipeline.js.map +1 -0
  83. package/dist/pipelineAdapters.d.ts +116 -0
  84. package/dist/pipelineAdapters.d.ts.map +1 -0
  85. package/dist/pipelineAdapters.js +1146 -0
  86. package/dist/pipelineAdapters.js.map +1 -0
  87. package/dist/pipelineTypes.d.ts +44 -0
  88. package/dist/pipelineTypes.d.ts.map +1 -0
  89. package/dist/pipelineTypes.js +118 -0
  90. package/dist/pipelineTypes.js.map +1 -0
  91. package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
  92. package/dist/reporting/csvReportGenerator.js +2 -1
  93. package/dist/reporting/csvReportGenerator.js.map +1 -1
  94. package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
  95. package/dist/reporting/jsonReportGenerator.js +4 -2
  96. package/dist/reporting/jsonReportGenerator.js.map +1 -1
  97. package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
  98. package/dist/reporting/sarifReportGenerator.js +2 -1
  99. package/dist/reporting/sarifReportGenerator.js.map +1 -1
  100. package/dist/styles/cssAstExtractor.d.ts +46 -0
  101. package/dist/styles/cssAstExtractor.d.ts.map +1 -0
  102. package/dist/styles/cssAstExtractor.js +439 -0
  103. package/dist/styles/cssAstExtractor.js.map +1 -0
  104. package/dist/styles/styleExtractor.d.ts +2 -2
  105. package/dist/styles/styleExtractor.d.ts.map +1 -1
  106. package/dist/styles/styleExtractor.js +69 -16
  107. package/dist/styles/styleExtractor.js.map +1 -1
  108. package/dist/styles/styleIndexer.d.ts.map +1 -1
  109. package/dist/styles/styleIndexer.js +4 -0
  110. package/dist/styles/styleIndexer.js.map +1 -1
  111. package/dist/styles/tailwindProbe.d.ts +2 -0
  112. package/dist/styles/tailwindProbe.d.ts.map +1 -1
  113. package/dist/styles/tailwindProbe.js +5 -5
  114. package/dist/styles/tailwindProbe.js.map +1 -1
  115. package/dist/styles/tailwindUtilityExpander.d.ts +3 -0
  116. package/dist/styles/tailwindUtilityExpander.d.ts.map +1 -1
  117. package/dist/styles/tailwindUtilityExpander.js +7 -0
  118. package/dist/styles/tailwindUtilityExpander.js.map +1 -1
  119. package/dist/types.d.ts +216 -11
  120. package/dist/types.d.ts.map +1 -1
  121. package/dist/types.js.map +1 -1
  122. package/dist/utils/fileDiscovery.d.ts +4 -0
  123. package/dist/utils/fileDiscovery.d.ts.map +1 -1
  124. package/dist/utils/fileDiscovery.js +7 -1
  125. package/dist/utils/fileDiscovery.js.map +1 -1
  126. package/dist/utils/reactDetection.d.ts.map +1 -1
  127. package/dist/utils/reactDetection.js +32 -0
  128. package/dist/utils/reactDetection.js.map +1 -1
  129. package/package.json +2 -4
  130. package/plugin/.claude-plugin/plugin.json +1 -1
@@ -0,0 +1,465 @@
1
+ /**
2
+ * Pipeline execution engine (Spec 24).
3
+ *
4
+ * Four sequential stages:
5
+ * 1. Traverse + Parse — one walk, one parse per file
6
+ * 2. Per-file visitors — each AST → all visitors in parallel
7
+ * 3. Corpus reducers — accumulated facts → cross-file analysis
8
+ * 4. Derived reducers — stage 2+3 facts → cross-domain analysis
9
+ *
10
+ * Stage position IS the dependency declaration — no topological sort needed.
11
+ */
12
+ import { readFile } from 'fs/promises';
13
+ import { performance } from 'perf_hooks';
14
+ import { AuditAbortedError, } from './types.js';
15
+ import { LanguageRegistry } from './languages/LanguageRegistry.js';
16
+ import { discoverFiles } from './utils/fileDiscovery.js';
17
+ import { resolvePathProfile } from './config/pathProfiles.js';
18
+ import { validateFactsDependencies } from './pipelineTypes.js';
19
+ // ── Stage 1: Traverse + Parse ──────────────────────────────────────────────
20
+ async function runStage1(config) {
21
+ const t0 = performance.now();
22
+ let readMs = 0;
23
+ let parseMs = 0;
24
+ // Discover files (or use explicit)
25
+ const projectRoot = config.projectRoot;
26
+ let files;
27
+ if (config.explicitFiles && config.explicitFiles.length > 0) {
28
+ files = config.explicitFiles;
29
+ }
30
+ else {
31
+ files = await discoverFiles(projectRoot, {
32
+ excludeDirs: ['node_modules', '.next', 'dist', 'build', '.git', 'coverage', '.turbo'],
33
+ });
34
+ }
35
+ // Group by language adapter
36
+ const registry = LanguageRegistry.getInstance();
37
+ const groups = new Map();
38
+ const orphans = [];
39
+ for (const file of files) {
40
+ const adapter = registry.getAdapterForFile(file);
41
+ if (adapter) {
42
+ const list = groups.get(adapter) ?? [];
43
+ list.push(file);
44
+ groups.set(adapter, list);
45
+ }
46
+ else {
47
+ orphans.push(file);
48
+ }
49
+ }
50
+ // Parse each file once
51
+ const tuples = [];
52
+ let parsed = 0;
53
+ for (const [adapter, adapterFiles] of groups) {
54
+ for (const file of adapterFiles) {
55
+ // Check abort
56
+ if (config.abortSignal?.aborted) {
57
+ throw new AuditAbortedError('Audit aborted during stage 1');
58
+ }
59
+ try {
60
+ const r0 = performance.now();
61
+ const content = await readFile(file, 'utf-8');
62
+ readMs += performance.now() - r0;
63
+ const p0 = performance.now();
64
+ const ast = await adapter.parse(file, content);
65
+ parseMs += performance.now() - p0;
66
+ tuples.push({
67
+ file,
68
+ ast,
69
+ adapter,
70
+ sourceCode: content,
71
+ });
72
+ parsed++;
73
+ }
74
+ catch (err) {
75
+ // File read/parse errors — skip this file
76
+ // Individual files that fail to parse don't abort the entire run
77
+ if (config.progressCallback) {
78
+ config.progressCallback({
79
+ current: parsed,
80
+ total: files.length,
81
+ analyzer: 'pipeline',
82
+ phase: 'stage1',
83
+ file,
84
+ message: `Skipped: ${err.message}`,
85
+ });
86
+ }
87
+ }
88
+ }
89
+ }
90
+ const duration = performance.now() - t0;
91
+ // Log orphan files (no matching language adapter)
92
+ const orphanCount = orphans.length;
93
+ if (orphanCount > 0 && config.progressCallback) {
94
+ config.progressCallback({
95
+ current: orphanCount,
96
+ total: orphans.length,
97
+ analyzer: 'pipeline',
98
+ phase: 'stage1',
99
+ message: `${orphanCount} file(s) skipped (no language adapter)`,
100
+ });
101
+ }
102
+ return {
103
+ tuples,
104
+ fileCount: tuples.length + orphanCount,
105
+ parseDurationMs: duration,
106
+ readDurationMs: readMs,
107
+ };
108
+ }
109
+ // ── Stage 2: Per-file visitors ─────────────────────────────────────────────
110
+ async function runStage2(tuples, visitors, config) {
111
+ const t0 = performance.now();
112
+ const visitorResults = new Map();
113
+ const allFacts = new Map();
114
+ const indexFacts = [];
115
+ const timingMap = new Map();
116
+ const errors = new Map();
117
+ // Initialize per-visitor state
118
+ for (const visitor of visitors) {
119
+ visitorResults.set(visitor.name, {
120
+ violations: [],
121
+ filesProcessed: 0,
122
+ status: { status: 'ran', filesProcessed: 0 },
123
+ executionTime: 0,
124
+ analyzerName: visitor.name,
125
+ });
126
+ allFacts.set(visitor.name, {});
127
+ timingMap.set(visitor.name, 0);
128
+ errors.set(visitor.name, []);
129
+ }
130
+ const projectRoot = config.projectRoot;
131
+ const pathProfiles = config.config?.pathProfiles;
132
+ const rawConfig = config.config ?? {};
133
+ const severityOverrides = rawConfig.severityOverrides ?? {};
134
+ // Iterate tuples
135
+ for (let i = 0; i < tuples.length; i++) {
136
+ const tuple = tuples[i];
137
+ // Check abort
138
+ if (config.abortSignal?.aborted) {
139
+ throw new AuditAbortedError('Audit aborted during stage 2');
140
+ }
141
+ // Progress
142
+ if (config.progressCallback && i % 10 === 0) {
143
+ config.progressCallback({
144
+ current: i,
145
+ total: tuples.length,
146
+ analyzer: 'pipeline',
147
+ phase: 'stage2',
148
+ file: tuple.file,
149
+ });
150
+ }
151
+ // Resolve path profiles for this file
152
+ let fileConfig = rawConfig;
153
+ let fileProfileNames = [];
154
+ let fileSeverityCap;
155
+ if (pathProfiles && pathProfiles.length > 0) {
156
+ const resolved = resolvePathProfile(tuple.file, projectRoot, pathProfiles);
157
+ if (Object.keys(resolved.overrides).length > 0) {
158
+ fileConfig = { ...rawConfig, ...resolved.overrides };
159
+ }
160
+ fileProfileNames = resolved.matchedProfileNames;
161
+ fileSeverityCap = resolved.severityCap;
162
+ }
163
+ const visitorContext = {
164
+ projectRoot,
165
+ config: fileConfig,
166
+ abortSignal: config.abortSignal,
167
+ };
168
+ // Fan out to all visitors for this file
169
+ for (const visitor of visitors) {
170
+ try {
171
+ const v0 = performance.now();
172
+ const result = await visitor.visit(tuple.ast, tuple.adapter, visitorContext, tuple.sourceCode);
173
+ const vMs = performance.now() - v0;
174
+ // Accumulate timing
175
+ timingMap.set(visitor.name, (timingMap.get(visitor.name) ?? 0) + vMs);
176
+ // Attach profile, severity overrides, analyzer name
177
+ const severityOrder = ['suggestion', 'warning', 'critical'];
178
+ const processedViolations = result.violations
179
+ .map((v) => ({
180
+ ...v,
181
+ analyzer: v.analyzer ?? visitor.name,
182
+ profile: fileProfileNames.length > 0
183
+ ? fileProfileNames[fileProfileNames.length - 1]
184
+ : v.profile,
185
+ severity: severityOverrides[v.rule] ?? v.severity,
186
+ }))
187
+ // Filter out violations whose severity was overridden to 'off' (Spec-11 R5)
188
+ .filter((v) => v.severity !== 'off')
189
+ // Apply severity cap from path profiles (Spec-20)
190
+ // Applied AFTER severityOverrides so path-level caps beat global promotions
191
+ .map((v) => {
192
+ if (fileSeverityCap) {
193
+ const capIndex = severityOrder.indexOf(fileSeverityCap);
194
+ if (capIndex >= 0 && severityOrder.indexOf(v.severity) > capIndex) {
195
+ return { ...v, severity: fileSeverityCap };
196
+ }
197
+ }
198
+ return v;
199
+ });
200
+ // Accumulate violations
201
+ const ar = visitorResults.get(visitor.name);
202
+ ar.violations.push(...processedViolations);
203
+ ar.status = {
204
+ status: 'ran',
205
+ filesProcessed: (ar.status.filesProcessed ?? 0) + 1,
206
+ };
207
+ // Accumulate facts
208
+ if (result.facts && Object.keys(result.facts).length > 0) {
209
+ const existing = allFacts.get(visitor.name) ?? {};
210
+ allFacts.set(visitor.name, { ...existing, ...result.facts });
211
+ }
212
+ // Collect index facts
213
+ if (result.indexFacts && result.indexFacts.length > 0) {
214
+ indexFacts.push(...result.indexFacts);
215
+ }
216
+ }
217
+ catch (err) {
218
+ // Visitor error on this file — collect but don't abort
219
+ const errs = errors.get(visitor.name);
220
+ errs.push({ file: tuple.file, error: err.message });
221
+ }
222
+ }
223
+ }
224
+ // Finalize results
225
+ const totalDuration = performance.now() - t0;
226
+ for (const [name, result] of visitorResults) {
227
+ const visitorTime = timingMap.get(name) ?? 0;
228
+ result.executionTime = visitorTime;
229
+ // Sync filesProcessed from status (which tracks per-file increments)
230
+ // to the top-level field (which runZeroFilesDiagnostics reads directly)
231
+ result.filesProcessed = result.status.filesProcessed;
232
+ const errList = errors.get(name);
233
+ if (errList && errList.length > 0) {
234
+ result.errors = errList;
235
+ }
236
+ }
237
+ return {
238
+ visitorResults,
239
+ allFacts,
240
+ indexFacts,
241
+ visitorDurationMs: timingMap,
242
+ fileCount: tuples.length,
243
+ };
244
+ }
245
+ // ── Stage 3: Corpus reducers ───────────────────────────────────────────────
246
+ async function runStage3(allFacts, reducers, config, indexHandle) {
247
+ const t0 = performance.now();
248
+ const reducerResults = new Map();
249
+ const reducerFacts = new Map();
250
+ const factsObj = Object.fromEntries(allFacts);
251
+ const factsConsumed = allFacts.size;
252
+ const reducerContext = {
253
+ projectRoot: config.projectRoot,
254
+ config: config.config ?? {},
255
+ indexHandle,
256
+ abortSignal: config.abortSignal,
257
+ };
258
+ for (const reducer of reducers) {
259
+ if (config.abortSignal?.aborted) {
260
+ throw new AuditAbortedError(`Audit aborted during stage 3 (${reducer.name})`);
261
+ }
262
+ try {
263
+ const r0 = performance.now();
264
+ const result = await reducer.reduce(factsObj, reducerContext);
265
+ const rMs = performance.now() - r0;
266
+ reducerResults.set(reducer.name, {
267
+ violations: result.violations.map((v) => ({
268
+ ...v,
269
+ analyzer: v.analyzer ?? reducer.name,
270
+ })),
271
+ status: { status: 'ran', factsConsumed },
272
+ filesProcessed: 0,
273
+ executionTime: rMs,
274
+ analyzerName: reducer.name,
275
+ });
276
+ if (result.facts && Object.keys(result.facts).length > 0) {
277
+ reducerFacts.set(reducer.name, result.facts);
278
+ }
279
+ }
280
+ catch (err) {
281
+ reducerResults.set(reducer.name, {
282
+ violations: [],
283
+ status: {
284
+ status: 'notRun',
285
+ reason: `Reducer error: ${err.message}`,
286
+ },
287
+ filesProcessed: 0,
288
+ executionTime: 0,
289
+ analyzerName: reducer.name,
290
+ errors: [{ file: '(reducer)', error: err.message }],
291
+ });
292
+ }
293
+ }
294
+ return {
295
+ reducerResults,
296
+ reducerFacts,
297
+ durationMs: performance.now() - t0,
298
+ };
299
+ }
300
+ // ── Stage 4: Derived reducers ──────────────────────────────────────────────
301
+ async function runStage4(allFacts, derivedReducers, config, indexHandle) {
302
+ const t0 = performance.now();
303
+ const derivedResults = new Map();
304
+ const factsConsumed = Object.keys(allFacts).length;
305
+ const reducerContext = {
306
+ projectRoot: config.projectRoot,
307
+ config: config.config ?? {},
308
+ indexHandle,
309
+ abortSignal: config.abortSignal,
310
+ };
311
+ for (const dr of derivedReducers) {
312
+ if (config.abortSignal?.aborted) {
313
+ throw new AuditAbortedError(`Audit aborted during stage 4 (${dr.name})`);
314
+ }
315
+ try {
316
+ const r0 = performance.now();
317
+ const result = await dr.reduce(allFacts, reducerContext);
318
+ const rMs = performance.now() - r0;
319
+ derivedResults.set(dr.name, {
320
+ violations: result.violations.map((v) => ({
321
+ ...v,
322
+ analyzer: v.analyzer ?? dr.name,
323
+ })),
324
+ status: { status: 'ran', factsConsumed },
325
+ filesProcessed: 0,
326
+ executionTime: rMs,
327
+ analyzerName: dr.name,
328
+ });
329
+ }
330
+ catch (err) {
331
+ derivedResults.set(dr.name, {
332
+ violations: [],
333
+ status: {
334
+ status: 'notRun',
335
+ reason: `Derived reducer error: ${err.message}`,
336
+ },
337
+ filesProcessed: 0,
338
+ executionTime: 0,
339
+ analyzerName: dr.name,
340
+ errors: [{ file: '(derived-reducer)', error: err.message }],
341
+ });
342
+ }
343
+ }
344
+ return {
345
+ derivedResults,
346
+ durationMs: performance.now() - t0,
347
+ };
348
+ }
349
+ // ── Main pipeline entry ────────────────────────────────────────────────────
350
+ /**
351
+ * Run the full 4-stage pipeline.
352
+ *
353
+ * @param config Pipeline configuration with visitors, reducers, and derived reducers.
354
+ * @param indexHandle Optional DB handle for reducers (in-memory overlay for scoped runs).
355
+ * @returns PipelineResult with analyzerResults and metadata.
356
+ */
357
+ export async function runPipeline(config, indexHandle) {
358
+ const totalT0 = performance.now();
359
+ const stageTiming = {};
360
+ const visitors = config.visitors ?? [];
361
+ const reducers = config.reducers ?? [];
362
+ const derivedReducers = config.derivedReducers ?? [];
363
+ // ── Validate facts dependencies ──────────────────────────────────────────
364
+ const depErrors = validateFactsDependencies(visitors, reducers, derivedReducers);
365
+ if (depErrors.length > 0) {
366
+ throw new Error(`Pipeline facts dependency errors:\n${depErrors.map((e) => ` - ${e}`).join('\n')}`);
367
+ }
368
+ // ── Stage 1: Traverse + Parse ────────────────────────────────────────────
369
+ const stage1 = await runStage1(config);
370
+ stageTiming['stage1-parse'] = stage1.parseDurationMs;
371
+ if (config.progressCallback) {
372
+ config.progressCallback({
373
+ current: stage1.fileCount,
374
+ total: stage1.fileCount,
375
+ analyzer: 'pipeline',
376
+ phase: 'stage1-complete',
377
+ message: `${stage1.fileCount} files parsed in ${stage1.parseDurationMs.toFixed(0)}ms`,
378
+ });
379
+ }
380
+ // ── Stage 2: Per-file visitors ───────────────────────────────────────────
381
+ const stage2 = await runStage2(stage1.tuples, visitors, config);
382
+ stageTiming['stage2-visitors'] = performance.now() - totalT0 - stage1.parseDurationMs;
383
+ if (config.progressCallback) {
384
+ config.progressCallback({
385
+ current: stage2.fileCount,
386
+ total: stage2.fileCount,
387
+ analyzer: 'pipeline',
388
+ phase: 'stage2-complete',
389
+ message: `${visitors.length} visitors ran on ${stage2.fileCount} files`,
390
+ });
391
+ }
392
+ // ── Stage 3: Corpus reducers ─────────────────────────────────────────────
393
+ const stage3T0 = performance.now();
394
+ const stage3 = await runStage3(stage2.allFacts, reducers, config, indexHandle);
395
+ stageTiming['stage3-reducers'] = performance.now() - stage3T0;
396
+ // Merge stage 2 + stage 3 facts for stage 4
397
+ const combinedFacts = {};
398
+ for (const [name, facts] of stage2.allFacts) {
399
+ combinedFacts[name] = facts;
400
+ }
401
+ for (const [name, facts] of stage3.reducerFacts) {
402
+ combinedFacts[name] = facts;
403
+ }
404
+ // ── Stage 4: Derived reducers ────────────────────────────────────────────
405
+ const stage4T0 = performance.now();
406
+ const stage4 = await runStage4(combinedFacts, derivedReducers, config, indexHandle);
407
+ stageTiming['stage4-derived'] = performance.now() - stage4T0;
408
+ // ── Build result ─────────────────────────────────────────────────────────
409
+ const analyzerResults = {};
410
+ // Stage 2 results
411
+ for (const [name, result] of stage2.visitorResults) {
412
+ analyzerResults[name] = result;
413
+ }
414
+ // Stage 3 results
415
+ for (const [name, result] of stage3.reducerResults) {
416
+ analyzerResults[name] = result;
417
+ }
418
+ // Stage 4 results
419
+ for (const [name, result] of stage4.derivedResults) {
420
+ analyzerResults[name] = result;
421
+ }
422
+ // Collect diagnostics
423
+ const diagnostics = [];
424
+ for (const [name, result] of Object.entries(analyzerResults)) {
425
+ if (result.status && result.status.status === 'notRun') {
426
+ diagnostics.push({
427
+ analyzerName: name,
428
+ kind: 'not-run',
429
+ message: result.status.reason,
430
+ });
431
+ }
432
+ }
433
+ const totalDuration = performance.now() - totalT0;
434
+ return {
435
+ analyzerResults,
436
+ metadata: {
437
+ auditDuration: totalDuration,
438
+ filesAnalyzed: stage1.fileCount,
439
+ stageTiming,
440
+ scoped: config.isScoped,
441
+ diagnostics,
442
+ },
443
+ };
444
+ }
445
+ /**
446
+ * Run pipeline with index fact handling.
447
+ *
448
+ * For scoped runs (changed, path-filtered), index facts are kept in-memory.
449
+ * For full runs (plain audit), index facts are written to persistent storage
450
+ * via the provided writeFn.
451
+ */
452
+ export async function runPipelineWithIndex(config, indexHandle, writeIndexFacts) {
453
+ const result = await runPipeline(config, indexHandle);
454
+ // Index facts are accumulated during stage 2 and need to be extracted
455
+ // Since runStage2 is internal, we expose a separate path that re-runs
456
+ // or we can modify runPipeline to pass index facts through.
457
+ //
458
+ // For now, we use runPipeline and the caller handles index facts
459
+ // separately through the visitor results.
460
+ return {
461
+ result,
462
+ indexFacts: [],
463
+ };
464
+ }
465
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EACL,iBAAiB,GAclB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAoB,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAiB,MAAM,oBAAoB,CAAC;AAE9E,8EAA8E;AAE9E,KAAK,UAAU,SAAS,CAAC,MAAsB;IAM7C,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,mCAAmC;IACnC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACvC,IAAI,KAAe,CAAC;IACpB,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE;YACvC,WAAW,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;SACtF,CAAC,CAAC;IACL,CAAC;IAED,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,MAAM,EAAE,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,cAAc;YACd,IAAI,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;YAC9D,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC9C,MAAM,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;gBAEjC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC/C,OAAO,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;gBAElC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI;oBACJ,GAAG;oBACH,OAAO;oBACP,UAAU,EAAE,OAAO;iBACpB,CAAC,CAAC;gBACH,MAAM,EAAE,CAAC;YACX,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,0CAA0C;gBAC1C,iEAAiE;gBACjE,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;oBAC5B,MAAM,CAAC,gBAAgB,CAAC;wBACtB,OAAO,EAAE,MAAM;wBACf,KAAK,EAAE,KAAK,CAAC,MAAM;wBACnB,QAAQ,EAAE,UAAU;wBACpB,KAAK,EAAE,QAAQ;wBACf,IAAI;wBACJ,OAAO,EAAE,YAAY,GAAG,CAAC,OAAO,EAAE;qBACnC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,oEAAoE;IACpE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAEjC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,KAAK;gBACX,IAAI;gBACJ,GAAG,EAAE,IAAI;gBACT,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,OAAO;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,MAAM,CAAC,gBAAgB,CAAC;oBACtB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;oBAC9B,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,QAAQ,EAAE,UAAU;oBACpB,KAAK,EAAE,QAAQ;oBACf,IAAI;oBACJ,OAAO,EAAE,kCAAkC,GAAG,CAAC,OAAO,EAAE;iBACzD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;IACnE,IAAI,cAAc,GAAG,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAClD,MAAM,CAAC,gBAAgB,CAAC;YACtB,OAAO,EAAE,cAAc;YACvB,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,GAAG,cAAc,gDAAgD;SAC3E,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAExC,OAAO;QACL,MAAM;QACN,SAAS,EAAE,MAAM,CAAC,MAAM;QACxB,eAAe,EAAE,QAAQ;QACzB,cAAc,EAAE,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,SAAS,CACtB,MAAsB,EACtB,QAAyB,EACzB,MAAsB;IAQtB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmC,CAAC;IAC5D,MAAM,UAAU,GAAsB,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkD,CAAC;IAEzE,+BAA+B;IAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;YAC/B,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,EAAE;YACpD,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,OAAO,CAAC,IAAI;SAC3B,CAAC,CAAC;QACH,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/B,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACtC,MAAM,KAAK,GAAI,SAAS,CAAC,QAAQ,CAA6B,IAAI,EAAE,CAAC;IACrE,MAAM,YAAY,GAA8B,KAAK,CAAC,cAAc,CAA8B,CAAC;IACnG,MAAM,iBAAiB,GAA4B,KAAK,CAAC,mBAAmB,CAA4B,IAAI,EAAE,CAAC;IAE/G,iBAAiB;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAExB,cAAc;QACd,IAAI,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;QAC9D,CAAC;QAED,WAAW;QACX,IAAI,MAAM,CAAC,gBAAgB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,gBAAgB,CAAC;gBACtB,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,QAAQ,EAAE,UAAU;gBACpB,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;QACL,CAAC;QAED,8DAA8D;QAC9D,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,gBAAgB,GAAa,EAAE,CAAC;QACpC,IAAI,eAAmC,CAAC;QACxC,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;YAC3E,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;YAClD,CAAC;YACD,gBAAgB,GAAG,QAAQ,CAAC,mBAAmB,CAAC;YAChD,eAAe,GAAG,QAAQ,CAAC,WAAW,CAAC;QACzC,CAAC;QAED,wEAAwE;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,mEAAmE;YACnE,iFAAiF;YACjF,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,SAAS;YACtD,CAAC;iBAAM,CAAC;gBACN,gEAAgE;gBAChE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;oBAAE,SAAS;YACxC,CAAC;YAED,MAAM,aAAa,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC;YAC3E,MAAM,cAAc,GAAG;gBACrB,WAAW;gBACX,QAAQ,EAAE,KAAK,CAAC,IAAI;gBACpB,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC/F,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;gBAEnC,oBAAoB;gBACpB,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;gBAEtE,oDAAoD;gBACpD,MAAM,aAAa,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;gBACrE,MAAM,mBAAmB,GAAG,MAAM,CAAC,UAAU;qBAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACX,GAAG,CAAC;oBACJ,OAAO,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC;wBAClC,CAAC,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;wBAC/C,CAAC,CAAC,CAAC,CAAC,OAAO;oBACb,QAAQ,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAa;iBAChE,CAAC,CAAC;oBACH,4EAA4E;qBAC3E,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC;oBACpC,kDAAkD;oBAClD,4EAA4E;qBAC3E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACT,IAAI,eAAe,EAAE,CAAC;wBACpB,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,eAA+C,CAAC,CAAC;wBACxF,IAAI,QAAQ,IAAI,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,QAAwC,CAAC,GAAG,QAAQ,EAAE,CAAC;4BAClG,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,eAAwD,EAAE,CAAC;wBACtF,CAAC;oBACH,CAAC;oBACD,OAAO,CAAC,CAAC;gBACX,CAAC,CAAC,CAAC;gBAEL,wBAAwB;gBACxB,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC;gBAC7C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC;gBAC3C,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpF,EAAE,CAAC,MAAM,GAAG;oBACV,MAAM,EAAE,aAAa;oBACrB,cAAc,EAAE,SAAS,GAAG,CAAC;iBAC9B,CAAC;gBAEF,mBAAmB;gBACnB,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC/D,CAAC;gBAED,sBAAsB;gBACtB,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtD,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,uDAAuD;gBACvD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,aAAa,GAAG,WAAW,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;QAC1B,CAAC;QACD,+EAA+E;QAC/E,8EAA8E;QAC9E,qDAAqD;QACrD,2EAA2E;QAC3E,yEAAyE;QACzE,IACE,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa;YACtC,MAAM,CAAC,MAAM,CAAC,cAAc,KAAK,CAAC;YAClC,CAAC,CAAE,MAAc,CAAC,MAAM,IAAK,MAAc,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAChE,CAAC;YACD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACpD,IAAI,OAAO,EAAE,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzD,MAAM,CAAC,MAAM,GAAG;oBACd,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,yCAAyC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACjF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,cAAc;QACd,QAAQ;QACR,UAAU;QACV,iBAAiB,EAAE,SAAS;QAC5B,SAAS,EAAE,MAAM,CAAC,MAAM;KACzB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,SAAS,CACtB,QAA8C,EAC9C,QAAyB,EACzB,MAAsB,EACtB,WAAoC;IAMpC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;IACzD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9C,6EAA6E;IAC7E,MAAM,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3F,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACtC,MAAM,KAAK,GAAI,SAAS,CAAC,QAAQ,CAA6B,IAAI,EAAE,CAAC;IAErE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,iBAAiB,CAAC,iCAAiC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QAChF,CAAC;QAED,qEAAqE;QACrE,MAAM,aAAa,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;QACvE,MAAM,cAAc,GAAG;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,MAAM,EAAE,aAAa;YACrB,WAAW;YACX,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YAC9D,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAEnC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,aAAa,EAAE;gBACvF,aAAa,EAAE,GAAG;gBAClB,YAAY,EAAE,OAAO,CAAC,IAAI;aAC3B,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzD,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;gBAC/B,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,kBAAkB,GAAG,CAAC,OAAO,EAAE;iBACxC;gBACD,aAAa,EAAE,CAAC;gBAChB,YAAY,EAAE,OAAO,CAAC,IAAI;gBAC1B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;aACpD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,cAAc;QACd,YAAY;QACZ,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;KACnC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,SAAS,CACtB,QAAiC,EACjC,eAAgC,EAChC,MAAsB,EACtB,WAAoC;IAKpC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;IACzD,0FAA0F;IAC1F,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAEnI,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACtC,MAAM,KAAK,GAAI,SAAS,CAAC,QAAQ,CAA6B,IAAI,EAAE,CAAC;IAErE,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,iBAAiB,CAAC,iCAAiC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;QAC3E,CAAC;QAED,qEAAqE;QACrE,MAAM,aAAa,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;QAClE,MAAM,cAAc,GAAG;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,MAAM,EAAE,aAAa;YACrB,WAAW;YACX,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACzD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAEnC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;gBAC1B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,aAAa,EAAE;gBACvF,aAAa,EAAE,GAAG;gBAClB,YAAY,EAAE,EAAE,CAAC,IAAI;aACtB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;gBAC1B,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,0BAA0B,GAAG,CAAC,OAAO,EAAE;iBAChD;gBACD,aAAa,EAAE,CAAC;gBAChB,YAAY,EAAE,EAAE,CAAC,IAAI;gBACrB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;aAC5D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,cAAc;QACd,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;KACnC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAsB,EACtB,WAAyB;IAEzB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;IAErD,4EAA4E;IAC5E,MAAM,SAAS,GAAG,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IACjF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpF,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC;IAErD,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,MAAM,CAAC,gBAAgB,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC,SAAS;YACzB,KAAK,EAAE,MAAM,CAAC,SAAS;YACvB,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,oBAAoB,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;SACtF,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChE,WAAW,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC;IAEtF,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,MAAM,CAAC,gBAAgB,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC,SAAS;YACzB,KAAK,EAAE,MAAM,CAAC,SAAS;YACvB,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,oBAAoB,MAAM,CAAC,SAAS,QAAQ;SACxE,CAAC,CAAC;IACL,CAAC;IAED,gFAAgF;IAChF,oEAAoE;IACpE,+DAA+D;IAC/D,wEAAwE;IACxE,0EAA0E;IAC1E,sEAAsE;IACtE,mEAAmE;IACnE,IAAI,WAAW,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QACpD,sEAAsE;QACtE,8BAA8B;QAC9B,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,8EAA8E;IAC9E,8EAA8E;IAC9E,yEAAyE;IACzE,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,MAAM,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/E,WAAW,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;IAE9D,4CAA4C;IAC5C,MAAM,aAAa,GAA4B,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC5C,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAChD,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACpF,WAAW,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;IAE7D,4EAA4E;IAC5E,MAAM,eAAe,GAAmC,EAAE,CAAC;IAE3D,kBAAkB;IAClB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACnD,eAAe,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IACjC,CAAC;IAED,kBAAkB;IAClB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACnD,eAAe,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IACjC,CAAC;IAED,kBAAkB;IAClB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACnD,eAAe,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IACjC,CAAC;IAED,sBAAsB;IACtB,MAAM,WAAW,GAAmE,EAAE,CAAC;IACvF,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACvD,WAAW,CAAC,IAAI,CAAC;gBACf,YAAY,EAAE,IAAI;gBAClB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAElD,OAAO;QACL,eAAe;QACf,QAAQ,EAAE;YACR,aAAa,EAAE,aAAa;YAC5B,aAAa,EAAE,MAAM,CAAC,SAAS;YAC/B,WAAW;YACX,MAAM,EAAE,MAAM,CAAC,QAAQ;YACvB,WAAW;SACZ;QACD,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB,EAAE,KAAwB;IAC/E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAA+B,CAAC;QAElD,0CAA0C;QAC1C,IAAI,IAAI,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,KAAK,sBAAsB,EAAE,CAAC,IAAI,CAAC,SAAmB,CAAC,CAAC,CAAC;YACxF,SAAS;QACX,CAAC;QAED,gBAAgB;QAChB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3E,MAAM,CAAC,GAAG,CACR,eAAe,IAAI,CAAC,KAAK,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,YAAY,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,OAAO,EAAE,EAC7I,MAAM,CACP,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,qFAAqF;YACrF,MAAM,CAAC,GAAG,CACR,eAAe,IAAI,CAAC,KAAK,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,YAAY,GAAG,EAChF,MAAM,CACP,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAsB,EACtB,WAAyB,EACzB,eAA6D;IAK7D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEtD,+DAA+D;IAC/D,yEAAyE;IACzE,+DAA+D;IAC/D,IAAI,eAAe,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzE,MAAM,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,MAAM;QACN,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,6EAA6E;AAE7E;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,cAAsB;IACtD,OAAO,EAAE,MAAM,EAAE,aAAsB,EAAE,cAAc,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,aAAqB;IACrD,OAAO,EAAE,MAAM,EAAE,aAAsB,EAAE,aAAa,EAAE,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAsB;IACtD,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,cAAc,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAsB;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,aAAa,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,OAAO,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,OAAO,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC;AACzC,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Pipeline adapter factories (Spec 24).
3
+ *
4
+ * Each factory converts an existing analyzer into a Stage2Visitor,
5
+ * Stage3Reducer, or Stage4Reducer for the pipeline. Lazy-loads analyzer
6
+ * classes via dynamic import() to avoid circular dependency issues.
7
+ *
8
+ * Key patterns:
9
+ * - Per-file (solid, data-access, doc, schema): wrap analyzeAST()
10
+ * - DRY: wraps analyzeAST(), accumulates dryPairs internally →
11
+ * factory returns { visitor, getDryPairs } for post-pipeline extraction
12
+ * - React: wraps scanFile() per file, accumulates scan results →
13
+ * factory returns { visitor, finalizeCrossComponent }
14
+ * - DB-based (styles, conventions, cross-domain): reducers call
15
+ * analyzer.analyze([]) with rawDb injected through config
16
+ * - Invariants: Stage 3 reducer — receives full file list, runs rule engine
17
+ */
18
+ import type { Stage2Visitor, Stage3Reducer, Stage4Reducer, Violation } from './types.js';
19
+ /**
20
+ * Infrastructure visitor that records every file's source code so Stage 3
21
+ * reducers can access it without calling readFileSync(). Always registered;
22
+ * declares all known extensions so it covers both parsed and raw tuples.
23
+ */
24
+ export declare function createFileSourcesVisitor(): Stage2Visitor;
25
+ export declare function createSolidVisitor(): Stage2Visitor;
26
+ export interface DryVisitorBundle {
27
+ visitor: Stage2Visitor;
28
+ /** Extract accumulated dryPairs after the pipeline finishes stage 2. */
29
+ getDryPairs: () => Promise<Array<{
30
+ pairFingerprint: string;
31
+ file1: string;
32
+ symbol1: string;
33
+ line1: number;
34
+ contentHash1: string;
35
+ file2: string;
36
+ symbol2: string;
37
+ line2: number;
38
+ contentHash2: string;
39
+ similarity: number;
40
+ }>>;
41
+ }
42
+ export declare function createDryVisitor(fullFunctionIndex?: any[]): DryVisitorBundle;
43
+ export declare function createDataAccessVisitor(): Stage2Visitor;
44
+ export declare function createDocumentationVisitor(): Stage2Visitor;
45
+ export declare function createFunctionIndexVisitor(): Stage2Visitor;
46
+ export interface ReactVisitorBundle {
47
+ visitor: Stage2Visitor;
48
+ /**
49
+ * Run cross-component checks after all files have been visited.
50
+ * Must be called after stage 2 completes.
51
+ */
52
+ finalizeCrossComponent: (config: any) => Promise<Violation[]>;
53
+ }
54
+ export declare function createReactVisitor(): ReactVisitorBundle;
55
+ /**
56
+ * Styles CSS visitor — extracts declarations, tokens, and class usage from
57
+ * tree-sitter-css parsed ASTs. Replaces the regex-based CSS extraction in
58
+ * styleExtractor.ts for .css files only.
59
+ *
60
+ * tree-sitter-css is NOT an SCSS grammar — .scss files stay on the regex path.
61
+ */
62
+ export declare function createStylesCssVisitor(): Stage2Visitor;
63
+ /**
64
+ * Styles reducer — runs all style detectors on existing style_* tables.
65
+ * Uses the analyzer.analyze([]) pattern: passes an empty file list so the
66
+ * analyzer skips file iteration and only queries the DB.
67
+ *
68
+ * Spec 26 Phase 2: CSS facts from the styles-css visitor are inserted into
69
+ * the DB before the analyzer runs. For .css files, the AST extraction replaces
70
+ * the regex-based styleIndexer path (which now skips .css files).
71
+ */
72
+ export declare function createStylesReducer(): Stage3Reducer;
73
+ /**
74
+ * Conventions reducer — queries conventions table and flags deviations
75
+ * (usage-pair, import-form, error-handling, export-shape, naming).
76
+ * Uses analyzer.analyze([]) with rawDb injected.
77
+ */
78
+ export declare function createConventionsReducer(): Stage3Reducer;
79
+ /**
80
+ * Cross-domain reducer — runs written-never-read, read-never-written,
81
+ * transaction-boundary risk, validation-bypass, and uncovered-risk detectors.
82
+ * Uses analyzer.analyze([]) with rawDb injected.
83
+ */
84
+ export declare function createCrossDomainReducer(): Stage4Reducer;
85
+ /**
86
+ * Invariants reducer — enforces user-defined invariant rules from .codeauditor.json.
87
+ * Receives the full file list via context.files and runs the rule engine across
88
+ * all files at once (call-constraint rules inherently need cross-file scope).
89
+ */
90
+ export declare function createInvariantsReducer(): Stage3Reducer;
91
+ /**
92
+ * Schema SQL visitor (.sql files) — extracts raw DDL source for the Stage 3
93
+ * reducer to replay into the known-tables catalog.
94
+ */
95
+ export declare function createSchemaSqlVisitor(): Stage2Visitor;
96
+ /**
97
+ * Schema code visitor (.ts/.tsx/.js/.jsx) — per-file analysis for naming conventions,
98
+ * query patterns, SQL injection, table references, and ORM table extraction.
99
+ */
100
+ export declare function createSchemaCodeVisitor(): Stage2Visitor;
101
+ /**
102
+ * Schema Prisma visitor (.prisma files) — extracts model names for known-table catalog.
103
+ */
104
+ export declare function createSchemaPrismaVisitor(): Stage2Visitor;
105
+ /**
106
+ * Schema JSON visitor (.json files) — parses JSON for the Stage 3 reducer to validate.
107
+ */
108
+ export declare function createSchemaJsonVisitor(): Stage2Visitor;
109
+ /**
110
+ * Schema Stage 3 reducer — cross-file unknown-table detection and JSON schema validation.
111
+ *
112
+ * Consumes facts from schema-sql, schema-code, schema-prisma, and schema-json visitors.
113
+ * Builds the complete known-tables catalog and checks all table references against it.
114
+ */
115
+ export declare function createSchemaReducer(): Stage3Reducer;
116
+ //# sourceMappingURL=pipelineAdapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipelineAdapters.d.ts","sourceRoot":"","sources":["../src/pipelineAdapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAEV,aAAa,EACb,aAAa,EACb,aAAa,EACb,SAAS,EAGV,MAAM,YAAY,CAAC;AA0CpB;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,aAAa,CAgBxD;AAID,wBAAgB,kBAAkB,IAAI,aAAa,CAyBlD;AAID,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,wEAAwE;IACxE,WAAW,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;QAC/B,eAAe,EAAE,MAAM,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QACpE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QACpE,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC,CAAC;CACL;AAED,wBAAgB,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,GAAG,gBAAgB,CAqC5E;AAID,wBAAgB,uBAAuB,IAAI,aAAa,CAsBvD;AAID,wBAAgB,0BAA0B,IAAI,aAAa,CAsB1D;AAiCD,wBAAgB,0BAA0B,IAAI,aAAa,CAmU1D;AAID,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB;;;OAGG;IACH,sBAAsB,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CAC/D;AAED,wBAAgB,kBAAkB,IAAI,kBAAkB,CAgFvD;AAMD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,aAAa,CA6BtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAqFnD;AAID;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,aAAa,CA0CxD;AAID;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,aAAa,CA6BxD;AAID;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,CA4EvD;AAaD;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,aAAa,CAgBtD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,CAwIvD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,aAAa,CAsBzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,CAsBvD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAkKnD"}