@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.
Files changed (233) hide show
  1. package/README.md +233 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
  4. package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
  5. package/dist/src/analysis/__tests__/incremental.test.js +515 -0
  6. package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
  7. package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
  8. package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
  9. package/dist/src/analysis/__tests__/integration.test.js +1059 -0
  10. package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
  11. package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
  12. package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
  13. package/dist/src/analysis/__tests__/metrics.test.js +369 -0
  14. package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
  15. package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
  16. package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
  17. package/dist/src/analysis/__tests__/performance.test.js +402 -0
  18. package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
  19. package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
  20. package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
  21. package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
  22. package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
  23. package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
  24. package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
  25. package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
  26. package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
  27. package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
  28. package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
  29. package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
  30. package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
  31. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
  32. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
  33. package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
  34. package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
  35. package/dist/src/analysis/adapters/base.d.ts +83 -0
  36. package/dist/src/analysis/adapters/base.d.ts.map +1 -0
  37. package/dist/src/analysis/adapters/base.js +40 -0
  38. package/dist/src/analysis/adapters/base.js.map +1 -0
  39. package/dist/src/analysis/adapters/factory.d.ts +150 -0
  40. package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
  41. package/dist/src/analysis/adapters/factory.js +244 -0
  42. package/dist/src/analysis/adapters/factory.js.map +1 -0
  43. package/dist/src/analysis/adapters/go.d.ts +131 -0
  44. package/dist/src/analysis/adapters/go.d.ts.map +1 -0
  45. package/dist/src/analysis/adapters/go.js +414 -0
  46. package/dist/src/analysis/adapters/go.js.map +1 -0
  47. package/dist/src/analysis/adapters/index.d.ts +20 -0
  48. package/dist/src/analysis/adapters/index.d.ts.map +1 -0
  49. package/dist/src/analysis/adapters/index.js +23 -0
  50. package/dist/src/analysis/adapters/index.js.map +1 -0
  51. package/dist/src/analysis/adapters/java.d.ts +154 -0
  52. package/dist/src/analysis/adapters/java.d.ts.map +1 -0
  53. package/dist/src/analysis/adapters/java.js +407 -0
  54. package/dist/src/analysis/adapters/java.js.map +1 -0
  55. package/dist/src/analysis/adapters/python.d.ts +165 -0
  56. package/dist/src/analysis/adapters/python.d.ts.map +1 -0
  57. package/dist/src/analysis/adapters/python.js +475 -0
  58. package/dist/src/analysis/adapters/python.js.map +1 -0
  59. package/dist/src/analysis/adapters/rust.d.ts +116 -0
  60. package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
  61. package/dist/src/analysis/adapters/rust.js +476 -0
  62. package/dist/src/analysis/adapters/rust.js.map +1 -0
  63. package/dist/src/analysis/adapters/typescript.d.ts +68 -0
  64. package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
  65. package/dist/src/analysis/adapters/typescript.js +79 -0
  66. package/dist/src/analysis/adapters/typescript.js.map +1 -0
  67. package/dist/src/analysis/aggregator.d.ts +193 -0
  68. package/dist/src/analysis/aggregator.d.ts.map +1 -0
  69. package/dist/src/analysis/aggregator.js +283 -0
  70. package/dist/src/analysis/aggregator.js.map +1 -0
  71. package/dist/src/analysis/cache.d.ts +180 -0
  72. package/dist/src/analysis/cache.d.ts.map +1 -0
  73. package/dist/src/analysis/cache.js +279 -0
  74. package/dist/src/analysis/cache.js.map +1 -0
  75. package/dist/src/analysis/file-streamer.d.ts +136 -0
  76. package/dist/src/analysis/file-streamer.d.ts.map +1 -0
  77. package/dist/src/analysis/file-streamer.js +291 -0
  78. package/dist/src/analysis/file-streamer.js.map +1 -0
  79. package/dist/src/analysis/incremental-parser.d.ts +186 -0
  80. package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
  81. package/dist/src/analysis/incremental-parser.js +291 -0
  82. package/dist/src/analysis/incremental-parser.js.map +1 -0
  83. package/dist/src/analysis/incremental.d.ts +186 -0
  84. package/dist/src/analysis/incremental.d.ts.map +1 -0
  85. package/dist/src/analysis/incremental.js +247 -0
  86. package/dist/src/analysis/incremental.js.map +1 -0
  87. package/dist/src/analysis/index.d.ts +25 -3
  88. package/dist/src/analysis/index.d.ts.map +1 -1
  89. package/dist/src/analysis/index.js +45 -3
  90. package/dist/src/analysis/index.js.map +1 -1
  91. package/dist/src/analysis/language-detector.d.ts +92 -0
  92. package/dist/src/analysis/language-detector.d.ts.map +1 -0
  93. package/dist/src/analysis/language-detector.js +602 -0
  94. package/dist/src/analysis/language-detector.js.map +1 -0
  95. package/dist/src/analysis/memory-monitor.d.ts +199 -0
  96. package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
  97. package/dist/src/analysis/memory-monitor.js +271 -0
  98. package/dist/src/analysis/memory-monitor.js.map +1 -0
  99. package/dist/src/analysis/metrics.d.ts +300 -0
  100. package/dist/src/analysis/metrics.d.ts.map +1 -0
  101. package/dist/src/analysis/metrics.js +537 -0
  102. package/dist/src/analysis/metrics.js.map +1 -0
  103. package/dist/src/analysis/router.d.ts +264 -0
  104. package/dist/src/analysis/router.d.ts.map +1 -0
  105. package/dist/src/analysis/router.js +398 -0
  106. package/dist/src/analysis/router.js.map +1 -0
  107. package/dist/src/analysis/tree-cache.d.ts +208 -0
  108. package/dist/src/analysis/tree-cache.d.ts.map +1 -0
  109. package/dist/src/analysis/tree-cache.js +288 -0
  110. package/dist/src/analysis/tree-cache.js.map +1 -0
  111. package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
  112. package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
  113. package/dist/src/analysis/tree-sitter/manager.js +239 -0
  114. package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
  115. package/dist/src/analysis/types.d.ts +69 -6
  116. package/dist/src/analysis/types.d.ts.map +1 -1
  117. package/dist/src/analysis/types.js +23 -2
  118. package/dist/src/analysis/types.js.map +1 -1
  119. package/dist/src/analysis/worker-pool.d.ts +141 -0
  120. package/dist/src/analysis/worker-pool.d.ts.map +1 -0
  121. package/dist/src/analysis/worker-pool.js +418 -0
  122. package/dist/src/analysis/worker-pool.js.map +1 -0
  123. package/dist/src/analytics/schema.d.ts +1 -1
  124. package/dist/src/analytics/schema.d.ts.map +1 -1
  125. package/dist/src/analytics/schema.js +72 -0
  126. package/dist/src/analytics/schema.js.map +1 -1
  127. package/dist/src/api/cache.d.ts +24 -1
  128. package/dist/src/api/cache.d.ts.map +1 -1
  129. package/dist/src/api/cache.js +50 -2
  130. package/dist/src/api/cache.js.map +1 -1
  131. package/dist/src/api/client.d.ts +132 -2
  132. package/dist/src/api/client.d.ts.map +1 -1
  133. package/dist/src/api/client.js +214 -18
  134. package/dist/src/api/client.js.map +1 -1
  135. package/dist/src/api/index.d.ts +2 -0
  136. package/dist/src/api/index.d.ts.map +1 -1
  137. package/dist/src/api/index.js +7 -0
  138. package/dist/src/api/index.js.map +1 -1
  139. package/dist/src/api/types.d.ts +251 -0
  140. package/dist/src/api/types.d.ts.map +1 -0
  141. package/dist/src/api/types.js +9 -0
  142. package/dist/src/api/types.js.map +1 -0
  143. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
  144. package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
  145. package/dist/src/embeddings/index.d.ts.map +1 -1
  146. package/dist/src/embeddings/index.js.map +1 -1
  147. package/dist/src/errors.d.ts +1 -0
  148. package/dist/src/errors.d.ts.map +1 -1
  149. package/dist/src/errors.js +1 -0
  150. package/dist/src/errors.js.map +1 -1
  151. package/dist/src/index.d.ts +3 -3
  152. package/dist/src/index.d.ts.map +1 -1
  153. package/dist/src/index.js +4 -4
  154. package/dist/src/index.js.map +1 -1
  155. package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
  156. package/dist/src/repositories/IndexerRepository.js +1 -0
  157. package/dist/src/repositories/IndexerRepository.js.map +1 -1
  158. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  159. package/dist/src/repositories/SkillRepository.js +1 -0
  160. package/dist/src/repositories/SkillRepository.js.map +1 -1
  161. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
  162. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
  163. package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
  164. package/dist/src/repositories/quarantine/query-builder.js +1 -1
  165. package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
  166. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
  167. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  168. package/dist/src/scripts/github-import/index.js.map +1 -1
  169. package/dist/src/scripts/import-github-skills.js +1 -1
  170. package/dist/src/scripts/import-github-skills.js.map +1 -1
  171. package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
  172. package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
  173. package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
  174. package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
  175. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
  176. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
  177. package/dist/src/scripts/validation/index.js +1 -2
  178. package/dist/src/scripts/validation/index.js.map +1 -1
  179. package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
  180. package/dist/src/scripts/validation/pipeline.js.map +1 -1
  181. package/dist/src/scripts/validation/types.d.ts +2 -2
  182. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  183. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  184. package/dist/src/services/SearchService.d.ts.map +1 -1
  185. package/dist/src/services/SearchService.js +1 -0
  186. package/dist/src/services/SearchService.js.map +1 -1
  187. package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
  188. package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
  189. package/dist/src/session/SessionHealthMonitor.js +1 -1
  190. package/dist/src/session/SessionHealthMonitor.js.map +1 -1
  191. package/dist/src/telemetry/index.d.ts +1 -1
  192. package/dist/src/telemetry/index.d.ts.map +1 -1
  193. package/dist/src/telemetry/index.js +2 -2
  194. package/dist/src/telemetry/index.js.map +1 -1
  195. package/dist/src/telemetry/posthog.d.ts +27 -5
  196. package/dist/src/telemetry/posthog.d.ts.map +1 -1
  197. package/dist/src/telemetry/posthog.js +20 -5
  198. package/dist/src/telemetry/posthog.js.map +1 -1
  199. package/dist/src/types/skill.d.ts +3 -0
  200. package/dist/src/types/skill.d.ts.map +1 -1
  201. package/dist/src/types.d.ts +2 -1
  202. package/dist/src/types.d.ts.map +1 -1
  203. package/dist/src/types.js +2 -2
  204. package/dist/src/types.js.map +1 -1
  205. package/dist/tests/adapters-factory.test.d.ts +13 -0
  206. package/dist/tests/adapters-factory.test.d.ts.map +1 -0
  207. package/dist/tests/adapters-factory.test.js +308 -0
  208. package/dist/tests/adapters-factory.test.js.map +1 -0
  209. package/dist/tests/adapters-java.test.d.ts +13 -0
  210. package/dist/tests/adapters-java.test.d.ts.map +1 -0
  211. package/dist/tests/adapters-java.test.js +925 -0
  212. package/dist/tests/adapters-java.test.js.map +1 -0
  213. package/dist/tests/api/client.validation.test.d.ts +7 -0
  214. package/dist/tests/api/client.validation.test.d.ts.map +1 -0
  215. package/dist/tests/api/client.validation.test.js +183 -0
  216. package/dist/tests/api/client.validation.test.js.map +1 -0
  217. package/dist/tests/language-detector.test.d.ts +13 -0
  218. package/dist/tests/language-detector.test.d.ts.map +1 -0
  219. package/dist/tests/language-detector.test.js +674 -0
  220. package/dist/tests/language-detector.test.js.map +1 -0
  221. package/dist/tests/telemetry/posthog.test.d.ts +13 -0
  222. package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
  223. package/dist/tests/telemetry/posthog.test.js +600 -0
  224. package/dist/tests/telemetry/posthog.test.js.map +1 -0
  225. package/package.json +5 -6
  226. package/dist/src/security/RateLimiter.d.ts +0 -337
  227. package/dist/src/security/RateLimiter.d.ts.map +0 -1
  228. package/dist/src/security/RateLimiter.js +0 -782
  229. package/dist/src/security/RateLimiter.js.map +0 -1
  230. package/dist/src/security/scanner.d.ts +0 -151
  231. package/dist/src/security/scanner.d.ts.map +0 -1
  232. package/dist/src/security/scanner.js +0 -599
  233. 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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"}