@juspay/neurolink 9.32.0 → 9.32.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 +6 -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/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- 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/modelTypes.js +0 -1
- 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,798 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool Discovery Service
|
|
3
|
-
* Automatically discovers and registers tools from external MCP servers
|
|
4
|
-
* Handles tool validation, transformation, and lifecycle management
|
|
5
|
-
*/
|
|
6
|
-
import { EventEmitter } from "events";
|
|
7
|
-
import { mcpLogger } from "../utils/logger.js";
|
|
8
|
-
import { globalCircuitBreakerManager, CircuitBreakerOpenError, } from "./mcpCircuitBreaker.js";
|
|
9
|
-
import { isObject, isNullish } from "../utils/typeUtils.js";
|
|
10
|
-
import { validateToolName, validateToolDescription, } from "../utils/parameterValidation.js";
|
|
11
|
-
import { withTimeout } from "../utils/errorHandling.js";
|
|
12
|
-
import { SpanKind, SpanStatusCode } from "@opentelemetry/api";
|
|
13
|
-
import { tracers } from "../telemetry/tracers.js";
|
|
14
|
-
const mcpTracer = tracers.mcp;
|
|
15
|
-
/**
|
|
16
|
-
* Default timeout for MCP tool execution operations in milliseconds.
|
|
17
|
-
* Configurable via MCP_TOOL_TIMEOUT env var.
|
|
18
|
-
*/
|
|
19
|
-
const DEFAULT_TOOL_TIMEOUT = Math.max(5000, Number(process.env.MCP_TOOL_TIMEOUT) || 60000);
|
|
20
|
-
/**
|
|
21
|
-
* ToolDiscoveryService
|
|
22
|
-
* Handles automatic tool discovery and registration from external MCP servers
|
|
23
|
-
*/
|
|
24
|
-
export class ToolDiscoveryService extends EventEmitter {
|
|
25
|
-
serverToolStorage = new Map();
|
|
26
|
-
toolRegistry = new Map();
|
|
27
|
-
serverTools = new Map();
|
|
28
|
-
discoveryInProgress = new Set();
|
|
29
|
-
constructor() {
|
|
30
|
-
super();
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Discover tools from an external MCP server
|
|
34
|
-
*/
|
|
35
|
-
async discoverTools(serverId, client, timeout = DEFAULT_TOOL_TIMEOUT) {
|
|
36
|
-
const startTime = Date.now();
|
|
37
|
-
try {
|
|
38
|
-
// Prevent concurrent discovery for same server
|
|
39
|
-
if (this.discoveryInProgress.has(serverId)) {
|
|
40
|
-
return {
|
|
41
|
-
success: false,
|
|
42
|
-
error: `Discovery already in progress for server: ${serverId}`,
|
|
43
|
-
toolCount: 0,
|
|
44
|
-
tools: [],
|
|
45
|
-
duration: Date.now() - startTime,
|
|
46
|
-
serverId,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
this.discoveryInProgress.add(serverId);
|
|
50
|
-
mcpLogger.info(`[ToolDiscoveryService] Starting tool discovery for server: ${serverId}`);
|
|
51
|
-
// Create circuit breaker for tool discovery
|
|
52
|
-
const circuitBreaker = globalCircuitBreakerManager.getBreaker(`tool-discovery-${serverId}`, {
|
|
53
|
-
failureThreshold: 2,
|
|
54
|
-
resetTimeout: 60000,
|
|
55
|
-
operationTimeout: timeout,
|
|
56
|
-
});
|
|
57
|
-
// Discover tools with circuit breaker protection
|
|
58
|
-
const tools = await circuitBreaker.execute(async () => {
|
|
59
|
-
return await this.performToolDiscovery(serverId, client, timeout);
|
|
60
|
-
});
|
|
61
|
-
// Register discovered tools
|
|
62
|
-
const registeredTools = await this.registerDiscoveredTools(serverId, tools);
|
|
63
|
-
const result = {
|
|
64
|
-
success: true,
|
|
65
|
-
toolCount: registeredTools.length,
|
|
66
|
-
tools: registeredTools,
|
|
67
|
-
duration: Date.now() - startTime,
|
|
68
|
-
serverId,
|
|
69
|
-
};
|
|
70
|
-
// Emit discovery completed event
|
|
71
|
-
this.emit("discoveryCompleted", {
|
|
72
|
-
serverId,
|
|
73
|
-
toolCount: registeredTools.length,
|
|
74
|
-
duration: result.duration,
|
|
75
|
-
timestamp: new Date(),
|
|
76
|
-
});
|
|
77
|
-
mcpLogger.info(`[ToolDiscoveryService] Discovery completed for ${serverId}: ${registeredTools.length} tools`);
|
|
78
|
-
return result;
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
82
|
-
mcpLogger.error(`[ToolDiscoveryService] Discovery failed for ${serverId}:`, error);
|
|
83
|
-
// Emit discovery failed event
|
|
84
|
-
this.emit("discoveryFailed", {
|
|
85
|
-
serverId,
|
|
86
|
-
error: errorMessage,
|
|
87
|
-
timestamp: new Date(),
|
|
88
|
-
});
|
|
89
|
-
return {
|
|
90
|
-
success: false,
|
|
91
|
-
error: errorMessage,
|
|
92
|
-
toolCount: 0,
|
|
93
|
-
tools: [],
|
|
94
|
-
duration: Date.now() - startTime,
|
|
95
|
-
serverId,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
finally {
|
|
99
|
-
this.discoveryInProgress.delete(serverId);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Perform the actual tool discovery
|
|
104
|
-
*/
|
|
105
|
-
async performToolDiscovery(serverId, client, timeout) {
|
|
106
|
-
// List tools from the MCP server
|
|
107
|
-
const listToolsPromise = client.listTools();
|
|
108
|
-
const timeoutPromise = this.createTimeoutPromise(timeout, "Tool discovery timeout");
|
|
109
|
-
const result = await Promise.race([listToolsPromise, timeoutPromise]);
|
|
110
|
-
if (!result || !result.tools) {
|
|
111
|
-
throw new Error("No tools returned from server");
|
|
112
|
-
}
|
|
113
|
-
mcpLogger.debug(`[ToolDiscoveryService] Discovered ${result.tools.length} tools from ${serverId}`);
|
|
114
|
-
return result.tools;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Register discovered tools
|
|
118
|
-
*/
|
|
119
|
-
async registerDiscoveredTools(serverId, tools) {
|
|
120
|
-
const registeredTools = [];
|
|
121
|
-
// Clear existing tools for this server
|
|
122
|
-
this.clearServerTools(serverId);
|
|
123
|
-
for (const tool of tools) {
|
|
124
|
-
try {
|
|
125
|
-
const toolInfo = await this.createToolInfo(serverId, tool);
|
|
126
|
-
const validation = this.validateTool(toolInfo);
|
|
127
|
-
if (!validation.isValid) {
|
|
128
|
-
mcpLogger.warn(`[ToolDiscoveryService] Skipping invalid tool ${tool.name} from ${serverId}:`, validation.errors);
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
// Apply validation metadata
|
|
132
|
-
if (validation.metadata) {
|
|
133
|
-
toolInfo.metadata = {
|
|
134
|
-
...toolInfo.metadata,
|
|
135
|
-
...validation.metadata,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
// Register the tool
|
|
139
|
-
const toolKey = this.createToolKey(serverId, tool.name);
|
|
140
|
-
this.toolRegistry.set(toolKey, toolInfo);
|
|
141
|
-
if (!this.serverToolStorage.has(serverId)) {
|
|
142
|
-
this.serverToolStorage.set(serverId, []);
|
|
143
|
-
}
|
|
144
|
-
const serverTools = this.serverToolStorage.get(serverId);
|
|
145
|
-
if (!serverTools) {
|
|
146
|
-
throw new Error(`Server tools storage not found for ${serverId}`);
|
|
147
|
-
}
|
|
148
|
-
// Add tool if not already present
|
|
149
|
-
if (!serverTools.find((t) => t.name === tool.name)) {
|
|
150
|
-
serverTools.push({
|
|
151
|
-
name: tool.name,
|
|
152
|
-
description: tool.description || "",
|
|
153
|
-
inputSchema: tool.inputSchema,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
// Track server tools (legacy)
|
|
157
|
-
if (!this.serverTools.has(serverId)) {
|
|
158
|
-
this.serverTools.set(serverId, new Set());
|
|
159
|
-
}
|
|
160
|
-
const serverToolSet = this.serverTools.get(serverId);
|
|
161
|
-
if (serverToolSet) {
|
|
162
|
-
serverToolSet.add(tool.name);
|
|
163
|
-
}
|
|
164
|
-
registeredTools.push(toolInfo);
|
|
165
|
-
// Emit tool registered event
|
|
166
|
-
this.emit("toolRegistered", {
|
|
167
|
-
serverId,
|
|
168
|
-
toolName: tool.name,
|
|
169
|
-
toolInfo,
|
|
170
|
-
timestamp: new Date(),
|
|
171
|
-
});
|
|
172
|
-
mcpLogger.debug(`[ToolDiscoveryService] Registered tool: ${tool.name} from ${serverId}`);
|
|
173
|
-
}
|
|
174
|
-
catch (error) {
|
|
175
|
-
mcpLogger.error(`[ToolDiscoveryService] Failed to register tool ${tool.name} from ${serverId}:`, error);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return registeredTools;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Create tool info from MCP tool definition
|
|
182
|
-
*/
|
|
183
|
-
async createToolInfo(serverId, tool) {
|
|
184
|
-
return {
|
|
185
|
-
name: tool.name,
|
|
186
|
-
description: tool.description || "No description provided",
|
|
187
|
-
serverId,
|
|
188
|
-
inputSchema: tool.inputSchema,
|
|
189
|
-
isAvailable: true,
|
|
190
|
-
stats: {
|
|
191
|
-
totalCalls: 0,
|
|
192
|
-
successfulCalls: 0,
|
|
193
|
-
failedCalls: 0,
|
|
194
|
-
averageExecutionTime: 0,
|
|
195
|
-
lastExecutionTime: 0,
|
|
196
|
-
},
|
|
197
|
-
metadata: {
|
|
198
|
-
category: this.inferToolCategory(tool),
|
|
199
|
-
version: "1.0.0",
|
|
200
|
-
deprecated: false,
|
|
201
|
-
},
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Infer tool category from tool definition
|
|
206
|
-
*/
|
|
207
|
-
inferToolCategory(tool) {
|
|
208
|
-
const name = tool.name.toLowerCase();
|
|
209
|
-
const description = (tool.description || "").toLowerCase();
|
|
210
|
-
// Common patterns for categorization
|
|
211
|
-
if (name.includes("git") || description.includes("git")) {
|
|
212
|
-
return "version-control";
|
|
213
|
-
}
|
|
214
|
-
if (name.includes("file") ||
|
|
215
|
-
name.includes("read") ||
|
|
216
|
-
name.includes("write")) {
|
|
217
|
-
return "file-system";
|
|
218
|
-
}
|
|
219
|
-
if (name.includes("api") ||
|
|
220
|
-
name.includes("http") ||
|
|
221
|
-
name.includes("request")) {
|
|
222
|
-
return "api";
|
|
223
|
-
}
|
|
224
|
-
if (name.includes("data") ||
|
|
225
|
-
name.includes("query") ||
|
|
226
|
-
name.includes("search")) {
|
|
227
|
-
return "data";
|
|
228
|
-
}
|
|
229
|
-
if (name.includes("auth") ||
|
|
230
|
-
name.includes("login") ||
|
|
231
|
-
name.includes("token")) {
|
|
232
|
-
return "authentication";
|
|
233
|
-
}
|
|
234
|
-
if (name.includes("deploy") ||
|
|
235
|
-
name.includes("build") ||
|
|
236
|
-
name.includes("ci")) {
|
|
237
|
-
return "deployment";
|
|
238
|
-
}
|
|
239
|
-
return "general";
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Validate a tool
|
|
243
|
-
*/
|
|
244
|
-
validateTool(toolInfo) {
|
|
245
|
-
const errors = [];
|
|
246
|
-
const warnings = [];
|
|
247
|
-
// Use centralized validation for name
|
|
248
|
-
const nameError = validateToolName(toolInfo.name);
|
|
249
|
-
if (nameError) {
|
|
250
|
-
errors.push(nameError.message);
|
|
251
|
-
}
|
|
252
|
-
// Use centralized validation for description
|
|
253
|
-
const descriptionError = validateToolDescription(toolInfo.description);
|
|
254
|
-
if (descriptionError) {
|
|
255
|
-
warnings.push(descriptionError.message);
|
|
256
|
-
}
|
|
257
|
-
if (!toolInfo.serverId) {
|
|
258
|
-
errors.push("Server ID is required");
|
|
259
|
-
}
|
|
260
|
-
// Schema validation
|
|
261
|
-
if (toolInfo.inputSchema) {
|
|
262
|
-
try {
|
|
263
|
-
JSON.stringify(toolInfo.inputSchema);
|
|
264
|
-
}
|
|
265
|
-
catch {
|
|
266
|
-
errors.push("Input schema is not valid JSON");
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
// Infer metadata
|
|
270
|
-
const metadata = {
|
|
271
|
-
category: typeof toolInfo.metadata?.category === "string"
|
|
272
|
-
? toolInfo.metadata.category
|
|
273
|
-
: "general",
|
|
274
|
-
complexity: this.inferComplexity(toolInfo),
|
|
275
|
-
requiresAuth: this.inferAuthRequirement(toolInfo),
|
|
276
|
-
isDeprecated: typeof toolInfo.metadata?.deprecated === "boolean"
|
|
277
|
-
? toolInfo.metadata.deprecated
|
|
278
|
-
: false,
|
|
279
|
-
};
|
|
280
|
-
return {
|
|
281
|
-
isValid: errors.length === 0,
|
|
282
|
-
errors,
|
|
283
|
-
warnings,
|
|
284
|
-
metadata,
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Infer tool complexity
|
|
289
|
-
*/
|
|
290
|
-
inferComplexity(toolInfo) {
|
|
291
|
-
const schema = toolInfo.inputSchema;
|
|
292
|
-
if (!schema || !schema.properties) {
|
|
293
|
-
return "simple";
|
|
294
|
-
}
|
|
295
|
-
const propertyCount = Object.keys(schema.properties).length;
|
|
296
|
-
if (propertyCount <= 2) {
|
|
297
|
-
return "simple";
|
|
298
|
-
}
|
|
299
|
-
else if (propertyCount <= 5) {
|
|
300
|
-
return "moderate";
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
return "complex";
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Infer if tool requires authentication
|
|
308
|
-
*/
|
|
309
|
-
inferAuthRequirement(toolInfo) {
|
|
310
|
-
const name = toolInfo.name.toLowerCase();
|
|
311
|
-
const description = toolInfo.description.toLowerCase();
|
|
312
|
-
return (name.includes("auth") ||
|
|
313
|
-
name.includes("login") ||
|
|
314
|
-
name.includes("token") ||
|
|
315
|
-
description.includes("authentication") ||
|
|
316
|
-
description.includes("credentials") ||
|
|
317
|
-
description.includes("permission"));
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Execute a tool
|
|
321
|
-
*/
|
|
322
|
-
async executeTool(toolName, serverId, client, parameters, options = {}) {
|
|
323
|
-
const startTime = Date.now();
|
|
324
|
-
try {
|
|
325
|
-
const toolKey = this.createToolKey(serverId, toolName);
|
|
326
|
-
const toolInfo = this.toolRegistry.get(toolKey);
|
|
327
|
-
if (!toolInfo) {
|
|
328
|
-
throw new Error(`Tool '${toolName}' not found for server '${serverId}'`);
|
|
329
|
-
}
|
|
330
|
-
if (!toolInfo.isAvailable) {
|
|
331
|
-
throw new Error(`Tool '${toolName}' is not available`);
|
|
332
|
-
}
|
|
333
|
-
// Validate input parameters if requested
|
|
334
|
-
if (options.validateInput !== false) {
|
|
335
|
-
this.validateToolParameters(toolInfo, parameters);
|
|
336
|
-
}
|
|
337
|
-
mcpLogger.debug(`[ToolDiscoveryService] Executing tool: ${toolName} on ${serverId}`, {
|
|
338
|
-
parameters,
|
|
339
|
-
});
|
|
340
|
-
// Create circuit breaker for tool execution
|
|
341
|
-
const effectiveTimeout = options.timeout || DEFAULT_TOOL_TIMEOUT;
|
|
342
|
-
const circuitBreaker = globalCircuitBreakerManager.getBreaker(`tool-execution-${serverId}-${toolName}`, {
|
|
343
|
-
failureThreshold: 3,
|
|
344
|
-
resetTimeout: 30000,
|
|
345
|
-
operationTimeout: effectiveTimeout,
|
|
346
|
-
});
|
|
347
|
-
// Execute tool with circuit breaker protection
|
|
348
|
-
const result = await circuitBreaker.execute(async () => {
|
|
349
|
-
return mcpTracer.startActiveSpan("neurolink.mcp.callTool", {
|
|
350
|
-
kind: SpanKind.CLIENT,
|
|
351
|
-
attributes: {
|
|
352
|
-
"mcp.server_id": serverId,
|
|
353
|
-
"mcp.tool_name": toolName,
|
|
354
|
-
"mcp.timeout_ms": effectiveTimeout,
|
|
355
|
-
},
|
|
356
|
-
}, async (callSpan) => {
|
|
357
|
-
try {
|
|
358
|
-
const timeout = effectiveTimeout;
|
|
359
|
-
const callResult = await withTimeout(client.callTool({
|
|
360
|
-
name: toolName,
|
|
361
|
-
arguments: parameters,
|
|
362
|
-
}), timeout, new Error(`Tool execution timeout: ${toolName}`));
|
|
363
|
-
callSpan.setStatus({ code: SpanStatusCode.OK });
|
|
364
|
-
return callResult;
|
|
365
|
-
}
|
|
366
|
-
catch (err) {
|
|
367
|
-
callSpan.setStatus({
|
|
368
|
-
code: SpanStatusCode.ERROR,
|
|
369
|
-
message: err.message,
|
|
370
|
-
});
|
|
371
|
-
callSpan.recordException(err);
|
|
372
|
-
throw err;
|
|
373
|
-
}
|
|
374
|
-
finally {
|
|
375
|
-
callSpan.end();
|
|
376
|
-
}
|
|
377
|
-
});
|
|
378
|
-
});
|
|
379
|
-
const duration = Date.now() - startTime;
|
|
380
|
-
// Update tool statistics
|
|
381
|
-
this.updateToolStats(toolKey, true, duration);
|
|
382
|
-
// Validate output if requested
|
|
383
|
-
if (options.validateOutput !== false) {
|
|
384
|
-
this.validateToolOutput(result);
|
|
385
|
-
}
|
|
386
|
-
mcpLogger.debug(`[ToolDiscoveryService] Tool execution completed: ${toolName}`, {
|
|
387
|
-
duration,
|
|
388
|
-
hasContent: !!result.content,
|
|
389
|
-
});
|
|
390
|
-
return {
|
|
391
|
-
success: true,
|
|
392
|
-
data: result,
|
|
393
|
-
duration,
|
|
394
|
-
metadata: {
|
|
395
|
-
toolName,
|
|
396
|
-
serverId,
|
|
397
|
-
timestamp: Date.now(),
|
|
398
|
-
},
|
|
399
|
-
};
|
|
400
|
-
}
|
|
401
|
-
catch (error) {
|
|
402
|
-
const duration = Date.now() - startTime;
|
|
403
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
404
|
-
// Update tool statistics
|
|
405
|
-
const toolKey = this.createToolKey(serverId, toolName);
|
|
406
|
-
this.updateToolStats(toolKey, false, duration);
|
|
407
|
-
// Circuit breaker open errors: return a structured isError result with
|
|
408
|
-
// actionable details so AI models understand the tool is temporarily
|
|
409
|
-
// unavailable and should NOT retry until the cooldown expires.
|
|
410
|
-
if (error instanceof CircuitBreakerOpenError) {
|
|
411
|
-
mcpLogger.warn(`[ToolDiscoveryService] Tool blocked by circuit breaker: ${toolName} on ${serverId}`, {
|
|
412
|
-
breakerState: error.breakerState,
|
|
413
|
-
retryAfter: error.retryAfter,
|
|
414
|
-
retryAfterMs: error.retryAfterMs,
|
|
415
|
-
failureCount: error.failureCount,
|
|
416
|
-
});
|
|
417
|
-
return {
|
|
418
|
-
success: false,
|
|
419
|
-
error: error.message,
|
|
420
|
-
data: {
|
|
421
|
-
isError: true,
|
|
422
|
-
content: [
|
|
423
|
-
{
|
|
424
|
-
type: "text",
|
|
425
|
-
text: `TOOL TEMPORARILY UNAVAILABLE: "${toolName}" has been disabled after ` +
|
|
426
|
-
`${error.failureCount} failures. ` +
|
|
427
|
-
`This is a circuit breaker protection — do NOT retry this tool. ` +
|
|
428
|
-
`It will become available again after ${Math.ceil(error.retryAfterMs / 1000)} seconds ` +
|
|
429
|
-
`(at ${error.retryAfter}). ` +
|
|
430
|
-
`Instead, inform the user that the operation failed and suggest trying again later.`,
|
|
431
|
-
},
|
|
432
|
-
],
|
|
433
|
-
},
|
|
434
|
-
duration,
|
|
435
|
-
metadata: {
|
|
436
|
-
toolName,
|
|
437
|
-
serverId,
|
|
438
|
-
timestamp: Date.now(),
|
|
439
|
-
circuitBreaker: {
|
|
440
|
-
state: error.breakerState,
|
|
441
|
-
retryAfter: error.retryAfter,
|
|
442
|
-
retryAfterMs: error.retryAfterMs,
|
|
443
|
-
failureCount: error.failureCount,
|
|
444
|
-
},
|
|
445
|
-
},
|
|
446
|
-
};
|
|
447
|
-
}
|
|
448
|
-
mcpLogger.error(`[ToolDiscoveryService] Tool execution failed: ${toolName}`, error);
|
|
449
|
-
return {
|
|
450
|
-
success: false,
|
|
451
|
-
error: errorMessage,
|
|
452
|
-
duration,
|
|
453
|
-
metadata: {
|
|
454
|
-
toolName,
|
|
455
|
-
serverId,
|
|
456
|
-
timestamp: Date.now(),
|
|
457
|
-
},
|
|
458
|
-
};
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* Validate tool parameters
|
|
463
|
-
*/
|
|
464
|
-
validateToolParameters(toolInfo, parameters) {
|
|
465
|
-
if (!toolInfo.inputSchema) {
|
|
466
|
-
return; // No schema to validate against
|
|
467
|
-
}
|
|
468
|
-
// Basic validation - check required properties
|
|
469
|
-
const schema = toolInfo.inputSchema;
|
|
470
|
-
if (schema.required && Array.isArray(schema.required)) {
|
|
471
|
-
for (const requiredProp of schema.required) {
|
|
472
|
-
if (typeof requiredProp === "string" && !(requiredProp in parameters)) {
|
|
473
|
-
throw new Error(`Missing required parameter: ${requiredProp}`);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
// Type validation for properties
|
|
478
|
-
if (schema.properties) {
|
|
479
|
-
for (const [propName, propSchema] of Object.entries(schema.properties)) {
|
|
480
|
-
if (propName in parameters) {
|
|
481
|
-
this.validateParameterType(propName, parameters[propName], propSchema);
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
/**
|
|
487
|
-
* Validate parameter type
|
|
488
|
-
*/
|
|
489
|
-
validateParameterType(name, value, schema) {
|
|
490
|
-
if (!schema.type) {
|
|
491
|
-
return; // No type constraint
|
|
492
|
-
}
|
|
493
|
-
const expectedType = schema.type;
|
|
494
|
-
const actualType = typeof value;
|
|
495
|
-
switch (expectedType) {
|
|
496
|
-
case "string":
|
|
497
|
-
if (actualType !== "string") {
|
|
498
|
-
throw new Error(`Parameter '${name}' must be a string, got ${actualType}`);
|
|
499
|
-
}
|
|
500
|
-
break;
|
|
501
|
-
case "number":
|
|
502
|
-
if (actualType !== "number") {
|
|
503
|
-
throw new Error(`Parameter '${name}' must be a number, got ${actualType}`);
|
|
504
|
-
}
|
|
505
|
-
break;
|
|
506
|
-
case "boolean":
|
|
507
|
-
if (actualType !== "boolean") {
|
|
508
|
-
throw new Error(`Parameter '${name}' must be a boolean, got ${actualType}`);
|
|
509
|
-
}
|
|
510
|
-
break;
|
|
511
|
-
case "array":
|
|
512
|
-
if (!Array.isArray(value)) {
|
|
513
|
-
throw new Error(`Parameter '${name}' must be an array, got ${actualType}`);
|
|
514
|
-
}
|
|
515
|
-
break;
|
|
516
|
-
case "object":
|
|
517
|
-
if (actualType !== "object" || value === null || Array.isArray(value)) {
|
|
518
|
-
throw new Error(`Parameter '${name}' must be an object, got ${actualType}`);
|
|
519
|
-
}
|
|
520
|
-
break;
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
/**
|
|
524
|
-
* Validate tool output with enhanced type safety
|
|
525
|
-
*/
|
|
526
|
-
validateToolOutput(result) {
|
|
527
|
-
// GENERIC ERROR HANDLING FOR ALL MCP TOOLS
|
|
528
|
-
// Different MCP servers return different error formats, so we should be permissive
|
|
529
|
-
// and let the AI handle any response format instead of throwing errors
|
|
530
|
-
// Only throw for truly invalid responses (null/undefined)
|
|
531
|
-
if (isNullish(result)) {
|
|
532
|
-
mcpLogger.debug("[ToolDiscoveryService] Tool returned null/undefined, treating as empty response");
|
|
533
|
-
// Even null responses can be valid for some tools - don't throw
|
|
534
|
-
return;
|
|
535
|
-
}
|
|
536
|
-
// Log what we received for debugging, but don't validate specific formats
|
|
537
|
-
mcpLogger.debug("[ToolDiscoveryService] Tool response received", {
|
|
538
|
-
type: typeof result,
|
|
539
|
-
isArray: Array.isArray(result),
|
|
540
|
-
isObject: isObject(result),
|
|
541
|
-
hasKeys: isObject(result) ? Object.keys(result).length : 0,
|
|
542
|
-
fullResponse: result, // Log the complete response, not a truncated sample
|
|
543
|
-
});
|
|
544
|
-
// COMPLETELY PERMISSIVE APPROACH:
|
|
545
|
-
// - Any response format is valid (objects, strings, arrays, booleans, numbers)
|
|
546
|
-
// - Even error responses are passed to the AI to handle
|
|
547
|
-
// - The AI can interpret error messages and retry with different approaches
|
|
548
|
-
// - This works with any MCP server regardless of their response format
|
|
549
|
-
// No validation or throwing - let the AI handle everything
|
|
550
|
-
return;
|
|
551
|
-
}
|
|
552
|
-
/**
|
|
553
|
-
* Update tool statistics
|
|
554
|
-
*/
|
|
555
|
-
updateToolStats(toolKey, success, duration) {
|
|
556
|
-
const toolInfo = this.toolRegistry.get(toolKey);
|
|
557
|
-
if (!toolInfo) {
|
|
558
|
-
return;
|
|
559
|
-
}
|
|
560
|
-
toolInfo.stats.totalCalls++;
|
|
561
|
-
toolInfo.lastCalled = new Date();
|
|
562
|
-
toolInfo.stats.lastExecutionTime = duration;
|
|
563
|
-
if (success) {
|
|
564
|
-
toolInfo.stats.successfulCalls++;
|
|
565
|
-
}
|
|
566
|
-
else {
|
|
567
|
-
toolInfo.stats.failedCalls++;
|
|
568
|
-
}
|
|
569
|
-
// Update average execution time
|
|
570
|
-
const totalTime = toolInfo.stats.averageExecutionTime * (toolInfo.stats.totalCalls - 1) +
|
|
571
|
-
duration;
|
|
572
|
-
toolInfo.stats.averageExecutionTime = totalTime / toolInfo.stats.totalCalls;
|
|
573
|
-
}
|
|
574
|
-
/**
|
|
575
|
-
* Get tool by name and server
|
|
576
|
-
*/
|
|
577
|
-
getTool(toolName, serverId) {
|
|
578
|
-
const toolKey = this.createToolKey(serverId, toolName);
|
|
579
|
-
return this.toolRegistry.get(toolKey);
|
|
580
|
-
}
|
|
581
|
-
/**
|
|
582
|
-
* Get all tools for a server
|
|
583
|
-
*/
|
|
584
|
-
getServerTools(serverId) {
|
|
585
|
-
const serverTools = this.serverToolStorage.get(serverId);
|
|
586
|
-
if (serverTools) {
|
|
587
|
-
return serverTools.map((tool) => ({
|
|
588
|
-
name: tool.name,
|
|
589
|
-
description: tool.description,
|
|
590
|
-
serverId,
|
|
591
|
-
inputSchema: tool.inputSchema,
|
|
592
|
-
isAvailable: true,
|
|
593
|
-
stats: {
|
|
594
|
-
totalCalls: 0,
|
|
595
|
-
successfulCalls: 0,
|
|
596
|
-
failedCalls: 0,
|
|
597
|
-
averageExecutionTime: 0,
|
|
598
|
-
lastExecutionTime: 0,
|
|
599
|
-
},
|
|
600
|
-
}));
|
|
601
|
-
}
|
|
602
|
-
// Fallback to legacy storage
|
|
603
|
-
const tools = [];
|
|
604
|
-
const serverToolNames = this.serverTools.get(serverId);
|
|
605
|
-
if (serverToolNames) {
|
|
606
|
-
for (const toolName of serverToolNames) {
|
|
607
|
-
const toolKey = this.createToolKey(serverId, toolName);
|
|
608
|
-
const toolInfo = this.toolRegistry.get(toolKey);
|
|
609
|
-
if (toolInfo) {
|
|
610
|
-
tools.push(toolInfo);
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
return tools;
|
|
615
|
-
}
|
|
616
|
-
/**
|
|
617
|
-
* Get all registered tools
|
|
618
|
-
*/
|
|
619
|
-
getAllTools() {
|
|
620
|
-
const allTools = [];
|
|
621
|
-
// Add tools from server-based storage (preferred)
|
|
622
|
-
for (const [serverId, serverTools] of this.serverToolStorage.entries()) {
|
|
623
|
-
for (const tool of serverTools) {
|
|
624
|
-
allTools.push({
|
|
625
|
-
name: tool.name,
|
|
626
|
-
description: tool.description,
|
|
627
|
-
serverId,
|
|
628
|
-
inputSchema: tool.inputSchema,
|
|
629
|
-
isAvailable: true,
|
|
630
|
-
stats: {
|
|
631
|
-
totalCalls: 0,
|
|
632
|
-
successfulCalls: 0,
|
|
633
|
-
failedCalls: 0,
|
|
634
|
-
averageExecutionTime: 0,
|
|
635
|
-
lastExecutionTime: 0,
|
|
636
|
-
},
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
// Fallback to legacy storage for any tools not in server-based storage
|
|
641
|
-
const legacyTools = Array.from(this.toolRegistry.values()).filter((tool) => !allTools.some((t) => t.name === tool.name && t.serverId === tool.serverId));
|
|
642
|
-
return [...allTools, ...legacyTools];
|
|
643
|
-
}
|
|
644
|
-
/**
|
|
645
|
-
* Clear tools for a server
|
|
646
|
-
*/
|
|
647
|
-
clearServerTools(serverId) {
|
|
648
|
-
const serverTools = this.serverToolStorage.get(serverId);
|
|
649
|
-
if (serverTools) {
|
|
650
|
-
// Emit unregistered events for server-based tools
|
|
651
|
-
for (const tool of serverTools) {
|
|
652
|
-
this.emit("toolUnregistered", {
|
|
653
|
-
serverId,
|
|
654
|
-
toolName: tool.name,
|
|
655
|
-
timestamp: new Date(),
|
|
656
|
-
});
|
|
657
|
-
}
|
|
658
|
-
this.serverToolStorage.delete(serverId);
|
|
659
|
-
}
|
|
660
|
-
// Legacy cleanup
|
|
661
|
-
const serverToolNames = this.serverTools.get(serverId);
|
|
662
|
-
if (serverToolNames) {
|
|
663
|
-
for (const toolName of serverToolNames) {
|
|
664
|
-
const toolKey = this.createToolKey(serverId, toolName);
|
|
665
|
-
this.toolRegistry.delete(toolKey);
|
|
666
|
-
// Emit tool unregistered event (only if not already emitted above)
|
|
667
|
-
if (!serverTools || !serverTools.find((t) => t.name === toolName)) {
|
|
668
|
-
this.emit("toolUnregistered", {
|
|
669
|
-
serverId,
|
|
670
|
-
toolName,
|
|
671
|
-
timestamp: new Date(),
|
|
672
|
-
});
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
this.serverTools.delete(serverId);
|
|
676
|
-
}
|
|
677
|
-
mcpLogger.debug(`[ToolDiscoveryService] Cleared tools for server: ${serverId}`);
|
|
678
|
-
}
|
|
679
|
-
/**
|
|
680
|
-
* Update tool availability
|
|
681
|
-
*/
|
|
682
|
-
updateToolAvailability(toolName, serverId, isAvailable) {
|
|
683
|
-
const toolKey = this.createToolKey(serverId, toolName);
|
|
684
|
-
const toolInfo = this.toolRegistry.get(toolKey);
|
|
685
|
-
if (toolInfo) {
|
|
686
|
-
toolInfo.isAvailable = isAvailable;
|
|
687
|
-
mcpLogger.debug(`[ToolDiscoveryService] Updated availability for ${toolName}: ${isAvailable}`);
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
/**
|
|
691
|
-
* Create tool key for registry
|
|
692
|
-
*/
|
|
693
|
-
createToolKey(serverId, toolName) {
|
|
694
|
-
return `${serverId}:${toolName}`;
|
|
695
|
-
}
|
|
696
|
-
/**
|
|
697
|
-
* Create timeout promise
|
|
698
|
-
*/
|
|
699
|
-
createTimeoutPromise(timeout, message) {
|
|
700
|
-
return new Promise((_, reject) => {
|
|
701
|
-
setTimeout(() => {
|
|
702
|
-
reject(new Error(message));
|
|
703
|
-
}, timeout);
|
|
704
|
-
});
|
|
705
|
-
}
|
|
706
|
-
/**
|
|
707
|
-
* Destroy the tool discovery service and clean up all resources
|
|
708
|
-
* This method should be called when the service is no longer needed
|
|
709
|
-
* to prevent memory leaks from accumulated event listeners
|
|
710
|
-
*
|
|
711
|
-
* @example
|
|
712
|
-
* ```typescript
|
|
713
|
-
* const service = new ToolDiscoveryService();
|
|
714
|
-
* // ... use the service ...
|
|
715
|
-
* service.destroy(); // Clean up when done
|
|
716
|
-
* ```
|
|
717
|
-
*/
|
|
718
|
-
destroy() {
|
|
719
|
-
mcpLogger.debug("[ToolDiscoveryService] Starting cleanup...");
|
|
720
|
-
// Clear all event listeners to prevent memory leaks
|
|
721
|
-
this.removeAllListeners();
|
|
722
|
-
// Clear all internal data structures
|
|
723
|
-
this.serverToolStorage.clear();
|
|
724
|
-
this.toolRegistry.clear();
|
|
725
|
-
this.serverTools.clear();
|
|
726
|
-
this.discoveryInProgress.clear();
|
|
727
|
-
mcpLogger.debug("[ToolDiscoveryService] Destroyed and cleaned up");
|
|
728
|
-
}
|
|
729
|
-
/**
|
|
730
|
-
* Reset statistics for all tools
|
|
731
|
-
* This clears execution counts, timing data, and other statistics
|
|
732
|
-
* while preserving the tool registrations themselves
|
|
733
|
-
*/
|
|
734
|
-
resetStatistics() {
|
|
735
|
-
for (const toolInfo of this.toolRegistry.values()) {
|
|
736
|
-
toolInfo.stats = {
|
|
737
|
-
totalCalls: 0,
|
|
738
|
-
successfulCalls: 0,
|
|
739
|
-
failedCalls: 0,
|
|
740
|
-
averageExecutionTime: 0,
|
|
741
|
-
lastExecutionTime: 0,
|
|
742
|
-
};
|
|
743
|
-
toolInfo.lastCalled = undefined;
|
|
744
|
-
}
|
|
745
|
-
mcpLogger.debug("[ToolDiscoveryService] Statistics reset for all tools");
|
|
746
|
-
}
|
|
747
|
-
/**
|
|
748
|
-
* Get the count of active event listeners
|
|
749
|
-
* Useful for monitoring potential memory leaks
|
|
750
|
-
*/
|
|
751
|
-
getListenerCount() {
|
|
752
|
-
const events = [
|
|
753
|
-
"discoveryCompleted",
|
|
754
|
-
"discoveryFailed",
|
|
755
|
-
"toolRegistered",
|
|
756
|
-
"toolUnregistered",
|
|
757
|
-
];
|
|
758
|
-
let total = 0;
|
|
759
|
-
for (const event of events) {
|
|
760
|
-
total += this.listenerCount(event);
|
|
761
|
-
}
|
|
762
|
-
return total;
|
|
763
|
-
}
|
|
764
|
-
/**
|
|
765
|
-
* Get discovery statistics
|
|
766
|
-
*/
|
|
767
|
-
getStatistics() {
|
|
768
|
-
const toolsByServer = {};
|
|
769
|
-
const toolsByCategory = {};
|
|
770
|
-
let availableTools = 0;
|
|
771
|
-
let unavailableTools = 0;
|
|
772
|
-
for (const toolInfo of this.toolRegistry.values()) {
|
|
773
|
-
// Count by server
|
|
774
|
-
toolsByServer[toolInfo.serverId] =
|
|
775
|
-
(toolsByServer[toolInfo.serverId] || 0) + 1;
|
|
776
|
-
// Count by category
|
|
777
|
-
const category = typeof toolInfo.metadata?.category === "string"
|
|
778
|
-
? toolInfo.metadata.category
|
|
779
|
-
: "unknown";
|
|
780
|
-
toolsByCategory[category] = (toolsByCategory[category] || 0) + 1;
|
|
781
|
-
// Count availability
|
|
782
|
-
if (toolInfo.isAvailable) {
|
|
783
|
-
availableTools++;
|
|
784
|
-
}
|
|
785
|
-
else {
|
|
786
|
-
unavailableTools++;
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
return {
|
|
790
|
-
totalTools: this.toolRegistry.size,
|
|
791
|
-
availableTools,
|
|
792
|
-
unavailableTools,
|
|
793
|
-
totalServers: this.serverTools.size,
|
|
794
|
-
toolsByServer,
|
|
795
|
-
toolsByCategory,
|
|
796
|
-
};
|
|
797
|
-
}
|
|
798
|
-
}
|