@jagilber-org/index-server 1.19.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 (360) hide show
  1. package/CHANGELOG.md +1218 -0
  2. package/CODE_OF_CONDUCT.md +49 -0
  3. package/CONTRIBUTING.md +75 -0
  4. package/LICENSE +21 -0
  5. package/README.md +523 -0
  6. package/SECURITY.md +50 -0
  7. package/dist/config/configUtils.d.ts +11 -0
  8. package/dist/config/configUtils.js +87 -0
  9. package/dist/config/dashboardConfig.d.ts +45 -0
  10. package/dist/config/dashboardConfig.js +63 -0
  11. package/dist/config/defaultValues.d.ts +61 -0
  12. package/dist/config/defaultValues.js +70 -0
  13. package/dist/config/dirConstants.d.ts +17 -0
  14. package/dist/config/dirConstants.js +28 -0
  15. package/dist/config/featureConfig.d.ts +61 -0
  16. package/dist/config/featureConfig.js +121 -0
  17. package/dist/config/runtimeConfig.d.ts +145 -0
  18. package/dist/config/runtimeConfig.js +334 -0
  19. package/dist/config/serverConfig.d.ts +90 -0
  20. package/dist/config/serverConfig.js +164 -0
  21. package/dist/dashboard/analytics/AnalyticsEngine.d.ts +142 -0
  22. package/dist/dashboard/analytics/AnalyticsEngine.js +373 -0
  23. package/dist/dashboard/analytics/BusinessIntelligence.d.ts +187 -0
  24. package/dist/dashboard/analytics/BusinessIntelligence.js +594 -0
  25. package/dist/dashboard/client/admin.html +2150 -0
  26. package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/chunk-SP2CHFBE.mjs +1 -0
  27. package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/render-T6MDALS3.mjs +27 -0
  28. package/dist/dashboard/client/css/admin.css +1466 -0
  29. package/dist/dashboard/client/js/admin.boot.js +359 -0
  30. package/dist/dashboard/client/js/admin.config.js +196 -0
  31. package/dist/dashboard/client/js/admin.embeddings.js +425 -0
  32. package/dist/dashboard/client/js/admin.graph.js +583 -0
  33. package/dist/dashboard/client/js/admin.instances.js +120 -0
  34. package/dist/dashboard/client/js/admin.instructions.js +552 -0
  35. package/dist/dashboard/client/js/admin.logs.js +113 -0
  36. package/dist/dashboard/client/js/admin.maintenance.js +354 -0
  37. package/dist/dashboard/client/js/admin.messaging.js +635 -0
  38. package/dist/dashboard/client/js/admin.monitor.js +181 -0
  39. package/dist/dashboard/client/js/admin.overview.js +221 -0
  40. package/dist/dashboard/client/js/admin.performance.js +61 -0
  41. package/dist/dashboard/client/js/admin.sessions.js +293 -0
  42. package/dist/dashboard/client/js/admin.sqlite.js +366 -0
  43. package/dist/dashboard/client/js/admin.utils.js +49 -0
  44. package/dist/dashboard/client/js/chart.umd.js +14 -0
  45. package/dist/dashboard/client/js/elk.bundled.js +6696 -0
  46. package/dist/dashboard/client/js/marked.umd.js +74 -0
  47. package/dist/dashboard/client/js/mermaid.min.js +3022 -0
  48. package/dist/dashboard/client/mermaid-layout-elk.esm.min.mjs +1 -0
  49. package/dist/dashboard/export/DataExporter.d.ts +169 -0
  50. package/dist/dashboard/export/DataExporter.js +737 -0
  51. package/dist/dashboard/export/exporters/csvExporter.d.ts +11 -0
  52. package/dist/dashboard/export/exporters/csvExporter.js +46 -0
  53. package/dist/dashboard/export/exporters/exportTypes.d.ts +89 -0
  54. package/dist/dashboard/export/exporters/exportTypes.js +5 -0
  55. package/dist/dashboard/export/exporters/jsonExporter.d.ts +7 -0
  56. package/dist/dashboard/export/exporters/jsonExporter.js +22 -0
  57. package/dist/dashboard/export/exporters/xmlExporter.d.ts +17 -0
  58. package/dist/dashboard/export/exporters/xmlExporter.js +175 -0
  59. package/dist/dashboard/integration/APIIntegration.d.ts +41 -0
  60. package/dist/dashboard/integration/APIIntegration.js +95 -0
  61. package/dist/dashboard/security/SecurityMonitor.d.ts +167 -0
  62. package/dist/dashboard/security/SecurityMonitor.js +559 -0
  63. package/dist/dashboard/server/AdminPanel.d.ts +183 -0
  64. package/dist/dashboard/server/AdminPanel.js +792 -0
  65. package/dist/dashboard/server/AdminPanelConfig.d.ts +42 -0
  66. package/dist/dashboard/server/AdminPanelConfig.js +80 -0
  67. package/dist/dashboard/server/AdminPanelState.d.ts +47 -0
  68. package/dist/dashboard/server/AdminPanelState.js +214 -0
  69. package/dist/dashboard/server/ApiRoutes.d.ts +17 -0
  70. package/dist/dashboard/server/ApiRoutes.js +149 -0
  71. package/dist/dashboard/server/DashboardServer.d.ts +49 -0
  72. package/dist/dashboard/server/DashboardServer.js +159 -0
  73. package/dist/dashboard/server/FileMetricsStorage.d.ts +49 -0
  74. package/dist/dashboard/server/FileMetricsStorage.js +195 -0
  75. package/dist/dashboard/server/HttpTransport.d.ts +23 -0
  76. package/dist/dashboard/server/HttpTransport.js +116 -0
  77. package/dist/dashboard/server/InstanceManager.d.ts +53 -0
  78. package/dist/dashboard/server/InstanceManager.js +284 -0
  79. package/dist/dashboard/server/KnowledgeStore.d.ts +35 -0
  80. package/dist/dashboard/server/KnowledgeStore.js +105 -0
  81. package/dist/dashboard/server/LeaderElection.d.ts +81 -0
  82. package/dist/dashboard/server/LeaderElection.js +268 -0
  83. package/dist/dashboard/server/MetricsCollector.d.ts +200 -0
  84. package/dist/dashboard/server/MetricsCollector.js +803 -0
  85. package/dist/dashboard/server/SessionPersistenceManager.d.ts +88 -0
  86. package/dist/dashboard/server/SessionPersistenceManager.js +457 -0
  87. package/dist/dashboard/server/ThinClient.d.ts +64 -0
  88. package/dist/dashboard/server/ThinClient.js +237 -0
  89. package/dist/dashboard/server/WebSocketManager.d.ts +161 -0
  90. package/dist/dashboard/server/WebSocketManager.js +463 -0
  91. package/dist/dashboard/server/httpLifecycle.d.ts +17 -0
  92. package/dist/dashboard/server/httpLifecycle.js +35 -0
  93. package/dist/dashboard/server/legacyDashboardHtml.d.ts +9 -0
  94. package/dist/dashboard/server/legacyDashboardHtml.js +618 -0
  95. package/dist/dashboard/server/legacyDashboardStyles.d.ts +5 -0
  96. package/dist/dashboard/server/legacyDashboardStyles.js +490 -0
  97. package/dist/dashboard/server/metricsAggregation.d.ts +252 -0
  98. package/dist/dashboard/server/metricsAggregation.js +206 -0
  99. package/dist/dashboard/server/metricsSerializer.d.ts +25 -0
  100. package/dist/dashboard/server/metricsSerializer.js +195 -0
  101. package/dist/dashboard/server/routes/admin.routes.d.ts +16 -0
  102. package/dist/dashboard/server/routes/admin.routes.js +596 -0
  103. package/dist/dashboard/server/routes/alerts.routes.d.ts +7 -0
  104. package/dist/dashboard/server/routes/alerts.routes.js +93 -0
  105. package/dist/dashboard/server/routes/api.feedback.routes.d.ts +73 -0
  106. package/dist/dashboard/server/routes/api.feedback.routes.js +171 -0
  107. package/dist/dashboard/server/routes/api.instructions.routes.d.ts +101 -0
  108. package/dist/dashboard/server/routes/api.instructions.routes.js +213 -0
  109. package/dist/dashboard/server/routes/api.usage.routes.d.ts +57 -0
  110. package/dist/dashboard/server/routes/api.usage.routes.js +374 -0
  111. package/dist/dashboard/server/routes/embeddings.routes.d.ts +6 -0
  112. package/dist/dashboard/server/routes/embeddings.routes.js +246 -0
  113. package/dist/dashboard/server/routes/graph.routes.d.ts +6 -0
  114. package/dist/dashboard/server/routes/graph.routes.js +280 -0
  115. package/dist/dashboard/server/routes/index.d.ts +38 -0
  116. package/dist/dashboard/server/routes/index.js +194 -0
  117. package/dist/dashboard/server/routes/instances.routes.d.ts +6 -0
  118. package/dist/dashboard/server/routes/instances.routes.js +35 -0
  119. package/dist/dashboard/server/routes/instructions.routes.d.ts +8 -0
  120. package/dist/dashboard/server/routes/instructions.routes.js +336 -0
  121. package/dist/dashboard/server/routes/knowledge.routes.d.ts +6 -0
  122. package/dist/dashboard/server/routes/knowledge.routes.js +82 -0
  123. package/dist/dashboard/server/routes/logs.routes.d.ts +6 -0
  124. package/dist/dashboard/server/routes/logs.routes.js +164 -0
  125. package/dist/dashboard/server/routes/messaging.routes.d.ts +16 -0
  126. package/dist/dashboard/server/routes/messaging.routes.js +293 -0
  127. package/dist/dashboard/server/routes/metrics.routes.d.ts +10 -0
  128. package/dist/dashboard/server/routes/metrics.routes.js +346 -0
  129. package/dist/dashboard/server/routes/scripts.routes.d.ts +9 -0
  130. package/dist/dashboard/server/routes/scripts.routes.js +84 -0
  131. package/dist/dashboard/server/routes/sqlite.routes.d.ts +9 -0
  132. package/dist/dashboard/server/routes/sqlite.routes.js +569 -0
  133. package/dist/dashboard/server/routes/status.routes.d.ts +7 -0
  134. package/dist/dashboard/server/routes/status.routes.js +183 -0
  135. package/dist/dashboard/server/routes/synthetic.routes.d.ts +7 -0
  136. package/dist/dashboard/server/routes/synthetic.routes.js +195 -0
  137. package/dist/dashboard/server/routes/tools.routes.d.ts +6 -0
  138. package/dist/dashboard/server/routes/tools.routes.js +46 -0
  139. package/dist/dashboard/server/routes/usage.routes.d.ts +6 -0
  140. package/dist/dashboard/server/routes/usage.routes.js +25 -0
  141. package/dist/dashboard/server/wsInit.d.ts +16 -0
  142. package/dist/dashboard/server/wsInit.js +35 -0
  143. package/dist/externalClientLib.d.ts +1 -0
  144. package/dist/externalClientLib.js +2 -0
  145. package/dist/minimal/index.d.ts +1 -0
  146. package/dist/minimal/index.js +140 -0
  147. package/dist/models/SessionPersistence.d.ts +115 -0
  148. package/dist/models/SessionPersistence.js +66 -0
  149. package/dist/models/instruction.d.ts +45 -0
  150. package/dist/models/instruction.js +2 -0
  151. package/dist/perf/benchmark.d.ts +1 -0
  152. package/dist/perf/benchmark.js +50 -0
  153. package/dist/portableClientWrapper.d.ts +1 -0
  154. package/dist/portableClientWrapper.js +2 -0
  155. package/dist/schemas/index.d.ts +128 -0
  156. package/dist/schemas/index.js +371 -0
  157. package/dist/scripts/runPerformanceBaseline.d.ts +1 -0
  158. package/dist/scripts/runPerformanceBaseline.js +17 -0
  159. package/dist/server/handshakeManager.d.ts +25 -0
  160. package/dist/server/handshakeManager.js +472 -0
  161. package/dist/server/index-server.d.ts +56 -0
  162. package/dist/server/index-server.js +822 -0
  163. package/dist/server/registry.d.ts +44 -0
  164. package/dist/server/registry.js +236 -0
  165. package/dist/server/sdkServer.d.ts +8 -0
  166. package/dist/server/sdkServer.js +299 -0
  167. package/dist/server/shutdownGuard.d.ts +41 -0
  168. package/dist/server/shutdownGuard.js +52 -0
  169. package/dist/server/thin-client.d.ts +22 -0
  170. package/dist/server/thin-client.js +111 -0
  171. package/dist/server/transport.d.ts +41 -0
  172. package/dist/server/transport.js +312 -0
  173. package/dist/server/transportFactory.d.ts +21 -0
  174. package/dist/server/transportFactory.js +429 -0
  175. package/dist/services/atomicFs.d.ts +22 -0
  176. package/dist/services/atomicFs.js +103 -0
  177. package/dist/services/auditLog.d.ts +38 -0
  178. package/dist/services/auditLog.js +142 -0
  179. package/dist/services/autoBackup.d.ts +14 -0
  180. package/dist/services/autoBackup.js +171 -0
  181. package/dist/services/autoSplit.d.ts +32 -0
  182. package/dist/services/autoSplit.js +113 -0
  183. package/dist/services/backupZip.d.ts +25 -0
  184. package/dist/services/backupZip.js +110 -0
  185. package/dist/services/bootstrapGating.d.ts +123 -0
  186. package/dist/services/bootstrapGating.js +221 -0
  187. package/dist/services/canonical.d.ts +23 -0
  188. package/dist/services/canonical.js +65 -0
  189. package/dist/services/categoryRules.d.ts +7 -0
  190. package/dist/services/categoryRules.js +37 -0
  191. package/dist/services/classificationService.d.ts +42 -0
  192. package/dist/services/classificationService.js +168 -0
  193. package/dist/services/embeddingService.d.ts +62 -0
  194. package/dist/services/embeddingService.js +259 -0
  195. package/dist/services/errors.d.ts +22 -0
  196. package/dist/services/errors.js +31 -0
  197. package/dist/services/featureFlags.d.ts +25 -0
  198. package/dist/services/featureFlags.js +89 -0
  199. package/dist/services/features.d.ts +13 -0
  200. package/dist/services/features.js +35 -0
  201. package/dist/services/handlers/instructions.add.d.ts +1 -0
  202. package/dist/services/handlers/instructions.add.js +496 -0
  203. package/dist/services/handlers/instructions.groom.d.ts +1 -0
  204. package/dist/services/handlers/instructions.groom.js +523 -0
  205. package/dist/services/handlers/instructions.import.d.ts +1 -0
  206. package/dist/services/handlers/instructions.import.js +173 -0
  207. package/dist/services/handlers/instructions.patch.d.ts +1 -0
  208. package/dist/services/handlers/instructions.patch.js +167 -0
  209. package/dist/services/handlers/instructions.query.d.ts +163 -0
  210. package/dist/services/handlers/instructions.query.js +522 -0
  211. package/dist/services/handlers/instructions.reload.d.ts +1 -0
  212. package/dist/services/handlers/instructions.reload.js +13 -0
  213. package/dist/services/handlers/instructions.remove.d.ts +1 -0
  214. package/dist/services/handlers/instructions.remove.js +118 -0
  215. package/dist/services/handlers/instructions.shared.d.ts +31 -0
  216. package/dist/services/handlers/instructions.shared.js +124 -0
  217. package/dist/services/handlers.activation.d.ts +1 -0
  218. package/dist/services/handlers.activation.js +203 -0
  219. package/dist/services/handlers.bootstrap.d.ts +1 -0
  220. package/dist/services/handlers.bootstrap.js +38 -0
  221. package/dist/services/handlers.dashboardConfig.d.ts +34 -0
  222. package/dist/services/handlers.dashboardConfig.js +108 -0
  223. package/dist/services/handlers.diagnostics.d.ts +1 -0
  224. package/dist/services/handlers.diagnostics.js +64 -0
  225. package/dist/services/handlers.feedback.d.ts +15 -0
  226. package/dist/services/handlers.feedback.js +378 -0
  227. package/dist/services/handlers.gates.d.ts +1 -0
  228. package/dist/services/handlers.gates.js +46 -0
  229. package/dist/services/handlers.graph.d.ts +53 -0
  230. package/dist/services/handlers.graph.js +231 -0
  231. package/dist/services/handlers.help.d.ts +1 -0
  232. package/dist/services/handlers.help.js +119 -0
  233. package/dist/services/handlers.instructionSchema.d.ts +1 -0
  234. package/dist/services/handlers.instructionSchema.js +227 -0
  235. package/dist/services/handlers.instructions.d.ts +8 -0
  236. package/dist/services/handlers.instructions.js +14 -0
  237. package/dist/services/handlers.instructionsDiagnostics.d.ts +1 -0
  238. package/dist/services/handlers.instructionsDiagnostics.js +14 -0
  239. package/dist/services/handlers.integrity.d.ts +1 -0
  240. package/dist/services/handlers.integrity.js +35 -0
  241. package/dist/services/handlers.manifest.d.ts +1 -0
  242. package/dist/services/handlers.manifest.js +24 -0
  243. package/dist/services/handlers.messaging.d.ts +12 -0
  244. package/dist/services/handlers.messaging.js +203 -0
  245. package/dist/services/handlers.metrics.d.ts +1 -0
  246. package/dist/services/handlers.metrics.js +43 -0
  247. package/dist/services/handlers.promote.d.ts +1 -0
  248. package/dist/services/handlers.promote.js +306 -0
  249. package/dist/services/handlers.prompt.d.ts +1 -0
  250. package/dist/services/handlers.prompt.js +7 -0
  251. package/dist/services/handlers.search.d.ts +69 -0
  252. package/dist/services/handlers.search.js +645 -0
  253. package/dist/services/handlers.testPrimitive.d.ts +1 -0
  254. package/dist/services/handlers.testPrimitive.js +5 -0
  255. package/dist/services/handlers.trace.d.ts +1 -0
  256. package/dist/services/handlers.trace.js +31 -0
  257. package/dist/services/handlers.usage.d.ts +1 -0
  258. package/dist/services/handlers.usage.js +11 -0
  259. package/dist/services/hotScore.d.ts +137 -0
  260. package/dist/services/hotScore.js +244 -0
  261. package/dist/services/indexContext.d.ts +117 -0
  262. package/dist/services/indexContext.js +968 -0
  263. package/dist/services/indexLoader.d.ts +44 -0
  264. package/dist/services/indexLoader.js +921 -0
  265. package/dist/services/indexRepository.d.ts +32 -0
  266. package/dist/services/indexRepository.js +71 -0
  267. package/dist/services/indexingService.d.ts +1 -0
  268. package/dist/services/indexingService.js +2 -0
  269. package/dist/services/instructions.dispatcher.d.ts +1 -0
  270. package/dist/services/instructions.dispatcher.js +231 -0
  271. package/dist/services/logPrefix.d.ts +1 -0
  272. package/dist/services/logPrefix.js +30 -0
  273. package/dist/services/logger.d.ts +52 -0
  274. package/dist/services/logger.js +268 -0
  275. package/dist/services/manifestManager.d.ts +82 -0
  276. package/dist/services/manifestManager.js +200 -0
  277. package/dist/services/messaging/agentMailbox.d.ts +60 -0
  278. package/dist/services/messaging/agentMailbox.js +353 -0
  279. package/dist/services/messaging/messagingPersistence.d.ts +20 -0
  280. package/dist/services/messaging/messagingPersistence.js +111 -0
  281. package/dist/services/messaging/messagingTypes.d.ts +150 -0
  282. package/dist/services/messaging/messagingTypes.js +66 -0
  283. package/dist/services/ownershipService.d.ts +1 -0
  284. package/dist/services/ownershipService.js +38 -0
  285. package/dist/services/performanceBaseline.d.ts +19 -0
  286. package/dist/services/performanceBaseline.js +210 -0
  287. package/dist/services/preflight.d.ts +12 -0
  288. package/dist/services/preflight.js +79 -0
  289. package/dist/services/promptReviewService.d.ts +44 -0
  290. package/dist/services/promptReviewService.js +101 -0
  291. package/dist/services/responseEnvelope.d.ts +6 -0
  292. package/dist/services/responseEnvelope.js +25 -0
  293. package/dist/services/seedBootstrap.d.ts +34 -0
  294. package/dist/services/seedBootstrap.js +427 -0
  295. package/dist/services/storage/factory.d.ts +17 -0
  296. package/dist/services/storage/factory.js +35 -0
  297. package/dist/services/storage/hashUtils.d.ts +11 -0
  298. package/dist/services/storage/hashUtils.js +35 -0
  299. package/dist/services/storage/index.d.ts +12 -0
  300. package/dist/services/storage/index.js +18 -0
  301. package/dist/services/storage/jsonFileStore.d.ts +32 -0
  302. package/dist/services/storage/jsonFileStore.js +241 -0
  303. package/dist/services/storage/migrationEngine.d.ts +35 -0
  304. package/dist/services/storage/migrationEngine.js +93 -0
  305. package/dist/services/storage/sqliteMessageStore.d.ts +53 -0
  306. package/dist/services/storage/sqliteMessageStore.js +146 -0
  307. package/dist/services/storage/sqliteSchema.d.ts +12 -0
  308. package/dist/services/storage/sqliteSchema.js +122 -0
  309. package/dist/services/storage/sqliteStore.d.ts +41 -0
  310. package/dist/services/storage/sqliteStore.js +339 -0
  311. package/dist/services/storage/sqliteUsageStore.d.ts +35 -0
  312. package/dist/services/storage/sqliteUsageStore.js +94 -0
  313. package/dist/services/storage/types.d.ts +171 -0
  314. package/dist/services/storage/types.js +12 -0
  315. package/dist/services/toolHandlers.d.ts +23 -0
  316. package/dist/services/toolHandlers.js +50 -0
  317. package/dist/services/toolRegistry.d.ts +20 -0
  318. package/dist/services/toolRegistry.js +490 -0
  319. package/dist/services/toolRegistry.zod.d.ts +10 -0
  320. package/dist/services/toolRegistry.zod.js +323 -0
  321. package/dist/services/tracing.d.ts +26 -0
  322. package/dist/services/tracing.js +260 -0
  323. package/dist/services/usageBuckets.d.ts +161 -0
  324. package/dist/services/usageBuckets.js +364 -0
  325. package/dist/services/validationService.d.ts +38 -0
  326. package/dist/services/validationService.js +125 -0
  327. package/dist/utils/BufferRing.d.ts +203 -0
  328. package/dist/utils/BufferRing.js +551 -0
  329. package/dist/utils/BufferRingExamples.d.ts +55 -0
  330. package/dist/utils/BufferRingExamples.js +188 -0
  331. package/dist/utils/envUtils.d.ts +42 -0
  332. package/dist/utils/envUtils.js +80 -0
  333. package/dist/utils/memoryMonitor.d.ts +83 -0
  334. package/dist/utils/memoryMonitor.js +275 -0
  335. package/dist/versioning/schemaVersion.d.ts +6 -0
  336. package/dist/versioning/schemaVersion.js +93 -0
  337. package/package.json +134 -0
  338. package/schemas/README.md +13 -0
  339. package/schemas/feedback-entry.schema.json +27 -0
  340. package/schemas/graph-export-v2.schema.json +60 -0
  341. package/schemas/index-server.code-schema.json +38477 -0
  342. package/schemas/instruction.schema.json +262 -0
  343. package/schemas/json-schema/SessionPersistence-persisted-admin-session.schema.json +54 -0
  344. package/schemas/json-schema/SessionPersistence-persisted-session-history-entry.schema.json +51 -0
  345. package/schemas/json-schema/SessionPersistence-persisted-web-socket-connection.schema.json +54 -0
  346. package/schemas/json-schema/SessionPersistence-session-persistence-config.schema.json +110 -0
  347. package/schemas/json-schema/SessionPersistence-session-persistence-data.schema.json +229 -0
  348. package/schemas/json-schema/SessionPersistence-session-persistence-manifest.schema.json +109 -0
  349. package/schemas/json-schema/SessionPersistence-session-persistence-metadata.schema.json +55 -0
  350. package/schemas/json-schema/instruction-audience-scope.schema.json +14 -0
  351. package/schemas/json-schema/instruction-content-type.schema.json +17 -0
  352. package/schemas/json-schema/instruction-instruction-entry.schema.json +206 -0
  353. package/schemas/json-schema/instruction-requirement-level.schema.json +16 -0
  354. package/schemas/manifest.json +78 -0
  355. package/schemas/manifest.schema.json +33 -0
  356. package/schemas/usage-batch.schema.json +16 -0
  357. package/schemas/usage-buckets.schema.json +30 -0
  358. package/schemas/usage-event.schema.json +17 -0
  359. package/scripts/copy-dashboard-assets.mjs +170 -0
  360. package/scripts/setup-hooks.cjs +28 -0
@@ -0,0 +1,252 @@
1
+ /**
2
+ * metricsAggregation.ts
3
+ *
4
+ * All shared type definitions and pure aggregation math for the metrics subsystem:
5
+ * averages, percentiles, window calculations, trend detection, and tool-cleanup logic.
6
+ * No side effects — every function here is deterministic given its inputs.
7
+ */
8
+ export interface ToolMetrics {
9
+ callCount: number;
10
+ successCount: number;
11
+ errorCount: number;
12
+ totalResponseTime: number;
13
+ lastCalled?: number;
14
+ errorTypes: {
15
+ [errorType: string]: number;
16
+ };
17
+ }
18
+ export interface ServerMetrics {
19
+ uptime: number;
20
+ version: string;
21
+ memoryUsage: NodeJS.MemoryUsage;
22
+ cpuUsage?: NodeJS.CpuUsage;
23
+ startTime: number;
24
+ }
25
+ export interface ConnectionMetrics {
26
+ activeConnections: number;
27
+ totalConnections: number;
28
+ disconnectedConnections: number;
29
+ avgSessionDuration: number;
30
+ }
31
+ export interface MetricsSnapshot {
32
+ timestamp: number;
33
+ server: ServerMetrics;
34
+ tools: {
35
+ [toolName: string]: ToolMetrics;
36
+ };
37
+ connections: ConnectionMetrics;
38
+ performance: {
39
+ requestsPerMinute: number;
40
+ successRate: number;
41
+ avgResponseTime: number;
42
+ errorRate: number;
43
+ };
44
+ }
45
+ export interface MetricsTimeSeriesEntry {
46
+ timestamp: number;
47
+ snapshot: MetricsSnapshot;
48
+ performanceData: {
49
+ responseTimeMs: number;
50
+ requestCount: number;
51
+ errorCount: number;
52
+ connectionCount: number;
53
+ };
54
+ }
55
+ export interface ToolCallEvent {
56
+ timestamp: number;
57
+ toolName: string;
58
+ success: boolean;
59
+ responseTimeMs: number;
60
+ errorType?: string;
61
+ clientId?: string;
62
+ }
63
+ export interface MetricsBufferConfig {
64
+ historicalSnapshots: {
65
+ capacity: number;
66
+ retentionMinutes: number;
67
+ persistenceFile?: string;
68
+ };
69
+ toolCallEvents: {
70
+ capacity: number;
71
+ retentionMinutes: number;
72
+ persistenceFile?: string;
73
+ };
74
+ performanceMetrics: {
75
+ capacity: number;
76
+ persistenceFile?: string;
77
+ };
78
+ }
79
+ export interface ChartDataPoint {
80
+ timestamp: number;
81
+ value: number;
82
+ label?: string;
83
+ }
84
+ export interface ToolUsageChartData {
85
+ toolName: string;
86
+ data: ChartDataPoint[];
87
+ color?: string;
88
+ }
89
+ export interface PerformanceChartData {
90
+ responseTime: ChartDataPoint[];
91
+ requestRate: ChartDataPoint[];
92
+ errorRate: ChartDataPoint[];
93
+ successRate: ChartDataPoint[];
94
+ }
95
+ export interface RealtimeMetrics {
96
+ currentRpm: number;
97
+ activeConnections: number;
98
+ avgResponseTime: number;
99
+ successRate: number;
100
+ errorRate: number;
101
+ topTools: Array<{
102
+ name: string;
103
+ calls: number;
104
+ avgTime: number;
105
+ }>;
106
+ recentErrors: Array<{
107
+ tool: string;
108
+ error: string;
109
+ timestamp: number;
110
+ }>;
111
+ }
112
+ export interface RealtimeStreamingData {
113
+ timestamp: number;
114
+ systemHealth: SystemHealth;
115
+ performanceMetrics: EnhancedPerformanceMetrics;
116
+ recentActivity: ActivityEvent[];
117
+ streamingStats: StreamingStats;
118
+ }
119
+ export interface SystemHealth {
120
+ cpuUsage: number;
121
+ memoryUsage: number;
122
+ diskUsage: number;
123
+ networkLatency: number;
124
+ uptime: number;
125
+ lastHealthCheck: Date;
126
+ status: 'healthy' | 'warning' | 'critical';
127
+ }
128
+ export interface EnhancedPerformanceMetrics {
129
+ requestThroughput: number;
130
+ averageResponseTime: number;
131
+ p95ResponseTime: number;
132
+ p99ResponseTime: number;
133
+ errorRate: number;
134
+ concurrentConnections: number;
135
+ totalRequests: number;
136
+ successfulRequests: number;
137
+ requestsPerSecond: number;
138
+ bytesTransferred: number;
139
+ }
140
+ export interface StreamingStats {
141
+ totalStreamingConnections: number;
142
+ dataTransferRate: number;
143
+ latency: number;
144
+ compressionRatio: number;
145
+ }
146
+ export interface ActivityEvent {
147
+ tool: string;
148
+ lastActivity: Date | null;
149
+ recentCalls: number;
150
+ }
151
+ export interface AdvancedAnalytics {
152
+ timeRange: string;
153
+ hourlyStats: HourlyStats[];
154
+ toolUsageBreakdown: ToolUsageStats[];
155
+ errorAnalysis: ErrorAnalysis;
156
+ performanceTrends: PerformanceTrend[];
157
+ predictionData: PredictionData | null;
158
+ anomalies: Anomaly[];
159
+ }
160
+ export interface HourlyStats {
161
+ hour: string;
162
+ requestCount: number;
163
+ errorCount: number;
164
+ avgResponseTime: number;
165
+ }
166
+ export interface ToolUsageStats {
167
+ toolName: string;
168
+ callCount: number;
169
+ successRate: number;
170
+ avgResponseTime: number;
171
+ lastCalled: Date | null;
172
+ }
173
+ export interface ErrorAnalysis {
174
+ errorTypes: {
175
+ [type: string]: number;
176
+ };
177
+ totalErrors: number;
178
+ errorRate: number;
179
+ }
180
+ export interface PerformanceTrend {
181
+ timestamp: Date;
182
+ responseTime: number;
183
+ throughput: number;
184
+ errorRate: number;
185
+ }
186
+ export interface PredictionData {
187
+ responseTimeProjection: number;
188
+ throughputProjection: number;
189
+ confidence: 'high' | 'medium' | 'low';
190
+ }
191
+ export interface Anomaly {
192
+ type: string;
193
+ timestamp: Date;
194
+ value: number;
195
+ severity: 'low' | 'medium' | 'high';
196
+ }
197
+ export interface Alert {
198
+ id: string;
199
+ type: 'error_rate' | 'response_time' | 'memory' | 'cpu' | 'system' | 'network';
200
+ severity: 'low' | 'medium' | 'high' | 'critical';
201
+ message: string;
202
+ timestamp: Date;
203
+ resolved: boolean;
204
+ resolvedAt?: Date;
205
+ value: number;
206
+ threshold: number;
207
+ source: string;
208
+ category: string;
209
+ }
210
+ export interface MetricsCollectorOptions {
211
+ retentionMinutes?: number;
212
+ maxSnapshots?: number;
213
+ collectInterval?: number;
214
+ }
215
+ export interface ResourceSample {
216
+ timestamp: number;
217
+ cpuPercent: number;
218
+ heapUsed: number;
219
+ rss: number;
220
+ }
221
+ export declare function getTotalRequests(tools: Map<string, ToolMetrics>): number;
222
+ export declare function getTotalErrors(tools: Map<string, ToolMetrics>): number;
223
+ export declare function getAverageResponseTime(tools: Map<string, ToolMetrics>): number;
224
+ export declare function getErrorRate(tools: Map<string, ToolMetrics>): number;
225
+ /** Requests per second derived from a sliding window of recent snapshots. */
226
+ export declare function calculateRequestsPerSecond(snapshots: MetricsSnapshot[]): number;
227
+ /** Linear trend slope via ordinary least squares over an array of values. */
228
+ export declare function calculateTrend(values: number[]): number;
229
+ /** Parse time-range strings like "1h", "30m", "2d" into whole hours. */
230
+ export declare function parseTimeRange(timeRange: string): number;
231
+ /** Return an estimated percentile response-time given the average. */
232
+ export declare function calculatePercentileFromAvg(avg: number, percentile: number): number;
233
+ export declare function categorizeAlert(type: string): string;
234
+ export declare function getOverallHealthStatus(cpu: number, memory: number, errorRate: number): 'healthy' | 'warning' | 'critical';
235
+ /** Estimate CPU % from recent RPM (simple heuristic, single-core basis). */
236
+ export declare function estimateCPUUsage(recentSnapshots: MetricsSnapshot[]): number;
237
+ export declare function estimateMemoryUsage(connectionCount: number, snapshotCount: number): number;
238
+ export declare function estimateDiskUsage(snapshotCount: number): number;
239
+ /** Detect response-time spikes in a set of snapshots. */
240
+ export declare function detectAnomalies(snapshots: MetricsSnapshot[]): Anomaly[];
241
+ /** Compute RPM from a series of snapshots (used for historical charting). */
242
+ export declare function calculateRPMFromSnapshots(snapshots: MetricsSnapshot[]): number;
243
+ /** Compute per-second OLS slope for CPU % and heap memory over a sample window. */
244
+ export declare function calculateLinearSlopes(samples: ResourceSample[]): {
245
+ cpuSlope: number;
246
+ memSlope: number;
247
+ };
248
+ /**
249
+ * Return the set of tool names that should be evicted to keep the map under maxSize.
250
+ * Lowest-score (least-recently-used + fewest calls) tools are evicted first.
251
+ */
252
+ export declare function computeToolsToCleanup(tools: Map<string, ToolMetrics>, maxSize: number, staleThreshold: number, minCallsToKeep?: number): string[];
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * metricsAggregation.ts
4
+ *
5
+ * All shared type definitions and pure aggregation math for the metrics subsystem:
6
+ * averages, percentiles, window calculations, trend detection, and tool-cleanup logic.
7
+ * No side effects — every function here is deterministic given its inputs.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.getTotalRequests = getTotalRequests;
11
+ exports.getTotalErrors = getTotalErrors;
12
+ exports.getAverageResponseTime = getAverageResponseTime;
13
+ exports.getErrorRate = getErrorRate;
14
+ exports.calculateRequestsPerSecond = calculateRequestsPerSecond;
15
+ exports.calculateTrend = calculateTrend;
16
+ exports.parseTimeRange = parseTimeRange;
17
+ exports.calculatePercentileFromAvg = calculatePercentileFromAvg;
18
+ exports.categorizeAlert = categorizeAlert;
19
+ exports.getOverallHealthStatus = getOverallHealthStatus;
20
+ exports.estimateCPUUsage = estimateCPUUsage;
21
+ exports.estimateMemoryUsage = estimateMemoryUsage;
22
+ exports.estimateDiskUsage = estimateDiskUsage;
23
+ exports.detectAnomalies = detectAnomalies;
24
+ exports.calculateRPMFromSnapshots = calculateRPMFromSnapshots;
25
+ exports.calculateLinearSlopes = calculateLinearSlopes;
26
+ exports.computeToolsToCleanup = computeToolsToCleanup;
27
+ // ── Pure Aggregation Functions ──────────────────────────────────────────────
28
+ function getTotalRequests(tools) {
29
+ let total = 0;
30
+ tools.forEach(m => { total += m.callCount; });
31
+ return total;
32
+ }
33
+ function getTotalErrors(tools) {
34
+ let total = 0;
35
+ tools.forEach(m => { total += m.errorCount; });
36
+ return total;
37
+ }
38
+ function getAverageResponseTime(tools) {
39
+ let totalTime = 0;
40
+ let totalCalls = 0;
41
+ tools.forEach(m => { totalTime += m.totalResponseTime; totalCalls += m.callCount; });
42
+ return totalCalls > 0 ? totalTime / totalCalls : 0;
43
+ }
44
+ function getErrorRate(tools) {
45
+ const totalCalls = getTotalRequests(tools);
46
+ const totalErrors = getTotalErrors(tools);
47
+ return totalCalls > 0 ? (totalErrors / totalCalls) * 100 : 0;
48
+ }
49
+ /** Requests per second derived from a sliding window of recent snapshots. */
50
+ function calculateRequestsPerSecond(snapshots) {
51
+ const recent = snapshots.slice(-10);
52
+ if (recent.length < 2)
53
+ return 0;
54
+ const latest = recent[recent.length - 1];
55
+ const earliest = recent[0];
56
+ const timeDiff = (latest.timestamp - earliest.timestamp) / 1000;
57
+ const latestReqs = Object.values(latest.tools).reduce((s, t) => s + t.callCount, 0);
58
+ const earliestReqs = Object.values(earliest.tools).reduce((s, t) => s + t.callCount, 0);
59
+ return timeDiff > 0 ? (latestReqs - earliestReqs) / timeDiff : 0;
60
+ }
61
+ /** Linear trend slope via ordinary least squares over an array of values. */
62
+ function calculateTrend(values) {
63
+ if (values.length < 2)
64
+ return 0;
65
+ const n = values.length;
66
+ const sumX = (n * (n - 1)) / 2;
67
+ const sumY = values.reduce((s, v) => s + v, 0);
68
+ const sumXY = values.reduce((s, v, i) => s + i * v, 0);
69
+ const sumX2 = (n * (n - 1) * (2 * n - 1)) / 6;
70
+ return (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
71
+ }
72
+ /** Parse time-range strings like "1h", "30m", "2d" into whole hours. */
73
+ function parseTimeRange(timeRange) {
74
+ const match = timeRange.match(/(\d+)([hmd])/);
75
+ if (!match)
76
+ return 1;
77
+ const value = parseInt(match[1]);
78
+ switch (match[2]) {
79
+ case 'h': return value;
80
+ case 'd': return value * 24;
81
+ case 'm': return Math.max(1, Math.floor(value / 60));
82
+ default: return 1;
83
+ }
84
+ }
85
+ /** Return an estimated percentile response-time given the average. */
86
+ function calculatePercentileFromAvg(avg, percentile) {
87
+ const multiplier = percentile === 95 ? 2.5 : percentile === 99 ? 4.0 : 1.0;
88
+ return Math.round(avg * multiplier);
89
+ }
90
+ function categorizeAlert(type) {
91
+ const categories = {
92
+ error_rate: 'Performance',
93
+ response_time: 'Performance',
94
+ memory: 'System',
95
+ cpu: 'System',
96
+ disk: 'System',
97
+ network: 'Network',
98
+ };
99
+ return categories[type] ?? 'General';
100
+ }
101
+ function getOverallHealthStatus(cpu, memory, errorRate) {
102
+ if (cpu > 90 || memory > 90 || errorRate > 10)
103
+ return 'critical';
104
+ if (cpu > 75 || memory > 75 || errorRate > 5)
105
+ return 'warning';
106
+ return 'healthy';
107
+ }
108
+ /** Estimate CPU % from recent RPM (simple heuristic, single-core basis). */
109
+ function estimateCPUUsage(recentSnapshots) {
110
+ if (recentSnapshots.length === 0)
111
+ return 0;
112
+ const avgRpm = recentSnapshots.reduce((s, snap) => s + snap.performance.requestsPerMinute, 0) / recentSnapshots.length;
113
+ return Math.min(Math.max(avgRpm / 10, 5), 95);
114
+ }
115
+ function estimateMemoryUsage(connectionCount, snapshotCount) {
116
+ return Math.min(20 + connectionCount * 0.5 + snapshotCount * 0.1, 95);
117
+ }
118
+ function estimateDiskUsage(snapshotCount) {
119
+ return Math.min(30 + snapshotCount * 0.05, 80);
120
+ }
121
+ /** Detect response-time spikes in a set of snapshots. */
122
+ function detectAnomalies(snapshots) {
123
+ const anomalies = [];
124
+ if (snapshots.length <= 10)
125
+ return anomalies;
126
+ const avg = snapshots.reduce((s, snap) => s + snap.performance.avgResponseTime, 0) / snapshots.length;
127
+ for (const snapshot of snapshots) {
128
+ if (snapshot.performance.avgResponseTime > avg * 2) {
129
+ anomalies.push({
130
+ type: 'response_time_spike',
131
+ timestamp: new Date(snapshot.timestamp),
132
+ value: snapshot.performance.avgResponseTime,
133
+ severity: 'medium',
134
+ });
135
+ }
136
+ }
137
+ return anomalies;
138
+ }
139
+ /** Compute RPM from a series of snapshots (used for historical charting). */
140
+ function calculateRPMFromSnapshots(snapshots) {
141
+ if (snapshots.length < 2)
142
+ return 0;
143
+ let totalRequests = 0;
144
+ snapshots.forEach(s => { Object.values(s.tools).forEach(t => { totalRequests += t.callCount; }); });
145
+ const spanMinutes = (snapshots[snapshots.length - 1].timestamp - snapshots[0].timestamp) / 60000;
146
+ return spanMinutes > 0 ? totalRequests / spanMinutes : 0;
147
+ }
148
+ /** Compute per-second OLS slope for CPU % and heap memory over a sample window. */
149
+ function calculateLinearSlopes(samples) {
150
+ if (samples.length <= 5)
151
+ return { cpuSlope: 0, memSlope: 0 };
152
+ const n = samples.length;
153
+ const firstTs = samples[0].timestamp;
154
+ let sumX = 0, sumCpu = 0, sumMem = 0, sumXcpu = 0, sumXmem = 0, sumX2 = 0;
155
+ for (const s of samples) {
156
+ const x = (s.timestamp - firstTs) / 1000;
157
+ sumX += x;
158
+ sumCpu += s.cpuPercent;
159
+ sumMem += s.heapUsed;
160
+ sumXcpu += x * s.cpuPercent;
161
+ sumXmem += x * s.heapUsed;
162
+ sumX2 += x * x;
163
+ }
164
+ const denom = (n * sumX2 - sumX * sumX) || 1;
165
+ return {
166
+ cpuSlope: (n * sumXcpu - sumX * sumCpu) / denom,
167
+ memSlope: (n * sumXmem - sumX * sumMem) / denom,
168
+ };
169
+ }
170
+ /**
171
+ * Return the set of tool names that should be evicted to keep the map under maxSize.
172
+ * Lowest-score (least-recently-used + fewest calls) tools are evicted first.
173
+ */
174
+ function computeToolsToCleanup(tools, maxSize, staleThreshold, minCallsToKeep = 10) {
175
+ const keepCount = Math.floor(maxSize * 0.8);
176
+ const sorted = Array.from(tools.entries())
177
+ .map(([name, m]) => ({ name, m, score: (m.lastCalled ?? 0) + m.callCount * 1000 }))
178
+ .sort((a, b) => b.score - a.score);
179
+ const candidates = sorted.slice(keepCount);
180
+ const toRemove = [];
181
+ if (tools.size > maxSize) {
182
+ for (const { name, m } of candidates) {
183
+ const isStale = (m.lastCalled ?? 0) < staleThreshold;
184
+ if ((isStale && m.callCount < minCallsToKeep) || (!isStale && m.callCount < 5)) {
185
+ toRemove.push(name);
186
+ }
187
+ }
188
+ // Hard-cap: evict more aggressively if still over capacity
189
+ const remaining = tools.size - toRemove.length;
190
+ if (remaining > maxSize) {
191
+ const extra = candidates
192
+ .filter(({ name }) => !toRemove.includes(name))
193
+ .slice(0, remaining - keepCount)
194
+ .map(({ name }) => name);
195
+ toRemove.push(...extra);
196
+ }
197
+ }
198
+ else {
199
+ for (const { name, m } of candidates) {
200
+ if ((m.lastCalled ?? 0) < staleThreshold && m.callCount < minCallsToKeep) {
201
+ toRemove.push(name);
202
+ }
203
+ }
204
+ }
205
+ return toRemove;
206
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * metricsSerializer.ts
3
+ *
4
+ * Pure builder functions that convert raw metrics state into JSON-ready output shapes
5
+ * for dashboard charts, analytics, and streaming endpoints.
6
+ * Every function here is side-effect-free and receives all data it needs as parameters.
7
+ */
8
+ import { type ToolMetrics, type MetricsSnapshot, type ToolCallEvent, type RealtimeMetrics, type ToolUsageChartData, type PerformanceChartData, type ToolUsageStats, type HourlyStats, type ErrorAnalysis, type PerformanceTrend, type PredictionData, type AdvancedAnalytics, type ActivityEvent } from './metricsAggregation.js';
9
+ export declare function buildRealtimeMetrics(snapshot: MetricsSnapshot, tools: Map<string, ToolMetrics>): RealtimeMetrics;
10
+ export declare function buildRecentActivity(tools: Map<string, ToolMetrics>): ActivityEvent[];
11
+ export declare function buildToolUsageChartData(snapshots: MetricsSnapshot[], minutes: number): ToolUsageChartData[];
12
+ export declare function buildPerformanceChartData(snapshots: MetricsSnapshot[], minutes: number): PerformanceChartData;
13
+ export declare function buildPerformanceTimeSeriesData(performanceData: Array<{
14
+ timestamp: number;
15
+ responseTime: number;
16
+ throughput: number;
17
+ errorRate: number;
18
+ }>, minutes: number): PerformanceChartData;
19
+ export declare function buildToolUsageAnalytics(events: ToolCallEvent[], minutes: number): ToolUsageStats[];
20
+ export declare function buildHourlyStats(snapshots: MetricsSnapshot[], timeRange: string, errorRate: number): HourlyStats[];
21
+ export declare function buildToolUsageBreakdown(tools: Map<string, ToolMetrics>): ToolUsageStats[];
22
+ export declare function buildErrorAnalysis(tools: Map<string, ToolMetrics>, errorRate: number): ErrorAnalysis;
23
+ export declare function buildPerformanceTrends(snapshots: MetricsSnapshot[]): PerformanceTrend[];
24
+ export declare function buildPredictionData(snapshots: MetricsSnapshot[]): PredictionData | null;
25
+ export declare function buildAdvancedAnalytics(timeRange: string, snapshots: MetricsSnapshot[], tools: Map<string, ToolMetrics>, errorRate: number, anomalies: import('./metricsAggregation.js').Anomaly[]): AdvancedAnalytics;
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ /**
3
+ * metricsSerializer.ts
4
+ *
5
+ * Pure builder functions that convert raw metrics state into JSON-ready output shapes
6
+ * for dashboard charts, analytics, and streaming endpoints.
7
+ * Every function here is side-effect-free and receives all data it needs as parameters.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.buildRealtimeMetrics = buildRealtimeMetrics;
11
+ exports.buildRecentActivity = buildRecentActivity;
12
+ exports.buildToolUsageChartData = buildToolUsageChartData;
13
+ exports.buildPerformanceChartData = buildPerformanceChartData;
14
+ exports.buildPerformanceTimeSeriesData = buildPerformanceTimeSeriesData;
15
+ exports.buildToolUsageAnalytics = buildToolUsageAnalytics;
16
+ exports.buildHourlyStats = buildHourlyStats;
17
+ exports.buildToolUsageBreakdown = buildToolUsageBreakdown;
18
+ exports.buildErrorAnalysis = buildErrorAnalysis;
19
+ exports.buildPerformanceTrends = buildPerformanceTrends;
20
+ exports.buildPredictionData = buildPredictionData;
21
+ exports.buildAdvancedAnalytics = buildAdvancedAnalytics;
22
+ const metricsAggregation_js_1 = require("./metricsAggregation.js");
23
+ // ── Real-time widgets ────────────────────────────────────────────────────────
24
+ function buildRealtimeMetrics(snapshot, tools) {
25
+ const topTools = Array.from(tools.entries())
26
+ .sort((a, b) => b[1].callCount - a[1].callCount)
27
+ .slice(0, 5)
28
+ .map(([name, m]) => ({
29
+ name,
30
+ calls: m.callCount,
31
+ avgTime: m.callCount > 0 ? m.totalResponseTime / m.callCount : 0,
32
+ }));
33
+ return {
34
+ currentRpm: snapshot.performance.requestsPerMinute,
35
+ activeConnections: snapshot.connections.activeConnections,
36
+ avgResponseTime: snapshot.performance.avgResponseTime,
37
+ successRate: snapshot.performance.successRate,
38
+ errorRate: snapshot.performance.errorRate,
39
+ topTools,
40
+ recentErrors: [],
41
+ };
42
+ }
43
+ function buildRecentActivity(tools) {
44
+ const cutoff = Date.now() - 300_000; // 5 min
45
+ return Array.from(tools.entries())
46
+ .filter(([, m]) => m.lastCalled && m.lastCalled >= cutoff)
47
+ .map(([name, m]) => ({
48
+ tool: name,
49
+ lastActivity: m.lastCalled ? new Date(m.lastCalled) : null,
50
+ recentCalls: m.callCount,
51
+ }))
52
+ .sort((a, b) => (b.lastActivity?.getTime() ?? 0) - (a.lastActivity?.getTime() ?? 0))
53
+ .slice(0, 10);
54
+ }
55
+ // ── Chart data builders ──────────────────────────────────────────────────────
56
+ const CHART_COLORS = [
57
+ '#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0',
58
+ '#9966FF', '#FF9F40', '#FF6384', '#C9CBCF',
59
+ ];
60
+ function buildToolUsageChartData(snapshots, minutes) {
61
+ const cutoff = Date.now() - minutes * 60_000;
62
+ const relevant = snapshots.filter(s => s.timestamp >= cutoff);
63
+ if (relevant.length === 0)
64
+ return [];
65
+ const toolNames = new Set();
66
+ relevant.forEach(s => Object.keys(s.tools).forEach(n => toolNames.add(n)));
67
+ return Array.from(toolNames).map((toolName, i) => ({
68
+ toolName,
69
+ color: CHART_COLORS[i % CHART_COLORS.length],
70
+ data: relevant.map(s => ({
71
+ timestamp: s.timestamp,
72
+ value: s.tools[toolName]?.callCount ?? 0,
73
+ label: new Date(s.timestamp).toLocaleTimeString(),
74
+ })),
75
+ }));
76
+ }
77
+ function buildPerformanceChartData(snapshots, minutes) {
78
+ const cutoff = Date.now() - minutes * 60_000;
79
+ const relevant = snapshots.filter(s => s.timestamp >= cutoff);
80
+ const toPoint = (s, value) => ({
81
+ timestamp: s.timestamp,
82
+ value,
83
+ label: new Date(s.timestamp).toLocaleTimeString(),
84
+ });
85
+ return {
86
+ responseTime: relevant.map(s => toPoint(s, s.performance.avgResponseTime)),
87
+ requestRate: relevant.map(s => toPoint(s, s.performance.requestsPerMinute)),
88
+ errorRate: relevant.map(s => toPoint(s, s.performance.errorRate)),
89
+ successRate: relevant.map(s => toPoint(s, s.performance.successRate)),
90
+ };
91
+ }
92
+ function buildPerformanceTimeSeriesData(performanceData, minutes) {
93
+ const cutoff = Date.now() - minutes * 60_000;
94
+ const recent = performanceData.filter(m => m.timestamp >= cutoff);
95
+ return {
96
+ responseTime: recent.map(m => ({ timestamp: m.timestamp, value: m.responseTime })),
97
+ requestRate: recent.map(m => ({ timestamp: m.timestamp, value: m.throughput })),
98
+ errorRate: recent.map(m => ({ timestamp: m.timestamp, value: m.errorRate })),
99
+ successRate: recent.map(m => ({ timestamp: m.timestamp, value: 100 - m.errorRate })),
100
+ };
101
+ }
102
+ // ── Analytics builders ───────────────────────────────────────────────────────
103
+ function buildToolUsageAnalytics(events, minutes) {
104
+ const cutoff = Date.now() - minutes * 60_000;
105
+ const recent = events.filter(e => e.timestamp >= cutoff);
106
+ const map = new Map();
107
+ recent.forEach(e => {
108
+ const s = map.get(e.toolName) ?? { calls: 0, successes: 0, totalTime: 0, lastUsed: 0 };
109
+ s.calls++;
110
+ if (e.success)
111
+ s.successes++;
112
+ s.totalTime += e.responseTimeMs;
113
+ s.lastUsed = Math.max(s.lastUsed, e.timestamp);
114
+ map.set(e.toolName, s);
115
+ });
116
+ return Array.from(map.entries()).map(([toolName, s]) => ({
117
+ toolName,
118
+ callCount: s.calls,
119
+ successRate: s.calls > 0 ? (s.successes / s.calls) * 100 : 100,
120
+ avgResponseTime: s.calls > 0 ? s.totalTime / s.calls : 0,
121
+ lastCalled: s.lastUsed > 0 ? new Date(s.lastUsed) : null,
122
+ }));
123
+ }
124
+ function buildHourlyStats(snapshots, timeRange, errorRate) {
125
+ const hours = (0, metricsAggregation_js_1.parseTimeRange)(timeRange);
126
+ const now = Date.now();
127
+ const stats = [];
128
+ for (let i = hours - 1; i >= 0; i--) {
129
+ const hourStart = now - i * 3_600_000;
130
+ const hourEnd = hourStart + 3_600_000;
131
+ const hourSnaps = snapshots.filter(s => s.timestamp >= hourStart && s.timestamp < hourEnd);
132
+ if (hourSnaps.length === 0)
133
+ continue;
134
+ const latestReqs = Object.values(hourSnaps[hourSnaps.length - 1].tools).reduce((s, t) => s + t.callCount, 0);
135
+ const earliestReqs = Object.values(hourSnaps[0].tools).reduce((s, t) => s + t.callCount, 0);
136
+ const requests = latestReqs - earliestReqs;
137
+ stats.push({
138
+ hour: new Date(hourStart).toISOString().slice(11, 16),
139
+ requestCount: requests,
140
+ errorCount: Math.round(requests * errorRate / 100),
141
+ avgResponseTime: hourSnaps.reduce((s, snap) => s + snap.performance.avgResponseTime, 0) / hourSnaps.length,
142
+ });
143
+ }
144
+ return stats;
145
+ }
146
+ function buildToolUsageBreakdown(tools) {
147
+ return Array.from(tools.entries()).map(([name, m]) => ({
148
+ toolName: name,
149
+ callCount: m.callCount,
150
+ successRate: m.callCount > 0 ? ((m.callCount - m.errorCount) / m.callCount) * 100 : 100,
151
+ avgResponseTime: m.totalResponseTime / Math.max(m.callCount, 1),
152
+ lastCalled: m.lastCalled ? new Date(m.lastCalled) : null,
153
+ }));
154
+ }
155
+ function buildErrorAnalysis(tools, errorRate) {
156
+ const errors = {};
157
+ let totalErrors = 0;
158
+ tools.forEach(m => {
159
+ totalErrors += m.errorCount;
160
+ errors['TimeoutError'] = (errors['TimeoutError'] ?? 0) + Math.floor(m.errorCount * 0.3);
161
+ errors['ValidationError'] = (errors['ValidationError'] ?? 0) + Math.floor(m.errorCount * 0.4);
162
+ errors['SystemError'] = (errors['SystemError'] ?? 0) + Math.floor(m.errorCount * 0.3);
163
+ });
164
+ return { errorTypes: errors, totalErrors, errorRate };
165
+ }
166
+ function buildPerformanceTrends(snapshots) {
167
+ const points = Math.min(snapshots.length, 20);
168
+ return snapshots.slice(-points).map(s => ({
169
+ timestamp: new Date(s.timestamp),
170
+ responseTime: s.performance.avgResponseTime,
171
+ throughput: s.performance.requestsPerMinute,
172
+ errorRate: s.performance.errorRate,
173
+ }));
174
+ }
175
+ function buildPredictionData(snapshots) {
176
+ const recent = snapshots.slice(-10);
177
+ if (recent.length < 2)
178
+ return null;
179
+ return {
180
+ responseTimeProjection: (0, metricsAggregation_js_1.calculateTrend)(recent.map(s => s.performance.avgResponseTime)),
181
+ throughputProjection: (0, metricsAggregation_js_1.calculateTrend)(recent.map(s => s.performance.requestsPerMinute)),
182
+ confidence: recent.length >= 5 ? 'high' : 'low',
183
+ };
184
+ }
185
+ function buildAdvancedAnalytics(timeRange, snapshots, tools, errorRate, anomalies) {
186
+ return {
187
+ timeRange,
188
+ hourlyStats: buildHourlyStats(snapshots, timeRange, errorRate),
189
+ toolUsageBreakdown: buildToolUsageBreakdown(tools),
190
+ errorAnalysis: buildErrorAnalysis(tools, errorRate),
191
+ performanceTrends: buildPerformanceTrends(snapshots),
192
+ predictionData: buildPredictionData(snapshots),
193
+ anomalies,
194
+ };
195
+ }