@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,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Monitor
|
|
3
|
+
*
|
|
4
|
+
* Monitors system health and availability.
|
|
5
|
+
* Implements SOC2 availability and monitoring requirements.
|
|
6
|
+
*
|
|
7
|
+
* Added by Pantheon Security for enterprise compliance support.
|
|
8
|
+
*/
|
|
9
|
+
import type { HealthMetrics, ComponentHealth } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Health Monitor class
|
|
12
|
+
*/
|
|
13
|
+
export declare class HealthMonitor {
|
|
14
|
+
private static instance;
|
|
15
|
+
private startTime;
|
|
16
|
+
private enabled;
|
|
17
|
+
private checkIntervalSeconds;
|
|
18
|
+
private checkTimer;
|
|
19
|
+
private lastMetrics;
|
|
20
|
+
private checks;
|
|
21
|
+
private constructor();
|
|
22
|
+
/**
|
|
23
|
+
* Get singleton instance
|
|
24
|
+
*/
|
|
25
|
+
static getInstance(): HealthMonitor;
|
|
26
|
+
/**
|
|
27
|
+
* Initialize health checks
|
|
28
|
+
*/
|
|
29
|
+
private initializeChecks;
|
|
30
|
+
/**
|
|
31
|
+
* Start periodic health monitoring
|
|
32
|
+
*/
|
|
33
|
+
private startMonitoring;
|
|
34
|
+
/**
|
|
35
|
+
* Stop health monitoring
|
|
36
|
+
*/
|
|
37
|
+
stop(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Run full health check
|
|
40
|
+
*/
|
|
41
|
+
runHealthCheck(): Promise<HealthMetrics>;
|
|
42
|
+
/**
|
|
43
|
+
* Check data directory health
|
|
44
|
+
*/
|
|
45
|
+
private checkDataDirectory;
|
|
46
|
+
/**
|
|
47
|
+
* Check config directory health
|
|
48
|
+
*/
|
|
49
|
+
private checkConfigDirectory;
|
|
50
|
+
/**
|
|
51
|
+
* Check audit logging health
|
|
52
|
+
*/
|
|
53
|
+
private checkAuditLogging;
|
|
54
|
+
/**
|
|
55
|
+
* Check compliance logging health
|
|
56
|
+
*/
|
|
57
|
+
private checkComplianceLogging;
|
|
58
|
+
/**
|
|
59
|
+
* Check encryption health
|
|
60
|
+
*/
|
|
61
|
+
private checkEncryption;
|
|
62
|
+
/**
|
|
63
|
+
* Get resource metrics
|
|
64
|
+
*/
|
|
65
|
+
private getResourceMetrics;
|
|
66
|
+
/**
|
|
67
|
+
* Get security status
|
|
68
|
+
*/
|
|
69
|
+
private getSecurityStatus;
|
|
70
|
+
/**
|
|
71
|
+
* Get compliance status
|
|
72
|
+
*/
|
|
73
|
+
private getComplianceStatus;
|
|
74
|
+
/**
|
|
75
|
+
* Get last health metrics
|
|
76
|
+
*/
|
|
77
|
+
getLastMetrics(): HealthMetrics | null;
|
|
78
|
+
/**
|
|
79
|
+
* Get current status (quick check without full health run)
|
|
80
|
+
*/
|
|
81
|
+
getStatus(): {
|
|
82
|
+
status: "healthy" | "degraded" | "unhealthy" | "unknown";
|
|
83
|
+
uptime_seconds: number;
|
|
84
|
+
last_check?: string;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Register a custom health check
|
|
88
|
+
*/
|
|
89
|
+
registerCheck(name: string, check: () => Promise<ComponentHealth>): void;
|
|
90
|
+
/**
|
|
91
|
+
* Get uptime in human-readable format
|
|
92
|
+
*/
|
|
93
|
+
getUptimeFormatted(): string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get the health monitor instance
|
|
97
|
+
*/
|
|
98
|
+
export declare function getHealthMonitor(): HealthMonitor;
|
|
99
|
+
/**
|
|
100
|
+
* Run a health check
|
|
101
|
+
*/
|
|
102
|
+
export declare function runHealthCheck(): Promise<HealthMetrics>;
|
|
103
|
+
/**
|
|
104
|
+
* Get current health status
|
|
105
|
+
*/
|
|
106
|
+
export declare function getHealthStatus(): ReturnType<HealthMonitor["getStatus"]>;
|
|
107
|
+
/**
|
|
108
|
+
* Get last health metrics
|
|
109
|
+
*/
|
|
110
|
+
export declare function getLastHealthMetrics(): HealthMetrics | null;
|
|
111
|
+
//# sourceMappingURL=health-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-monitor.d.ts","sourceRoot":"","sources":["../../src/compliance/health-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EAIhB,MAAM,YAAY,CAAC;AAUpB;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,MAAM,CAAqB;IAEnC,OAAO;IAeP;;OAEG;WACW,WAAW,IAAI,aAAa;IAO1C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACI,IAAI,IAAI,IAAI;IAOnB;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IAwFrD;;OAEG;YACW,kBAAkB;IAmChC;;OAEG;YACW,oBAAoB;IAiClC;;OAEG;YACW,iBAAiB;IAqD/B;;OAEG;YACW,sBAAsB;IA2CpC;;OAEG;YACW,eAAe;IA0C7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;YACW,iBAAiB;IAmB/B;;OAEG;YACW,mBAAmB;IA6BjC;;OAEG;IACI,cAAc,IAAI,aAAa,GAAG,IAAI;IAI7C;;OAEG;IACI,SAAS,IAAI;QAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;QACzD,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;IAeD;;OAEG;IACI,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAI/E;;OAEG;IACI,kBAAkB,IAAI,MAAM;CAepC;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAMD;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC,CAE7D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAExE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,aAAa,GAAG,IAAI,CAE3D"}
|
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Monitor
|
|
3
|
+
*
|
|
4
|
+
* Monitors system health and availability.
|
|
5
|
+
* Implements SOC2 availability and monitoring requirements.
|
|
6
|
+
*
|
|
7
|
+
* Added by Pantheon Security for enterprise compliance support.
|
|
8
|
+
*/
|
|
9
|
+
import os from "os";
|
|
10
|
+
import fs from "fs";
|
|
11
|
+
import path from "path";
|
|
12
|
+
import { getConfig } from "../config.js";
|
|
13
|
+
import { getComplianceLogger } from "./compliance-logger.js";
|
|
14
|
+
import { getConsentManager } from "./consent-manager.js";
|
|
15
|
+
import { getRetentionEngine } from "./retention-engine.js";
|
|
16
|
+
import { getIncidentManager } from "./incident-manager.js";
|
|
17
|
+
import { getAlertManager } from "./alert-manager.js";
|
|
18
|
+
/**
|
|
19
|
+
* Health Monitor class
|
|
20
|
+
*/
|
|
21
|
+
export class HealthMonitor {
|
|
22
|
+
static instance;
|
|
23
|
+
startTime;
|
|
24
|
+
enabled;
|
|
25
|
+
checkIntervalSeconds;
|
|
26
|
+
checkTimer = null;
|
|
27
|
+
lastMetrics = null;
|
|
28
|
+
checks = [];
|
|
29
|
+
constructor() {
|
|
30
|
+
this.startTime = Date.now();
|
|
31
|
+
this.enabled = process.env.NLMCP_HEALTH_MONITORING !== "false";
|
|
32
|
+
this.checkIntervalSeconds = parseInt(process.env.NLMCP_HEALTH_CHECK_INTERVAL || "60", 10);
|
|
33
|
+
this.initializeChecks();
|
|
34
|
+
if (this.enabled) {
|
|
35
|
+
this.startMonitoring();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get singleton instance
|
|
40
|
+
*/
|
|
41
|
+
static getInstance() {
|
|
42
|
+
if (!HealthMonitor.instance) {
|
|
43
|
+
HealthMonitor.instance = new HealthMonitor();
|
|
44
|
+
}
|
|
45
|
+
return HealthMonitor.instance;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Initialize health checks
|
|
49
|
+
*/
|
|
50
|
+
initializeChecks() {
|
|
51
|
+
this.checks = [
|
|
52
|
+
{
|
|
53
|
+
name: "data_directory",
|
|
54
|
+
check: () => this.checkDataDirectory(),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: "config_directory",
|
|
58
|
+
check: () => this.checkConfigDirectory(),
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "audit_logging",
|
|
62
|
+
check: () => this.checkAuditLogging(),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "compliance_logging",
|
|
66
|
+
check: () => this.checkComplianceLogging(),
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "encryption",
|
|
70
|
+
check: () => this.checkEncryption(),
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Start periodic health monitoring
|
|
76
|
+
*/
|
|
77
|
+
startMonitoring() {
|
|
78
|
+
if (this.checkTimer) {
|
|
79
|
+
clearInterval(this.checkTimer);
|
|
80
|
+
}
|
|
81
|
+
// Run initial check
|
|
82
|
+
this.runHealthCheck().catch(() => { });
|
|
83
|
+
// Schedule periodic checks
|
|
84
|
+
this.checkTimer = setInterval(() => {
|
|
85
|
+
this.runHealthCheck().catch(() => { });
|
|
86
|
+
}, this.checkIntervalSeconds * 1000);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Stop health monitoring
|
|
90
|
+
*/
|
|
91
|
+
stop() {
|
|
92
|
+
if (this.checkTimer) {
|
|
93
|
+
clearInterval(this.checkTimer);
|
|
94
|
+
this.checkTimer = null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Run full health check
|
|
99
|
+
*/
|
|
100
|
+
async runHealthCheck() {
|
|
101
|
+
const startTime = Date.now();
|
|
102
|
+
// Run all component checks
|
|
103
|
+
const componentResults = await Promise.all(this.checks.map(async (check) => {
|
|
104
|
+
try {
|
|
105
|
+
return await check.check();
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return {
|
|
109
|
+
name: check.name,
|
|
110
|
+
status: "down",
|
|
111
|
+
last_check: new Date().toISOString(),
|
|
112
|
+
error: error instanceof Error ? error.message : String(error),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}));
|
|
116
|
+
// Get resource metrics
|
|
117
|
+
const resources = this.getResourceMetrics();
|
|
118
|
+
// Get security status
|
|
119
|
+
const security = await this.getSecurityStatus();
|
|
120
|
+
// Get compliance status
|
|
121
|
+
const compliance = await this.getComplianceStatus();
|
|
122
|
+
// Determine overall status
|
|
123
|
+
const hasDown = componentResults.some(c => c.status === "down");
|
|
124
|
+
const hasDegraded = componentResults.some(c => c.status === "degraded");
|
|
125
|
+
let overallStatus;
|
|
126
|
+
if (hasDown) {
|
|
127
|
+
overallStatus = "unhealthy";
|
|
128
|
+
}
|
|
129
|
+
else if (hasDegraded) {
|
|
130
|
+
overallStatus = "degraded";
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
overallStatus = "healthy";
|
|
134
|
+
}
|
|
135
|
+
const metrics = {
|
|
136
|
+
timestamp: new Date().toISOString(),
|
|
137
|
+
status: overallStatus,
|
|
138
|
+
uptime_seconds: Math.floor((Date.now() - this.startTime) / 1000),
|
|
139
|
+
components: componentResults,
|
|
140
|
+
resources,
|
|
141
|
+
security,
|
|
142
|
+
compliance,
|
|
143
|
+
};
|
|
144
|
+
this.lastMetrics = metrics;
|
|
145
|
+
// Alert if unhealthy
|
|
146
|
+
if (overallStatus === "unhealthy") {
|
|
147
|
+
const alertManager = getAlertManager();
|
|
148
|
+
const downComponents = componentResults
|
|
149
|
+
.filter(c => c.status === "down")
|
|
150
|
+
.map(c => c.name);
|
|
151
|
+
await alertManager.sendAlert("error", "System Health Degraded", `The following components are down: ${downComponents.join(", ")}`, "health-monitor", { components: downComponents });
|
|
152
|
+
}
|
|
153
|
+
// Log health check
|
|
154
|
+
const logger = getComplianceLogger();
|
|
155
|
+
await logger.log("data_processing", "health_check_completed", { type: "system" }, "success", {
|
|
156
|
+
details: {
|
|
157
|
+
status: overallStatus,
|
|
158
|
+
duration_ms: Date.now() - startTime,
|
|
159
|
+
components_checked: componentResults.length,
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
return metrics;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Check data directory health
|
|
166
|
+
*/
|
|
167
|
+
async checkDataDirectory() {
|
|
168
|
+
const startTime = Date.now();
|
|
169
|
+
const config = getConfig();
|
|
170
|
+
try {
|
|
171
|
+
if (!fs.existsSync(config.dataDir)) {
|
|
172
|
+
return {
|
|
173
|
+
name: "data_directory",
|
|
174
|
+
status: "down",
|
|
175
|
+
last_check: new Date().toISOString(),
|
|
176
|
+
error: "Data directory does not exist",
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// Check if writable
|
|
180
|
+
const testFile = path.join(config.dataDir, ".health_check");
|
|
181
|
+
fs.writeFileSync(testFile, "test");
|
|
182
|
+
fs.unlinkSync(testFile);
|
|
183
|
+
return {
|
|
184
|
+
name: "data_directory",
|
|
185
|
+
status: "up",
|
|
186
|
+
last_check: new Date().toISOString(),
|
|
187
|
+
response_time_ms: Date.now() - startTime,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
return {
|
|
192
|
+
name: "data_directory",
|
|
193
|
+
status: "down",
|
|
194
|
+
last_check: new Date().toISOString(),
|
|
195
|
+
error: error instanceof Error ? error.message : String(error),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check config directory health
|
|
201
|
+
*/
|
|
202
|
+
async checkConfigDirectory() {
|
|
203
|
+
const startTime = Date.now();
|
|
204
|
+
const config = getConfig();
|
|
205
|
+
try {
|
|
206
|
+
if (!fs.existsSync(config.configDir)) {
|
|
207
|
+
return {
|
|
208
|
+
name: "config_directory",
|
|
209
|
+
status: "down",
|
|
210
|
+
last_check: new Date().toISOString(),
|
|
211
|
+
error: "Config directory does not exist",
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// Check if readable
|
|
215
|
+
fs.readdirSync(config.configDir);
|
|
216
|
+
return {
|
|
217
|
+
name: "config_directory",
|
|
218
|
+
status: "up",
|
|
219
|
+
last_check: new Date().toISOString(),
|
|
220
|
+
response_time_ms: Date.now() - startTime,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
return {
|
|
225
|
+
name: "config_directory",
|
|
226
|
+
status: "down",
|
|
227
|
+
last_check: new Date().toISOString(),
|
|
228
|
+
error: error instanceof Error ? error.message : String(error),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Check audit logging health
|
|
234
|
+
*/
|
|
235
|
+
async checkAuditLogging() {
|
|
236
|
+
const startTime = Date.now();
|
|
237
|
+
const config = getConfig();
|
|
238
|
+
try {
|
|
239
|
+
const auditDir = path.join(config.dataDir, "audit");
|
|
240
|
+
if (!fs.existsSync(auditDir)) {
|
|
241
|
+
// Not an error if audit is disabled
|
|
242
|
+
if (process.env.NLMCP_AUDIT_ENABLED === "false") {
|
|
243
|
+
return {
|
|
244
|
+
name: "audit_logging",
|
|
245
|
+
status: "up",
|
|
246
|
+
last_check: new Date().toISOString(),
|
|
247
|
+
response_time_ms: Date.now() - startTime,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
name: "audit_logging",
|
|
252
|
+
status: "degraded",
|
|
253
|
+
last_check: new Date().toISOString(),
|
|
254
|
+
error: "Audit directory not yet created",
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
// Check for recent log files
|
|
258
|
+
const files = fs.readdirSync(auditDir).filter(f => f.endsWith(".jsonl"));
|
|
259
|
+
if (files.length === 0) {
|
|
260
|
+
return {
|
|
261
|
+
name: "audit_logging",
|
|
262
|
+
status: "degraded",
|
|
263
|
+
last_check: new Date().toISOString(),
|
|
264
|
+
error: "No audit log files found",
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
name: "audit_logging",
|
|
269
|
+
status: "up",
|
|
270
|
+
last_check: new Date().toISOString(),
|
|
271
|
+
response_time_ms: Date.now() - startTime,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
return {
|
|
276
|
+
name: "audit_logging",
|
|
277
|
+
status: "down",
|
|
278
|
+
last_check: new Date().toISOString(),
|
|
279
|
+
error: error instanceof Error ? error.message : String(error),
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Check compliance logging health
|
|
285
|
+
*/
|
|
286
|
+
async checkComplianceLogging() {
|
|
287
|
+
const startTime = Date.now();
|
|
288
|
+
try {
|
|
289
|
+
const logger = getComplianceLogger();
|
|
290
|
+
const stats = await logger.getStats();
|
|
291
|
+
if (!stats.enabled) {
|
|
292
|
+
return {
|
|
293
|
+
name: "compliance_logging",
|
|
294
|
+
status: "up",
|
|
295
|
+
last_check: new Date().toISOString(),
|
|
296
|
+
response_time_ms: Date.now() - startTime,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
// Verify integrity
|
|
300
|
+
const integrity = await logger.verifyIntegrity();
|
|
301
|
+
if (!integrity.valid) {
|
|
302
|
+
return {
|
|
303
|
+
name: "compliance_logging",
|
|
304
|
+
status: "degraded",
|
|
305
|
+
last_check: new Date().toISOString(),
|
|
306
|
+
error: "Integrity verification failed",
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
name: "compliance_logging",
|
|
311
|
+
status: "up",
|
|
312
|
+
last_check: new Date().toISOString(),
|
|
313
|
+
response_time_ms: Date.now() - startTime,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
return {
|
|
318
|
+
name: "compliance_logging",
|
|
319
|
+
status: "down",
|
|
320
|
+
last_check: new Date().toISOString(),
|
|
321
|
+
error: error instanceof Error ? error.message : String(error),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Check encryption health
|
|
327
|
+
*/
|
|
328
|
+
async checkEncryption() {
|
|
329
|
+
const startTime = Date.now();
|
|
330
|
+
const config = getConfig();
|
|
331
|
+
try {
|
|
332
|
+
// Check if encryption is enabled
|
|
333
|
+
if (process.env.NLMCP_ENCRYPTION_ENABLED === "false") {
|
|
334
|
+
return {
|
|
335
|
+
name: "encryption",
|
|
336
|
+
status: "degraded",
|
|
337
|
+
last_check: new Date().toISOString(),
|
|
338
|
+
error: "Encryption is disabled",
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
// Check for PQ keys
|
|
342
|
+
const keysPath = path.join(config.dataDir, "pq-keys.enc");
|
|
343
|
+
if (!fs.existsSync(keysPath)) {
|
|
344
|
+
return {
|
|
345
|
+
name: "encryption",
|
|
346
|
+
status: "degraded",
|
|
347
|
+
last_check: new Date().toISOString(),
|
|
348
|
+
error: "Post-quantum keys not yet generated",
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
return {
|
|
352
|
+
name: "encryption",
|
|
353
|
+
status: "up",
|
|
354
|
+
last_check: new Date().toISOString(),
|
|
355
|
+
response_time_ms: Date.now() - startTime,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
return {
|
|
360
|
+
name: "encryption",
|
|
361
|
+
status: "down",
|
|
362
|
+
last_check: new Date().toISOString(),
|
|
363
|
+
error: error instanceof Error ? error.message : String(error),
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Get resource metrics
|
|
369
|
+
*/
|
|
370
|
+
getResourceMetrics() {
|
|
371
|
+
const memUsage = process.memoryUsage();
|
|
372
|
+
const totalMem = os.totalmem();
|
|
373
|
+
const freeMem = os.freemem();
|
|
374
|
+
return {
|
|
375
|
+
memory_used_mb: Math.round(memUsage.heapUsed / 1024 / 1024),
|
|
376
|
+
memory_limit_mb: Math.round(memUsage.heapTotal / 1024 / 1024),
|
|
377
|
+
disk_used_mb: Math.round((totalMem - freeMem) / 1024 / 1024),
|
|
378
|
+
disk_available_mb: Math.round(freeMem / 1024 / 1024),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Get security status
|
|
383
|
+
*/
|
|
384
|
+
async getSecurityStatus() {
|
|
385
|
+
let openIncidents = 0;
|
|
386
|
+
try {
|
|
387
|
+
const incidentManager = getIncidentManager();
|
|
388
|
+
const incidents = await incidentManager.getOpenIncidents();
|
|
389
|
+
openIncidents = incidents.length;
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
// Ignore errors
|
|
393
|
+
}
|
|
394
|
+
return {
|
|
395
|
+
encryption_enabled: process.env.NLMCP_ENCRYPTION_ENABLED !== "false",
|
|
396
|
+
auth_enabled: process.env.NLMCP_AUTH_ENABLED === "true",
|
|
397
|
+
cert_pinning_enabled: process.env.NLMCP_CERT_PINNING !== "false",
|
|
398
|
+
open_incidents: openIncidents,
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get compliance status
|
|
403
|
+
*/
|
|
404
|
+
async getComplianceStatus() {
|
|
405
|
+
let consentValid = true;
|
|
406
|
+
let activePolicies = 0;
|
|
407
|
+
let pendingErasures = 0;
|
|
408
|
+
try {
|
|
409
|
+
const consentManager = getConsentManager();
|
|
410
|
+
const validation = await consentManager.validateConsents();
|
|
411
|
+
consentValid = validation.valid;
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
// Ignore errors
|
|
415
|
+
}
|
|
416
|
+
try {
|
|
417
|
+
const retentionEngine = getRetentionEngine();
|
|
418
|
+
const policies = await retentionEngine.getPolicies();
|
|
419
|
+
activePolicies = policies.length;
|
|
420
|
+
}
|
|
421
|
+
catch {
|
|
422
|
+
// Ignore errors
|
|
423
|
+
}
|
|
424
|
+
return {
|
|
425
|
+
consent_valid: consentValid,
|
|
426
|
+
retention_policies_active: activePolicies,
|
|
427
|
+
pending_erasure_requests: pendingErasures,
|
|
428
|
+
last_compliance_check: new Date().toISOString(),
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Get last health metrics
|
|
433
|
+
*/
|
|
434
|
+
getLastMetrics() {
|
|
435
|
+
return this.lastMetrics;
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Get current status (quick check without full health run)
|
|
439
|
+
*/
|
|
440
|
+
getStatus() {
|
|
441
|
+
if (!this.lastMetrics) {
|
|
442
|
+
return {
|
|
443
|
+
status: "unknown",
|
|
444
|
+
uptime_seconds: Math.floor((Date.now() - this.startTime) / 1000),
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
return {
|
|
448
|
+
status: this.lastMetrics.status,
|
|
449
|
+
uptime_seconds: Math.floor((Date.now() - this.startTime) / 1000),
|
|
450
|
+
last_check: this.lastMetrics.timestamp,
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Register a custom health check
|
|
455
|
+
*/
|
|
456
|
+
registerCheck(name, check) {
|
|
457
|
+
this.checks.push({ name, check });
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Get uptime in human-readable format
|
|
461
|
+
*/
|
|
462
|
+
getUptimeFormatted() {
|
|
463
|
+
const seconds = Math.floor((Date.now() - this.startTime) / 1000);
|
|
464
|
+
const days = Math.floor(seconds / 86400);
|
|
465
|
+
const hours = Math.floor((seconds % 86400) / 3600);
|
|
466
|
+
const minutes = Math.floor((seconds % 3600) / 60);
|
|
467
|
+
const secs = seconds % 60;
|
|
468
|
+
const parts = [];
|
|
469
|
+
if (days > 0)
|
|
470
|
+
parts.push(`${days}d`);
|
|
471
|
+
if (hours > 0)
|
|
472
|
+
parts.push(`${hours}h`);
|
|
473
|
+
if (minutes > 0)
|
|
474
|
+
parts.push(`${minutes}m`);
|
|
475
|
+
parts.push(`${secs}s`);
|
|
476
|
+
return parts.join(" ");
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
// ============================================
|
|
480
|
+
// SINGLETON ACCESS
|
|
481
|
+
// ============================================
|
|
482
|
+
/**
|
|
483
|
+
* Get the health monitor instance
|
|
484
|
+
*/
|
|
485
|
+
export function getHealthMonitor() {
|
|
486
|
+
return HealthMonitor.getInstance();
|
|
487
|
+
}
|
|
488
|
+
// ============================================
|
|
489
|
+
// CONVENIENCE EXPORTS
|
|
490
|
+
// ============================================
|
|
491
|
+
/**
|
|
492
|
+
* Run a health check
|
|
493
|
+
*/
|
|
494
|
+
export async function runHealthCheck() {
|
|
495
|
+
return getHealthMonitor().runHealthCheck();
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Get current health status
|
|
499
|
+
*/
|
|
500
|
+
export function getHealthStatus() {
|
|
501
|
+
return getHealthMonitor().getStatus();
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Get last health metrics
|
|
505
|
+
*/
|
|
506
|
+
export function getLastHealthMetrics() {
|
|
507
|
+
return getHealthMonitor().getLastMetrics();
|
|
508
|
+
}
|
|
509
|
+
//# sourceMappingURL=health-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-monitor.js","sourceRoot":"","sources":["../../src/compliance/health-monitor.ts"],"names":[],"mappings":"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"}
|