@nahisaho/musubix-security 1.8.0 → 1.8.1

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 (186) hide show
  1. package/README.md +27 -0
  2. package/dist/analyzers/ai/index.d.ts +6 -0
  3. package/dist/analyzers/ai/index.d.ts.map +1 -0
  4. package/dist/analyzers/ai/index.js +6 -0
  5. package/dist/analyzers/ai/index.js.map +1 -0
  6. package/dist/analyzers/ai/prompt-injection-detector.d.ts +152 -0
  7. package/dist/analyzers/ai/prompt-injection-detector.d.ts.map +1 -0
  8. package/dist/analyzers/ai/prompt-injection-detector.js +468 -0
  9. package/dist/analyzers/ai/prompt-injection-detector.js.map +1 -0
  10. package/dist/analyzers/api/api-security-analyzer.d.ts +263 -0
  11. package/dist/analyzers/api/api-security-analyzer.d.ts.map +1 -0
  12. package/dist/analyzers/api/api-security-analyzer.js +581 -0
  13. package/dist/analyzers/api/api-security-analyzer.js.map +1 -0
  14. package/dist/analyzers/compliance/compliance-checker.d.ts +201 -0
  15. package/dist/analyzers/compliance/compliance-checker.d.ts.map +1 -0
  16. package/dist/analyzers/compliance/compliance-checker.js +772 -0
  17. package/dist/analyzers/compliance/compliance-checker.js.map +1 -0
  18. package/dist/analyzers/container/image-scanner.d.ts +163 -0
  19. package/dist/analyzers/container/image-scanner.d.ts.map +1 -0
  20. package/dist/analyzers/container/image-scanner.js +459 -0
  21. package/dist/analyzers/container/image-scanner.js.map +1 -0
  22. package/dist/analyzers/container/index.d.ts +6 -0
  23. package/dist/analyzers/container/index.d.ts.map +1 -0
  24. package/dist/analyzers/container/index.js +6 -0
  25. package/dist/analyzers/container/index.js.map +1 -0
  26. package/dist/analyzers/dashboard/security-dashboard.d.ts +286 -0
  27. package/dist/analyzers/dashboard/security-dashboard.d.ts.map +1 -0
  28. package/dist/analyzers/dashboard/security-dashboard.js +796 -0
  29. package/dist/analyzers/dashboard/security-dashboard.js.map +1 -0
  30. package/dist/analyzers/iac/iac-checker.d.ts +124 -0
  31. package/dist/analyzers/iac/iac-checker.d.ts.map +1 -0
  32. package/dist/analyzers/iac/iac-checker.js +755 -0
  33. package/dist/analyzers/iac/iac-checker.js.map +1 -0
  34. package/dist/analyzers/iac/index.d.ts +6 -0
  35. package/dist/analyzers/iac/index.d.ts.map +1 -0
  36. package/dist/analyzers/iac/index.js +6 -0
  37. package/dist/analyzers/iac/index.js.map +1 -0
  38. package/dist/analyzers/index.d.ts +9 -0
  39. package/dist/analyzers/index.d.ts.map +1 -0
  40. package/dist/analyzers/index.js +13 -0
  41. package/dist/analyzers/index.js.map +1 -0
  42. package/dist/analyzers/monitor/realtime-monitor.d.ts +216 -0
  43. package/dist/analyzers/monitor/realtime-monitor.d.ts.map +1 -0
  44. package/dist/analyzers/monitor/realtime-monitor.js +601 -0
  45. package/dist/analyzers/monitor/realtime-monitor.js.map +1 -0
  46. package/dist/analyzers/sast/index.d.ts +7 -0
  47. package/dist/analyzers/sast/index.d.ts.map +1 -0
  48. package/dist/analyzers/sast/index.js +7 -0
  49. package/dist/analyzers/sast/index.js.map +1 -0
  50. package/dist/analyzers/sast/interprocedural-analyzer.d.ts +276 -0
  51. package/dist/analyzers/sast/interprocedural-analyzer.d.ts.map +1 -0
  52. package/dist/analyzers/sast/interprocedural-analyzer.js +635 -0
  53. package/dist/analyzers/sast/interprocedural-analyzer.js.map +1 -0
  54. package/dist/analyzers/sast/zero-day-detector.d.ts +183 -0
  55. package/dist/analyzers/sast/zero-day-detector.d.ts.map +1 -0
  56. package/dist/analyzers/sast/zero-day-detector.js +593 -0
  57. package/dist/analyzers/sast/zero-day-detector.js.map +1 -0
  58. package/dist/analyzers/sca/dependency-scanner.d.ts +275 -0
  59. package/dist/analyzers/sca/dependency-scanner.d.ts.map +1 -0
  60. package/dist/analyzers/sca/dependency-scanner.js +642 -0
  61. package/dist/analyzers/sca/dependency-scanner.js.map +1 -0
  62. package/dist/core/index.d.ts +8 -0
  63. package/dist/core/index.d.ts.map +1 -0
  64. package/dist/core/index.js +10 -0
  65. package/dist/core/index.js.map +1 -0
  66. package/dist/core/pipeline-manager.d.ts +105 -0
  67. package/dist/core/pipeline-manager.d.ts.map +1 -0
  68. package/dist/core/pipeline-manager.js +449 -0
  69. package/dist/core/pipeline-manager.js.map +1 -0
  70. package/dist/core/result-aggregator.d.ts +96 -0
  71. package/dist/core/result-aggregator.d.ts.map +1 -0
  72. package/dist/core/result-aggregator.js +462 -0
  73. package/dist/core/result-aggregator.js.map +1 -0
  74. package/dist/index.d.ts +15 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +68 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/integrations/ci-integration.d.ts +227 -0
  79. package/dist/integrations/ci-integration.d.ts.map +1 -0
  80. package/dist/integrations/ci-integration.js +472 -0
  81. package/dist/integrations/ci-integration.js.map +1 -0
  82. package/dist/integrations/git-hooks.d.ts +155 -0
  83. package/dist/integrations/git-hooks.d.ts.map +1 -0
  84. package/dist/integrations/git-hooks.js +425 -0
  85. package/dist/integrations/git-hooks.js.map +1 -0
  86. package/dist/integrations/index.d.ts +9 -0
  87. package/dist/integrations/index.d.ts.map +1 -0
  88. package/dist/integrations/index.js +9 -0
  89. package/dist/integrations/index.js.map +1 -0
  90. package/dist/integrations/report-aggregator.d.ts +250 -0
  91. package/dist/integrations/report-aggregator.d.ts.map +1 -0
  92. package/dist/integrations/report-aggregator.js +488 -0
  93. package/dist/integrations/report-aggregator.js.map +1 -0
  94. package/dist/integrations/vscode-integration.d.ts +245 -0
  95. package/dist/integrations/vscode-integration.d.ts.map +1 -0
  96. package/dist/integrations/vscode-integration.js +449 -0
  97. package/dist/integrations/vscode-integration.js.map +1 -0
  98. package/dist/intelligence/attack-pattern-matcher.d.ts +217 -0
  99. package/dist/intelligence/attack-pattern-matcher.d.ts.map +1 -0
  100. package/dist/intelligence/attack-pattern-matcher.js +887 -0
  101. package/dist/intelligence/attack-pattern-matcher.js.map +1 -0
  102. package/dist/intelligence/index.d.ts +12 -0
  103. package/dist/intelligence/index.d.ts.map +1 -0
  104. package/dist/intelligence/index.js +18 -0
  105. package/dist/intelligence/index.js.map +1 -0
  106. package/dist/intelligence/neuro-symbolic-core.d.ts +88 -0
  107. package/dist/intelligence/neuro-symbolic-core.d.ts.map +1 -0
  108. package/dist/intelligence/neuro-symbolic-core.js +403 -0
  109. package/dist/intelligence/neuro-symbolic-core.js.map +1 -0
  110. package/dist/intelligence/predictive-analyzer.d.ts +317 -0
  111. package/dist/intelligence/predictive-analyzer.d.ts.map +1 -0
  112. package/dist/intelligence/predictive-analyzer.js +714 -0
  113. package/dist/intelligence/predictive-analyzer.js.map +1 -0
  114. package/dist/intelligence/risk-scorer.d.ts +333 -0
  115. package/dist/intelligence/risk-scorer.d.ts.map +1 -0
  116. package/dist/intelligence/risk-scorer.js +824 -0
  117. package/dist/intelligence/risk-scorer.js.map +1 -0
  118. package/dist/intelligence/security-analytics.d.ts +349 -0
  119. package/dist/intelligence/security-analytics.d.ts.map +1 -0
  120. package/dist/intelligence/security-analytics.js +813 -0
  121. package/dist/intelligence/security-analytics.js.map +1 -0
  122. package/dist/intelligence/threat-intelligence.d.ts +288 -0
  123. package/dist/intelligence/threat-intelligence.d.ts.map +1 -0
  124. package/dist/intelligence/threat-intelligence.js +639 -0
  125. package/dist/intelligence/threat-intelligence.js.map +1 -0
  126. package/dist/policy/index.d.ts +6 -0
  127. package/dist/policy/index.d.ts.map +1 -0
  128. package/dist/policy/index.js +6 -0
  129. package/dist/policy/index.js.map +1 -0
  130. package/dist/policy/policy-engine.d.ts +254 -0
  131. package/dist/policy/policy-engine.d.ts.map +1 -0
  132. package/dist/policy/policy-engine.js +651 -0
  133. package/dist/policy/policy-engine.js.map +1 -0
  134. package/dist/remediation/auto-fixer.d.ts +179 -0
  135. package/dist/remediation/auto-fixer.d.ts.map +1 -0
  136. package/dist/remediation/auto-fixer.js +540 -0
  137. package/dist/remediation/auto-fixer.js.map +1 -0
  138. package/dist/remediation/fix-validator.d.ts +195 -0
  139. package/dist/remediation/fix-validator.d.ts.map +1 -0
  140. package/dist/remediation/fix-validator.js +462 -0
  141. package/dist/remediation/fix-validator.js.map +1 -0
  142. package/dist/remediation/index.d.ts +10 -0
  143. package/dist/remediation/index.d.ts.map +1 -0
  144. package/dist/remediation/index.js +15 -0
  145. package/dist/remediation/index.js.map +1 -0
  146. package/dist/remediation/patch-generator.d.ts +203 -0
  147. package/dist/remediation/patch-generator.d.ts.map +1 -0
  148. package/dist/remediation/patch-generator.js +533 -0
  149. package/dist/remediation/patch-generator.js.map +1 -0
  150. package/dist/remediation/remediation-planner.d.ts +262 -0
  151. package/dist/remediation/remediation-planner.d.ts.map +1 -0
  152. package/dist/remediation/remediation-planner.js +531 -0
  153. package/dist/remediation/remediation-planner.js.map +1 -0
  154. package/dist/remediation/secure-code-transformer.d.ts +222 -0
  155. package/dist/remediation/secure-code-transformer.d.ts.map +1 -0
  156. package/dist/remediation/secure-code-transformer.js +625 -0
  157. package/dist/remediation/secure-code-transformer.js.map +1 -0
  158. package/dist/types/fix.d.ts +3 -1
  159. package/dist/types/fix.d.ts.map +1 -1
  160. package/dist/types/index.d.ts +6 -0
  161. package/dist/types/index.d.ts.map +1 -1
  162. package/dist/types/index.js +1 -0
  163. package/dist/types/index.js.map +1 -1
  164. package/dist/types/interprocedural.d.ts +203 -0
  165. package/dist/types/interprocedural.d.ts.map +1 -0
  166. package/dist/types/interprocedural.js +7 -0
  167. package/dist/types/interprocedural.js.map +1 -0
  168. package/dist/types/neuro-symbolic.d.ts +179 -0
  169. package/dist/types/neuro-symbolic.d.ts.map +1 -0
  170. package/dist/types/neuro-symbolic.js +7 -0
  171. package/dist/types/neuro-symbolic.js.map +1 -0
  172. package/dist/types/pipeline.d.ts +173 -0
  173. package/dist/types/pipeline.d.ts.map +1 -0
  174. package/dist/types/pipeline.js +7 -0
  175. package/dist/types/pipeline.js.map +1 -0
  176. package/dist/types/result.d.ts +134 -0
  177. package/dist/types/result.d.ts.map +1 -0
  178. package/dist/types/result.js +25 -0
  179. package/dist/types/result.js.map +1 -0
  180. package/dist/types/vulnerability.d.ts +2 -2
  181. package/dist/types/vulnerability.d.ts.map +1 -1
  182. package/dist/types/zero-day.d.ts +146 -0
  183. package/dist/types/zero-day.d.ts.map +1 -0
  184. package/dist/types/zero-day.js +7 -0
  185. package/dist/types/zero-day.js.map +1 -0
  186. package/package.json +2 -2
@@ -0,0 +1,488 @@
1
+ /**
2
+ * @fileoverview Report Aggregator for Multiple Scan Results
3
+ * @module @nahisaho/musubix-security/integrations/report-aggregator
4
+ *
5
+ * Aggregates multiple security scan results into unified reports
6
+ * with trend analysis and comparison capabilities.
7
+ */
8
+ // ============================================================================
9
+ // Report Aggregator Class
10
+ // ============================================================================
11
+ /**
12
+ * Aggregates multiple security scan results
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const aggregator = createReportAggregator({
17
+ * deduplicate: true,
18
+ * groupBy: 'severity',
19
+ * });
20
+ *
21
+ * aggregator.addScan('vuln-scan', scanResult1, 'vulnerability');
22
+ * aggregator.addScan('secret-scan', scanResult2, 'secret');
23
+ *
24
+ * const report = aggregator.generateReport();
25
+ * ```
26
+ */
27
+ export class ReportAggregator {
28
+ options;
29
+ scans = [];
30
+ history = [];
31
+ scanCounter = 0;
32
+ constructor(options = {}) {
33
+ this.options = {
34
+ deduplicate: options.deduplicate ?? true,
35
+ similarityThreshold: options.similarityThreshold ?? 0.8,
36
+ groupBy: options.groupBy ?? 'severity',
37
+ includeHistory: options.includeHistory ?? true,
38
+ maxHistoryEntries: options.maxHistoryEntries ?? 10,
39
+ };
40
+ }
41
+ /**
42
+ * Add a scan result to the aggregator
43
+ */
44
+ addScan(source, result, type = 'full', metadata) {
45
+ const id = `scan-${++this.scanCounter}-${Date.now()}`;
46
+ this.scans.push({
47
+ id,
48
+ timestamp: new Date(),
49
+ source,
50
+ type,
51
+ result,
52
+ metadata,
53
+ });
54
+ return id;
55
+ }
56
+ /**
57
+ * Remove a scan by ID
58
+ */
59
+ removeScan(id) {
60
+ const index = this.scans.findIndex(s => s.id === id);
61
+ if (index >= 0) {
62
+ this.scans.splice(index, 1);
63
+ return true;
64
+ }
65
+ return false;
66
+ }
67
+ /**
68
+ * Clear all scans
69
+ */
70
+ clear() {
71
+ this.scans = [];
72
+ }
73
+ /**
74
+ * Generate aggregated report
75
+ */
76
+ generateReport() {
77
+ const reportId = `report-${Date.now()}`;
78
+ const generatedAt = new Date();
79
+ // Aggregate all findings
80
+ const allFindings = this.aggregateFindings();
81
+ // Deduplicate if enabled
82
+ const findings = this.options.deduplicate
83
+ ? this.deduplicateFindings(allFindings)
84
+ : allFindings;
85
+ // Generate grouped findings
86
+ const groupedFindings = this.groupFindings(findings);
87
+ // Generate summary
88
+ const summary = this.generateSummary(findings);
89
+ // Generate scan sources
90
+ const sources = this.generateSources();
91
+ // Generate trends
92
+ const trends = this.generateTrends(findings);
93
+ // Compare with previous report
94
+ const comparison = this.options.includeHistory && this.history.length > 0
95
+ ? this.compareWithPrevious(findings)
96
+ : undefined;
97
+ const report = {
98
+ reportId,
99
+ generatedAt,
100
+ summary,
101
+ findings,
102
+ groupedFindings,
103
+ sources,
104
+ trends,
105
+ comparison,
106
+ };
107
+ // Save to history
108
+ if (this.options.includeHistory) {
109
+ this.history.push(report);
110
+ if (this.history.length > this.options.maxHistoryEntries) {
111
+ this.history.shift();
112
+ }
113
+ }
114
+ return report;
115
+ }
116
+ /**
117
+ * Get scan count
118
+ */
119
+ getScanCount() {
120
+ return this.scans.length;
121
+ }
122
+ /**
123
+ * Get history
124
+ */
125
+ getHistory() {
126
+ return [...this.history];
127
+ }
128
+ /**
129
+ * Export report as JSON
130
+ */
131
+ exportJSON(report) {
132
+ return JSON.stringify(report, (_key, value) => {
133
+ if (value instanceof Date) {
134
+ return value.toISOString();
135
+ }
136
+ if (value instanceof Map) {
137
+ return Object.fromEntries(value);
138
+ }
139
+ return value;
140
+ }, 2);
141
+ }
142
+ /**
143
+ * Export report as Markdown
144
+ */
145
+ exportMarkdown(report) {
146
+ const lines = [];
147
+ lines.push('# Security Scan Aggregated Report');
148
+ lines.push('');
149
+ lines.push(`**Generated:** ${report.generatedAt.toISOString()}`);
150
+ lines.push(`**Report ID:** ${report.reportId}`);
151
+ lines.push('');
152
+ // Summary
153
+ lines.push('## Summary');
154
+ lines.push('');
155
+ lines.push(`- **Total Scans:** ${report.summary.totalScans}`);
156
+ lines.push(`- **Total Findings:** ${report.summary.totalFindings}`);
157
+ lines.push(`- **Security Score:** ${report.summary.securityScore}/100`);
158
+ lines.push(`- **Risk Level:** ${report.summary.riskLevel.toUpperCase()}`);
159
+ lines.push('');
160
+ // Severity breakdown
161
+ lines.push('### Findings by Severity');
162
+ lines.push('');
163
+ lines.push('| Severity | Count |');
164
+ lines.push('|----------|-------|');
165
+ for (const severity of ['critical', 'high', 'medium', 'low', 'info']) {
166
+ lines.push(`| ${severity} | ${report.summary.bySeverity[severity]} |`);
167
+ }
168
+ lines.push('');
169
+ // Comparison
170
+ if (report.comparison) {
171
+ lines.push('## Changes from Previous');
172
+ lines.push('');
173
+ lines.push(`- **New Findings:** ${report.comparison.newFindings.length}`);
174
+ lines.push(`- **Fixed Findings:** ${report.comparison.fixedFindings.length}`);
175
+ lines.push(`- **Score Change:** ${report.comparison.scoreDelta > 0 ? '+' : ''}${report.comparison.scoreDelta}`);
176
+ lines.push('');
177
+ }
178
+ // Top findings
179
+ lines.push('## Top Findings');
180
+ lines.push('');
181
+ const topFindings = report.findings
182
+ .filter(f => f.vulnerability.severity === 'critical' || f.vulnerability.severity === 'high')
183
+ .slice(0, 10);
184
+ for (const finding of topFindings) {
185
+ lines.push(`### ${finding.vulnerability.ruleId}`);
186
+ lines.push('');
187
+ lines.push(`- **Severity:** ${finding.vulnerability.severity}`);
188
+ lines.push(`- **File:** ${finding.vulnerability.location.file}:${finding.vulnerability.location.startLine}`);
189
+ lines.push(`- **Occurrences:** ${finding.occurrences}`);
190
+ lines.push(`- **Message:** ${finding.vulnerability.description}`);
191
+ lines.push('');
192
+ }
193
+ return lines.join('\n');
194
+ }
195
+ // ============================================================================
196
+ // Private Methods
197
+ // ============================================================================
198
+ aggregateFindings() {
199
+ const findingsMap = new Map();
200
+ for (const scan of this.scans) {
201
+ for (const vuln of scan.result.vulnerabilities) {
202
+ const fingerprint = this.generateFingerprint(vuln);
203
+ const existing = findingsMap.get(fingerprint);
204
+ if (existing) {
205
+ existing.occurrences++;
206
+ existing.sources.push(scan.source);
207
+ existing.lastSeen = scan.timestamp;
208
+ }
209
+ else {
210
+ findingsMap.set(fingerprint, {
211
+ id: `finding-${findingsMap.size + 1}`,
212
+ vulnerability: vuln,
213
+ sources: [scan.source],
214
+ occurrences: 1,
215
+ firstSeen: scan.timestamp,
216
+ lastSeen: scan.timestamp,
217
+ isNew: false,
218
+ isFixed: false,
219
+ fingerprint,
220
+ });
221
+ }
222
+ }
223
+ }
224
+ return Array.from(findingsMap.values());
225
+ }
226
+ deduplicateFindings(findings) {
227
+ const deduplicated = [];
228
+ for (const finding of findings) {
229
+ const similar = deduplicated.find(f => this.calculateSimilarity(f, finding) >= this.options.similarityThreshold);
230
+ if (similar) {
231
+ similar.occurrences += finding.occurrences;
232
+ similar.sources.push(...finding.sources);
233
+ if (finding.firstSeen < similar.firstSeen) {
234
+ similar.firstSeen = finding.firstSeen;
235
+ }
236
+ if (finding.lastSeen > similar.lastSeen) {
237
+ similar.lastSeen = finding.lastSeen;
238
+ }
239
+ }
240
+ else {
241
+ deduplicated.push({ ...finding });
242
+ }
243
+ }
244
+ return deduplicated;
245
+ }
246
+ groupFindings(findings) {
247
+ const byFile = new Map();
248
+ const byRule = new Map();
249
+ const bySeverity = new Map();
250
+ const byCategory = new Map();
251
+ for (const finding of findings) {
252
+ // By file
253
+ const file = finding.vulnerability.location.file;
254
+ if (!byFile.has(file))
255
+ byFile.set(file, []);
256
+ byFile.get(file).push(finding);
257
+ // By rule
258
+ const rule = finding.vulnerability.ruleId;
259
+ if (!byRule.has(rule))
260
+ byRule.set(rule, []);
261
+ byRule.get(rule).push(finding);
262
+ // By severity
263
+ const severity = finding.vulnerability.severity;
264
+ if (!bySeverity.has(severity))
265
+ bySeverity.set(severity, []);
266
+ bySeverity.get(severity).push(finding);
267
+ // By category
268
+ const category = finding.vulnerability.owasp?.[0] ?? 'unknown';
269
+ if (!byCategory.has(category))
270
+ byCategory.set(category, []);
271
+ byCategory.get(category).push(finding);
272
+ }
273
+ return { byFile, byRule, bySeverity, byCategory };
274
+ }
275
+ generateSummary(findings) {
276
+ const bySeverity = {
277
+ critical: 0,
278
+ high: 0,
279
+ medium: 0,
280
+ low: 0,
281
+ info: 0,
282
+ };
283
+ const byType = {
284
+ vulnerability: 0,
285
+ secret: 0,
286
+ dependency: 0,
287
+ compliance: 0,
288
+ container: 0,
289
+ iac: 0,
290
+ api: 0,
291
+ full: 0,
292
+ };
293
+ const files = new Set();
294
+ const rules = new Set();
295
+ for (const finding of findings) {
296
+ bySeverity[finding.vulnerability.severity]++;
297
+ files.add(finding.vulnerability.location.file);
298
+ rules.add(finding.vulnerability.ruleId);
299
+ }
300
+ for (const scan of this.scans) {
301
+ byType[scan.type] += scan.result.vulnerabilities.length;
302
+ }
303
+ // Calculate security score
304
+ const penalty = bySeverity.critical * 25 +
305
+ bySeverity.high * 10 +
306
+ bySeverity.medium * 5 +
307
+ bySeverity.low * 2 +
308
+ bySeverity.info * 0.5;
309
+ const securityScore = Math.max(0, Math.min(100, Math.round(100 - penalty)));
310
+ // Determine risk level
311
+ let riskLevel;
312
+ if (bySeverity.critical > 0)
313
+ riskLevel = 'critical';
314
+ else if (bySeverity.high > 0)
315
+ riskLevel = 'high';
316
+ else if (bySeverity.medium > 0)
317
+ riskLevel = 'medium';
318
+ else if (bySeverity.low > 0)
319
+ riskLevel = 'low';
320
+ else
321
+ riskLevel = 'minimal';
322
+ return {
323
+ totalScans: this.scans.length,
324
+ totalFindings: findings.length,
325
+ bySeverity,
326
+ byType,
327
+ filesAffected: files.size,
328
+ rulesTriggered: rules.size,
329
+ securityScore,
330
+ riskLevel,
331
+ };
332
+ }
333
+ generateSources() {
334
+ return this.scans.map(scan => ({
335
+ id: scan.id,
336
+ type: scan.type,
337
+ timestamp: scan.timestamp,
338
+ target: scan.source,
339
+ findingCount: scan.result.vulnerabilities.length,
340
+ }));
341
+ }
342
+ generateTrends(findings) {
343
+ const dataPoints = this.history.map(report => ({
344
+ timestamp: report.generatedAt,
345
+ totalFindings: report.summary.totalFindings,
346
+ criticalFindings: report.summary.bySeverity.critical,
347
+ securityScore: report.summary.securityScore,
348
+ }));
349
+ // Add current
350
+ const currentScore = this.calculateSecurityScore(findings);
351
+ dataPoints.push({
352
+ timestamp: new Date(),
353
+ totalFindings: findings.length,
354
+ criticalFindings: findings.filter(f => f.vulnerability.severity === 'critical').length,
355
+ securityScore: currentScore,
356
+ });
357
+ // Calculate direction
358
+ let direction = 'stable';
359
+ let changePercent = 0;
360
+ if (dataPoints.length >= 2) {
361
+ const prev = dataPoints[dataPoints.length - 2];
362
+ const curr = dataPoints[dataPoints.length - 1];
363
+ changePercent = prev.totalFindings > 0
364
+ ? Math.round((curr.totalFindings - prev.totalFindings) / prev.totalFindings * 100)
365
+ : 0;
366
+ if (changePercent < -10)
367
+ direction = 'improving';
368
+ else if (changePercent > 10)
369
+ direction = 'degrading';
370
+ }
371
+ // Project risk
372
+ const projectedRisk = direction === 'degrading'
373
+ ? 'Risk increasing - immediate attention recommended'
374
+ : direction === 'improving'
375
+ ? 'Risk decreasing - continue current practices'
376
+ : 'Risk stable - maintain vigilance';
377
+ return {
378
+ dataPoints,
379
+ direction,
380
+ changePercent,
381
+ projectedRisk,
382
+ };
383
+ }
384
+ compareWithPrevious(currentFindings) {
385
+ const previousReport = this.history[this.history.length - 1];
386
+ if (!previousReport) {
387
+ return {
388
+ newFindings: currentFindings.map(f => ({ ...f, isNew: true })),
389
+ fixedFindings: [],
390
+ unchangedFindings: [],
391
+ findingDelta: currentFindings.length,
392
+ scoreDelta: 0,
393
+ summaryText: 'First report - no comparison available',
394
+ };
395
+ }
396
+ const prevFingerprints = new Set(previousReport.findings.map(f => f.fingerprint));
397
+ const currFingerprints = new Set(currentFindings.map(f => f.fingerprint));
398
+ const newFindings = currentFindings
399
+ .filter(f => !prevFingerprints.has(f.fingerprint))
400
+ .map(f => ({ ...f, isNew: true }));
401
+ const fixedFindings = previousReport.findings
402
+ .filter(f => !currFingerprints.has(f.fingerprint))
403
+ .map(f => ({ ...f, isFixed: true }));
404
+ const unchangedFindings = currentFindings
405
+ .filter(f => prevFingerprints.has(f.fingerprint));
406
+ const currentScore = this.calculateSecurityScore(currentFindings);
407
+ const findingDelta = currentFindings.length - previousReport.findings.length;
408
+ const scoreDelta = currentScore - previousReport.summary.securityScore;
409
+ let summaryText;
410
+ if (newFindings.length === 0 && fixedFindings.length === 0) {
411
+ summaryText = 'No changes detected';
412
+ }
413
+ else if (fixedFindings.length > newFindings.length) {
414
+ summaryText = `Improvement: ${fixedFindings.length} fixed, ${newFindings.length} new`;
415
+ }
416
+ else if (newFindings.length > fixedFindings.length) {
417
+ summaryText = `Regression: ${newFindings.length} new, ${fixedFindings.length} fixed`;
418
+ }
419
+ else {
420
+ summaryText = `Mixed: ${newFindings.length} new, ${fixedFindings.length} fixed`;
421
+ }
422
+ return {
423
+ newFindings,
424
+ fixedFindings,
425
+ unchangedFindings,
426
+ findingDelta,
427
+ scoreDelta,
428
+ summaryText,
429
+ };
430
+ }
431
+ generateFingerprint(vuln) {
432
+ const parts = [
433
+ vuln.ruleId,
434
+ vuln.location.file,
435
+ vuln.location.startLine.toString(),
436
+ vuln.description.substring(0, 100),
437
+ ];
438
+ return parts.join('::');
439
+ }
440
+ calculateSimilarity(a, b) {
441
+ // Same rule = high similarity
442
+ if (a.vulnerability.ruleId === b.vulnerability.ruleId) {
443
+ // Same file = very high similarity
444
+ if (a.vulnerability.location.file === b.vulnerability.location.file) {
445
+ // Same line = identical
446
+ if (a.vulnerability.location.startLine === b.vulnerability.location.startLine) {
447
+ return 1.0;
448
+ }
449
+ return 0.9;
450
+ }
451
+ return 0.7;
452
+ }
453
+ return 0;
454
+ }
455
+ calculateSecurityScore(findings) {
456
+ let penalty = 0;
457
+ for (const finding of findings) {
458
+ switch (finding.vulnerability.severity) {
459
+ case 'critical':
460
+ penalty += 25;
461
+ break;
462
+ case 'high':
463
+ penalty += 10;
464
+ break;
465
+ case 'medium':
466
+ penalty += 5;
467
+ break;
468
+ case 'low':
469
+ penalty += 2;
470
+ break;
471
+ case 'info':
472
+ penalty += 0.5;
473
+ break;
474
+ }
475
+ }
476
+ return Math.max(0, Math.min(100, Math.round(100 - penalty)));
477
+ }
478
+ }
479
+ // ============================================================================
480
+ // Factory Functions
481
+ // ============================================================================
482
+ /**
483
+ * Create a report aggregator
484
+ */
485
+ export function createReportAggregator(options) {
486
+ return new ReportAggregator(options);
487
+ }
488
+ //# sourceMappingURL=report-aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-aggregator.js","sourceRoot":"","sources":["../../src/integrations/report-aggregator.ts"],"names":[],"mappings":"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"}