vaspera 2.11.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 (176) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/__tests__/audit-trail.test.d.ts +7 -0
  3. package/dist/__tests__/audit-trail.test.d.ts.map +1 -0
  4. package/dist/__tests__/audit-trail.test.js +336 -0
  5. package/dist/__tests__/audit-trail.test.js.map +1 -0
  6. package/dist/__tests__/property-test-helpers.d.ts +1 -1
  7. package/dist/__tests__/siem-integration.test.d.ts +7 -0
  8. package/dist/__tests__/siem-integration.test.d.ts.map +1 -0
  9. package/dist/__tests__/siem-integration.test.js +285 -0
  10. package/dist/__tests__/siem-integration.test.js.map +1 -0
  11. package/dist/action/pr-comment.test.js +1 -0
  12. package/dist/action/pr-comment.test.js.map +1 -1
  13. package/dist/action/sarif-upload.test.js +1 -0
  14. package/dist/action/sarif-upload.test.js.map +1 -1
  15. package/dist/autofix/ast/__tests__/typescript.test.d.ts +5 -0
  16. package/dist/autofix/ast/__tests__/typescript.test.d.ts.map +1 -0
  17. package/dist/autofix/ast/__tests__/typescript.test.js +210 -0
  18. package/dist/autofix/ast/__tests__/typescript.test.js.map +1 -0
  19. package/dist/autofix/ast/index.d.ts +11 -0
  20. package/dist/autofix/ast/index.d.ts.map +1 -0
  21. package/dist/autofix/ast/index.js +11 -0
  22. package/dist/autofix/ast/index.js.map +1 -0
  23. package/dist/autofix/ast/types.d.ts +77 -0
  24. package/dist/autofix/ast/types.d.ts.map +1 -0
  25. package/dist/autofix/ast/types.js +9 -0
  26. package/dist/autofix/ast/types.js.map +1 -0
  27. package/dist/autofix/ast/typescript.d.ts +17 -0
  28. package/dist/autofix/ast/typescript.d.ts.map +1 -0
  29. package/dist/autofix/ast/typescript.js +427 -0
  30. package/dist/autofix/ast/typescript.js.map +1 -0
  31. package/dist/autofix/constitution.schema.d.ts +21 -21
  32. package/dist/autofix/index.d.ts +1 -0
  33. package/dist/autofix/index.d.ts.map +1 -1
  34. package/dist/autofix/index.js +2 -0
  35. package/dist/autofix/index.js.map +1 -1
  36. package/dist/config/flags.d.ts +6 -6
  37. package/dist/history/store.d.ts +55 -1
  38. package/dist/history/store.d.ts.map +1 -1
  39. package/dist/history/store.js +152 -4
  40. package/dist/history/store.js.map +1 -1
  41. package/dist/history/types.d.ts +9 -5
  42. package/dist/history/types.d.ts.map +1 -1
  43. package/dist/history/verify.d.ts.map +1 -1
  44. package/dist/history/verify.js +5 -3
  45. package/dist/history/verify.js.map +1 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +923 -16
  48. package/dist/index.js.map +1 -1
  49. package/dist/integrations/siem/datadog.d.ts +44 -0
  50. package/dist/integrations/siem/datadog.d.ts.map +1 -0
  51. package/dist/integrations/siem/datadog.js +211 -0
  52. package/dist/integrations/siem/datadog.js.map +1 -0
  53. package/dist/integrations/siem/format.d.ts +59 -0
  54. package/dist/integrations/siem/format.d.ts.map +1 -0
  55. package/dist/integrations/siem/format.js +360 -0
  56. package/dist/integrations/siem/format.js.map +1 -0
  57. package/dist/integrations/siem/index.d.ts +56 -0
  58. package/dist/integrations/siem/index.d.ts.map +1 -0
  59. package/dist/integrations/siem/index.js +117 -0
  60. package/dist/integrations/siem/index.js.map +1 -0
  61. package/dist/integrations/siem/sentinel.d.ts +53 -0
  62. package/dist/integrations/siem/sentinel.d.ts.map +1 -0
  63. package/dist/integrations/siem/sentinel.js +231 -0
  64. package/dist/integrations/siem/sentinel.js.map +1 -0
  65. package/dist/integrations/siem/splunk.d.ts +46 -0
  66. package/dist/integrations/siem/splunk.d.ts.map +1 -0
  67. package/dist/integrations/siem/splunk.js +210 -0
  68. package/dist/integrations/siem/splunk.js.map +1 -0
  69. package/dist/integrations/siem/types.d.ts +210 -0
  70. package/dist/integrations/siem/types.d.ts.map +1 -0
  71. package/dist/integrations/siem/types.js +9 -0
  72. package/dist/integrations/siem/types.js.map +1 -0
  73. package/dist/persistence/__tests__/json-fallback.test.d.ts +5 -0
  74. package/dist/persistence/__tests__/json-fallback.test.d.ts.map +1 -0
  75. package/dist/persistence/__tests__/json-fallback.test.js +249 -0
  76. package/dist/persistence/__tests__/json-fallback.test.js.map +1 -0
  77. package/dist/persistence/__tests__/persistence.test.d.ts +5 -0
  78. package/dist/persistence/__tests__/persistence.test.d.ts.map +1 -0
  79. package/dist/persistence/__tests__/persistence.test.js +369 -0
  80. package/dist/persistence/__tests__/persistence.test.js.map +1 -0
  81. package/dist/persistence/db.d.ts +30 -0
  82. package/dist/persistence/db.d.ts.map +1 -0
  83. package/dist/persistence/db.js +128 -0
  84. package/dist/persistence/db.js.map +1 -0
  85. package/dist/persistence/index.d.ts +75 -0
  86. package/dist/persistence/index.d.ts.map +1 -0
  87. package/dist/persistence/index.js +268 -0
  88. package/dist/persistence/index.js.map +1 -0
  89. package/dist/persistence/json-fallback.d.ts +52 -0
  90. package/dist/persistence/json-fallback.d.ts.map +1 -0
  91. package/dist/persistence/json-fallback.js +283 -0
  92. package/dist/persistence/json-fallback.js.map +1 -0
  93. package/dist/persistence/migrations/index.d.ts +10 -0
  94. package/dist/persistence/migrations/index.d.ts.map +1 -0
  95. package/dist/persistence/migrations/index.js +125 -0
  96. package/dist/persistence/migrations/index.js.map +1 -0
  97. package/dist/persistence/repositories/findings.d.ts +41 -0
  98. package/dist/persistence/repositories/findings.d.ts.map +1 -0
  99. package/dist/persistence/repositories/findings.js +238 -0
  100. package/dist/persistence/repositories/findings.js.map +1 -0
  101. package/dist/persistence/repositories/projects.d.ts +22 -0
  102. package/dist/persistence/repositories/projects.d.ts.map +1 -0
  103. package/dist/persistence/repositories/projects.js +71 -0
  104. package/dist/persistence/repositories/projects.js.map +1 -0
  105. package/dist/persistence/repositories/scans.d.ts +30 -0
  106. package/dist/persistence/repositories/scans.d.ts.map +1 -0
  107. package/dist/persistence/repositories/scans.js +107 -0
  108. package/dist/persistence/repositories/scans.js.map +1 -0
  109. package/dist/persistence/repositories/trends.d.ts +42 -0
  110. package/dist/persistence/repositories/trends.d.ts.map +1 -0
  111. package/dist/persistence/repositories/trends.js +178 -0
  112. package/dist/persistence/repositories/trends.js.map +1 -0
  113. package/dist/persistence/types.d.ts +105 -0
  114. package/dist/persistence/types.d.ts.map +1 -0
  115. package/dist/persistence/types.js +13 -0
  116. package/dist/persistence/types.js.map +1 -0
  117. package/dist/plugins/types.d.ts +2 -2
  118. package/dist/scanners/ai-code/index.d.ts.map +1 -1
  119. package/dist/scanners/ai-code/index.js +90 -2
  120. package/dist/scanners/ai-code/index.js.map +1 -1
  121. package/dist/scanners/ai-code/types.d.ts +24 -12
  122. package/dist/scanners/ai-code/types.d.ts.map +1 -1
  123. package/dist/scanners/cache.d.ts.map +1 -1
  124. package/dist/scanners/cache.js +1 -0
  125. package/dist/scanners/cache.js.map +1 -1
  126. package/dist/scanners/deploy/types.d.ts +13 -13
  127. package/dist/scanners/detection/__tests__/detection.test.d.ts +5 -0
  128. package/dist/scanners/detection/__tests__/detection.test.d.ts.map +1 -0
  129. package/dist/scanners/detection/__tests__/detection.test.js +265 -0
  130. package/dist/scanners/detection/__tests__/detection.test.js.map +1 -0
  131. package/dist/scanners/detection/engines/ast-query.d.ts +23 -0
  132. package/dist/scanners/detection/engines/ast-query.d.ts.map +1 -0
  133. package/dist/scanners/detection/engines/ast-query.js +232 -0
  134. package/dist/scanners/detection/engines/ast-query.js.map +1 -0
  135. package/dist/scanners/detection/engines/data-flow.d.ts +12 -0
  136. package/dist/scanners/detection/engines/data-flow.d.ts.map +1 -0
  137. package/dist/scanners/detection/engines/data-flow.js +269 -0
  138. package/dist/scanners/detection/engines/data-flow.js.map +1 -0
  139. package/dist/scanners/detection/index.d.ts +29 -0
  140. package/dist/scanners/detection/index.d.ts.map +1 -0
  141. package/dist/scanners/detection/index.js +140 -0
  142. package/dist/scanners/detection/index.js.map +1 -0
  143. package/dist/scanners/detection/rules/builtin.d.ts +14 -0
  144. package/dist/scanners/detection/rules/builtin.d.ts.map +1 -0
  145. package/dist/scanners/detection/rules/builtin.js +307 -0
  146. package/dist/scanners/detection/rules/builtin.js.map +1 -0
  147. package/dist/scanners/detection/rules/loader.d.ts +19 -0
  148. package/dist/scanners/detection/rules/loader.d.ts.map +1 -0
  149. package/dist/scanners/detection/rules/loader.js +111 -0
  150. package/dist/scanners/detection/rules/loader.js.map +1 -0
  151. package/dist/scanners/detection/types.d.ts +171 -0
  152. package/dist/scanners/detection/types.d.ts.map +1 -0
  153. package/dist/scanners/detection/types.js +36 -0
  154. package/dist/scanners/detection/types.js.map +1 -0
  155. package/dist/scanners/eslint.d.ts.map +1 -1
  156. package/dist/scanners/eslint.js +45 -3
  157. package/dist/scanners/eslint.js.map +1 -1
  158. package/dist/scanners/index.d.ts +9 -1
  159. package/dist/scanners/index.d.ts.map +1 -1
  160. package/dist/scanners/index.js +64 -0
  161. package/dist/scanners/index.js.map +1 -1
  162. package/dist/scanners/index.test.js +6 -6
  163. package/dist/scanners/index.test.js.map +1 -1
  164. package/dist/scanners/scale/bottleneck-detector.d.ts +13 -2
  165. package/dist/scanners/scale/bottleneck-detector.d.ts.map +1 -1
  166. package/dist/scanners/scale/bottleneck-detector.js +199 -72
  167. package/dist/scanners/scale/bottleneck-detector.js.map +1 -1
  168. package/dist/scanners/scale/types.d.ts +3 -3
  169. package/dist/scanners/types.d.ts +19 -2
  170. package/dist/scanners/types.d.ts.map +1 -1
  171. package/dist/scanners/types.js +1 -0
  172. package/dist/scanners/types.js.map +1 -1
  173. package/dist/scanners/typescript.d.ts.map +1 -1
  174. package/dist/scanners/typescript.js +36 -4
  175. package/dist/scanners/typescript.js.map +1 -1
  176. package/package.json +5 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.test.js","sourceRoot":"","sources":["../../../src/persistence/__tests__/persistence.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * SQLite Database Connection
3
+ *
4
+ * Manages SQLite database connections using better-sqlite3.
5
+ * Falls back to JSON file storage if SQLite fails.
6
+ *
7
+ * @module persistence/db
8
+ */
9
+ import Database from "better-sqlite3";
10
+ import type { PersistenceConfig } from "./types.js";
11
+ export interface DbStatus {
12
+ initialized: boolean;
13
+ isFallbackMode: boolean;
14
+ dbPath: string | null;
15
+ error: string | null;
16
+ }
17
+ export declare function getDbStatus(): DbStatus;
18
+ export declare function isInFallbackMode(): boolean;
19
+ export declare function setFallbackMode(value: boolean, error?: Error): void;
20
+ export declare function getDbPath(projectPath: string, config?: Partial<PersistenceConfig>): string;
21
+ export declare class DatabaseInitError extends Error {
22
+ readonly cause?: Error | undefined;
23
+ readonly dbPath?: string | undefined;
24
+ constructor(message: string, cause?: Error | undefined, dbPath?: string | undefined);
25
+ }
26
+ export declare function initDatabase(projectPath: string, config?: Partial<PersistenceConfig>): Promise<Database.Database>;
27
+ export declare function getDatabase(): Database.Database | null;
28
+ export declare function closeDatabase(): void;
29
+ export declare function createInMemoryDatabase(): Database.Database;
30
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/persistence/db.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAUpD,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAOtC;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAQnE;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAG1F;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,KAAK,CAAC,EAAE,KAAK;aACb,MAAM,CAAC,EAAE,MAAM;gBAF/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA,EACb,MAAM,CAAC,EAAE,MAAM,YAAA;CAKlC;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAsD5B;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAEtD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC;AAgCD,wBAAgB,sBAAsB,IAAI,QAAQ,CAAC,QAAQ,CAK1D"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * SQLite Database Connection
3
+ *
4
+ * Manages SQLite database connections using better-sqlite3.
5
+ * Falls back to JSON file storage if SQLite fails.
6
+ *
7
+ * @module persistence/db
8
+ */
9
+ import Database from "better-sqlite3";
10
+ import { mkdir } from "fs/promises";
11
+ import { dirname, join, isAbsolute } from "path";
12
+ import { DEFAULT_PERSISTENCE_CONFIG } from "./types.js";
13
+ import { MIGRATIONS } from "./migrations/index.js";
14
+ import { logger } from "../logger.js";
15
+ let dbInstance = null;
16
+ let currentDbPath = null;
17
+ let isFallbackMode = false;
18
+ let lastDbError = null;
19
+ export function getDbStatus() {
20
+ return {
21
+ initialized: dbInstance !== null || isFallbackMode,
22
+ isFallbackMode,
23
+ dbPath: currentDbPath,
24
+ error: lastDbError?.message || null,
25
+ };
26
+ }
27
+ export function isInFallbackMode() {
28
+ return isFallbackMode;
29
+ }
30
+ export function setFallbackMode(value, error) {
31
+ isFallbackMode = value;
32
+ lastDbError = error || null;
33
+ if (value) {
34
+ logger.warn("persistence.fallback_mode_enabled", {
35
+ error: error?.message,
36
+ });
37
+ }
38
+ }
39
+ export function getDbPath(projectPath, config) {
40
+ const dbPath = config?.dbPath || DEFAULT_PERSISTENCE_CONFIG.dbPath;
41
+ return isAbsolute(dbPath) ? dbPath : join(projectPath, dbPath);
42
+ }
43
+ export class DatabaseInitError extends Error {
44
+ cause;
45
+ dbPath;
46
+ constructor(message, cause, dbPath) {
47
+ super(message);
48
+ this.cause = cause;
49
+ this.dbPath = dbPath;
50
+ this.name = "DatabaseInitError";
51
+ }
52
+ }
53
+ export async function initDatabase(projectPath, config) {
54
+ const fullConfig = { ...DEFAULT_PERSISTENCE_CONFIG, ...config };
55
+ const dbPath = getDbPath(projectPath, fullConfig);
56
+ if (dbInstance && currentDbPath === dbPath) {
57
+ return dbInstance;
58
+ }
59
+ if (dbInstance) {
60
+ dbInstance.close();
61
+ dbInstance = null;
62
+ currentDbPath = null;
63
+ }
64
+ try {
65
+ await mkdir(dirname(dbPath), { recursive: true });
66
+ dbInstance = new Database(dbPath);
67
+ currentDbPath = dbPath;
68
+ if (fullConfig.enableWAL) {
69
+ dbInstance.pragma("journal_mode = WAL");
70
+ }
71
+ if (fullConfig.busyTimeout) {
72
+ dbInstance.pragma(`busy_timeout = ${fullConfig.busyTimeout}`);
73
+ }
74
+ dbInstance.pragma("foreign_keys = ON");
75
+ runMigrations(dbInstance);
76
+ isFallbackMode = false;
77
+ lastDbError = null;
78
+ logger.debug("persistence.db_initialized", { dbPath });
79
+ return dbInstance;
80
+ }
81
+ catch (error) {
82
+ const dbError = new DatabaseInitError(`Failed to initialize SQLite database: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined, dbPath);
83
+ logger.error("persistence.db_init_failed", {
84
+ dbPath,
85
+ error: dbError.message,
86
+ cause: error instanceof Error ? error.message : String(error),
87
+ });
88
+ setFallbackMode(true, dbError);
89
+ throw dbError;
90
+ }
91
+ }
92
+ export function getDatabase() {
93
+ return dbInstance;
94
+ }
95
+ export function closeDatabase() {
96
+ if (dbInstance) {
97
+ dbInstance.close();
98
+ dbInstance = null;
99
+ currentDbPath = null;
100
+ }
101
+ }
102
+ function runMigrations(db) {
103
+ db.exec(`
104
+ CREATE TABLE IF NOT EXISTS migrations (
105
+ version INTEGER PRIMARY KEY,
106
+ name TEXT NOT NULL,
107
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
108
+ )
109
+ `);
110
+ const appliedVersions = new Set(db.prepare("SELECT version FROM migrations").all().map((r) => r.version));
111
+ const sortedMigrations = [...MIGRATIONS].sort((a, b) => a.version - b.version);
112
+ for (const migration of sortedMigrations) {
113
+ if (appliedVersions.has(migration.version)) {
114
+ continue;
115
+ }
116
+ db.transaction(() => {
117
+ db.exec(migration.up);
118
+ db.prepare("INSERT INTO migrations (version, name) VALUES (?, ?)").run(migration.version, migration.name);
119
+ })();
120
+ }
121
+ }
122
+ export function createInMemoryDatabase() {
123
+ const db = new Database(":memory:");
124
+ db.pragma("foreign_keys = ON");
125
+ runMigrations(db);
126
+ return db;
127
+ }
128
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/persistence/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Persistence Layer
3
+ *
4
+ * SQLite-backed persistence for findings, scans, and trends.
5
+ * Falls back to JSON file storage when SQLite is unavailable.
6
+ * Provides historical data and enterprise dashboards.
7
+ *
8
+ * @module persistence
9
+ */
10
+ import { ProjectsRepository } from "./repositories/projects.js";
11
+ import { FindingsRepository, type FindingFilter } from "./repositories/findings.js";
12
+ import { ScansRepository } from "./repositories/scans.js";
13
+ import { TrendsRepository, type TrendPeriodType } from "./repositories/trends.js";
14
+ import { JsonFallbackStorage } from "./json-fallback.js";
15
+ import type { PersistenceConfig, Project, PersistedFinding, ProjectStats, TrendData } from "./types.js";
16
+ export * from "./types.js";
17
+ export { FindingFilter } from "./repositories/findings.js";
18
+ export { TrendPeriodType } from "./repositories/trends.js";
19
+ export { isInFallbackMode, getDbStatus, DatabaseInitError } from "./db.js";
20
+ export declare class PersistenceManager {
21
+ private db;
22
+ private fallback;
23
+ readonly projects: ProjectsRepository | null;
24
+ readonly findings: FindingsRepository | null;
25
+ readonly scans: ScansRepository | null;
26
+ readonly trends: TrendsRepository | null;
27
+ readonly isFallbackMode: boolean;
28
+ private constructor();
29
+ static create(projectPath: string, config?: Partial<PersistenceConfig>): Promise<PersistenceManager>;
30
+ static createInMemory(): PersistenceManager;
31
+ getFallback(): JsonFallbackStorage | null;
32
+ close(): void;
33
+ saveIfFallback(): Promise<void>;
34
+ getDbPath(): string;
35
+ transaction<T>(fn: () => T): T;
36
+ }
37
+ export declare function initPersistence(projectPath: string, config?: Partial<PersistenceConfig>): Promise<PersistenceManager>;
38
+ export declare function getPersistence(): PersistenceManager | null;
39
+ export declare function closePersistence(): void;
40
+ export declare function recordScanResults(projectPath: string, findings: Array<{
41
+ severity: string;
42
+ category: string;
43
+ file: string;
44
+ line: number;
45
+ column?: number;
46
+ description: string;
47
+ scannerSource: string;
48
+ ruleId?: string;
49
+ confidence?: number;
50
+ cweIds?: string[];
51
+ }>, certificationId?: string): Promise<{
52
+ scanId: string;
53
+ projectId: string;
54
+ newFindings: number;
55
+ existingFindings: number;
56
+ totalFindings: number;
57
+ fallbackMode?: boolean;
58
+ }>;
59
+ export declare function getProjectTrends(projectPath: string, period?: TrendPeriodType, lookbackPeriods?: number): Promise<{
60
+ project: Project;
61
+ stats: ProjectStats;
62
+ trends: TrendData[];
63
+ mttr: {
64
+ period: string;
65
+ mttrHours: number;
66
+ }[];
67
+ fixVelocity: {
68
+ period: string;
69
+ fixesCount: number;
70
+ }[];
71
+ fallbackMode?: boolean;
72
+ }>;
73
+ export declare function markFindingsFixed(projectPath: string, findingIds: string[], fixedBy?: string): Promise<number>;
74
+ export declare function getOpenFindings(projectPath: string, filter?: Partial<FindingFilter>): Promise<PersistedFinding[]>;
75
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Persistence Layer
3
+ *
4
+ * SQLite-backed persistence for findings, scans, and trends.
5
+ * Falls back to JSON file storage when SQLite is unavailable.
6
+ * Provides historical data and enterprise dashboards.
7
+ *
8
+ * @module persistence
9
+ */
10
+ import { initDatabase, closeDatabase, createInMemoryDatabase, setFallbackMode, } from "./db.js";
11
+ import { ProjectsRepository } from "./repositories/projects.js";
12
+ import { FindingsRepository } from "./repositories/findings.js";
13
+ import { ScansRepository } from "./repositories/scans.js";
14
+ import { TrendsRepository } from "./repositories/trends.js";
15
+ import { JsonFallbackStorage } from "./json-fallback.js";
16
+ import { logger } from "../logger.js";
17
+ export * from "./types.js";
18
+ export { isInFallbackMode, getDbStatus, DatabaseInitError } from "./db.js";
19
+ export class PersistenceManager {
20
+ db;
21
+ fallback;
22
+ projects;
23
+ findings;
24
+ scans;
25
+ trends;
26
+ isFallbackMode;
27
+ constructor(db, fallback) {
28
+ this.db = 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
+ }
43
+ }
44
+ static async create(projectPath, config) {
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
+ }
58
+ }
59
+ static createInMemory() {
60
+ const db = createInMemoryDatabase();
61
+ return new PersistenceManager(db, null);
62
+ }
63
+ getFallback() {
64
+ return this.fallback;
65
+ }
66
+ 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
+ }
78
+ }
79
+ getDbPath() {
80
+ if (this.db) {
81
+ return this.db.name;
82
+ }
83
+ return "(fallback mode)";
84
+ }
85
+ transaction(fn) {
86
+ if (this.db) {
87
+ return this.db.transaction(fn)();
88
+ }
89
+ return fn();
90
+ }
91
+ }
92
+ let defaultManager = null;
93
+ export async function initPersistence(projectPath, config) {
94
+ if (defaultManager) {
95
+ defaultManager.close();
96
+ }
97
+ defaultManager = await PersistenceManager.create(projectPath, config);
98
+ return defaultManager;
99
+ }
100
+ export function getPersistence() {
101
+ return defaultManager;
102
+ }
103
+ export function closePersistence() {
104
+ if (defaultManager) {
105
+ defaultManager.close();
106
+ defaultManager = null;
107
+ }
108
+ closeDatabase();
109
+ }
110
+ export async function recordScanResults(projectPath, findings, certificationId) {
111
+ const manager = await initPersistence(projectPath);
112
+ let newCount = 0;
113
+ let existingCount = 0;
114
+ const bySeverity = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
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);
163
+ manager.transaction(() => {
164
+ for (const f of findings) {
165
+ const { finding, isNew } = manager.findings.upsertFromScan({
166
+ projectId: project.id,
167
+ certificationId,
168
+ severity: f.severity,
169
+ category: f.category,
170
+ file: f.file,
171
+ line: f.line,
172
+ column: f.column,
173
+ description: f.description,
174
+ scannerSource: f.scannerSource,
175
+ ruleId: f.ruleId,
176
+ confidence: f.confidence || 100,
177
+ cweIds: f.cweIds,
178
+ });
179
+ if (isNew) {
180
+ newCount++;
181
+ }
182
+ else {
183
+ existingCount++;
184
+ }
185
+ bySeverity[f.severity] = (bySeverity[f.severity] || 0) + 1;
186
+ byScanner[f.scannerSource] = (byScanner[f.scannerSource] || 0) + 1;
187
+ }
188
+ manager.scans.complete(scan.id, {
189
+ totalFindings: findings.length,
190
+ newFindings: newCount,
191
+ fixedFindings: 0,
192
+ bySeverity: bySeverity,
193
+ byScanner,
194
+ duration: Date.now() - new Date(scan.startedAt).getTime(),
195
+ });
196
+ manager.projects.updateLastScan(project.id);
197
+ });
198
+ return {
199
+ scanId: scan.id,
200
+ projectId: project.id,
201
+ newFindings: newCount,
202
+ existingFindings: existingCount,
203
+ totalFindings: findings.length,
204
+ };
205
+ }
206
+ export async function getProjectTrends(projectPath, period = "week", lookbackPeriods = 12) {
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
+ }
224
+ const project = manager.projects.findByPath(projectPath);
225
+ if (!project) {
226
+ throw new Error(`Project not found: ${projectPath}`);
227
+ }
228
+ const stats = manager.findings.getStats(project.id);
229
+ const trends = manager.trends.calculateTrends(project.id, period, lookbackPeriods);
230
+ const mttr = manager.trends.getMTTR(project.id, period, lookbackPeriods);
231
+ const fixVelocity = manager.trends.getFixVelocity(project.id, period, lookbackPeriods);
232
+ return { project, stats, trends, mttr, fixVelocity };
233
+ }
234
+ export async function markFindingsFixed(projectPath, findingIds, fixedBy) {
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
+ }
242
+ return manager.findings.markFixed(findingIds, fixedBy);
243
+ }
244
+ export async function getOpenFindings(projectPath, filter) {
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
+ }
258
+ const project = manager.projects.findByPath(projectPath);
259
+ if (!project) {
260
+ return [];
261
+ }
262
+ return manager.findings.find({
263
+ ...filter,
264
+ projectId: project.id,
265
+ status: "open",
266
+ });
267
+ }
268
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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"}