@dollhousemcp/mcp-server 2.0.0-rc.6 → 2.0.1

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 (229) hide show
  1. package/CHANGELOG.md +52 -61
  2. package/README.github.md +2 -2
  3. package/README.md +284 -224
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +284 -224
  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/listElements.d.ts +2 -0
  31. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  32. package/dist/handlers/element-crud/listElements.js +3 -1
  33. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  35. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
  36. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  37. package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
  38. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  39. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  40. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  41. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  42. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  43. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  44. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  45. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  46. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  47. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/logging/LogHooks.js +11 -11
  51. package/dist/logging/LogManager.d.ts +0 -2
  52. package/dist/logging/LogManager.d.ts.map +1 -1
  53. package/dist/logging/LogManager.js +1 -3
  54. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  55. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  56. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  57. package/dist/logging/types.d.ts +0 -2
  58. package/dist/logging/types.d.ts.map +1 -1
  59. package/dist/logging/types.js +1 -1
  60. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  61. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  62. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  63. package/dist/metrics/MetricsManager.d.ts +47 -0
  64. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  65. package/dist/metrics/MetricsManager.js +232 -0
  66. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  67. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  68. package/dist/metrics/OperationMetricsTracker.js +53 -0
  69. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  70. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  71. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  72. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  73. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  74. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  75. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  76. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  77. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  78. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  79. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  80. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  81. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  82. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  83. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  84. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  85. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  86. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  87. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  88. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  89. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  90. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  91. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  92. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  93. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  94. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  95. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  96. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  97. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  98. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  99. package/dist/metrics/collectors/index.d.ts +11 -0
  100. package/dist/metrics/collectors/index.d.ts.map +1 -0
  101. package/dist/metrics/collectors/index.js +11 -0
  102. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  103. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  104. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  105. package/dist/metrics/types.d.ts +98 -0
  106. package/dist/metrics/types.d.ts.map +1 -0
  107. package/dist/metrics/types.js +24 -0
  108. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  109. package/dist/portfolio/DefaultElementProvider.js +1 -7
  110. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  111. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  112. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  113. package/dist/portfolio/NLPScoringManager.js +5 -9
  114. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  115. package/dist/portfolio/RelationshipManager.js +2 -2
  116. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  117. package/dist/portfolio/VerbTriggerManager.js +5 -19
  118. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  119. package/dist/portfolio/config/IndexConfig.js +1 -12
  120. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  121. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  122. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  123. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  124. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  125. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  126. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  127. package/dist/security/audit/config/suppressions.js +36 -8
  128. package/dist/security/constants.d.ts.map +1 -1
  129. package/dist/security/constants.js +10 -6
  130. package/dist/security/fileLockManager.d.ts.map +1 -1
  131. package/dist/security/fileLockManager.js +8 -6
  132. package/dist/security/secureYamlParser.d.ts.map +1 -1
  133. package/dist/security/secureYamlParser.js +1 -13
  134. package/dist/security/securityMonitor.d.ts +2 -1
  135. package/dist/security/securityMonitor.d.ts.map +1 -1
  136. package/dist/security/securityMonitor.js +14 -3
  137. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  138. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  139. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  140. package/dist/security/tokenManager.d.ts +3 -0
  141. package/dist/security/tokenManager.d.ts.map +1 -1
  142. package/dist/security/tokenManager.js +13 -5
  143. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  144. package/dist/security/validation/BackgroundValidator.js +7 -7
  145. package/dist/server/startup.d.ts.map +1 -1
  146. package/dist/server/startup.js +8 -24
  147. package/dist/server/tools/MCPAQLTools.js +4 -1
  148. package/dist/services/ActivationStore.d.ts.map +1 -1
  149. package/dist/services/ActivationStore.js +9 -3
  150. package/dist/services/FileWatchService.d.ts +1 -0
  151. package/dist/services/FileWatchService.d.ts.map +1 -1
  152. package/dist/services/FileWatchService.js +83 -48
  153. package/dist/services/MetadataService.d.ts.map +1 -1
  154. package/dist/services/MetadataService.js +7 -2
  155. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  156. package/dist/services/query/ElementQueryService.js +1 -41
  157. package/dist/services/query/PaginationService.d.ts.map +1 -1
  158. package/dist/services/query/PaginationService.js +1 -14
  159. package/dist/services/query/SortService.d.ts.map +1 -1
  160. package/dist/services/query/SortService.js +1 -6
  161. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  162. package/dist/services/validation/ValidationService.js +3 -8
  163. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  164. package/dist/storage/ElementStorageLayer.js +5 -2
  165. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  166. package/dist/storage/MemoryStorageLayer.js +5 -2
  167. package/dist/telemetry/OperationalTelemetry.js +2 -2
  168. package/dist/utils/EventDeduplicator.d.ts +44 -0
  169. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  170. package/dist/utils/EventDeduplicator.js +93 -0
  171. package/dist/utils/FileLock.d.ts.map +1 -1
  172. package/dist/utils/FileLock.js +1 -9
  173. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  174. package/dist/utils/PerformanceMonitor.js +5 -5
  175. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  176. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  177. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  178. package/dist/web/console/IngestRoutes.d.ts +84 -0
  179. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  180. package/dist/web/console/IngestRoutes.js +252 -0
  181. package/dist/web/console/LeaderElection.d.ts +89 -0
  182. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  183. package/dist/web/console/LeaderElection.js +205 -0
  184. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  185. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  186. package/dist/web/console/LeaderForwardingSink.js +197 -0
  187. package/dist/web/console/SessionNames.d.ts +46 -0
  188. package/dist/web/console/SessionNames.d.ts.map +1 -0
  189. package/dist/web/console/SessionNames.js +257 -0
  190. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  191. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  192. package/dist/web/console/UnifiedConsole.js +119 -0
  193. package/dist/web/contentPipeline.d.ts +58 -0
  194. package/dist/web/contentPipeline.d.ts.map +1 -0
  195. package/dist/web/contentPipeline.js +112 -0
  196. package/dist/web/portDiscovery.d.ts +58 -0
  197. package/dist/web/portDiscovery.d.ts.map +1 -0
  198. package/dist/web/portDiscovery.js +143 -0
  199. package/dist/web/public/app.js +148 -60
  200. package/dist/web/public/logs.js +638 -0
  201. package/dist/web/public/metrics.js +682 -0
  202. package/dist/web/public/permissions.js +394 -0
  203. package/dist/web/public/sessions.js +369 -0
  204. package/dist/web/routes/healthRoutes.d.ts +16 -0
  205. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  206. package/dist/web/routes/healthRoutes.js +29 -0
  207. package/dist/web/routes/logRoutes.d.ts +18 -0
  208. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  209. package/dist/web/routes/logRoutes.js +126 -0
  210. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  211. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  212. package/dist/web/routes/metricsRoutes.js +90 -0
  213. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  214. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  215. package/dist/web/routes/permissionRoutes.js +133 -0
  216. package/dist/web/routes.d.ts.map +1 -1
  217. package/dist/web/routes.js +309 -339
  218. package/dist/web/server.d.ts +21 -1
  219. package/dist/web/server.d.ts.map +1 -1
  220. package/dist/web/server.js +42 -4
  221. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  222. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  223. package/dist/web/sinks/WebSSELogSink.js +22 -0
  224. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  225. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  226. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  227. package/package.json +2 -2
  228. package/server.json +2 -2
  229. package/dist/web/public/public/app.js +0 -1878
@@ -0,0 +1,56 @@
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 { SecurityMonitor } from '../../security/securityMonitor.js';
7
+ const SOURCE = 'SecurityMonitor';
8
+ export class SecurityMonitorCollector {
9
+ name = 'security-monitor';
10
+ description = 'Total security events and per-severity/per-type breakdowns from SecurityMonitor';
11
+ reportFn;
12
+ constructor(reportFn) {
13
+ this.reportFn = reportFn ?? (() => SecurityMonitor.generateSecurityReport());
14
+ }
15
+ collect() {
16
+ try {
17
+ const report = this.reportFn();
18
+ const entries = [];
19
+ entries.push({
20
+ type: 'counter',
21
+ name: 'security.monitor.events_total',
22
+ source: SOURCE,
23
+ unit: 'count',
24
+ description: 'Total number of security events recorded',
25
+ value: report.totalEvents,
26
+ });
27
+ for (const [severity, count] of Object.entries(report.eventsBySeverity)) {
28
+ entries.push({
29
+ type: 'gauge',
30
+ name: 'security.monitor.events_by_severity',
31
+ source: SOURCE,
32
+ unit: 'count',
33
+ description: 'Security event count grouped by severity level',
34
+ labels: { severity },
35
+ value: count,
36
+ });
37
+ }
38
+ for (const [type, count] of Object.entries(report.eventsByType)) {
39
+ entries.push({
40
+ type: 'gauge',
41
+ name: 'security.monitor.events_by_type',
42
+ source: SOURCE,
43
+ unit: 'count',
44
+ description: 'Security event count grouped by event type',
45
+ labels: { type },
46
+ value: count,
47
+ });
48
+ }
49
+ return entries;
50
+ }
51
+ catch {
52
+ return [];
53
+ }
54
+ }
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJpdHlNb25pdG9yQ29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21ldHJpY3MvY29sbGVjdG9ycy9TZWN1cml0eU1vbml0b3JDb2xsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUdILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxNQUFNLE1BQU0sR0FBRyxpQkFBMEIsQ0FBQztBQVMxQyxNQUFNLE9BQU8sd0JBQXdCO0lBQzFCLElBQUksR0FBRyxrQkFBa0IsQ0FBQztJQUMxQixXQUFXLEdBQ2xCLGlGQUFpRixDQUFDO0lBRW5FLFFBQVEsQ0FBdUI7SUFFaEQsWUFBWSxRQUErQjtRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDL0IsTUFBTSxPQUFPLEdBQWtCLEVBQUUsQ0FBQztZQUVsQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNYLElBQUksRUFBRSxTQUFrQjtnQkFDeEIsSUFBSSxFQUFFLCtCQUErQjtnQkFDckMsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLE9BQWdCO2dCQUN0QixXQUFXLEVBQUUsMENBQTBDO2dCQUN2RCxLQUFLLEVBQUUsTUFBTSxDQUFDLFdBQVc7YUFDMUIsQ0FBQyxDQUFDO1lBRUgsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDeEUsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDWCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxxQ0FBcUM7b0JBQzNDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLGdEQUFnRDtvQkFDN0QsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFO29CQUNwQixLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ2hFLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQ1gsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsaUNBQWlDO29CQUN2QyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSw0Q0FBNEM7b0JBQ3pELE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRTtvQkFDaEIsS0FBSyxFQUFFLEtBQUs7aUJBQ2IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbGxlY3RzIGFnZ3JlZ2F0ZSBzZWN1cml0eS1ldmVudCBjb3VudHMgZnJvbSBTZWN1cml0eU1vbml0b3IsIGJyb2tlbiBkb3duXG4gKiBieSBzZXZlcml0eSBhbmQgZXZlbnQgdHlwZS4gQWNjZXB0cyBhbiBpbmplY3RhYmxlIHJlcG9ydCBmdW5jdGlvbiBzbyB0aGVcbiAqIGNvbGxlY3RvciBjYW4gYmUgdGVzdGVkIHdpdGhvdXQgYSBsaXZlIFNlY3VyaXR5TW9uaXRvciBzaW5nbGV0b24uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJTWV0cmljQ29sbGVjdG9yLCBNZXRyaWNFbnRyeSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5cbmNvbnN0IFNPVVJDRSA9ICdTZWN1cml0eU1vbml0b3InIGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgU2VjdXJpdHlSZXBvcnQge1xuICB0b3RhbEV2ZW50czogbnVtYmVyO1xuICBldmVudHNCeVNldmVyaXR5OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICBldmVudHNCeVR5cGU6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gIHJlY2VudENyaXRpY2FsRXZlbnRzOiB1bmtub3duW107XG59XG5cbmV4cG9ydCBjbGFzcyBTZWN1cml0eU1vbml0b3JDb2xsZWN0b3IgaW1wbGVtZW50cyBJTWV0cmljQ29sbGVjdG9yIHtcbiAgcmVhZG9ubHkgbmFtZSA9ICdzZWN1cml0eS1tb25pdG9yJztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24gPVxuICAgICdUb3RhbCBzZWN1cml0eSBldmVudHMgYW5kIHBlci1zZXZlcml0eS9wZXItdHlwZSBicmVha2Rvd25zIGZyb20gU2VjdXJpdHlNb25pdG9yJztcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydEZuOiAoKSA9PiBTZWN1cml0eVJlcG9ydDtcblxuICBjb25zdHJ1Y3RvcihyZXBvcnRGbj86ICgpID0+IFNlY3VyaXR5UmVwb3J0KSB7XG4gICAgdGhpcy5yZXBvcnRGbiA9IHJlcG9ydEZuID8/ICgoKSA9PiBTZWN1cml0eU1vbml0b3IuZ2VuZXJhdGVTZWN1cml0eVJlcG9ydCgpKTtcbiAgfVxuXG4gIGNvbGxlY3QoKTogTWV0cmljRW50cnlbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0Rm4oKTtcbiAgICAgIGNvbnN0IGVudHJpZXM6IE1ldHJpY0VudHJ5W10gPSBbXTtcblxuICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICBuYW1lOiAnc2VjdXJpdHkubW9uaXRvci5ldmVudHNfdG90YWwnLFxuICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2Ygc2VjdXJpdHkgZXZlbnRzIHJlY29yZGVkJyxcbiAgICAgICAgdmFsdWU6IHJlcG9ydC50b3RhbEV2ZW50cyxcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IFtzZXZlcml0eSwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHJlcG9ydC5ldmVudHNCeVNldmVyaXR5KSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3NlY3VyaXR5Lm1vbml0b3IuZXZlbnRzX2J5X3NldmVyaXR5JyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2VjdXJpdHkgZXZlbnQgY291bnQgZ3JvdXBlZCBieSBzZXZlcml0eSBsZXZlbCcsXG4gICAgICAgICAgbGFiZWxzOiB7IHNldmVyaXR5IH0sXG4gICAgICAgICAgdmFsdWU6IGNvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBbdHlwZSwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHJlcG9ydC5ldmVudHNCeVR5cGUpKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnc2VjdXJpdHkubW9uaXRvci5ldmVudHNfYnlfdHlwZScsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NlY3VyaXR5IGV2ZW50IGNvdW50IGdyb3VwZWQgYnkgZXZlbnQgdHlwZScsXG4gICAgICAgICAgbGFiZWxzOiB7IHR5cGUgfSxcbiAgICAgICAgICB2YWx1ZTogY291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Collects blocked-attack counts and per-severity breakdowns from a
3
+ * SecurityTelemetry instance. The current hour's attack rate is surfaced as a
4
+ * gauge so dashboards can display a rolling "attacks this hour" reading.
5
+ */
6
+ import type { IMetricCollector, MetricEntry } from '../types.js';
7
+ import type { SecurityTelemetry } from '../../security/telemetry/SecurityTelemetry.js';
8
+ export declare class SecurityTelemetryCollector implements IMetricCollector {
9
+ private readonly telemetry;
10
+ readonly name = "security-telemetry";
11
+ readonly description = "Blocked attack counts, unique vectors, and severity breakdown from SecurityTelemetry";
12
+ constructor(telemetry: SecurityTelemetry);
13
+ collect(): MetricEntry[];
14
+ }
15
+ //# sourceMappingURL=SecurityTelemetryCollector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecurityTelemetryCollector.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/SecurityTelemetryCollector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAIvF,qBAAa,0BAA2B,YAAW,gBAAgB;IAKrD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJtC,QAAQ,CAAC,IAAI,wBAAwB;IACrC,QAAQ,CAAC,WAAW,0FACqE;gBAE5D,SAAS,EAAE,iBAAiB;IAEzD,OAAO,IAAI,WAAW,EAAE;CAmGzB"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Collects blocked-attack counts and per-severity breakdowns from a
3
+ * SecurityTelemetry instance. The current hour's attack rate is surfaced as a
4
+ * gauge so dashboards can display a rolling "attacks this hour" reading.
5
+ */
6
+ const SOURCE = 'SecurityTelemetry';
7
+ export class SecurityTelemetryCollector {
8
+ telemetry;
9
+ name = 'security-telemetry';
10
+ description = 'Blocked attack counts, unique vectors, and severity breakdown from SecurityTelemetry';
11
+ constructor(telemetry) {
12
+ this.telemetry = telemetry;
13
+ }
14
+ collect() {
15
+ try {
16
+ const m = this.telemetry.getMetrics();
17
+ // attacksPerHour is a 24-element array indexed by hours-ago (0 = current hour)
18
+ const attacksThisHour = Array.isArray(m.attacksPerHour) ? (m.attacksPerHour[0] ?? 0) : 0;
19
+ const entries = [
20
+ {
21
+ type: 'gauge',
22
+ name: 'security.telemetry.blocked_total',
23
+ source: SOURCE,
24
+ unit: 'count',
25
+ description: 'Total blocked attack attempts since process start',
26
+ value: m.totalBlockedAttempts,
27
+ },
28
+ {
29
+ type: 'gauge',
30
+ name: 'security.telemetry.unique_vectors',
31
+ source: SOURCE,
32
+ unit: 'count',
33
+ description: 'Number of distinct attack vectors observed',
34
+ value: m.uniqueAttackVectors,
35
+ },
36
+ {
37
+ type: 'gauge',
38
+ name: 'security.telemetry.blocked_by_severity',
39
+ source: SOURCE,
40
+ unit: 'count',
41
+ description: 'Blocked attacks broken down by severity',
42
+ labels: { severity: 'critical' },
43
+ value: m.criticalAttacksBlocked,
44
+ },
45
+ {
46
+ type: 'gauge',
47
+ name: 'security.telemetry.blocked_by_severity',
48
+ source: SOURCE,
49
+ unit: 'count',
50
+ description: 'Blocked attacks broken down by severity',
51
+ labels: { severity: 'high' },
52
+ value: m.highSeverityBlocked,
53
+ },
54
+ {
55
+ type: 'gauge',
56
+ name: 'security.telemetry.blocked_by_severity',
57
+ source: SOURCE,
58
+ unit: 'count',
59
+ description: 'Blocked attacks broken down by severity',
60
+ labels: { severity: 'medium' },
61
+ value: m.mediumSeverityBlocked,
62
+ },
63
+ {
64
+ type: 'gauge',
65
+ name: 'security.telemetry.blocked_by_severity',
66
+ source: SOURCE,
67
+ unit: 'count',
68
+ description: 'Blocked attacks broken down by severity',
69
+ labels: { severity: 'low' },
70
+ value: m.lowSeverityBlocked,
71
+ },
72
+ {
73
+ type: 'gauge',
74
+ name: 'security.telemetry.attacks_per_hour',
75
+ source: SOURCE,
76
+ unit: 'count',
77
+ description: 'Attack attempts recorded in the current clock hour',
78
+ value: attacksThisHour,
79
+ },
80
+ {
81
+ type: 'gauge',
82
+ name: 'security.telemetry.dedup_suppressed',
83
+ source: SOURCE,
84
+ unit: 'count',
85
+ description: 'Repeated events suppressed by deduplication',
86
+ value: m.deduplication.suppressedEvents,
87
+ },
88
+ {
89
+ type: 'gauge',
90
+ name: 'security.telemetry.dedup_unique',
91
+ source: SOURCE,
92
+ unit: 'count',
93
+ description: 'Unique events that passed through deduplication',
94
+ value: m.deduplication.uniqueEvents,
95
+ },
96
+ {
97
+ type: 'gauge',
98
+ name: 'security.telemetry.dedup_cache_size',
99
+ source: SOURCE,
100
+ unit: 'count',
101
+ description: 'Current deduplication cache size',
102
+ value: m.deduplication.cacheSize,
103
+ },
104
+ ];
105
+ return entries;
106
+ }
107
+ catch {
108
+ return [];
109
+ }
110
+ }
111
+ }
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJpdHlUZWxlbWV0cnlDb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0cmljcy9jb2xsZWN0b3JzL1NlY3VyaXR5VGVsZW1ldHJ5Q29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFLSCxNQUFNLE1BQU0sR0FBRyxtQkFBNEIsQ0FBQztBQUU1QyxNQUFNLE9BQU8sMEJBQTBCO0lBS1I7SUFKcEIsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQzVCLFdBQVcsR0FDbEIsc0ZBQXNGLENBQUM7SUFFekYsWUFBNkIsU0FBNEI7UUFBNUIsY0FBUyxHQUFULFNBQVMsQ0FBbUI7SUFBRyxDQUFDO0lBRTdELE9BQU87UUFDTCxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRXRDLCtFQUErRTtZQUMvRSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFekYsTUFBTSxPQUFPLEdBQWtCO2dCQUM3QjtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxrQ0FBa0M7b0JBQ3hDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLG1EQUFtRDtvQkFDaEUsS0FBSyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7aUJBQzlCO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLG1DQUFtQztvQkFDekMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNENBQTRDO29CQUN6RCxLQUFLLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjtpQkFDN0I7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsd0NBQXdDO29CQUM5QyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSx5Q0FBeUM7b0JBQ3RELE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7b0JBQ2hDLEtBQUssRUFBRSxDQUFDLENBQUMsc0JBQXNCO2lCQUNoQztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSx3Q0FBd0M7b0JBQzlDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLHlDQUF5QztvQkFDdEQsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtvQkFDNUIsS0FBSyxFQUFFLENBQUMsQ0FBQyxtQkFBbUI7aUJBQzdCO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLHdDQUF3QztvQkFDOUMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUseUNBQXlDO29CQUN0RCxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO29CQUM5QixLQUFLLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtpQkFDL0I7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsd0NBQXdDO29CQUM5QyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSx5Q0FBeUM7b0JBQ3RELE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7b0JBQzNCLEtBQUssRUFBRSxDQUFDLENBQUMsa0JBQWtCO2lCQUM1QjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxxQ0FBcUM7b0JBQzNDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLG9EQUFvRDtvQkFDakUsS0FBSyxFQUFFLGVBQWU7aUJBQ3ZCO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLHFDQUFxQztvQkFDM0MsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNkNBQTZDO29CQUMxRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0I7aUJBQ3hDO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLGlDQUFpQztvQkFDdkMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsaURBQWlEO29CQUM5RCxLQUFLLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxZQUFZO2lCQUNwQztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxxQ0FBcUM7b0JBQzNDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLGtDQUFrQztvQkFDL0MsS0FBSyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUztpQkFDakM7YUFDRixDQUFDO1lBRUYsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29sbGVjdHMgYmxvY2tlZC1hdHRhY2sgY291bnRzIGFuZCBwZXItc2V2ZXJpdHkgYnJlYWtkb3ducyBmcm9tIGFcbiAqIFNlY3VyaXR5VGVsZW1ldHJ5IGluc3RhbmNlLiBUaGUgY3VycmVudCBob3VyJ3MgYXR0YWNrIHJhdGUgaXMgc3VyZmFjZWQgYXMgYVxuICogZ2F1Z2Ugc28gZGFzaGJvYXJkcyBjYW4gZGlzcGxheSBhIHJvbGxpbmcgXCJhdHRhY2tzIHRoaXMgaG91clwiIHJlYWRpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJTWV0cmljQ29sbGVjdG9yLCBNZXRyaWNFbnRyeSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2VjdXJpdHlUZWxlbWV0cnkgfSBmcm9tICcuLi8uLi9zZWN1cml0eS90ZWxlbWV0cnkvU2VjdXJpdHlUZWxlbWV0cnkuanMnO1xuXG5jb25zdCBTT1VSQ0UgPSAnU2VjdXJpdHlUZWxlbWV0cnknIGFzIGNvbnN0O1xuXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlUZWxlbWV0cnlDb2xsZWN0b3IgaW1wbGVtZW50cyBJTWV0cmljQ29sbGVjdG9yIHtcbiAgcmVhZG9ubHkgbmFtZSA9ICdzZWN1cml0eS10ZWxlbWV0cnknO1xuICByZWFkb25seSBkZXNjcmlwdGlvbiA9XG4gICAgJ0Jsb2NrZWQgYXR0YWNrIGNvdW50cywgdW5pcXVlIHZlY3RvcnMsIGFuZCBzZXZlcml0eSBicmVha2Rvd24gZnJvbSBTZWN1cml0eVRlbGVtZXRyeSc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0ZWxlbWV0cnk6IFNlY3VyaXR5VGVsZW1ldHJ5KSB7fVxuXG4gIGNvbGxlY3QoKTogTWV0cmljRW50cnlbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLnRlbGVtZXRyeS5nZXRNZXRyaWNzKCk7XG5cbiAgICAgIC8vIGF0dGFja3NQZXJIb3VyIGlzIGEgMjQtZWxlbWVudCBhcnJheSBpbmRleGVkIGJ5IGhvdXJzLWFnbyAoMCA9IGN1cnJlbnQgaG91cilcbiAgICAgIGNvbnN0IGF0dGFja3NUaGlzSG91ciA9IEFycmF5LmlzQXJyYXkobS5hdHRhY2tzUGVySG91cikgPyAobS5hdHRhY2tzUGVySG91clswXSA/PyAwKSA6IDA7XG5cbiAgICAgIGNvbnN0IGVudHJpZXM6IE1ldHJpY0VudHJ5W10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzZWN1cml0eS50ZWxlbWV0cnkuYmxvY2tlZF90b3RhbCcsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIGJsb2NrZWQgYXR0YWNrIGF0dGVtcHRzIHNpbmNlIHByb2Nlc3Mgc3RhcnQnLFxuICAgICAgICAgIHZhbHVlOiBtLnRvdGFsQmxvY2tlZEF0dGVtcHRzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnc2VjdXJpdHkudGVsZW1ldHJ5LnVuaXF1ZV92ZWN0b3JzJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGRpc3RpbmN0IGF0dGFjayB2ZWN0b3JzIG9ic2VydmVkJyxcbiAgICAgICAgICB2YWx1ZTogbS51bmlxdWVBdHRhY2tWZWN0b3JzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnc2VjdXJpdHkudGVsZW1ldHJ5LmJsb2NrZWRfYnlfc2V2ZXJpdHknLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdCbG9ja2VkIGF0dGFja3MgYnJva2VuIGRvd24gYnkgc2V2ZXJpdHknLFxuICAgICAgICAgIGxhYmVsczogeyBzZXZlcml0eTogJ2NyaXRpY2FsJyB9LFxuICAgICAgICAgIHZhbHVlOiBtLmNyaXRpY2FsQXR0YWNrc0Jsb2NrZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzZWN1cml0eS50ZWxlbWV0cnkuYmxvY2tlZF9ieV9zZXZlcml0eScsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Jsb2NrZWQgYXR0YWNrcyBicm9rZW4gZG93biBieSBzZXZlcml0eScsXG4gICAgICAgICAgbGFiZWxzOiB7IHNldmVyaXR5OiAnaGlnaCcgfSxcbiAgICAgICAgICB2YWx1ZTogbS5oaWdoU2V2ZXJpdHlCbG9ja2VkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnc2VjdXJpdHkudGVsZW1ldHJ5LmJsb2NrZWRfYnlfc2V2ZXJpdHknLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdCbG9ja2VkIGF0dGFja3MgYnJva2VuIGRvd24gYnkgc2V2ZXJpdHknLFxuICAgICAgICAgIGxhYmVsczogeyBzZXZlcml0eTogJ21lZGl1bScgfSxcbiAgICAgICAgICB2YWx1ZTogbS5tZWRpdW1TZXZlcml0eUJsb2NrZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzZWN1cml0eS50ZWxlbWV0cnkuYmxvY2tlZF9ieV9zZXZlcml0eScsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Jsb2NrZWQgYXR0YWNrcyBicm9rZW4gZG93biBieSBzZXZlcml0eScsXG4gICAgICAgICAgbGFiZWxzOiB7IHNldmVyaXR5OiAnbG93JyB9LFxuICAgICAgICAgIHZhbHVlOiBtLmxvd1NldmVyaXR5QmxvY2tlZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3NlY3VyaXR5LnRlbGVtZXRyeS5hdHRhY2tzX3Blcl9ob3VyJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQXR0YWNrIGF0dGVtcHRzIHJlY29yZGVkIGluIHRoZSBjdXJyZW50IGNsb2NrIGhvdXInLFxuICAgICAgICAgIHZhbHVlOiBhdHRhY2tzVGhpc0hvdXIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzZWN1cml0eS50ZWxlbWV0cnkuZGVkdXBfc3VwcHJlc3NlZCcsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlcGVhdGVkIGV2ZW50cyBzdXBwcmVzc2VkIGJ5IGRlZHVwbGljYXRpb24nLFxuICAgICAgICAgIHZhbHVlOiBtLmRlZHVwbGljYXRpb24uc3VwcHJlc3NlZEV2ZW50cyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3NlY3VyaXR5LnRlbGVtZXRyeS5kZWR1cF91bmlxdWUnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdVbmlxdWUgZXZlbnRzIHRoYXQgcGFzc2VkIHRocm91Z2ggZGVkdXBsaWNhdGlvbicsXG4gICAgICAgICAgdmFsdWU6IG0uZGVkdXBsaWNhdGlvbi51bmlxdWVFdmVudHMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzZWN1cml0eS50ZWxlbWV0cnkuZGVkdXBfY2FjaGVfc2l6ZScsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0N1cnJlbnQgZGVkdXBsaWNhdGlvbiBjYWNoZSBzaXplJyxcbiAgICAgICAgICB2YWx1ZTogbS5kZWR1cGxpY2F0aW9uLmNhY2hlU2l6ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Collector for TriggerMetricsTracker metrics.
3
+ *
4
+ * Exposes the number of pending trigger metric entries that have not yet
5
+ * been flushed, sourced from `TriggerMetricsTracker.pendingCount`.
6
+ */
7
+ import type { IMetricCollector, MetricEntry } from '../types.js';
8
+ import type { TriggerMetricsTracker } from '../../portfolio/enhanced-index/TriggerMetricsTracker.js';
9
+ export declare class TriggerMetricsTrackerCollector implements IMetricCollector {
10
+ private readonly tracker;
11
+ readonly name = "trigger-metrics";
12
+ readonly description = "Pending trigger metric count from TriggerMetricsTracker.";
13
+ constructor(tracker: TriggerMetricsTracker);
14
+ collect(): MetricEntry[];
15
+ }
16
+ //# sourceMappingURL=TriggerMetricsTrackerCollector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerMetricsTrackerCollector.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/TriggerMetricsTrackerCollector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yDAAyD,CAAC;AAErG,qBAAa,8BAA+B,YAAW,gBAAgB;IAIzD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,WAAW,8DAA8D;gBAErD,OAAO,EAAE,qBAAqB;IAE3D,OAAO,IAAI,WAAW,EAAE;CAgBzB"}
@@ -0,0 +1,26 @@
1
+ export class TriggerMetricsTrackerCollector {
2
+ tracker;
3
+ name = 'trigger-metrics';
4
+ description = 'Pending trigger metric count from TriggerMetricsTracker.';
5
+ constructor(tracker) {
6
+ this.tracker = tracker;
7
+ }
8
+ collect() {
9
+ try {
10
+ return [
11
+ {
12
+ type: 'gauge',
13
+ name: 'portfolio.triggers.pending_current',
14
+ source: 'TriggerMetricsTracker',
15
+ unit: 'count',
16
+ description: 'Number of trigger metric entries pending flush.',
17
+ value: this.tracker.pendingCount,
18
+ },
19
+ ];
20
+ }
21
+ catch {
22
+ return [];
23
+ }
24
+ }
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJpZ2dlck1ldHJpY3NUcmFja2VyQ29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21ldHJpY3MvY29sbGVjdG9ycy9UcmlnZ2VyTWV0cmljc1RyYWNrZXJDb2xsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxPQUFPLDhCQUE4QjtJQUlaO0lBSHBCLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUN6QixXQUFXLEdBQUcsMERBQTBELENBQUM7SUFFbEYsWUFBNkIsT0FBOEI7UUFBOUIsWUFBTyxHQUFQLE9BQU8sQ0FBdUI7SUFBRyxDQUFDO0lBRS9ELE9BQU87UUFDTCxJQUFJLENBQUM7WUFDSCxPQUFPO2dCQUNMO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLG9DQUFvQztvQkFDMUMsTUFBTSxFQUFFLHVCQUF1QjtvQkFDL0IsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsaURBQWlEO29CQUM5RCxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZO2lCQUNqQzthQUNGLENBQUM7UUFDSixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb2xsZWN0b3IgZm9yIFRyaWdnZXJNZXRyaWNzVHJhY2tlciBtZXRyaWNzLlxuICpcbiAqIEV4cG9zZXMgdGhlIG51bWJlciBvZiBwZW5kaW5nIHRyaWdnZXIgbWV0cmljIGVudHJpZXMgdGhhdCBoYXZlIG5vdCB5ZXRcbiAqIGJlZW4gZmx1c2hlZCwgc291cmNlZCBmcm9tIGBUcmlnZ2VyTWV0cmljc1RyYWNrZXIucGVuZGluZ0NvdW50YC5cbiAqL1xuaW1wb3J0IHR5cGUgeyBJTWV0cmljQ29sbGVjdG9yLCBNZXRyaWNFbnRyeSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgVHJpZ2dlck1ldHJpY3NUcmFja2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL2VuaGFuY2VkLWluZGV4L1RyaWdnZXJNZXRyaWNzVHJhY2tlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmlnZ2VyTWV0cmljc1RyYWNrZXJDb2xsZWN0b3IgaW1wbGVtZW50cyBJTWV0cmljQ29sbGVjdG9yIHtcbiAgcmVhZG9ubHkgbmFtZSA9ICd0cmlnZ2VyLW1ldHJpY3MnO1xuICByZWFkb25seSBkZXNjcmlwdGlvbiA9ICdQZW5kaW5nIHRyaWdnZXIgbWV0cmljIGNvdW50IGZyb20gVHJpZ2dlck1ldHJpY3NUcmFja2VyLic7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0cmFja2VyOiBUcmlnZ2VyTWV0cmljc1RyYWNrZXIpIHt9XG5cbiAgY29sbGVjdCgpOiBNZXRyaWNFbnRyeVtdIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3BvcnRmb2xpby50cmlnZ2Vycy5wZW5kaW5nX2N1cnJlbnQnLFxuICAgICAgICAgIHNvdXJjZTogJ1RyaWdnZXJNZXRyaWNzVHJhY2tlcicsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiB0cmlnZ2VyIG1ldHJpYyBlbnRyaWVzIHBlbmRpbmcgZmx1c2guJyxcbiAgICAgICAgICB2YWx1ZTogdGhpcy50cmFja2VyLnBlbmRpbmdDb3VudCxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,11 @@
1
+ export { PerformanceMonitorCollector } from './PerformanceMonitorCollector.js';
2
+ export { LRUCacheCollector } from './LRUCacheCollector.js';
3
+ export { SecurityMonitorCollector } from './SecurityMonitorCollector.js';
4
+ export { SecurityTelemetryCollector } from './SecurityTelemetryCollector.js';
5
+ export { FileLockManagerCollector } from './FileLockManagerCollector.js';
6
+ export { DefaultElementProviderCollector } from './DefaultElementProviderCollector.js';
7
+ export { TriggerMetricsTrackerCollector } from './TriggerMetricsTrackerCollector.js';
8
+ export { OperationalTelemetryCollector } from './OperationalTelemetryCollector.js';
9
+ export { OperationMetricsCollector } from './OperationMetricsCollector.js';
10
+ export { GatekeeperMetricsCollector } from './GatekeeperMetricsCollector.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { PerformanceMonitorCollector } from './PerformanceMonitorCollector.js';
2
+ export { LRUCacheCollector } from './LRUCacheCollector.js';
3
+ export { SecurityMonitorCollector } from './SecurityMonitorCollector.js';
4
+ export { SecurityTelemetryCollector } from './SecurityTelemetryCollector.js';
5
+ export { FileLockManagerCollector } from './FileLockManagerCollector.js';
6
+ export { DefaultElementProviderCollector } from './DefaultElementProviderCollector.js';
7
+ export { TriggerMetricsTrackerCollector } from './TriggerMetricsTrackerCollector.js';
8
+ export { OperationalTelemetryCollector } from './OperationalTelemetryCollector.js';
9
+ export { OperationMetricsCollector } from './OperationMetricsCollector.js';
10
+ export { GatekeeperMetricsCollector } from './GatekeeperMetricsCollector.js';
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0cmljcy9jb2xsZWN0b3JzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgUGVyZm9ybWFuY2VNb25pdG9yQ29sbGVjdG9yIH0gZnJvbSAnLi9QZXJmb3JtYW5jZU1vbml0b3JDb2xsZWN0b3IuanMnO1xuZXhwb3J0IHsgTFJVQ2FjaGVDb2xsZWN0b3IgfSBmcm9tICcuL0xSVUNhY2hlQ29sbGVjdG9yLmpzJztcbmV4cG9ydCB7IFNlY3VyaXR5TW9uaXRvckNvbGxlY3RvciB9IGZyb20gJy4vU2VjdXJpdHlNb25pdG9yQ29sbGVjdG9yLmpzJztcbmV4cG9ydCB7IFNlY3VyaXR5VGVsZW1ldHJ5Q29sbGVjdG9yIH0gZnJvbSAnLi9TZWN1cml0eVRlbGVtZXRyeUNvbGxlY3Rvci5qcyc7XG5leHBvcnQgeyBGaWxlTG9ja01hbmFnZXJDb2xsZWN0b3IgfSBmcm9tICcuL0ZpbGVMb2NrTWFuYWdlckNvbGxlY3Rvci5qcyc7XG5leHBvcnQgeyBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29sbGVjdG9yIH0gZnJvbSAnLi9EZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29sbGVjdG9yLmpzJztcbmV4cG9ydCB7IFRyaWdnZXJNZXRyaWNzVHJhY2tlckNvbGxlY3RvciB9IGZyb20gJy4vVHJpZ2dlck1ldHJpY3NUcmFja2VyQ29sbGVjdG9yLmpzJztcbmV4cG9ydCB7IE9wZXJhdGlvbmFsVGVsZW1ldHJ5Q29sbGVjdG9yIH0gZnJvbSAnLi9PcGVyYXRpb25hbFRlbGVtZXRyeUNvbGxlY3Rvci5qcyc7XG5leHBvcnQgeyBPcGVyYXRpb25NZXRyaWNzQ29sbGVjdG9yIH0gZnJvbSAnLi9PcGVyYXRpb25NZXRyaWNzQ29sbGVjdG9yLmpzJztcbmV4cG9ydCB7IEdhdGVrZWVwZXJNZXRyaWNzQ29sbGVjdG9yIH0gZnJvbSAnLi9HYXRla2VlcGVyTWV0cmljc0NvbGxlY3Rvci5qcyc7XG4iXX0=
@@ -0,0 +1,22 @@
1
+ /**
2
+ * In-memory ring buffer sink for metric snapshots.
3
+ *
4
+ * Stores snapshots in an EvictingQueue and provides a query interface
5
+ * for the MCP query_metrics tool. Follows the same query pattern as
6
+ * MemoryLogSink (see src/logging/sinks/MemoryLogSink.ts).
7
+ */
8
+ import type { IMetricsSink, MetricQueryOptions, MetricQueryResult, MetricSnapshot } from '../types.js';
9
+ export declare class MemoryMetricsSink implements IMetricsSink {
10
+ readonly name = "MemoryMetricsSink";
11
+ private readonly queue;
12
+ constructor(maxSnapshots?: number);
13
+ onSnapshot(snapshot: MetricSnapshot): void;
14
+ flush(): Promise<void>;
15
+ close(): Promise<void>;
16
+ query(options?: MetricQueryOptions): MetricQueryResult;
17
+ getStats(): {
18
+ size: number;
19
+ capacity: number;
20
+ };
21
+ }
22
+ //# sourceMappingURL=MemoryMetricsSink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryMetricsSink.d.ts","sourceRoot":"","sources":["../../../src/metrics/sinks/MemoryMetricsSink.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,YAAY,EAEZ,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,qBAAa,iBAAkB,YAAW,YAAY;IACpD,QAAQ,CAAC,IAAI,uBAAuB;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;gBAE1C,YAAY,GAAE,MAAY;IAItC,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAIpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,KAAK,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,iBAAiB;IA4EtD,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAG/C"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * In-memory ring buffer sink for metric snapshots.
3
+ *
4
+ * Stores snapshots in an EvictingQueue and provides a query interface
5
+ * for the MCP query_metrics tool. Follows the same query pattern as
6
+ * MemoryLogSink (see src/logging/sinks/MemoryLogSink.ts).
7
+ */
8
+ import { EvictingQueue } from '../../utils/EvictingQueue.js';
9
+ export class MemoryMetricsSink {
10
+ name = 'MemoryMetricsSink';
11
+ queue;
12
+ constructor(maxSnapshots = 240) {
13
+ this.queue = new EvictingQueue(maxSnapshots);
14
+ }
15
+ onSnapshot(snapshot) {
16
+ this.queue.push(snapshot);
17
+ }
18
+ async flush() {
19
+ // No-op — in-memory, nothing to flush.
20
+ }
21
+ async close() {
22
+ this.queue.clear();
23
+ }
24
+ query(options) {
25
+ const latest = options?.latest ?? true;
26
+ const limit = Math.min(Math.max(options?.limit ?? 1, 0), 100);
27
+ const offset = Math.max(options?.offset ?? 0, 0);
28
+ const allSnapshots = this.queue.toArray();
29
+ // Compute availability bounds BEFORE filtering
30
+ const oldestAvailable = allSnapshots.length > 0 ? allSnapshots[0].timestamp : '';
31
+ const newestAvailable = allSnapshots.length > 0 ? allSnapshots.at(-1).timestamp : '';
32
+ // If limit is 0, return empty result with bounds
33
+ if (limit === 0) {
34
+ return {
35
+ snapshots: [],
36
+ total: 0,
37
+ hasMore: false,
38
+ limit,
39
+ offset,
40
+ oldestAvailable,
41
+ newestAvailable,
42
+ };
43
+ }
44
+ // 1. Select snapshots based on latest flag
45
+ let snapshots;
46
+ if (latest) {
47
+ snapshots = allSnapshots.length > 0 ? [allSnapshots.at(-1)] : [];
48
+ }
49
+ else {
50
+ snapshots = [...allSnapshots];
51
+ }
52
+ // 2. Filter by time range
53
+ if (options?.since) {
54
+ const since = options.since;
55
+ snapshots = snapshots.filter(s => s.timestamp > since);
56
+ }
57
+ if (options?.until) {
58
+ const until = options.until;
59
+ snapshots = snapshots.filter(s => s.timestamp < until);
60
+ }
61
+ // 3. Filter metrics within each snapshot by name/source/type
62
+ if (options?.names || options?.source || options?.type) {
63
+ const filtered = [];
64
+ for (const snapshot of snapshots) {
65
+ const matchedMetrics = snapshot.metrics.filter(metric => matchesMetricFilters(metric, options));
66
+ if (matchedMetrics.length > 0) {
67
+ filtered.push({ ...snapshot, metrics: matchedMetrics });
68
+ }
69
+ }
70
+ snapshots = filtered;
71
+ }
72
+ // 4. Sort newest-first (descending timestamp)
73
+ snapshots.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
74
+ // 5. Count total before pagination
75
+ const total = snapshots.length;
76
+ // 6. Paginate
77
+ snapshots = snapshots.slice(offset, offset + limit);
78
+ return {
79
+ snapshots,
80
+ total,
81
+ hasMore: offset + limit < total,
82
+ limit,
83
+ offset,
84
+ oldestAvailable,
85
+ newestAvailable,
86
+ };
87
+ }
88
+ getStats() {
89
+ return { size: this.queue.size, capacity: this.queue.capacity };
90
+ }
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Internal helpers
94
+ // ---------------------------------------------------------------------------
95
+ function matchesMetricFilters(metric, options) {
96
+ // Name filter: prefix match if ends with '.' or '.*', else exact match
97
+ if (options.names && options.names.length > 0) {
98
+ const matched = options.names.some(name => {
99
+ if (name.endsWith('.') || name.endsWith('.*')) {
100
+ const prefix = name.endsWith('.*') ? name.slice(0, -1) : name;
101
+ return metric.name.startsWith(prefix);
102
+ }
103
+ return metric.name === name;
104
+ });
105
+ if (!matched)
106
+ return false;
107
+ }
108
+ // Source filter: case-insensitive substring match
109
+ if (options.source) {
110
+ const needle = options.source.toLowerCase();
111
+ if (!metric.source.toLowerCase().includes(needle))
112
+ return false;
113
+ }
114
+ // Type filter: exact match
115
+ if (options.type) {
116
+ if (metric.type !== options.type)
117
+ return false;
118
+ }
119
+ return true;
120
+ }
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5TWV0cmljc1NpbmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFTN0QsTUFBTSxPQUFPLGlCQUFpQjtJQUNuQixJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDbkIsS0FBSyxDQUFnQztJQUV0RCxZQUFZLGVBQXVCLEdBQUc7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLGFBQWEsQ0FBaUIsWUFBWSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELFVBQVUsQ0FBQyxRQUF3QjtRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCx1Q0FBdUM7SUFDekMsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQTRCO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWpELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFMUMsK0NB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SUFDbEQsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDbEUsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUNqRCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbi1tZW1vcnkgcmluZyBidWZmZXIgc2luayBmb3IgbWV0cmljIHNuYXBzaG90cy5cbiAqXG4gKiBTdG9yZXMgc25hcHNob3RzIGluIGFuIEV2aWN0aW5nUXVldWUgYW5kIHByb3ZpZGVzIGEgcXVlcnkgaW50ZXJmYWNlXG4gKiBmb3IgdGhlIE1DUCBxdWVyeV9tZXRyaWNzIHRvb2wuIEZvbGxvd3MgdGhlIHNhbWUgcXVlcnkgcGF0dGVybiBhc1xuICogTWVtb3J5TG9nU2luayAoc2VlIHNyYy9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsudHMpLlxuICovXG5cbmltcG9ydCB7IEV2aWN0aW5nUXVldWUgfSBmcm9tICcuLi8uLi91dGlscy9FdmljdGluZ1F1ZXVlLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSU1ldHJpY3NTaW5rLFxuICBNZXRyaWNFbnRyeSxcbiAgTWV0cmljUXVlcnlPcHRpb25zLFxuICBNZXRyaWNRdWVyeVJlc3VsdCxcbiAgTWV0cmljU25hcHNob3QsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIE1lbW9yeU1ldHJpY3NTaW5rIGltcGxlbWVudHMgSU1ldHJpY3NTaW5rIHtcbiAgcmVhZG9ubHkgbmFtZSA9ICdNZW1vcnlNZXRyaWNzU2luayc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IEV2aWN0aW5nUXVldWU8TWV0cmljU25hcHNob3Q+O1xuXG4gIGNvbnN0cnVjdG9yKG1heFNuYXBzaG90czogbnVtYmVyID0gMjQwKSB7XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBFdmljdGluZ1F1ZXVlPE1ldHJpY1NuYXBzaG90PihtYXhTbmFwc2hvdHMpO1xuICB9XG5cbiAgb25TbmFwc2hvdChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXVlLnB1c2goc25hcHNob3QpO1xuICB9XG5cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTm8tb3Ag4oCUIGluLW1lbW9yeSwgbm90aGluZyB0byBmbHVzaC5cbiAgfVxuXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucXVldWUuY2xlYXIoKTtcbiAgfVxuXG4gIHF1ZXJ5KG9wdGlvbnM/OiBNZXRyaWNRdWVyeU9wdGlvbnMpOiBNZXRyaWNRdWVyeVJlc3VsdCB7XG4gICAgY29uc3QgbGF0ZXN0ID0gb3B0aW9ucz8ubGF0ZXN0ID8/IHRydWU7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihNYXRoLm1heChvcHRpb25zPy5saW1pdCA/PyAxLCAwKSwgMTAwKTtcbiAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heChvcHRpb25zPy5vZmZzZXQgPz8gMCwgMCk7XG5cbiAgICBjb25zdCBhbGxTbmFwc2hvdHMgPSB0aGlzLnF1ZXVlLnRvQXJyYXkoKTtcblxuICAgIC8vIENvbXB1dGUgYXZhaWxhYmlsaXR5IGJvdW5kcyBCRUZPUkUgZmlsdGVyaW5nXG4gICAgY29uc3Qgb2xkZXN0QXZhaWxhYmxlID0gYWxsU25hcHNob3RzLmxlbmd0aCA+IDAgPyBhbGxTbmFwc2hvdHNbMF0udGltZXN0YW1wIDogJyc7XG4gICAgY29uc3QgbmV3ZXN0QXZhaWxhYmxlID0gYWxsU25hcHNob3RzLmxlbmd0aCA+IDAgPyBhbGxTbmFwc2hvdHMuYXQoLTEpIS50aW1lc3RhbXAgOiAnJztcblxuICAgIC8vIElmIGxpbWl0IGlzIDAsIHJldHVybiBlbXB0eSByZXN1bHQgd2l0aCBib3VuZHNcbiAgICBpZiAobGltaXQgPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNuYXBzaG90czogW10sXG4gICAgICAgIHRvdGFsOiAwLFxuICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb2xkZXN0QXZhaWxhYmxlLFxuICAgICAgICBuZXdlc3RBdmFpbGFibGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIDEuIFNlbGVjdCBzbmFwc2hvdHMgYmFzZWQgb24gbGF0ZXN0IGZsYWdcbiAgICBsZXQgc25hcHNob3RzOiBNZXRyaWNTbmFwc2hvdFtdO1xuICAgIGlmIChsYXRlc3QpIHtcbiAgICAgIHNuYXBzaG90cyA9IGFsbFNuYXBzaG90cy5sZW5ndGggPiAwID8gW2FsbFNuYXBzaG90cy5hdCgtMSkhXSA6IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFwc2hvdHMgPSBbLi4uYWxsU25hcHNob3RzXTtcbiAgICB9XG5cbiAgICAvLyAyLiBGaWx0ZXIgYnkgdGltZSByYW5nZVxuICAgIGlmIChvcHRpb25zPy5zaW5jZSkge1xuICAgICAgY29uc3Qgc2luY2UgPSBvcHRpb25zLnNpbmNlO1xuICAgICAgc25hcHNob3RzID0gc25hcHNob3RzLmZpbHRlcihzID0+IHMudGltZXN0YW1wID4gc2luY2UpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8udW50aWwpIHtcbiAgICAgIGNvbnN0IHVudGlsID0gb3B0aW9ucy51bnRpbDtcbiAgICAgIHNuYXBzaG90cyA9IHNuYXBzaG90cy5maWx0ZXIocyA9PiBzLnRpbWVzdGFtcCA8IHVudGlsKTtcbiAgICB9XG5cbiAgICAvLyAzLiBGaWx0ZXIgbWV0cmljcyB3aXRoaW4gZWFjaCBzbmFwc2hvdCBieSBuYW1lL3NvdXJjZS90eXBlXG4gICAgaWYgKG9wdGlvbnM/Lm5hbWVzIHx8IG9wdGlvbnM/LnNvdXJjZSB8fCBvcHRpb25zPy50eXBlKSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZDogTWV0cmljU25hcHNob3RbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBzbmFwc2hvdCBvZiBzbmFwc2hvdHMpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZE1ldHJpY3MgPSBzbmFwc2hvdC5tZXRyaWNzLmZpbHRlcihtZXRyaWMgPT5cbiAgICAgICAgICBtYXRjaGVzTWV0cmljRmlsdGVycyhtZXRyaWMsIG9wdGlvbnMpLFxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2hlZE1ldHJpY3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZpbHRlcmVkLnB1c2goeyAuLi5zbmFwc2hvdCwgbWV0cmljczogbWF0Y2hlZE1ldHJpY3MgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNuYXBzaG90cyA9IGZpbHRlcmVkO1xuICAgIH1cblxuICAgIC8vIDQuIFNvcnQgbmV3ZXN0LWZpcnN0IChkZXNjZW5kaW5nIHRpbWVzdGFtcClcbiAgICBzbmFwc2hvdHMuc29ydCgoYSwgYikgPT4gYi50aW1lc3RhbXAubG9jYWxlQ29tcGFyZShhLnRpbWVzdGFtcCkpO1xuXG4gICAgLy8gNS4gQ291bnQgdG90YWwgYmVmb3JlIHBhZ2luYXRpb25cbiAgICBjb25zdCB0b3RhbCA9IHNuYXBzaG90cy5sZW5ndGg7XG5cbiAgICAvLyA2LiBQYWdpbmF0ZVxuICAgIHNuYXBzaG90cyA9IHNuYXBzaG90cy5zbGljZShvZmZzZXQsIG9mZnNldCArIGxpbWl0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzbmFwc2hvdHMsXG4gICAgICB0b3RhbCxcbiAgICAgIGhhc01vcmU6IG9mZnNldCArIGxpbWl0IDwgdG90YWwsXG4gICAgICBsaW1pdCxcbiAgICAgIG9mZnNldCxcbiAgICAgIG9sZGVzdEF2YWlsYWJsZSxcbiAgICAgIG5ld2VzdEF2YWlsYWJsZSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogeyBzaXplOiBudW1iZXI7IGNhcGFjaXR5OiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHsgc2l6ZTogdGhpcy5xdWV1ZS5zaXplLCBjYXBhY2l0eTogdGhpcy5xdWV1ZS5jYXBhY2l0eSB9O1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW50ZXJuYWwgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIG1hdGNoZXNNZXRyaWNGaWx0ZXJzKFxuICBtZXRyaWM6IE1ldHJpY0VudHJ5LFxuICBvcHRpb25zOiBNZXRyaWNRdWVyeU9wdGlvbnMsXG4pOiBib29sZWFuIHtcbiAgLy8gTmFtZSBmaWx0ZXI6IHByZWZpeCBtYXRjaCBpZiBlbmRzIHdpdGggJy4nIG9yICcuKicsIGVsc2UgZXhhY3QgbWF0Y2hcbiAgaWYgKG9wdGlvbnMubmFtZXMgJiYgb3B0aW9ucy5uYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IG9wdGlvbnMubmFtZXMuc29tZShuYW1lID0+IHtcbiAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCcuJykgfHwgbmFtZS5lbmRzV2l0aCgnLionKSkge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBuYW1lLmVuZHNXaXRoKCcuKicpID8gbmFtZS5zbGljZSgwLCAtMSkgOiBuYW1lO1xuICAgICAgICByZXR1cm4gbWV0cmljLm5hbWUuc3RhcnRzV2l0aChwcmVmaXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ldHJpYy5uYW1lID09PSBuYW1lO1xuICAgIH0pO1xuICAgIGlmICghbWF0Y2hlZCkgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gU291cmNlIGZpbHRlcjogY2FzZS1pbnNlbnNpdGl2ZSBzdWJzdHJpbmcgbWF0Y2hcbiAgaWYgKG9wdGlvbnMuc291cmNlKSB7XG4gICAgY29uc3QgbmVlZGxlID0gb3B0aW9ucy5zb3VyY2UudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIW1ldHJpYy5zb3VyY2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuZWVkbGUpKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBUeXBlIGZpbHRlcjogZXhhY3QgbWF0Y2hcbiAgaWYgKG9wdGlvbnMudHlwZSkge1xuICAgIGlmIChtZXRyaWMudHlwZSAhPT0gb3B0aW9ucy50eXBlKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Core types for the Metrics Collection System.
3
+ *
4
+ * These types are shared across the MetricsManager, all sinks, and all collectors.
5
+ */
6
+ export type MetricType = 'counter' | 'gauge' | 'histogram';
7
+ export type MetricUnit = 'count' | 'bytes' | 'milliseconds' | 'seconds' | 'percent' | 'ratio' | 'operations' | 'megabytes' | 'none';
8
+ export interface BaseMetricEntry {
9
+ readonly name: string;
10
+ readonly source: string;
11
+ readonly unit: MetricUnit;
12
+ readonly description?: string;
13
+ readonly labels?: Readonly<Record<string, string>>;
14
+ }
15
+ export interface CounterEntry extends BaseMetricEntry {
16
+ readonly type: 'counter';
17
+ readonly value: number;
18
+ }
19
+ export interface GaugeEntry extends BaseMetricEntry {
20
+ readonly type: 'gauge';
21
+ readonly value: number;
22
+ }
23
+ export interface HistogramValue {
24
+ readonly count: number;
25
+ readonly sum: number;
26
+ readonly min?: number;
27
+ readonly max?: number;
28
+ readonly avg?: number;
29
+ readonly p50?: number;
30
+ readonly p75?: number;
31
+ readonly p90?: number;
32
+ readonly p95?: number;
33
+ readonly p99?: number;
34
+ }
35
+ export interface HistogramEntry extends BaseMetricEntry {
36
+ readonly type: 'histogram';
37
+ readonly value: HistogramValue;
38
+ }
39
+ export type MetricEntry = CounterEntry | GaugeEntry | HistogramEntry;
40
+ export interface MetricSnapshot {
41
+ readonly id: string;
42
+ readonly timestamp: string;
43
+ readonly metrics: readonly MetricEntry[];
44
+ readonly errors: readonly string[];
45
+ readonly durationMs: number;
46
+ }
47
+ export interface IMetricCollector {
48
+ readonly name: string;
49
+ readonly description: string;
50
+ collect(): MetricEntry[] | Promise<MetricEntry[]>;
51
+ }
52
+ export interface IMetricsSink {
53
+ readonly name: string;
54
+ onSnapshot(snapshot: MetricSnapshot): void;
55
+ flush(): Promise<void>;
56
+ close(): Promise<void>;
57
+ }
58
+ export interface MetricQueryOptions {
59
+ names?: string[];
60
+ source?: string;
61
+ type?: MetricType;
62
+ since?: string;
63
+ until?: string;
64
+ latest?: boolean;
65
+ limit?: number;
66
+ offset?: number;
67
+ }
68
+ export interface MetricQueryResult {
69
+ readonly snapshots: readonly MetricSnapshot[];
70
+ readonly total: number;
71
+ readonly hasMore: boolean;
72
+ readonly limit: number;
73
+ readonly offset: number;
74
+ readonly oldestAvailable: string;
75
+ readonly newestAvailable: string;
76
+ }
77
+ export interface MetricsManagerConfig {
78
+ readonly enabled: boolean;
79
+ readonly collectionIntervalMs: number;
80
+ readonly maxSnapshotSize: number;
81
+ readonly collectorFailureThreshold: number;
82
+ readonly collectionDurationWarnMs: number;
83
+ readonly memorySnapshotCapacity: number;
84
+ }
85
+ /**
86
+ * Map the flat env object (from Zod-parsed `process.env`) to a typed
87
+ * `MetricsManagerConfig`. Keeps the mapping in one place so the DI container
88
+ * only needs `buildMetricsManagerConfig(env)`.
89
+ */
90
+ export declare function buildMetricsManagerConfig(envVars: {
91
+ DOLLHOUSE_METRICS_ENABLED: boolean;
92
+ DOLLHOUSE_METRICS_COLLECTION_INTERVAL_MS: number;
93
+ DOLLHOUSE_METRICS_MAX_SNAPSHOT_SIZE: number;
94
+ DOLLHOUSE_METRICS_COLLECTOR_FAILURE_THRESHOLD: number;
95
+ DOLLHOUSE_METRICS_COLLECTION_DURATION_WARN_MS: number;
96
+ DOLLHOUSE_METRICS_MEMORY_SNAPSHOT_CAPACITY: number;
97
+ }): MetricsManagerConfig;
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metrics/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Core types for the Metrics Collection System.
3
+ *
4
+ * These types are shared across the MetricsManager, all sinks, and all collectors.
5
+ */
6
+ // ---------------------------------------------------------------------------
7
+ // Helper: build config from env vars
8
+ // ---------------------------------------------------------------------------
9
+ /**
10
+ * Map the flat env object (from Zod-parsed `process.env`) to a typed
11
+ * `MetricsManagerConfig`. Keeps the mapping in one place so the DI container
12
+ * only needs `buildMetricsManagerConfig(env)`.
13
+ */
14
+ export function buildMetricsManagerConfig(envVars) {
15
+ return {
16
+ enabled: envVars.DOLLHOUSE_METRICS_ENABLED,
17
+ collectionIntervalMs: envVars.DOLLHOUSE_METRICS_COLLECTION_INTERVAL_MS,
18
+ maxSnapshotSize: envVars.DOLLHOUSE_METRICS_MAX_SNAPSHOT_SIZE,
19
+ collectorFailureThreshold: envVars.DOLLHOUSE_METRICS_COLLECTOR_FAILURE_THRESHOLD,
20
+ collectionDurationWarnMs: envVars.DOLLHOUSE_METRICS_COLLECTION_DURATION_WARN_MS,
21
+ memorySnapshotCapacity: envVars.DOLLHOUSE_METRICS_MEMORY_SNAPSHOT_CAPACITY,
22
+ };
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0cmljcy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBZ0lILDhFQUE4RTtBQUM5RSxxQ0FBcUM7QUFDckMsOEVBQThFO0FBRTlFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsT0FPekM7SUFDQyxPQUFPO1FBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyx5QkFBeUI7UUFDMUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLHdDQUF3QztRQUN0RSxlQUFlLEVBQUUsT0FBTyxDQUFDLG1DQUFtQztRQUM1RCx5QkFBeUIsRUFBRSxPQUFPLENBQUMsNkNBQTZDO1FBQ2hGLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyw2Q0FBNkM7UUFDL0Usc0JBQXNCLEVBQUUsT0FBTyxDQUFDLDBDQUEwQztLQUMzRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29yZSB0eXBlcyBmb3IgdGhlIE1ldHJpY3MgQ29sbGVjdGlvbiBTeXN0ZW0uXG4gKlxuICogVGhlc2UgdHlwZXMgYXJlIHNoYXJlZCBhY3Jvc3MgdGhlIE1ldHJpY3NNYW5hZ2VyLCBhbGwgc2lua3MsIGFuZCBhbGwgY29sbGVjdG9ycy5cbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1ldHJpYyB0eXBlICYgdW5pdFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIE1ldHJpY1R5cGUgPSAnY291bnRlcicgfCAnZ2F1Z2UnIHwgJ2hpc3RvZ3JhbSc7XG5cbmV4cG9ydCB0eXBlIE1ldHJpY1VuaXQgPVxuICB8ICdjb3VudCdcbiAgfCAnYnl0ZXMnXG4gIHwgJ21pbGxpc2Vjb25kcydcbiAgfCAnc2Vjb25kcydcbiAgfCAncGVyY2VudCdcbiAgfCAncmF0aW8nXG4gIHwgJ29wZXJhdGlvbnMnXG4gIHwgJ21lZ2FieXRlcydcbiAgfCAnbm9uZSc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWV0cmljIGVudHJpZXMgKGRpc2NyaW1pbmF0ZWQgdW5pb24gb24gYHR5cGVgKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZU1ldHJpY0VudHJ5IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgdW5pdDogTWV0cmljVW5pdDtcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxhYmVscz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvdW50ZXJFbnRyeSBleHRlbmRzIEJhc2VNZXRyaWNFbnRyeSB7XG4gIHJlYWRvbmx5IHR5cGU6ICdjb3VudGVyJztcbiAgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHYXVnZUVudHJ5IGV4dGVuZHMgQmFzZU1ldHJpY0VudHJ5IHtcbiAgcmVhZG9ubHkgdHlwZTogJ2dhdWdlJztcbiAgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIaXN0b2dyYW1WYWx1ZSB7XG4gIHJlYWRvbmx5IGNvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IHN1bTogbnVtYmVyO1xuICByZWFkb25seSBtaW4/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heD86IG51bWJlcjtcbiAgcmVhZG9ubHkgYXZnPzogbnVtYmVyO1xuICByZWFkb25seSBwNTA/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHA3NT86IG51bWJlcjtcbiAgcmVhZG9ubHkgcDkwPzogbnVtYmVyO1xuICByZWFkb25seSBwOTU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHA5OT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIaXN0b2dyYW1FbnRyeSBleHRlbmRzIEJhc2VNZXRyaWNFbnRyeSB7XG4gIHJlYWRvbmx5IHR5cGU6ICdoaXN0b2dyYW0nO1xuICByZWFkb25seSB2YWx1ZTogSGlzdG9ncmFtVmFsdWU7XG59XG5cbmV4cG9ydCB0eXBlIE1ldHJpY0VudHJ5ID0gQ291bnRlckVudHJ5IHwgR2F1Z2VFbnRyeSB8IEhpc3RvZ3JhbUVudHJ5O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNuYXBzaG90XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRpbWVzdGFtcDogc3RyaW5nO1xuICByZWFkb25seSBtZXRyaWNzOiByZWFkb25seSBNZXRyaWNFbnRyeVtdO1xuICByZWFkb25seSBlcnJvcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBkdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29sbGVjdG9yICYgU2luayBpbnRlcmZhY2VzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBJTWV0cmljQ29sbGVjdG9yIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjb2xsZWN0KCk6IE1ldHJpY0VudHJ5W10gfCBQcm9taXNlPE1ldHJpY0VudHJ5W10+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXRyaWNzU2luayB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgb25TbmFwc2hvdChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpOiB2b2lkO1xuICBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+O1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFF1ZXJ5IHR5cGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNRdWVyeU9wdGlvbnMge1xuICBuYW1lcz86IHN0cmluZ1tdO1xuICBzb3VyY2U/OiBzdHJpbmc7XG4gIHR5cGU/OiBNZXRyaWNUeXBlO1xuICBzaW5jZT86IHN0cmluZztcbiAgdW50aWw/OiBzdHJpbmc7XG4gIGxhdGVzdD86IGJvb2xlYW47XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvZmZzZXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljUXVlcnlSZXN1bHQge1xuICByZWFkb25seSBzbmFwc2hvdHM6IHJlYWRvbmx5IE1ldHJpY1NuYXBzaG90W107XG4gIHJlYWRvbmx5IHRvdGFsOiBudW1iZXI7XG4gIHJlYWRvbmx5IGhhc01vcmU6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxpbWl0OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mZnNldDogbnVtYmVyO1xuICByZWFkb25seSBvbGRlc3RBdmFpbGFibGU6IHN0cmluZztcbiAgcmVhZG9ubHkgbmV3ZXN0QXZhaWxhYmxlOiBzdHJpbmc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uZmlndXJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljc01hbmFnZXJDb25maWcge1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICByZWFkb25seSBjb2xsZWN0aW9uSW50ZXJ2YWxNczogbnVtYmVyO1xuICByZWFkb25seSBtYXhTbmFwc2hvdFNpemU6IG51bWJlcjtcbiAgcmVhZG9ubHkgY29sbGVjdG9yRmFpbHVyZVRocmVzaG9sZDogbnVtYmVyO1xuICByZWFkb25seSBjb2xsZWN0aW9uRHVyYXRpb25XYXJuTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVtb3J5U25hcHNob3RDYXBhY2l0eTogbnVtYmVyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhlbHBlcjogYnVpbGQgY29uZmlnIGZyb20gZW52IHZhcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIE1hcCB0aGUgZmxhdCBlbnYgb2JqZWN0IChmcm9tIFpvZC1wYXJzZWQgYHByb2Nlc3MuZW52YCkgdG8gYSB0eXBlZFxuICogYE1ldHJpY3NNYW5hZ2VyQ29uZmlnYC4gS2VlcHMgdGhlIG1hcHBpbmcgaW4gb25lIHBsYWNlIHNvIHRoZSBESSBjb250YWluZXJcbiAqIG9ubHkgbmVlZHMgYGJ1aWxkTWV0cmljc01hbmFnZXJDb25maWcoZW52KWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE1ldHJpY3NNYW5hZ2VyQ29uZmlnKGVudlZhcnM6IHtcbiAgRE9MTEhPVVNFX01FVFJJQ1NfRU5BQkxFRDogYm9vbGVhbjtcbiAgRE9MTEhPVVNFX01FVFJJQ1NfQ09MTEVDVElPTl9JTlRFUlZBTF9NUzogbnVtYmVyO1xuICBET0xMSE9VU0VfTUVUUklDU19NQVhfU05BUFNIT1RfU0laRTogbnVtYmVyO1xuICBET0xMSE9VU0VfTUVUUklDU19DT0xMRUNUT1JfRkFJTFVSRV9USFJFU0hPTEQ6IG51bWJlcjtcbiAgRE9MTEhPVVNFX01FVFJJQ1NfQ09MTEVDVElPTl9EVVJBVElPTl9XQVJOX01TOiBudW1iZXI7XG4gIERPTExIT1VTRV9NRVRSSUNTX01FTU9SWV9TTkFQU0hPVF9DQVBBQ0lUWTogbnVtYmVyO1xufSk6IE1ldHJpY3NNYW5hZ2VyQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiBlbnZWYXJzLkRPTExIT1VTRV9NRVRSSUNTX0VOQUJMRUQsXG4gICAgY29sbGVjdGlvbkludGVydmFsTXM6IGVudlZhcnMuRE9MTEhPVVNFX01FVFJJQ1NfQ09MTEVDVElPTl9JTlRFUlZBTF9NUyxcbiAgICBtYXhTbmFwc2hvdFNpemU6IGVudlZhcnMuRE9MTEhPVVNFX01FVFJJQ1NfTUFYX1NOQVBTSE9UX1NJWkUsXG4gICAgY29sbGVjdG9yRmFpbHVyZVRocmVzaG9sZDogZW52VmFycy5ET0xMSE9VU0VfTUVUUklDU19DT0xMRUNUT1JfRkFJTFVSRV9USFJFU0hPTEQsXG4gICAgY29sbGVjdGlvbkR1cmF0aW9uV2Fybk1zOiBlbnZWYXJzLkRPTExIT1VTRV9NRVRSSUNTX0NPTExFQ1RJT05fRFVSQVRJT05fV0FSTl9NUyxcbiAgICBtZW1vcnlTbmFwc2hvdENhcGFjaXR5OiBlbnZWYXJzLkRPTExIT1VTRV9NRVRSSUNTX01FTU9SWV9TTkFQU0hPVF9DQVBBQ0lUWSxcbiAgfTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultElementProvider.d.ts","sourceRoot":"","sources":["../../src/portfolio/DefaultElementProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DefaultElementProvider.d.ts","sourceRoot":"","sources":["../../src/portfolio/DefaultElementProvider.ts"],"names":[],"mappings":"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"}