@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.
- package/CHANGELOG.md +1218 -0
- package/CODE_OF_CONDUCT.md +49 -0
- package/CONTRIBUTING.md +75 -0
- package/LICENSE +21 -0
- package/README.md +523 -0
- package/SECURITY.md +50 -0
- package/dist/config/configUtils.d.ts +11 -0
- package/dist/config/configUtils.js +87 -0
- package/dist/config/dashboardConfig.d.ts +45 -0
- package/dist/config/dashboardConfig.js +63 -0
- package/dist/config/defaultValues.d.ts +61 -0
- package/dist/config/defaultValues.js +70 -0
- package/dist/config/dirConstants.d.ts +17 -0
- package/dist/config/dirConstants.js +28 -0
- package/dist/config/featureConfig.d.ts +61 -0
- package/dist/config/featureConfig.js +121 -0
- package/dist/config/runtimeConfig.d.ts +145 -0
- package/dist/config/runtimeConfig.js +334 -0
- package/dist/config/serverConfig.d.ts +90 -0
- package/dist/config/serverConfig.js +164 -0
- package/dist/dashboard/analytics/AnalyticsEngine.d.ts +142 -0
- package/dist/dashboard/analytics/AnalyticsEngine.js +373 -0
- package/dist/dashboard/analytics/BusinessIntelligence.d.ts +187 -0
- package/dist/dashboard/analytics/BusinessIntelligence.js +594 -0
- package/dist/dashboard/client/admin.html +2150 -0
- package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/chunk-SP2CHFBE.mjs +1 -0
- package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/render-T6MDALS3.mjs +27 -0
- package/dist/dashboard/client/css/admin.css +1466 -0
- package/dist/dashboard/client/js/admin.boot.js +359 -0
- package/dist/dashboard/client/js/admin.config.js +196 -0
- package/dist/dashboard/client/js/admin.embeddings.js +425 -0
- package/dist/dashboard/client/js/admin.graph.js +583 -0
- package/dist/dashboard/client/js/admin.instances.js +120 -0
- package/dist/dashboard/client/js/admin.instructions.js +552 -0
- package/dist/dashboard/client/js/admin.logs.js +113 -0
- package/dist/dashboard/client/js/admin.maintenance.js +354 -0
- package/dist/dashboard/client/js/admin.messaging.js +635 -0
- package/dist/dashboard/client/js/admin.monitor.js +181 -0
- package/dist/dashboard/client/js/admin.overview.js +221 -0
- package/dist/dashboard/client/js/admin.performance.js +61 -0
- package/dist/dashboard/client/js/admin.sessions.js +293 -0
- package/dist/dashboard/client/js/admin.sqlite.js +366 -0
- package/dist/dashboard/client/js/admin.utils.js +49 -0
- package/dist/dashboard/client/js/chart.umd.js +14 -0
- package/dist/dashboard/client/js/elk.bundled.js +6696 -0
- package/dist/dashboard/client/js/marked.umd.js +74 -0
- package/dist/dashboard/client/js/mermaid.min.js +3022 -0
- package/dist/dashboard/client/mermaid-layout-elk.esm.min.mjs +1 -0
- package/dist/dashboard/export/DataExporter.d.ts +169 -0
- package/dist/dashboard/export/DataExporter.js +737 -0
- package/dist/dashboard/export/exporters/csvExporter.d.ts +11 -0
- package/dist/dashboard/export/exporters/csvExporter.js +46 -0
- package/dist/dashboard/export/exporters/exportTypes.d.ts +89 -0
- package/dist/dashboard/export/exporters/exportTypes.js +5 -0
- package/dist/dashboard/export/exporters/jsonExporter.d.ts +7 -0
- package/dist/dashboard/export/exporters/jsonExporter.js +22 -0
- package/dist/dashboard/export/exporters/xmlExporter.d.ts +17 -0
- package/dist/dashboard/export/exporters/xmlExporter.js +175 -0
- package/dist/dashboard/integration/APIIntegration.d.ts +41 -0
- package/dist/dashboard/integration/APIIntegration.js +95 -0
- package/dist/dashboard/security/SecurityMonitor.d.ts +167 -0
- package/dist/dashboard/security/SecurityMonitor.js +559 -0
- package/dist/dashboard/server/AdminPanel.d.ts +183 -0
- package/dist/dashboard/server/AdminPanel.js +792 -0
- package/dist/dashboard/server/AdminPanelConfig.d.ts +42 -0
- package/dist/dashboard/server/AdminPanelConfig.js +80 -0
- package/dist/dashboard/server/AdminPanelState.d.ts +47 -0
- package/dist/dashboard/server/AdminPanelState.js +214 -0
- package/dist/dashboard/server/ApiRoutes.d.ts +17 -0
- package/dist/dashboard/server/ApiRoutes.js +149 -0
- package/dist/dashboard/server/DashboardServer.d.ts +49 -0
- package/dist/dashboard/server/DashboardServer.js +159 -0
- package/dist/dashboard/server/FileMetricsStorage.d.ts +49 -0
- package/dist/dashboard/server/FileMetricsStorage.js +195 -0
- package/dist/dashboard/server/HttpTransport.d.ts +23 -0
- package/dist/dashboard/server/HttpTransport.js +116 -0
- package/dist/dashboard/server/InstanceManager.d.ts +53 -0
- package/dist/dashboard/server/InstanceManager.js +284 -0
- package/dist/dashboard/server/KnowledgeStore.d.ts +35 -0
- package/dist/dashboard/server/KnowledgeStore.js +105 -0
- package/dist/dashboard/server/LeaderElection.d.ts +81 -0
- package/dist/dashboard/server/LeaderElection.js +268 -0
- package/dist/dashboard/server/MetricsCollector.d.ts +200 -0
- package/dist/dashboard/server/MetricsCollector.js +803 -0
- package/dist/dashboard/server/SessionPersistenceManager.d.ts +88 -0
- package/dist/dashboard/server/SessionPersistenceManager.js +457 -0
- package/dist/dashboard/server/ThinClient.d.ts +64 -0
- package/dist/dashboard/server/ThinClient.js +237 -0
- package/dist/dashboard/server/WebSocketManager.d.ts +161 -0
- package/dist/dashboard/server/WebSocketManager.js +463 -0
- package/dist/dashboard/server/httpLifecycle.d.ts +17 -0
- package/dist/dashboard/server/httpLifecycle.js +35 -0
- package/dist/dashboard/server/legacyDashboardHtml.d.ts +9 -0
- package/dist/dashboard/server/legacyDashboardHtml.js +618 -0
- package/dist/dashboard/server/legacyDashboardStyles.d.ts +5 -0
- package/dist/dashboard/server/legacyDashboardStyles.js +490 -0
- package/dist/dashboard/server/metricsAggregation.d.ts +252 -0
- package/dist/dashboard/server/metricsAggregation.js +206 -0
- package/dist/dashboard/server/metricsSerializer.d.ts +25 -0
- package/dist/dashboard/server/metricsSerializer.js +195 -0
- package/dist/dashboard/server/routes/admin.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/admin.routes.js +596 -0
- package/dist/dashboard/server/routes/alerts.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/alerts.routes.js +93 -0
- package/dist/dashboard/server/routes/api.feedback.routes.d.ts +73 -0
- package/dist/dashboard/server/routes/api.feedback.routes.js +171 -0
- package/dist/dashboard/server/routes/api.instructions.routes.d.ts +101 -0
- package/dist/dashboard/server/routes/api.instructions.routes.js +213 -0
- package/dist/dashboard/server/routes/api.usage.routes.d.ts +57 -0
- package/dist/dashboard/server/routes/api.usage.routes.js +374 -0
- package/dist/dashboard/server/routes/embeddings.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/embeddings.routes.js +246 -0
- package/dist/dashboard/server/routes/graph.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/graph.routes.js +280 -0
- package/dist/dashboard/server/routes/index.d.ts +38 -0
- package/dist/dashboard/server/routes/index.js +194 -0
- package/dist/dashboard/server/routes/instances.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/instances.routes.js +35 -0
- package/dist/dashboard/server/routes/instructions.routes.d.ts +8 -0
- package/dist/dashboard/server/routes/instructions.routes.js +336 -0
- package/dist/dashboard/server/routes/knowledge.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/knowledge.routes.js +82 -0
- package/dist/dashboard/server/routes/logs.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/logs.routes.js +164 -0
- package/dist/dashboard/server/routes/messaging.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/messaging.routes.js +293 -0
- package/dist/dashboard/server/routes/metrics.routes.d.ts +10 -0
- package/dist/dashboard/server/routes/metrics.routes.js +346 -0
- package/dist/dashboard/server/routes/scripts.routes.d.ts +9 -0
- package/dist/dashboard/server/routes/scripts.routes.js +84 -0
- package/dist/dashboard/server/routes/sqlite.routes.d.ts +9 -0
- package/dist/dashboard/server/routes/sqlite.routes.js +569 -0
- package/dist/dashboard/server/routes/status.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/status.routes.js +183 -0
- package/dist/dashboard/server/routes/synthetic.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/synthetic.routes.js +195 -0
- package/dist/dashboard/server/routes/tools.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/tools.routes.js +46 -0
- package/dist/dashboard/server/routes/usage.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/usage.routes.js +25 -0
- package/dist/dashboard/server/wsInit.d.ts +16 -0
- package/dist/dashboard/server/wsInit.js +35 -0
- package/dist/externalClientLib.d.ts +1 -0
- package/dist/externalClientLib.js +2 -0
- package/dist/minimal/index.d.ts +1 -0
- package/dist/minimal/index.js +140 -0
- package/dist/models/SessionPersistence.d.ts +115 -0
- package/dist/models/SessionPersistence.js +66 -0
- package/dist/models/instruction.d.ts +45 -0
- package/dist/models/instruction.js +2 -0
- package/dist/perf/benchmark.d.ts +1 -0
- package/dist/perf/benchmark.js +50 -0
- package/dist/portableClientWrapper.d.ts +1 -0
- package/dist/portableClientWrapper.js +2 -0
- package/dist/schemas/index.d.ts +128 -0
- package/dist/schemas/index.js +371 -0
- package/dist/scripts/runPerformanceBaseline.d.ts +1 -0
- package/dist/scripts/runPerformanceBaseline.js +17 -0
- package/dist/server/handshakeManager.d.ts +25 -0
- package/dist/server/handshakeManager.js +472 -0
- package/dist/server/index-server.d.ts +56 -0
- package/dist/server/index-server.js +822 -0
- package/dist/server/registry.d.ts +44 -0
- package/dist/server/registry.js +236 -0
- package/dist/server/sdkServer.d.ts +8 -0
- package/dist/server/sdkServer.js +299 -0
- package/dist/server/shutdownGuard.d.ts +41 -0
- package/dist/server/shutdownGuard.js +52 -0
- package/dist/server/thin-client.d.ts +22 -0
- package/dist/server/thin-client.js +111 -0
- package/dist/server/transport.d.ts +41 -0
- package/dist/server/transport.js +312 -0
- package/dist/server/transportFactory.d.ts +21 -0
- package/dist/server/transportFactory.js +429 -0
- package/dist/services/atomicFs.d.ts +22 -0
- package/dist/services/atomicFs.js +103 -0
- package/dist/services/auditLog.d.ts +38 -0
- package/dist/services/auditLog.js +142 -0
- package/dist/services/autoBackup.d.ts +14 -0
- package/dist/services/autoBackup.js +171 -0
- package/dist/services/autoSplit.d.ts +32 -0
- package/dist/services/autoSplit.js +113 -0
- package/dist/services/backupZip.d.ts +25 -0
- package/dist/services/backupZip.js +110 -0
- package/dist/services/bootstrapGating.d.ts +123 -0
- package/dist/services/bootstrapGating.js +221 -0
- package/dist/services/canonical.d.ts +23 -0
- package/dist/services/canonical.js +65 -0
- package/dist/services/categoryRules.d.ts +7 -0
- package/dist/services/categoryRules.js +37 -0
- package/dist/services/classificationService.d.ts +42 -0
- package/dist/services/classificationService.js +168 -0
- package/dist/services/embeddingService.d.ts +62 -0
- package/dist/services/embeddingService.js +259 -0
- package/dist/services/errors.d.ts +22 -0
- package/dist/services/errors.js +31 -0
- package/dist/services/featureFlags.d.ts +25 -0
- package/dist/services/featureFlags.js +89 -0
- package/dist/services/features.d.ts +13 -0
- package/dist/services/features.js +35 -0
- package/dist/services/handlers/instructions.add.d.ts +1 -0
- package/dist/services/handlers/instructions.add.js +496 -0
- package/dist/services/handlers/instructions.groom.d.ts +1 -0
- package/dist/services/handlers/instructions.groom.js +523 -0
- package/dist/services/handlers/instructions.import.d.ts +1 -0
- package/dist/services/handlers/instructions.import.js +173 -0
- package/dist/services/handlers/instructions.patch.d.ts +1 -0
- package/dist/services/handlers/instructions.patch.js +167 -0
- package/dist/services/handlers/instructions.query.d.ts +163 -0
- package/dist/services/handlers/instructions.query.js +522 -0
- package/dist/services/handlers/instructions.reload.d.ts +1 -0
- package/dist/services/handlers/instructions.reload.js +13 -0
- package/dist/services/handlers/instructions.remove.d.ts +1 -0
- package/dist/services/handlers/instructions.remove.js +118 -0
- package/dist/services/handlers/instructions.shared.d.ts +31 -0
- package/dist/services/handlers/instructions.shared.js +124 -0
- package/dist/services/handlers.activation.d.ts +1 -0
- package/dist/services/handlers.activation.js +203 -0
- package/dist/services/handlers.bootstrap.d.ts +1 -0
- package/dist/services/handlers.bootstrap.js +38 -0
- package/dist/services/handlers.dashboardConfig.d.ts +34 -0
- package/dist/services/handlers.dashboardConfig.js +108 -0
- package/dist/services/handlers.diagnostics.d.ts +1 -0
- package/dist/services/handlers.diagnostics.js +64 -0
- package/dist/services/handlers.feedback.d.ts +15 -0
- package/dist/services/handlers.feedback.js +378 -0
- package/dist/services/handlers.gates.d.ts +1 -0
- package/dist/services/handlers.gates.js +46 -0
- package/dist/services/handlers.graph.d.ts +53 -0
- package/dist/services/handlers.graph.js +231 -0
- package/dist/services/handlers.help.d.ts +1 -0
- package/dist/services/handlers.help.js +119 -0
- package/dist/services/handlers.instructionSchema.d.ts +1 -0
- package/dist/services/handlers.instructionSchema.js +227 -0
- package/dist/services/handlers.instructions.d.ts +8 -0
- package/dist/services/handlers.instructions.js +14 -0
- package/dist/services/handlers.instructionsDiagnostics.d.ts +1 -0
- package/dist/services/handlers.instructionsDiagnostics.js +14 -0
- package/dist/services/handlers.integrity.d.ts +1 -0
- package/dist/services/handlers.integrity.js +35 -0
- package/dist/services/handlers.manifest.d.ts +1 -0
- package/dist/services/handlers.manifest.js +24 -0
- package/dist/services/handlers.messaging.d.ts +12 -0
- package/dist/services/handlers.messaging.js +203 -0
- package/dist/services/handlers.metrics.d.ts +1 -0
- package/dist/services/handlers.metrics.js +43 -0
- package/dist/services/handlers.promote.d.ts +1 -0
- package/dist/services/handlers.promote.js +306 -0
- package/dist/services/handlers.prompt.d.ts +1 -0
- package/dist/services/handlers.prompt.js +7 -0
- package/dist/services/handlers.search.d.ts +69 -0
- package/dist/services/handlers.search.js +645 -0
- package/dist/services/handlers.testPrimitive.d.ts +1 -0
- package/dist/services/handlers.testPrimitive.js +5 -0
- package/dist/services/handlers.trace.d.ts +1 -0
- package/dist/services/handlers.trace.js +31 -0
- package/dist/services/handlers.usage.d.ts +1 -0
- package/dist/services/handlers.usage.js +11 -0
- package/dist/services/hotScore.d.ts +137 -0
- package/dist/services/hotScore.js +244 -0
- package/dist/services/indexContext.d.ts +117 -0
- package/dist/services/indexContext.js +968 -0
- package/dist/services/indexLoader.d.ts +44 -0
- package/dist/services/indexLoader.js +921 -0
- package/dist/services/indexRepository.d.ts +32 -0
- package/dist/services/indexRepository.js +71 -0
- package/dist/services/indexingService.d.ts +1 -0
- package/dist/services/indexingService.js +2 -0
- package/dist/services/instructions.dispatcher.d.ts +1 -0
- package/dist/services/instructions.dispatcher.js +231 -0
- package/dist/services/logPrefix.d.ts +1 -0
- package/dist/services/logPrefix.js +30 -0
- package/dist/services/logger.d.ts +52 -0
- package/dist/services/logger.js +268 -0
- package/dist/services/manifestManager.d.ts +82 -0
- package/dist/services/manifestManager.js +200 -0
- package/dist/services/messaging/agentMailbox.d.ts +60 -0
- package/dist/services/messaging/agentMailbox.js +353 -0
- package/dist/services/messaging/messagingPersistence.d.ts +20 -0
- package/dist/services/messaging/messagingPersistence.js +111 -0
- package/dist/services/messaging/messagingTypes.d.ts +150 -0
- package/dist/services/messaging/messagingTypes.js +66 -0
- package/dist/services/ownershipService.d.ts +1 -0
- package/dist/services/ownershipService.js +38 -0
- package/dist/services/performanceBaseline.d.ts +19 -0
- package/dist/services/performanceBaseline.js +210 -0
- package/dist/services/preflight.d.ts +12 -0
- package/dist/services/preflight.js +79 -0
- package/dist/services/promptReviewService.d.ts +44 -0
- package/dist/services/promptReviewService.js +101 -0
- package/dist/services/responseEnvelope.d.ts +6 -0
- package/dist/services/responseEnvelope.js +25 -0
- package/dist/services/seedBootstrap.d.ts +34 -0
- package/dist/services/seedBootstrap.js +427 -0
- package/dist/services/storage/factory.d.ts +17 -0
- package/dist/services/storage/factory.js +35 -0
- package/dist/services/storage/hashUtils.d.ts +11 -0
- package/dist/services/storage/hashUtils.js +35 -0
- package/dist/services/storage/index.d.ts +12 -0
- package/dist/services/storage/index.js +18 -0
- package/dist/services/storage/jsonFileStore.d.ts +32 -0
- package/dist/services/storage/jsonFileStore.js +241 -0
- package/dist/services/storage/migrationEngine.d.ts +35 -0
- package/dist/services/storage/migrationEngine.js +93 -0
- package/dist/services/storage/sqliteMessageStore.d.ts +53 -0
- package/dist/services/storage/sqliteMessageStore.js +146 -0
- package/dist/services/storage/sqliteSchema.d.ts +12 -0
- package/dist/services/storage/sqliteSchema.js +122 -0
- package/dist/services/storage/sqliteStore.d.ts +41 -0
- package/dist/services/storage/sqliteStore.js +339 -0
- package/dist/services/storage/sqliteUsageStore.d.ts +35 -0
- package/dist/services/storage/sqliteUsageStore.js +94 -0
- package/dist/services/storage/types.d.ts +171 -0
- package/dist/services/storage/types.js +12 -0
- package/dist/services/toolHandlers.d.ts +23 -0
- package/dist/services/toolHandlers.js +50 -0
- package/dist/services/toolRegistry.d.ts +20 -0
- package/dist/services/toolRegistry.js +490 -0
- package/dist/services/toolRegistry.zod.d.ts +10 -0
- package/dist/services/toolRegistry.zod.js +323 -0
- package/dist/services/tracing.d.ts +26 -0
- package/dist/services/tracing.js +260 -0
- package/dist/services/usageBuckets.d.ts +161 -0
- package/dist/services/usageBuckets.js +364 -0
- package/dist/services/validationService.d.ts +38 -0
- package/dist/services/validationService.js +125 -0
- package/dist/utils/BufferRing.d.ts +203 -0
- package/dist/utils/BufferRing.js +551 -0
- package/dist/utils/BufferRingExamples.d.ts +55 -0
- package/dist/utils/BufferRingExamples.js +188 -0
- package/dist/utils/envUtils.d.ts +42 -0
- package/dist/utils/envUtils.js +80 -0
- package/dist/utils/memoryMonitor.d.ts +83 -0
- package/dist/utils/memoryMonitor.js +275 -0
- package/dist/versioning/schemaVersion.d.ts +6 -0
- package/dist/versioning/schemaVersion.js +93 -0
- package/package.json +134 -0
- package/schemas/README.md +13 -0
- package/schemas/feedback-entry.schema.json +27 -0
- package/schemas/graph-export-v2.schema.json +60 -0
- package/schemas/index-server.code-schema.json +38477 -0
- package/schemas/instruction.schema.json +262 -0
- package/schemas/json-schema/SessionPersistence-persisted-admin-session.schema.json +54 -0
- package/schemas/json-schema/SessionPersistence-persisted-session-history-entry.schema.json +51 -0
- package/schemas/json-schema/SessionPersistence-persisted-web-socket-connection.schema.json +54 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-config.schema.json +110 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-data.schema.json +229 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-manifest.schema.json +109 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-metadata.schema.json +55 -0
- package/schemas/json-schema/instruction-audience-scope.schema.json +14 -0
- package/schemas/json-schema/instruction-content-type.schema.json +17 -0
- package/schemas/json-schema/instruction-instruction-entry.schema.json +206 -0
- package/schemas/json-schema/instruction-requirement-level.schema.json +16 -0
- package/schemas/manifest.json +78 -0
- package/schemas/manifest.schema.json +33 -0
- package/schemas/usage-batch.schema.json +16 -0
- package/schemas/usage-buckets.schema.json +30 -0
- package/schemas/usage-event.schema.json +17 -0
- package/scripts/copy-dashboard-assets.mjs +170 -0
- 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
|
+
}
|