@juspay/neurolink 9.32.0 → 9.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/auth/anthropicOAuth.js +1 -1
- package/dist/cli/commands/proxy.js +18 -5
- package/dist/client/aiSdkAdapter.js +1 -1
- package/dist/client/index.js +137 -501
- package/dist/core/factory.js +0 -1
- package/dist/core/redisConversationMemoryManager.js +1 -1
- package/dist/features/ppt/slideGenerator.js +0 -1
- package/dist/features/ppt/utils.js +0 -1
- package/dist/lib/neurolink.d.ts +10 -0
- package/dist/lib/neurolink.js +41 -7
- package/dist/lib/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/lib/types/generateTypes.d.ts +16 -0
- package/dist/lib/types/streamTypes.d.ts +15 -0
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- package/dist/neurolink.d.ts +10 -0
- package/dist/neurolink.js +41 -7
- package/dist/providers/azureOpenai.js +1 -1
- package/dist/providers/huggingFace.js +0 -1
- package/dist/providers/openaiCompatible.js +0 -1
- package/dist/sdk/toolRegistration.js +0 -1
- package/dist/server/openapi/generator.js +1 -1
- package/dist/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/types/configTypes.js +0 -5
- package/dist/types/generateTypes.d.ts +16 -0
- package/dist/types/modelTypes.js +0 -1
- package/dist/types/streamTypes.d.ts +15 -0
- package/dist/types/tools.js +0 -1
- package/dist/types/typeAliases.js +0 -1
- package/dist/types/utilities.js +1 -1
- package/dist/types/workflowTypes.js +0 -1
- package/dist/utils/providerRetry.js +0 -1
- package/dist/utils/providerUtils.js +0 -1
- package/package.json +2 -2
- package/dist/client/adapters/providerImageAdapter.js +0 -588
- package/dist/client/adapters/tts/googleTTSHandler.js +0 -344
- package/dist/client/adapters/video/directorPipeline.js +0 -516
- package/dist/client/adapters/video/ffmpegAdapter.js +0 -206
- package/dist/client/adapters/video/frameExtractor.js +0 -143
- package/dist/client/adapters/video/vertexVideoHandler.js +0 -763
- package/dist/client/adapters/video/videoAnalyzer.js +0 -238
- package/dist/client/adapters/video/videoMerger.js +0 -171
- package/dist/client/agent/directTools.js +0 -840
- package/dist/client/auth/AuthProviderFactory.js +0 -111
- package/dist/client/auth/AuthProviderRegistry.js +0 -190
- package/dist/client/auth/RequestContext.js +0 -78
- package/dist/client/auth/accountPool.js +0 -178
- package/dist/client/auth/anthropicOAuth.js +0 -974
- package/dist/client/auth/authContext.js +0 -314
- package/dist/client/auth/errors.js +0 -39
- package/dist/client/auth/index.js +0 -61
- package/dist/client/auth/middleware/AuthMiddleware.js +0 -519
- package/dist/client/auth/middleware/rateLimitByUser.js +0 -554
- package/dist/client/auth/providers/BaseAuthProvider.js +0 -723
- package/dist/client/auth/providers/CognitoProvider.js +0 -304
- package/dist/client/auth/providers/KeycloakProvider.js +0 -393
- package/dist/client/auth/providers/auth0.js +0 -274
- package/dist/client/auth/providers/betterAuth.js +0 -182
- package/dist/client/auth/providers/clerk.js +0 -317
- package/dist/client/auth/providers/custom.js +0 -112
- package/dist/client/auth/providers/firebase.js +0 -226
- package/dist/client/auth/providers/jwt.js +0 -212
- package/dist/client/auth/providers/oauth2.js +0 -303
- package/dist/client/auth/providers/supabase.js +0 -259
- package/dist/client/auth/providers/workos.js +0 -284
- package/dist/client/auth/serverBridge.js +0 -25
- package/dist/client/auth/sessionManager.js +0 -437
- package/dist/client/auth/tokenStore.js +0 -799
- package/dist/client/client/aiSdkAdapter.js +0 -487
- package/dist/client/client/auth.js +0 -473
- package/dist/client/client/errors.js +0 -552
- package/dist/client/client/httpClient.js +0 -837
- package/dist/client/client/index.js +0 -172
- package/dist/client/client/interceptors.js +0 -601
- package/dist/client/client/sseClient.js +0 -545
- package/dist/client/client/streamingClient.js +0 -917
- package/dist/client/client/wsClient.js +0 -369
- package/dist/client/config/configManager.js +0 -303
- package/dist/client/config/conversationMemory.js +0 -86
- package/dist/client/config/taskClassificationConfig.js +0 -148
- package/dist/client/constants/contextWindows.js +0 -295
- package/dist/client/constants/enums.js +0 -853
- package/dist/client/constants/index.js +0 -207
- package/dist/client/constants/performance.js +0 -389
- package/dist/client/constants/retry.js +0 -266
- package/dist/client/constants/timeouts.js +0 -182
- package/dist/client/constants/tokens.js +0 -380
- package/dist/client/constants/videoErrors.js +0 -46
- package/dist/client/context/budgetChecker.js +0 -98
- package/dist/client/context/contextCompactor.js +0 -205
- package/dist/client/context/emergencyTruncation.js +0 -88
- package/dist/client/context/errorDetection.js +0 -171
- package/dist/client/context/errors.js +0 -21
- package/dist/client/context/fileTokenBudget.js +0 -127
- package/dist/client/context/prompts/summarizationPrompt.js +0 -117
- package/dist/client/context/stages/fileReadDeduplicator.js +0 -66
- package/dist/client/context/stages/slidingWindowTruncator.js +0 -190
- package/dist/client/context/stages/structuredSummarizer.js +0 -99
- package/dist/client/context/stages/toolOutputPruner.js +0 -52
- package/dist/client/context/summarizationEngine.js +0 -136
- package/dist/client/context/toolOutputLimits.js +0 -78
- package/dist/client/context/toolPairRepair.js +0 -66
- package/dist/client/core/analytics.js +0 -88
- package/dist/client/core/baseProvider.js +0 -1385
- package/dist/client/core/constants.js +0 -140
- package/dist/client/core/conversationMemoryFactory.js +0 -141
- package/dist/client/core/conversationMemoryInitializer.js +0 -128
- package/dist/client/core/conversationMemoryManager.js +0 -344
- package/dist/client/core/dynamicModels.js +0 -358
- package/dist/client/core/evaluation.js +0 -309
- package/dist/client/core/evaluationProviders.js +0 -248
- package/dist/client/core/factory.js +0 -412
- package/dist/client/core/infrastructure/baseError.js +0 -22
- package/dist/client/core/infrastructure/baseFactory.js +0 -54
- package/dist/client/core/infrastructure/baseRegistry.js +0 -53
- package/dist/client/core/infrastructure/index.js +0 -5
- package/dist/client/core/infrastructure/retry.js +0 -20
- package/dist/client/core/infrastructure/typedEventEmitter.js +0 -23
- package/dist/client/core/modelConfiguration.js +0 -851
- package/dist/client/core/modules/GenerationHandler.js +0 -588
- package/dist/client/core/modules/MessageBuilder.js +0 -273
- package/dist/client/core/modules/StreamHandler.js +0 -185
- package/dist/client/core/modules/TelemetryHandler.js +0 -203
- package/dist/client/core/modules/ToolsManager.js +0 -499
- package/dist/client/core/modules/Utilities.js +0 -331
- package/dist/client/core/redisConversationMemoryManager.js +0 -1435
- package/dist/client/core/streamAnalytics.js +0 -131
- package/dist/client/evaluation/contextBuilder.js +0 -134
- package/dist/client/evaluation/index.js +0 -61
- package/dist/client/evaluation/prompts.js +0 -73
- package/dist/client/evaluation/ragasEvaluator.js +0 -110
- package/dist/client/evaluation/retryManager.js +0 -78
- package/dist/client/evaluation/scoring.js +0 -61
- package/dist/client/factories/providerFactory.js +0 -166
- package/dist/client/factories/providerRegistry.js +0 -166
- package/dist/client/features/ppt/constants.js +0 -896
- package/dist/client/features/ppt/contentPlanner.js +0 -529
- package/dist/client/features/ppt/presentationOrchestrator.js +0 -236
- package/dist/client/features/ppt/slideGenerator.js +0 -532
- package/dist/client/features/ppt/slideRenderers.js +0 -2383
- package/dist/client/features/ppt/slideTypeInference.js +0 -405
- package/dist/client/features/ppt/types.js +0 -13
- package/dist/client/features/ppt/utils.js +0 -443
- package/dist/client/files/fileReferenceRegistry.js +0 -1543
- package/dist/client/files/fileTools.js +0 -450
- package/dist/client/files/streamingReader.js +0 -321
- package/dist/client/files/types.js +0 -23
- package/dist/client/hitl/hitlErrors.js +0 -54
- package/dist/client/hitl/hitlManager.js +0 -460
- package/dist/client/mcp/agentExposure.js +0 -356
- package/dist/client/mcp/auth/index.js +0 -11
- package/dist/client/mcp/auth/oauthClientProvider.js +0 -325
- package/dist/client/mcp/auth/tokenStorage.js +0 -134
- package/dist/client/mcp/batching/index.js +0 -10
- package/dist/client/mcp/batching/requestBatcher.js +0 -441
- package/dist/client/mcp/caching/index.js +0 -10
- package/dist/client/mcp/caching/toolCache.js +0 -433
- package/dist/client/mcp/elicitation/elicitationManager.js +0 -376
- package/dist/client/mcp/elicitation/index.js +0 -11
- package/dist/client/mcp/elicitation/types.js +0 -10
- package/dist/client/mcp/elicitationProtocol.js +0 -375
- package/dist/client/mcp/enhancedToolDiscovery.js +0 -481
- package/dist/client/mcp/externalServerManager.js +0 -1478
- package/dist/client/mcp/factory.js +0 -161
- package/dist/client/mcp/flexibleToolValidator.js +0 -161
- package/dist/client/mcp/httpRateLimiter.js +0 -391
- package/dist/client/mcp/httpRetryHandler.js +0 -178
- package/dist/client/mcp/index.js +0 -74
- package/dist/client/mcp/mcpCircuitBreaker.js +0 -427
- package/dist/client/mcp/mcpClientFactory.js +0 -708
- package/dist/client/mcp/mcpRegistryClient.js +0 -488
- package/dist/client/mcp/mcpServerBase.js +0 -373
- package/dist/client/mcp/multiServerManager.js +0 -579
- package/dist/client/mcp/registry.js +0 -158
- package/dist/client/mcp/routing/index.js +0 -10
- package/dist/client/mcp/routing/toolRouter.js +0 -416
- package/dist/client/mcp/serverCapabilities.js +0 -502
- package/dist/client/mcp/servers/agent/directToolsServer.js +0 -150
- package/dist/client/mcp/toolAnnotations.js +0 -239
- package/dist/client/mcp/toolConverter.js +0 -258
- package/dist/client/mcp/toolDiscoveryService.js +0 -798
- package/dist/client/mcp/toolIntegration.js +0 -334
- package/dist/client/mcp/toolRegistry.js +0 -729
- package/dist/client/memory/hippocampusInitializer.js +0 -19
- package/dist/client/memory/memoryRetrievalTools.js +0 -166
- package/dist/client/middleware/builtin/analytics.js +0 -132
- package/dist/client/middleware/builtin/autoEvaluation.js +0 -203
- package/dist/client/middleware/builtin/guardrails.js +0 -109
- package/dist/client/middleware/builtin/lifecycle.js +0 -168
- package/dist/client/middleware/factory.js +0 -327
- package/dist/client/middleware/registry.js +0 -295
- package/dist/client/middleware/utils/guardrailsUtils.js +0 -396
- package/dist/client/models/anthropicModels.js +0 -527
- package/dist/client/neurolink.js +0 -8233
- package/dist/client/observability/exporterRegistry.js +0 -413
- package/dist/client/observability/exporters/arizeExporter.js +0 -138
- package/dist/client/observability/exporters/baseExporter.js +0 -190
- package/dist/client/observability/exporters/braintrustExporter.js +0 -154
- package/dist/client/observability/exporters/datadogExporter.js +0 -196
- package/dist/client/observability/exporters/laminarExporter.js +0 -302
- package/dist/client/observability/exporters/langfuseExporter.js +0 -209
- package/dist/client/observability/exporters/langsmithExporter.js +0 -143
- package/dist/client/observability/exporters/otelExporter.js +0 -164
- package/dist/client/observability/exporters/posthogExporter.js +0 -287
- package/dist/client/observability/exporters/sentryExporter.js +0 -165
- package/dist/client/observability/index.js +0 -31
- package/dist/client/observability/metricsAggregator.js +0 -556
- package/dist/client/observability/otelBridge.js +0 -131
- package/dist/client/observability/retryPolicy.js +0 -383
- package/dist/client/observability/sampling/samplers.js +0 -216
- package/dist/client/observability/spanProcessor.js +0 -303
- package/dist/client/observability/tokenTracker.js +0 -413
- package/dist/client/observability/types/exporterTypes.js +0 -5
- package/dist/client/observability/types/index.js +0 -4
- package/dist/client/observability/types/spanTypes.js +0 -92
- package/dist/client/observability/utils/safeMetadata.js +0 -25
- package/dist/client/observability/utils/spanSerializer.js +0 -292
- package/dist/client/processors/archive/ArchiveProcessor.js +0 -1308
- package/dist/client/processors/base/BaseFileProcessor.js +0 -614
- package/dist/client/processors/base/types.js +0 -82
- package/dist/client/processors/config/fileTypes.js +0 -520
- package/dist/client/processors/config/index.js +0 -92
- package/dist/client/processors/config/languageMap.js +0 -410
- package/dist/client/processors/config/mimeTypes.js +0 -363
- package/dist/client/processors/config/sizeLimits.js +0 -258
- package/dist/client/processors/document/ExcelProcessor.js +0 -590
- package/dist/client/processors/document/OpenDocumentProcessor.js +0 -212
- package/dist/client/processors/document/PptxProcessor.js +0 -157
- package/dist/client/processors/document/RtfProcessor.js +0 -361
- package/dist/client/processors/document/WordProcessor.js +0 -353
- package/dist/client/processors/errors/FileErrorCode.js +0 -255
- package/dist/client/processors/errors/errorHelpers.js +0 -386
- package/dist/client/processors/errors/errorSerializer.js +0 -507
- package/dist/client/processors/errors/index.js +0 -49
- package/dist/client/processors/markup/SvgProcessor.js +0 -240
- package/dist/client/processors/media/AudioProcessor.js +0 -707
- package/dist/client/processors/media/VideoProcessor.js +0 -1045
- package/dist/client/providers/amazonBedrock.js +0 -1512
- package/dist/client/providers/amazonSagemaker.js +0 -162
- package/dist/client/providers/anthropic.js +0 -831
- package/dist/client/providers/azureOpenai.js +0 -143
- package/dist/client/providers/googleAiStudio.js +0 -1200
- package/dist/client/providers/googleNativeGemini3.js +0 -543
- package/dist/client/providers/googleVertex.js +0 -2936
- package/dist/client/providers/huggingFace.js +0 -315
- package/dist/client/providers/litellm.js +0 -488
- package/dist/client/providers/mistral.js +0 -157
- package/dist/client/providers/ollama.js +0 -1579
- package/dist/client/providers/openAI.js +0 -627
- package/dist/client/providers/openRouter.js +0 -543
- package/dist/client/providers/openaiCompatible.js +0 -290
- package/dist/client/providers/providerTypeUtils.js +0 -46
- package/dist/client/providers/sagemaker/adaptive-semaphore.js +0 -215
- package/dist/client/providers/sagemaker/client.js +0 -472
- package/dist/client/providers/sagemaker/config.js +0 -317
- package/dist/client/providers/sagemaker/detection.js +0 -606
- package/dist/client/providers/sagemaker/error-constants.js +0 -227
- package/dist/client/providers/sagemaker/errors.js +0 -299
- package/dist/client/providers/sagemaker/language-model.js +0 -775
- package/dist/client/providers/sagemaker/parsers.js +0 -634
- package/dist/client/providers/sagemaker/streaming.js +0 -331
- package/dist/client/providers/sagemaker/structured-parser.js +0 -625
- package/dist/client/proxy/accountQuota.js +0 -162
- package/dist/client/proxy/claudeFormat.js +0 -595
- package/dist/client/proxy/modelRouter.js +0 -29
- package/dist/client/proxy/oauthFetch.js +0 -367
- package/dist/client/proxy/proxyFetch.js +0 -586
- package/dist/client/proxy/requestLogger.js +0 -207
- package/dist/client/proxy/tokenRefresh.js +0 -124
- package/dist/client/proxy/usageStats.js +0 -74
- package/dist/client/proxy/utils/noProxyUtils.js +0 -149
- package/dist/client/rag/ChunkerFactory.js +0 -320
- package/dist/client/rag/ChunkerRegistry.js +0 -421
- package/dist/client/rag/chunkers/BaseChunker.js +0 -143
- package/dist/client/rag/chunkers/CharacterChunker.js +0 -28
- package/dist/client/rag/chunkers/HTMLChunker.js +0 -38
- package/dist/client/rag/chunkers/JSONChunker.js +0 -68
- package/dist/client/rag/chunkers/LaTeXChunker.js +0 -63
- package/dist/client/rag/chunkers/MarkdownChunker.js +0 -306
- package/dist/client/rag/chunkers/RecursiveChunker.js +0 -139
- package/dist/client/rag/chunkers/SemanticMarkdownChunker.js +0 -138
- package/dist/client/rag/chunkers/SentenceChunker.js +0 -66
- package/dist/client/rag/chunkers/TokenChunker.js +0 -61
- package/dist/client/rag/chunkers/index.js +0 -15
- package/dist/client/rag/chunking/characterChunker.js +0 -142
- package/dist/client/rag/chunking/chunkerRegistry.js +0 -194
- package/dist/client/rag/chunking/htmlChunker.js +0 -247
- package/dist/client/rag/chunking/index.js +0 -17
- package/dist/client/rag/chunking/jsonChunker.js +0 -281
- package/dist/client/rag/chunking/latexChunker.js +0 -251
- package/dist/client/rag/chunking/markdownChunker.js +0 -373
- package/dist/client/rag/chunking/recursiveChunker.js +0 -148
- package/dist/client/rag/chunking/semanticChunker.js +0 -306
- package/dist/client/rag/chunking/sentenceChunker.js +0 -230
- package/dist/client/rag/chunking/tokenChunker.js +0 -183
- package/dist/client/rag/document/MDocument.js +0 -392
- package/dist/client/rag/document/index.js +0 -5
- package/dist/client/rag/document/loaders.js +0 -500
- package/dist/client/rag/errors/RAGError.js +0 -274
- package/dist/client/rag/errors/index.js +0 -6
- package/dist/client/rag/graphRag/graphRAG.js +0 -401
- package/dist/client/rag/graphRag/index.js +0 -4
- package/dist/client/rag/index.js +0 -141
- package/dist/client/rag/metadata/MetadataExtractorFactory.js +0 -418
- package/dist/client/rag/metadata/MetadataExtractorRegistry.js +0 -362
- package/dist/client/rag/metadata/index.js +0 -9
- package/dist/client/rag/metadata/metadataExtractor.js +0 -280
- package/dist/client/rag/pipeline/RAGPipeline.js +0 -436
- package/dist/client/rag/pipeline/contextAssembly.js +0 -341
- package/dist/client/rag/pipeline/index.js +0 -5
- package/dist/client/rag/ragIntegration.js +0 -321
- package/dist/client/rag/reranker/RerankerFactory.js +0 -430
- package/dist/client/rag/reranker/RerankerRegistry.js +0 -402
- package/dist/client/rag/reranker/index.js +0 -9
- package/dist/client/rag/reranker/reranker.js +0 -277
- package/dist/client/rag/resilience/CircuitBreaker.js +0 -431
- package/dist/client/rag/resilience/RetryHandler.js +0 -304
- package/dist/client/rag/resilience/index.js +0 -7
- package/dist/client/rag/retrieval/hybridSearch.js +0 -335
- package/dist/client/rag/retrieval/index.js +0 -5
- package/dist/client/rag/retrieval/vectorQueryTool.js +0 -307
- package/dist/client/rag/types.js +0 -8
- package/dist/client/sdk/toolRegistration.js +0 -377
- package/dist/client/server/abstract/baseServerAdapter.js +0 -575
- package/dist/client/server/adapters/expressAdapter.js +0 -486
- package/dist/client/server/adapters/fastifyAdapter.js +0 -472
- package/dist/client/server/adapters/honoAdapter.js +0 -632
- package/dist/client/server/adapters/koaAdapter.js +0 -510
- package/dist/client/server/errors.js +0 -486
- package/dist/client/server/factory/serverAdapterFactory.js +0 -160
- package/dist/client/server/index.js +0 -108
- package/dist/client/server/middleware/abortSignal.js +0 -111
- package/dist/client/server/middleware/auth.js +0 -388
- package/dist/client/server/middleware/cache.js +0 -359
- package/dist/client/server/middleware/common.js +0 -281
- package/dist/client/server/middleware/deprecation.js +0 -190
- package/dist/client/server/middleware/mcpBodyAttachment.js +0 -63
- package/dist/client/server/middleware/rateLimit.js +0 -227
- package/dist/client/server/middleware/validation.js +0 -388
- package/dist/client/server/openapi/generator.js +0 -398
- package/dist/client/server/openapi/index.js +0 -36
- package/dist/client/server/openapi/schemas.js +0 -695
- package/dist/client/server/openapi/templates.js +0 -374
- package/dist/client/server/routes/agentRoutes.js +0 -189
- package/dist/client/server/routes/claudeProxyRoutes.js +0 -1600
- package/dist/client/server/routes/healthRoutes.js +0 -187
- package/dist/client/server/routes/index.js +0 -57
- package/dist/client/server/routes/mcpRoutes.js +0 -342
- package/dist/client/server/routes/memoryRoutes.js +0 -350
- package/dist/client/server/routes/openApiRoutes.js +0 -126
- package/dist/client/server/routes/toolRoutes.js +0 -199
- package/dist/client/server/streaming/dataStream.js +0 -486
- package/dist/client/server/streaming/index.js +0 -11
- package/dist/client/server/types.js +0 -67
- package/dist/client/server/utils/redaction.js +0 -334
- package/dist/client/server/utils/validation.js +0 -243
- package/dist/client/server/websocket/WebSocketHandler.js +0 -383
- package/dist/client/server/websocket/index.js +0 -4
- package/dist/client/services/server/ai/observability/instrumentation.js +0 -808
- package/dist/client/telemetry/attributes.js +0 -100
- package/dist/client/telemetry/index.js +0 -26
- package/dist/client/telemetry/telemetryService.js +0 -308
- package/dist/client/telemetry/tracers.js +0 -17
- package/dist/client/telemetry/withSpan.js +0 -34
- package/dist/client/types/actionTypes.js +0 -6
- package/dist/client/types/analytics.js +0 -5
- package/dist/client/types/authTypes.js +0 -9
- package/dist/client/types/circuitBreakerErrors.js +0 -34
- package/dist/client/types/cli.js +0 -21
- package/dist/client/types/clientTypes.js +0 -10
- package/dist/client/types/common.js +0 -51
- package/dist/client/types/configTypes.js +0 -49
- package/dist/client/types/content.js +0 -19
- package/dist/client/types/contextTypes.js +0 -400
- package/dist/client/types/conversation.js +0 -47
- package/dist/client/types/conversationMemoryInterface.js +0 -6
- package/dist/client/types/domainTypes.js +0 -5
- package/dist/client/types/errors.js +0 -167
- package/dist/client/types/evaluation.js +0 -5
- package/dist/client/types/evaluationProviders.js +0 -5
- package/dist/client/types/evaluationTypes.js +0 -1
- package/dist/client/types/externalMcp.js +0 -6
- package/dist/client/types/fileReferenceTypes.js +0 -8
- package/dist/client/types/fileTypes.js +0 -4
- package/dist/client/types/generateTypes.js +0 -1
- package/dist/client/types/guardrails.js +0 -1
- package/dist/client/types/hitlTypes.js +0 -8
- package/dist/client/types/index.js +0 -57
- package/dist/client/types/mcpTypes.js +0 -5
- package/dist/client/types/middlewareTypes.js +0 -1
- package/dist/client/types/modelTypes.js +0 -30
- package/dist/client/types/multimodal.js +0 -135
- package/dist/client/types/observability.js +0 -6
- package/dist/client/types/pptTypes.js +0 -82
- package/dist/client/types/providers.js +0 -111
- package/dist/client/types/proxyTypes.js +0 -16
- package/dist/client/types/ragTypes.js +0 -7
- package/dist/client/types/sdkTypes.js +0 -8
- package/dist/client/types/serviceTypes.js +0 -5
- package/dist/client/types/streamTypes.js +0 -1
- package/dist/client/types/subscriptionTypes.js +0 -9
- package/dist/client/types/taskClassificationTypes.js +0 -5
- package/dist/client/types/tools.js +0 -24
- package/dist/client/types/ttsTypes.js +0 -57
- package/dist/client/types/typeAliases.js +0 -48
- package/dist/client/types/utilities.js +0 -4
- package/dist/client/types/workflowTypes.js +0 -30
- package/dist/client/utils/async/withTimeout.js +0 -98
- package/dist/client/utils/asyncMutex.js +0 -60
- package/dist/client/utils/conversationMemory.js +0 -431
- package/dist/client/utils/csvProcessor.js +0 -846
- package/dist/client/utils/errorHandling.js +0 -936
- package/dist/client/utils/evaluationUtils.js +0 -131
- package/dist/client/utils/factoryProcessing.js +0 -589
- package/dist/client/utils/fileDetector.js +0 -2161
- package/dist/client/utils/imageCache.js +0 -376
- package/dist/client/utils/imageProcessor.js +0 -704
- package/dist/client/utils/logger.js +0 -491
- package/dist/client/utils/mcpDefaults.js +0 -134
- package/dist/client/utils/messageBuilder.js +0 -1653
- package/dist/client/utils/modelAliasResolver.js +0 -54
- package/dist/client/utils/modelDetection.js +0 -80
- package/dist/client/utils/modelRouter.js +0 -292
- package/dist/client/utils/multimodalOptionsBuilder.js +0 -65
- package/dist/client/utils/observabilityHelpers.js +0 -47
- package/dist/client/utils/parameterValidation.js +0 -966
- package/dist/client/utils/pdfProcessor.js +0 -410
- package/dist/client/utils/performance.js +0 -222
- package/dist/client/utils/pricing.js +0 -340
- package/dist/client/utils/promptRedaction.js +0 -62
- package/dist/client/utils/providerConfig.js +0 -1009
- package/dist/client/utils/providerHealth.js +0 -1237
- package/dist/client/utils/providerRetry.js +0 -112
- package/dist/client/utils/providerUtils.js +0 -434
- package/dist/client/utils/rateLimiter.js +0 -200
- package/dist/client/utils/redis.js +0 -368
- package/dist/client/utils/retryHandler.js +0 -269
- package/dist/client/utils/retryability.js +0 -22
- package/dist/client/utils/sanitizers/svg.js +0 -481
- package/dist/client/utils/schemaConversion.js +0 -255
- package/dist/client/utils/taskClassificationUtils.js +0 -149
- package/dist/client/utils/taskClassifier.js +0 -94
- package/dist/client/utils/thinkingConfig.js +0 -104
- package/dist/client/utils/timeout.js +0 -359
- package/dist/client/utils/tokenEstimation.js +0 -142
- package/dist/client/utils/tokenLimits.js +0 -125
- package/dist/client/utils/tokenUtils.js +0 -239
- package/dist/client/utils/toolUtils.js +0 -75
- package/dist/client/utils/transformationUtils.js +0 -554
- package/dist/client/utils/ttsProcessor.js +0 -286
- package/dist/client/utils/typeUtils.js +0 -97
- package/dist/client/utils/videoAnalysisProcessor.js +0 -67
- package/dist/client/workflow/config.js +0 -398
- package/dist/client/workflow/core/ensembleExecutor.js +0 -407
- package/dist/client/workflow/core/judgeScorer.js +0 -544
- package/dist/client/workflow/core/responseConditioner.js +0 -225
- package/dist/client/workflow/core/types/conditionerTypes.js +0 -7
- package/dist/client/workflow/core/types/ensembleTypes.js +0 -7
- package/dist/client/workflow/core/types/index.js +0 -7
- package/dist/client/workflow/core/types/judgeTypes.js +0 -7
- package/dist/client/workflow/core/types/layerTypes.js +0 -7
- package/dist/client/workflow/core/types/registryTypes.js +0 -7
- package/dist/client/workflow/core/workflowRegistry.js +0 -304
- package/dist/client/workflow/core/workflowRunner.js +0 -586
- package/dist/client/workflow/index.js +0 -50
- package/dist/client/workflow/types.js +0 -9
- package/dist/client/workflow/utils/types/index.js +0 -7
- package/dist/client/workflow/utils/workflowMetrics.js +0 -311
- package/dist/client/workflow/utils/workflowValidation.js +0 -420
- package/dist/client/workflow/workflows/adaptiveWorkflow.js +0 -366
- package/dist/client/workflow/workflows/consensusWorkflow.js +0 -192
- package/dist/client/workflow/workflows/fallbackWorkflow.js +0 -225
- package/dist/client/workflow/workflows/multiJudgeWorkflow.js +0 -351
- /package/dist/client/{client/reactHooks.js → reactHooks.js} +0 -0
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Registry - Industry Standard Interface with camelCase
|
|
3
|
-
*/
|
|
4
|
-
import { registryLogger } from "../utils/logger.js";
|
|
5
|
-
/**
|
|
6
|
-
* Simple MCP registry for plugin management
|
|
7
|
-
* Maintains backward compatibility with existing code
|
|
8
|
-
*/
|
|
9
|
-
export class MCPRegistry {
|
|
10
|
-
plugins = new Map();
|
|
11
|
-
/**
|
|
12
|
-
* Register a plugin
|
|
13
|
-
*/
|
|
14
|
-
register(plugin) {
|
|
15
|
-
this.plugins.set(plugin.metadata.name, plugin);
|
|
16
|
-
registryLogger.debug(`Registered plugin: ${plugin.metadata.name}`);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Unregister a plugin
|
|
20
|
-
*/
|
|
21
|
-
unregister(name) {
|
|
22
|
-
const removed = this.plugins.delete(name);
|
|
23
|
-
if (removed) {
|
|
24
|
-
registryLogger.debug(`Unregistered plugin: ${name}`);
|
|
25
|
-
}
|
|
26
|
-
return removed;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Get a plugin
|
|
30
|
-
*/
|
|
31
|
-
get(name) {
|
|
32
|
-
return this.plugins.get(name);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* List all plugins
|
|
36
|
-
*/
|
|
37
|
-
list() {
|
|
38
|
-
return Array.from(this.plugins.values());
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Check if plugin exists
|
|
42
|
-
*/
|
|
43
|
-
has(name) {
|
|
44
|
-
return this.plugins.has(name);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Clear all plugins
|
|
48
|
-
*/
|
|
49
|
-
clear() {
|
|
50
|
-
this.plugins.clear();
|
|
51
|
-
registryLogger.info("Registry cleared");
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Register a server (compatible with new interface)
|
|
55
|
-
*/
|
|
56
|
-
async registerServer(serverId, serverConfig, _context) {
|
|
57
|
-
const plugin = {
|
|
58
|
-
metadata: {
|
|
59
|
-
name: serverId,
|
|
60
|
-
description: typeof serverConfig === "object" && serverConfig
|
|
61
|
-
? serverConfig.description ||
|
|
62
|
-
"No description"
|
|
63
|
-
: "No description",
|
|
64
|
-
},
|
|
65
|
-
tools: typeof serverConfig === "object" && serverConfig
|
|
66
|
-
? serverConfig.tools
|
|
67
|
-
: {},
|
|
68
|
-
configuration: typeof serverConfig === "object" && serverConfig
|
|
69
|
-
? serverConfig
|
|
70
|
-
: {},
|
|
71
|
-
};
|
|
72
|
-
this.register(plugin);
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Execute a tool (mock implementation for tests)
|
|
76
|
-
*/
|
|
77
|
-
async executeTool(toolName, args, _context) {
|
|
78
|
-
registryLogger.info(`Executing tool: ${toolName}`);
|
|
79
|
-
return { result: `Mock execution of ${toolName}`, args };
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* List all tools (compatible with new interface)
|
|
83
|
-
*/
|
|
84
|
-
async listTools(_context) {
|
|
85
|
-
const tools = this.list().map((plugin) => ({
|
|
86
|
-
name: plugin.metadata.name,
|
|
87
|
-
description: plugin.metadata.description || "No description",
|
|
88
|
-
serverId: plugin.metadata.name,
|
|
89
|
-
category: "general",
|
|
90
|
-
}));
|
|
91
|
-
return tools;
|
|
92
|
-
}
|
|
93
|
-
// Legacy methods for backward compatibility
|
|
94
|
-
/**
|
|
95
|
-
* Register a server (legacy sync version)
|
|
96
|
-
*/
|
|
97
|
-
registerServerSync(plugin) {
|
|
98
|
-
this.register(plugin);
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Execute a tool (legacy sync version)
|
|
102
|
-
*/
|
|
103
|
-
executeToolSync(toolName, args) {
|
|
104
|
-
registryLogger.info(`Executing tool (sync): ${toolName}`);
|
|
105
|
-
return { result: `Mock execution of ${toolName}`, args };
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* List all tools (legacy sync version)
|
|
109
|
-
*/
|
|
110
|
-
listToolsSync() {
|
|
111
|
-
const tools = this.list().map((plugin) => ({
|
|
112
|
-
name: plugin.metadata.name,
|
|
113
|
-
description: plugin.metadata.description || "No description",
|
|
114
|
-
}));
|
|
115
|
-
return tools;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* List all registered server IDs
|
|
119
|
-
*
|
|
120
|
-
* Returns an array of server IDs that are currently registered in the MCP registry.
|
|
121
|
-
* This complements listTools() by providing server-level information, while listTools()
|
|
122
|
-
* provides tool-level information across all servers.
|
|
123
|
-
*
|
|
124
|
-
* @returns Array of registered server identifier strings
|
|
125
|
-
* @see listTools() for getting detailed tool information from all servers
|
|
126
|
-
* @see list() for getting complete server metadata objects
|
|
127
|
-
*
|
|
128
|
-
* @example
|
|
129
|
-
* ```typescript
|
|
130
|
-
* const serverIds = registry.listServers();
|
|
131
|
-
* // ['ai-core', 'external-api', 'database-connector']
|
|
132
|
-
*
|
|
133
|
-
* // Compare with listTools() for comprehensive overview:
|
|
134
|
-
* const servers = registry.listServers(); // ['server1', 'server2']
|
|
135
|
-
* const tools = await registry.listTools(); // [{ name: 'tool1', serverId: 'server1' }, ...]
|
|
136
|
-
* ```
|
|
137
|
-
*/
|
|
138
|
-
listServers() {
|
|
139
|
-
return Array.from(this.plugins.keys());
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Enhanced MCP Registry implementation with config integration
|
|
144
|
-
* Will be implemented in Phase 3.2
|
|
145
|
-
*/
|
|
146
|
-
export class McpRegistryImpl {
|
|
147
|
-
baseRegistry = new MCPRegistry();
|
|
148
|
-
// Additional implementation will be added in Phase 3.2
|
|
149
|
-
async registerServer(serverId, serverConfig, context) {
|
|
150
|
-
return this.baseRegistry.registerServer(serverId, serverConfig, context);
|
|
151
|
-
}
|
|
152
|
-
async executeTool(toolName, args, context) {
|
|
153
|
-
return this.baseRegistry.executeTool(toolName, args, context);
|
|
154
|
-
}
|
|
155
|
-
async listTools(context) {
|
|
156
|
-
return this.baseRegistry.listTools(context);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Routing Module - Intelligent tool call routing
|
|
3
|
-
*
|
|
4
|
-
* Provides advanced routing strategies for multi-server MCP environments:
|
|
5
|
-
* - Round-robin distribution
|
|
6
|
-
* - Least-loaded selection
|
|
7
|
-
* - Capability-based routing
|
|
8
|
-
* - Session affinity
|
|
9
|
-
*/
|
|
10
|
-
export { createToolRouter, DEFAULT_ROUTER_CONFIG, ToolRouter, } from "./toolRouter.js";
|
|
@@ -1,416 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool Router - Routes tool calls to appropriate MCP servers
|
|
3
|
-
* Based on tool categories, annotations, and server capabilities
|
|
4
|
-
*
|
|
5
|
-
* Provides intelligent routing strategies for multi-server MCP environments:
|
|
6
|
-
* - Round-robin for even distribution
|
|
7
|
-
* - Least-loaded for optimal performance
|
|
8
|
-
* - Capability-based for specialized servers
|
|
9
|
-
* - Affinity-based for session consistency
|
|
10
|
-
*/
|
|
11
|
-
import { EventEmitter } from "events";
|
|
12
|
-
import { ErrorFactory } from "../../utils/errorHandling.js";
|
|
13
|
-
/**
|
|
14
|
-
* Default router configuration for common use cases
|
|
15
|
-
*/
|
|
16
|
-
export const DEFAULT_ROUTER_CONFIG = {
|
|
17
|
-
strategy: "least-loaded",
|
|
18
|
-
enableAffinity: false,
|
|
19
|
-
maxRetries: 3,
|
|
20
|
-
healthCheckInterval: 30000,
|
|
21
|
-
affinityTtl: 30 * 60 * 1000,
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* Tool Router - Intelligent routing for MCP tool calls
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```typescript
|
|
28
|
-
* const router = new ToolRouter({
|
|
29
|
-
* strategy: 'least-loaded',
|
|
30
|
-
* enableAffinity: true,
|
|
31
|
-
* categoryMapping: {
|
|
32
|
-
* 'database': ['db-server-1', 'db-server-2'],
|
|
33
|
-
* 'ai': ['ai-server-primary', 'ai-server-secondary'],
|
|
34
|
-
* },
|
|
35
|
-
* });
|
|
36
|
-
*
|
|
37
|
-
* const decision = router.route(tool, { sessionId: 'user-123' });
|
|
38
|
-
* console.log(`Routing to: ${decision.serverId}`);
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export class ToolRouter extends EventEmitter {
|
|
42
|
-
config;
|
|
43
|
-
roundRobinIndex = new Map();
|
|
44
|
-
serverLoads = new Map();
|
|
45
|
-
affinityRules = new Map();
|
|
46
|
-
healthStatus = new Map();
|
|
47
|
-
availableServers = new Set();
|
|
48
|
-
affinityCleanupTimer;
|
|
49
|
-
constructor(config = DEFAULT_ROUTER_CONFIG) {
|
|
50
|
-
super();
|
|
51
|
-
this.config = {
|
|
52
|
-
strategy: config.strategy ?? "least-loaded",
|
|
53
|
-
enableAffinity: config.enableAffinity ?? false,
|
|
54
|
-
categoryMapping: config.categoryMapping ?? {},
|
|
55
|
-
serverWeights: config.serverWeights ?? [],
|
|
56
|
-
fallbackStrategy: config.fallbackStrategy ?? "round-robin",
|
|
57
|
-
maxRetries: config.maxRetries ?? 3,
|
|
58
|
-
healthCheckInterval: config.healthCheckInterval ?? 30000,
|
|
59
|
-
affinityTtl: config.affinityTtl ?? 30 * 60 * 1000, // 30 minutes
|
|
60
|
-
};
|
|
61
|
-
if (this.config.enableAffinity) {
|
|
62
|
-
this.affinityCleanupTimer = setInterval(() => {
|
|
63
|
-
this.cleanupExpiredAffinities();
|
|
64
|
-
}, this.config.healthCheckInterval);
|
|
65
|
-
if (this.affinityCleanupTimer.unref) {
|
|
66
|
-
this.affinityCleanupTimer.unref();
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
destroy() {
|
|
71
|
-
if (this.affinityCleanupTimer) {
|
|
72
|
-
clearInterval(this.affinityCleanupTimer);
|
|
73
|
-
this.affinityCleanupTimer = undefined;
|
|
74
|
-
}
|
|
75
|
-
this.affinityRules.clear();
|
|
76
|
-
}
|
|
77
|
-
cleanupExpiredAffinities() {
|
|
78
|
-
const now = Date.now();
|
|
79
|
-
for (const [key, rule] of this.affinityRules) {
|
|
80
|
-
if (rule.expiresAt && rule.expiresAt <= now) {
|
|
81
|
-
this.affinityRules.delete(key);
|
|
82
|
-
this.emit("affinityExpired", { key });
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Register a server as available for routing
|
|
88
|
-
*/
|
|
89
|
-
registerServer(serverId, capabilities) {
|
|
90
|
-
this.availableServers.add(serverId);
|
|
91
|
-
this.healthStatus.set(serverId, true);
|
|
92
|
-
this.serverLoads.set(serverId, 0);
|
|
93
|
-
// Update category mapping if capabilities provided
|
|
94
|
-
if (capabilities) {
|
|
95
|
-
for (const capability of capabilities) {
|
|
96
|
-
if (!this.config.categoryMapping[capability]) {
|
|
97
|
-
this.config.categoryMapping[capability] = [];
|
|
98
|
-
}
|
|
99
|
-
if (!this.config.categoryMapping[capability].includes(serverId)) {
|
|
100
|
-
this.config.categoryMapping[capability].push(serverId);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Unregister a server from routing
|
|
107
|
-
*/
|
|
108
|
-
unregisterServer(serverId) {
|
|
109
|
-
this.availableServers.delete(serverId);
|
|
110
|
-
this.healthStatus.delete(serverId);
|
|
111
|
-
this.serverLoads.delete(serverId);
|
|
112
|
-
// Reset all round-robin indices since any tool may have been
|
|
113
|
-
// routed to the removed server. Keys are `rr-${toolName}`.
|
|
114
|
-
this.roundRobinIndex.clear();
|
|
115
|
-
// Remove from category mappings
|
|
116
|
-
for (const category of Object.keys(this.config.categoryMapping)) {
|
|
117
|
-
const servers = this.config.categoryMapping[category];
|
|
118
|
-
const index = servers.indexOf(serverId);
|
|
119
|
-
if (index !== -1) {
|
|
120
|
-
servers.splice(index, 1);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Route a tool call to the best server
|
|
126
|
-
*/
|
|
127
|
-
route(tool, context) {
|
|
128
|
-
// Check affinity first if enabled
|
|
129
|
-
if (this.config.enableAffinity && context) {
|
|
130
|
-
const affinityKey = context.sessionId ?? context.userId;
|
|
131
|
-
if (affinityKey) {
|
|
132
|
-
const affinityRule = this.affinityRules.get(affinityKey);
|
|
133
|
-
if (affinityRule && this.isServerHealthy(affinityRule.serverId)) {
|
|
134
|
-
if (!affinityRule.expiresAt || affinityRule.expiresAt > Date.now()) {
|
|
135
|
-
return {
|
|
136
|
-
serverId: affinityRule.serverId,
|
|
137
|
-
strategy: "affinity",
|
|
138
|
-
confidence: 1.0,
|
|
139
|
-
reason: `Affinity match for ${affinityKey}`,
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
this.affinityRules.delete(affinityKey);
|
|
144
|
-
this.emit("affinityExpired", { key: affinityKey });
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
// Get candidate servers
|
|
150
|
-
const candidates = this.getCandidateServers(tool);
|
|
151
|
-
if (candidates.length === 0) {
|
|
152
|
-
const routeError = ErrorFactory.toolExecutionFailed(tool.name, new Error(`No healthy servers available (strategy: ${this.config.strategy}, registered: ${this.availableServers.size})`));
|
|
153
|
-
this.emit("routeFailed", {
|
|
154
|
-
toolName: tool.name,
|
|
155
|
-
error: routeError,
|
|
156
|
-
attemptedServers: Array.from(this.availableServers),
|
|
157
|
-
});
|
|
158
|
-
throw routeError;
|
|
159
|
-
}
|
|
160
|
-
// Apply routing strategy
|
|
161
|
-
const decision = this.applyStrategy(this.config.strategy, tool, candidates);
|
|
162
|
-
// Set affinity if enabled
|
|
163
|
-
if (this.config.enableAffinity && context) {
|
|
164
|
-
const affinityKey = context.sessionId ?? context.userId;
|
|
165
|
-
if (affinityKey) {
|
|
166
|
-
this.setAffinity(affinityKey, decision.serverId);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
this.emit("routeDecision", { toolName: tool.name, decision });
|
|
170
|
-
return decision;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Route by tool category
|
|
174
|
-
*/
|
|
175
|
-
routeByCategory(tool, category) {
|
|
176
|
-
const servers = this.config.categoryMapping[category] ?? [];
|
|
177
|
-
return servers.filter((s) => this.isServerHealthy(s));
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Route by tool annotation hints
|
|
181
|
-
*/
|
|
182
|
-
routeByAnnotation(tool) {
|
|
183
|
-
if (!tool.annotations) {
|
|
184
|
-
return Array.from(this.availableServers).filter((s) => this.isServerHealthy(s));
|
|
185
|
-
}
|
|
186
|
-
// Route destructive tools to primary servers only (check before readOnlyHint
|
|
187
|
-
// so that a tool with both flags is still restricted to primary servers)
|
|
188
|
-
if (tool.annotations.destructiveHint) {
|
|
189
|
-
const primaryServers = this.config.serverWeights
|
|
190
|
-
.filter((sw) => sw.weight >= 50)
|
|
191
|
-
.map((sw) => sw.serverId)
|
|
192
|
-
.filter((s) => this.isServerHealthy(s));
|
|
193
|
-
if (primaryServers.length > 0) {
|
|
194
|
-
return primaryServers;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
// Route read-only tools to any healthy server
|
|
198
|
-
if (tool.annotations.readOnlyHint) {
|
|
199
|
-
return Array.from(this.availableServers).filter((s) => this.isServerHealthy(s));
|
|
200
|
-
}
|
|
201
|
-
// Route idempotent tools preferring cached servers
|
|
202
|
-
if (tool.annotations.idempotentHint) {
|
|
203
|
-
const cachedServers = this.config.categoryMapping["caching"] ?? [];
|
|
204
|
-
const healthyCached = cachedServers.filter((s) => this.isServerHealthy(s));
|
|
205
|
-
if (healthyCached.length > 0) {
|
|
206
|
-
return healthyCached;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
return Array.from(this.availableServers).filter((s) => this.isServerHealthy(s));
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Route by required capabilities
|
|
213
|
-
*/
|
|
214
|
-
routeByCapability(tool, requiredCapabilities) {
|
|
215
|
-
const matchingServers = [];
|
|
216
|
-
for (const serverId of this.availableServers) {
|
|
217
|
-
if (!this.isServerHealthy(serverId)) {
|
|
218
|
-
continue;
|
|
219
|
-
}
|
|
220
|
-
// Check if server has all required capabilities
|
|
221
|
-
let hasAll = true;
|
|
222
|
-
for (const capability of requiredCapabilities) {
|
|
223
|
-
const serversWithCapability = this.config.categoryMapping[capability] ?? [];
|
|
224
|
-
if (!serversWithCapability.includes(serverId)) {
|
|
225
|
-
hasAll = false;
|
|
226
|
-
break;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
if (hasAll) {
|
|
230
|
-
matchingServers.push(serverId);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return matchingServers;
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Update server load for least-loaded routing
|
|
237
|
-
*/
|
|
238
|
-
updateServerLoad(serverId, delta) {
|
|
239
|
-
const currentLoad = this.serverLoads.get(serverId) ?? 0;
|
|
240
|
-
this.serverLoads.set(serverId, Math.max(0, currentLoad + delta));
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Update server health status
|
|
244
|
-
*/
|
|
245
|
-
updateHealthStatus(serverId, healthy) {
|
|
246
|
-
const previousStatus = this.healthStatus.get(serverId);
|
|
247
|
-
this.healthStatus.set(serverId, healthy);
|
|
248
|
-
if (previousStatus !== healthy) {
|
|
249
|
-
this.emit("healthUpdate", { serverId, healthy });
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Set session/user affinity
|
|
254
|
-
*/
|
|
255
|
-
setAffinity(key, serverId) {
|
|
256
|
-
this.affinityRules.set(key, {
|
|
257
|
-
key,
|
|
258
|
-
serverId,
|
|
259
|
-
expiresAt: Date.now() + this.config.affinityTtl,
|
|
260
|
-
});
|
|
261
|
-
this.emit("affinitySet", { key, serverId });
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Clear affinity for a key
|
|
265
|
-
*/
|
|
266
|
-
clearAffinity(key) {
|
|
267
|
-
this.affinityRules.delete(key);
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Get current routing statistics
|
|
271
|
-
*/
|
|
272
|
-
getStats() {
|
|
273
|
-
const healthyCount = Array.from(this.healthStatus.values()).filter((h) => h).length;
|
|
274
|
-
return {
|
|
275
|
-
availableServers: this.availableServers.size,
|
|
276
|
-
healthyServers: healthyCount,
|
|
277
|
-
activeAffinities: this.affinityRules.size,
|
|
278
|
-
serverLoads: Object.fromEntries(this.serverLoads),
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
// ==================== Private Methods ====================
|
|
282
|
-
getCandidateServers(tool) {
|
|
283
|
-
// If tool has a specific server, use only that
|
|
284
|
-
if (tool.serverId && this.isServerHealthy(tool.serverId)) {
|
|
285
|
-
return [tool.serverId];
|
|
286
|
-
}
|
|
287
|
-
// Check category mapping
|
|
288
|
-
if (tool.category) {
|
|
289
|
-
const categoryServers = this.routeByCategory(tool, tool.category);
|
|
290
|
-
if (categoryServers.length > 0) {
|
|
291
|
-
return categoryServers;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
// Check annotation-based routing
|
|
295
|
-
const annotationServers = this.routeByAnnotation(tool);
|
|
296
|
-
if (annotationServers.length > 0) {
|
|
297
|
-
return annotationServers;
|
|
298
|
-
}
|
|
299
|
-
// Fall back to all healthy servers
|
|
300
|
-
return Array.from(this.availableServers).filter((s) => this.isServerHealthy(s));
|
|
301
|
-
}
|
|
302
|
-
applyStrategy(strategy, tool, candidates) {
|
|
303
|
-
switch (strategy) {
|
|
304
|
-
case "round-robin":
|
|
305
|
-
return this.roundRobinSelect(tool.name, candidates);
|
|
306
|
-
case "least-loaded":
|
|
307
|
-
return this.leastLoadedSelect(candidates);
|
|
308
|
-
case "capability-based":
|
|
309
|
-
return this.capabilityBasedSelect(tool, candidates);
|
|
310
|
-
case "priority":
|
|
311
|
-
return this.prioritySelect(candidates);
|
|
312
|
-
case "random":
|
|
313
|
-
return this.randomSelect(candidates);
|
|
314
|
-
case "affinity":
|
|
315
|
-
// Affinity is handled at the top of route(), fall back to round-robin
|
|
316
|
-
return this.roundRobinSelect(tool.name, candidates);
|
|
317
|
-
default:
|
|
318
|
-
return this.roundRobinSelect(tool.name, candidates);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
roundRobinSelect(toolName, candidates) {
|
|
322
|
-
const key = `rr-${toolName}`;
|
|
323
|
-
const currentIndex = this.roundRobinIndex.get(key) ?? 0;
|
|
324
|
-
const selectedIndex = currentIndex % candidates.length;
|
|
325
|
-
this.roundRobinIndex.set(key, currentIndex + 1);
|
|
326
|
-
return {
|
|
327
|
-
serverId: candidates[selectedIndex],
|
|
328
|
-
strategy: "round-robin",
|
|
329
|
-
confidence: 0.8,
|
|
330
|
-
alternates: candidates.filter((_, i) => i !== selectedIndex),
|
|
331
|
-
reason: `Round-robin selection (index ${selectedIndex})`,
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
leastLoadedSelect(candidates) {
|
|
335
|
-
let minLoad = Infinity;
|
|
336
|
-
let selectedServer = candidates[0];
|
|
337
|
-
for (const serverId of candidates) {
|
|
338
|
-
const load = this.serverLoads.get(serverId) ?? 0;
|
|
339
|
-
if (load < minLoad) {
|
|
340
|
-
minLoad = load;
|
|
341
|
-
selectedServer = serverId;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
return {
|
|
345
|
-
serverId: selectedServer,
|
|
346
|
-
strategy: "least-loaded",
|
|
347
|
-
confidence: 0.9,
|
|
348
|
-
alternates: candidates.filter((s) => s !== selectedServer),
|
|
349
|
-
reason: `Least loaded server (load: ${minLoad})`,
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
capabilityBasedSelect(tool, candidates) {
|
|
353
|
-
// Score each candidate based on capability match
|
|
354
|
-
const scores = [];
|
|
355
|
-
for (const serverId of candidates) {
|
|
356
|
-
let score = 1;
|
|
357
|
-
// Check weight
|
|
358
|
-
const weight = this.config.serverWeights.find((sw) => sw.serverId === serverId);
|
|
359
|
-
if (weight) {
|
|
360
|
-
score += weight.weight / 100;
|
|
361
|
-
}
|
|
362
|
-
// Check capability match
|
|
363
|
-
if (tool.category) {
|
|
364
|
-
const categoryServers = this.config.categoryMapping[tool.category];
|
|
365
|
-
if (categoryServers?.includes(serverId)) {
|
|
366
|
-
score += 0.5;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
scores.push({ serverId, score });
|
|
370
|
-
}
|
|
371
|
-
// Sort by score descending
|
|
372
|
-
scores.sort((a, b) => b.score - a.score);
|
|
373
|
-
return {
|
|
374
|
-
serverId: scores[0].serverId,
|
|
375
|
-
strategy: "capability-based",
|
|
376
|
-
confidence: Math.min(1, scores[0].score / 2),
|
|
377
|
-
alternates: scores.slice(1).map((s) => s.serverId),
|
|
378
|
-
reason: `Capability score: ${scores[0].score.toFixed(2)}`,
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
|
-
prioritySelect(candidates) {
|
|
382
|
-
// Sort by weight
|
|
383
|
-
const weighted = candidates
|
|
384
|
-
.map((serverId) => {
|
|
385
|
-
const weight = this.config.serverWeights.find((sw) => sw.serverId === serverId)
|
|
386
|
-
?.weight ?? 50;
|
|
387
|
-
return { serverId, weight };
|
|
388
|
-
})
|
|
389
|
-
.sort((a, b) => b.weight - a.weight);
|
|
390
|
-
return {
|
|
391
|
-
serverId: weighted[0].serverId,
|
|
392
|
-
strategy: "priority",
|
|
393
|
-
confidence: weighted[0].weight / 100,
|
|
394
|
-
alternates: weighted.slice(1).map((w) => w.serverId),
|
|
395
|
-
reason: `Priority weight: ${weighted[0].weight}`,
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
randomSelect(candidates) {
|
|
399
|
-
const randomIndex = Math.floor(Math.random() * candidates.length);
|
|
400
|
-
return {
|
|
401
|
-
serverId: candidates[randomIndex],
|
|
402
|
-
strategy: "random",
|
|
403
|
-
confidence: 0.5,
|
|
404
|
-
alternates: candidates.filter((_, i) => i !== randomIndex),
|
|
405
|
-
reason: "Random selection",
|
|
406
|
-
};
|
|
407
|
-
}
|
|
408
|
-
isServerHealthy(serverId) {
|
|
409
|
-
return (this.availableServers.has(serverId) &&
|
|
410
|
-
(this.healthStatus.get(serverId) ?? false));
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Factory function to create a ToolRouter instance
|
|
415
|
-
*/
|
|
416
|
-
export const createToolRouter = (config) => new ToolRouter(config);
|