@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,164 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseServerConfig = parseServerConfig;
7
+ exports.parseLoggingConfig = parseLoggingConfig;
8
+ exports.parseMetricsConfig = parseMetricsConfig;
9
+ exports.parseAtomicFsConfig = parseAtomicFsConfig;
10
+ exports.parsePreflightConfig = parsePreflightConfig;
11
+ exports.parseTracingConfig = parseTracingConfig;
12
+ /**
13
+ * Server domain config: MCP server, bootstrap, transport, protocol, logging,
14
+ * metrics, tracing, atomicFs, and preflight settings.
15
+ */
16
+ const path_1 = __importDefault(require("path"));
17
+ const envUtils_1 = require("../utils/envUtils");
18
+ const configUtils_1 = require("./configUtils");
19
+ const dirConstants_1 = require("./dirConstants");
20
+ const defaultValues_1 = require("./defaultValues");
21
+ function parseServerConfig() {
22
+ const sharedSentinel = process.env.INDEX_SERVER_SHARED_SERVER_SENTINEL;
23
+ const rawMode = (process.env.INDEX_SERVER_MODE || 'standalone').trim().toLowerCase();
24
+ const validModes = ['standalone', 'leader', 'follower', 'auto'];
25
+ const instanceMode = validModes.includes(rawMode)
26
+ ? rawMode
27
+ : 'standalone';
28
+ return {
29
+ disableEarlyStdinBuffer: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_DISABLE_EARLY_STDIN_BUFFER'),
30
+ fatalExitDelayMs: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_FATAL_EXIT_DELAY_MS', defaultValues_1.DEFAULT_TIMEOUTS_MS.FATAL_EXIT_DELAY),
31
+ idleKeepaliveMs: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_IDLE_KEEPALIVE_MS', defaultValues_1.DEFAULT_TIMEOUTS_MS.IDLE_KEEPALIVE),
32
+ sharedSentinel: sharedSentinel && sharedSentinel.trim().length ? sharedSentinel : undefined,
33
+ bootstrap: {
34
+ autoconfirm: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_BOOTSTRAP_AUTOCONFIRM'),
35
+ tokenTtlSec: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_BOOTSTRAP_TOKEN_TTL_SEC', defaultValues_1.DEFAULT_PORTS.BOOTSTRAP_TOKEN_TTL_SEC),
36
+ referenceMode: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_REFERENCE_MODE'),
37
+ },
38
+ indexPolling: {
39
+ enabled: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_ENABLE_INDEX_SERVER_POLLER'),
40
+ proactive: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_POLL_PROACTIVE'),
41
+ intervalMs: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_POLL_MS', defaultValues_1.DEFAULT_TIMEOUTS_MS.POLL_INTERVAL),
42
+ },
43
+ multicoreTrace: (0, envUtils_1.getBooleanEnv)('MULTICLIENT_TRACE'),
44
+ instanceMode,
45
+ leaderPort: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_LEADER_PORT', defaultValues_1.DEFAULT_PORTS.LEADER),
46
+ heartbeatIntervalMs: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_HEARTBEAT_MS', defaultValues_1.DEFAULT_TIMEOUTS_MS.HEARTBEAT),
47
+ staleThresholdMs: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_STALE_THRESHOLD_MS', defaultValues_1.DEFAULT_TIMEOUTS_MS.STALE_THRESHOLD),
48
+ };
49
+ }
50
+ function resolveLogFile() {
51
+ const raw = process.env.INDEX_SERVER_LOG_FILE;
52
+ if (!raw)
53
+ return { raw: undefined, sentinelRequested: false };
54
+ const normalized = raw.trim().toLowerCase();
55
+ const isSentinel = raw === '1' || ['true', 'yes', 'on'].includes(normalized);
56
+ if (isSentinel) {
57
+ return {
58
+ file: (0, configUtils_1.toAbsolute)(path_1.default.join(dirConstants_1.DIR.LOGS_MCP_SERVER)),
59
+ raw,
60
+ sentinelRequested: true,
61
+ };
62
+ }
63
+ return { file: (0, configUtils_1.toAbsolute)(raw), raw, sentinelRequested: false };
64
+ }
65
+ function parseLoggingConfig(level) {
66
+ const fileInfo = resolveLogFile();
67
+ return {
68
+ level,
69
+ verbose: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_VERBOSE_LOGGING') || (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_DEBUG'),
70
+ json: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_LOG_JSON'),
71
+ sync: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_LOG_SYNC'),
72
+ diagnostics: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_LOG_DIAG'),
73
+ protocol: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_LOG_PROTOCOL'),
74
+ file: fileInfo.file,
75
+ rawFileValue: fileInfo.raw,
76
+ sentinelRequested: fileInfo.sentinelRequested,
77
+ };
78
+ }
79
+ function parseMetricsConfig() {
80
+ return {
81
+ dir: (0, configUtils_1.toAbsolute)(process.env.INDEX_SERVER_METRICS_DIR, path_1.default.join(configUtils_1.CWD, dirConstants_1.DIR.METRICS)),
82
+ resourceCapacity: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_RESOURCE_CAPACITY', defaultValues_1.DEFAULT_THRESHOLDS.RESOURCE_CAPACITY),
83
+ sampleIntervalMs: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_RESOURCE_SAMPLE_INTERVAL_MS', defaultValues_1.DEFAULT_THRESHOLDS.RESOURCE_SAMPLE_INTERVAL_MS),
84
+ toolcall: {
85
+ chunkSize: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_TOOLCALL_CHUNK_SIZE', defaultValues_1.DEFAULT_LIMITS.TOOLCALL_CHUNK_SIZE),
86
+ flushMs: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_TOOLCALL_FLUSH_MS', defaultValues_1.DEFAULT_TIMEOUTS_MS.TOOLCALL_FLUSH),
87
+ compactMs: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_TOOLCALL_COMPACT_MS', defaultValues_1.DEFAULT_TIMEOUTS_MS.TOOLCALL_COMPACT),
88
+ appendLogEnabled: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_TOOLCALL_APPEND_LOG'),
89
+ },
90
+ health: {
91
+ memoryThreshold: (0, configUtils_1.floatFromEnv)('INDEX_SERVER_HEALTH_MEMORY_THRESHOLD', defaultValues_1.DEFAULT_THRESHOLDS.MEMORY_THRESHOLD),
92
+ errorRateThreshold: (0, configUtils_1.floatFromEnv)('INDEX_SERVER_HEALTH_ERROR_THRESHOLD', defaultValues_1.DEFAULT_THRESHOLDS.ERROR_RATE_THRESHOLD),
93
+ minUptimeMs: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_HEALTH_MIN_UPTIME', defaultValues_1.DEFAULT_TIMEOUTS_MS.HEALTH_MIN_UPTIME),
94
+ },
95
+ fileStorage: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_METRICS_FILE_STORAGE'),
96
+ };
97
+ }
98
+ function parseAtomicFsConfig() {
99
+ return {
100
+ retries: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_ATOMIC_WRITE_RETRIES', defaultValues_1.DEFAULT_LIMITS.ATOMIC_WRITE_RETRIES),
101
+ backoffMs: (0, configUtils_1.numberFromEnv)('INDEX_SERVER_ATOMIC_WRITE_BACKOFF_MS', defaultValues_1.DEFAULT_LIMITS.ATOMIC_WRITE_BACKOFF_MS),
102
+ };
103
+ }
104
+ function parsePreflightConfig() {
105
+ const modules = (0, configUtils_1.parseCsvEnv)('INDEX_SERVER_PREFLIGHT_MODULES');
106
+ return {
107
+ modules: modules.length ? modules : ['mime-db', 'ajv', 'ajv-formats'],
108
+ strict: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_PREFLIGHT_STRICT'),
109
+ };
110
+ }
111
+ function resolveTraceLevel(traceSet, fallbackLevel) {
112
+ const raw = process.env.INDEX_SERVER_TRACE_LEVEL?.toLowerCase();
113
+ switch (raw) {
114
+ case 'verbose': return 'verbose';
115
+ case 'trace':
116
+ case 'files':
117
+ case 'perf':
118
+ return 'trace';
119
+ case 'debug':
120
+ case 'core':
121
+ return 'debug';
122
+ case 'warn':
123
+ return 'warn';
124
+ case 'error':
125
+ return 'error';
126
+ default:
127
+ if (traceSet.has('verbose'))
128
+ return 'verbose';
129
+ if (traceSet.size > 0)
130
+ return 'trace';
131
+ return fallbackLevel;
132
+ }
133
+ }
134
+ function resolveTracingBuffer() {
135
+ const rawFile = process.env.INDEX_SERVER_TRACE_BUFFER_FILE;
136
+ const trimmed = rawFile?.trim();
137
+ const file = trimmed && trimmed.length ? (0, configUtils_1.toAbsolute)(trimmed) : undefined;
138
+ const sizeBytes = (0, configUtils_1.optionalNumberFromEnv)('INDEX_SERVER_TRACE_BUFFER_SIZE') ?? 0;
139
+ const dumpOnExit = (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_TRACE_BUFFER_DUMP_ON_EXIT');
140
+ return { file, sizeBytes, dumpOnExit };
141
+ }
142
+ function parseTracingConfig(traceSet, fallbackLevel) {
143
+ const categories = new Set((0, configUtils_1.parseCsvEnv)('INDEX_SERVER_TRACE_CATEGORIES'));
144
+ const buffer = resolveTracingBuffer();
145
+ const filePath = (() => {
146
+ const raw = process.env.INDEX_SERVER_TRACE_FILE;
147
+ if (!raw)
148
+ return undefined;
149
+ const trimmed = raw.trim();
150
+ return trimmed.length ? (0, configUtils_1.toAbsolute)(trimmed) : undefined;
151
+ })();
152
+ return {
153
+ level: resolveTraceLevel(traceSet, fallbackLevel),
154
+ categories,
155
+ buffer,
156
+ file: filePath,
157
+ persist: (0, envUtils_1.parseBooleanEnv)(process.env.INDEX_SERVER_TRACE_PERSIST, !!filePath),
158
+ dir: (0, configUtils_1.toAbsolute)(process.env.INDEX_SERVER_TRACE_DIR, path_1.default.join(configUtils_1.CWD, dirConstants_1.DIR.LOGS_TRACE)),
159
+ fsync: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_TRACE_FSYNC'),
160
+ maxFileSizeBytes: (0, configUtils_1.optionalIntFromEnv)('INDEX_SERVER_TRACE_MAX_FILE_SIZE') ?? 0,
161
+ sessionId: process.env.INDEX_SERVER_TRACE_SESSION || undefined,
162
+ callsite: (0, envUtils_1.getBooleanEnv)('INDEX_SERVER_TRACE_CALLSITE'),
163
+ };
164
+ }
@@ -0,0 +1,142 @@
1
+ /**
2
+ * AnalyticsEngine - Phase 3 Advanced Analytics & Business Intelligence
3
+ *
4
+ * Analytics engine providing:
5
+ * - Real-time trend analysis and forecasting
6
+ * - Business intelligence metrics and KPIs
7
+ * - Performance analytics and optimization insights
8
+ * - Usage pattern recognition and anomaly detection
9
+ */
10
+ export interface TimeSeriesData {
11
+ timestamp: number;
12
+ value: number;
13
+ metadata?: Record<string, string | number | boolean>;
14
+ }
15
+ export interface TrendAnalysis {
16
+ trend: 'increasing' | 'decreasing' | 'stable' | 'volatile';
17
+ confidence: number;
18
+ slope: number;
19
+ correlation: number;
20
+ forecast: TimeSeriesData[];
21
+ seasonality?: {
22
+ detected: boolean;
23
+ period: number;
24
+ strength: number;
25
+ };
26
+ }
27
+ export interface BusinessMetrics {
28
+ totalRequests: number;
29
+ successRate: number;
30
+ averageResponseTime: number;
31
+ errorRate: number;
32
+ throughput: number;
33
+ latencyPercentiles: {
34
+ p50: number;
35
+ p90: number;
36
+ p95: number;
37
+ p99: number;
38
+ };
39
+ topTools: Array<{
40
+ name: string;
41
+ usage: number;
42
+ trend: number;
43
+ revenue?: number;
44
+ }>;
45
+ userSegmentation: {
46
+ powerUsers: number;
47
+ regularUsers: number;
48
+ casualUsers: number;
49
+ };
50
+ growthRate: number;
51
+ retentionRate: number;
52
+ churnRate: number;
53
+ }
54
+ export interface AnomalyDetection {
55
+ anomalies: Array<{
56
+ timestamp: number;
57
+ value: number;
58
+ severity: 'low' | 'medium' | 'high' | 'critical';
59
+ type: 'spike' | 'drop' | 'outlier' | 'pattern_break';
60
+ description: string;
61
+ confidence: number;
62
+ }>;
63
+ patterns: Array<{
64
+ name: string;
65
+ description: string;
66
+ frequency: number;
67
+ lastSeen: number;
68
+ }>;
69
+ }
70
+ export interface PredictiveInsights {
71
+ nextHourForecast: TimeSeriesData[];
72
+ nextDayForecast: TimeSeriesData[];
73
+ nextWeekForecast: TimeSeriesData[];
74
+ recommendations: Array<{
75
+ type: 'optimization' | 'scaling' | 'maintenance' | 'business';
76
+ priority: 'low' | 'medium' | 'high' | 'critical';
77
+ title: string;
78
+ description: string;
79
+ impact: string;
80
+ effort: 'low' | 'medium' | 'high';
81
+ expectedRoi?: number;
82
+ }>;
83
+ alerts: Array<{
84
+ id: string;
85
+ type: 'performance' | 'capacity' | 'security' | 'business';
86
+ severity: 'info' | 'warning' | 'error' | 'critical';
87
+ message: string;
88
+ timestamp: number;
89
+ actionRequired: boolean;
90
+ }>;
91
+ }
92
+ export declare class AnalyticsEngine {
93
+ private timeSeriesData;
94
+ private businessMetrics;
95
+ private anomaliesHistory;
96
+ constructor();
97
+ private initializeMetrics;
98
+ /**
99
+ * Add time series data point for analysis
100
+ */
101
+ addDataPoint(metric: string, value: number, metadata?: Record<string, string | number | boolean>): void;
102
+ /**
103
+ * Perform trend analysis on time series data
104
+ */
105
+ analyzeTrend(metric: string, lookbackHours?: number): TrendAnalysis | null;
106
+ /**
107
+ * Detect anomalies in time series data
108
+ */
109
+ detectAnomalies(metric: string): AnomalyDetection;
110
+ /**
111
+ * Generate predictive insights and recommendations
112
+ */
113
+ generateInsights(): PredictiveInsights;
114
+ /**
115
+ * Get current business metrics
116
+ */
117
+ getBusinessMetrics(): BusinessMetrics;
118
+ /**
119
+ * Get time series data for visualization
120
+ */
121
+ getTimeSeriesData(metric: string, hours?: number): TimeSeriesData[];
122
+ /**
123
+ * Get available metrics list
124
+ */
125
+ getAvailableMetrics(): string[];
126
+ private calculateLinearRegression;
127
+ private determineTrend;
128
+ private calculateVolatility;
129
+ private generateForecast;
130
+ private detectSeasonality;
131
+ private calculateSeasonalStrength;
132
+ private findAnomalies;
133
+ private identifyPatterns;
134
+ private calculateHourlyAverages;
135
+ private generateRecommendations;
136
+ private generateAlerts;
137
+ private generateMetricForecast;
138
+ private updateBusinessMetrics;
139
+ private startAnalyticsLoop;
140
+ private performBackgroundAnalytics;
141
+ }
142
+ export declare function getAnalyticsEngine(): AnalyticsEngine;
@@ -0,0 +1,373 @@
1
+ "use strict";
2
+ /**
3
+ * AnalyticsEngine - Phase 3 Advanced Analytics & Business Intelligence
4
+ *
5
+ * Analytics engine providing:
6
+ * - Real-time trend analysis and forecasting
7
+ * - Business intelligence metrics and KPIs
8
+ * - Performance analytics and optimization insights
9
+ * - Usage pattern recognition and anomaly detection
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AnalyticsEngine = void 0;
13
+ exports.getAnalyticsEngine = getAnalyticsEngine;
14
+ class AnalyticsEngine {
15
+ timeSeriesData = new Map();
16
+ businessMetrics;
17
+ anomaliesHistory = [];
18
+ constructor() {
19
+ this.businessMetrics = this.initializeMetrics();
20
+ this.startAnalyticsLoop();
21
+ }
22
+ initializeMetrics() {
23
+ return {
24
+ totalRequests: 0,
25
+ successRate: 0.0,
26
+ averageResponseTime: 0,
27
+ errorRate: 0.0,
28
+ throughput: 0,
29
+ latencyPercentiles: { p50: 0, p90: 0, p95: 0, p99: 0 },
30
+ topTools: [],
31
+ userSegmentation: { powerUsers: 0, regularUsers: 0, casualUsers: 0 },
32
+ growthRate: 0,
33
+ retentionRate: 0,
34
+ churnRate: 0
35
+ };
36
+ }
37
+ /**
38
+ * Add time series data point for analysis
39
+ */
40
+ addDataPoint(metric, value, metadata) {
41
+ const dataPoint = {
42
+ timestamp: Date.now(),
43
+ value,
44
+ metadata
45
+ };
46
+ if (!this.timeSeriesData.has(metric)) {
47
+ this.timeSeriesData.set(metric, []);
48
+ }
49
+ const series = this.timeSeriesData.get(metric);
50
+ series.push(dataPoint);
51
+ // Keep only last 24 hours of data for performance
52
+ const twentyFourHoursAgo = Date.now() - (24 * 60 * 60 * 1000);
53
+ this.timeSeriesData.set(metric, series.filter(point => point.timestamp > twentyFourHoursAgo));
54
+ this.updateBusinessMetrics(metric, value, metadata);
55
+ }
56
+ /**
57
+ * Perform trend analysis on time series data
58
+ */
59
+ analyzeTrend(metric, lookbackHours = 1) {
60
+ const series = this.timeSeriesData.get(metric);
61
+ if (!series || series.length < 10)
62
+ return null;
63
+ const lookbackMs = lookbackHours * 60 * 60 * 1000;
64
+ const cutoff = Date.now() - lookbackMs;
65
+ const recentData = series.filter(point => point.timestamp >= cutoff);
66
+ if (recentData.length < 5)
67
+ return null;
68
+ // Calculate linear regression
69
+ const { slope, correlation } = this.calculateLinearRegression(recentData);
70
+ // Determine trend direction
71
+ const trend = this.determineTrend(slope, recentData);
72
+ // Calculate confidence based on correlation and data points
73
+ const confidence = Math.min(0.95, Math.abs(correlation) * (recentData.length / 100));
74
+ // Generate forecast
75
+ const forecast = this.generateForecast(recentData, slope, 12); // 12 future points
76
+ // Detect seasonality
77
+ const seasonality = this.detectSeasonality(series);
78
+ return {
79
+ trend,
80
+ confidence,
81
+ slope,
82
+ correlation,
83
+ forecast,
84
+ seasonality
85
+ };
86
+ }
87
+ /**
88
+ * Detect anomalies in time series data
89
+ */
90
+ detectAnomalies(metric) {
91
+ const series = this.timeSeriesData.get(metric) || [];
92
+ if (series.length < 20) {
93
+ return { anomalies: [], patterns: [] };
94
+ }
95
+ const anomalies = this.findAnomalies(series);
96
+ const patterns = this.identifyPatterns(series);
97
+ return { anomalies, patterns };
98
+ }
99
+ /**
100
+ * Generate predictive insights and recommendations
101
+ */
102
+ generateInsights() {
103
+ const recommendations = this.generateRecommendations();
104
+ const alerts = this.generateAlerts();
105
+ // Generate forecasts for key metrics
106
+ const nextHourForecast = this.generateMetricForecast('requests_per_minute', 60);
107
+ const nextDayForecast = this.generateMetricForecast('requests_per_hour', 24);
108
+ const nextWeekForecast = this.generateMetricForecast('requests_per_day', 7);
109
+ return {
110
+ nextHourForecast,
111
+ nextDayForecast,
112
+ nextWeekForecast,
113
+ recommendations,
114
+ alerts
115
+ };
116
+ }
117
+ /**
118
+ * Get current business metrics
119
+ */
120
+ getBusinessMetrics() {
121
+ return { ...this.businessMetrics };
122
+ }
123
+ /**
124
+ * Get time series data for visualization
125
+ */
126
+ getTimeSeriesData(metric, hours = 1) {
127
+ const series = this.timeSeriesData.get(metric) || [];
128
+ const cutoff = Date.now() - (hours * 60 * 60 * 1000);
129
+ return series.filter(point => point.timestamp >= cutoff);
130
+ }
131
+ /**
132
+ * Get available metrics list
133
+ */
134
+ getAvailableMetrics() {
135
+ return Array.from(this.timeSeriesData.keys());
136
+ }
137
+ // Private helper methods
138
+ calculateLinearRegression(data) {
139
+ const n = data.length;
140
+ if (n < 2)
141
+ return { slope: 0, correlation: 0 };
142
+ const x = data.map(point => point.timestamp);
143
+ const y = data.map(point => point.value);
144
+ const sumX = x.reduce((a, b) => a + b, 0);
145
+ const sumY = y.reduce((a, b) => a + b, 0);
146
+ const sumXY = x.reduce((total, xi, i) => total + xi * y[i], 0);
147
+ const sumXX = x.reduce((total, xi) => total + xi * xi, 0);
148
+ const sumYY = y.reduce((total, yi) => total + yi * yi, 0);
149
+ const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
150
+ const numerator = n * sumXY - sumX * sumY;
151
+ const denominator = Math.sqrt((n * sumXX - sumX * sumX) * (n * sumYY - sumY * sumY));
152
+ const correlation = denominator === 0 ? 0 : numerator / denominator;
153
+ return { slope, correlation };
154
+ }
155
+ determineTrend(slope, data) {
156
+ const values = data.map(point => point.value);
157
+ const volatility = this.calculateVolatility(values);
158
+ if (volatility > 0.5)
159
+ return 'volatile';
160
+ if (Math.abs(slope) < 0.001)
161
+ return 'stable';
162
+ return slope > 0 ? 'increasing' : 'decreasing';
163
+ }
164
+ calculateVolatility(values) {
165
+ if (values.length < 2)
166
+ return 0;
167
+ const mean = values.reduce((a, b) => a + b, 0) / values.length;
168
+ const variance = values.reduce((total, value) => total + Math.pow(value - mean, 2), 0) / values.length;
169
+ const stdDev = Math.sqrt(variance);
170
+ return mean === 0 ? 0 : stdDev / Math.abs(mean);
171
+ }
172
+ generateForecast(data, slope, points) {
173
+ if (data.length === 0)
174
+ return [];
175
+ const lastPoint = data[data.length - 1];
176
+ const timeInterval = data.length > 1 ?
177
+ (lastPoint.timestamp - data[data.length - 2].timestamp) : 60000; // 1 minute default
178
+ const forecast = [];
179
+ for (let i = 1; i <= points; i++) {
180
+ const timestamp = lastPoint.timestamp + (i * timeInterval);
181
+ const value = Math.max(0, lastPoint.value + (slope * i * timeInterval));
182
+ forecast.push({
183
+ timestamp,
184
+ value,
185
+ metadata: { forecasted: true }
186
+ });
187
+ }
188
+ return forecast;
189
+ }
190
+ detectSeasonality(data) {
191
+ if (data.length < 48)
192
+ return { detected: false, period: 0, strength: 0 };
193
+ // Simple seasonality detection - check for repeating patterns
194
+ const values = data.map(point => point.value);
195
+ const periods = [12, 24, 48, 96]; // 5min, 10min, 20min, 40min intervals
196
+ let bestPeriod = 0;
197
+ let bestStrength = 0;
198
+ for (const period of periods) {
199
+ if (period * 2 > values.length)
200
+ continue;
201
+ const strength = this.calculateSeasonalStrength(values, period);
202
+ if (strength > bestStrength) {
203
+ bestStrength = strength;
204
+ bestPeriod = period;
205
+ }
206
+ }
207
+ return {
208
+ detected: bestStrength > 0.3,
209
+ period: bestPeriod,
210
+ strength: bestStrength
211
+ };
212
+ }
213
+ calculateSeasonalStrength(values, period) {
214
+ if (values.length < period * 2)
215
+ return 0;
216
+ let correlation = 0;
217
+ let count = 0;
218
+ for (let i = period; i < values.length; i++) {
219
+ correlation += values[i] * values[i - period];
220
+ count++;
221
+ }
222
+ return count === 0 ? 0 : Math.abs(correlation / count) / Math.max(1, Math.max(...values));
223
+ }
224
+ findAnomalies(data) {
225
+ if (data.length < 10)
226
+ return [];
227
+ const values = data.map(point => point.value);
228
+ const mean = values.reduce((a, b) => a + b, 0) / values.length;
229
+ const stdDev = Math.sqrt(values.reduce((total, value) => total + Math.pow(value - mean, 2), 0) / values.length);
230
+ const anomalies = [];
231
+ for (let i = 0; i < data.length; i++) {
232
+ const point = data[i];
233
+ const zScore = stdDev === 0 ? 0 : Math.abs(point.value - mean) / stdDev;
234
+ if (zScore > 2.5) {
235
+ const severity = zScore > 4 ? 'critical' : zScore > 3.5 ? 'high' : zScore > 3 ? 'medium' : 'low';
236
+ const type = point.value > mean ? 'spike' : 'drop';
237
+ anomalies.push({
238
+ timestamp: point.timestamp,
239
+ value: point.value,
240
+ severity,
241
+ type,
242
+ description: `${type === 'spike' ? 'Unusual spike' : 'Unusual drop'} detected (${zScore.toFixed(1)}σ from mean)`,
243
+ confidence: Math.min(0.95, zScore / 4)
244
+ });
245
+ }
246
+ }
247
+ return anomalies;
248
+ }
249
+ identifyPatterns(data) {
250
+ // Simple pattern identification - could be enhanced with more sophisticated algorithms
251
+ const patterns = [];
252
+ if (data.length >= 24) {
253
+ const hourlyAverages = this.calculateHourlyAverages(data);
254
+ const peakHour = hourlyAverages.indexOf(Math.max(...hourlyAverages));
255
+ patterns.push({
256
+ name: 'Daily Peak Pattern',
257
+ description: `Peak usage typically occurs around hour ${peakHour}`,
258
+ frequency: 1.0, // daily
259
+ lastSeen: Date.now()
260
+ });
261
+ }
262
+ return patterns;
263
+ }
264
+ calculateHourlyAverages(data) {
265
+ const hourlyBuckets = Array(24).fill(0).map(() => []);
266
+ data.forEach(point => {
267
+ const hour = new Date(point.timestamp).getHours();
268
+ hourlyBuckets[hour].push(point.value);
269
+ });
270
+ return hourlyBuckets.map(bucket => bucket.length === 0 ? 0 : bucket.reduce((a, b) => a + b, 0) / bucket.length);
271
+ }
272
+ generateRecommendations() {
273
+ const recommendations = [];
274
+ // Analyze current metrics and generate recommendations
275
+ if (this.businessMetrics.errorRate > 0.05) {
276
+ recommendations.push({
277
+ type: 'optimization',
278
+ priority: 'high',
279
+ title: 'Reduce Error Rate',
280
+ description: `Current error rate is ${(this.businessMetrics.errorRate * 100).toFixed(1)}%, which is above the 5% threshold`,
281
+ impact: 'Improve user experience and system reliability',
282
+ effort: 'medium',
283
+ expectedRoi: 0.15
284
+ });
285
+ }
286
+ if (this.businessMetrics.averageResponseTime > 1000) {
287
+ recommendations.push({
288
+ type: 'optimization',
289
+ priority: 'medium',
290
+ title: 'Optimize Response Times',
291
+ description: `Average response time is ${this.businessMetrics.averageResponseTime}ms, consider optimization`,
292
+ impact: 'Better user experience and increased throughput',
293
+ effort: 'medium',
294
+ expectedRoi: 0.12
295
+ });
296
+ }
297
+ return recommendations;
298
+ }
299
+ generateAlerts() {
300
+ const alerts = [];
301
+ const now = Date.now();
302
+ // Generate alerts based on current metrics
303
+ if (this.businessMetrics.errorRate > 0.1) {
304
+ alerts.push({
305
+ id: `error-rate-${now}`,
306
+ type: 'performance',
307
+ severity: 'critical',
308
+ message: `Error rate critically high: ${(this.businessMetrics.errorRate * 100).toFixed(1)}%`,
309
+ timestamp: now,
310
+ actionRequired: true
311
+ });
312
+ }
313
+ if (this.businessMetrics.throughput < 1) {
314
+ alerts.push({
315
+ id: `low-throughput-${now}`,
316
+ type: 'performance',
317
+ severity: 'warning',
318
+ message: 'Low throughput detected, consider investigating performance',
319
+ timestamp: now,
320
+ actionRequired: false
321
+ });
322
+ }
323
+ return alerts;
324
+ }
325
+ generateMetricForecast(metric, points) {
326
+ const trend = this.analyzeTrend(metric, 1);
327
+ return trend?.forecast.slice(0, points) || [];
328
+ }
329
+ updateBusinessMetrics(metric, value, _metadata) {
330
+ // Update business metrics based on incoming data
331
+ switch (metric) {
332
+ case 'total_requests':
333
+ this.businessMetrics.totalRequests = value;
334
+ break;
335
+ case 'response_time':
336
+ this.businessMetrics.averageResponseTime = value;
337
+ break;
338
+ case 'error_rate':
339
+ this.businessMetrics.errorRate = value;
340
+ break;
341
+ case 'throughput':
342
+ this.businessMetrics.throughput = value;
343
+ break;
344
+ }
345
+ }
346
+ startAnalyticsLoop() {
347
+ // Start background analytics processing
348
+ setInterval(() => {
349
+ this.performBackgroundAnalytics();
350
+ }, 60000); // Every minute
351
+ }
352
+ performBackgroundAnalytics() {
353
+ // Background processing for continuous analytics
354
+ const metrics = this.getAvailableMetrics();
355
+ metrics.forEach(metric => {
356
+ const anomalies = this.detectAnomalies(metric);
357
+ if (anomalies.anomalies.length > 0) {
358
+ this.anomaliesHistory.push(anomalies);
359
+ // Keep only recent history
360
+ this.anomaliesHistory = this.anomaliesHistory.slice(-100);
361
+ }
362
+ });
363
+ }
364
+ }
365
+ exports.AnalyticsEngine = AnalyticsEngine;
366
+ // Singleton instance
367
+ let analyticsEngine = null;
368
+ function getAnalyticsEngine() {
369
+ if (!analyticsEngine) {
370
+ analyticsEngine = new AnalyticsEngine();
371
+ }
372
+ return analyticsEngine;
373
+ }