@dollhousemcp/mcp-server 2.0.0-rc.5 → 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 (256) hide show
  1. package/CHANGELOG.md +54 -17
  2. package/README.github.md +2 -2
  3. package/README.md +2 -2
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +2 -2
  6. package/dist/cache/LRUCache.d.ts +3 -0
  7. package/dist/cache/LRUCache.d.ts.map +1 -1
  8. package/dist/cache/LRUCache.js +36 -26
  9. package/dist/config/env.d.ts +14 -4
  10. package/dist/config/env.d.ts.map +1 -1
  11. package/dist/config/env.js +20 -6
  12. package/dist/di/Container.d.ts +21 -0
  13. package/dist/di/Container.d.ts.map +1 -1
  14. package/dist/di/Container.js +250 -53
  15. package/dist/elements/BaseElement.d.ts.map +1 -1
  16. package/dist/elements/BaseElement.js +5 -10
  17. package/dist/elements/base/BaseElementManager.d.ts +22 -0
  18. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  19. package/dist/elements/base/BaseElementManager.js +47 -7
  20. package/dist/elements/memories/Memory.d.ts +1 -0
  21. package/dist/elements/memories/Memory.d.ts.map +1 -1
  22. package/dist/elements/memories/Memory.js +12 -8
  23. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  24. package/dist/elements/memories/MemoryManager.js +23 -42
  25. package/dist/elements/memories/MemorySearchIndex.js +2 -2
  26. package/dist/generated/version.d.ts +2 -2
  27. package/dist/generated/version.d.ts.map +1 -1
  28. package/dist/generated/version.js +3 -3
  29. package/dist/handlers/EnhancedIndexHandler.js +6 -6
  30. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  31. package/dist/handlers/element-crud/editElement.js +39 -18
  32. package/dist/handlers/element-crud/helpers.d.ts.map +1 -1
  33. package/dist/handlers/element-crud/helpers.js +30 -3
  34. package/dist/handlers/element-crud/listElements.d.ts +2 -0
  35. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  36. package/dist/handlers/element-crud/listElements.js +3 -1
  37. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  38. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  39. package/dist/handlers/mcp-aql/GatekeeperTypes.d.ts +4 -0
  40. package/dist/handlers/mcp-aql/GatekeeperTypes.d.ts.map +1 -1
  41. package/dist/handlers/mcp-aql/GatekeeperTypes.js +1 -1
  42. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +33 -0
  43. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  44. package/dist/handlers/mcp-aql/MCPAQLHandler.js +232 -23
  45. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  46. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  47. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  48. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  49. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  50. package/dist/handlers/mcp-aql/UnifiedEndpoint.d.ts.map +1 -1
  51. package/dist/handlers/mcp-aql/UnifiedEndpoint.js +4 -3
  52. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  53. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  54. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  55. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts +17 -0
  56. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
  57. package/dist/handlers/mcp-aql/policies/ElementPolicies.js +91 -1
  58. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts +5 -3
  59. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  60. package/dist/handlers/mcp-aql/policies/ToolClassification.js +56 -2
  61. package/dist/handlers/mcp-aql/types.d.ts +22 -0
  62. package/dist/handlers/mcp-aql/types.d.ts.map +1 -1
  63. package/dist/handlers/mcp-aql/types.js +47 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +3 -3
  66. package/dist/logging/LogHooks.js +11 -11
  67. package/dist/logging/LogManager.d.ts +0 -2
  68. package/dist/logging/LogManager.d.ts.map +1 -1
  69. package/dist/logging/LogManager.js +1 -3
  70. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  71. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  72. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  73. package/dist/logging/types.d.ts +0 -2
  74. package/dist/logging/types.d.ts.map +1 -1
  75. package/dist/logging/types.js +1 -1
  76. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  77. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  78. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  79. package/dist/metrics/MetricsManager.d.ts +47 -0
  80. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  81. package/dist/metrics/MetricsManager.js +232 -0
  82. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  83. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  84. package/dist/metrics/OperationMetricsTracker.js +53 -0
  85. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  86. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  87. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  88. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  89. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  90. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  91. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  92. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  93. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  94. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  95. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  96. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  97. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  98. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  99. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  100. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  101. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  102. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  103. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  104. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  105. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  106. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  107. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  108. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  109. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  110. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  111. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  112. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  113. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  114. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  115. package/dist/metrics/collectors/index.d.ts +11 -0
  116. package/dist/metrics/collectors/index.d.ts.map +1 -0
  117. package/dist/metrics/collectors/index.js +11 -0
  118. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  119. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  120. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  121. package/dist/metrics/types.d.ts +98 -0
  122. package/dist/metrics/types.d.ts.map +1 -0
  123. package/dist/metrics/types.js +24 -0
  124. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  125. package/dist/portfolio/DefaultElementProvider.js +1 -7
  126. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  127. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  128. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  129. package/dist/portfolio/NLPScoringManager.js +5 -9
  130. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  131. package/dist/portfolio/RelationshipManager.js +2 -2
  132. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  133. package/dist/portfolio/VerbTriggerManager.js +5 -19
  134. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  135. package/dist/portfolio/config/IndexConfig.js +1 -12
  136. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  137. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  138. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  139. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  140. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  141. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  142. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  143. package/dist/security/audit/config/suppressions.js +36 -8
  144. package/dist/security/constants.d.ts.map +1 -1
  145. package/dist/security/constants.js +10 -6
  146. package/dist/security/fileLockManager.d.ts.map +1 -1
  147. package/dist/security/fileLockManager.js +8 -6
  148. package/dist/security/secureYamlParser.d.ts.map +1 -1
  149. package/dist/security/secureYamlParser.js +1 -13
  150. package/dist/security/securityMonitor.d.ts +2 -1
  151. package/dist/security/securityMonitor.d.ts.map +1 -1
  152. package/dist/security/securityMonitor.js +14 -3
  153. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  154. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  155. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  156. package/dist/security/tokenManager.d.ts +3 -0
  157. package/dist/security/tokenManager.d.ts.map +1 -1
  158. package/dist/security/tokenManager.js +13 -5
  159. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  160. package/dist/security/validation/BackgroundValidator.js +7 -7
  161. package/dist/server/startup.d.ts.map +1 -1
  162. package/dist/server/startup.js +8 -24
  163. package/dist/server/tools/MCPAQLTools.js +8 -1
  164. package/dist/services/ActivationStore.d.ts.map +1 -1
  165. package/dist/services/ActivationStore.js +9 -3
  166. package/dist/services/FileWatchService.d.ts +1 -0
  167. package/dist/services/FileWatchService.d.ts.map +1 -1
  168. package/dist/services/FileWatchService.js +83 -48
  169. package/dist/services/MetadataService.d.ts.map +1 -1
  170. package/dist/services/MetadataService.js +7 -2
  171. package/dist/services/PolicyExportService.d.ts.map +1 -1
  172. package/dist/services/PolicyExportService.js +8 -1
  173. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  174. package/dist/services/query/ElementQueryService.js +1 -41
  175. package/dist/services/query/PaginationService.d.ts.map +1 -1
  176. package/dist/services/query/PaginationService.js +1 -14
  177. package/dist/services/query/SortService.d.ts.map +1 -1
  178. package/dist/services/query/SortService.js +1 -6
  179. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  180. package/dist/services/validation/ValidationService.js +3 -8
  181. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  182. package/dist/storage/ElementStorageLayer.js +5 -2
  183. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  184. package/dist/storage/MemoryStorageLayer.js +5 -2
  185. package/dist/telemetry/OperationalTelemetry.js +2 -2
  186. package/dist/utils/EventDeduplicator.d.ts +44 -0
  187. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  188. package/dist/utils/EventDeduplicator.js +93 -0
  189. package/dist/utils/FileLock.d.ts.map +1 -1
  190. package/dist/utils/FileLock.js +1 -9
  191. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  192. package/dist/utils/PerformanceMonitor.js +5 -5
  193. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  194. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  195. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  196. package/dist/web/console/IngestRoutes.d.ts +84 -0
  197. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  198. package/dist/web/console/IngestRoutes.js +252 -0
  199. package/dist/web/console/LeaderElection.d.ts +89 -0
  200. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  201. package/dist/web/console/LeaderElection.js +205 -0
  202. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  203. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  204. package/dist/web/console/LeaderForwardingSink.js +197 -0
  205. package/dist/web/console/SessionNames.d.ts +46 -0
  206. package/dist/web/console/SessionNames.d.ts.map +1 -0
  207. package/dist/web/console/SessionNames.js +257 -0
  208. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  209. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  210. package/dist/web/console/UnifiedConsole.js +119 -0
  211. package/dist/web/contentPipeline.d.ts +58 -0
  212. package/dist/web/contentPipeline.d.ts.map +1 -0
  213. package/dist/web/contentPipeline.js +112 -0
  214. package/dist/web/portDiscovery.d.ts +58 -0
  215. package/dist/web/portDiscovery.d.ts.map +1 -0
  216. package/dist/web/portDiscovery.js +143 -0
  217. package/dist/web/public/app.js +148 -60
  218. package/dist/web/public/logs.js +638 -0
  219. package/dist/web/public/metrics.js +682 -0
  220. package/dist/web/public/permissions.js +394 -0
  221. package/dist/web/public/sessions.js +369 -0
  222. package/dist/web/routes/healthRoutes.d.ts +16 -0
  223. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  224. package/dist/web/routes/healthRoutes.js +29 -0
  225. package/dist/web/routes/logRoutes.d.ts +18 -0
  226. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  227. package/dist/web/routes/logRoutes.js +126 -0
  228. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  229. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  230. package/dist/web/routes/metricsRoutes.js +90 -0
  231. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  232. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  233. package/dist/web/routes/permissionRoutes.js +133 -0
  234. package/dist/web/routes.d.ts.map +1 -1
  235. package/dist/web/routes.js +309 -339
  236. package/dist/web/server.d.ts +21 -1
  237. package/dist/web/server.d.ts.map +1 -1
  238. package/dist/web/server.js +42 -4
  239. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  240. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  241. package/dist/web/sinks/WebSSELogSink.js +22 -0
  242. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  243. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  244. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  245. package/package.json +2 -2
  246. package/server.json +2 -2
  247. package/dist/constants/version.d.ts +0 -3
  248. package/dist/constants/version.d.ts.map +0 -1
  249. package/dist/constants/version.js +0 -4
  250. package/dist/logging/sinks/SSELogSink.d.ts +0 -35
  251. package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
  252. package/dist/logging/sinks/SSELogSink.js +0 -181
  253. package/dist/logging/viewer/viewerHtml.d.ts +0 -8
  254. package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
  255. package/dist/logging/viewer/viewerHtml.js +0 -204
  256. package/dist/web/public/public/app.js +0 -1878
@@ -0,0 +1,76 @@
1
+ export class GatekeeperMetricsCollector {
2
+ tracker;
3
+ name = 'gatekeeper-metrics';
4
+ description = 'Gatekeeper policy enforcement: allowed/denied/confirmed, policy sources, permission levels.';
5
+ constructor(tracker) {
6
+ this.tracker = tracker;
7
+ }
8
+ collect() {
9
+ try {
10
+ const m = this.tracker.getMetrics();
11
+ const entries = [
12
+ {
13
+ type: 'counter',
14
+ name: 'gatekeeper.decisions_total',
15
+ source: 'GatekeeperMetricsTracker',
16
+ unit: 'operations',
17
+ description: 'Total Gatekeeper policy decisions.',
18
+ value: m.totalDecisions,
19
+ },
20
+ {
21
+ type: 'counter',
22
+ name: 'gatekeeper.allowed_total',
23
+ source: 'GatekeeperMetricsTracker',
24
+ unit: 'operations',
25
+ description: 'Operations allowed by Gatekeeper.',
26
+ value: m.allowed,
27
+ },
28
+ {
29
+ type: 'counter',
30
+ name: 'gatekeeper.denied_total',
31
+ source: 'GatekeeperMetricsTracker',
32
+ unit: 'operations',
33
+ description: 'Operations denied by Gatekeeper.',
34
+ value: m.denied,
35
+ },
36
+ {
37
+ type: 'counter',
38
+ name: 'gatekeeper.confirmations_requested_total',
39
+ source: 'GatekeeperMetricsTracker',
40
+ unit: 'operations',
41
+ description: 'Total operations that requested user confirmation.',
42
+ value: m.confirmationsPending,
43
+ },
44
+ ];
45
+ // Per-policy-source gauges
46
+ for (const [source, count] of m.byPolicySource) {
47
+ entries.push({
48
+ type: 'gauge',
49
+ name: 'gatekeeper.by_policy_source',
50
+ source: 'GatekeeperMetricsTracker',
51
+ unit: 'operations',
52
+ description: `Decisions from policy source: ${source}.`,
53
+ labels: { policy_source: source },
54
+ value: count,
55
+ });
56
+ }
57
+ // Per-permission-level gauges
58
+ for (const [level, count] of m.byPermissionLevel) {
59
+ entries.push({
60
+ type: 'gauge',
61
+ name: 'gatekeeper.by_permission_level',
62
+ source: 'GatekeeperMetricsTracker',
63
+ unit: 'operations',
64
+ description: `Decisions at permission level: ${level}.`,
65
+ labels: { permission_level: level },
66
+ value: count,
67
+ });
68
+ }
69
+ return entries;
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0ZWtlZXBlck1ldHJpY3NDb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0cmljcy9jb2xsZWN0b3JzL0dhdGVrZWVwZXJNZXRyaWNzQ29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE1BQU0sT0FBTywwQkFBMEI7SUFJUjtJQUhwQixJQUFJLEdBQUcsb0JBQW9CLENBQUM7SUFDNUIsV0FBVyxHQUFHLDZGQUE2RixDQUFDO0lBRXJILFlBQTZCLE9BQWlDO1FBQWpDLFlBQU8sR0FBUCxPQUFPLENBQTBCO0lBQUcsQ0FBQztJQUVsRSxPQUFPO1FBQ0wsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUVwQyxNQUFNLE9BQU8sR0FBa0I7Z0JBQzdCO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLDRCQUE0QjtvQkFDbEMsTUFBTSxFQUFFLDBCQUEwQjtvQkFDbEMsSUFBSSxFQUFFLFlBQXFCO29CQUMzQixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLGNBQWM7aUJBQ3hCO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLDBCQUEwQjtvQkFDaEMsTUFBTSxFQUFFLDBCQUEwQjtvQkFDbEMsSUFBSSxFQUFFLFlBQXFCO29CQUMzQixXQUFXLEVBQUUsbUNBQW1DO29CQUNoRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU87aUJBQ2pCO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLHlCQUF5QjtvQkFDL0IsTUFBTSxFQUFFLDBCQUEwQjtvQkFDbEMsSUFBSSxFQUFFLFlBQXFCO29CQUMzQixXQUFXLEVBQUUsa0NBQWtDO29CQUMvQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU07aUJBQ2hCO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLDBDQUEwQztvQkFDaEQsTUFBTSxFQUFFLDBCQUEwQjtvQkFDbEMsSUFBSSxFQUFFLFlBQXFCO29CQUMzQixXQUFXLEVBQUUsb0RBQW9EO29CQUNqRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQjtpQkFDOUI7YUFDRixDQUFDO1lBRUYsMkJBQTJCO1lBQzNCLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQ1gsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsNkJBQTZCO29CQUNuQyxNQUFNLEVBQUUsMEJBQTBCO29CQUNsQyxJQUFJLEVBQUUsWUFBcUI7b0JBQzNCLFdBQVcsRUFBRSxpQ0FBaUMsTUFBTSxHQUFHO29CQUN2RCxNQUFNLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFO29CQUNqQyxLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsOEJBQThCO1lBQzlCLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDakQsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDWCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxnQ0FBZ0M7b0JBQ3RDLE1BQU0sRUFBRSwwQkFBMEI7b0JBQ2xDLElBQUksRUFBRSxZQUFxQjtvQkFDM0IsV0FBVyxFQUFFLGtDQUFrQyxLQUFLLEdBQUc7b0JBQ3ZELE1BQU0sRUFBRSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRTtvQkFDbkMsS0FBSyxFQUFFLEtBQUs7aUJBQ2IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbGxlY3RvciBmb3IgR2F0ZWtlZXBlciBwb2xpY3kgZW5mb3JjZW1lbnQgbWV0cmljcy5cbiAqXG4gKiBSZWFkcyBmcm9tIEdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlciBhbmQgZW1pdHMgY291bnRlciBhbmQgZ2F1Z2VcbiAqIG1ldHJpYyBlbnRyaWVzIGZvciB0aGUgTWV0cmljc01hbmFnZXIgcGlwZWxpbmUuXG4gKi9cbmltcG9ydCB0eXBlIHsgSU1ldHJpY0NvbGxlY3RvciwgTWV0cmljRW50cnkgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlciB9IGZyb20gJy4uL0dhdGVrZWVwZXJNZXRyaWNzVHJhY2tlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBHYXRla2VlcGVyTWV0cmljc0NvbGxlY3RvciBpbXBsZW1lbnRzIElNZXRyaWNDb2xsZWN0b3Ige1xuICByZWFkb25seSBuYW1lID0gJ2dhdGVrZWVwZXItbWV0cmljcyc7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uID0gJ0dhdGVrZWVwZXIgcG9saWN5IGVuZm9yY2VtZW50OiBhbGxvd2VkL2RlbmllZC9jb25maXJtZWQsIHBvbGljeSBzb3VyY2VzLCBwZXJtaXNzaW9uIGxldmVscy4nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdHJhY2tlcjogR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyKSB7fVxuXG4gIGNvbGxlY3QoKTogTWV0cmljRW50cnlbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLnRyYWNrZXIuZ2V0TWV0cmljcygpO1xuXG4gICAgICBjb25zdCBlbnRyaWVzOiBNZXRyaWNFbnRyeVtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdnYXRla2VlcGVyLmRlY2lzaW9uc190b3RhbCcsXG4gICAgICAgICAgc291cmNlOiAnR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyJyxcbiAgICAgICAgICB1bml0OiAnb3BlcmF0aW9ucycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBHYXRla2VlcGVyIHBvbGljeSBkZWNpc2lvbnMuJyxcbiAgICAgICAgICB2YWx1ZTogbS50b3RhbERlY2lzaW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdjb3VudGVyJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnZ2F0ZWtlZXBlci5hbGxvd2VkX3RvdGFsJyxcbiAgICAgICAgICBzb3VyY2U6ICdHYXRla2VlcGVyTWV0cmljc1RyYWNrZXInLFxuICAgICAgICAgIHVuaXQ6ICdvcGVyYXRpb25zJyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ09wZXJhdGlvbnMgYWxsb3dlZCBieSBHYXRla2VlcGVyLicsXG4gICAgICAgICAgdmFsdWU6IG0uYWxsb3dlZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdjb3VudGVyJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnZ2F0ZWtlZXBlci5kZW5pZWRfdG90YWwnLFxuICAgICAgICAgIHNvdXJjZTogJ0dhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcicsXG4gICAgICAgICAgdW5pdDogJ29wZXJhdGlvbnMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT3BlcmF0aW9ucyBkZW5pZWQgYnkgR2F0ZWtlZXBlci4nLFxuICAgICAgICAgIHZhbHVlOiBtLmRlbmllZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdjb3VudGVyJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnZ2F0ZWtlZXBlci5jb25maXJtYXRpb25zX3JlcXVlc3RlZF90b3RhbCcsXG4gICAgICAgICAgc291cmNlOiAnR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyJyxcbiAgICAgICAgICB1bml0OiAnb3BlcmF0aW9ucycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBvcGVyYXRpb25zIHRoYXQgcmVxdWVzdGVkIHVzZXIgY29uZmlybWF0aW9uLicsXG4gICAgICAgICAgdmFsdWU6IG0uY29uZmlybWF0aW9uc1BlbmRpbmcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBQZXItcG9saWN5LXNvdXJjZSBnYXVnZXNcbiAgICAgIGZvciAoY29uc3QgW3NvdXJjZSwgY291bnRdIG9mIG0uYnlQb2xpY3lTb3VyY2UpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdnYXRla2VlcGVyLmJ5X3BvbGljeV9zb3VyY2UnLFxuICAgICAgICAgIHNvdXJjZTogJ0dhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcicsXG4gICAgICAgICAgdW5pdDogJ29wZXJhdGlvbnMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgRGVjaXNpb25zIGZyb20gcG9saWN5IHNvdXJjZTogJHtzb3VyY2V9LmAsXG4gICAgICAgICAgbGFiZWxzOiB7IHBvbGljeV9zb3VyY2U6IHNvdXJjZSB9LFxuICAgICAgICAgIHZhbHVlOiBjb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBlci1wZXJtaXNzaW9uLWxldmVsIGdhdWdlc1xuICAgICAgZm9yIChjb25zdCBbbGV2ZWwsIGNvdW50XSBvZiBtLmJ5UGVybWlzc2lvbkxldmVsKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnZ2F0ZWtlZXBlci5ieV9wZXJtaXNzaW9uX2xldmVsJyxcbiAgICAgICAgICBzb3VyY2U6ICdHYXRla2VlcGVyTWV0cmljc1RyYWNrZXInLFxuICAgICAgICAgIHVuaXQ6ICdvcGVyYXRpb25zJyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYERlY2lzaW9ucyBhdCBwZXJtaXNzaW9uIGxldmVsOiAke2xldmVsfS5gLFxuICAgICAgICAgIGxhYmVsczogeyBwZXJtaXNzaW9uX2xldmVsOiBsZXZlbCB9LFxuICAgICAgICAgIHZhbHVlOiBjb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Collects hit/miss/eviction and sizing metrics for one or more named LRUCache
3
+ * instances. Each cache is collected independently; a failure on one does not
4
+ * prevent the others from being reported.
5
+ */
6
+ import type { IMetricCollector, MetricEntry } from '../types.js';
7
+ import type { LRUCache } from '../../cache/LRUCache.js';
8
+ export declare class LRUCacheCollector implements IMetricCollector {
9
+ private readonly caches;
10
+ readonly name = "lru-cache";
11
+ readonly description = "Hit rate, eviction counts, size, and memory usage for registered LRU caches";
12
+ constructor(caches: Array<{
13
+ name: string;
14
+ instance: LRUCache<unknown>;
15
+ }>);
16
+ collect(): MetricEntry[];
17
+ }
18
+ //# sourceMappingURL=LRUCacheCollector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LRUCacheCollector.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/LRUCacheCollector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAIxD,qBAAa,iBAAkB,YAAW,gBAAgB;IAMtD,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,iFAC4D;gBAG7D,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAG/E,OAAO,IAAI,WAAW,EAAE;CA0FzB"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Collects hit/miss/eviction and sizing metrics for one or more named LRUCache
3
+ * instances. Each cache is collected independently; a failure on one does not
4
+ * prevent the others from being reported.
5
+ */
6
+ const SOURCE = 'LRUCache';
7
+ export class LRUCacheCollector {
8
+ caches;
9
+ name = 'lru-cache';
10
+ description = 'Hit rate, eviction counts, size, and memory usage for registered LRU caches';
11
+ constructor(caches) {
12
+ this.caches = caches;
13
+ }
14
+ collect() {
15
+ const entries = [];
16
+ for (const { name, instance } of this.caches) {
17
+ try {
18
+ const stats = instance.getStats();
19
+ const labels = { cache: name };
20
+ entries.push({
21
+ type: 'counter',
22
+ name: 'cache.lru.hits_total',
23
+ source: SOURCE,
24
+ unit: 'count',
25
+ description: 'Total cache hits',
26
+ labels,
27
+ value: stats.hitCount,
28
+ }, {
29
+ type: 'counter',
30
+ name: 'cache.lru.misses_total',
31
+ source: SOURCE,
32
+ unit: 'count',
33
+ description: 'Total cache misses',
34
+ labels,
35
+ value: stats.missCount,
36
+ }, {
37
+ type: 'counter',
38
+ name: 'cache.lru.evictions_total',
39
+ source: SOURCE,
40
+ unit: 'count',
41
+ description: 'Total entries evicted from cache',
42
+ labels,
43
+ value: stats.evictionCount,
44
+ }, {
45
+ type: 'gauge',
46
+ name: 'cache.lru.hit_rate',
47
+ source: SOURCE,
48
+ unit: 'ratio',
49
+ description: 'Fraction of lookups that resulted in a cache hit',
50
+ labels,
51
+ value: stats.hitRate,
52
+ }, {
53
+ type: 'gauge',
54
+ name: 'cache.lru.size_current',
55
+ source: SOURCE,
56
+ unit: 'count',
57
+ description: 'Current number of entries in cache',
58
+ labels,
59
+ value: stats.size,
60
+ }, {
61
+ type: 'gauge',
62
+ name: 'cache.lru.size_max',
63
+ source: SOURCE,
64
+ unit: 'count',
65
+ description: 'Maximum capacity of the cache',
66
+ labels,
67
+ value: stats.maxSize,
68
+ }, {
69
+ type: 'gauge',
70
+ name: 'cache.lru.memory_used_megabytes',
71
+ source: SOURCE,
72
+ unit: 'megabytes',
73
+ description: 'Estimated memory used by cached entries (MB)',
74
+ labels,
75
+ value: stats.memoryUsageMB,
76
+ });
77
+ }
78
+ catch (err) {
79
+ // Record failure as a metric so it's visible in the dashboard.
80
+ // Individual cache failures should not prevent other caches from reporting.
81
+ entries.push({
82
+ type: 'gauge',
83
+ name: 'cache.lru.collection_error',
84
+ source: SOURCE,
85
+ unit: 'count',
86
+ description: `Failed to collect stats: ${err instanceof Error ? err.message : String(err)}`,
87
+ labels: { cache: name },
88
+ value: 1,
89
+ });
90
+ }
91
+ }
92
+ return entries;
93
+ }
94
+ }
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJVQ2FjaGVDb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0cmljcy9jb2xsZWN0b3JzL0xSVUNhY2hlQ29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFLSCxNQUFNLE1BQU0sR0FBRyxVQUFtQixDQUFDO0FBRW5DLE1BQU0sT0FBTyxpQkFBaUI7SUFNVDtJQUxWLElBQUksR0FBRyxXQUFXLENBQUM7SUFDbkIsV0FBVyxHQUNsQiw2RUFBNkUsQ0FBQztJQUVoRixZQUNtQixNQUE0RDtRQUE1RCxXQUFNLEdBQU4sTUFBTSxDQUFzRDtJQUM1RSxDQUFDO0lBRUosT0FBTztRQUNMLE1BQU0sT0FBTyxHQUFrQixFQUFFLENBQUM7UUFFbEMsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQVcsQ0FBQztnQkFFeEMsT0FBTyxDQUFDLElBQUksQ0FDVjtvQkFDRSxJQUFJLEVBQUUsU0FBa0I7b0JBQ3hCLElBQUksRUFBRSxzQkFBc0I7b0JBQzVCLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLGtCQUFrQjtvQkFDL0IsTUFBTTtvQkFDTixLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVE7aUJBQ3RCLEVBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFNBQWtCO29CQUN4QixJQUFJLEVBQUUsd0JBQXdCO29CQUM5QixNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSxvQkFBb0I7b0JBQ2pDLE1BQU07b0JBQ04sS0FBSyxFQUFFLEtBQUssQ0FBQyxTQUFTO2lCQUN2QixFQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsa0NBQWtDO29CQUMvQyxNQUFNO29CQUNOLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYTtpQkFDM0IsRUFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxvQkFBb0I7b0JBQzFCLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLGtEQUFrRDtvQkFDL0QsTUFBTTtvQkFDTixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU87aUJBQ3JCLEVBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsd0JBQXdCO29CQUM5QixNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSxvQ0FBb0M7b0JBQ2pELE1BQU07b0JBQ04sS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNsQixFQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsK0JBQStCO29CQUM1QyxNQUFNO29CQUNOLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTztpQkFDckIsRUFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxpQ0FBaUM7b0JBQ3ZDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxXQUFvQjtvQkFDMUIsV0FBVyxFQUFFLDhDQUE4QztvQkFDM0QsTUFBTTtvQkFDTixLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWE7aUJBQzNCLENBQ0YsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLCtEQUErRDtnQkFDL0QsNEVBQTRFO2dCQUM1RSxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNYLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLDRCQUE0QjtvQkFDbEMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNEJBQTRCLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDM0YsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtvQkFDdkIsS0FBSyxFQUFFLENBQUM7aUJBQ1QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbGxlY3RzIGhpdC9taXNzL2V2aWN0aW9uIGFuZCBzaXppbmcgbWV0cmljcyBmb3Igb25lIG9yIG1vcmUgbmFtZWQgTFJVQ2FjaGVcbiAqIGluc3RhbmNlcy4gRWFjaCBjYWNoZSBpcyBjb2xsZWN0ZWQgaW5kZXBlbmRlbnRseTsgYSBmYWlsdXJlIG9uIG9uZSBkb2VzIG5vdFxuICogcHJldmVudCB0aGUgb3RoZXJzIGZyb20gYmVpbmcgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJTWV0cmljQ29sbGVjdG9yLCBNZXRyaWNFbnRyeSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTFJVQ2FjaGUgfSBmcm9tICcuLi8uLi9jYWNoZS9MUlVDYWNoZS5qcyc7XG5cbmNvbnN0IFNPVVJDRSA9ICdMUlVDYWNoZScgYXMgY29uc3Q7XG5cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZUNvbGxlY3RvciBpbXBsZW1lbnRzIElNZXRyaWNDb2xsZWN0b3Ige1xuICByZWFkb25seSBuYW1lID0gJ2xydS1jYWNoZSc7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uID1cbiAgICAnSGl0IHJhdGUsIGV2aWN0aW9uIGNvdW50cywgc2l6ZSwgYW5kIG1lbW9yeSB1c2FnZSBmb3IgcmVnaXN0ZXJlZCBMUlUgY2FjaGVzJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGluc3RhbmNlOiBMUlVDYWNoZTx1bmtub3duPiB9PixcbiAgKSB7fVxuXG4gIGNvbGxlY3QoKTogTWV0cmljRW50cnlbXSB7XG4gICAgY29uc3QgZW50cmllczogTWV0cmljRW50cnlbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB7IG5hbWUsIGluc3RhbmNlIH0gb2YgdGhpcy5jYWNoZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gaW5zdGFuY2UuZ2V0U3RhdHMoKTtcbiAgICAgICAgY29uc3QgbGFiZWxzID0geyBjYWNoZTogbmFtZSB9IGFzIGNvbnN0O1xuXG4gICAgICAgIGVudHJpZXMucHVzaChcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnY291bnRlcicgYXMgY29uc3QsXG4gICAgICAgICAgICBuYW1lOiAnY2FjaGUubHJ1LmhpdHNfdG90YWwnLFxuICAgICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBjYWNoZSBoaXRzJyxcbiAgICAgICAgICAgIGxhYmVscyxcbiAgICAgICAgICAgIHZhbHVlOiBzdGF0cy5oaXRDb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdjb3VudGVyJyBhcyBjb25zdCxcbiAgICAgICAgICAgIG5hbWU6ICdjYWNoZS5scnUubWlzc2VzX3RvdGFsJyxcbiAgICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgY2FjaGUgbWlzc2VzJyxcbiAgICAgICAgICAgIGxhYmVscyxcbiAgICAgICAgICAgIHZhbHVlOiBzdGF0cy5taXNzQ291bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnY291bnRlcicgYXMgY29uc3QsXG4gICAgICAgICAgICBuYW1lOiAnY2FjaGUubHJ1LmV2aWN0aW9uc190b3RhbCcsXG4gICAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIGVudHJpZXMgZXZpY3RlZCBmcm9tIGNhY2hlJyxcbiAgICAgICAgICAgIGxhYmVscyxcbiAgICAgICAgICAgIHZhbHVlOiBzdGF0cy5ldmljdGlvbkNvdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICAgIG5hbWU6ICdjYWNoZS5scnUuaGl0X3JhdGUnLFxuICAgICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgICB1bml0OiAncmF0aW8nIGFzIGNvbnN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdGcmFjdGlvbiBvZiBsb29rdXBzIHRoYXQgcmVzdWx0ZWQgaW4gYSBjYWNoZSBoaXQnLFxuICAgICAgICAgICAgbGFiZWxzLFxuICAgICAgICAgICAgdmFsdWU6IHN0YXRzLmhpdFJhdGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgICAgbmFtZTogJ2NhY2hlLmxydS5zaXplX2N1cnJlbnQnLFxuICAgICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDdXJyZW50IG51bWJlciBvZiBlbnRyaWVzIGluIGNhY2hlJyxcbiAgICAgICAgICAgIGxhYmVscyxcbiAgICAgICAgICAgIHZhbHVlOiBzdGF0cy5zaXplLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICAgIG5hbWU6ICdjYWNoZS5scnUuc2l6ZV9tYXgnLFxuICAgICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdNYXhpbXVtIGNhcGFjaXR5IG9mIHRoZSBjYWNoZScsXG4gICAgICAgICAgICBsYWJlbHMsXG4gICAgICAgICAgICB2YWx1ZTogc3RhdHMubWF4U2l6ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgICBuYW1lOiAnY2FjaGUubHJ1Lm1lbW9yeV91c2VkX21lZ2FieXRlcycsXG4gICAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICAgIHVuaXQ6ICdtZWdhYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdFc3RpbWF0ZWQgbWVtb3J5IHVzZWQgYnkgY2FjaGVkIGVudHJpZXMgKE1CKScsXG4gICAgICAgICAgICBsYWJlbHMsXG4gICAgICAgICAgICB2YWx1ZTogc3RhdHMubWVtb3J5VXNhZ2VNQixcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIFJlY29yZCBmYWlsdXJlIGFzIGEgbWV0cmljIHNvIGl0J3MgdmlzaWJsZSBpbiB0aGUgZGFzaGJvYXJkLlxuICAgICAgICAvLyBJbmRpdmlkdWFsIGNhY2hlIGZhaWx1cmVzIHNob3VsZCBub3QgcHJldmVudCBvdGhlciBjYWNoZXMgZnJvbSByZXBvcnRpbmcuXG4gICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnY2FjaGUubHJ1LmNvbGxlY3Rpb25fZXJyb3InLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGBGYWlsZWQgdG8gY29sbGVjdCBzdGF0czogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCxcbiAgICAgICAgICBsYWJlbHM6IHsgY2FjaGU6IG5hbWUgfSxcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Collector for MCP-AQL operation metrics.
3
+ *
4
+ * Reads from OperationMetricsTracker and emits counter, histogram,
5
+ * and gauge metric entries for the MetricsManager pipeline.
6
+ */
7
+ import type { IMetricCollector, MetricEntry } from '../types.js';
8
+ import { OperationMetricsTracker } from '../OperationMetricsTracker.js';
9
+ export declare class OperationMetricsCollector implements IMetricCollector {
10
+ private readonly tracker;
11
+ readonly name = "operation-metrics";
12
+ readonly description = "MCP-AQL operation counts, durations, and endpoint breakdown.";
13
+ constructor(tracker: OperationMetricsTracker);
14
+ collect(): MetricEntry[];
15
+ }
16
+ //# sourceMappingURL=OperationMetricsCollector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperationMetricsCollector.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/OperationMetricsCollector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE,qBAAa,yBAA0B,YAAW,gBAAgB;IAIpD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,WAAW,kEAAkE;gBAEzD,OAAO,EAAE,uBAAuB;IAE7D,OAAO,IAAI,WAAW,EAAE;CAyEzB"}
@@ -0,0 +1,80 @@
1
+ import { OperationMetricsTracker } from '../OperationMetricsTracker.js';
2
+ export class OperationMetricsCollector {
3
+ tracker;
4
+ name = 'operation-metrics';
5
+ description = 'MCP-AQL operation counts, durations, and endpoint breakdown.';
6
+ constructor(tracker) {
7
+ this.tracker = tracker;
8
+ }
9
+ collect() {
10
+ try {
11
+ const m = this.tracker.getMetrics();
12
+ const pct = OperationMetricsTracker.percentiles(m.durations);
13
+ const entries = [
14
+ {
15
+ type: 'counter',
16
+ name: 'mcpaql.operations_total',
17
+ source: 'OperationMetricsTracker',
18
+ unit: 'operations',
19
+ description: 'Total MCP-AQL operations executed.',
20
+ value: m.totalOps,
21
+ },
22
+ {
23
+ type: 'counter',
24
+ name: 'mcpaql.operations_failed_total',
25
+ source: 'OperationMetricsTracker',
26
+ unit: 'operations',
27
+ description: 'Total MCP-AQL operations that failed.',
28
+ value: m.failedOps,
29
+ },
30
+ {
31
+ type: 'histogram',
32
+ name: 'mcpaql.duration',
33
+ source: 'OperationMetricsTracker',
34
+ unit: 'milliseconds',
35
+ description: 'MCP-AQL operation duration distribution.',
36
+ value: {
37
+ count: pct.count,
38
+ sum: pct.sum,
39
+ avg: pct.avg,
40
+ p50: pct.p50,
41
+ p95: pct.p95,
42
+ p99: pct.p99,
43
+ },
44
+ },
45
+ ];
46
+ // Per-endpoint gauges
47
+ for (const [endpoint, count] of m.byEndpoint) {
48
+ entries.push({
49
+ type: 'gauge',
50
+ name: 'mcpaql.by_endpoint',
51
+ source: 'OperationMetricsTracker',
52
+ unit: 'operations',
53
+ description: `Operations via ${endpoint} endpoint.`,
54
+ labels: { endpoint },
55
+ value: count,
56
+ });
57
+ }
58
+ // Top 10 operations by count
59
+ const topOps = [...m.byOperation.entries()]
60
+ .sort((a, b) => b[1] - a[1])
61
+ .slice(0, 10);
62
+ for (const [operation, count] of topOps) {
63
+ entries.push({
64
+ type: 'gauge',
65
+ name: 'mcpaql.by_operation',
66
+ source: 'OperationMetricsTracker',
67
+ unit: 'operations',
68
+ description: `Count for operation: ${operation}.`,
69
+ labels: { operation },
70
+ value: count,
71
+ });
72
+ }
73
+ return entries;
74
+ }
75
+ catch {
76
+ return [];
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uTWV0cmljc0NvbGxlY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRyaWNzL2NvbGxlY3RvcnMvT3BlcmF0aW9uTWV0cmljc0NvbGxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RSxNQUFNLE9BQU8seUJBQXlCO0lBSVA7SUFIcEIsSUFBSSxHQUFHLG1CQUFtQixDQUFDO0lBQzNCLFdBQVcsR0FBRyw4REFBOEQsQ0FBQztJQUV0RixZQUE2QixPQUFnQztRQUFoQyxZQUFPLEdBQVAsT0FBTyxDQUF5QjtJQUFHLENBQUM7SUFFakUsT0FBTztRQUNMLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEMsTUFBTSxHQUFHLEdBQUcsdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUU3RCxNQUFNLE9BQU8sR0FBa0I7Z0JBQzdCO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLHlCQUF5QjtvQkFDL0IsTUFBTSxFQUFFLHlCQUF5QjtvQkFDakMsSUFBSSxFQUFFLFlBQXFCO29CQUMzQixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVE7aUJBQ2xCO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLGdDQUFnQztvQkFDdEMsTUFBTSxFQUFFLHlCQUF5QjtvQkFDakMsSUFBSSxFQUFFLFlBQXFCO29CQUMzQixXQUFXLEVBQUUsdUNBQXVDO29CQUNwRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVM7aUJBQ25CO2dCQUNEO29CQUNFLElBQUksRUFBRSxXQUFvQjtvQkFDMUIsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsTUFBTSxFQUFFLHlCQUF5QjtvQkFDakMsSUFBSSxFQUFFLGNBQXVCO29CQUM3QixXQUFXLEVBQUUsMENBQTBDO29CQUN2RCxLQUFLLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO3dCQUNoQixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7d0JBQ1osR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO3dCQUNaLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRzt3QkFDWixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7d0JBQ1osR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO3FCQUNiO2lCQUNGO2FBQ0YsQ0FBQztZQUVGLHNCQUFzQjtZQUN0QixLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM3QyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNYLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsTUFBTSxFQUFFLHlCQUF5QjtvQkFDakMsSUFBSSxFQUFFLFlBQXFCO29CQUMzQixXQUFXLEVBQUUsa0JBQWtCLFFBQVEsWUFBWTtvQkFDbkQsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFO29CQUNwQixLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsNkJBQTZCO1lBQzdCLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUN4QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzQixLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hCLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDWCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLE1BQU0sRUFBRSx5QkFBeUI7b0JBQ2pDLElBQUksRUFBRSxZQUFxQjtvQkFDM0IsV0FBVyxFQUFFLHdCQUF3QixTQUFTLEdBQUc7b0JBQ2pELE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRTtvQkFDckIsS0FBSyxFQUFFLEtBQUs7aUJBQ2IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbGxlY3RvciBmb3IgTUNQLUFRTCBvcGVyYXRpb24gbWV0cmljcy5cbiAqXG4gKiBSZWFkcyBmcm9tIE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyIGFuZCBlbWl0cyBjb3VudGVyLCBoaXN0b2dyYW0sXG4gKiBhbmQgZ2F1Z2UgbWV0cmljIGVudHJpZXMgZm9yIHRoZSBNZXRyaWNzTWFuYWdlciBwaXBlbGluZS5cbiAqL1xuaW1wb3J0IHR5cGUgeyBJTWV0cmljQ29sbGVjdG9yLCBNZXRyaWNFbnRyeSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyIH0gZnJvbSAnLi4vT3BlcmF0aW9uTWV0cmljc1RyYWNrZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uTWV0cmljc0NvbGxlY3RvciBpbXBsZW1lbnRzIElNZXRyaWNDb2xsZWN0b3Ige1xuICByZWFkb25seSBuYW1lID0gJ29wZXJhdGlvbi1tZXRyaWNzJztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24gPSAnTUNQLUFRTCBvcGVyYXRpb24gY291bnRzLCBkdXJhdGlvbnMsIGFuZCBlbmRwb2ludCBicmVha2Rvd24uJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHRyYWNrZXI6IE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyKSB7fVxuXG4gIGNvbGxlY3QoKTogTWV0cmljRW50cnlbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLnRyYWNrZXIuZ2V0TWV0cmljcygpO1xuICAgICAgY29uc3QgcGN0ID0gT3BlcmF0aW9uTWV0cmljc1RyYWNrZXIucGVyY2VudGlsZXMobS5kdXJhdGlvbnMpO1xuXG4gICAgICBjb25zdCBlbnRyaWVzOiBNZXRyaWNFbnRyeVtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdtY3BhcWwub3BlcmF0aW9uc190b3RhbCcsXG4gICAgICAgICAgc291cmNlOiAnT3BlcmF0aW9uTWV0cmljc1RyYWNrZXInLFxuICAgICAgICAgIHVuaXQ6ICdvcGVyYXRpb25zJyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIE1DUC1BUUwgb3BlcmF0aW9ucyBleGVjdXRlZC4nLFxuICAgICAgICAgIHZhbHVlOiBtLnRvdGFsT3BzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdtY3BhcWwub3BlcmF0aW9uc19mYWlsZWRfdG90YWwnLFxuICAgICAgICAgIHNvdXJjZTogJ09wZXJhdGlvbk1ldHJpY3NUcmFja2VyJyxcbiAgICAgICAgICB1bml0OiAnb3BlcmF0aW9ucycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBNQ1AtQVFMIG9wZXJhdGlvbnMgdGhhdCBmYWlsZWQuJyxcbiAgICAgICAgICB2YWx1ZTogbS5mYWlsZWRPcHMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnaGlzdG9ncmFtJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnbWNwYXFsLmR1cmF0aW9uJyxcbiAgICAgICAgICBzb3VyY2U6ICdPcGVyYXRpb25NZXRyaWNzVHJhY2tlcicsXG4gICAgICAgICAgdW5pdDogJ21pbGxpc2Vjb25kcycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdNQ1AtQVFMIG9wZXJhdGlvbiBkdXJhdGlvbiBkaXN0cmlidXRpb24uJyxcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgY291bnQ6IHBjdC5jb3VudCxcbiAgICAgICAgICAgIHN1bTogcGN0LnN1bSxcbiAgICAgICAgICAgIGF2ZzogcGN0LmF2ZyxcbiAgICAgICAgICAgIHA1MDogcGN0LnA1MCxcbiAgICAgICAgICAgIHA5NTogcGN0LnA5NSxcbiAgICAgICAgICAgIHA5OTogcGN0LnA5OSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gUGVyLWVuZHBvaW50IGdhdWdlc1xuICAgICAgZm9yIChjb25zdCBbZW5kcG9pbnQsIGNvdW50XSBvZiBtLmJ5RW5kcG9pbnQpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdtY3BhcWwuYnlfZW5kcG9pbnQnLFxuICAgICAgICAgIHNvdXJjZTogJ09wZXJhdGlvbk1ldHJpY3NUcmFja2VyJyxcbiAgICAgICAgICB1bml0OiAnb3BlcmF0aW9ucycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGBPcGVyYXRpb25zIHZpYSAke2VuZHBvaW50fSBlbmRwb2ludC5gLFxuICAgICAgICAgIGxhYmVsczogeyBlbmRwb2ludCB9LFxuICAgICAgICAgIHZhbHVlOiBjb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRvcCAxMCBvcGVyYXRpb25zIGJ5IGNvdW50XG4gICAgICBjb25zdCB0b3BPcHMgPSBbLi4ubS5ieU9wZXJhdGlvbi5lbnRyaWVzKCldXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBiWzFdIC0gYVsxXSlcbiAgICAgICAgLnNsaWNlKDAsIDEwKTtcbiAgICAgIGZvciAoY29uc3QgW29wZXJhdGlvbiwgY291bnRdIG9mIHRvcE9wcykge1xuICAgICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ21jcGFxbC5ieV9vcGVyYXRpb24nLFxuICAgICAgICAgIHNvdXJjZTogJ09wZXJhdGlvbk1ldHJpY3NUcmFja2VyJyxcbiAgICAgICAgICB1bml0OiAnb3BlcmF0aW9ucycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGBDb3VudCBmb3Igb3BlcmF0aW9uOiAke29wZXJhdGlvbn0uYCxcbiAgICAgICAgICBsYWJlbHM6IHsgb3BlcmF0aW9uIH0sXG4gICAgICAgICAgdmFsdWU6IGNvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Collector for OperationalTelemetry enabled/disabled state.
3
+ *
4
+ * Emits a single gauge (1 = enabled, 0 = disabled) derived from
5
+ * `OperationalTelemetry.isEnabled()`, allowing monitoring systems to
6
+ * alert when telemetry is unexpectedly disabled.
7
+ */
8
+ import type { IMetricCollector, MetricEntry } from '../types.js';
9
+ import type { OperationalTelemetry } from '../../telemetry/OperationalTelemetry.js';
10
+ export declare class OperationalTelemetryCollector implements IMetricCollector {
11
+ private readonly telemetry;
12
+ readonly name = "operational-telemetry";
13
+ readonly description = "Reports whether OperationalTelemetry is enabled (1) or disabled (0).";
14
+ constructor(telemetry: OperationalTelemetry);
15
+ collect(): MetricEntry[];
16
+ }
17
+ //# sourceMappingURL=OperationalTelemetryCollector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperationalTelemetryCollector.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/OperationalTelemetryCollector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAEpF,qBAAa,6BAA8B,YAAW,gBAAgB;IAIxD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAHtC,QAAQ,CAAC,IAAI,2BAA2B;IACxC,QAAQ,CAAC,WAAW,0EAA0E;gBAEjE,SAAS,EAAE,oBAAoB;IAE5D,OAAO,IAAI,WAAW,EAAE;CAgBzB"}
@@ -0,0 +1,26 @@
1
+ export class OperationalTelemetryCollector {
2
+ telemetry;
3
+ name = 'operational-telemetry';
4
+ description = 'Reports whether OperationalTelemetry is enabled (1) or disabled (0).';
5
+ constructor(telemetry) {
6
+ this.telemetry = telemetry;
7
+ }
8
+ collect() {
9
+ try {
10
+ return [
11
+ {
12
+ type: 'gauge',
13
+ name: 'telemetry.operational.enabled',
14
+ source: 'OperationalTelemetry',
15
+ unit: 'none',
16
+ description: 'Operational telemetry enabled state: 1 = enabled, 0 = disabled.',
17
+ value: this.telemetry.isEnabled() ? 1 : 0,
18
+ },
19
+ ];
20
+ }
21
+ catch {
22
+ return [];
23
+ }
24
+ }
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uYWxUZWxlbWV0cnlDb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0cmljcy9jb2xsZWN0b3JzL09wZXJhdGlvbmFsVGVsZW1ldHJ5Q29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE1BQU0sT0FBTyw2QkFBNkI7SUFJWDtJQUhwQixJQUFJLEdBQUcsdUJBQXVCLENBQUM7SUFDL0IsV0FBVyxHQUFHLHNFQUFzRSxDQUFDO0lBRTlGLFlBQTZCLFNBQStCO1FBQS9CLGNBQVMsR0FBVCxTQUFTLENBQXNCO0lBQUcsQ0FBQztJQUVoRSxPQUFPO1FBQ0wsSUFBSSxDQUFDO1lBQ0gsT0FBTztnQkFDTDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSwrQkFBK0I7b0JBQ3JDLE1BQU0sRUFBRSxzQkFBc0I7b0JBQzlCLElBQUksRUFBRSxNQUFlO29CQUNyQixXQUFXLEVBQUUsaUVBQWlFO29CQUM5RSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxQzthQUNGLENBQUM7UUFDSixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb2xsZWN0b3IgZm9yIE9wZXJhdGlvbmFsVGVsZW1ldHJ5IGVuYWJsZWQvZGlzYWJsZWQgc3RhdGUuXG4gKlxuICogRW1pdHMgYSBzaW5nbGUgZ2F1Z2UgKDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQpIGRlcml2ZWQgZnJvbVxuICogYE9wZXJhdGlvbmFsVGVsZW1ldHJ5LmlzRW5hYmxlZCgpYCwgYWxsb3dpbmcgbW9uaXRvcmluZyBzeXN0ZW1zIHRvXG4gKiBhbGVydCB3aGVuIHRlbGVtZXRyeSBpcyB1bmV4cGVjdGVkbHkgZGlzYWJsZWQuXG4gKi9cbmltcG9ydCB0eXBlIHsgSU1ldHJpY0NvbGxlY3RvciwgTWV0cmljRW50cnkgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvbmFsVGVsZW1ldHJ5IH0gZnJvbSAnLi4vLi4vdGVsZW1ldHJ5L09wZXJhdGlvbmFsVGVsZW1ldHJ5LmpzJztcblxuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbmFsVGVsZW1ldHJ5Q29sbGVjdG9yIGltcGxlbWVudHMgSU1ldHJpY0NvbGxlY3RvciB7XG4gIHJlYWRvbmx5IG5hbWUgPSAnb3BlcmF0aW9uYWwtdGVsZW1ldHJ5JztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24gPSAnUmVwb3J0cyB3aGV0aGVyIE9wZXJhdGlvbmFsVGVsZW1ldHJ5IGlzIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKS4nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdGVsZW1ldHJ5OiBPcGVyYXRpb25hbFRlbGVtZXRyeSkge31cblxuICBjb2xsZWN0KCk6IE1ldHJpY0VudHJ5W10ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAndGVsZW1ldHJ5Lm9wZXJhdGlvbmFsLmVuYWJsZWQnLFxuICAgICAgICAgIHNvdXJjZTogJ09wZXJhdGlvbmFsVGVsZW1ldHJ5JyxcbiAgICAgICAgICB1bml0OiAnbm9uZScgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdPcGVyYXRpb25hbCB0ZWxlbWV0cnkgZW5hYmxlZCBzdGF0ZTogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZC4nLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnRlbGVtZXRyeS5pc0VuYWJsZWQoKSA/IDEgOiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Collects search-performance and system-resource metrics from a PerformanceMonitor
3
+ * instance. Returns an empty array (never throws) when the source is unavailable.
4
+ */
5
+ import type { IMetricCollector, MetricEntry } from '../types.js';
6
+ import type { PerformanceMonitor } from '../../utils/PerformanceMonitor.js';
7
+ export declare class PerformanceMonitorCollector implements IMetricCollector {
8
+ private readonly monitor;
9
+ readonly name = "performance-monitor";
10
+ readonly description = "Search performance timings, cache hit rate, and system memory/CPU from PerformanceMonitor";
11
+ constructor(monitor: PerformanceMonitor);
12
+ collect(): MetricEntry[];
13
+ }
14
+ //# sourceMappingURL=PerformanceMonitorCollector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerformanceMonitorCollector.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/PerformanceMonitorCollector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAI5E,qBAAa,2BAA4B,YAAW,gBAAgB;IAKtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,QAAQ,CAAC,IAAI,yBAAyB;IACtC,QAAQ,CAAC,WAAW,+FAC0E;gBAEjE,OAAO,EAAE,kBAAkB;IAExD,OAAO,IAAI,WAAW,EAAE;CAiIzB"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Collects search-performance and system-resource metrics from a PerformanceMonitor
3
+ * instance. Returns an empty array (never throws) when the source is unavailable.
4
+ */
5
+ const SOURCE = 'PerformanceMonitor';
6
+ export class PerformanceMonitorCollector {
7
+ monitor;
8
+ name = 'performance-monitor';
9
+ description = 'Search performance timings, cache hit rate, and system memory/CPU from PerformanceMonitor';
10
+ constructor(monitor) {
11
+ this.monitor = monitor;
12
+ }
13
+ collect() {
14
+ try {
15
+ const metrics = this.monitor.getMetrics();
16
+ const searchStats = this.monitor.getSearchStats();
17
+ const memStats = this.monitor.getMemoryStats();
18
+ const searchTimes = metrics.searchTimes ?? [];
19
+ const histCount = searchTimes.length;
20
+ const histSum = searchTimes.reduce((s, v) => s + v, 0);
21
+ const entries = [
22
+ {
23
+ type: 'counter',
24
+ name: 'performance.search.searches_total',
25
+ source: SOURCE,
26
+ unit: 'count',
27
+ description: 'Total number of searches performed',
28
+ value: searchStats.totalSearches,
29
+ },
30
+ {
31
+ type: 'histogram',
32
+ name: 'performance.search.duration',
33
+ source: SOURCE,
34
+ unit: 'milliseconds',
35
+ description: 'Distribution of search durations',
36
+ value: {
37
+ count: histCount,
38
+ sum: histSum,
39
+ avg: searchStats.averageTime,
40
+ p50: searchStats.medianTime,
41
+ p95: searchStats.p95Time,
42
+ p99: searchStats.p99Time,
43
+ },
44
+ },
45
+ {
46
+ type: 'counter',
47
+ name: 'performance.search.slow_query_count',
48
+ source: SOURCE,
49
+ unit: 'count',
50
+ description: 'Number of searches that exceeded the slow-query threshold',
51
+ value: searchStats.slowQueries,
52
+ },
53
+ {
54
+ type: 'gauge',
55
+ name: 'performance.search.cache_hit_rate',
56
+ source: SOURCE,
57
+ unit: 'ratio',
58
+ description: 'Fraction of searches served from cache',
59
+ value: searchStats.cacheHitRate,
60
+ },
61
+ {
62
+ type: 'gauge',
63
+ name: 'system.memory.heap_used_bytes',
64
+ source: SOURCE,
65
+ unit: 'bytes',
66
+ description: 'V8 heap used (bytes)',
67
+ value: memStats.currentUsage.heapUsed,
68
+ },
69
+ {
70
+ type: 'gauge',
71
+ name: 'system.memory.heap_total_bytes',
72
+ source: SOURCE,
73
+ unit: 'bytes',
74
+ description: 'V8 heap total (bytes)',
75
+ value: memStats.currentUsage.heapTotal,
76
+ },
77
+ {
78
+ type: 'gauge',
79
+ name: 'system.memory.rss_bytes',
80
+ source: SOURCE,
81
+ unit: 'bytes',
82
+ description: 'Process resident set size (bytes)',
83
+ value: memStats.currentUsage.rss,
84
+ },
85
+ {
86
+ type: 'gauge',
87
+ name: 'system.memory.external_bytes',
88
+ source: SOURCE,
89
+ unit: 'bytes',
90
+ description: 'V8 external memory (bytes)',
91
+ value: memStats.currentUsage.external,
92
+ },
93
+ {
94
+ type: 'gauge',
95
+ name: 'system.memory.growth_rate',
96
+ source: SOURCE,
97
+ unit: 'megabytes',
98
+ description: 'Heap growth rate (MB/s)',
99
+ value: memStats.growthRate,
100
+ },
101
+ {
102
+ type: 'counter',
103
+ name: 'system.cpu.usage_seconds',
104
+ source: SOURCE,
105
+ unit: 'seconds',
106
+ description: 'CPU time consumed by the process (seconds)',
107
+ value: metrics.systemStats.cpuUsage,
108
+ },
109
+ {
110
+ type: 'counter',
111
+ name: 'system.uptime_seconds',
112
+ source: SOURCE,
113
+ unit: 'seconds',
114
+ description: 'Process uptime (seconds)',
115
+ value: metrics.systemStats.uptime,
116
+ },
117
+ {
118
+ type: 'gauge',
119
+ name: 'system.memory.free_bytes',
120
+ source: SOURCE,
121
+ unit: 'bytes',
122
+ description: 'System free memory (bytes)',
123
+ value: metrics.systemStats.freeMemory,
124
+ },
125
+ {
126
+ type: 'gauge',
127
+ name: 'system.memory.total_bytes',
128
+ source: SOURCE,
129
+ unit: 'bytes',
130
+ description: 'System total memory (bytes)',
131
+ value: metrics.systemStats.totalMemory,
132
+ },
133
+ ];
134
+ return entries;
135
+ }
136
+ catch {
137
+ return [];
138
+ }
139
+ }
140
+ }
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyZm9ybWFuY2VNb25pdG9yQ29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21ldHJpY3MvY29sbGVjdG9ycy9QZXJmb3JtYW5jZU1vbml0b3JDb2xsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBS0gsTUFBTSxNQUFNLEdBQUcsb0JBQTZCLENBQUM7QUFFN0MsTUFBTSxPQUFPLDJCQUEyQjtJQUtUO0lBSnBCLElBQUksR0FBRyxxQkFBcUIsQ0FBQztJQUM3QixXQUFXLEdBQ2xCLDJGQUEyRixDQUFDO0lBRTlGLFlBQTZCLE9BQTJCO1FBQTNCLFlBQU8sR0FBUCxPQUFPLENBQW9CO0lBQUcsQ0FBQztJQUU1RCxPQUFPO1FBQ0wsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFL0MsTUFBTSxXQUFXLEdBQWEsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDeEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNyQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUV2RCxNQUFNLE9BQU8sR0FBa0I7Z0JBQzdCO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLG1DQUFtQztvQkFDekMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxLQUFLLEVBQUUsV0FBVyxDQUFDLGFBQWE7aUJBQ2pDO2dCQUNEO29CQUNFLElBQUksRUFBRSxXQUFvQjtvQkFDMUIsSUFBSSxFQUFFLDZCQUE2QjtvQkFDbkMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLGNBQXVCO29CQUM3QixXQUFXLEVBQUUsa0NBQWtDO29CQUMvQyxLQUFLLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLFNBQVM7d0JBQ2hCLEdBQUcsRUFBRSxPQUFPO3dCQUNaLEdBQUcsRUFBRSxXQUFXLENBQUMsV0FBVzt3QkFDNUIsR0FBRyxFQUFFLFdBQVcsQ0FBQyxVQUFVO3dCQUMzQixHQUFHLEVBQUUsV0FBVyxDQUFDLE9BQU87d0JBQ3hCLEdBQUcsRUFBRSxXQUFXLENBQUMsT0FBTztxQkFDekI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFNBQWtCO29CQUN4QixJQUFJLEVBQUUscUNBQXFDO29CQUMzQyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSwyREFBMkQ7b0JBQ3hFLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVztpQkFDL0I7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsbUNBQW1DO29CQUN6QyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSx3Q0FBd0M7b0JBQ3JELEtBQUssRUFBRSxXQUFXLENBQUMsWUFBWTtpQkFDaEM7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsK0JBQStCO29CQUNyQyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSxzQkFBc0I7b0JBQ25DLEtBQUssRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVE7aUJBQ3RDO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLGdDQUFnQztvQkFDdEMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsdUJBQXVCO29CQUNwQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTO2lCQUN2QztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSx5QkFBeUI7b0JBQy9CLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLG1DQUFtQztvQkFDaEQsS0FBSyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRztpQkFDakM7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsOEJBQThCO29CQUNwQyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSw0QkFBNEI7b0JBQ3pDLEtBQUssRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVE7aUJBQ3RDO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLFdBQW9CO29CQUMxQixXQUFXLEVBQUUseUJBQXlCO29CQUN0QyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVU7aUJBQzNCO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLDBCQUEwQjtvQkFDaEMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLFNBQWtCO29CQUN4QixXQUFXLEVBQUUsNENBQTRDO29CQUN6RCxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRO2lCQUNwQztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsU0FBa0I7b0JBQ3hCLElBQUksRUFBRSx1QkFBdUI7b0JBQzdCLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsV0FBVyxFQUFFLDBCQUEwQjtvQkFDdkMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTTtpQkFDbEM7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsMEJBQTBCO29CQUNoQyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSw0QkFBNEI7b0JBQ3pDLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVU7aUJBQ3RDO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNkJBQTZCO29CQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXO2lCQUN2QzthQUNGLENBQUM7WUFFRixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb2xsZWN0cyBzZWFyY2gtcGVyZm9ybWFuY2UgYW5kIHN5c3RlbS1yZXNvdXJjZSBtZXRyaWNzIGZyb20gYSBQZXJmb3JtYW5jZU1vbml0b3JcbiAqIGluc3RhbmNlLiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IChuZXZlciB0aHJvd3MpIHdoZW4gdGhlIHNvdXJjZSBpcyB1bmF2YWlsYWJsZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElNZXRyaWNDb2xsZWN0b3IsIE1ldHJpY0VudHJ5IH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQZXJmb3JtYW5jZU1vbml0b3IgfSBmcm9tICcuLi8uLi91dGlscy9QZXJmb3JtYW5jZU1vbml0b3IuanMnO1xuXG5jb25zdCBTT1VSQ0UgPSAnUGVyZm9ybWFuY2VNb25pdG9yJyBhcyBjb25zdDtcblxuZXhwb3J0IGNsYXNzIFBlcmZvcm1hbmNlTW9uaXRvckNvbGxlY3RvciBpbXBsZW1lbnRzIElNZXRyaWNDb2xsZWN0b3Ige1xuICByZWFkb25seSBuYW1lID0gJ3BlcmZvcm1hbmNlLW1vbml0b3InO1xuICByZWFkb25seSBkZXNjcmlwdGlvbiA9XG4gICAgJ1NlYXJjaCBwZXJmb3JtYW5jZSB0aW1pbmdzLCBjYWNoZSBoaXQgcmF0ZSwgYW5kIHN5c3RlbSBtZW1vcnkvQ1BVIGZyb20gUGVyZm9ybWFuY2VNb25pdG9yJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1vbml0b3I6IFBlcmZvcm1hbmNlTW9uaXRvcikge31cblxuICBjb2xsZWN0KCk6IE1ldHJpY0VudHJ5W10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5tb25pdG9yLmdldE1ldHJpY3MoKTtcbiAgICAgIGNvbnN0IHNlYXJjaFN0YXRzID0gdGhpcy5tb25pdG9yLmdldFNlYXJjaFN0YXRzKCk7XG4gICAgICBjb25zdCBtZW1TdGF0cyA9IHRoaXMubW9uaXRvci5nZXRNZW1vcnlTdGF0cygpO1xuXG4gICAgICBjb25zdCBzZWFyY2hUaW1lczogbnVtYmVyW10gPSBtZXRyaWNzLnNlYXJjaFRpbWVzID8/IFtdO1xuICAgICAgY29uc3QgaGlzdENvdW50ID0gc2VhcmNoVGltZXMubGVuZ3RoO1xuICAgICAgY29uc3QgaGlzdFN1bSA9IHNlYXJjaFRpbWVzLnJlZHVjZSgocywgdikgPT4gcyArIHYsIDApO1xuXG4gICAgICBjb25zdCBlbnRyaWVzOiBNZXRyaWNFbnRyeVtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdwZXJmb3JtYW5jZS5zZWFyY2guc2VhcmNoZXNfdG90YWwnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2Ygc2VhcmNoZXMgcGVyZm9ybWVkJyxcbiAgICAgICAgICB2YWx1ZTogc2VhcmNoU3RhdHMudG90YWxTZWFyY2hlcyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdoaXN0b2dyYW0nIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdwZXJmb3JtYW5jZS5zZWFyY2guZHVyYXRpb24nLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdtaWxsaXNlY29uZHMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRGlzdHJpYnV0aW9uIG9mIHNlYXJjaCBkdXJhdGlvbnMnLFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICBjb3VudDogaGlzdENvdW50LFxuICAgICAgICAgICAgc3VtOiBoaXN0U3VtLFxuICAgICAgICAgICAgYXZnOiBzZWFyY2hTdGF0cy5hdmVyYWdlVGltZSxcbiAgICAgICAgICAgIHA1MDogc2VhcmNoU3RhdHMubWVkaWFuVGltZSxcbiAgICAgICAgICAgIHA5NTogc2VhcmNoU3RhdHMucDk1VGltZSxcbiAgICAgICAgICAgIHA5OTogc2VhcmNoU3RhdHMucDk5VGltZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdwZXJmb3JtYW5jZS5zZWFyY2guc2xvd19xdWVyeV9jb3VudCcsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBzZWFyY2hlcyB0aGF0IGV4Y2VlZGVkIHRoZSBzbG93LXF1ZXJ5IHRocmVzaG9sZCcsXG4gICAgICAgICAgdmFsdWU6IHNlYXJjaFN0YXRzLnNsb3dRdWVyaWVzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAncGVyZm9ybWFuY2Uuc2VhcmNoLmNhY2hlX2hpdF9yYXRlJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAncmF0aW8nIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRnJhY3Rpb24gb2Ygc2VhcmNoZXMgc2VydmVkIGZyb20gY2FjaGUnLFxuICAgICAgICAgIHZhbHVlOiBzZWFyY2hTdGF0cy5jYWNoZUhpdFJhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzeXN0ZW0ubWVtb3J5LmhlYXBfdXNlZF9ieXRlcycsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2J5dGVzJyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1Y4IGhlYXAgdXNlZCAoYnl0ZXMpJyxcbiAgICAgICAgICB2YWx1ZTogbWVtU3RhdHMuY3VycmVudFVzYWdlLmhlYXBVc2VkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnc3lzdGVtLm1lbW9yeS5oZWFwX3RvdGFsX2J5dGVzJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVjggaGVhcCB0b3RhbCAoYnl0ZXMpJyxcbiAgICAgICAgICB2YWx1ZTogbWVtU3RhdHMuY3VycmVudFVzYWdlLmhlYXBUb3RhbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkucnNzX2J5dGVzJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUHJvY2VzcyByZXNpZGVudCBzZXQgc2l6ZSAoYnl0ZXMpJyxcbiAgICAgICAgICB2YWx1ZTogbWVtU3RhdHMuY3VycmVudFVzYWdlLnJzcyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkuZXh0ZXJuYWxfYnl0ZXMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdieXRlcycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdWOCBleHRlcm5hbCBtZW1vcnkgKGJ5dGVzKScsXG4gICAgICAgICAgdmFsdWU6IG1lbVN0YXRzLmN1cnJlbnRVc2FnZS5leHRlcm5hbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkuZ3Jvd3RoX3JhdGUnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdtZWdhYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSGVhcCBncm93dGggcmF0ZSAoTUIvcyknLFxuICAgICAgICAgIHZhbHVlOiBtZW1TdGF0cy5ncm93dGhSYXRlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzeXN0ZW0uY3B1LnVzYWdlX3NlY29uZHMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdzZWNvbmRzJyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NQVSB0aW1lIGNvbnN1bWVkIGJ5IHRoZSBwcm9jZXNzIChzZWNvbmRzKScsXG4gICAgICAgICAgdmFsdWU6IG1ldHJpY3Muc3lzdGVtU3RhdHMuY3B1VXNhZ2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY291bnRlcicgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS51cHRpbWVfc2Vjb25kcycsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ3NlY29uZHMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUHJvY2VzcyB1cHRpbWUgKHNlY29uZHMpJyxcbiAgICAgICAgICB2YWx1ZTogbWV0cmljcy5zeXN0ZW1TdGF0cy51cHRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzeXN0ZW0ubWVtb3J5LmZyZWVfYnl0ZXMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdieXRlcycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdTeXN0ZW0gZnJlZSBtZW1vcnkgKGJ5dGVzKScsXG4gICAgICAgICAgdmFsdWU6IG1ldHJpY3Muc3lzdGVtU3RhdHMuZnJlZU1lbW9yeSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkudG90YWxfYnl0ZXMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdieXRlcycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdTeXN0ZW0gdG90YWwgbWVtb3J5IChieXRlcyknLFxuICAgICAgICAgIHZhbHVlOiBtZXRyaWNzLnN5c3RlbVN0YXRzLnRvdGFsTWVtb3J5LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Collects aggregate security-event counts from SecurityMonitor, broken down
3
+ * by severity and event type. Accepts an injectable report function so the
4
+ * collector can be tested without a live SecurityMonitor singleton.
5
+ */
6
+ import type { IMetricCollector, MetricEntry } from '../types.js';
7
+ interface SecurityReport {
8
+ totalEvents: number;
9
+ eventsBySeverity: Record<string, number>;
10
+ eventsByType: Record<string, number>;
11
+ recentCriticalEvents: unknown[];
12
+ }
13
+ export declare class SecurityMonitorCollector implements IMetricCollector {
14
+ readonly name = "security-monitor";
15
+ readonly description = "Total security events and per-severity/per-type breakdowns from SecurityMonitor";
16
+ private readonly reportFn;
17
+ constructor(reportFn?: () => SecurityReport);
18
+ collect(): MetricEntry[];
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=SecurityMonitorCollector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecurityMonitorCollector.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/SecurityMonitorCollector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAKjE,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,oBAAoB,EAAE,OAAO,EAAE,CAAC;CACjC;AAED,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,WAAW,qFACgE;IAEpF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;gBAEpC,QAAQ,CAAC,EAAE,MAAM,cAAc;IAI3C,OAAO,IAAI,WAAW,EAAE;CA2CzB"}