@pan-sec/notebooklm-mcp 1.4.0 → 1.6.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.
- package/README.md +61 -7
- package/SECURITY.md +40 -6
- package/dist/auth/mcp-auth.d.ts.map +1 -1
- package/dist/auth/mcp-auth.js +3 -6
- package/dist/auth/mcp-auth.js.map +1 -1
- package/dist/compliance/alert-manager.d.ts +120 -0
- package/dist/compliance/alert-manager.d.ts.map +1 -0
- package/dist/compliance/alert-manager.js +420 -0
- package/dist/compliance/alert-manager.js.map +1 -0
- package/dist/compliance/breach-detection.d.ts +134 -0
- package/dist/compliance/breach-detection.d.ts.map +1 -0
- package/dist/compliance/breach-detection.js +456 -0
- package/dist/compliance/breach-detection.js.map +1 -0
- package/dist/compliance/change-log.d.ts +113 -0
- package/dist/compliance/change-log.d.ts.map +1 -0
- package/dist/compliance/change-log.js +275 -0
- package/dist/compliance/change-log.js.map +1 -0
- package/dist/compliance/compliance-logger.d.ts +136 -0
- package/dist/compliance/compliance-logger.d.ts.map +1 -0
- package/dist/compliance/compliance-logger.js +425 -0
- package/dist/compliance/compliance-logger.js.map +1 -0
- package/dist/compliance/compliance-tools.d.ts +18 -0
- package/dist/compliance/compliance-tools.d.ts.map +1 -0
- package/dist/compliance/compliance-tools.js +673 -0
- package/dist/compliance/compliance-tools.js.map +1 -0
- package/dist/compliance/consent-manager.d.ts +130 -0
- package/dist/compliance/consent-manager.d.ts.map +1 -0
- package/dist/compliance/consent-manager.js +386 -0
- package/dist/compliance/consent-manager.js.map +1 -0
- package/dist/compliance/dashboard.d.ts +243 -0
- package/dist/compliance/dashboard.d.ts.map +1 -0
- package/dist/compliance/dashboard.js +519 -0
- package/dist/compliance/dashboard.js.map +1 -0
- package/dist/compliance/data-classification.d.ts +117 -0
- package/dist/compliance/data-classification.d.ts.map +1 -0
- package/dist/compliance/data-classification.js +469 -0
- package/dist/compliance/data-classification.js.map +1 -0
- package/dist/compliance/data-erasure.d.ts +110 -0
- package/dist/compliance/data-erasure.d.ts.map +1 -0
- package/dist/compliance/data-erasure.js +501 -0
- package/dist/compliance/data-erasure.js.map +1 -0
- package/dist/compliance/data-export.d.ts +85 -0
- package/dist/compliance/data-export.d.ts.map +1 -0
- package/dist/compliance/data-export.js +394 -0
- package/dist/compliance/data-export.js.map +1 -0
- package/dist/compliance/data-inventory.d.ts +136 -0
- package/dist/compliance/data-inventory.d.ts.map +1 -0
- package/dist/compliance/data-inventory.js +335 -0
- package/dist/compliance/data-inventory.js.map +1 -0
- package/dist/compliance/dsar-handler.d.ts +123 -0
- package/dist/compliance/dsar-handler.d.ts.map +1 -0
- package/dist/compliance/dsar-handler.js +371 -0
- package/dist/compliance/dsar-handler.js.map +1 -0
- package/dist/compliance/evidence-collector.d.ts +187 -0
- package/dist/compliance/evidence-collector.d.ts.map +1 -0
- package/dist/compliance/evidence-collector.js +656 -0
- package/dist/compliance/evidence-collector.js.map +1 -0
- package/dist/compliance/health-monitor.d.ts +111 -0
- package/dist/compliance/health-monitor.d.ts.map +1 -0
- package/dist/compliance/health-monitor.js +509 -0
- package/dist/compliance/health-monitor.js.map +1 -0
- package/dist/compliance/incident-manager.d.ts +131 -0
- package/dist/compliance/incident-manager.d.ts.map +1 -0
- package/dist/compliance/incident-manager.js +418 -0
- package/dist/compliance/incident-manager.js.map +1 -0
- package/dist/compliance/index.d.ts +32 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +35 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/policy-docs.d.ts +108 -0
- package/dist/compliance/policy-docs.d.ts.map +1 -0
- package/dist/compliance/policy-docs.js +464 -0
- package/dist/compliance/policy-docs.js.map +1 -0
- package/dist/compliance/privacy-notice-text.d.ts +58 -0
- package/dist/compliance/privacy-notice-text.d.ts.map +1 -0
- package/dist/compliance/privacy-notice-text.js +161 -0
- package/dist/compliance/privacy-notice-text.js.map +1 -0
- package/dist/compliance/privacy-notice.d.ts +128 -0
- package/dist/compliance/privacy-notice.d.ts.map +1 -0
- package/dist/compliance/privacy-notice.js +250 -0
- package/dist/compliance/privacy-notice.js.map +1 -0
- package/dist/compliance/report-generator.d.ts +168 -0
- package/dist/compliance/report-generator.d.ts.map +1 -0
- package/dist/compliance/report-generator.js +830 -0
- package/dist/compliance/report-generator.js.map +1 -0
- package/dist/compliance/retention-engine.d.ts +130 -0
- package/dist/compliance/retention-engine.d.ts.map +1 -0
- package/dist/compliance/retention-engine.js +510 -0
- package/dist/compliance/retention-engine.js.map +1 -0
- package/dist/compliance/siem-exporter.d.ts +150 -0
- package/dist/compliance/siem-exporter.d.ts.map +1 -0
- package/dist/compliance/siem-exporter.js +509 -0
- package/dist/compliance/siem-exporter.js.map +1 -0
- package/dist/compliance/types.d.ts +601 -0
- package/dist/compliance/types.d.ts.map +1 -0
- package/dist/compliance/types.js +22 -0
- package/dist/compliance/types.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -1
- package/dist/config.js.map +1 -1
- package/dist/library/notebook-library.d.ts.map +1 -1
- package/dist/library/notebook-library.js +2 -1
- package/dist/library/notebook-library.js.map +1 -1
- package/dist/session/shared-context-manager.d.ts.map +1 -1
- package/dist/session/shared-context-manager.js +2 -1
- package/dist/session/shared-context-manager.js.map +1 -1
- package/dist/utils/audit-logger.d.ts +21 -1
- package/dist/utils/audit-logger.d.ts.map +1 -1
- package/dist/utils/audit-logger.js +53 -4
- package/dist/utils/audit-logger.js.map +1 -1
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +8 -15
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/file-permissions.d.ts +85 -0
- package/dist/utils/file-permissions.d.ts.map +1 -0
- package/dist/utils/file-permissions.js +180 -0
- package/dist/utils/file-permissions.js.map +1 -0
- package/dist/utils/settings-manager.d.ts.map +1 -1
- package/dist/utils/settings-manager.js +6 -11
- package/dist/utils/settings-manager.js.map +1 -1
- package/docs/COMPLIANCE-SPEC.md +1452 -0
- package/package.json +30 -4
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Change Log
|
|
3
|
+
*
|
|
4
|
+
* Tracks all configuration changes for SOC2 compliance.
|
|
5
|
+
* Provides audit trail for system modifications.
|
|
6
|
+
*
|
|
7
|
+
* Added by Pantheon Security for enterprise compliance support.
|
|
8
|
+
*/
|
|
9
|
+
import crypto from "crypto";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import fs from "fs";
|
|
12
|
+
import { getConfig } from "../config.js";
|
|
13
|
+
import { mkdirSecure, appendFileSecure } from "../utils/file-permissions.js";
|
|
14
|
+
import { getComplianceLogger } from "./compliance-logger.js";
|
|
15
|
+
/**
|
|
16
|
+
* Generate a UUID v4
|
|
17
|
+
*/
|
|
18
|
+
function generateUUID() {
|
|
19
|
+
return crypto.randomUUID();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Change Log class
|
|
23
|
+
*/
|
|
24
|
+
export class ChangeLog {
|
|
25
|
+
static instance;
|
|
26
|
+
logDir;
|
|
27
|
+
currentLogFile = "";
|
|
28
|
+
constructor() {
|
|
29
|
+
const config = getConfig();
|
|
30
|
+
this.logDir = path.join(config.dataDir, "compliance", "changes");
|
|
31
|
+
mkdirSecure(this.logDir);
|
|
32
|
+
this.initializeLogFile();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get singleton instance
|
|
36
|
+
*/
|
|
37
|
+
static getInstance() {
|
|
38
|
+
if (!ChangeLog.instance) {
|
|
39
|
+
ChangeLog.instance = new ChangeLog();
|
|
40
|
+
}
|
|
41
|
+
return ChangeLog.instance;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Initialize log file for current month
|
|
45
|
+
*/
|
|
46
|
+
initializeLogFile() {
|
|
47
|
+
const now = new Date();
|
|
48
|
+
const year = now.getFullYear();
|
|
49
|
+
const month = String(now.getMonth() + 1).padStart(2, "0");
|
|
50
|
+
this.currentLogFile = path.join(this.logDir, `changes-${year}-${month}.jsonl`);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Record a configuration change
|
|
54
|
+
*/
|
|
55
|
+
async recordChange(component, setting, oldValue, newValue, options = {}) {
|
|
56
|
+
// Ensure log file is current
|
|
57
|
+
this.initializeLogFile();
|
|
58
|
+
const record = {
|
|
59
|
+
id: generateUUID(),
|
|
60
|
+
timestamp: new Date().toISOString(),
|
|
61
|
+
component,
|
|
62
|
+
setting,
|
|
63
|
+
old_value: this.sanitizeValue(oldValue),
|
|
64
|
+
new_value: this.sanitizeValue(newValue),
|
|
65
|
+
changed_by: options.changedBy || "system",
|
|
66
|
+
method: options.method || "api",
|
|
67
|
+
requires_approval: options.requiresApproval || false,
|
|
68
|
+
approved_by: options.approvedBy,
|
|
69
|
+
approved_at: options.approvedBy ? new Date().toISOString() : undefined,
|
|
70
|
+
impact: options.impact || "low",
|
|
71
|
+
affected_compliance: options.affectedCompliance || [],
|
|
72
|
+
};
|
|
73
|
+
// Write to log file
|
|
74
|
+
const line = JSON.stringify(record) + "\n";
|
|
75
|
+
appendFileSecure(this.currentLogFile, line);
|
|
76
|
+
// Also log to compliance logger
|
|
77
|
+
const logger = getComplianceLogger();
|
|
78
|
+
await logger.logPolicyChange(setting, oldValue, newValue, record.changed_by);
|
|
79
|
+
return record;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Sanitize value for logging (remove sensitive data)
|
|
83
|
+
*/
|
|
84
|
+
sanitizeValue(value) {
|
|
85
|
+
if (value === null || value === undefined) {
|
|
86
|
+
return value;
|
|
87
|
+
}
|
|
88
|
+
if (typeof value === "string") {
|
|
89
|
+
// Check for sensitive patterns
|
|
90
|
+
if (/password|secret|token|key|credential|auth/i.test(value) ||
|
|
91
|
+
value.length > 100) {
|
|
92
|
+
return "[REDACTED]";
|
|
93
|
+
}
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
if (typeof value === "object") {
|
|
97
|
+
return "[object]";
|
|
98
|
+
}
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get changes by component
|
|
103
|
+
*/
|
|
104
|
+
async getChangesByComponent(component, limit = 100) {
|
|
105
|
+
const changes = await this.getAllChanges(limit * 10);
|
|
106
|
+
return changes
|
|
107
|
+
.filter(c => c.component === component)
|
|
108
|
+
.slice(0, limit);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get changes by setting
|
|
112
|
+
*/
|
|
113
|
+
async getChangesBySetting(setting, limit = 100) {
|
|
114
|
+
const changes = await this.getAllChanges(limit * 10);
|
|
115
|
+
return changes
|
|
116
|
+
.filter(c => c.setting === setting)
|
|
117
|
+
.slice(0, limit);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get changes within date range
|
|
121
|
+
*/
|
|
122
|
+
async getChangesInRange(from, to, limit = 1000) {
|
|
123
|
+
const changes = await this.getAllChanges(limit * 2);
|
|
124
|
+
return changes
|
|
125
|
+
.filter(c => {
|
|
126
|
+
const date = new Date(c.timestamp);
|
|
127
|
+
return date >= from && date <= to;
|
|
128
|
+
})
|
|
129
|
+
.slice(0, limit);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get all changes (most recent first)
|
|
133
|
+
*/
|
|
134
|
+
async getAllChanges(limit = 100) {
|
|
135
|
+
const changes = [];
|
|
136
|
+
try {
|
|
137
|
+
if (!fs.existsSync(this.logDir)) {
|
|
138
|
+
return changes;
|
|
139
|
+
}
|
|
140
|
+
const files = fs.readdirSync(this.logDir)
|
|
141
|
+
.filter(f => f.startsWith("changes-") && f.endsWith(".jsonl"))
|
|
142
|
+
.sort()
|
|
143
|
+
.reverse();
|
|
144
|
+
for (const file of files) {
|
|
145
|
+
const filePath = path.join(this.logDir, file);
|
|
146
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
147
|
+
const lines = content.trim().split("\n").filter(l => l);
|
|
148
|
+
for (const line of lines.reverse()) {
|
|
149
|
+
try {
|
|
150
|
+
const record = JSON.parse(line);
|
|
151
|
+
changes.push(record);
|
|
152
|
+
if (changes.length >= limit)
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Skip malformed lines
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (changes.length >= limit)
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Return what we have
|
|
165
|
+
}
|
|
166
|
+
return changes;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get high-impact changes
|
|
170
|
+
*/
|
|
171
|
+
async getHighImpactChanges(limit = 100) {
|
|
172
|
+
const changes = await this.getAllChanges(limit * 5);
|
|
173
|
+
return changes
|
|
174
|
+
.filter(c => c.impact === "high")
|
|
175
|
+
.slice(0, limit);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get changes affecting compliance
|
|
179
|
+
*/
|
|
180
|
+
async getComplianceAffectingChanges(regulation, limit = 100) {
|
|
181
|
+
const changes = await this.getAllChanges(limit * 5);
|
|
182
|
+
return changes
|
|
183
|
+
.filter(c => {
|
|
184
|
+
if (c.affected_compliance.length === 0)
|
|
185
|
+
return false;
|
|
186
|
+
if (regulation) {
|
|
187
|
+
return c.affected_compliance.includes(regulation);
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
190
|
+
})
|
|
191
|
+
.slice(0, limit);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get change statistics
|
|
195
|
+
*/
|
|
196
|
+
async getStatistics(from, to) {
|
|
197
|
+
const allChanges = await this.getAllChanges(10000);
|
|
198
|
+
let changes = allChanges;
|
|
199
|
+
if (from) {
|
|
200
|
+
changes = changes.filter(c => new Date(c.timestamp) >= from);
|
|
201
|
+
}
|
|
202
|
+
if (to) {
|
|
203
|
+
changes = changes.filter(c => new Date(c.timestamp) <= to);
|
|
204
|
+
}
|
|
205
|
+
const byComponent = {};
|
|
206
|
+
const byImpact = {};
|
|
207
|
+
const byMethod = {};
|
|
208
|
+
let requiringApproval = 0;
|
|
209
|
+
let complianceAffecting = 0;
|
|
210
|
+
for (const change of changes) {
|
|
211
|
+
byComponent[change.component] = (byComponent[change.component] || 0) + 1;
|
|
212
|
+
byImpact[change.impact] = (byImpact[change.impact] || 0) + 1;
|
|
213
|
+
byMethod[change.method] = (byMethod[change.method] || 0) + 1;
|
|
214
|
+
if (change.requires_approval)
|
|
215
|
+
requiringApproval++;
|
|
216
|
+
if (change.affected_compliance.length > 0)
|
|
217
|
+
complianceAffecting++;
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
total_changes: changes.length,
|
|
221
|
+
by_component: byComponent,
|
|
222
|
+
by_impact: byImpact,
|
|
223
|
+
by_method: byMethod,
|
|
224
|
+
requiring_approval: requiringApproval,
|
|
225
|
+
compliance_affecting: complianceAffecting,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Export changes for audit
|
|
230
|
+
*/
|
|
231
|
+
async exportForAudit(from, to) {
|
|
232
|
+
const changes = await this.getChangesInRange(from, to, 10000);
|
|
233
|
+
return {
|
|
234
|
+
period: {
|
|
235
|
+
from: from.toISOString(),
|
|
236
|
+
to: to.toISOString(),
|
|
237
|
+
},
|
|
238
|
+
total_changes: changes.length,
|
|
239
|
+
high_impact_changes: changes.filter(c => c.impact === "high").length,
|
|
240
|
+
compliance_affecting_changes: changes.filter(c => c.affected_compliance.length > 0).length,
|
|
241
|
+
changes,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// ============================================
|
|
246
|
+
// SINGLETON ACCESS
|
|
247
|
+
// ============================================
|
|
248
|
+
/**
|
|
249
|
+
* Get the change log instance
|
|
250
|
+
*/
|
|
251
|
+
export function getChangeLog() {
|
|
252
|
+
return ChangeLog.getInstance();
|
|
253
|
+
}
|
|
254
|
+
// ============================================
|
|
255
|
+
// CONVENIENCE EXPORTS
|
|
256
|
+
// ============================================
|
|
257
|
+
/**
|
|
258
|
+
* Record a configuration change
|
|
259
|
+
*/
|
|
260
|
+
export async function recordConfigChange(component, setting, oldValue, newValue, options) {
|
|
261
|
+
return getChangeLog().recordChange(component, setting, oldValue, newValue, options);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get recent configuration changes
|
|
265
|
+
*/
|
|
266
|
+
export async function getRecentChanges(limit = 100) {
|
|
267
|
+
return getChangeLog().getAllChanges(limit);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Get change statistics
|
|
271
|
+
*/
|
|
272
|
+
export async function getChangeStatistics(from, to) {
|
|
273
|
+
return getChangeLog().getStatistics(from, to);
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=change-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-log.js","sourceRoot":"","sources":["../../src/compliance/change-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compliance Logger
|
|
3
|
+
*
|
|
4
|
+
* Structured logging for compliance events, separate from operational audit logs.
|
|
5
|
+
* Implements hash-chaining for tamper detection and supports 7-year retention (CSSF).
|
|
6
|
+
*
|
|
7
|
+
* Added by Pantheon Security for enterprise compliance support.
|
|
8
|
+
*/
|
|
9
|
+
import type { ComplianceEvent, ComplianceEventCategory, ComplianceActor, ComplianceResource, LegalBasis, DataCategory } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Compliance Logger class
|
|
12
|
+
*/
|
|
13
|
+
export declare class ComplianceLogger {
|
|
14
|
+
private static instance;
|
|
15
|
+
private complianceDir;
|
|
16
|
+
private enabled;
|
|
17
|
+
private retentionYears;
|
|
18
|
+
private lastHash;
|
|
19
|
+
private constructor();
|
|
20
|
+
/**
|
|
21
|
+
* Get singleton instance
|
|
22
|
+
*/
|
|
23
|
+
static getInstance(): ComplianceLogger;
|
|
24
|
+
/**
|
|
25
|
+
* Ensure compliance directory exists
|
|
26
|
+
*/
|
|
27
|
+
private ensureComplianceDir;
|
|
28
|
+
/**
|
|
29
|
+
* Get the current log file path (monthly rotation)
|
|
30
|
+
*/
|
|
31
|
+
private getLogFilePath;
|
|
32
|
+
/**
|
|
33
|
+
* Load the last hash from the current log file
|
|
34
|
+
*/
|
|
35
|
+
private loadLastHash;
|
|
36
|
+
/**
|
|
37
|
+
* Create a compliance event
|
|
38
|
+
*/
|
|
39
|
+
private createEvent;
|
|
40
|
+
/**
|
|
41
|
+
* Write event to log file
|
|
42
|
+
*/
|
|
43
|
+
private writeEvent;
|
|
44
|
+
/**
|
|
45
|
+
* Log a compliance event
|
|
46
|
+
*/
|
|
47
|
+
log(category: ComplianceEventCategory, eventType: string, actor: Partial<ComplianceActor>, outcome: "success" | "failure" | "pending", options?: {
|
|
48
|
+
resource?: ComplianceResource;
|
|
49
|
+
details?: Record<string, unknown>;
|
|
50
|
+
legalBasis?: LegalBasis;
|
|
51
|
+
dataCategories?: DataCategory[];
|
|
52
|
+
retentionDays?: number;
|
|
53
|
+
failureReason?: string;
|
|
54
|
+
}): Promise<ComplianceEvent>;
|
|
55
|
+
/**
|
|
56
|
+
* Log consent event
|
|
57
|
+
*/
|
|
58
|
+
logConsent(action: "granted" | "revoked" | "updated", actor: Partial<ComplianceActor>, purposes: string[], success: boolean, details?: Record<string, unknown>): Promise<ComplianceEvent>;
|
|
59
|
+
/**
|
|
60
|
+
* Log data access event
|
|
61
|
+
*/
|
|
62
|
+
logDataAccess(action: "view" | "export" | "delete" | "request", actor: Partial<ComplianceActor>, dataType: string, success: boolean, details?: Record<string, unknown>): Promise<ComplianceEvent>;
|
|
63
|
+
/**
|
|
64
|
+
* Log data export event (GDPR Article 20)
|
|
65
|
+
*/
|
|
66
|
+
logDataExport(actor: Partial<ComplianceActor>, dataTypes: string[], success: boolean, details?: Record<string, unknown>): Promise<ComplianceEvent>;
|
|
67
|
+
/**
|
|
68
|
+
* Log data deletion event (GDPR Article 17)
|
|
69
|
+
*/
|
|
70
|
+
logDataDeletion(actor: Partial<ComplianceActor>, dataType: string, itemCount: number, success: boolean, details?: Record<string, unknown>): Promise<ComplianceEvent>;
|
|
71
|
+
/**
|
|
72
|
+
* Log security incident
|
|
73
|
+
*/
|
|
74
|
+
logSecurityIncident(incidentType: string, severity: "low" | "medium" | "high" | "critical", details: Record<string, unknown>): Promise<ComplianceEvent>;
|
|
75
|
+
/**
|
|
76
|
+
* Log policy change
|
|
77
|
+
*/
|
|
78
|
+
logPolicyChange(setting: string, oldValue: unknown, newValue: unknown, changedBy: "user" | "system" | "admin"): Promise<ComplianceEvent>;
|
|
79
|
+
/**
|
|
80
|
+
* Log access control event
|
|
81
|
+
*/
|
|
82
|
+
logAccessControl(action: "login" | "logout" | "auth_failed" | "locked_out", actor: Partial<ComplianceActor>, success: boolean, details?: Record<string, unknown>): Promise<ComplianceEvent>;
|
|
83
|
+
/**
|
|
84
|
+
* Log retention event
|
|
85
|
+
*/
|
|
86
|
+
logRetention(action: "cleanup" | "archive" | "delete", dataType: string, itemCount: number, details?: Record<string, unknown>): Promise<ComplianceEvent>;
|
|
87
|
+
/**
|
|
88
|
+
* Log breach notification
|
|
89
|
+
*/
|
|
90
|
+
logBreach(breachType: string, severity: "low" | "medium" | "high" | "critical", notificationSent: boolean, details: Record<string, unknown>): Promise<ComplianceEvent>;
|
|
91
|
+
/**
|
|
92
|
+
* Get events by category
|
|
93
|
+
*/
|
|
94
|
+
getEvents(category?: ComplianceEventCategory, from?: Date, to?: Date, limit?: number): Promise<ComplianceEvent[]>;
|
|
95
|
+
/**
|
|
96
|
+
* Get log files sorted by date (newest first)
|
|
97
|
+
*/
|
|
98
|
+
private getLogFiles;
|
|
99
|
+
/**
|
|
100
|
+
* Verify hash chain integrity
|
|
101
|
+
*/
|
|
102
|
+
verifyIntegrity(): Promise<{
|
|
103
|
+
valid: boolean;
|
|
104
|
+
lastValidEvent?: string;
|
|
105
|
+
firstInvalidEvent?: string;
|
|
106
|
+
totalEvents: number;
|
|
107
|
+
validEvents: number;
|
|
108
|
+
}>;
|
|
109
|
+
/**
|
|
110
|
+
* Get compliance log statistics
|
|
111
|
+
*/
|
|
112
|
+
getStats(): Promise<{
|
|
113
|
+
enabled: boolean;
|
|
114
|
+
retentionYears: number;
|
|
115
|
+
complianceDir: string;
|
|
116
|
+
logFileCount: number;
|
|
117
|
+
totalEvents: number;
|
|
118
|
+
eventsByCategory: Record<ComplianceEventCategory, number>;
|
|
119
|
+
}>;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get the compliance logger instance
|
|
123
|
+
*/
|
|
124
|
+
export declare function getComplianceLogger(): ComplianceLogger;
|
|
125
|
+
/**
|
|
126
|
+
* Log a compliance event (convenience function)
|
|
127
|
+
*/
|
|
128
|
+
export declare function logComplianceEvent(category: ComplianceEventCategory, eventType: string, actor: Partial<ComplianceActor>, outcome: "success" | "failure" | "pending", options?: {
|
|
129
|
+
resource?: ComplianceResource;
|
|
130
|
+
details?: Record<string, unknown>;
|
|
131
|
+
legalBasis?: LegalBasis;
|
|
132
|
+
dataCategories?: DataCategory[];
|
|
133
|
+
retentionDays?: number;
|
|
134
|
+
failureReason?: string;
|
|
135
|
+
}): Promise<ComplianceEvent>;
|
|
136
|
+
//# sourceMappingURL=compliance-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance-logger.d.ts","sourceRoot":"","sources":["../../src/compliance/compliance-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,YAAY,EACb,MAAM,YAAY,CAAC;AA2CpB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAA0B;IAE1C,OAAO;IAsBP;;OAEG;WACW,WAAW,IAAI,gBAAgB;IAO7C;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAgDnB;;OAEG;YACW,UAAU;IAQxB;;OAEG;IACU,GAAG,CACd,QAAQ,EAAE,uBAAuB,EACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,EAC1C,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,kBAAkB,CAAC;QAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;QAChC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;KACnB,GACL,OAAO,CAAC,eAAe,CAAC;IAU3B;;OAEG;IACU,UAAU,CACrB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,EACzC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,aAAa,CACxB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,EAChD,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,aAAa,CACxB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,eAAe,CAC1B,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,mBAAmB,CAC9B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,EAChD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,eAAe,CAAC;IAY3B;;OAEG;IACU,eAAe,CAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GACrC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,gBAAgB,CAC3B,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,aAAa,GAAG,YAAY,EACzD,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAU3B;;OAEG;IACU,YAAY,CACvB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,EACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,SAAS,CACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,EAChD,gBAAgB,EAAE,OAAO,EACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,eAAe,CAAC;IAoB3B;;OAEG;IACU,SAAS,CACpB,QAAQ,CAAC,EAAE,uBAAuB,EAClC,IAAI,CAAC,EAAE,IAAI,EACX,EAAE,CAAC,EAAE,IAAI,EACT,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC,eAAe,EAAE,CAAC;IAoC7B;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC;QACtC,KAAK,EAAE,OAAO,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IA8DF;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC;QAC/B,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;KAC3D,CAAC;CAoDH;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAMD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,uBAAuB,EACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,EAC1C,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,eAAe,CAAC,CAE1B"}
|