@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,729 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Tool Registry - Extended Registry with Tool Management
|
|
3
|
-
* Updated to match industry standard camelCase interfaces
|
|
4
|
-
*/
|
|
5
|
-
import { MCPRegistry } from "./registry.js";
|
|
6
|
-
import { registryLogger } from "../utils/logger.js";
|
|
7
|
-
import { randomUUID } from "crypto";
|
|
8
|
-
import { shouldDisableBuiltinTools } from "../utils/toolUtils.js";
|
|
9
|
-
import { directAgentTools } from "../agent/directTools.js";
|
|
10
|
-
import { detectCategory, createMCPServerInfo } from "../utils/mcpDefaults.js";
|
|
11
|
-
import { FlexibleToolValidator } from "./flexibleToolValidator.js";
|
|
12
|
-
import { HITLUserRejectedError, HITLTimeoutError } from "../hitl/hitlErrors.js";
|
|
13
|
-
import { withSpan, tracers, ATTR } from "../telemetry/index.js";
|
|
14
|
-
import { getAuthContext } from "../auth/authContext.js";
|
|
15
|
-
export class MCPToolRegistry extends MCPRegistry {
|
|
16
|
-
tools = new Map();
|
|
17
|
-
toolImplementations = new Map(); // Store actual tool implementations
|
|
18
|
-
toolExecutionStats = new Map();
|
|
19
|
-
builtInServerInfos = []; // DIRECT storage for MCPServerInfo
|
|
20
|
-
hitlManager; // Optional HITL manager for safety mechanisms
|
|
21
|
-
constructor() {
|
|
22
|
-
super();
|
|
23
|
-
if (!shouldDisableBuiltinTools()) {
|
|
24
|
-
this.registerDirectTools();
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Set HITL manager for human-in-the-loop safety mechanisms
|
|
29
|
-
* @param hitlManager - HITL manager instance (optional, can be undefined to disable)
|
|
30
|
-
*/
|
|
31
|
-
setHITLManager(hitlManager) {
|
|
32
|
-
this.hitlManager = hitlManager;
|
|
33
|
-
if (hitlManager && hitlManager.isEnabled()) {
|
|
34
|
-
registryLogger.info("HITL safety mechanisms enabled for tool execution");
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
registryLogger.debug("HITL safety mechanisms disabled or not configured");
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Get current HITL manager
|
|
42
|
-
*/
|
|
43
|
-
getHITLManager() {
|
|
44
|
-
return this.hitlManager;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Register all direct tools from directAgentTools
|
|
48
|
-
*/
|
|
49
|
-
registerDirectTools() {
|
|
50
|
-
registryLogger.debug("Auto-registering direct tools...");
|
|
51
|
-
for (const [toolName, toolDef] of Object.entries(directAgentTools)) {
|
|
52
|
-
// Skip undefined tools
|
|
53
|
-
if (!toolDef) {
|
|
54
|
-
registryLogger.warn(`Skipping undefined tool during registration: ${toolName}`);
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
const toolId = `direct.${toolName}`;
|
|
58
|
-
const toolInfo = {
|
|
59
|
-
name: toolName,
|
|
60
|
-
description: toolDef.description || `Direct tool: ${toolName}`,
|
|
61
|
-
inputSchema: {},
|
|
62
|
-
serverId: "direct",
|
|
63
|
-
category: detectCategory({ isBuiltIn: true, serverId: "direct" }),
|
|
64
|
-
};
|
|
65
|
-
this.tools.set(toolId, toolInfo);
|
|
66
|
-
this.toolImplementations.set(toolId, {
|
|
67
|
-
execute: async (params, context) => {
|
|
68
|
-
try {
|
|
69
|
-
// Direct tools from AI SDK expect their specific parameter structure
|
|
70
|
-
// Each tool validates its own parameters, so we safely pass them through
|
|
71
|
-
const result = await toolDef.execute(params, {
|
|
72
|
-
toolCallId: context?.sessionId || "unknown",
|
|
73
|
-
messages: [],
|
|
74
|
-
});
|
|
75
|
-
// Return the result wrapped in our standard format
|
|
76
|
-
return {
|
|
77
|
-
success: true,
|
|
78
|
-
data: result,
|
|
79
|
-
metadata: {
|
|
80
|
-
toolName,
|
|
81
|
-
serverId: "direct",
|
|
82
|
-
executionTime: 0,
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
return {
|
|
88
|
-
success: false,
|
|
89
|
-
error: error instanceof Error ? error.message : String(error),
|
|
90
|
-
metadata: {
|
|
91
|
-
toolName,
|
|
92
|
-
serverId: "direct",
|
|
93
|
-
executionTime: 0,
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
description: toolDef.description,
|
|
99
|
-
inputSchema: {},
|
|
100
|
-
});
|
|
101
|
-
registryLogger.debug(`Registered direct tool: ${toolName} as ${toolId}`);
|
|
102
|
-
}
|
|
103
|
-
registryLogger.debug(`Auto-registered ${Object.keys(directAgentTools).length} direct tools`);
|
|
104
|
-
}
|
|
105
|
-
async registerServer(serverInfoOrId, _serverConfigOrContext, _context) {
|
|
106
|
-
// Handle both signatures for backward compatibility
|
|
107
|
-
let serverInfo;
|
|
108
|
-
if (typeof serverInfoOrId === "string") {
|
|
109
|
-
// Legacy signature: registerServer(serverId, serverConfig, context)
|
|
110
|
-
const serverId = serverInfoOrId;
|
|
111
|
-
// Convert legacy call to MCPServerInfo format using smart defaults
|
|
112
|
-
serverInfo = createMCPServerInfo({
|
|
113
|
-
id: serverId,
|
|
114
|
-
name: serverId,
|
|
115
|
-
tools: [],
|
|
116
|
-
isExternal: true,
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
// New signature: registerServer(serverInfo, context)
|
|
121
|
-
serverInfo = serverInfoOrId;
|
|
122
|
-
}
|
|
123
|
-
const serverId = serverInfo.id;
|
|
124
|
-
// Use MCPServerInfo.tools array directly - ZERO conversions!
|
|
125
|
-
const toolsObject = {};
|
|
126
|
-
for (const tool of serverInfo.tools) {
|
|
127
|
-
toolsObject[tool.name] = {
|
|
128
|
-
execute: tool.execute ||
|
|
129
|
-
(async () => {
|
|
130
|
-
throw new Error(`Tool ${tool.name} has no execute function`);
|
|
131
|
-
}),
|
|
132
|
-
description: tool.description,
|
|
133
|
-
inputSchema: tool.inputSchema,
|
|
134
|
-
category: detectCategory({
|
|
135
|
-
existingCategory: serverInfo.metadata?.category,
|
|
136
|
-
serverId: serverInfo.id,
|
|
137
|
-
}),
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
const plugin = {
|
|
141
|
-
metadata: {
|
|
142
|
-
name: serverInfo.name,
|
|
143
|
-
description: serverInfo.description,
|
|
144
|
-
category: detectCategory({
|
|
145
|
-
existingCategory: serverInfo.metadata?.category,
|
|
146
|
-
serverId: serverInfo.id,
|
|
147
|
-
}),
|
|
148
|
-
},
|
|
149
|
-
tools: toolsObject,
|
|
150
|
-
configuration: {},
|
|
151
|
-
};
|
|
152
|
-
// Call the parent register method
|
|
153
|
-
this.register(plugin);
|
|
154
|
-
// Use MCPServerInfo.tools array directly - ZERO conversions!
|
|
155
|
-
const tools = serverInfo.tools;
|
|
156
|
-
for (const tool of tools) {
|
|
157
|
-
// For custom tools, use just the tool name to avoid redundant serverId.toolName format
|
|
158
|
-
// For other tools, use fully-qualified serverId.toolName to avoid collisions
|
|
159
|
-
const isCustomTool = serverId.startsWith("custom-tool-");
|
|
160
|
-
const toolId = isCustomTool ? tool.name : `${serverId}.${tool.name}`;
|
|
161
|
-
const toolTimeoutMs = serverInfo.metadata?.toolTimeoutMs;
|
|
162
|
-
const toolMaxRetries = serverInfo.metadata?.toolMaxRetries;
|
|
163
|
-
const toolInfo = {
|
|
164
|
-
name: tool.name,
|
|
165
|
-
description: tool.description,
|
|
166
|
-
inputSchema: tool.inputSchema,
|
|
167
|
-
outputSchema: undefined, // MCPServerInfo.tools doesn't have outputSchema
|
|
168
|
-
serverId,
|
|
169
|
-
category: detectCategory({
|
|
170
|
-
existingCategory: serverInfo.metadata?.category,
|
|
171
|
-
serverId: serverInfo.id,
|
|
172
|
-
}),
|
|
173
|
-
permissions: [], // MCPServerInfo.tools doesn't have permissions
|
|
174
|
-
...(toolTimeoutMs !== undefined && { timeoutMs: toolTimeoutMs }),
|
|
175
|
-
...(toolMaxRetries !== undefined && { maxRetries: toolMaxRetries }),
|
|
176
|
-
};
|
|
177
|
-
// Register only with fully-qualified toolId to avoid collisions
|
|
178
|
-
this.tools.set(toolId, toolInfo);
|
|
179
|
-
// Store the actual tool implementation for execution using toolId as key
|
|
180
|
-
this.toolImplementations.set(toolId, {
|
|
181
|
-
execute: tool.execute ||
|
|
182
|
-
(async () => {
|
|
183
|
-
throw new Error(`Tool ${tool.name} has no execute function`);
|
|
184
|
-
}),
|
|
185
|
-
description: tool.description,
|
|
186
|
-
inputSchema: tool.inputSchema,
|
|
187
|
-
category: detectCategory({
|
|
188
|
-
existingCategory: serverInfo.metadata?.category,
|
|
189
|
-
serverId: serverInfo.id,
|
|
190
|
-
}),
|
|
191
|
-
...(toolTimeoutMs !== undefined && { timeoutMs: toolTimeoutMs }),
|
|
192
|
-
...(toolMaxRetries !== undefined && { maxRetries: toolMaxRetries }),
|
|
193
|
-
});
|
|
194
|
-
// Tool registered successfully
|
|
195
|
-
}
|
|
196
|
-
// Store MCPServerInfo directly - NO recreation needed!
|
|
197
|
-
if (tools.length > 0) {
|
|
198
|
-
const category = detectCategory({
|
|
199
|
-
existingCategory: serverInfo.metadata?.category,
|
|
200
|
-
serverId: serverInfo.id,
|
|
201
|
-
});
|
|
202
|
-
// Only store in builtInServerInfos if it's a real in-memory MCP server
|
|
203
|
-
// Do NOT create fake servers for built-in direct tools
|
|
204
|
-
if (category === "in-memory") {
|
|
205
|
-
// Use the original MCPServerInfo directly - ZERO conversions!
|
|
206
|
-
this.builtInServerInfos.push(serverInfo);
|
|
207
|
-
registryLogger.debug(`Added ${category} server to builtInServerInfos: ${serverId} with ${tools.length} tools`);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Execute a tool with enhanced context and automatic result wrapping
|
|
213
|
-
*
|
|
214
|
-
* This method handles both raw return values and ToolResult objects:
|
|
215
|
-
* - Raw values (primitives, objects) are automatically wrapped in ToolResult format
|
|
216
|
-
* - Existing ToolResult objects are enhanced with execution metadata
|
|
217
|
-
* - All results include execution timing and context information
|
|
218
|
-
*
|
|
219
|
-
* @param toolName - Name of the tool to execute
|
|
220
|
-
* @param args - Parameters to pass to the tool execution function
|
|
221
|
-
* @param context - Execution context with session, user, and environment info
|
|
222
|
-
* @returns Promise resolving to ToolResult object with data, metadata, and usage info
|
|
223
|
-
* @throws Error if tool is not found or execution fails
|
|
224
|
-
*
|
|
225
|
-
* @example
|
|
226
|
-
* ```typescript
|
|
227
|
-
* // Tool that returns raw value
|
|
228
|
-
* const result = await toolRegistry.executeTool("calculator", { a: 5, b: 3, op: "add" });
|
|
229
|
-
* // result.data === 8, result.metadata contains execution info
|
|
230
|
-
*
|
|
231
|
-
* // Tool that returns ToolResult
|
|
232
|
-
* const result = await toolRegistry.executeTool("complexTool", { input: "test" });
|
|
233
|
-
* // result is enhanced ToolResult with additional metadata
|
|
234
|
-
* ```
|
|
235
|
-
*/
|
|
236
|
-
async executeTool(toolName, args, context) {
|
|
237
|
-
const startTime = Date.now();
|
|
238
|
-
// Resolve serverId eagerly for span attributes
|
|
239
|
-
let preResolvedServerId;
|
|
240
|
-
const toolEntry = this.tools.get(toolName);
|
|
241
|
-
if (toolEntry) {
|
|
242
|
-
preResolvedServerId = toolEntry.serverId;
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
for (const toolInfo of this.tools.values()) {
|
|
246
|
-
if (toolInfo.name === toolName) {
|
|
247
|
-
preResolvedServerId = toolInfo.serverId;
|
|
248
|
-
break;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
return withSpan({
|
|
253
|
-
name: "neurolink.tool.execute",
|
|
254
|
-
tracer: tracers.mcp,
|
|
255
|
-
attributes: {
|
|
256
|
-
[ATTR.GEN_AI_TOOL_NAME]: toolName,
|
|
257
|
-
[ATTR.MCP_SERVER_ID]: preResolvedServerId || "builtin",
|
|
258
|
-
},
|
|
259
|
-
}, async (span) => {
|
|
260
|
-
try {
|
|
261
|
-
registryLogger.info(`🔧 [TOOL_EXECUTION] Starting execution: ${toolName}`, {
|
|
262
|
-
hasArgs: args !== undefined,
|
|
263
|
-
hasContext: context !== undefined,
|
|
264
|
-
sessionId: context?.sessionId,
|
|
265
|
-
});
|
|
266
|
-
// Try to find the tool by fully-qualified name first
|
|
267
|
-
let tool = this.tools.get(toolName);
|
|
268
|
-
registryLogger.info(`🔍 [TOOL_LOOKUP] Direct lookup result for '${toolName}':`, !!tool);
|
|
269
|
-
// If not found, search for tool by name across all entries (for backward compatibility)
|
|
270
|
-
let toolId = toolName;
|
|
271
|
-
if (!tool) {
|
|
272
|
-
const matches = Array.from(this.tools.entries()).filter(([, toolInfo]) => toolInfo.name === toolName);
|
|
273
|
-
if (matches.length > 1) {
|
|
274
|
-
throw new Error(`Ambiguous tool name '${toolName}'. Use fully-qualified name 'serverId.${toolName}'.`);
|
|
275
|
-
}
|
|
276
|
-
if (matches.length === 1) {
|
|
277
|
-
const [candidateToolId, toolInfo] = matches[0];
|
|
278
|
-
tool = toolInfo;
|
|
279
|
-
toolId = candidateToolId;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
if (!tool) {
|
|
283
|
-
throw new Error(`Tool '${toolName}' not found in registry`);
|
|
284
|
-
}
|
|
285
|
-
// Classify tool type for observability
|
|
286
|
-
const serverId = tool.serverId || "unknown";
|
|
287
|
-
const toolType = serverId === "direct"
|
|
288
|
-
? "builtin"
|
|
289
|
-
: serverId.startsWith("custom-tool-")
|
|
290
|
-
? "custom"
|
|
291
|
-
: "mcp";
|
|
292
|
-
span.setAttribute("tool.type", toolType);
|
|
293
|
-
span.setAttribute(ATTR.MCP_SERVER_ID, serverId);
|
|
294
|
-
// Try to get auth context if available
|
|
295
|
-
let authUserId;
|
|
296
|
-
try {
|
|
297
|
-
const authCtx = getAuthContext();
|
|
298
|
-
authUserId = authCtx?.user?.id;
|
|
299
|
-
}
|
|
300
|
-
catch {
|
|
301
|
-
// Auth context not available — that's fine
|
|
302
|
-
}
|
|
303
|
-
// Create execution context if not provided
|
|
304
|
-
const execContext = {
|
|
305
|
-
...context,
|
|
306
|
-
sessionId: context?.sessionId ?? randomUUID(),
|
|
307
|
-
userId: context?.userId ?? authUserId,
|
|
308
|
-
};
|
|
309
|
-
// Get the tool implementation using the resolved toolId
|
|
310
|
-
const toolImpl = this.toolImplementations.get(toolId);
|
|
311
|
-
registryLogger.debug(`Looking for tool '${toolName}' (toolId: '${toolId}'), found: ${!!toolImpl}, type: ${typeof toolImpl?.execute}`);
|
|
312
|
-
registryLogger.debug(`Available tools:`, Array.from(this.toolImplementations.keys()));
|
|
313
|
-
if (!toolImpl || typeof toolImpl?.execute !== "function") {
|
|
314
|
-
throw new Error(`Tool '${toolName}' implementation not found or not executable`);
|
|
315
|
-
}
|
|
316
|
-
// Capture argument metadata (avoid logging raw values which may contain secrets)
|
|
317
|
-
let argsStr;
|
|
318
|
-
try {
|
|
319
|
-
argsStr = JSON.stringify(args).slice(0, 4096);
|
|
320
|
-
}
|
|
321
|
-
catch {
|
|
322
|
-
argsStr = "[unserializable]";
|
|
323
|
-
}
|
|
324
|
-
span.setAttribute("tool.arguments_present", args !== undefined);
|
|
325
|
-
span.setAttribute("tool.arguments_size", argsStr.length);
|
|
326
|
-
// HITL Safety Check: Request confirmation if required
|
|
327
|
-
let finalArgs = args;
|
|
328
|
-
if (this.hitlManager && this.hitlManager.isEnabled()) {
|
|
329
|
-
const requiresConfirmation = this.hitlManager.requiresConfirmation(toolName, args);
|
|
330
|
-
if (requiresConfirmation) {
|
|
331
|
-
registryLogger.info(`Tool '${toolName}' requires HITL confirmation`);
|
|
332
|
-
span.addEvent("tool.hitl_requested");
|
|
333
|
-
try {
|
|
334
|
-
const confirmationResult = await this.hitlManager.requestConfirmation(toolName, args, {
|
|
335
|
-
serverId: tool.serverId,
|
|
336
|
-
sessionId: execContext.sessionId,
|
|
337
|
-
userId: execContext.userId,
|
|
338
|
-
});
|
|
339
|
-
if (!confirmationResult.approved) {
|
|
340
|
-
// User rejected the tool execution
|
|
341
|
-
span.addEvent("tool.hitl_rejected");
|
|
342
|
-
throw new HITLUserRejectedError(`Tool execution rejected by user: ${confirmationResult.reason || "No reason provided"}`, toolName, confirmationResult.reason);
|
|
343
|
-
}
|
|
344
|
-
span.addEvent("tool.hitl_approved");
|
|
345
|
-
// User approved - use modified arguments if provided
|
|
346
|
-
if (confirmationResult.modifiedArguments !== undefined) {
|
|
347
|
-
finalArgs = confirmationResult.modifiedArguments;
|
|
348
|
-
registryLogger.info(`Tool '${toolName}' arguments modified by user`);
|
|
349
|
-
}
|
|
350
|
-
registryLogger.info(`Tool '${toolName}' approved for execution (response time: ${confirmationResult.responseTime}ms)`);
|
|
351
|
-
}
|
|
352
|
-
catch (error) {
|
|
353
|
-
if (error instanceof HITLTimeoutError) {
|
|
354
|
-
// Timeout occurred - user didn't respond in time
|
|
355
|
-
registryLogger.warn(`Tool '${toolName}' execution timed out waiting for user confirmation`);
|
|
356
|
-
throw error;
|
|
357
|
-
}
|
|
358
|
-
else if (error instanceof HITLUserRejectedError) {
|
|
359
|
-
// User explicitly rejected
|
|
360
|
-
registryLogger.info(`Tool '${toolName}' execution rejected by user`);
|
|
361
|
-
throw error;
|
|
362
|
-
}
|
|
363
|
-
else {
|
|
364
|
-
// Other HITL error (configuration, system error, etc.)
|
|
365
|
-
registryLogger.error(`HITL confirmation failed for tool '${toolName}':`, error);
|
|
366
|
-
throw new Error(`HITL confirmation failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
else {
|
|
371
|
-
registryLogger.debug(`Tool '${toolName}' does not require HITL confirmation`);
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
// Execute the actual tool (with potentially modified arguments)
|
|
375
|
-
registryLogger.debug(`Executing tool '${toolName}' with args:`, finalArgs);
|
|
376
|
-
const toolResult = await toolImpl.execute(finalArgs, execContext);
|
|
377
|
-
// Properly wrap raw results in ToolResult format
|
|
378
|
-
let result;
|
|
379
|
-
// Check if result is already a ToolResult object
|
|
380
|
-
if (toolResult &&
|
|
381
|
-
typeof toolResult === "object" &&
|
|
382
|
-
"success" in toolResult &&
|
|
383
|
-
typeof toolResult.success === "boolean") {
|
|
384
|
-
// Result is already a ToolResult, enhance with metadata
|
|
385
|
-
const toolResultObj = toolResult;
|
|
386
|
-
result = {
|
|
387
|
-
...toolResultObj,
|
|
388
|
-
usage: {
|
|
389
|
-
...(toolResultObj.usage || {}),
|
|
390
|
-
executionTime: Date.now() - startTime,
|
|
391
|
-
},
|
|
392
|
-
metadata: {
|
|
393
|
-
...(toolResultObj.metadata || {}),
|
|
394
|
-
toolName,
|
|
395
|
-
serverId: tool.serverId,
|
|
396
|
-
sessionId: execContext.sessionId,
|
|
397
|
-
executionTime: Date.now() - startTime,
|
|
398
|
-
},
|
|
399
|
-
};
|
|
400
|
-
}
|
|
401
|
-
else {
|
|
402
|
-
// Result is a raw value, wrap it in ToolResult format
|
|
403
|
-
result = {
|
|
404
|
-
success: true,
|
|
405
|
-
data: toolResult,
|
|
406
|
-
usage: {
|
|
407
|
-
executionTime: Date.now() - startTime,
|
|
408
|
-
},
|
|
409
|
-
metadata: {
|
|
410
|
-
toolName,
|
|
411
|
-
serverId: tool.serverId,
|
|
412
|
-
sessionId: execContext.sessionId,
|
|
413
|
-
executionTime: Date.now() - startTime,
|
|
414
|
-
},
|
|
415
|
-
};
|
|
416
|
-
}
|
|
417
|
-
// Update statistics
|
|
418
|
-
const duration = Date.now() - startTime;
|
|
419
|
-
this.updateStats(toolName, duration);
|
|
420
|
-
// Record success on span
|
|
421
|
-
let resultStr;
|
|
422
|
-
try {
|
|
423
|
-
resultStr = JSON.stringify(result.data) ?? "undefined";
|
|
424
|
-
}
|
|
425
|
-
catch {
|
|
426
|
-
resultStr = "[unserializable]";
|
|
427
|
-
}
|
|
428
|
-
span.setAttribute("tool.result_length", resultStr.length);
|
|
429
|
-
span.setAttribute("tool.success", true);
|
|
430
|
-
registryLogger.debug(`Tool '${toolName}' executed successfully in ${duration}ms`);
|
|
431
|
-
return result;
|
|
432
|
-
}
|
|
433
|
-
catch (error) {
|
|
434
|
-
registryLogger.error(`Tool execution failed: ${toolName}`, error);
|
|
435
|
-
// Record failure on span
|
|
436
|
-
span.setAttribute("tool.success", false);
|
|
437
|
-
// Rethrow precondition errors (tool not found, not executable)
|
|
438
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
439
|
-
if (errMsg.includes("not found in registry") ||
|
|
440
|
-
errMsg.includes("not executable")) {
|
|
441
|
-
throw error;
|
|
442
|
-
}
|
|
443
|
-
// Return runtime execution errors in ToolResult format
|
|
444
|
-
const errorResult = {
|
|
445
|
-
success: false,
|
|
446
|
-
data: null,
|
|
447
|
-
error: error instanceof Error ? error.message : String(error),
|
|
448
|
-
usage: {
|
|
449
|
-
executionTime: Date.now() - startTime,
|
|
450
|
-
},
|
|
451
|
-
metadata: {
|
|
452
|
-
toolName,
|
|
453
|
-
sessionId: context?.sessionId,
|
|
454
|
-
},
|
|
455
|
-
};
|
|
456
|
-
return errorResult;
|
|
457
|
-
}
|
|
458
|
-
});
|
|
459
|
-
}
|
|
460
|
-
async listTools(filterOrContext) {
|
|
461
|
-
// FIXED: Return unique tools (avoid duplicates from dual registration)
|
|
462
|
-
const uniqueTools = new Map();
|
|
463
|
-
for (const tool of this.tools.values()) {
|
|
464
|
-
const key = `${tool.serverId || "unknown"}.${tool.name}`;
|
|
465
|
-
if (!uniqueTools.has(key)) {
|
|
466
|
-
uniqueTools.set(key, tool);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
let result = Array.from(uniqueTools.values());
|
|
470
|
-
// Determine if parameter is a filter object or just context
|
|
471
|
-
let filter;
|
|
472
|
-
if (filterOrContext) {
|
|
473
|
-
// Check if it's a filter object (has filter-specific properties) or just context
|
|
474
|
-
if ("sessionId" in filterOrContext || "userId" in filterOrContext) {
|
|
475
|
-
// It's an ExecutionContext, treat as no filter
|
|
476
|
-
filter = undefined;
|
|
477
|
-
}
|
|
478
|
-
else {
|
|
479
|
-
// It's a filter object
|
|
480
|
-
filter = filterOrContext;
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
// Apply filters if provided
|
|
484
|
-
if (filter) {
|
|
485
|
-
if (filter.category) {
|
|
486
|
-
result = result.filter((tool) => tool.category === filter.category);
|
|
487
|
-
}
|
|
488
|
-
if (filter.serverId) {
|
|
489
|
-
result = result.filter((tool) => tool.serverId === filter.serverId);
|
|
490
|
-
}
|
|
491
|
-
if (filter.serverCategory) {
|
|
492
|
-
result = result.filter((tool) => {
|
|
493
|
-
const server = this.get(tool.serverId || "");
|
|
494
|
-
return server?.metadata?.category === filter.serverCategory;
|
|
495
|
-
});
|
|
496
|
-
}
|
|
497
|
-
if (filter.permissions && filter.permissions.length > 0) {
|
|
498
|
-
result = result.filter((tool) => {
|
|
499
|
-
const toolPermissions = tool.permissions || [];
|
|
500
|
-
return (filter.permissions?.some((perm) => toolPermissions.includes(perm)) ?? false);
|
|
501
|
-
});
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
registryLogger.debug(`Listed ${result.length} unique tools (${filter ? "filtered" : "unfiltered"})`);
|
|
505
|
-
return result;
|
|
506
|
-
}
|
|
507
|
-
/**
|
|
508
|
-
* Get tool information with server details
|
|
509
|
-
*/
|
|
510
|
-
getToolInfo(toolName) {
|
|
511
|
-
// Try to find the tool by fully-qualified name first
|
|
512
|
-
let tool = this.tools.get(toolName);
|
|
513
|
-
// If not found, search for tool by name across all entries (for backward compatibility)
|
|
514
|
-
if (!tool) {
|
|
515
|
-
for (const toolInfo of this.tools.values()) {
|
|
516
|
-
if (toolInfo.name === toolName) {
|
|
517
|
-
tool = toolInfo;
|
|
518
|
-
break;
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
if (!tool) {
|
|
523
|
-
return undefined;
|
|
524
|
-
}
|
|
525
|
-
return {
|
|
526
|
-
tool,
|
|
527
|
-
server: {
|
|
528
|
-
id: tool.serverId || "unknown-server",
|
|
529
|
-
},
|
|
530
|
-
};
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
|
-
* Update execution statistics
|
|
534
|
-
*/
|
|
535
|
-
updateStats(toolName, executionTime) {
|
|
536
|
-
const stats = this.toolExecutionStats.get(toolName) || {
|
|
537
|
-
count: 0,
|
|
538
|
-
totalTime: 0,
|
|
539
|
-
};
|
|
540
|
-
stats.count += 1;
|
|
541
|
-
stats.totalTime += executionTime;
|
|
542
|
-
this.toolExecutionStats.set(toolName, stats);
|
|
543
|
-
}
|
|
544
|
-
/**
|
|
545
|
-
* Get execution statistics
|
|
546
|
-
*/
|
|
547
|
-
getExecutionStats() {
|
|
548
|
-
const result = {};
|
|
549
|
-
for (const [toolName, stats] of this.toolExecutionStats.entries()) {
|
|
550
|
-
result[toolName] = {
|
|
551
|
-
count: stats.count,
|
|
552
|
-
totalTime: stats.totalTime,
|
|
553
|
-
averageTime: stats.totalTime / stats.count,
|
|
554
|
-
};
|
|
555
|
-
}
|
|
556
|
-
return result;
|
|
557
|
-
}
|
|
558
|
-
/**
|
|
559
|
-
* Clear execution statistics
|
|
560
|
-
*/
|
|
561
|
-
clearStats() {
|
|
562
|
-
this.toolExecutionStats.clear();
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* Get built-in servers
|
|
566
|
-
* @returns Array of MCPServerInfo for built-in tools
|
|
567
|
-
*/
|
|
568
|
-
getBuiltInServerInfos() {
|
|
569
|
-
return this.builtInServerInfos;
|
|
570
|
-
}
|
|
571
|
-
/**
|
|
572
|
-
* Get tools by category
|
|
573
|
-
*/
|
|
574
|
-
getToolsByCategory(category) {
|
|
575
|
-
// Return unique tools by fully-qualified toolId
|
|
576
|
-
const uniqueTools = new Map();
|
|
577
|
-
for (const [toolId, tool] of this.tools.entries()) {
|
|
578
|
-
if (tool.category === category && !uniqueTools.has(toolId)) {
|
|
579
|
-
uniqueTools.set(toolId, tool);
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
return Array.from(uniqueTools.values());
|
|
583
|
-
}
|
|
584
|
-
/**
|
|
585
|
-
* NL-001: Get available tools, filtering out those with OPEN circuit breakers.
|
|
586
|
-
* Returns both the filtered tools and the list of unavailable tool names.
|
|
587
|
-
*/
|
|
588
|
-
getAvailableTools(circuitBreakers) {
|
|
589
|
-
const allTools = Array.from(this.tools.values());
|
|
590
|
-
const unavailableTools = [];
|
|
591
|
-
const tools = [];
|
|
592
|
-
for (const tool of allTools) {
|
|
593
|
-
const breakerKey = `${tool.serverId || "unknown"}.${tool.name}`;
|
|
594
|
-
const breaker = circuitBreakers.get(breakerKey);
|
|
595
|
-
if (breaker && breaker.getState() === "open") {
|
|
596
|
-
unavailableTools.push(tool.name);
|
|
597
|
-
}
|
|
598
|
-
else {
|
|
599
|
-
tools.push(tool);
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
return { tools, unavailableTools };
|
|
603
|
-
}
|
|
604
|
-
/**
|
|
605
|
-
* Check if tool exists
|
|
606
|
-
*/
|
|
607
|
-
hasTool(toolName) {
|
|
608
|
-
// Check by fully-qualified name first, then fallback to first matching tool name
|
|
609
|
-
if (this.tools.has(toolName)) {
|
|
610
|
-
return true;
|
|
611
|
-
}
|
|
612
|
-
for (const tool of this.tools.values()) {
|
|
613
|
-
if (tool.name === toolName) {
|
|
614
|
-
return true;
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
return false;
|
|
618
|
-
}
|
|
619
|
-
/**
|
|
620
|
-
* Register a tool with implementation directly
|
|
621
|
-
* This is used for external MCP server tools
|
|
622
|
-
*/
|
|
623
|
-
async registerTool(toolId, toolInfo, toolImpl) {
|
|
624
|
-
registryLogger.debug(`Registering tool: ${toolId}`);
|
|
625
|
-
// Universal safety validation using FlexibleToolValidator
|
|
626
|
-
// Only blocks truly dangerous cases to support maximum MCP tool compatibility
|
|
627
|
-
const validation = FlexibleToolValidator.validateToolInfo(toolId, {
|
|
628
|
-
description: toolInfo.description,
|
|
629
|
-
serverId: toolInfo.serverId,
|
|
630
|
-
});
|
|
631
|
-
if (!validation.isValid) {
|
|
632
|
-
registryLogger.error(`Tool registration failed for ${toolId}: ${validation.error}`);
|
|
633
|
-
throw new Error(`Tool validation failed: ${validation.error}`);
|
|
634
|
-
}
|
|
635
|
-
// Log any warnings but allow registration to proceed
|
|
636
|
-
if (validation.warnings && validation.warnings.length > 0) {
|
|
637
|
-
registryLogger.warn(`Tool registration warnings for ${toolId}:`, validation.warnings);
|
|
638
|
-
}
|
|
639
|
-
registryLogger.debug(`✅ Tool '${toolId}' passed flexible validation - registration proceeding`);
|
|
640
|
-
this.tools.set(toolId, toolInfo);
|
|
641
|
-
this.toolImplementations.set(toolId, toolImpl);
|
|
642
|
-
registryLogger.debug(`Successfully registered tool: ${toolId}`);
|
|
643
|
-
}
|
|
644
|
-
/**
|
|
645
|
-
* Remove a tool
|
|
646
|
-
*/
|
|
647
|
-
removeTool(toolName) {
|
|
648
|
-
// Remove by fully-qualified name first, then fallback to first matching tool name
|
|
649
|
-
let removed = false;
|
|
650
|
-
if (this.tools.has(toolName)) {
|
|
651
|
-
this.tools.delete(toolName);
|
|
652
|
-
this.toolImplementations.delete(toolName); // Fix memory leak
|
|
653
|
-
this.toolExecutionStats.delete(toolName);
|
|
654
|
-
registryLogger.info(`Removed tool: ${toolName}`);
|
|
655
|
-
removed = true;
|
|
656
|
-
}
|
|
657
|
-
else {
|
|
658
|
-
// Remove all tools with matching name
|
|
659
|
-
for (const [toolId, tool] of Array.from(this.tools.entries())) {
|
|
660
|
-
if (tool.name === toolName) {
|
|
661
|
-
this.tools.delete(toolId);
|
|
662
|
-
this.toolImplementations.delete(toolId); // Fix memory leak
|
|
663
|
-
this.toolExecutionStats.delete(toolId);
|
|
664
|
-
registryLogger.info(`Removed tool: ${toolId}`);
|
|
665
|
-
removed = true;
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
return removed;
|
|
670
|
-
}
|
|
671
|
-
/**
|
|
672
|
-
* Get tool count
|
|
673
|
-
*/
|
|
674
|
-
getToolCount() {
|
|
675
|
-
return this.tools.size;
|
|
676
|
-
}
|
|
677
|
-
/**
|
|
678
|
-
* Get comprehensive statistics
|
|
679
|
-
*/
|
|
680
|
-
getStats() {
|
|
681
|
-
const servers = this.list(); // Get all registered servers
|
|
682
|
-
const allTools = Array.from(this.tools.values());
|
|
683
|
-
// Count servers by category
|
|
684
|
-
const serversByCategory = {};
|
|
685
|
-
for (const server of servers) {
|
|
686
|
-
const category = server.metadata?.category || "uncategorized";
|
|
687
|
-
serversByCategory[category] = (serversByCategory[category] || 0) + 1;
|
|
688
|
-
}
|
|
689
|
-
// Count tools by category
|
|
690
|
-
const toolsByCategory = {};
|
|
691
|
-
for (const tool of allTools) {
|
|
692
|
-
const category = tool.category || "uncategorized";
|
|
693
|
-
toolsByCategory[category] = (toolsByCategory[category] || 0) + 1;
|
|
694
|
-
}
|
|
695
|
-
return {
|
|
696
|
-
totalServers: servers.length,
|
|
697
|
-
totalTools: allTools.length,
|
|
698
|
-
serversByCategory,
|
|
699
|
-
toolsByCategory,
|
|
700
|
-
executionStats: this.getExecutionStats(),
|
|
701
|
-
};
|
|
702
|
-
}
|
|
703
|
-
/**
|
|
704
|
-
* Unregister a server
|
|
705
|
-
*/
|
|
706
|
-
unregisterServer(serverId) {
|
|
707
|
-
// Remove all tools for this server
|
|
708
|
-
const removedTools = [];
|
|
709
|
-
for (const [toolId, tool] of this.tools.entries()) {
|
|
710
|
-
if (tool.serverId === serverId) {
|
|
711
|
-
this.tools.delete(toolId);
|
|
712
|
-
this.toolImplementations.delete(toolId); // Fix memory leak
|
|
713
|
-
this.toolExecutionStats.delete(toolId); // Fix memory leak
|
|
714
|
-
removedTools.push(toolId);
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
// Remove from builtInServerInfos storage
|
|
718
|
-
const originalLength = this.builtInServerInfos.length;
|
|
719
|
-
this.builtInServerInfos = this.builtInServerInfos.filter((server) => server.id !== serverId);
|
|
720
|
-
const removedFromBuiltIn = originalLength > this.builtInServerInfos.length;
|
|
721
|
-
// Remove from parent registry
|
|
722
|
-
const removed = this.unregister(serverId);
|
|
723
|
-
registryLogger.info(`Unregistered server ${serverId}, removed ${removedTools.length} tools${removedFromBuiltIn ? " and server from builtInServerInfos" : ""}`);
|
|
724
|
-
return removed;
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
|
-
// Create default instance
|
|
728
|
-
export const toolRegistry = new MCPToolRegistry();
|
|
729
|
-
export const defaultToolRegistry = toolRegistry;
|