vaspera 2.12.0 → 2.13.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 (44) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/__tests__/siem-integration.test.d.ts +7 -0
  3. package/dist/__tests__/siem-integration.test.d.ts.map +1 -0
  4. package/dist/__tests__/siem-integration.test.js +285 -0
  5. package/dist/__tests__/siem-integration.test.js.map +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +296 -16
  8. package/dist/index.js.map +1 -1
  9. package/dist/persistence/__tests__/json-fallback.test.d.ts +5 -0
  10. package/dist/persistence/__tests__/json-fallback.test.d.ts.map +1 -0
  11. package/dist/persistence/__tests__/json-fallback.test.js +249 -0
  12. package/dist/persistence/__tests__/json-fallback.test.js.map +1 -0
  13. package/dist/persistence/__tests__/persistence.test.js.map +1 -1
  14. package/dist/persistence/db.d.ts +15 -0
  15. package/dist/persistence/db.d.ts.map +1 -1
  16. package/dist/persistence/db.js +59 -10
  17. package/dist/persistence/db.js.map +1 -1
  18. package/dist/persistence/index.d.ts +13 -4
  19. package/dist/persistence/index.d.ts.map +1 -1
  20. package/dist/persistence/index.js +139 -14
  21. package/dist/persistence/index.js.map +1 -1
  22. package/dist/persistence/json-fallback.d.ts +52 -0
  23. package/dist/persistence/json-fallback.d.ts.map +1 -0
  24. package/dist/persistence/json-fallback.js +283 -0
  25. package/dist/persistence/json-fallback.js.map +1 -0
  26. package/dist/scanners/ai-code/index.d.ts.map +1 -1
  27. package/dist/scanners/ai-code/index.js +90 -2
  28. package/dist/scanners/ai-code/index.js.map +1 -1
  29. package/dist/scanners/ai-code/types.d.ts +12 -0
  30. package/dist/scanners/ai-code/types.d.ts.map +1 -1
  31. package/dist/scanners/eslint.d.ts.map +1 -1
  32. package/dist/scanners/eslint.js +45 -3
  33. package/dist/scanners/eslint.js.map +1 -1
  34. package/dist/scanners/scale/bottleneck-detector.d.ts +13 -2
  35. package/dist/scanners/scale/bottleneck-detector.d.ts.map +1 -1
  36. package/dist/scanners/scale/bottleneck-detector.js +199 -72
  37. package/dist/scanners/scale/bottleneck-detector.js.map +1 -1
  38. package/dist/scanners/types.d.ts +18 -1
  39. package/dist/scanners/types.d.ts.map +1 -1
  40. package/dist/scanners/types.js.map +1 -1
  41. package/dist/scanners/typescript.d.ts.map +1 -1
  42. package/dist/scanners/typescript.js +36 -4
  43. package/dist/scanners/typescript.js.map +1 -1
  44. package/package.json +1 -1
@@ -2,45 +2,91 @@
2
2
  * Persistence Layer
3
3
  *
4
4
  * SQLite-backed persistence for findings, scans, and trends.
5
+ * Falls back to JSON file storage when SQLite is unavailable.
5
6
  * Provides historical data and enterprise dashboards.
6
7
  *
7
8
  * @module persistence
8
9
  */
9
- import { initDatabase, closeDatabase, createInMemoryDatabase } from "./db.js";
10
+ import { initDatabase, closeDatabase, createInMemoryDatabase, setFallbackMode, } from "./db.js";
10
11
  import { ProjectsRepository } from "./repositories/projects.js";
11
12
  import { FindingsRepository } from "./repositories/findings.js";
12
13
  import { ScansRepository } from "./repositories/scans.js";
13
14
  import { TrendsRepository } from "./repositories/trends.js";
15
+ import { JsonFallbackStorage } from "./json-fallback.js";
16
+ import { logger } from "../logger.js";
14
17
  export * from "./types.js";
18
+ export { isInFallbackMode, getDbStatus, DatabaseInitError } from "./db.js";
15
19
  export class PersistenceManager {
16
20
  db;
21
+ fallback;
17
22
  projects;
18
23
  findings;
19
24
  scans;
20
25
  trends;
21
- constructor(db) {
26
+ isFallbackMode;
27
+ constructor(db, fallback) {
22
28
  this.db = db;
23
- this.projects = new ProjectsRepository(db);
24
- this.findings = new FindingsRepository(db);
25
- this.scans = new ScansRepository(db);
26
- this.trends = new TrendsRepository(db);
29
+ this.fallback = fallback;
30
+ this.isFallbackMode = db === null;
31
+ if (db) {
32
+ this.projects = new ProjectsRepository(db);
33
+ this.findings = new FindingsRepository(db);
34
+ this.scans = new ScansRepository(db);
35
+ this.trends = new TrendsRepository(db);
36
+ }
37
+ else {
38
+ this.projects = null;
39
+ this.findings = null;
40
+ this.scans = null;
41
+ this.trends = null;
42
+ }
27
43
  }
28
44
  static async create(projectPath, config) {
29
- const db = await initDatabase(projectPath, config);
30
- return new PersistenceManager(db);
45
+ try {
46
+ const db = await initDatabase(projectPath, config);
47
+ return new PersistenceManager(db, null);
48
+ }
49
+ catch (error) {
50
+ logger.warn("persistence.sqlite_failed_using_fallback", {
51
+ error: error instanceof Error ? error.message : String(error),
52
+ projectPath,
53
+ });
54
+ const fallback = await JsonFallbackStorage.create(projectPath);
55
+ setFallbackMode(true, error instanceof Error ? error : undefined);
56
+ return new PersistenceManager(null, fallback);
57
+ }
31
58
  }
32
59
  static createInMemory() {
33
60
  const db = createInMemoryDatabase();
34
- return new PersistenceManager(db);
61
+ return new PersistenceManager(db, null);
62
+ }
63
+ getFallback() {
64
+ return this.fallback;
35
65
  }
36
66
  close() {
37
- this.db.close();
67
+ if (this.db) {
68
+ this.db.close();
69
+ }
70
+ if (this.fallback) {
71
+ this.fallback.close();
72
+ }
73
+ }
74
+ async saveIfFallback() {
75
+ if (this.fallback) {
76
+ await this.fallback.save();
77
+ }
38
78
  }
39
79
  getDbPath() {
40
- return this.db.name;
80
+ if (this.db) {
81
+ return this.db.name;
82
+ }
83
+ return "(fallback mode)";
41
84
  }
42
85
  transaction(fn) {
43
- return this.db.transaction(fn)();
86
+ if (this.db) {
87
+ return this.db.transaction(fn)();
88
+ }
89
+ return fn();
44
90
  }
45
91
  }
46
92
  let defaultManager = null;
@@ -63,12 +109,57 @@ export function closePersistence() {
63
109
  }
64
110
  export async function recordScanResults(projectPath, findings, certificationId) {
65
111
  const manager = await initPersistence(projectPath);
66
- const project = manager.projects.findOrCreate(projectPath);
67
- const scan = manager.scans.create(project.id, certificationId);
68
112
  let newCount = 0;
69
113
  let existingCount = 0;
70
114
  const bySeverity = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
71
115
  const byScanner = {};
116
+ if (manager.isFallbackMode && manager.getFallback()) {
117
+ const fallback = manager.getFallback();
118
+ const project = fallback.findOrCreateProject(projectPath);
119
+ const scan = fallback.createScan(project.id, certificationId);
120
+ for (const f of findings) {
121
+ const { isNew } = fallback.upsertFinding({
122
+ projectId: project.id,
123
+ certificationId,
124
+ severity: f.severity,
125
+ category: f.category,
126
+ file: f.file,
127
+ line: f.line,
128
+ column: f.column,
129
+ description: f.description,
130
+ scannerSource: f.scannerSource,
131
+ ruleId: f.ruleId,
132
+ confidence: f.confidence || 100,
133
+ cweIds: f.cweIds,
134
+ });
135
+ if (isNew)
136
+ newCount++;
137
+ else
138
+ existingCount++;
139
+ bySeverity[f.severity] = (bySeverity[f.severity] || 0) + 1;
140
+ byScanner[f.scannerSource] = (byScanner[f.scannerSource] || 0) + 1;
141
+ }
142
+ fallback.completeScan(scan.id, {
143
+ totalFindings: findings.length,
144
+ newFindings: newCount,
145
+ fixedFindings: 0,
146
+ bySeverity: bySeverity,
147
+ byScanner,
148
+ duration: Date.now() - new Date(scan.startedAt).getTime(),
149
+ });
150
+ fallback.updateProjectLastScan(project.id);
151
+ await fallback.save();
152
+ return {
153
+ scanId: scan.id,
154
+ projectId: project.id,
155
+ newFindings: newCount,
156
+ existingFindings: existingCount,
157
+ totalFindings: findings.length,
158
+ fallbackMode: true,
159
+ };
160
+ }
161
+ const project = manager.projects.findOrCreate(projectPath);
162
+ const scan = manager.scans.create(project.id, certificationId);
72
163
  manager.transaction(() => {
73
164
  for (const f of findings) {
74
165
  const { finding, isNew } = manager.findings.upsertFromScan({
@@ -114,6 +205,22 @@ export async function recordScanResults(projectPath, findings, certificationId)
114
205
  }
115
206
  export async function getProjectTrends(projectPath, period = "week", lookbackPeriods = 12) {
116
207
  const manager = await initPersistence(projectPath);
208
+ if (manager.isFallbackMode && manager.getFallback()) {
209
+ const fallback = manager.getFallback();
210
+ const project = fallback.findProjectByPath(projectPath);
211
+ if (!project) {
212
+ throw new Error(`Project not found: ${projectPath}`);
213
+ }
214
+ const stats = fallback.getStats(project.id);
215
+ return {
216
+ project,
217
+ stats,
218
+ trends: [],
219
+ mttr: [],
220
+ fixVelocity: [],
221
+ fallbackMode: true,
222
+ };
223
+ }
117
224
  const project = manager.projects.findByPath(projectPath);
118
225
  if (!project) {
119
226
  throw new Error(`Project not found: ${projectPath}`);
@@ -126,10 +233,28 @@ export async function getProjectTrends(projectPath, period = "week", lookbackPer
126
233
  }
127
234
  export async function markFindingsFixed(projectPath, findingIds, fixedBy) {
128
235
  const manager = await initPersistence(projectPath);
236
+ if (manager.isFallbackMode && manager.getFallback()) {
237
+ const fallback = manager.getFallback();
238
+ const count = fallback.markFixed(findingIds, fixedBy);
239
+ await fallback.save();
240
+ return count;
241
+ }
129
242
  return manager.findings.markFixed(findingIds, fixedBy);
130
243
  }
131
244
  export async function getOpenFindings(projectPath, filter) {
132
245
  const manager = await initPersistence(projectPath);
246
+ if (manager.isFallbackMode && manager.getFallback()) {
247
+ const fallback = manager.getFallback();
248
+ const project = fallback.findProjectByPath(projectPath);
249
+ if (!project) {
250
+ return [];
251
+ }
252
+ return fallback.findFindings({
253
+ ...filter,
254
+ projectId: project.id,
255
+ status: "open",
256
+ });
257
+ }
133
258
  const project = manager.projects.findByPath(projectPath);
134
259
  if (!project) {
135
260
  return [];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * JSON File Fallback Storage
3
+ *
4
+ * Provides fallback storage when SQLite is unavailable.
5
+ * Uses atomic writes (temp file → rename) for data safety.
6
+ *
7
+ * @module persistence/json-fallback
8
+ */
9
+ import type { PersistedFinding, FindingStatus, Project, Scan, ProjectStats } from "./types.js";
10
+ import type { Severity } from "../certification/types.js";
11
+ import type { FindingFilter } from "./repositories/findings.js";
12
+ export interface FallbackData {
13
+ version: number;
14
+ projects: Record<string, Project>;
15
+ findings: Record<string, PersistedFinding>;
16
+ scans: Record<string, Scan>;
17
+ lastUpdated: string;
18
+ }
19
+ export declare class JsonFallbackStorage {
20
+ private data;
21
+ private filePath;
22
+ private isDirty;
23
+ private constructor();
24
+ static create(projectPath: string): Promise<JsonFallbackStorage>;
25
+ save(): Promise<void>;
26
+ findOrCreateProject(path: string): Project;
27
+ findProjectByPath(path: string): Project | undefined;
28
+ updateProjectLastScan(projectId: string): void;
29
+ createFinding(finding: Omit<PersistedFinding, "id" | "firstSeenAt" | "lastSeenAt">): PersistedFinding;
30
+ upsertFinding(finding: Omit<PersistedFinding, "id" | "firstSeenAt" | "lastSeenAt" | "status">): {
31
+ finding: PersistedFinding;
32
+ isNew: boolean;
33
+ };
34
+ findBySignature(projectId: string, file: string, line: number, category: string, scannerSource: string): PersistedFinding | undefined;
35
+ findById(id: string): PersistedFinding | undefined;
36
+ findFindings(filter: FindingFilter): PersistedFinding[];
37
+ updateFindingStatus(id: string, status: FindingStatus, fixedBy?: string): boolean;
38
+ markFixed(ids: string[], fixedBy?: string): number;
39
+ markFalsePositive(id: string, reason?: string): boolean;
40
+ getStats(projectId: string): ProjectStats;
41
+ createScan(projectId: string, certificationId?: string): Scan;
42
+ completeScan(scanId: string, results: {
43
+ totalFindings: number;
44
+ newFindings: number;
45
+ fixedFindings: number;
46
+ bySeverity: Record<Severity, number>;
47
+ byScanner: Record<string, number>;
48
+ duration: number;
49
+ }): void;
50
+ close(): void;
51
+ }
52
+ //# sourceMappingURL=json-fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-fallback.d.ts","sourceRoot":"","sources":["../../src/persistence/json-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,IAAI,EACJ,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;WAKM,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA0BhE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAgB1C,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpD,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQ9C,aAAa,CACX,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,aAAa,GAAG,YAAY,CAAC,GACnE,gBAAgB;IAenB,aAAa,CACX,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,aAAa,GAAG,YAAY,GAAG,QAAQ,CAAC,GAC9E;QAAE,OAAO,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE;IAmBhD,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,gBAAgB,GAAG,SAAS;IAY/B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIlD,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,EAAE;IAuDvD,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAgBjF,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAUlD,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAWvD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IA2DzC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI;IAmB7D,YAAY,CACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,QAAQ,EAAE,MAAM,CAAC;KAClB,GACA,IAAI;IAgBP,KAAK,IAAI,IAAI;CAOd"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * JSON File Fallback Storage
3
+ *
4
+ * Provides fallback storage when SQLite is unavailable.
5
+ * Uses atomic writes (temp file → rename) for data safety.
6
+ *
7
+ * @module persistence/json-fallback
8
+ */
9
+ import { readFile, writeFile, rename, mkdir } from "fs/promises";
10
+ import { existsSync } from "fs";
11
+ import { join } from "path";
12
+ import { randomUUID } from "crypto";
13
+ import { tmpdir } from "os";
14
+ import { logger } from "../logger.js";
15
+ const FALLBACK_VERSION = 1;
16
+ export class JsonFallbackStorage {
17
+ data;
18
+ filePath;
19
+ isDirty = false;
20
+ constructor(filePath, data) {
21
+ this.filePath = filePath;
22
+ this.data = data;
23
+ }
24
+ static async create(projectPath) {
25
+ const fallbackDir = join(projectPath, ".vaspera");
26
+ const filePath = join(fallbackDir, "findings-fallback.json");
27
+ await mkdir(fallbackDir, { recursive: true });
28
+ let data;
29
+ if (existsSync(filePath)) {
30
+ try {
31
+ const content = await readFile(filePath, "utf-8");
32
+ data = JSON.parse(content);
33
+ if (data.version !== FALLBACK_VERSION) {
34
+ data = createEmptyData();
35
+ }
36
+ }
37
+ catch {
38
+ data = createEmptyData();
39
+ }
40
+ }
41
+ else {
42
+ data = createEmptyData();
43
+ }
44
+ logger.info("persistence.fallback.initialized", { path: filePath });
45
+ return new JsonFallbackStorage(filePath, data);
46
+ }
47
+ async save() {
48
+ if (!this.isDirty)
49
+ return;
50
+ this.data.lastUpdated = new Date().toISOString();
51
+ const tempPath = join(tmpdir(), `vaspera-fallback-${randomUUID()}.json`);
52
+ await writeFile(tempPath, JSON.stringify(this.data, null, 2), "utf-8");
53
+ await rename(tempPath, this.filePath);
54
+ this.isDirty = false;
55
+ }
56
+ findOrCreateProject(path) {
57
+ const existing = Object.values(this.data.projects).find((p) => p.path === path);
58
+ if (existing)
59
+ return existing;
60
+ const project = {
61
+ id: randomUUID(),
62
+ path,
63
+ name: path.split("/").pop() || path,
64
+ createdAt: new Date().toISOString(),
65
+ };
66
+ this.data.projects[project.id] = project;
67
+ this.isDirty = true;
68
+ return project;
69
+ }
70
+ findProjectByPath(path) {
71
+ return Object.values(this.data.projects).find((p) => p.path === path);
72
+ }
73
+ updateProjectLastScan(projectId) {
74
+ const project = this.data.projects[projectId];
75
+ if (project) {
76
+ project.lastScanAt = new Date().toISOString();
77
+ this.isDirty = true;
78
+ }
79
+ }
80
+ createFinding(finding) {
81
+ const now = new Date().toISOString();
82
+ const persisted = {
83
+ ...finding,
84
+ id: randomUUID(),
85
+ firstSeenAt: now,
86
+ lastSeenAt: now,
87
+ status: finding.status || "open",
88
+ };
89
+ this.data.findings[persisted.id] = persisted;
90
+ this.isDirty = true;
91
+ return persisted;
92
+ }
93
+ upsertFinding(finding) {
94
+ const existing = this.findBySignature(finding.projectId, finding.file, finding.line, finding.category, finding.scannerSource);
95
+ if (existing) {
96
+ existing.lastSeenAt = new Date().toISOString();
97
+ this.isDirty = true;
98
+ return { finding: existing, isNew: false };
99
+ }
100
+ const created = this.createFinding({ ...finding, status: "open" });
101
+ return { finding: created, isNew: true };
102
+ }
103
+ findBySignature(projectId, file, line, category, scannerSource) {
104
+ return Object.values(this.data.findings).find((f) => f.projectId === projectId &&
105
+ f.file === file &&
106
+ f.line === line &&
107
+ f.category === category &&
108
+ f.scannerSource === scannerSource &&
109
+ f.status !== "fixed");
110
+ }
111
+ findById(id) {
112
+ return this.data.findings[id];
113
+ }
114
+ findFindings(filter) {
115
+ let results = Object.values(this.data.findings);
116
+ if (filter.projectId) {
117
+ results = results.filter((f) => f.projectId === filter.projectId);
118
+ }
119
+ if (filter.certificationId) {
120
+ results = results.filter((f) => f.certificationId === filter.certificationId);
121
+ }
122
+ if (filter.severity) {
123
+ const severities = Array.isArray(filter.severity) ? filter.severity : [filter.severity];
124
+ results = results.filter((f) => severities.includes(f.severity));
125
+ }
126
+ if (filter.status) {
127
+ const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
128
+ results = results.filter((f) => statuses.includes(f.status));
129
+ }
130
+ if (filter.category) {
131
+ const categories = Array.isArray(filter.category) ? filter.category : [filter.category];
132
+ results = results.filter((f) => categories.includes(f.category));
133
+ }
134
+ if (filter.file) {
135
+ results = results.filter((f) => f.file.includes(filter.file));
136
+ }
137
+ if (filter.scannerSource) {
138
+ results = results.filter((f) => f.scannerSource === filter.scannerSource);
139
+ }
140
+ if (filter.sinceDate) {
141
+ results = results.filter((f) => f.firstSeenAt >= filter.sinceDate);
142
+ }
143
+ if (filter.untilDate) {
144
+ results = results.filter((f) => f.firstSeenAt <= filter.untilDate);
145
+ }
146
+ results.sort((a, b) => b.firstSeenAt.localeCompare(a.firstSeenAt));
147
+ if (filter.offset) {
148
+ results = results.slice(filter.offset);
149
+ }
150
+ if (filter.limit) {
151
+ results = results.slice(0, filter.limit);
152
+ }
153
+ return results;
154
+ }
155
+ updateFindingStatus(id, status, fixedBy) {
156
+ const finding = this.data.findings[id];
157
+ if (!finding)
158
+ return false;
159
+ finding.status = status;
160
+ if (status === "fixed") {
161
+ finding.fixedAt = new Date().toISOString();
162
+ if (fixedBy) {
163
+ finding.fixedBy = fixedBy;
164
+ }
165
+ }
166
+ this.isDirty = true;
167
+ return true;
168
+ }
169
+ markFixed(ids, fixedBy) {
170
+ let count = 0;
171
+ for (const id of ids) {
172
+ if (this.updateFindingStatus(id, "fixed", fixedBy)) {
173
+ count++;
174
+ }
175
+ }
176
+ return count;
177
+ }
178
+ markFalsePositive(id, reason) {
179
+ const finding = this.data.findings[id];
180
+ if (!finding)
181
+ return false;
182
+ finding.status = "false_positive";
183
+ finding.falsePositive = true;
184
+ finding.falsePositiveReason = reason;
185
+ this.isDirty = true;
186
+ return true;
187
+ }
188
+ getStats(projectId) {
189
+ const findings = Object.values(this.data.findings).filter((f) => f.projectId === projectId);
190
+ const openFindings = findings.filter((f) => f.status === "open");
191
+ const fixedFindings = findings.filter((f) => f.status === "fixed");
192
+ const falsePositives = findings.filter((f) => f.status === "false_positive");
193
+ const bySeverity = {
194
+ critical: 0,
195
+ high: 0,
196
+ medium: 0,
197
+ low: 0,
198
+ info: 0,
199
+ };
200
+ const byCategory = {};
201
+ const byScanner = {};
202
+ for (const f of openFindings) {
203
+ bySeverity[f.severity] = (bySeverity[f.severity] || 0) + 1;
204
+ byCategory[f.category] = (byCategory[f.category] || 0) + 1;
205
+ }
206
+ for (const f of findings) {
207
+ byScanner[f.scannerSource] = (byScanner[f.scannerSource] || 0) + 1;
208
+ }
209
+ let avgMttrHours;
210
+ const fixedWithTime = fixedFindings.filter((f) => f.fixedAt);
211
+ if (fixedWithTime.length > 0) {
212
+ const totalHours = fixedWithTime.reduce((sum, f) => {
213
+ const fixed = new Date(f.fixedAt).getTime();
214
+ const seen = new Date(f.firstSeenAt).getTime();
215
+ return sum + (fixed - seen) / (1000 * 60 * 60);
216
+ }, 0);
217
+ avgMttrHours = totalHours / fixedWithTime.length;
218
+ }
219
+ const scans = Object.values(this.data.scans).filter((s) => s.projectId === projectId);
220
+ const scanDates = scans.map((s) => s.startedAt).sort();
221
+ return {
222
+ projectId,
223
+ totalFindings: findings.length,
224
+ openFindings: openFindings.length,
225
+ fixedFindings: fixedFindings.length,
226
+ falsePositives: falsePositives.length,
227
+ bySeverity,
228
+ byCategory,
229
+ byScanner,
230
+ avgMttrHours,
231
+ firstScanAt: scanDates[0],
232
+ lastScanAt: scanDates[scanDates.length - 1],
233
+ };
234
+ }
235
+ createScan(projectId, certificationId) {
236
+ const scan = {
237
+ id: randomUUID(),
238
+ projectId,
239
+ certificationId,
240
+ startedAt: new Date().toISOString(),
241
+ status: "running",
242
+ totalFindings: 0,
243
+ newFindings: 0,
244
+ fixedFindings: 0,
245
+ bySeverity: { critical: 0, high: 0, medium: 0, low: 0, info: 0 },
246
+ byScanner: {},
247
+ };
248
+ this.data.scans[scan.id] = scan;
249
+ this.isDirty = true;
250
+ return scan;
251
+ }
252
+ completeScan(scanId, results) {
253
+ const scan = this.data.scans[scanId];
254
+ if (!scan)
255
+ return;
256
+ scan.completedAt = new Date().toISOString();
257
+ scan.status = "completed";
258
+ scan.totalFindings = results.totalFindings;
259
+ scan.newFindings = results.newFindings;
260
+ scan.fixedFindings = results.fixedFindings;
261
+ scan.bySeverity = results.bySeverity;
262
+ scan.byScanner = results.byScanner;
263
+ scan.duration = results.duration;
264
+ this.isDirty = true;
265
+ }
266
+ close() {
267
+ // Sync save on close
268
+ if (this.isDirty) {
269
+ const content = JSON.stringify(this.data, null, 2);
270
+ require("fs").writeFileSync(this.filePath, content, "utf-8");
271
+ }
272
+ }
273
+ }
274
+ function createEmptyData() {
275
+ return {
276
+ version: FALLBACK_VERSION,
277
+ projects: {},
278
+ findings: {},
279
+ scans: {},
280
+ lastUpdated: new Date().toISOString(),
281
+ };
282
+ }
283
+ //# sourceMappingURL=json-fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-fallback.js","sourceRoot":"","sources":["../../src/persistence/json-fallback.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/ai-code/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,EAGZ,MAAM,YAAY,CAAC;AAwBpB,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,WAAW,EACX,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAEhC,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA0BhC;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAED,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CA4F/B;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,WAAW,EAAE,CAAC;CAC3B,CAAC,CAqBD;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAgE7E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/ai-code/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,EAIZ,MAAM,YAAY,CAAC;AAwBpB,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,WAAW,EACX,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAEhC,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA0BhC;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAED,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AA2ED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CAwH/B;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,WAAW,EAAE,CAAC;CAC3B,CAAC,CAqBD;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAgE7E"}