@skillsmith/core 0.4.10 → 0.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 (123) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/src/analysis/__tests__/incremental.test.d.ts +1 -1
  3. package/dist/src/analysis/__tests__/incremental.test.js +1 -1
  4. package/dist/src/analysis/__tests__/integration.test.d.ts +1 -1
  5. package/dist/src/analysis/__tests__/integration.test.js +1 -1
  6. package/dist/src/analysis/__tests__/performance.test.d.ts +1 -1
  7. package/dist/src/analysis/__tests__/performance.test.js +1 -1
  8. package/dist/src/analysis/adapters/__tests__/python.test.d.ts +1 -1
  9. package/dist/src/analysis/adapters/__tests__/python.test.js +1 -1
  10. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +1 -1
  11. package/dist/src/analysis/adapters/__tests__/typescript.test.js +1 -1
  12. package/dist/src/analysis/adapters/base.d.ts +1 -1
  13. package/dist/src/analysis/adapters/base.js +1 -1
  14. package/dist/src/analysis/adapters/factory.d.ts +1 -1
  15. package/dist/src/analysis/adapters/factory.js +1 -1
  16. package/dist/src/analysis/adapters/go.d.ts +1 -1
  17. package/dist/src/analysis/adapters/go.js +1 -1
  18. package/dist/src/analysis/adapters/index.d.ts +1 -1
  19. package/dist/src/analysis/adapters/index.js +1 -1
  20. package/dist/src/analysis/adapters/java-parsers.d.ts +1 -1
  21. package/dist/src/analysis/adapters/java-parsers.js +1 -1
  22. package/dist/src/analysis/adapters/java.d.ts +1 -1
  23. package/dist/src/analysis/adapters/java.js +1 -1
  24. package/dist/src/analysis/adapters/python-frameworks.d.ts +1 -1
  25. package/dist/src/analysis/adapters/python-frameworks.js +1 -1
  26. package/dist/src/analysis/adapters/python.d.ts +1 -1
  27. package/dist/src/analysis/adapters/python.js +1 -1
  28. package/dist/src/analysis/adapters/rust-parsers.d.ts +1 -1
  29. package/dist/src/analysis/adapters/rust-parsers.js +1 -1
  30. package/dist/src/analysis/adapters/rust.d.ts +1 -1
  31. package/dist/src/analysis/adapters/rust.js +1 -1
  32. package/dist/src/analysis/adapters/typescript.d.ts +1 -1
  33. package/dist/src/analysis/adapters/typescript.js +1 -1
  34. package/dist/src/analysis/aggregator.d.ts +1 -1
  35. package/dist/src/analysis/aggregator.js +1 -1
  36. package/dist/src/analysis/cache.d.ts +1 -1
  37. package/dist/src/analysis/cache.js +1 -1
  38. package/dist/src/analysis/file-streamer.d.ts +1 -1
  39. package/dist/src/analysis/file-streamer.js +1 -1
  40. package/dist/src/analysis/incremental-parser.d.ts +1 -1
  41. package/dist/src/analysis/incremental-parser.js +1 -1
  42. package/dist/src/analysis/incremental.d.ts +1 -1
  43. package/dist/src/analysis/incremental.js +1 -1
  44. package/dist/src/analysis/index.d.ts +1 -1
  45. package/dist/src/analysis/index.js +1 -1
  46. package/dist/src/analysis/language-detector.d.ts +1 -1
  47. package/dist/src/analysis/language-detector.js +1 -1
  48. package/dist/src/analysis/memory-monitor.d.ts +1 -1
  49. package/dist/src/analysis/memory-monitor.js +1 -1
  50. package/dist/src/analysis/metrics.d.ts +1 -1
  51. package/dist/src/analysis/metrics.js +1 -1
  52. package/dist/src/analysis/router.d.ts +1 -1
  53. package/dist/src/analysis/router.js +1 -1
  54. package/dist/src/analysis/tree-cache.d.ts +1 -1
  55. package/dist/src/analysis/tree-cache.js +1 -1
  56. package/dist/src/analysis/tree-sitter/manager.d.ts +1 -1
  57. package/dist/src/analysis/tree-sitter/manager.js +1 -1
  58. package/dist/src/analysis/types.d.ts +1 -1
  59. package/dist/src/analysis/types.js +1 -1
  60. package/dist/src/analysis/worker-pool.d.ts +1 -1
  61. package/dist/src/analysis/worker-pool.js +1 -1
  62. package/dist/src/analysis/worker-types.d.ts +1 -1
  63. package/dist/src/analysis/worker-types.js +1 -1
  64. package/dist/src/analysis/worker-utils.d.ts +1 -1
  65. package/dist/src/analysis/worker-utils.js +1 -1
  66. package/dist/src/config/index.d.ts +49 -1
  67. package/dist/src/config/index.d.ts.map +1 -1
  68. package/dist/src/config/index.js +166 -3
  69. package/dist/src/config/index.js.map +1 -1
  70. package/dist/src/config/index.test.d.ts +11 -0
  71. package/dist/src/config/index.test.d.ts.map +1 -0
  72. package/dist/src/config/index.test.js +288 -0
  73. package/dist/src/config/index.test.js.map +1 -0
  74. package/dist/src/db/quarantine-approvals-schema.d.ts +37 -0
  75. package/dist/src/db/quarantine-approvals-schema.d.ts.map +1 -0
  76. package/dist/src/db/quarantine-approvals-schema.js +71 -0
  77. package/dist/src/db/quarantine-approvals-schema.js.map +1 -0
  78. package/dist/src/index.d.ts +1 -1
  79. package/dist/src/index.d.ts.map +1 -1
  80. package/dist/src/index.js +2 -2
  81. package/dist/src/index.js.map +1 -1
  82. package/dist/src/repositories/quarantine/ApprovalRepository.d.ts +148 -0
  83. package/dist/src/repositories/quarantine/ApprovalRepository.d.ts.map +1 -0
  84. package/dist/src/repositories/quarantine/ApprovalRepository.js +212 -0
  85. package/dist/src/repositories/quarantine/ApprovalRepository.js.map +1 -0
  86. package/dist/src/repositories/quarantine/index.d.ts +2 -0
  87. package/dist/src/repositories/quarantine/index.d.ts.map +1 -1
  88. package/dist/src/repositories/quarantine/index.js +1 -0
  89. package/dist/src/repositories/quarantine/index.js.map +1 -1
  90. package/dist/src/security/audit-types.d.ts +1 -1
  91. package/dist/src/security/audit-types.d.ts.map +1 -1
  92. package/dist/src/security/audit-types.js.map +1 -1
  93. package/dist/src/security/scanner/SecurityScanner.formatters.js +1 -1
  94. package/dist/src/security/scanner/SecurityScanner.formatters.js.map +1 -1
  95. package/dist/src/services/quarantine/QuarantineService.d.ts +17 -9
  96. package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -1
  97. package/dist/src/services/quarantine/QuarantineService.js +114 -56
  98. package/dist/src/services/quarantine/QuarantineService.js.map +1 -1
  99. package/dist/tests/RawUrlSourceAdapter.security.test.js +2 -1
  100. package/dist/tests/RawUrlSourceAdapter.security.test.js.map +1 -1
  101. package/dist/tests/SecurityScanner.test.js +2 -2
  102. package/dist/tests/SecurityScanner.test.js.map +1 -1
  103. package/dist/tests/adapters-factory.test.d.ts +1 -1
  104. package/dist/tests/adapters-factory.test.js +1 -1
  105. package/dist/tests/integration/QuarantineService.test.js +49 -1
  106. package/dist/tests/integration/QuarantineService.test.js.map +1 -1
  107. package/dist/tests/integration/neural/e2e-learning.test.d.ts +1 -1
  108. package/dist/tests/integration/neural/e2e-learning.test.js +1 -1
  109. package/dist/tests/integration/neural/personalization.test.d.ts +1 -1
  110. package/dist/tests/integration/neural/personalization.test.js +1 -1
  111. package/dist/tests/integration/neural/preference-learner.test.d.ts +1 -1
  112. package/dist/tests/integration/neural/preference-learner.test.js +1 -1
  113. package/dist/tests/integration/neural/privacy.test.d.ts +1 -1
  114. package/dist/tests/integration/neural/privacy.test.js +1 -1
  115. package/dist/tests/integration/neural/signal-collection.test.d.ts +1 -1
  116. package/dist/tests/integration/neural/signal-collection.test.js +1 -1
  117. package/dist/tests/language-detector.test.d.ts +1 -1
  118. package/dist/tests/language-detector.test.js +1 -1
  119. package/dist/tests/unit/approval-repository.test.d.ts +9 -0
  120. package/dist/tests/unit/approval-repository.test.d.ts.map +1 -0
  121. package/dist/tests/unit/approval-repository.test.js +509 -0
  122. package/dist/tests/unit/approval-repository.test.js.map +1 -0
  123. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/config/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * SMI-2277: Quarantine Approvals Schema
3
+ *
4
+ * Database schema for persisting multi-approval state. Replaces the
5
+ * in-memory Map<string, ApprovalState> that was lost on service restart.
6
+ *
7
+ * Note on type mappings:
8
+ * - `reviewer_id` is TEXT here (SQLite) but UUID in the Supabase migration.
9
+ * In production, values are always UUIDs from auth providers. Tests may
10
+ * use human-readable strings like 'user-456' for clarity.
11
+ * - `is_complete` is INTEGER 0/1 here (SQLite has no native boolean) but
12
+ * BOOLEAN in the PostgreSQL migration. Queries in ApprovalRepository use
13
+ * integer literals (0/1) which are SQLite-specific.
14
+ * - `created_at` uses `datetime('now') || 'Z'` to produce UTC ISO-8601
15
+ * strings (e.g. '2026-02-13 12:00:00Z') so Date parsing is unambiguous.
16
+ *
17
+ * @module @skillsmith/core/db/quarantine-approvals-schema
18
+ */
19
+ import type { Database as DatabaseType } from './database-interface.js';
20
+ /**
21
+ * SQL statement to create the quarantine_approvals table
22
+ */
23
+ export declare const QUARANTINE_APPROVALS_SCHEMA_SQL = "\n-- SMI-2277: Quarantine multi-approval persistence\nCREATE TABLE IF NOT EXISTS quarantine_approvals (\n id TEXT PRIMARY KEY,\n skill_id TEXT NOT NULL,\n reviewer_id TEXT NOT NULL,\n reviewer_email TEXT NOT NULL,\n decision TEXT NOT NULL CHECK(decision IN ('approved', 'rejected')),\n reason TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now') || 'Z'),\n completed_at TEXT,\n required_approvals INTEGER NOT NULL DEFAULT 2,\n is_complete INTEGER NOT NULL DEFAULT 0\n);\n\n-- Index for efficient lookup by skill_id (most common query path)\nCREATE INDEX IF NOT EXISTS idx_quarantine_approvals_skill_id\n ON quarantine_approvals(skill_id);\n\n-- Enforce one pending review per reviewer per skill (defense-in-depth)\nCREATE UNIQUE INDEX IF NOT EXISTS idx_quarantine_approvals_reviewer_unique\n ON quarantine_approvals(skill_id, reviewer_id)\n WHERE is_complete = 0;\n\n-- Efficient count of pending approvals (used by isComplete check)\nCREATE INDEX IF NOT EXISTS idx_quarantine_approvals_pending\n ON quarantine_approvals(skill_id, decision)\n WHERE is_complete = 0;\n";
24
+ /**
25
+ * Initialize the quarantine_approvals schema in the database
26
+ *
27
+ * @param db - Database connection
28
+ */
29
+ export declare function initializeQuarantineApprovalsSchema(db: DatabaseType): void;
30
+ /**
31
+ * Check if the quarantine_approvals table exists
32
+ *
33
+ * @param db - Database connection
34
+ * @returns True if quarantine_approvals table exists
35
+ */
36
+ export declare function hasQuarantineApprovalsTable(db: DatabaseType): boolean;
37
+ //# sourceMappingURL=quarantine-approvals-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quarantine-approvals-schema.d.ts","sourceRoot":"","sources":["../../../src/db/quarantine-approvals-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEvE;;GAEG;AACH,eAAO,MAAM,+BAA+B,okCA4B3C,CAAA;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAE1E;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAKrE"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * SMI-2277: Quarantine Approvals Schema
3
+ *
4
+ * Database schema for persisting multi-approval state. Replaces the
5
+ * in-memory Map<string, ApprovalState> that was lost on service restart.
6
+ *
7
+ * Note on type mappings:
8
+ * - `reviewer_id` is TEXT here (SQLite) but UUID in the Supabase migration.
9
+ * In production, values are always UUIDs from auth providers. Tests may
10
+ * use human-readable strings like 'user-456' for clarity.
11
+ * - `is_complete` is INTEGER 0/1 here (SQLite has no native boolean) but
12
+ * BOOLEAN in the PostgreSQL migration. Queries in ApprovalRepository use
13
+ * integer literals (0/1) which are SQLite-specific.
14
+ * - `created_at` uses `datetime('now') || 'Z'` to produce UTC ISO-8601
15
+ * strings (e.g. '2026-02-13 12:00:00Z') so Date parsing is unambiguous.
16
+ *
17
+ * @module @skillsmith/core/db/quarantine-approvals-schema
18
+ */
19
+ /**
20
+ * SQL statement to create the quarantine_approvals table
21
+ */
22
+ export const QUARANTINE_APPROVALS_SCHEMA_SQL = `
23
+ -- SMI-2277: Quarantine multi-approval persistence
24
+ CREATE TABLE IF NOT EXISTS quarantine_approvals (
25
+ id TEXT PRIMARY KEY,
26
+ skill_id TEXT NOT NULL,
27
+ reviewer_id TEXT NOT NULL,
28
+ reviewer_email TEXT NOT NULL,
29
+ decision TEXT NOT NULL CHECK(decision IN ('approved', 'rejected')),
30
+ reason TEXT,
31
+ created_at TEXT NOT NULL DEFAULT (datetime('now') || 'Z'),
32
+ completed_at TEXT,
33
+ required_approvals INTEGER NOT NULL DEFAULT 2,
34
+ is_complete INTEGER NOT NULL DEFAULT 0
35
+ );
36
+
37
+ -- Index for efficient lookup by skill_id (most common query path)
38
+ CREATE INDEX IF NOT EXISTS idx_quarantine_approvals_skill_id
39
+ ON quarantine_approvals(skill_id);
40
+
41
+ -- Enforce one pending review per reviewer per skill (defense-in-depth)
42
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_quarantine_approvals_reviewer_unique
43
+ ON quarantine_approvals(skill_id, reviewer_id)
44
+ WHERE is_complete = 0;
45
+
46
+ -- Efficient count of pending approvals (used by isComplete check)
47
+ CREATE INDEX IF NOT EXISTS idx_quarantine_approvals_pending
48
+ ON quarantine_approvals(skill_id, decision)
49
+ WHERE is_complete = 0;
50
+ `;
51
+ /**
52
+ * Initialize the quarantine_approvals schema in the database
53
+ *
54
+ * @param db - Database connection
55
+ */
56
+ export function initializeQuarantineApprovalsSchema(db) {
57
+ db.exec(QUARANTINE_APPROVALS_SCHEMA_SQL);
58
+ }
59
+ /**
60
+ * Check if the quarantine_approvals table exists
61
+ *
62
+ * @param db - Database connection
63
+ * @returns True if quarantine_approvals table exists
64
+ */
65
+ export function hasQuarantineApprovalsTable(db) {
66
+ const result = db
67
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='quarantine_approvals'")
68
+ .get();
69
+ return !!result;
70
+ }
71
+ //# sourceMappingURL=quarantine-approvals-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quarantine-approvals-schema.js","sourceRoot":"","sources":["../../../src/db/quarantine-approvals-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4B9C,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,mCAAmC,CAAC,EAAgB;IAClE,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,EAAgB;IAC1D,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CAAC,mFAAmF,CAAC;SAC5F,GAAG,EAAE,CAAA;IACR,OAAO,CAAC,CAAC,MAAM,CAAA;AACjB,CAAC"}
@@ -21,7 +21,7 @@ export { RateLimiter, InMemoryRateLimitStorage, createRateLimiterFromPreset, RAT
21
21
  export { AuditLogger, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS } from './security/AuditLogger.js';
22
22
  export { BaseSourceAdapter, SourceAdapterRegistry, SourceIndexer, defaultRegistry, isSourceAdapter, } from './sources/index.js';
23
23
  export type { ISourceAdapter, SourceType, SourceConfig, RateLimitConfig as SourceRateLimitConfig, SourceAuthConfig, SourceLocation, SourceRepository, SkillContent, SourceSearchOptions, SourceSearchResult, SkillIndexResult, BatchIndexResult, SourceHealth, SourceAdapterFactory, RegistryStats, ParsedSkillMetadata as SourceParsedSkillMetadata, ISkillParser, ISkillRepository, SourceIndexerOptions, } from './sources/index.js';
24
- export { loadConfig, saveConfig, getApiKey, getApiBaseUrl, getConfigDir, getConfigPath, ensureConfigDir, isDebugEnabled, isTelemetryEnabled, isValidApiKeyFormat, type SkillsmithConfig, } from './config/index.js';
24
+ export { loadConfig, saveConfig, getApiKey, getApiBaseUrl, getConfigDir, getConfigPath, ensureConfigDir, isDebugEnabled, isTelemetryEnabled, isValidApiKeyFormat, storeApiKey, clearApiKey, getAuthStatus, type SkillsmithConfig, } from './config/index.js';
25
25
  export { checkForUpdates, formatUpdateNotification, type VersionCheckResult, } from './utils/version-check.js';
26
26
  export { parseRepoUrl, isGitHubUrl, type ParsedRepoUrl } from './utils/github-url.js';
27
27
  export { safeWriteFile, SymlinkError, HardlinkError } from './utils/safe-fs.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/dist/src/index.js CHANGED
@@ -53,8 +53,8 @@ export { RateLimiter, InMemoryRateLimitStorage, createRateLimiterFromPreset, RAT
53
53
  export { AuditLogger, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS } from './security/AuditLogger.js';
54
54
  // Source Adapters (SMI-589)
55
55
  export { BaseSourceAdapter, SourceAdapterRegistry, SourceIndexer, defaultRegistry, isSourceAdapter, } from './sources/index.js';
56
- // Configuration (SMI-1851)
57
- export { loadConfig, saveConfig, getApiKey, getApiBaseUrl, getConfigDir, getConfigPath, ensureConfigDir, isDebugEnabled, isTelemetryEnabled, isValidApiKeyFormat, } from './config/index.js';
56
+ // Configuration (SMI-1851, SMI-2714)
57
+ export { loadConfig, saveConfig, getApiKey, getApiBaseUrl, getConfigDir, getConfigPath, ensureConfigDir, isDebugEnabled, isTelemetryEnabled, isValidApiKeyFormat, storeApiKey, clearApiKey, getAuthStatus, } from './config/index.js';
58
58
  // Version Check (SMI-1952)
59
59
  export { checkForUpdates, formatUpdateNotification, } from './utils/version-check.js';
60
60
  // GitHub URL Parsing (SMI-2171)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * SMI-2277: Approval Repository
3
+ *
4
+ * Persists multi-approval state to SQLite instead of in-memory Map.
5
+ * This ensures pending approvals survive service restarts.
6
+ *
7
+ * @module @skillsmith/core/repositories/quarantine/ApprovalRepository
8
+ */
9
+ import type { Database as DatabaseType } from '../../db/database-interface.js';
10
+ /**
11
+ * Database row for quarantine_approvals table
12
+ */
13
+ export interface ApprovalRow {
14
+ id: string;
15
+ skill_id: string;
16
+ reviewer_id: string;
17
+ reviewer_email: string;
18
+ decision: 'approved' | 'rejected';
19
+ reason: string | null;
20
+ created_at: string;
21
+ completed_at: string | null;
22
+ required_approvals: number;
23
+ is_complete: number;
24
+ }
25
+ /**
26
+ * Domain object for a recorded approval
27
+ */
28
+ export interface ApprovalEntry {
29
+ id: string;
30
+ skillId: string;
31
+ reviewerId: string;
32
+ reviewerEmail: string;
33
+ decision: 'approved' | 'rejected';
34
+ reason: string | null;
35
+ createdAt: string;
36
+ completedAt: string | null;
37
+ requiredApprovals: number;
38
+ isComplete: boolean;
39
+ }
40
+ /**
41
+ * Input for recording a new approval
42
+ */
43
+ export interface RecordApprovalInput {
44
+ skillId: string;
45
+ reviewerId: string;
46
+ reviewerEmail: string;
47
+ decision: 'approved' | 'rejected';
48
+ reason?: string;
49
+ requiredApprovals?: number;
50
+ }
51
+ /**
52
+ * Repository for persisting multi-approval workflow state.
53
+ *
54
+ * Replaces the in-memory Map<string, MultiApprovalStatus> with
55
+ * database-backed storage to survive service restarts.
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const repo = new ApprovalRepository(db)
60
+ *
61
+ * // Record a reviewer's approval
62
+ * repo.recordApproval({
63
+ * skillId: 'quarantine-123',
64
+ * reviewerId: 'user-456',
65
+ * reviewerRole: 'reviewer@example.com',
66
+ * decision: 'approved',
67
+ * reason: 'Code verified safe',
68
+ * })
69
+ *
70
+ * // Check if enough approvals have been collected
71
+ * const complete = repo.isComplete('quarantine-123')
72
+ * ```
73
+ */
74
+ export declare class ApprovalRepository {
75
+ private db;
76
+ constructor(db: DatabaseType);
77
+ /**
78
+ * Ensure the quarantine_approvals table exists
79
+ */
80
+ private ensureTableExists;
81
+ /**
82
+ * Record a new approval or rejection for a quarantine entry
83
+ *
84
+ * @param input - Approval details
85
+ * @returns The created approval entry
86
+ * @throws Error if reviewer has already submitted for this skill
87
+ */
88
+ recordApproval(input: RecordApprovalInput): ApprovalEntry;
89
+ /**
90
+ * Get all approvals for a quarantine entry (both pending and complete)
91
+ *
92
+ * @param skillId - The quarantine entry ID
93
+ * @returns All approval entries for this skill
94
+ */
95
+ getApprovals(skillId: string): ApprovalEntry[];
96
+ /**
97
+ * Get only pending (non-complete) approvals for a quarantine entry
98
+ *
99
+ * @param skillId - The quarantine entry ID
100
+ * @returns Pending approval entries
101
+ */
102
+ getPendingApprovals(skillId: string): ApprovalEntry[];
103
+ /**
104
+ * Check if a specific reviewer has already submitted for a skill
105
+ *
106
+ * @param skillId - The quarantine entry ID
107
+ * @param reviewerId - The reviewer's user ID
108
+ * @returns True if the reviewer already has a pending approval
109
+ */
110
+ hasReviewerApproved(skillId: string, reviewerId: string): boolean;
111
+ /**
112
+ * Check if the required number of approvals have been reached
113
+ *
114
+ * @param skillId - The quarantine entry ID
115
+ * @param requiredApprovals - Number of approvals needed (default: 2)
116
+ * @returns True if approval count meets or exceeds required
117
+ */
118
+ isComplete(skillId: string, requiredApprovals?: number): boolean;
119
+ /**
120
+ * Mark all pending approvals for a skill as complete
121
+ *
122
+ * @param skillId - The quarantine entry ID
123
+ * @returns Number of rows updated
124
+ */
125
+ markComplete(skillId: string): number;
126
+ /**
127
+ * Delete all approvals for a skill (for cleanup/reset/cancellation)
128
+ *
129
+ * @param skillId - The quarantine entry ID
130
+ * @returns Number of rows deleted
131
+ */
132
+ clearApprovals(skillId: string): number;
133
+ /**
134
+ * Get the timestamp of the first pending approval for timeout checks
135
+ *
136
+ * @param skillId - The quarantine entry ID
137
+ * @returns ISO date string of the first approval, or null if none
138
+ */
139
+ getWorkflowStartTime(skillId: string): string | null;
140
+ /**
141
+ * Get the count of pending approvals for a skill
142
+ *
143
+ * @param skillId - The quarantine entry ID
144
+ * @returns Count of pending approved entries
145
+ */
146
+ getPendingApprovalCount(skillId: string): number;
147
+ }
148
+ //# sourceMappingURL=ApprovalRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApprovalRepository.d.ts","sourceRoot":"","sources":["../../../../src/repositories/quarantine/ApprovalRepository.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAQ9E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAA;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAA;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAA;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAyDD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAc;gBAEZ,EAAE,EAAE,YAAY;IAK5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;;;;OAMG;IACH,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,aAAa;IAuBzD;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE;IAM9C;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE;IAMrD;;;;;;OAMG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAMjE;;;;;;OAMG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAU,GAAG,OAAO;IAQnE;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMrC;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMvC;;;;;OAKG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQpD;;;;;OAKG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAOjD"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * SMI-2277: Approval Repository
3
+ *
4
+ * Persists multi-approval state to SQLite instead of in-memory Map.
5
+ * This ensures pending approvals survive service restarts.
6
+ *
7
+ * @module @skillsmith/core/repositories/quarantine/ApprovalRepository
8
+ */
9
+ import { randomUUID } from 'crypto';
10
+ import { initializeQuarantineApprovalsSchema } from '../../db/quarantine-approvals-schema.js';
11
+ // ============================================================================
12
+ // SQL Queries
13
+ // ============================================================================
14
+ const INSERT_APPROVAL_QUERY = `
15
+ INSERT INTO quarantine_approvals (
16
+ id, skill_id, reviewer_id, reviewer_email, decision, reason,
17
+ created_at, required_approvals, is_complete
18
+ )
19
+ VALUES (?, ?, ?, ?, ?, ?, datetime('now') || 'Z', ?, 0)
20
+ `;
21
+ const SELECT_BY_SKILL_ID_QUERY = `
22
+ SELECT * FROM quarantine_approvals
23
+ WHERE skill_id = ?
24
+ ORDER BY created_at ASC
25
+ `;
26
+ const SELECT_PENDING_BY_SKILL_ID_QUERY = `
27
+ SELECT * FROM quarantine_approvals
28
+ WHERE skill_id = ? AND is_complete = 0
29
+ ORDER BY created_at ASC
30
+ `;
31
+ const COUNT_PENDING_APPROVALS_QUERY = `
32
+ SELECT COUNT(*) as count FROM quarantine_approvals
33
+ WHERE skill_id = ? AND is_complete = 0 AND decision = 'approved'
34
+ `;
35
+ const CHECK_REVIEWER_EXISTS_QUERY = `
36
+ SELECT id FROM quarantine_approvals
37
+ WHERE skill_id = ? AND reviewer_id = ? AND is_complete = 0
38
+ `;
39
+ const MARK_COMPLETE_QUERY = `
40
+ UPDATE quarantine_approvals
41
+ SET is_complete = 1, completed_at = datetime('now') || 'Z'
42
+ WHERE skill_id = ? AND is_complete = 0
43
+ `;
44
+ const DELETE_BY_SKILL_ID_QUERY = `
45
+ DELETE FROM quarantine_approvals WHERE skill_id = ?
46
+ `;
47
+ const SELECT_FIRST_PENDING_QUERY = `
48
+ SELECT created_at FROM quarantine_approvals
49
+ WHERE skill_id = ? AND is_complete = 0
50
+ ORDER BY created_at ASC
51
+ LIMIT 1
52
+ `;
53
+ // ============================================================================
54
+ // Repository Implementation
55
+ // ============================================================================
56
+ /**
57
+ * Repository for persisting multi-approval workflow state.
58
+ *
59
+ * Replaces the in-memory Map<string, MultiApprovalStatus> with
60
+ * database-backed storage to survive service restarts.
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * const repo = new ApprovalRepository(db)
65
+ *
66
+ * // Record a reviewer's approval
67
+ * repo.recordApproval({
68
+ * skillId: 'quarantine-123',
69
+ * reviewerId: 'user-456',
70
+ * reviewerRole: 'reviewer@example.com',
71
+ * decision: 'approved',
72
+ * reason: 'Code verified safe',
73
+ * })
74
+ *
75
+ * // Check if enough approvals have been collected
76
+ * const complete = repo.isComplete('quarantine-123')
77
+ * ```
78
+ */
79
+ export class ApprovalRepository {
80
+ db;
81
+ constructor(db) {
82
+ this.db = db;
83
+ this.ensureTableExists();
84
+ }
85
+ /**
86
+ * Ensure the quarantine_approvals table exists
87
+ */
88
+ ensureTableExists() {
89
+ initializeQuarantineApprovalsSchema(this.db);
90
+ }
91
+ /**
92
+ * Record a new approval or rejection for a quarantine entry
93
+ *
94
+ * @param input - Approval details
95
+ * @returns The created approval entry
96
+ * @throws Error if reviewer has already submitted for this skill
97
+ */
98
+ recordApproval(input) {
99
+ const id = randomUUID();
100
+ const requiredApprovals = input.requiredApprovals ?? 2;
101
+ this.db
102
+ .prepare(INSERT_APPROVAL_QUERY)
103
+ .run(id, input.skillId, input.reviewerId, input.reviewerEmail, input.decision, input.reason ?? null, requiredApprovals);
104
+ const row = this.db
105
+ .prepare('SELECT * FROM quarantine_approvals WHERE id = ?')
106
+ .get(id);
107
+ return rowToEntry(row);
108
+ }
109
+ /**
110
+ * Get all approvals for a quarantine entry (both pending and complete)
111
+ *
112
+ * @param skillId - The quarantine entry ID
113
+ * @returns All approval entries for this skill
114
+ */
115
+ getApprovals(skillId) {
116
+ const rows = this.db.prepare(SELECT_BY_SKILL_ID_QUERY).all(skillId);
117
+ return rows.map(rowToEntry);
118
+ }
119
+ /**
120
+ * Get only pending (non-complete) approvals for a quarantine entry
121
+ *
122
+ * @param skillId - The quarantine entry ID
123
+ * @returns Pending approval entries
124
+ */
125
+ getPendingApprovals(skillId) {
126
+ const rows = this.db.prepare(SELECT_PENDING_BY_SKILL_ID_QUERY).all(skillId);
127
+ return rows.map(rowToEntry);
128
+ }
129
+ /**
130
+ * Check if a specific reviewer has already submitted for a skill
131
+ *
132
+ * @param skillId - The quarantine entry ID
133
+ * @param reviewerId - The reviewer's user ID
134
+ * @returns True if the reviewer already has a pending approval
135
+ */
136
+ hasReviewerApproved(skillId, reviewerId) {
137
+ const row = this.db.prepare(CHECK_REVIEWER_EXISTS_QUERY).get(skillId, reviewerId);
138
+ return !!row;
139
+ }
140
+ /**
141
+ * Check if the required number of approvals have been reached
142
+ *
143
+ * @param skillId - The quarantine entry ID
144
+ * @param requiredApprovals - Number of approvals needed (default: 2)
145
+ * @returns True if approval count meets or exceeds required
146
+ */
147
+ isComplete(skillId, requiredApprovals = 2) {
148
+ const { count } = this.db.prepare(COUNT_PENDING_APPROVALS_QUERY).get(skillId);
149
+ return count >= requiredApprovals;
150
+ }
151
+ /**
152
+ * Mark all pending approvals for a skill as complete
153
+ *
154
+ * @param skillId - The quarantine entry ID
155
+ * @returns Number of rows updated
156
+ */
157
+ markComplete(skillId) {
158
+ const result = this.db.prepare(MARK_COMPLETE_QUERY).run(skillId);
159
+ return result.changes;
160
+ }
161
+ /**
162
+ * Delete all approvals for a skill (for cleanup/reset/cancellation)
163
+ *
164
+ * @param skillId - The quarantine entry ID
165
+ * @returns Number of rows deleted
166
+ */
167
+ clearApprovals(skillId) {
168
+ const result = this.db.prepare(DELETE_BY_SKILL_ID_QUERY).run(skillId);
169
+ return result.changes;
170
+ }
171
+ /**
172
+ * Get the timestamp of the first pending approval for timeout checks
173
+ *
174
+ * @param skillId - The quarantine entry ID
175
+ * @returns ISO date string of the first approval, or null if none
176
+ */
177
+ getWorkflowStartTime(skillId) {
178
+ const row = this.db.prepare(SELECT_FIRST_PENDING_QUERY).get(skillId);
179
+ return row?.created_at ?? null;
180
+ }
181
+ /**
182
+ * Get the count of pending approvals for a skill
183
+ *
184
+ * @param skillId - The quarantine entry ID
185
+ * @returns Count of pending approved entries
186
+ */
187
+ getPendingApprovalCount(skillId) {
188
+ const { count } = this.db.prepare(COUNT_PENDING_APPROVALS_QUERY).get(skillId);
189
+ return count;
190
+ }
191
+ }
192
+ // ============================================================================
193
+ // Helpers
194
+ // ============================================================================
195
+ /**
196
+ * Convert a database row to a domain object
197
+ */
198
+ function rowToEntry(row) {
199
+ return {
200
+ id: row.id,
201
+ skillId: row.skill_id,
202
+ reviewerId: row.reviewer_id,
203
+ reviewerEmail: row.reviewer_email,
204
+ decision: row.decision,
205
+ reason: row.reason,
206
+ createdAt: row.created_at,
207
+ completedAt: row.completed_at,
208
+ requiredApprovals: row.required_approvals,
209
+ isComplete: row.is_complete === 1,
210
+ };
211
+ }
212
+ //# sourceMappingURL=ApprovalRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApprovalRepository.js","sourceRoot":"","sources":["../../../../src/repositories/quarantine/ApprovalRepository.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,6 @@ export * from './types.js';
7
7
  export * from './queries.js';
8
8
  export * from './query-builder.js';
9
9
  export { QuarantineRepository } from './QuarantineRepository.js';
10
+ export { ApprovalRepository } from './ApprovalRepository.js';
11
+ export type { ApprovalRow, ApprovalEntry, RecordApprovalInput } from './ApprovalRepository.js';
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/repositories/quarantine/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/repositories/quarantine/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA"}
@@ -7,4 +7,5 @@ export * from './types.js';
7
7
  export * from './queries.js';
8
8
  export * from './query-builder.js';
9
9
  export { QuarantineRepository } from './QuarantineRepository.js';
10
+ export { ApprovalRepository } from './ApprovalRepository.js';
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/repositories/quarantine/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/repositories/quarantine/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA"}
@@ -7,7 +7,7 @@
7
7
  /**
8
8
  * Types of security events that are audited
9
9
  */
10
- export type AuditEventType = 'url_fetch' | 'file_access' | 'skill_install' | 'skill_uninstall' | 'security_scan' | 'cache_operation' | 'source_sync' | 'config_change' | 'quarantine_authenticated_review' | 'quarantine_multi_approval' | 'quarantine_multi_approval_complete' | 'quarantine_multi_approval_cancelled' | 'security_feature_flag_override';
10
+ export type AuditEventType = 'url_fetch' | 'file_access' | 'skill_install' | 'skill_uninstall' | 'security_scan' | 'cache_operation' | 'source_sync' | 'config_change' | 'quarantine_authenticated_review' | 'quarantine_multi_approval' | 'quarantine_multi_approval_complete' | 'quarantine_multi_approval_cancelled' | 'quarantine_multi_approval_timeout' | 'security_feature_flag_override';
11
11
  /**
12
12
  * Actor performing the action
13
13
  */
@@ -1 +1 @@
1
- {"version":3,"file":"audit-types.d.ts","sourceRoot":"","sources":["../../../src/security/audit-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,aAAa,GACb,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,aAAa,GACb,eAAe,GAEf,iCAAiC,GACjC,2BAA2B,GAC3B,oCAAoC,GACpC,qCAAqC,GAErC,gCAAgC,CAAA;AAEpC;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAA;AAE/E;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;AAErE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,cAAc,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,UAAU,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,cAAc,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,UAAU,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC;;GAEG;AACH,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAEtC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;IAC9C,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAC7C,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B"}
1
+ {"version":3,"file":"audit-types.d.ts","sourceRoot":"","sources":["../../../src/security/audit-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,aAAa,GACb,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,aAAa,GACb,eAAe,GAEf,iCAAiC,GACjC,2BAA2B,GAC3B,oCAAoC,GACpC,qCAAqC,GACrC,mCAAmC,GAEnC,gCAAgC,CAAA;AAEpC;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAA;AAE/E;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;AAErE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,cAAc,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,UAAU,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,cAAc,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,UAAU,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC;;GAEG;AACH,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAEtC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;IAC9C,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAC7C,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"audit-types.js","sourceRoot":"","sources":["../../../src/security/audit-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4EH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA,CAAC,WAAW"}
1
+ {"version":3,"file":"audit-types.js","sourceRoot":"","sources":["../../../src/security/audit-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6EH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA,CAAC,WAAW"}
@@ -19,7 +19,7 @@ export function toMinimalRefs(report) {
19
19
  return report.findings.map((finding) => {
20
20
  const line = finding.lineNumber ?? 0;
21
21
  const severity = finding.severity.toUpperCase();
22
- const message = finding.message.replace(/"/g, '\\"');
22
+ const message = finding.message.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
23
23
  // Format: skill_id:line:severity:type:message
24
24
  return `${report.skillId}:${line}:${severity}:${finding.type}:${message}`;
25
25
  });