@skillsmith/core 0.2.0 → 2.0.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 +233 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
- package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/incremental.test.js +515 -0
- package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.js +1059 -0
- package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.js +369 -0
- package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.js +402 -0
- package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
- package/dist/src/analysis/adapters/base.d.ts +83 -0
- package/dist/src/analysis/adapters/base.d.ts.map +1 -0
- package/dist/src/analysis/adapters/base.js +40 -0
- package/dist/src/analysis/adapters/base.js.map +1 -0
- package/dist/src/analysis/adapters/factory.d.ts +150 -0
- package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
- package/dist/src/analysis/adapters/factory.js +244 -0
- package/dist/src/analysis/adapters/factory.js.map +1 -0
- package/dist/src/analysis/adapters/go.d.ts +131 -0
- package/dist/src/analysis/adapters/go.d.ts.map +1 -0
- package/dist/src/analysis/adapters/go.js +414 -0
- package/dist/src/analysis/adapters/go.js.map +1 -0
- package/dist/src/analysis/adapters/index.d.ts +20 -0
- package/dist/src/analysis/adapters/index.d.ts.map +1 -0
- package/dist/src/analysis/adapters/index.js +23 -0
- package/dist/src/analysis/adapters/index.js.map +1 -0
- package/dist/src/analysis/adapters/java.d.ts +154 -0
- package/dist/src/analysis/adapters/java.d.ts.map +1 -0
- package/dist/src/analysis/adapters/java.js +407 -0
- package/dist/src/analysis/adapters/java.js.map +1 -0
- package/dist/src/analysis/adapters/python.d.ts +165 -0
- package/dist/src/analysis/adapters/python.d.ts.map +1 -0
- package/dist/src/analysis/adapters/python.js +475 -0
- package/dist/src/analysis/adapters/python.js.map +1 -0
- package/dist/src/analysis/adapters/rust.d.ts +116 -0
- package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
- package/dist/src/analysis/adapters/rust.js +476 -0
- package/dist/src/analysis/adapters/rust.js.map +1 -0
- package/dist/src/analysis/adapters/typescript.d.ts +68 -0
- package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
- package/dist/src/analysis/adapters/typescript.js +79 -0
- package/dist/src/analysis/adapters/typescript.js.map +1 -0
- package/dist/src/analysis/aggregator.d.ts +193 -0
- package/dist/src/analysis/aggregator.d.ts.map +1 -0
- package/dist/src/analysis/aggregator.js +283 -0
- package/dist/src/analysis/aggregator.js.map +1 -0
- package/dist/src/analysis/cache.d.ts +180 -0
- package/dist/src/analysis/cache.d.ts.map +1 -0
- package/dist/src/analysis/cache.js +279 -0
- package/dist/src/analysis/cache.js.map +1 -0
- package/dist/src/analysis/file-streamer.d.ts +136 -0
- package/dist/src/analysis/file-streamer.d.ts.map +1 -0
- package/dist/src/analysis/file-streamer.js +291 -0
- package/dist/src/analysis/file-streamer.js.map +1 -0
- package/dist/src/analysis/incremental-parser.d.ts +186 -0
- package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
- package/dist/src/analysis/incremental-parser.js +291 -0
- package/dist/src/analysis/incremental-parser.js.map +1 -0
- package/dist/src/analysis/incremental.d.ts +186 -0
- package/dist/src/analysis/incremental.d.ts.map +1 -0
- package/dist/src/analysis/incremental.js +247 -0
- package/dist/src/analysis/incremental.js.map +1 -0
- package/dist/src/analysis/index.d.ts +25 -3
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +45 -3
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +92 -0
- package/dist/src/analysis/language-detector.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.js +602 -0
- package/dist/src/analysis/language-detector.js.map +1 -0
- package/dist/src/analysis/memory-monitor.d.ts +199 -0
- package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
- package/dist/src/analysis/memory-monitor.js +271 -0
- package/dist/src/analysis/memory-monitor.js.map +1 -0
- package/dist/src/analysis/metrics.d.ts +300 -0
- package/dist/src/analysis/metrics.d.ts.map +1 -0
- package/dist/src/analysis/metrics.js +537 -0
- package/dist/src/analysis/metrics.js.map +1 -0
- package/dist/src/analysis/router.d.ts +264 -0
- package/dist/src/analysis/router.d.ts.map +1 -0
- package/dist/src/analysis/router.js +398 -0
- package/dist/src/analysis/router.js.map +1 -0
- package/dist/src/analysis/tree-cache.d.ts +208 -0
- package/dist/src/analysis/tree-cache.d.ts.map +1 -0
- package/dist/src/analysis/tree-cache.js +288 -0
- package/dist/src/analysis/tree-cache.js.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.js +239 -0
- package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
- package/dist/src/analysis/types.d.ts +69 -6
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +23 -2
- package/dist/src/analysis/types.js.map +1 -1
- package/dist/src/analysis/worker-pool.d.ts +141 -0
- package/dist/src/analysis/worker-pool.d.ts.map +1 -0
- package/dist/src/analysis/worker-pool.js +418 -0
- package/dist/src/analysis/worker-pool.js.map +1 -0
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +72 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/cache.d.ts +24 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js +50 -2
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +132 -2
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +214 -18
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +7 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/types.d.ts +251 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +9 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +1 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +1 -0
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.js +1 -1
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/index.js.map +1 -1
- package/dist/src/scripts/import-github-skills.js +1 -1
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/scripts/validation/index.js +1 -2
- package/dist/src/scripts/validation/index.js.map +1 -1
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
- package/dist/src/scripts/validation/pipeline.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +1 -0
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +1 -1
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +27 -5
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +20 -5
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/types/skill.d.ts +3 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +2 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tests/adapters-factory.test.d.ts +13 -0
- package/dist/tests/adapters-factory.test.d.ts.map +1 -0
- package/dist/tests/adapters-factory.test.js +308 -0
- package/dist/tests/adapters-factory.test.js.map +1 -0
- package/dist/tests/adapters-java.test.d.ts +13 -0
- package/dist/tests/adapters-java.test.d.ts.map +1 -0
- package/dist/tests/adapters-java.test.js +925 -0
- package/dist/tests/adapters-java.test.js.map +1 -0
- package/dist/tests/api/client.validation.test.d.ts +7 -0
- package/dist/tests/api/client.validation.test.d.ts.map +1 -0
- package/dist/tests/api/client.validation.test.js +183 -0
- package/dist/tests/api/client.validation.test.js.map +1 -0
- package/dist/tests/language-detector.test.d.ts +13 -0
- package/dist/tests/language-detector.test.d.ts.map +1 -0
- package/dist/tests/language-detector.test.js +674 -0
- package/dist/tests/language-detector.test.js.map +1 -0
- package/dist/tests/telemetry/posthog.test.d.ts +13 -0
- package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
- package/dist/tests/telemetry/posthog.test.js +600 -0
- package/dist/tests/telemetry/posthog.test.js.map +1 -0
- package/package.json +5 -6
- package/dist/src/security/RateLimiter.d.ts +0 -337
- package/dist/src/security/RateLimiter.d.ts.map +0 -1
- package/dist/src/security/RateLimiter.js +0 -782
- package/dist/src/security/RateLimiter.js.map +0 -1
- package/dist/src/security/scanner.d.ts +0 -151
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js +0 -599
- package/dist/src/security/scanner.js.map +0 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1308: Memory Monitor
|
|
3
|
+
*
|
|
4
|
+
* Monitors memory usage and triggers cleanup when thresholds are exceeded.
|
|
5
|
+
* Integrates with ParseCache for memory pressure handling.
|
|
6
|
+
*
|
|
7
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
8
|
+
* @module analysis/memory-monitor
|
|
9
|
+
*/
|
|
10
|
+
import type { ParseCache } from './cache.js';
|
|
11
|
+
/**
|
|
12
|
+
* Memory usage statistics
|
|
13
|
+
*/
|
|
14
|
+
export interface MemoryStats {
|
|
15
|
+
/** Heap used in bytes */
|
|
16
|
+
heapUsed: number;
|
|
17
|
+
/** Total heap size in bytes */
|
|
18
|
+
heapTotal: number;
|
|
19
|
+
/** External memory in bytes */
|
|
20
|
+
external: number;
|
|
21
|
+
/** ArrayBuffers memory in bytes */
|
|
22
|
+
arrayBuffers: number;
|
|
23
|
+
/** Resident set size in bytes */
|
|
24
|
+
rss: number;
|
|
25
|
+
/** Memory threshold in bytes */
|
|
26
|
+
threshold: number;
|
|
27
|
+
/** Whether currently over threshold */
|
|
28
|
+
isOverThreshold: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Result of a cleanup operation
|
|
32
|
+
*/
|
|
33
|
+
export interface CleanupResult {
|
|
34
|
+
/** Whether cleanup was performed */
|
|
35
|
+
cleaned: boolean;
|
|
36
|
+
/** Bytes freed (estimated) */
|
|
37
|
+
freedBytes: number;
|
|
38
|
+
/** Cleanup reason */
|
|
39
|
+
reason?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Options for MemoryMonitor
|
|
43
|
+
*/
|
|
44
|
+
export interface MemoryMonitorOptions {
|
|
45
|
+
/** Memory threshold in MB (default: 500) */
|
|
46
|
+
thresholdMB?: number;
|
|
47
|
+
/** ParseCache instance for cleanup */
|
|
48
|
+
cache?: ParseCache;
|
|
49
|
+
/** Enable verbose logging */
|
|
50
|
+
verbose?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Monitor memory usage and trigger cleanup when needed
|
|
54
|
+
*
|
|
55
|
+
* Provides:
|
|
56
|
+
* - Real-time memory statistics
|
|
57
|
+
* - Automatic cleanup when threshold exceeded
|
|
58
|
+
* - Periodic monitoring with configurable interval
|
|
59
|
+
* - Integration with ParseCache
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const cache = new ParseCache({ maxMemoryMB: 200 })
|
|
64
|
+
* const monitor = new MemoryMonitor({
|
|
65
|
+
* thresholdMB: 500,
|
|
66
|
+
* cache
|
|
67
|
+
* })
|
|
68
|
+
*
|
|
69
|
+
* // Check memory and cleanup if needed
|
|
70
|
+
* const result = monitor.checkAndCleanup()
|
|
71
|
+
* if (result.cleaned) {
|
|
72
|
+
* console.log(`Freed ${MemoryMonitor.formatBytes(result.freedBytes)}`)
|
|
73
|
+
* }
|
|
74
|
+
*
|
|
75
|
+
* // Start periodic monitoring
|
|
76
|
+
* const stop = monitor.startMonitoring(10000) // 10 seconds
|
|
77
|
+
*
|
|
78
|
+
* // Later...
|
|
79
|
+
* stop()
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare class MemoryMonitor {
|
|
83
|
+
private readonly thresholdBytes;
|
|
84
|
+
private readonly cache;
|
|
85
|
+
private readonly verbose;
|
|
86
|
+
private monitorInterval;
|
|
87
|
+
private cleanupCount;
|
|
88
|
+
private totalFreedBytes;
|
|
89
|
+
constructor(options?: MemoryMonitorOptions);
|
|
90
|
+
/**
|
|
91
|
+
* Get current memory statistics
|
|
92
|
+
*
|
|
93
|
+
* @returns Current memory usage statistics
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* const stats = monitor.getStats()
|
|
98
|
+
* console.log(`Heap: ${MemoryMonitor.formatBytes(stats.heapUsed)}`)
|
|
99
|
+
* console.log(`Over threshold: ${stats.isOverThreshold}`)
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
getStats(): MemoryStats;
|
|
103
|
+
/**
|
|
104
|
+
* Check memory and cleanup if needed
|
|
105
|
+
*
|
|
106
|
+
* Triggers cleanup when heap usage exceeds threshold.
|
|
107
|
+
* Clears cache and requests garbage collection.
|
|
108
|
+
*
|
|
109
|
+
* @returns Cleanup result with bytes freed
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* const result = monitor.checkAndCleanup()
|
|
114
|
+
* if (result.cleaned) {
|
|
115
|
+
* console.log(`Cleaned up ${MemoryMonitor.formatBytes(result.freedBytes)}`)
|
|
116
|
+
* }
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
checkAndCleanup(): CleanupResult;
|
|
120
|
+
/**
|
|
121
|
+
* Force cleanup regardless of threshold
|
|
122
|
+
*
|
|
123
|
+
* Useful for explicit memory management before large operations.
|
|
124
|
+
*
|
|
125
|
+
* @returns Cleanup result with bytes freed
|
|
126
|
+
*/
|
|
127
|
+
forceCleanup(): CleanupResult;
|
|
128
|
+
/**
|
|
129
|
+
* Start periodic monitoring
|
|
130
|
+
*
|
|
131
|
+
* Checks memory at the specified interval and performs
|
|
132
|
+
* cleanup when threshold is exceeded.
|
|
133
|
+
*
|
|
134
|
+
* @param intervalMs - Monitoring interval in milliseconds (default: 10000)
|
|
135
|
+
* @returns Stop function to cancel monitoring
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* const stop = monitor.startMonitoring(5000)
|
|
140
|
+
*
|
|
141
|
+
* // Later, when done...
|
|
142
|
+
* stop()
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
startMonitoring(intervalMs?: number): () => void;
|
|
146
|
+
/**
|
|
147
|
+
* Stop periodic monitoring
|
|
148
|
+
*/
|
|
149
|
+
stopMonitoring(): void;
|
|
150
|
+
/**
|
|
151
|
+
* Get cleanup count
|
|
152
|
+
*
|
|
153
|
+
* @returns Number of cleanups performed
|
|
154
|
+
*/
|
|
155
|
+
getCleanupCount(): number;
|
|
156
|
+
/**
|
|
157
|
+
* Get total bytes freed across all cleanups
|
|
158
|
+
*
|
|
159
|
+
* @returns Total bytes freed (estimated)
|
|
160
|
+
*/
|
|
161
|
+
getTotalFreedBytes(): number;
|
|
162
|
+
/**
|
|
163
|
+
* Get monitoring status
|
|
164
|
+
*
|
|
165
|
+
* @returns Whether periodic monitoring is active
|
|
166
|
+
*/
|
|
167
|
+
isMonitoring(): boolean;
|
|
168
|
+
/**
|
|
169
|
+
* Get memory threshold
|
|
170
|
+
*
|
|
171
|
+
* @returns Threshold in bytes
|
|
172
|
+
*/
|
|
173
|
+
getThreshold(): number;
|
|
174
|
+
/**
|
|
175
|
+
* Reset statistics
|
|
176
|
+
*/
|
|
177
|
+
resetStats(): void;
|
|
178
|
+
/**
|
|
179
|
+
* Format bytes for display
|
|
180
|
+
*
|
|
181
|
+
* @param bytes - Number of bytes
|
|
182
|
+
* @returns Human-readable string
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```typescript
|
|
186
|
+
* MemoryMonitor.formatBytes(1024) // "1.00 KB"
|
|
187
|
+
* MemoryMonitor.formatBytes(1048576) // "1.00 MB"
|
|
188
|
+
* MemoryMonitor.formatBytes(1073741824) // "1.00 GB"
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
static formatBytes(bytes: number): string;
|
|
192
|
+
/**
|
|
193
|
+
* Get memory usage summary string
|
|
194
|
+
*
|
|
195
|
+
* @returns Formatted summary of current memory usage
|
|
196
|
+
*/
|
|
197
|
+
getSummary(): string;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=memory-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-monitor.d.ts","sourceRoot":"","sources":["../../../src/analysis/memory-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,uCAAuC;IACvC,eAAe,EAAE,OAAO,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sCAAsC;IACtC,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,eAAe,CAAI;gBAEf,OAAO,GAAE,oBAAyB;IAM9C;;;;;;;;;;;OAWG;IACH,QAAQ,IAAI,WAAW;IAavB;;;;;;;;;;;;;;;OAeG;IACH,eAAe,IAAI,aAAa;IA8ChC;;;;;;OAMG;IACH,YAAY,IAAI,aAAa;IA0B7B;;;;;;;;;;;;;;;;OAgBG;IACH,eAAe,CAAC,UAAU,SAAQ,GAAG,MAAM,IAAI;IAe/C;;OAEG;IACH,cAAc,IAAI,IAAI;IAOtB;;;;OAIG;IACH,eAAe,IAAI,MAAM;IAIzB;;;;OAIG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;;;OAIG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;OAIG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAczC;;;;OAIG;IACH,UAAU,IAAI,MAAM;CAWrB"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1308: Memory Monitor
|
|
3
|
+
*
|
|
4
|
+
* Monitors memory usage and triggers cleanup when thresholds are exceeded.
|
|
5
|
+
* Integrates with ParseCache for memory pressure handling.
|
|
6
|
+
*
|
|
7
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
8
|
+
* @module analysis/memory-monitor
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Monitor memory usage and trigger cleanup when needed
|
|
12
|
+
*
|
|
13
|
+
* Provides:
|
|
14
|
+
* - Real-time memory statistics
|
|
15
|
+
* - Automatic cleanup when threshold exceeded
|
|
16
|
+
* - Periodic monitoring with configurable interval
|
|
17
|
+
* - Integration with ParseCache
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const cache = new ParseCache({ maxMemoryMB: 200 })
|
|
22
|
+
* const monitor = new MemoryMonitor({
|
|
23
|
+
* thresholdMB: 500,
|
|
24
|
+
* cache
|
|
25
|
+
* })
|
|
26
|
+
*
|
|
27
|
+
* // Check memory and cleanup if needed
|
|
28
|
+
* const result = monitor.checkAndCleanup()
|
|
29
|
+
* if (result.cleaned) {
|
|
30
|
+
* console.log(`Freed ${MemoryMonitor.formatBytes(result.freedBytes)}`)
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* // Start periodic monitoring
|
|
34
|
+
* const stop = monitor.startMonitoring(10000) // 10 seconds
|
|
35
|
+
*
|
|
36
|
+
* // Later...
|
|
37
|
+
* stop()
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export class MemoryMonitor {
|
|
41
|
+
thresholdBytes;
|
|
42
|
+
cache;
|
|
43
|
+
verbose;
|
|
44
|
+
monitorInterval = null;
|
|
45
|
+
cleanupCount = 0;
|
|
46
|
+
totalFreedBytes = 0;
|
|
47
|
+
constructor(options = {}) {
|
|
48
|
+
this.thresholdBytes = (options.thresholdMB ?? 500) * 1024 * 1024;
|
|
49
|
+
this.cache = options.cache ?? null;
|
|
50
|
+
this.verbose = options.verbose ?? false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get current memory statistics
|
|
54
|
+
*
|
|
55
|
+
* @returns Current memory usage statistics
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const stats = monitor.getStats()
|
|
60
|
+
* console.log(`Heap: ${MemoryMonitor.formatBytes(stats.heapUsed)}`)
|
|
61
|
+
* console.log(`Over threshold: ${stats.isOverThreshold}`)
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
getStats() {
|
|
65
|
+
const usage = process.memoryUsage();
|
|
66
|
+
return {
|
|
67
|
+
heapUsed: usage.heapUsed,
|
|
68
|
+
heapTotal: usage.heapTotal,
|
|
69
|
+
external: usage.external,
|
|
70
|
+
arrayBuffers: usage.arrayBuffers,
|
|
71
|
+
rss: usage.rss,
|
|
72
|
+
threshold: this.thresholdBytes,
|
|
73
|
+
isOverThreshold: usage.heapUsed > this.thresholdBytes,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check memory and cleanup if needed
|
|
78
|
+
*
|
|
79
|
+
* Triggers cleanup when heap usage exceeds threshold.
|
|
80
|
+
* Clears cache and requests garbage collection.
|
|
81
|
+
*
|
|
82
|
+
* @returns Cleanup result with bytes freed
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const result = monitor.checkAndCleanup()
|
|
87
|
+
* if (result.cleaned) {
|
|
88
|
+
* console.log(`Cleaned up ${MemoryMonitor.formatBytes(result.freedBytes)}`)
|
|
89
|
+
* }
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
checkAndCleanup() {
|
|
93
|
+
const stats = this.getStats();
|
|
94
|
+
if (!stats.isOverThreshold) {
|
|
95
|
+
return { cleaned: false, freedBytes: 0 };
|
|
96
|
+
}
|
|
97
|
+
const beforeHeap = stats.heapUsed;
|
|
98
|
+
if (this.verbose) {
|
|
99
|
+
console.warn(`[MemoryMonitor] Memory pressure: ${MemoryMonitor.formatBytes(stats.heapUsed)} ` +
|
|
100
|
+
`(threshold: ${MemoryMonitor.formatBytes(this.thresholdBytes)})`);
|
|
101
|
+
}
|
|
102
|
+
// Clear cache if available
|
|
103
|
+
if (this.cache) {
|
|
104
|
+
const cacheStats = this.cache.getStats();
|
|
105
|
+
this.cache.clear();
|
|
106
|
+
if (this.verbose) {
|
|
107
|
+
console.warn(`[MemoryMonitor] Cleared cache (${cacheStats.entries} entries)`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Request garbage collection if available
|
|
111
|
+
if (typeof global.gc === 'function') {
|
|
112
|
+
global.gc();
|
|
113
|
+
if (this.verbose) {
|
|
114
|
+
console.warn('[MemoryMonitor] Triggered garbage collection');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
this.cleanupCount++;
|
|
118
|
+
const afterUsage = process.memoryUsage();
|
|
119
|
+
const freedBytes = Math.max(0, beforeHeap - afterUsage.heapUsed);
|
|
120
|
+
this.totalFreedBytes += freedBytes;
|
|
121
|
+
return {
|
|
122
|
+
cleaned: true,
|
|
123
|
+
freedBytes,
|
|
124
|
+
reason: `Heap exceeded threshold (${MemoryMonitor.formatBytes(beforeHeap)})`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Force cleanup regardless of threshold
|
|
129
|
+
*
|
|
130
|
+
* Useful for explicit memory management before large operations.
|
|
131
|
+
*
|
|
132
|
+
* @returns Cleanup result with bytes freed
|
|
133
|
+
*/
|
|
134
|
+
forceCleanup() {
|
|
135
|
+
const beforeHeap = process.memoryUsage().heapUsed;
|
|
136
|
+
// Clear cache if available
|
|
137
|
+
if (this.cache) {
|
|
138
|
+
this.cache.clear();
|
|
139
|
+
}
|
|
140
|
+
// Request garbage collection if available
|
|
141
|
+
if (typeof global.gc === 'function') {
|
|
142
|
+
global.gc();
|
|
143
|
+
}
|
|
144
|
+
this.cleanupCount++;
|
|
145
|
+
const afterUsage = process.memoryUsage();
|
|
146
|
+
const freedBytes = Math.max(0, beforeHeap - afterUsage.heapUsed);
|
|
147
|
+
this.totalFreedBytes += freedBytes;
|
|
148
|
+
return {
|
|
149
|
+
cleaned: true,
|
|
150
|
+
freedBytes,
|
|
151
|
+
reason: 'Forced cleanup',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Start periodic monitoring
|
|
156
|
+
*
|
|
157
|
+
* Checks memory at the specified interval and performs
|
|
158
|
+
* cleanup when threshold is exceeded.
|
|
159
|
+
*
|
|
160
|
+
* @param intervalMs - Monitoring interval in milliseconds (default: 10000)
|
|
161
|
+
* @returns Stop function to cancel monitoring
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```typescript
|
|
165
|
+
* const stop = monitor.startMonitoring(5000)
|
|
166
|
+
*
|
|
167
|
+
* // Later, when done...
|
|
168
|
+
* stop()
|
|
169
|
+
* ```
|
|
170
|
+
*/
|
|
171
|
+
startMonitoring(intervalMs = 10000) {
|
|
172
|
+
if (this.monitorInterval) {
|
|
173
|
+
return () => this.stopMonitoring();
|
|
174
|
+
}
|
|
175
|
+
this.monitorInterval = setInterval(() => {
|
|
176
|
+
this.checkAndCleanup();
|
|
177
|
+
}, intervalMs);
|
|
178
|
+
// Prevent interval from keeping process alive
|
|
179
|
+
this.monitorInterval.unref();
|
|
180
|
+
return () => this.stopMonitoring();
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Stop periodic monitoring
|
|
184
|
+
*/
|
|
185
|
+
stopMonitoring() {
|
|
186
|
+
if (this.monitorInterval) {
|
|
187
|
+
clearInterval(this.monitorInterval);
|
|
188
|
+
this.monitorInterval = null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Get cleanup count
|
|
193
|
+
*
|
|
194
|
+
* @returns Number of cleanups performed
|
|
195
|
+
*/
|
|
196
|
+
getCleanupCount() {
|
|
197
|
+
return this.cleanupCount;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get total bytes freed across all cleanups
|
|
201
|
+
*
|
|
202
|
+
* @returns Total bytes freed (estimated)
|
|
203
|
+
*/
|
|
204
|
+
getTotalFreedBytes() {
|
|
205
|
+
return this.totalFreedBytes;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get monitoring status
|
|
209
|
+
*
|
|
210
|
+
* @returns Whether periodic monitoring is active
|
|
211
|
+
*/
|
|
212
|
+
isMonitoring() {
|
|
213
|
+
return this.monitorInterval !== null;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get memory threshold
|
|
217
|
+
*
|
|
218
|
+
* @returns Threshold in bytes
|
|
219
|
+
*/
|
|
220
|
+
getThreshold() {
|
|
221
|
+
return this.thresholdBytes;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Reset statistics
|
|
225
|
+
*/
|
|
226
|
+
resetStats() {
|
|
227
|
+
this.cleanupCount = 0;
|
|
228
|
+
this.totalFreedBytes = 0;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Format bytes for display
|
|
232
|
+
*
|
|
233
|
+
* @param bytes - Number of bytes
|
|
234
|
+
* @returns Human-readable string
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* ```typescript
|
|
238
|
+
* MemoryMonitor.formatBytes(1024) // "1.00 KB"
|
|
239
|
+
* MemoryMonitor.formatBytes(1048576) // "1.00 MB"
|
|
240
|
+
* MemoryMonitor.formatBytes(1073741824) // "1.00 GB"
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
static formatBytes(bytes) {
|
|
244
|
+
const units = ['B', 'KB', 'MB', 'GB'];
|
|
245
|
+
let size = Math.abs(bytes);
|
|
246
|
+
let unitIndex = 0;
|
|
247
|
+
while (size >= 1024 && unitIndex < units.length - 1) {
|
|
248
|
+
size /= 1024;
|
|
249
|
+
unitIndex++;
|
|
250
|
+
}
|
|
251
|
+
const prefix = bytes < 0 ? '-' : '';
|
|
252
|
+
return `${prefix}${size.toFixed(2)} ${units[unitIndex]}`;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get memory usage summary string
|
|
256
|
+
*
|
|
257
|
+
* @returns Formatted summary of current memory usage
|
|
258
|
+
*/
|
|
259
|
+
getSummary() {
|
|
260
|
+
const stats = this.getStats();
|
|
261
|
+
return [
|
|
262
|
+
`Heap: ${MemoryMonitor.formatBytes(stats.heapUsed)} / ${MemoryMonitor.formatBytes(stats.heapTotal)}`,
|
|
263
|
+
`RSS: ${MemoryMonitor.formatBytes(stats.rss)}`,
|
|
264
|
+
`Threshold: ${MemoryMonitor.formatBytes(stats.threshold)}`,
|
|
265
|
+
`Status: ${stats.isOverThreshold ? 'OVER THRESHOLD' : 'OK'}`,
|
|
266
|
+
`Cleanups: ${this.cleanupCount}`,
|
|
267
|
+
`Total freed: ${MemoryMonitor.formatBytes(this.totalFreedBytes)}`,
|
|
268
|
+
].join(', ');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=memory-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-monitor.js","sourceRoot":"","sources":["../../../src/analysis/memory-monitor.ts"],"names":[],"mappings":"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"}
|