@juspay/neurolink 9.32.0 → 9.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/auth/anthropicOAuth.js +1 -1
- package/dist/cli/commands/proxy.js +18 -5
- package/dist/client/aiSdkAdapter.js +1 -1
- package/dist/client/index.js +137 -501
- package/dist/core/factory.js +0 -1
- package/dist/core/redisConversationMemoryManager.js +1 -1
- package/dist/features/ppt/slideGenerator.js +0 -1
- package/dist/features/ppt/utils.js +0 -1
- package/dist/lib/neurolink.d.ts +10 -0
- package/dist/lib/neurolink.js +41 -7
- package/dist/lib/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/lib/types/generateTypes.d.ts +16 -0
- package/dist/lib/types/streamTypes.d.ts +15 -0
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- package/dist/neurolink.d.ts +10 -0
- package/dist/neurolink.js +41 -7
- package/dist/providers/azureOpenai.js +1 -1
- package/dist/providers/huggingFace.js +0 -1
- package/dist/providers/openaiCompatible.js +0 -1
- package/dist/sdk/toolRegistration.js +0 -1
- package/dist/server/openapi/generator.js +1 -1
- package/dist/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/types/configTypes.js +0 -5
- package/dist/types/generateTypes.d.ts +16 -0
- package/dist/types/modelTypes.js +0 -1
- package/dist/types/streamTypes.d.ts +15 -0
- package/dist/types/tools.js +0 -1
- package/dist/types/typeAliases.js +0 -1
- package/dist/types/utilities.js +1 -1
- package/dist/types/workflowTypes.js +0 -1
- package/dist/utils/providerRetry.js +0 -1
- package/dist/utils/providerUtils.js +0 -1
- package/package.json +2 -2
- package/dist/client/adapters/providerImageAdapter.js +0 -588
- package/dist/client/adapters/tts/googleTTSHandler.js +0 -344
- package/dist/client/adapters/video/directorPipeline.js +0 -516
- package/dist/client/adapters/video/ffmpegAdapter.js +0 -206
- package/dist/client/adapters/video/frameExtractor.js +0 -143
- package/dist/client/adapters/video/vertexVideoHandler.js +0 -763
- package/dist/client/adapters/video/videoAnalyzer.js +0 -238
- package/dist/client/adapters/video/videoMerger.js +0 -171
- package/dist/client/agent/directTools.js +0 -840
- package/dist/client/auth/AuthProviderFactory.js +0 -111
- package/dist/client/auth/AuthProviderRegistry.js +0 -190
- package/dist/client/auth/RequestContext.js +0 -78
- package/dist/client/auth/accountPool.js +0 -178
- package/dist/client/auth/anthropicOAuth.js +0 -974
- package/dist/client/auth/authContext.js +0 -314
- package/dist/client/auth/errors.js +0 -39
- package/dist/client/auth/index.js +0 -61
- package/dist/client/auth/middleware/AuthMiddleware.js +0 -519
- package/dist/client/auth/middleware/rateLimitByUser.js +0 -554
- package/dist/client/auth/providers/BaseAuthProvider.js +0 -723
- package/dist/client/auth/providers/CognitoProvider.js +0 -304
- package/dist/client/auth/providers/KeycloakProvider.js +0 -393
- package/dist/client/auth/providers/auth0.js +0 -274
- package/dist/client/auth/providers/betterAuth.js +0 -182
- package/dist/client/auth/providers/clerk.js +0 -317
- package/dist/client/auth/providers/custom.js +0 -112
- package/dist/client/auth/providers/firebase.js +0 -226
- package/dist/client/auth/providers/jwt.js +0 -212
- package/dist/client/auth/providers/oauth2.js +0 -303
- package/dist/client/auth/providers/supabase.js +0 -259
- package/dist/client/auth/providers/workos.js +0 -284
- package/dist/client/auth/serverBridge.js +0 -25
- package/dist/client/auth/sessionManager.js +0 -437
- package/dist/client/auth/tokenStore.js +0 -799
- package/dist/client/client/aiSdkAdapter.js +0 -487
- package/dist/client/client/auth.js +0 -473
- package/dist/client/client/errors.js +0 -552
- package/dist/client/client/httpClient.js +0 -837
- package/dist/client/client/index.js +0 -172
- package/dist/client/client/interceptors.js +0 -601
- package/dist/client/client/sseClient.js +0 -545
- package/dist/client/client/streamingClient.js +0 -917
- package/dist/client/client/wsClient.js +0 -369
- package/dist/client/config/configManager.js +0 -303
- package/dist/client/config/conversationMemory.js +0 -86
- package/dist/client/config/taskClassificationConfig.js +0 -148
- package/dist/client/constants/contextWindows.js +0 -295
- package/dist/client/constants/enums.js +0 -853
- package/dist/client/constants/index.js +0 -207
- package/dist/client/constants/performance.js +0 -389
- package/dist/client/constants/retry.js +0 -266
- package/dist/client/constants/timeouts.js +0 -182
- package/dist/client/constants/tokens.js +0 -380
- package/dist/client/constants/videoErrors.js +0 -46
- package/dist/client/context/budgetChecker.js +0 -98
- package/dist/client/context/contextCompactor.js +0 -205
- package/dist/client/context/emergencyTruncation.js +0 -88
- package/dist/client/context/errorDetection.js +0 -171
- package/dist/client/context/errors.js +0 -21
- package/dist/client/context/fileTokenBudget.js +0 -127
- package/dist/client/context/prompts/summarizationPrompt.js +0 -117
- package/dist/client/context/stages/fileReadDeduplicator.js +0 -66
- package/dist/client/context/stages/slidingWindowTruncator.js +0 -190
- package/dist/client/context/stages/structuredSummarizer.js +0 -99
- package/dist/client/context/stages/toolOutputPruner.js +0 -52
- package/dist/client/context/summarizationEngine.js +0 -136
- package/dist/client/context/toolOutputLimits.js +0 -78
- package/dist/client/context/toolPairRepair.js +0 -66
- package/dist/client/core/analytics.js +0 -88
- package/dist/client/core/baseProvider.js +0 -1385
- package/dist/client/core/constants.js +0 -140
- package/dist/client/core/conversationMemoryFactory.js +0 -141
- package/dist/client/core/conversationMemoryInitializer.js +0 -128
- package/dist/client/core/conversationMemoryManager.js +0 -344
- package/dist/client/core/dynamicModels.js +0 -358
- package/dist/client/core/evaluation.js +0 -309
- package/dist/client/core/evaluationProviders.js +0 -248
- package/dist/client/core/factory.js +0 -412
- package/dist/client/core/infrastructure/baseError.js +0 -22
- package/dist/client/core/infrastructure/baseFactory.js +0 -54
- package/dist/client/core/infrastructure/baseRegistry.js +0 -53
- package/dist/client/core/infrastructure/index.js +0 -5
- package/dist/client/core/infrastructure/retry.js +0 -20
- package/dist/client/core/infrastructure/typedEventEmitter.js +0 -23
- package/dist/client/core/modelConfiguration.js +0 -851
- package/dist/client/core/modules/GenerationHandler.js +0 -588
- package/dist/client/core/modules/MessageBuilder.js +0 -273
- package/dist/client/core/modules/StreamHandler.js +0 -185
- package/dist/client/core/modules/TelemetryHandler.js +0 -203
- package/dist/client/core/modules/ToolsManager.js +0 -499
- package/dist/client/core/modules/Utilities.js +0 -331
- package/dist/client/core/redisConversationMemoryManager.js +0 -1435
- package/dist/client/core/streamAnalytics.js +0 -131
- package/dist/client/evaluation/contextBuilder.js +0 -134
- package/dist/client/evaluation/index.js +0 -61
- package/dist/client/evaluation/prompts.js +0 -73
- package/dist/client/evaluation/ragasEvaluator.js +0 -110
- package/dist/client/evaluation/retryManager.js +0 -78
- package/dist/client/evaluation/scoring.js +0 -61
- package/dist/client/factories/providerFactory.js +0 -166
- package/dist/client/factories/providerRegistry.js +0 -166
- package/dist/client/features/ppt/constants.js +0 -896
- package/dist/client/features/ppt/contentPlanner.js +0 -529
- package/dist/client/features/ppt/presentationOrchestrator.js +0 -236
- package/dist/client/features/ppt/slideGenerator.js +0 -532
- package/dist/client/features/ppt/slideRenderers.js +0 -2383
- package/dist/client/features/ppt/slideTypeInference.js +0 -405
- package/dist/client/features/ppt/types.js +0 -13
- package/dist/client/features/ppt/utils.js +0 -443
- package/dist/client/files/fileReferenceRegistry.js +0 -1543
- package/dist/client/files/fileTools.js +0 -450
- package/dist/client/files/streamingReader.js +0 -321
- package/dist/client/files/types.js +0 -23
- package/dist/client/hitl/hitlErrors.js +0 -54
- package/dist/client/hitl/hitlManager.js +0 -460
- package/dist/client/mcp/agentExposure.js +0 -356
- package/dist/client/mcp/auth/index.js +0 -11
- package/dist/client/mcp/auth/oauthClientProvider.js +0 -325
- package/dist/client/mcp/auth/tokenStorage.js +0 -134
- package/dist/client/mcp/batching/index.js +0 -10
- package/dist/client/mcp/batching/requestBatcher.js +0 -441
- package/dist/client/mcp/caching/index.js +0 -10
- package/dist/client/mcp/caching/toolCache.js +0 -433
- package/dist/client/mcp/elicitation/elicitationManager.js +0 -376
- package/dist/client/mcp/elicitation/index.js +0 -11
- package/dist/client/mcp/elicitation/types.js +0 -10
- package/dist/client/mcp/elicitationProtocol.js +0 -375
- package/dist/client/mcp/enhancedToolDiscovery.js +0 -481
- package/dist/client/mcp/externalServerManager.js +0 -1478
- package/dist/client/mcp/factory.js +0 -161
- package/dist/client/mcp/flexibleToolValidator.js +0 -161
- package/dist/client/mcp/httpRateLimiter.js +0 -391
- package/dist/client/mcp/httpRetryHandler.js +0 -178
- package/dist/client/mcp/index.js +0 -74
- package/dist/client/mcp/mcpCircuitBreaker.js +0 -427
- package/dist/client/mcp/mcpClientFactory.js +0 -708
- package/dist/client/mcp/mcpRegistryClient.js +0 -488
- package/dist/client/mcp/mcpServerBase.js +0 -373
- package/dist/client/mcp/multiServerManager.js +0 -579
- package/dist/client/mcp/registry.js +0 -158
- package/dist/client/mcp/routing/index.js +0 -10
- package/dist/client/mcp/routing/toolRouter.js +0 -416
- package/dist/client/mcp/serverCapabilities.js +0 -502
- package/dist/client/mcp/servers/agent/directToolsServer.js +0 -150
- package/dist/client/mcp/toolAnnotations.js +0 -239
- package/dist/client/mcp/toolConverter.js +0 -258
- package/dist/client/mcp/toolDiscoveryService.js +0 -798
- package/dist/client/mcp/toolIntegration.js +0 -334
- package/dist/client/mcp/toolRegistry.js +0 -729
- package/dist/client/memory/hippocampusInitializer.js +0 -19
- package/dist/client/memory/memoryRetrievalTools.js +0 -166
- package/dist/client/middleware/builtin/analytics.js +0 -132
- package/dist/client/middleware/builtin/autoEvaluation.js +0 -203
- package/dist/client/middleware/builtin/guardrails.js +0 -109
- package/dist/client/middleware/builtin/lifecycle.js +0 -168
- package/dist/client/middleware/factory.js +0 -327
- package/dist/client/middleware/registry.js +0 -295
- package/dist/client/middleware/utils/guardrailsUtils.js +0 -396
- package/dist/client/models/anthropicModels.js +0 -527
- package/dist/client/neurolink.js +0 -8233
- package/dist/client/observability/exporterRegistry.js +0 -413
- package/dist/client/observability/exporters/arizeExporter.js +0 -138
- package/dist/client/observability/exporters/baseExporter.js +0 -190
- package/dist/client/observability/exporters/braintrustExporter.js +0 -154
- package/dist/client/observability/exporters/datadogExporter.js +0 -196
- package/dist/client/observability/exporters/laminarExporter.js +0 -302
- package/dist/client/observability/exporters/langfuseExporter.js +0 -209
- package/dist/client/observability/exporters/langsmithExporter.js +0 -143
- package/dist/client/observability/exporters/otelExporter.js +0 -164
- package/dist/client/observability/exporters/posthogExporter.js +0 -287
- package/dist/client/observability/exporters/sentryExporter.js +0 -165
- package/dist/client/observability/index.js +0 -31
- package/dist/client/observability/metricsAggregator.js +0 -556
- package/dist/client/observability/otelBridge.js +0 -131
- package/dist/client/observability/retryPolicy.js +0 -383
- package/dist/client/observability/sampling/samplers.js +0 -216
- package/dist/client/observability/spanProcessor.js +0 -303
- package/dist/client/observability/tokenTracker.js +0 -413
- package/dist/client/observability/types/exporterTypes.js +0 -5
- package/dist/client/observability/types/index.js +0 -4
- package/dist/client/observability/types/spanTypes.js +0 -92
- package/dist/client/observability/utils/safeMetadata.js +0 -25
- package/dist/client/observability/utils/spanSerializer.js +0 -292
- package/dist/client/processors/archive/ArchiveProcessor.js +0 -1308
- package/dist/client/processors/base/BaseFileProcessor.js +0 -614
- package/dist/client/processors/base/types.js +0 -82
- package/dist/client/processors/config/fileTypes.js +0 -520
- package/dist/client/processors/config/index.js +0 -92
- package/dist/client/processors/config/languageMap.js +0 -410
- package/dist/client/processors/config/mimeTypes.js +0 -363
- package/dist/client/processors/config/sizeLimits.js +0 -258
- package/dist/client/processors/document/ExcelProcessor.js +0 -590
- package/dist/client/processors/document/OpenDocumentProcessor.js +0 -212
- package/dist/client/processors/document/PptxProcessor.js +0 -157
- package/dist/client/processors/document/RtfProcessor.js +0 -361
- package/dist/client/processors/document/WordProcessor.js +0 -353
- package/dist/client/processors/errors/FileErrorCode.js +0 -255
- package/dist/client/processors/errors/errorHelpers.js +0 -386
- package/dist/client/processors/errors/errorSerializer.js +0 -507
- package/dist/client/processors/errors/index.js +0 -49
- package/dist/client/processors/markup/SvgProcessor.js +0 -240
- package/dist/client/processors/media/AudioProcessor.js +0 -707
- package/dist/client/processors/media/VideoProcessor.js +0 -1045
- package/dist/client/providers/amazonBedrock.js +0 -1512
- package/dist/client/providers/amazonSagemaker.js +0 -162
- package/dist/client/providers/anthropic.js +0 -831
- package/dist/client/providers/azureOpenai.js +0 -143
- package/dist/client/providers/googleAiStudio.js +0 -1200
- package/dist/client/providers/googleNativeGemini3.js +0 -543
- package/dist/client/providers/googleVertex.js +0 -2936
- package/dist/client/providers/huggingFace.js +0 -315
- package/dist/client/providers/litellm.js +0 -488
- package/dist/client/providers/mistral.js +0 -157
- package/dist/client/providers/ollama.js +0 -1579
- package/dist/client/providers/openAI.js +0 -627
- package/dist/client/providers/openRouter.js +0 -543
- package/dist/client/providers/openaiCompatible.js +0 -290
- package/dist/client/providers/providerTypeUtils.js +0 -46
- package/dist/client/providers/sagemaker/adaptive-semaphore.js +0 -215
- package/dist/client/providers/sagemaker/client.js +0 -472
- package/dist/client/providers/sagemaker/config.js +0 -317
- package/dist/client/providers/sagemaker/detection.js +0 -606
- package/dist/client/providers/sagemaker/error-constants.js +0 -227
- package/dist/client/providers/sagemaker/errors.js +0 -299
- package/dist/client/providers/sagemaker/language-model.js +0 -775
- package/dist/client/providers/sagemaker/parsers.js +0 -634
- package/dist/client/providers/sagemaker/streaming.js +0 -331
- package/dist/client/providers/sagemaker/structured-parser.js +0 -625
- package/dist/client/proxy/accountQuota.js +0 -162
- package/dist/client/proxy/claudeFormat.js +0 -595
- package/dist/client/proxy/modelRouter.js +0 -29
- package/dist/client/proxy/oauthFetch.js +0 -367
- package/dist/client/proxy/proxyFetch.js +0 -586
- package/dist/client/proxy/requestLogger.js +0 -207
- package/dist/client/proxy/tokenRefresh.js +0 -124
- package/dist/client/proxy/usageStats.js +0 -74
- package/dist/client/proxy/utils/noProxyUtils.js +0 -149
- package/dist/client/rag/ChunkerFactory.js +0 -320
- package/dist/client/rag/ChunkerRegistry.js +0 -421
- package/dist/client/rag/chunkers/BaseChunker.js +0 -143
- package/dist/client/rag/chunkers/CharacterChunker.js +0 -28
- package/dist/client/rag/chunkers/HTMLChunker.js +0 -38
- package/dist/client/rag/chunkers/JSONChunker.js +0 -68
- package/dist/client/rag/chunkers/LaTeXChunker.js +0 -63
- package/dist/client/rag/chunkers/MarkdownChunker.js +0 -306
- package/dist/client/rag/chunkers/RecursiveChunker.js +0 -139
- package/dist/client/rag/chunkers/SemanticMarkdownChunker.js +0 -138
- package/dist/client/rag/chunkers/SentenceChunker.js +0 -66
- package/dist/client/rag/chunkers/TokenChunker.js +0 -61
- package/dist/client/rag/chunkers/index.js +0 -15
- package/dist/client/rag/chunking/characterChunker.js +0 -142
- package/dist/client/rag/chunking/chunkerRegistry.js +0 -194
- package/dist/client/rag/chunking/htmlChunker.js +0 -247
- package/dist/client/rag/chunking/index.js +0 -17
- package/dist/client/rag/chunking/jsonChunker.js +0 -281
- package/dist/client/rag/chunking/latexChunker.js +0 -251
- package/dist/client/rag/chunking/markdownChunker.js +0 -373
- package/dist/client/rag/chunking/recursiveChunker.js +0 -148
- package/dist/client/rag/chunking/semanticChunker.js +0 -306
- package/dist/client/rag/chunking/sentenceChunker.js +0 -230
- package/dist/client/rag/chunking/tokenChunker.js +0 -183
- package/dist/client/rag/document/MDocument.js +0 -392
- package/dist/client/rag/document/index.js +0 -5
- package/dist/client/rag/document/loaders.js +0 -500
- package/dist/client/rag/errors/RAGError.js +0 -274
- package/dist/client/rag/errors/index.js +0 -6
- package/dist/client/rag/graphRag/graphRAG.js +0 -401
- package/dist/client/rag/graphRag/index.js +0 -4
- package/dist/client/rag/index.js +0 -141
- package/dist/client/rag/metadata/MetadataExtractorFactory.js +0 -418
- package/dist/client/rag/metadata/MetadataExtractorRegistry.js +0 -362
- package/dist/client/rag/metadata/index.js +0 -9
- package/dist/client/rag/metadata/metadataExtractor.js +0 -280
- package/dist/client/rag/pipeline/RAGPipeline.js +0 -436
- package/dist/client/rag/pipeline/contextAssembly.js +0 -341
- package/dist/client/rag/pipeline/index.js +0 -5
- package/dist/client/rag/ragIntegration.js +0 -321
- package/dist/client/rag/reranker/RerankerFactory.js +0 -430
- package/dist/client/rag/reranker/RerankerRegistry.js +0 -402
- package/dist/client/rag/reranker/index.js +0 -9
- package/dist/client/rag/reranker/reranker.js +0 -277
- package/dist/client/rag/resilience/CircuitBreaker.js +0 -431
- package/dist/client/rag/resilience/RetryHandler.js +0 -304
- package/dist/client/rag/resilience/index.js +0 -7
- package/dist/client/rag/retrieval/hybridSearch.js +0 -335
- package/dist/client/rag/retrieval/index.js +0 -5
- package/dist/client/rag/retrieval/vectorQueryTool.js +0 -307
- package/dist/client/rag/types.js +0 -8
- package/dist/client/sdk/toolRegistration.js +0 -377
- package/dist/client/server/abstract/baseServerAdapter.js +0 -575
- package/dist/client/server/adapters/expressAdapter.js +0 -486
- package/dist/client/server/adapters/fastifyAdapter.js +0 -472
- package/dist/client/server/adapters/honoAdapter.js +0 -632
- package/dist/client/server/adapters/koaAdapter.js +0 -510
- package/dist/client/server/errors.js +0 -486
- package/dist/client/server/factory/serverAdapterFactory.js +0 -160
- package/dist/client/server/index.js +0 -108
- package/dist/client/server/middleware/abortSignal.js +0 -111
- package/dist/client/server/middleware/auth.js +0 -388
- package/dist/client/server/middleware/cache.js +0 -359
- package/dist/client/server/middleware/common.js +0 -281
- package/dist/client/server/middleware/deprecation.js +0 -190
- package/dist/client/server/middleware/mcpBodyAttachment.js +0 -63
- package/dist/client/server/middleware/rateLimit.js +0 -227
- package/dist/client/server/middleware/validation.js +0 -388
- package/dist/client/server/openapi/generator.js +0 -398
- package/dist/client/server/openapi/index.js +0 -36
- package/dist/client/server/openapi/schemas.js +0 -695
- package/dist/client/server/openapi/templates.js +0 -374
- package/dist/client/server/routes/agentRoutes.js +0 -189
- package/dist/client/server/routes/claudeProxyRoutes.js +0 -1600
- package/dist/client/server/routes/healthRoutes.js +0 -187
- package/dist/client/server/routes/index.js +0 -57
- package/dist/client/server/routes/mcpRoutes.js +0 -342
- package/dist/client/server/routes/memoryRoutes.js +0 -350
- package/dist/client/server/routes/openApiRoutes.js +0 -126
- package/dist/client/server/routes/toolRoutes.js +0 -199
- package/dist/client/server/streaming/dataStream.js +0 -486
- package/dist/client/server/streaming/index.js +0 -11
- package/dist/client/server/types.js +0 -67
- package/dist/client/server/utils/redaction.js +0 -334
- package/dist/client/server/utils/validation.js +0 -243
- package/dist/client/server/websocket/WebSocketHandler.js +0 -383
- package/dist/client/server/websocket/index.js +0 -4
- package/dist/client/services/server/ai/observability/instrumentation.js +0 -808
- package/dist/client/telemetry/attributes.js +0 -100
- package/dist/client/telemetry/index.js +0 -26
- package/dist/client/telemetry/telemetryService.js +0 -308
- package/dist/client/telemetry/tracers.js +0 -17
- package/dist/client/telemetry/withSpan.js +0 -34
- package/dist/client/types/actionTypes.js +0 -6
- package/dist/client/types/analytics.js +0 -5
- package/dist/client/types/authTypes.js +0 -9
- package/dist/client/types/circuitBreakerErrors.js +0 -34
- package/dist/client/types/cli.js +0 -21
- package/dist/client/types/clientTypes.js +0 -10
- package/dist/client/types/common.js +0 -51
- package/dist/client/types/configTypes.js +0 -49
- package/dist/client/types/content.js +0 -19
- package/dist/client/types/contextTypes.js +0 -400
- package/dist/client/types/conversation.js +0 -47
- package/dist/client/types/conversationMemoryInterface.js +0 -6
- package/dist/client/types/domainTypes.js +0 -5
- package/dist/client/types/errors.js +0 -167
- package/dist/client/types/evaluation.js +0 -5
- package/dist/client/types/evaluationProviders.js +0 -5
- package/dist/client/types/evaluationTypes.js +0 -1
- package/dist/client/types/externalMcp.js +0 -6
- package/dist/client/types/fileReferenceTypes.js +0 -8
- package/dist/client/types/fileTypes.js +0 -4
- package/dist/client/types/generateTypes.js +0 -1
- package/dist/client/types/guardrails.js +0 -1
- package/dist/client/types/hitlTypes.js +0 -8
- package/dist/client/types/index.js +0 -57
- package/dist/client/types/mcpTypes.js +0 -5
- package/dist/client/types/middlewareTypes.js +0 -1
- package/dist/client/types/modelTypes.js +0 -30
- package/dist/client/types/multimodal.js +0 -135
- package/dist/client/types/observability.js +0 -6
- package/dist/client/types/pptTypes.js +0 -82
- package/dist/client/types/providers.js +0 -111
- package/dist/client/types/proxyTypes.js +0 -16
- package/dist/client/types/ragTypes.js +0 -7
- package/dist/client/types/sdkTypes.js +0 -8
- package/dist/client/types/serviceTypes.js +0 -5
- package/dist/client/types/streamTypes.js +0 -1
- package/dist/client/types/subscriptionTypes.js +0 -9
- package/dist/client/types/taskClassificationTypes.js +0 -5
- package/dist/client/types/tools.js +0 -24
- package/dist/client/types/ttsTypes.js +0 -57
- package/dist/client/types/typeAliases.js +0 -48
- package/dist/client/types/utilities.js +0 -4
- package/dist/client/types/workflowTypes.js +0 -30
- package/dist/client/utils/async/withTimeout.js +0 -98
- package/dist/client/utils/asyncMutex.js +0 -60
- package/dist/client/utils/conversationMemory.js +0 -431
- package/dist/client/utils/csvProcessor.js +0 -846
- package/dist/client/utils/errorHandling.js +0 -936
- package/dist/client/utils/evaluationUtils.js +0 -131
- package/dist/client/utils/factoryProcessing.js +0 -589
- package/dist/client/utils/fileDetector.js +0 -2161
- package/dist/client/utils/imageCache.js +0 -376
- package/dist/client/utils/imageProcessor.js +0 -704
- package/dist/client/utils/logger.js +0 -491
- package/dist/client/utils/mcpDefaults.js +0 -134
- package/dist/client/utils/messageBuilder.js +0 -1653
- package/dist/client/utils/modelAliasResolver.js +0 -54
- package/dist/client/utils/modelDetection.js +0 -80
- package/dist/client/utils/modelRouter.js +0 -292
- package/dist/client/utils/multimodalOptionsBuilder.js +0 -65
- package/dist/client/utils/observabilityHelpers.js +0 -47
- package/dist/client/utils/parameterValidation.js +0 -966
- package/dist/client/utils/pdfProcessor.js +0 -410
- package/dist/client/utils/performance.js +0 -222
- package/dist/client/utils/pricing.js +0 -340
- package/dist/client/utils/promptRedaction.js +0 -62
- package/dist/client/utils/providerConfig.js +0 -1009
- package/dist/client/utils/providerHealth.js +0 -1237
- package/dist/client/utils/providerRetry.js +0 -112
- package/dist/client/utils/providerUtils.js +0 -434
- package/dist/client/utils/rateLimiter.js +0 -200
- package/dist/client/utils/redis.js +0 -368
- package/dist/client/utils/retryHandler.js +0 -269
- package/dist/client/utils/retryability.js +0 -22
- package/dist/client/utils/sanitizers/svg.js +0 -481
- package/dist/client/utils/schemaConversion.js +0 -255
- package/dist/client/utils/taskClassificationUtils.js +0 -149
- package/dist/client/utils/taskClassifier.js +0 -94
- package/dist/client/utils/thinkingConfig.js +0 -104
- package/dist/client/utils/timeout.js +0 -359
- package/dist/client/utils/tokenEstimation.js +0 -142
- package/dist/client/utils/tokenLimits.js +0 -125
- package/dist/client/utils/tokenUtils.js +0 -239
- package/dist/client/utils/toolUtils.js +0 -75
- package/dist/client/utils/transformationUtils.js +0 -554
- package/dist/client/utils/ttsProcessor.js +0 -286
- package/dist/client/utils/typeUtils.js +0 -97
- package/dist/client/utils/videoAnalysisProcessor.js +0 -67
- package/dist/client/workflow/config.js +0 -398
- package/dist/client/workflow/core/ensembleExecutor.js +0 -407
- package/dist/client/workflow/core/judgeScorer.js +0 -544
- package/dist/client/workflow/core/responseConditioner.js +0 -225
- package/dist/client/workflow/core/types/conditionerTypes.js +0 -7
- package/dist/client/workflow/core/types/ensembleTypes.js +0 -7
- package/dist/client/workflow/core/types/index.js +0 -7
- package/dist/client/workflow/core/types/judgeTypes.js +0 -7
- package/dist/client/workflow/core/types/layerTypes.js +0 -7
- package/dist/client/workflow/core/types/registryTypes.js +0 -7
- package/dist/client/workflow/core/workflowRegistry.js +0 -304
- package/dist/client/workflow/core/workflowRunner.js +0 -586
- package/dist/client/workflow/index.js +0 -50
- package/dist/client/workflow/types.js +0 -9
- package/dist/client/workflow/utils/types/index.js +0 -7
- package/dist/client/workflow/utils/workflowMetrics.js +0 -311
- package/dist/client/workflow/utils/workflowValidation.js +0 -420
- package/dist/client/workflow/workflows/adaptiveWorkflow.js +0 -366
- package/dist/client/workflow/workflows/consensusWorkflow.js +0 -192
- package/dist/client/workflow/workflows/fallbackWorkflow.js +0 -225
- package/dist/client/workflow/workflows/multiJudgeWorkflow.js +0 -351
- /package/dist/client/{client/reactHooks.js → reactHooks.js} +0 -0
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent and Workflow Exposure as MCP Tools
|
|
3
|
-
*
|
|
4
|
-
* Enables exposing NeuroLink agents and workflows as MCP tools,
|
|
5
|
-
* allowing external MCP clients to invoke complex AI operations
|
|
6
|
-
* through the standardized MCP protocol.
|
|
7
|
-
*
|
|
8
|
-
* @module mcp/agentExposure
|
|
9
|
-
* @since 8.39.0
|
|
10
|
-
*/
|
|
11
|
-
import { logger } from "../utils/logger.js";
|
|
12
|
-
import { withTimeout } from "../utils/async/withTimeout.js";
|
|
13
|
-
import { ErrorFactory } from "../utils/errorHandling.js";
|
|
14
|
-
/**
|
|
15
|
-
* Expose an agent as an MCP tool
|
|
16
|
-
*/
|
|
17
|
-
export function exposeAgentAsTool(agent, options = {}) {
|
|
18
|
-
const { prefix = "agent", defaultAnnotations = {}, includeMetadataInDescription = true, nameTransformer = (name) => name.toLowerCase().replace(/\s+/g, "_"), wrapWithContext = true, executionTimeout = 300000, // 5 minutes default
|
|
19
|
-
enableLogging = true, } = options;
|
|
20
|
-
// Generate tool name
|
|
21
|
-
const baseName = nameTransformer(agent.name);
|
|
22
|
-
const toolName = prefix ? `${prefix}_${baseName}` : baseName;
|
|
23
|
-
// Build description
|
|
24
|
-
let description = agent.description;
|
|
25
|
-
if (includeMetadataInDescription && agent.metadata) {
|
|
26
|
-
const metaParts = [];
|
|
27
|
-
if (agent.metadata.version) {
|
|
28
|
-
metaParts.push(`v${agent.metadata.version}`);
|
|
29
|
-
}
|
|
30
|
-
if (agent.metadata.category) {
|
|
31
|
-
metaParts.push(`category: ${agent.metadata.category}`);
|
|
32
|
-
}
|
|
33
|
-
if (agent.metadata.estimatedDuration) {
|
|
34
|
-
metaParts.push(`~${agent.metadata.estimatedDuration}ms`);
|
|
35
|
-
}
|
|
36
|
-
if (metaParts.length > 0) {
|
|
37
|
-
description += ` [${metaParts.join(", ")}]`;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
// Build annotations
|
|
41
|
-
const annotations = {
|
|
42
|
-
...defaultAnnotations,
|
|
43
|
-
complexity: defaultAnnotations.complexity ?? "complex",
|
|
44
|
-
estimatedDuration: agent.metadata?.estimatedDuration ?? defaultAnnotations.estimatedDuration,
|
|
45
|
-
costHint: agent.metadata?.costHint ?? defaultAnnotations.costHint,
|
|
46
|
-
tags: [
|
|
47
|
-
...(defaultAnnotations.tags ?? []),
|
|
48
|
-
"agent",
|
|
49
|
-
...(agent.metadata?.tags ?? []),
|
|
50
|
-
],
|
|
51
|
-
};
|
|
52
|
-
// Build input schema with agent context
|
|
53
|
-
const inputSchema = agent.inputSchema ?? {
|
|
54
|
-
type: "object",
|
|
55
|
-
properties: {},
|
|
56
|
-
};
|
|
57
|
-
// Create execution wrapper
|
|
58
|
-
const execute = async (params, context) => {
|
|
59
|
-
const startTime = Date.now();
|
|
60
|
-
if (enableLogging) {
|
|
61
|
-
logger.debug(`[AgentExposure] Executing agent '${agent.id}' as tool '${toolName}'`);
|
|
62
|
-
}
|
|
63
|
-
try {
|
|
64
|
-
// Execute agent with context wrapper if enabled
|
|
65
|
-
const existingConfig = context?.config && typeof context.config === "object"
|
|
66
|
-
? context.config
|
|
67
|
-
: {};
|
|
68
|
-
const executionContext = wrapWithContext
|
|
69
|
-
? {
|
|
70
|
-
...context,
|
|
71
|
-
config: {
|
|
72
|
-
...existingConfig,
|
|
73
|
-
sourceType: "mcp-exposed-agent",
|
|
74
|
-
agentId: agent.id,
|
|
75
|
-
toolName,
|
|
76
|
-
},
|
|
77
|
-
}
|
|
78
|
-
: (context ?? {});
|
|
79
|
-
const result = await withTimeout(agent.execute(params, executionContext), executionTimeout);
|
|
80
|
-
const duration = Date.now() - startTime;
|
|
81
|
-
if (enableLogging) {
|
|
82
|
-
logger.debug(`[AgentExposure] Agent '${agent.id}' completed in ${duration}ms`);
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
success: true,
|
|
86
|
-
data: result,
|
|
87
|
-
metadata: {
|
|
88
|
-
agentId: agent.id,
|
|
89
|
-
toolName,
|
|
90
|
-
executionTime: duration,
|
|
91
|
-
sourceType: "agent",
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
const duration = Date.now() - startTime;
|
|
97
|
-
const agentError = error instanceof Error
|
|
98
|
-
? error
|
|
99
|
-
: ErrorFactory.toolExecutionFailed(toolName, new Error(String(error)));
|
|
100
|
-
if (enableLogging) {
|
|
101
|
-
logger.error(`[AgentExposure] Agent '${agent.id}' failed after ${duration}ms: ${agentError.message}`);
|
|
102
|
-
}
|
|
103
|
-
return {
|
|
104
|
-
success: false,
|
|
105
|
-
error: agentError.message,
|
|
106
|
-
metadata: {
|
|
107
|
-
agentId: agent.id,
|
|
108
|
-
toolName,
|
|
109
|
-
executionTime: duration,
|
|
110
|
-
sourceType: "agent",
|
|
111
|
-
},
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
const tool = {
|
|
116
|
-
name: toolName,
|
|
117
|
-
description,
|
|
118
|
-
inputSchema,
|
|
119
|
-
outputSchema: agent.outputSchema,
|
|
120
|
-
annotations,
|
|
121
|
-
execute,
|
|
122
|
-
metadata: {
|
|
123
|
-
sourceType: "agent",
|
|
124
|
-
sourceId: agent.id,
|
|
125
|
-
originalName: agent.name,
|
|
126
|
-
...agent.metadata,
|
|
127
|
-
},
|
|
128
|
-
};
|
|
129
|
-
return {
|
|
130
|
-
tool,
|
|
131
|
-
sourceType: "agent",
|
|
132
|
-
sourceId: agent.id,
|
|
133
|
-
toolName,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Expose a workflow as an MCP tool
|
|
138
|
-
*/
|
|
139
|
-
export function exposeWorkflowAsTool(workflow, options = {}) {
|
|
140
|
-
const { prefix = "workflow", defaultAnnotations = {}, includeMetadataInDescription = true, nameTransformer = (name) => name.toLowerCase().replace(/\s+/g, "_"), wrapWithContext = true, executionTimeout = 600000, // 10 minutes default for workflows
|
|
141
|
-
enableLogging = true, } = options;
|
|
142
|
-
// Generate tool name
|
|
143
|
-
const baseName = nameTransformer(workflow.name);
|
|
144
|
-
const toolName = prefix ? `${prefix}_${baseName}` : baseName;
|
|
145
|
-
// Build description
|
|
146
|
-
let description = workflow.description;
|
|
147
|
-
if (includeMetadataInDescription) {
|
|
148
|
-
const metaParts = [];
|
|
149
|
-
if (workflow.metadata?.version) {
|
|
150
|
-
metaParts.push(`v${workflow.metadata.version}`);
|
|
151
|
-
}
|
|
152
|
-
if (workflow.steps?.length) {
|
|
153
|
-
metaParts.push(`${workflow.steps.length} steps`);
|
|
154
|
-
}
|
|
155
|
-
if (workflow.metadata?.estimatedDuration) {
|
|
156
|
-
metaParts.push(`~${workflow.metadata.estimatedDuration}ms`);
|
|
157
|
-
}
|
|
158
|
-
if (metaParts.length > 0) {
|
|
159
|
-
description += ` [${metaParts.join(", ")}]`;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
// Build annotations
|
|
163
|
-
const annotations = {
|
|
164
|
-
...defaultAnnotations,
|
|
165
|
-
complexity: defaultAnnotations.complexity ?? "complex",
|
|
166
|
-
estimatedDuration: workflow.metadata?.estimatedDuration ??
|
|
167
|
-
defaultAnnotations.estimatedDuration,
|
|
168
|
-
idempotentHint: workflow.metadata?.idempotent ?? defaultAnnotations.idempotentHint,
|
|
169
|
-
tags: [
|
|
170
|
-
...(defaultAnnotations.tags ?? []),
|
|
171
|
-
"workflow",
|
|
172
|
-
...(workflow.metadata?.tags ?? []),
|
|
173
|
-
],
|
|
174
|
-
};
|
|
175
|
-
// Build input schema
|
|
176
|
-
const inputSchema = workflow.inputSchema ?? {
|
|
177
|
-
type: "object",
|
|
178
|
-
properties: {},
|
|
179
|
-
};
|
|
180
|
-
// Create execution wrapper
|
|
181
|
-
const execute = async (params, context) => {
|
|
182
|
-
const startTime = Date.now();
|
|
183
|
-
if (enableLogging) {
|
|
184
|
-
logger.debug(`[WorkflowExposure] Executing workflow '${workflow.id}' as tool '${toolName}'`);
|
|
185
|
-
}
|
|
186
|
-
try {
|
|
187
|
-
// Execute workflow with context wrapper if enabled
|
|
188
|
-
const existingConfig = context?.config && typeof context.config === "object"
|
|
189
|
-
? context.config
|
|
190
|
-
: {};
|
|
191
|
-
const executionContext = wrapWithContext
|
|
192
|
-
? {
|
|
193
|
-
...context,
|
|
194
|
-
config: {
|
|
195
|
-
...existingConfig,
|
|
196
|
-
sourceType: "mcp-exposed-workflow",
|
|
197
|
-
workflowId: workflow.id,
|
|
198
|
-
toolName,
|
|
199
|
-
},
|
|
200
|
-
}
|
|
201
|
-
: (context ?? {});
|
|
202
|
-
const result = await withTimeout(workflow.execute(params, executionContext), executionTimeout);
|
|
203
|
-
const duration = Date.now() - startTime;
|
|
204
|
-
if (enableLogging) {
|
|
205
|
-
logger.debug(`[WorkflowExposure] Workflow '${workflow.id}' completed in ${duration}ms`);
|
|
206
|
-
}
|
|
207
|
-
return {
|
|
208
|
-
success: true,
|
|
209
|
-
data: result,
|
|
210
|
-
metadata: {
|
|
211
|
-
workflowId: workflow.id,
|
|
212
|
-
toolName,
|
|
213
|
-
executionTime: duration,
|
|
214
|
-
sourceType: "workflow",
|
|
215
|
-
stepsCount: workflow.steps?.length,
|
|
216
|
-
},
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
catch (error) {
|
|
220
|
-
const duration = Date.now() - startTime;
|
|
221
|
-
const workflowError = error instanceof Error
|
|
222
|
-
? error
|
|
223
|
-
: ErrorFactory.toolExecutionFailed(toolName, new Error(String(error)));
|
|
224
|
-
if (enableLogging) {
|
|
225
|
-
logger.error(`[WorkflowExposure] Workflow '${workflow.id}' failed after ${duration}ms: ${workflowError.message}`);
|
|
226
|
-
}
|
|
227
|
-
return {
|
|
228
|
-
success: false,
|
|
229
|
-
error: workflowError.message,
|
|
230
|
-
metadata: {
|
|
231
|
-
workflowId: workflow.id,
|
|
232
|
-
toolName,
|
|
233
|
-
executionTime: duration,
|
|
234
|
-
sourceType: "workflow",
|
|
235
|
-
},
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
const tool = {
|
|
240
|
-
name: toolName,
|
|
241
|
-
description,
|
|
242
|
-
inputSchema,
|
|
243
|
-
outputSchema: workflow.outputSchema,
|
|
244
|
-
annotations,
|
|
245
|
-
execute,
|
|
246
|
-
metadata: {
|
|
247
|
-
sourceType: "workflow",
|
|
248
|
-
sourceId: workflow.id,
|
|
249
|
-
originalName: workflow.name,
|
|
250
|
-
steps: workflow.steps,
|
|
251
|
-
...workflow.metadata,
|
|
252
|
-
},
|
|
253
|
-
};
|
|
254
|
-
return {
|
|
255
|
-
tool,
|
|
256
|
-
sourceType: "workflow",
|
|
257
|
-
sourceId: workflow.id,
|
|
258
|
-
toolName,
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Batch expose agents as MCP tools
|
|
263
|
-
*/
|
|
264
|
-
export function exposeAgentsAsTools(agents, options = {}) {
|
|
265
|
-
return agents.map((agent) => exposeAgentAsTool(agent, options));
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Batch expose workflows as MCP tools
|
|
269
|
-
*/
|
|
270
|
-
export function exposeWorkflowsAsTools(workflows, options = {}) {
|
|
271
|
-
return workflows.map((workflow) => exposeWorkflowAsTool(workflow, options));
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Agent Exposure Manager
|
|
275
|
-
*
|
|
276
|
-
* Manages the lifecycle of exposed agents and workflows,
|
|
277
|
-
* providing registration, lookup, and invocation capabilities.
|
|
278
|
-
*/
|
|
279
|
-
export class AgentExposureManager {
|
|
280
|
-
exposedTools = new Map();
|
|
281
|
-
options;
|
|
282
|
-
constructor(options = {}) {
|
|
283
|
-
this.options = options;
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Expose an agent and register it
|
|
287
|
-
*/
|
|
288
|
-
exposeAgent(agent) {
|
|
289
|
-
const result = exposeAgentAsTool(agent, this.options);
|
|
290
|
-
this.exposedTools.set(result.toolName, result);
|
|
291
|
-
return result.tool;
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Expose a workflow and register it
|
|
295
|
-
*/
|
|
296
|
-
exposeWorkflow(workflow) {
|
|
297
|
-
const result = exposeWorkflowAsTool(workflow, this.options);
|
|
298
|
-
this.exposedTools.set(result.toolName, result);
|
|
299
|
-
return result.tool;
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Get all exposed tools
|
|
303
|
-
*/
|
|
304
|
-
getExposedTools() {
|
|
305
|
-
return Array.from(this.exposedTools.values()).map((r) => r.tool);
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Get exposed tool by name
|
|
309
|
-
*/
|
|
310
|
-
getExposedTool(toolName) {
|
|
311
|
-
return this.exposedTools.get(toolName)?.tool;
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Get exposure result by tool name
|
|
315
|
-
*/
|
|
316
|
-
getExposureResult(toolName) {
|
|
317
|
-
return this.exposedTools.get(toolName);
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Get tools by source type
|
|
321
|
-
*/
|
|
322
|
-
getToolsBySourceType(sourceType) {
|
|
323
|
-
return Array.from(this.exposedTools.values())
|
|
324
|
-
.filter((r) => r.sourceType === sourceType)
|
|
325
|
-
.map((r) => r.tool);
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* Remove exposed tool
|
|
329
|
-
*/
|
|
330
|
-
unexpose(toolName) {
|
|
331
|
-
return this.exposedTools.delete(toolName);
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Clear all exposed tools
|
|
335
|
-
*/
|
|
336
|
-
clear() {
|
|
337
|
-
this.exposedTools.clear();
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Get statistics
|
|
341
|
-
*/
|
|
342
|
-
getStatistics() {
|
|
343
|
-
const results = Array.from(this.exposedTools.values());
|
|
344
|
-
return {
|
|
345
|
-
totalExposed: results.length,
|
|
346
|
-
exposedAgents: results.filter((r) => r.sourceType === "agent").length,
|
|
347
|
-
exposedWorkflows: results.filter((r) => r.sourceType === "workflow")
|
|
348
|
-
.length,
|
|
349
|
-
toolNames: results.map((r) => r.toolName),
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Global agent exposure manager instance
|
|
355
|
-
*/
|
|
356
|
-
export const globalAgentExposureManager = new AgentExposureManager();
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Authentication Module
|
|
3
|
-
* OAuth 2.1 authentication support for MCP HTTP transport
|
|
4
|
-
*/
|
|
5
|
-
// Note: OAuth types (OAuthTokens, TokenStorage, MCPOAuthConfig, etc.)
|
|
6
|
-
// should be imported directly from the types folder: src/lib/types/mcpTypes.ts
|
|
7
|
-
// Consumers should use: import type { MCPOAuthConfig } from "@juspay/neurolink"
|
|
8
|
-
// Token storage implementations
|
|
9
|
-
export { InMemoryTokenStorage, FileTokenStorage, isTokenExpired, calculateExpiresAt, } from "./tokenStorage.js";
|
|
10
|
-
// OAuth client provider
|
|
11
|
-
export { NeuroLinkOAuthProvider, createOAuthProviderFromConfig, } from "./oauthClientProvider.js";
|
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OAuth 2.1 Client Provider for MCP HTTP Transport
|
|
3
|
-
* Implements OAuth 2.1 authentication with PKCE support
|
|
4
|
-
*/
|
|
5
|
-
import { randomBytes, createHash } from "crypto";
|
|
6
|
-
import { InMemoryTokenStorage, isTokenExpired, calculateExpiresAt, } from "./tokenStorage.js";
|
|
7
|
-
import { logger } from "../../utils/logger.js";
|
|
8
|
-
/**
|
|
9
|
-
* NeuroLink OAuth Provider for MCP HTTP Transport
|
|
10
|
-
* Handles OAuth 2.1 authentication flow with optional PKCE support
|
|
11
|
-
*/
|
|
12
|
-
export class NeuroLinkOAuthProvider {
|
|
13
|
-
config;
|
|
14
|
-
storage;
|
|
15
|
-
pendingChallenges = new Map();
|
|
16
|
-
pendingStates = new Set();
|
|
17
|
-
constructor(config, storage) {
|
|
18
|
-
this.config = {
|
|
19
|
-
...config,
|
|
20
|
-
usePKCE: config.usePKCE ?? true, // PKCE enabled by default for OAuth 2.1
|
|
21
|
-
};
|
|
22
|
-
this.storage = storage ?? new InMemoryTokenStorage();
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Get stored tokens for a server
|
|
26
|
-
* Returns null if tokens are not available or expired (without refresh token)
|
|
27
|
-
*/
|
|
28
|
-
async tokens(serverId) {
|
|
29
|
-
const tokens = await this.storage.getTokens(serverId);
|
|
30
|
-
if (!tokens) {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
// Check if tokens are expired
|
|
34
|
-
if (isTokenExpired(tokens)) {
|
|
35
|
-
// Try to refresh if refresh token is available
|
|
36
|
-
if (tokens.refreshToken) {
|
|
37
|
-
try {
|
|
38
|
-
const refreshedTokens = await this.refreshTokens(serverId, tokens.refreshToken);
|
|
39
|
-
return refreshedTokens;
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
logger.warn(`[NeuroLinkOAuthProvider] Token refresh failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
43
|
-
// Delete expired tokens if refresh fails
|
|
44
|
-
await this.storage.deleteTokens(serverId);
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
// No refresh token, delete expired tokens
|
|
49
|
-
await this.storage.deleteTokens(serverId);
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
return tokens;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Save tokens for a server
|
|
56
|
-
*/
|
|
57
|
-
async saveTokens(serverId, tokens) {
|
|
58
|
-
await this.storage.saveTokens(serverId, tokens);
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Delete tokens for a server
|
|
62
|
-
*/
|
|
63
|
-
async deleteTokens(serverId) {
|
|
64
|
-
await this.storage.deleteTokens(serverId);
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Get client information for MCP SDK
|
|
68
|
-
*/
|
|
69
|
-
clientInformation() {
|
|
70
|
-
return {
|
|
71
|
-
clientId: this.config.clientId,
|
|
72
|
-
clientSecret: this.config.clientSecret,
|
|
73
|
-
redirectUri: this.config.redirectUrl,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Generate authorization URL for OAuth flow
|
|
78
|
-
* Returns the URL to redirect the user to for authorization
|
|
79
|
-
* @param _serverId - Server ID (reserved for future use in state management)
|
|
80
|
-
*/
|
|
81
|
-
redirectToAuthorization(_serverId) {
|
|
82
|
-
// Generate state parameter for CSRF protection
|
|
83
|
-
const state = this.generateState();
|
|
84
|
-
this.pendingStates.add(state);
|
|
85
|
-
// Build authorization URL
|
|
86
|
-
const url = new URL(this.config.authorizationUrl);
|
|
87
|
-
// Required OAuth 2.1 parameters
|
|
88
|
-
url.searchParams.set("response_type", "code");
|
|
89
|
-
url.searchParams.set("client_id", this.config.clientId);
|
|
90
|
-
url.searchParams.set("redirect_uri", this.config.redirectUrl);
|
|
91
|
-
url.searchParams.set("state", state);
|
|
92
|
-
// Optional scope
|
|
93
|
-
if (this.config.scope) {
|
|
94
|
-
url.searchParams.set("scope", this.config.scope);
|
|
95
|
-
}
|
|
96
|
-
// PKCE support
|
|
97
|
-
let codeVerifier;
|
|
98
|
-
if (this.config.usePKCE) {
|
|
99
|
-
const pkce = this.generatePKCE();
|
|
100
|
-
codeVerifier = pkce.codeVerifier;
|
|
101
|
-
// Store PKCE challenge for later verification
|
|
102
|
-
this.pendingChallenges.set(state, pkce);
|
|
103
|
-
url.searchParams.set("code_challenge", pkce.codeChallenge);
|
|
104
|
-
url.searchParams.set("code_challenge_method", pkce.codeChallengeMethod);
|
|
105
|
-
}
|
|
106
|
-
// Additional custom parameters
|
|
107
|
-
if (this.config.additionalParams) {
|
|
108
|
-
for (const [key, value] of Object.entries(this.config.additionalParams)) {
|
|
109
|
-
url.searchParams.set(key, value);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return {
|
|
113
|
-
url: url.toString(),
|
|
114
|
-
state,
|
|
115
|
-
codeVerifier,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Exchange authorization code for tokens
|
|
120
|
-
*/
|
|
121
|
-
async exchangeCode(serverId, request) {
|
|
122
|
-
// Validate state
|
|
123
|
-
if (!this.pendingStates.has(request.state)) {
|
|
124
|
-
throw new Error("Invalid or expired state parameter");
|
|
125
|
-
}
|
|
126
|
-
this.pendingStates.delete(request.state);
|
|
127
|
-
// Get PKCE verifier if applicable
|
|
128
|
-
let codeVerifier = request.codeVerifier;
|
|
129
|
-
if (this.config.usePKCE && !codeVerifier) {
|
|
130
|
-
const pkce = this.pendingChallenges.get(request.state);
|
|
131
|
-
if (pkce) {
|
|
132
|
-
codeVerifier = pkce.codeVerifier;
|
|
133
|
-
this.pendingChallenges.delete(request.state);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// Build token request
|
|
137
|
-
const body = new URLSearchParams();
|
|
138
|
-
body.set("grant_type", "authorization_code");
|
|
139
|
-
body.set("code", request.code);
|
|
140
|
-
body.set("redirect_uri", this.config.redirectUrl);
|
|
141
|
-
body.set("client_id", this.config.clientId);
|
|
142
|
-
// Include client secret if available (confidential clients)
|
|
143
|
-
if (this.config.clientSecret) {
|
|
144
|
-
body.set("client_secret", this.config.clientSecret);
|
|
145
|
-
}
|
|
146
|
-
// Include PKCE verifier if applicable
|
|
147
|
-
if (codeVerifier) {
|
|
148
|
-
body.set("code_verifier", codeVerifier);
|
|
149
|
-
}
|
|
150
|
-
// Request tokens
|
|
151
|
-
const response = await fetch(this.config.tokenUrl, {
|
|
152
|
-
method: "POST",
|
|
153
|
-
headers: {
|
|
154
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
155
|
-
Accept: "application/json",
|
|
156
|
-
},
|
|
157
|
-
body: body.toString(),
|
|
158
|
-
});
|
|
159
|
-
if (!response.ok) {
|
|
160
|
-
const errorText = await response.text();
|
|
161
|
-
throw new Error(`Token exchange failed: ${response.status} ${response.statusText} - ${errorText}`);
|
|
162
|
-
}
|
|
163
|
-
const tokenResponse = (await response.json());
|
|
164
|
-
// Convert to OAuthTokens format
|
|
165
|
-
const tokens = {
|
|
166
|
-
accessToken: tokenResponse.access_token,
|
|
167
|
-
refreshToken: tokenResponse.refresh_token,
|
|
168
|
-
expiresAt: tokenResponse.expires_in
|
|
169
|
-
? calculateExpiresAt(tokenResponse.expires_in)
|
|
170
|
-
: undefined,
|
|
171
|
-
tokenType: tokenResponse.token_type ?? "Bearer",
|
|
172
|
-
scope: tokenResponse.scope,
|
|
173
|
-
};
|
|
174
|
-
// Save tokens
|
|
175
|
-
await this.saveTokens(serverId, tokens);
|
|
176
|
-
return tokens;
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Refresh tokens using refresh token
|
|
180
|
-
*/
|
|
181
|
-
async refreshTokens(serverId, refreshToken) {
|
|
182
|
-
const body = new URLSearchParams();
|
|
183
|
-
body.set("grant_type", "refresh_token");
|
|
184
|
-
body.set("refresh_token", refreshToken);
|
|
185
|
-
body.set("client_id", this.config.clientId);
|
|
186
|
-
if (this.config.clientSecret) {
|
|
187
|
-
body.set("client_secret", this.config.clientSecret);
|
|
188
|
-
}
|
|
189
|
-
const response = await fetch(this.config.tokenUrl, {
|
|
190
|
-
method: "POST",
|
|
191
|
-
headers: {
|
|
192
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
193
|
-
Accept: "application/json",
|
|
194
|
-
},
|
|
195
|
-
body: body.toString(),
|
|
196
|
-
});
|
|
197
|
-
if (!response.ok) {
|
|
198
|
-
const errorText = await response.text();
|
|
199
|
-
throw new Error(`Token refresh failed: ${response.status} ${response.statusText} - ${errorText}`);
|
|
200
|
-
}
|
|
201
|
-
const tokenResponse = (await response.json());
|
|
202
|
-
const tokens = {
|
|
203
|
-
accessToken: tokenResponse.access_token,
|
|
204
|
-
// Keep old refresh token if new one not provided
|
|
205
|
-
refreshToken: tokenResponse.refresh_token ?? refreshToken,
|
|
206
|
-
expiresAt: tokenResponse.expires_in
|
|
207
|
-
? calculateExpiresAt(tokenResponse.expires_in)
|
|
208
|
-
: undefined,
|
|
209
|
-
tokenType: tokenResponse.token_type ?? "Bearer",
|
|
210
|
-
scope: tokenResponse.scope,
|
|
211
|
-
};
|
|
212
|
-
await this.saveTokens(serverId, tokens);
|
|
213
|
-
return tokens;
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Revoke tokens (if supported by the OAuth server)
|
|
217
|
-
*/
|
|
218
|
-
async revokeTokens(serverId, revocationUrl) {
|
|
219
|
-
const tokens = await this.storage.getTokens(serverId);
|
|
220
|
-
if (!tokens) {
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
const body = new URLSearchParams();
|
|
224
|
-
body.set("token", tokens.accessToken);
|
|
225
|
-
body.set("client_id", this.config.clientId);
|
|
226
|
-
if (this.config.clientSecret) {
|
|
227
|
-
body.set("client_secret", this.config.clientSecret);
|
|
228
|
-
}
|
|
229
|
-
try {
|
|
230
|
-
await fetch(revocationUrl, {
|
|
231
|
-
method: "POST",
|
|
232
|
-
headers: {
|
|
233
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
234
|
-
},
|
|
235
|
-
body: body.toString(),
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
catch (error) {
|
|
239
|
-
logger.warn(`[NeuroLinkOAuthProvider] Token revocation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
240
|
-
}
|
|
241
|
-
// Always delete local tokens
|
|
242
|
-
await this.storage.deleteTokens(serverId);
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Get authorization header value for API requests
|
|
246
|
-
*/
|
|
247
|
-
async getAuthorizationHeader(serverId) {
|
|
248
|
-
const tokens = await this.tokens(serverId);
|
|
249
|
-
if (!tokens) {
|
|
250
|
-
return null;
|
|
251
|
-
}
|
|
252
|
-
return `${tokens.tokenType} ${tokens.accessToken}`;
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Check if a server has valid (non-expired) tokens
|
|
256
|
-
*/
|
|
257
|
-
async hasValidTokens(serverId) {
|
|
258
|
-
const tokens = await this.tokens(serverId);
|
|
259
|
-
return tokens !== null;
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Generate a cryptographically secure state parameter
|
|
263
|
-
*/
|
|
264
|
-
generateState() {
|
|
265
|
-
return randomBytes(32).toString("base64url");
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Generate PKCE code verifier and challenge
|
|
269
|
-
* Uses SHA-256 for code challenge method (required by OAuth 2.1)
|
|
270
|
-
*/
|
|
271
|
-
generatePKCE() {
|
|
272
|
-
// Generate code verifier (43-128 characters, URL-safe)
|
|
273
|
-
const codeVerifier = randomBytes(32).toString("base64url");
|
|
274
|
-
// Generate code challenge using SHA-256
|
|
275
|
-
const codeChallenge = createHash("sha256")
|
|
276
|
-
.update(codeVerifier)
|
|
277
|
-
.digest("base64url");
|
|
278
|
-
return {
|
|
279
|
-
codeVerifier,
|
|
280
|
-
codeChallenge,
|
|
281
|
-
codeChallengeMethod: "S256",
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Get the OAuth configuration
|
|
286
|
-
*/
|
|
287
|
-
getConfig() {
|
|
288
|
-
return { ...this.config };
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Get the token storage instance
|
|
292
|
-
*/
|
|
293
|
-
getStorage() {
|
|
294
|
-
return this.storage;
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Clean up expired pending states and challenges
|
|
298
|
-
* Should be called periodically to prevent memory leaks
|
|
299
|
-
*/
|
|
300
|
-
cleanupPendingRequests() {
|
|
301
|
-
// Clear old pending states (older than 10 minutes)
|
|
302
|
-
// Note: In a production system, you'd want to track timestamps
|
|
303
|
-
// For now, we just clear all if there are too many
|
|
304
|
-
if (this.pendingStates.size > 100) {
|
|
305
|
-
this.pendingStates.clear();
|
|
306
|
-
}
|
|
307
|
-
if (this.pendingChallenges.size > 100) {
|
|
308
|
-
this.pendingChallenges.clear();
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Create an OAuth provider from MCP server auth configuration
|
|
314
|
-
*/
|
|
315
|
-
export function createOAuthProviderFromConfig(authConfig, storage) {
|
|
316
|
-
return new NeuroLinkOAuthProvider({
|
|
317
|
-
clientId: authConfig.clientId,
|
|
318
|
-
clientSecret: authConfig.clientSecret,
|
|
319
|
-
authorizationUrl: authConfig.authorizationUrl,
|
|
320
|
-
tokenUrl: authConfig.tokenUrl,
|
|
321
|
-
redirectUrl: authConfig.redirectUrl,
|
|
322
|
-
scope: authConfig.scope,
|
|
323
|
-
usePKCE: authConfig.usePKCE ?? true,
|
|
324
|
-
}, storage);
|
|
325
|
-
}
|