@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,601 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Request Interceptors and Retry Logic
|
|
3
|
-
*
|
|
4
|
-
* Provides middleware interceptors for the NeuroLink client SDK including
|
|
5
|
-
* authentication, logging, retry logic, rate limiting, and request/response transformation.
|
|
6
|
-
*
|
|
7
|
-
* @module @neurolink/client/interceptors
|
|
8
|
-
*/
|
|
9
|
-
import { logger } from "../utils/logger.js";
|
|
10
|
-
// =============================================================================
|
|
11
|
-
// Utility Functions
|
|
12
|
-
// =============================================================================
|
|
13
|
-
/**
|
|
14
|
-
* Calculate delay for exponential backoff with jitter
|
|
15
|
-
*/
|
|
16
|
-
function calculateBackoffDelay(attempt, initialDelayMs, maxDelayMs, multiplier) {
|
|
17
|
-
const delay = initialDelayMs * Math.pow(multiplier, attempt);
|
|
18
|
-
const jitter = Math.random() * 0.1 * delay;
|
|
19
|
-
return Math.min(delay + jitter, maxDelayMs);
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Delay utility
|
|
23
|
-
*/
|
|
24
|
-
function sleep(ms) {
|
|
25
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Check if a status code is retryable
|
|
29
|
-
*/
|
|
30
|
-
function isRetryableStatus(status, retryableStatusCodes) {
|
|
31
|
-
return retryableStatusCodes.includes(status);
|
|
32
|
-
}
|
|
33
|
-
// =============================================================================
|
|
34
|
-
// Authentication Interceptors
|
|
35
|
-
// =============================================================================
|
|
36
|
-
/**
|
|
37
|
-
* API Key authentication interceptor
|
|
38
|
-
*
|
|
39
|
-
* Adds X-API-Key header to all requests.
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* ```typescript
|
|
43
|
-
* client.use(createApiKeyAuthInterceptor('your-api-key'));
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
export function createApiKeyAuthInterceptor(apiKey) {
|
|
47
|
-
return async (request, next) => {
|
|
48
|
-
request.headers["X-API-Key"] = apiKey;
|
|
49
|
-
return next();
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Bearer token authentication interceptor
|
|
54
|
-
*
|
|
55
|
-
* Adds Authorization header with Bearer token.
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* ```typescript
|
|
59
|
-
* client.use(createBearerAuthInterceptor('your-token'));
|
|
60
|
-
* ```
|
|
61
|
-
*/
|
|
62
|
-
export function createBearerAuthInterceptor(token) {
|
|
63
|
-
return async (request, next) => {
|
|
64
|
-
request.headers["Authorization"] = `Bearer ${token}`;
|
|
65
|
-
return next();
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Dynamic authentication interceptor
|
|
70
|
-
*
|
|
71
|
-
* Retrieves authentication token dynamically for each request.
|
|
72
|
-
* Useful for token refresh scenarios.
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* ```typescript
|
|
76
|
-
* client.use(createDynamicAuthInterceptor(async () => {
|
|
77
|
-
* const token = await getAccessToken();
|
|
78
|
-
* return { type: 'bearer', token };
|
|
79
|
-
* }));
|
|
80
|
-
* ```
|
|
81
|
-
*/
|
|
82
|
-
export function createDynamicAuthInterceptor(getAuth) {
|
|
83
|
-
return async (request, next) => {
|
|
84
|
-
const auth = await getAuth();
|
|
85
|
-
if (auth) {
|
|
86
|
-
if (auth.type === "apiKey") {
|
|
87
|
-
request.headers["X-API-Key"] = auth.key;
|
|
88
|
-
}
|
|
89
|
-
else if (auth.type === "bearer") {
|
|
90
|
-
request.headers["Authorization"] = `Bearer ${auth.token}`;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return next();
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Logging interceptor
|
|
98
|
-
*
|
|
99
|
-
* Logs request and response details for debugging.
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* ```typescript
|
|
103
|
-
* client.use(createLoggingInterceptor({
|
|
104
|
-
* logRequest: true,
|
|
105
|
-
* logResponse: true,
|
|
106
|
-
* redactFields: ['apiKey', 'password'],
|
|
107
|
-
* }));
|
|
108
|
-
* ```
|
|
109
|
-
*/
|
|
110
|
-
export function createLoggingInterceptor(options = {}) {
|
|
111
|
-
const { logRequest = true, logResponse = true, logBody = false, logResponseBody = false, logger: customLogger = (message, data) => logger.debug(message, data), redactFields = ["apiKey", "password", "token", "authorization"], } = options;
|
|
112
|
-
const redact = (obj) => {
|
|
113
|
-
if (typeof obj !== "object" || obj === null) {
|
|
114
|
-
return obj;
|
|
115
|
-
}
|
|
116
|
-
if (Array.isArray(obj)) {
|
|
117
|
-
return obj.map(redact);
|
|
118
|
-
}
|
|
119
|
-
const result = {};
|
|
120
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
121
|
-
if (redactFields.some((field) => key.toLowerCase().includes(field.toLowerCase()))) {
|
|
122
|
-
result[key] = "[REDACTED]";
|
|
123
|
-
}
|
|
124
|
-
else if (typeof value === "object" && value !== null) {
|
|
125
|
-
result[key] = redact(value);
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
result[key] = value;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return result;
|
|
132
|
-
};
|
|
133
|
-
return async (request, next) => {
|
|
134
|
-
const startTime = Date.now();
|
|
135
|
-
if (logRequest) {
|
|
136
|
-
const logData = {
|
|
137
|
-
method: request.method,
|
|
138
|
-
url: request.url,
|
|
139
|
-
requestId: request.context.requestId,
|
|
140
|
-
};
|
|
141
|
-
if (logBody && request.body) {
|
|
142
|
-
logData.body = redact(request.body);
|
|
143
|
-
}
|
|
144
|
-
customLogger(`[NeuroLink] Request`, logData);
|
|
145
|
-
}
|
|
146
|
-
try {
|
|
147
|
-
const response = await next();
|
|
148
|
-
const duration = Date.now() - startTime;
|
|
149
|
-
if (logResponse) {
|
|
150
|
-
const logData = {
|
|
151
|
-
status: response.status,
|
|
152
|
-
duration: `${duration}ms`,
|
|
153
|
-
requestId: request.context.requestId,
|
|
154
|
-
};
|
|
155
|
-
if (logResponseBody && response.body) {
|
|
156
|
-
logData.body = redact(response.body);
|
|
157
|
-
}
|
|
158
|
-
customLogger(`[NeuroLink] Response`, logData);
|
|
159
|
-
}
|
|
160
|
-
return response;
|
|
161
|
-
}
|
|
162
|
-
catch (error) {
|
|
163
|
-
const duration = Date.now() - startTime;
|
|
164
|
-
customLogger(`[NeuroLink] Error`, {
|
|
165
|
-
error: error.message,
|
|
166
|
-
duration: `${duration}ms`,
|
|
167
|
-
requestId: request.context.requestId,
|
|
168
|
-
});
|
|
169
|
-
throw error;
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Retry interceptor with exponential backoff
|
|
175
|
-
*
|
|
176
|
-
* Automatically retries failed requests with configurable backoff.
|
|
177
|
-
*
|
|
178
|
-
* @example
|
|
179
|
-
* ```typescript
|
|
180
|
-
* client.use(createRetryInterceptor({
|
|
181
|
-
* maxAttempts: 3,
|
|
182
|
-
* initialDelayMs: 1000,
|
|
183
|
-
* maxDelayMs: 10000,
|
|
184
|
-
* backoffMultiplier: 2,
|
|
185
|
-
* retryableStatusCodes: [429, 500, 502, 503, 504],
|
|
186
|
-
* onRetry: (attempt, error) => console.log(`Retry ${attempt}:`, error),
|
|
187
|
-
* }));
|
|
188
|
-
* ```
|
|
189
|
-
*/
|
|
190
|
-
export function createRetryInterceptor(options) {
|
|
191
|
-
const { maxAttempts = 3, initialDelayMs = 1000, maxDelayMs = 10000, backoffMultiplier = 2, retryableStatusCodes = [408, 429, 500, 502, 503, 504], retryOnNetworkError = true, onRetry, shouldRetry, } = options;
|
|
192
|
-
return async (request, next) => {
|
|
193
|
-
let lastError;
|
|
194
|
-
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
195
|
-
try {
|
|
196
|
-
const response = await next();
|
|
197
|
-
// Check custom retry condition
|
|
198
|
-
if (shouldRetry && shouldRetry(response, attempt)) {
|
|
199
|
-
if (attempt < maxAttempts - 1) {
|
|
200
|
-
const delay = calculateBackoffDelay(attempt, initialDelayMs, maxDelayMs, backoffMultiplier);
|
|
201
|
-
onRetry?.(attempt + 1, { message: "Custom retry condition met" }, request);
|
|
202
|
-
await sleep(delay);
|
|
203
|
-
request.context.retryCount = attempt + 1;
|
|
204
|
-
continue;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
// Check if response status is retryable
|
|
208
|
-
if (isRetryableStatus(response.status, retryableStatusCodes)) {
|
|
209
|
-
if (attempt < maxAttempts - 1) {
|
|
210
|
-
const delay = calculateBackoffDelay(attempt, initialDelayMs, maxDelayMs, backoffMultiplier);
|
|
211
|
-
const error = {
|
|
212
|
-
code: "RETRYABLE_ERROR",
|
|
213
|
-
message: `HTTP ${response.status}`,
|
|
214
|
-
status: response.status,
|
|
215
|
-
retryable: true,
|
|
216
|
-
};
|
|
217
|
-
onRetry?.(attempt + 1, error, request);
|
|
218
|
-
await sleep(delay);
|
|
219
|
-
request.context.retryCount = attempt + 1;
|
|
220
|
-
continue;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return response;
|
|
224
|
-
}
|
|
225
|
-
catch (error) {
|
|
226
|
-
lastError = error;
|
|
227
|
-
// Check if network error and should retry
|
|
228
|
-
if (retryOnNetworkError && attempt < maxAttempts - 1) {
|
|
229
|
-
const delay = calculateBackoffDelay(attempt, initialDelayMs, maxDelayMs, backoffMultiplier);
|
|
230
|
-
onRetry?.(attempt + 1, error, request);
|
|
231
|
-
await sleep(delay);
|
|
232
|
-
request.context.retryCount = attempt + 1;
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
throw error;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
throw lastError ?? new Error("Max retries exceeded");
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Token bucket rate limiter
|
|
243
|
-
*/
|
|
244
|
-
class TokenBucket {
|
|
245
|
-
tokens;
|
|
246
|
-
lastRefill;
|
|
247
|
-
maxTokens;
|
|
248
|
-
refillRate;
|
|
249
|
-
queue = [];
|
|
250
|
-
constructor(maxTokens, windowMs) {
|
|
251
|
-
this.maxTokens = maxTokens;
|
|
252
|
-
this.tokens = maxTokens;
|
|
253
|
-
this.lastRefill = Date.now();
|
|
254
|
-
this.refillRate = maxTokens / windowMs;
|
|
255
|
-
}
|
|
256
|
-
refill() {
|
|
257
|
-
const now = Date.now();
|
|
258
|
-
const elapsed = now - this.lastRefill;
|
|
259
|
-
this.tokens = Math.min(this.maxTokens, this.tokens + elapsed * this.refillRate);
|
|
260
|
-
this.lastRefill = now;
|
|
261
|
-
}
|
|
262
|
-
async acquire(strategy) {
|
|
263
|
-
this.refill();
|
|
264
|
-
if (this.tokens >= 1) {
|
|
265
|
-
this.tokens -= 1;
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
if (strategy === "throw") {
|
|
269
|
-
throw new Error("Rate limit exceeded");
|
|
270
|
-
}
|
|
271
|
-
// Queue strategy: wait for a token
|
|
272
|
-
return new Promise((resolve, reject) => {
|
|
273
|
-
this.queue.push({ resolve, reject });
|
|
274
|
-
this.processQueue();
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
processQueue() {
|
|
278
|
-
if (this.queue.length === 0) {
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
const waitTime = Math.ceil((1 - this.tokens) / this.refillRate);
|
|
282
|
-
setTimeout(() => {
|
|
283
|
-
this.refill();
|
|
284
|
-
while (this.tokens >= 1 && this.queue.length > 0) {
|
|
285
|
-
this.tokens -= 1;
|
|
286
|
-
const item = this.queue.shift();
|
|
287
|
-
item?.resolve();
|
|
288
|
-
}
|
|
289
|
-
if (this.queue.length > 0) {
|
|
290
|
-
this.processQueue();
|
|
291
|
-
}
|
|
292
|
-
}, waitTime);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Rate limiting interceptor
|
|
297
|
-
*
|
|
298
|
-
* Limits the rate of requests to prevent overwhelming the API.
|
|
299
|
-
*
|
|
300
|
-
* @example
|
|
301
|
-
* ```typescript
|
|
302
|
-
* client.use(createRateLimitInterceptor({
|
|
303
|
-
* maxRequests: 100,
|
|
304
|
-
* windowMs: 60000, // 100 requests per minute
|
|
305
|
-
* strategy: 'queue',
|
|
306
|
-
* onRateLimited: (waitTime) => console.log(`Rate limited, waiting ${waitTime}ms`),
|
|
307
|
-
* }));
|
|
308
|
-
* ```
|
|
309
|
-
*/
|
|
310
|
-
export function createRateLimitInterceptor(options) {
|
|
311
|
-
const { maxRequests, windowMs, strategy = "queue", onRateLimited } = options;
|
|
312
|
-
const bucket = new TokenBucket(maxRequests, windowMs);
|
|
313
|
-
return async (request, next) => {
|
|
314
|
-
try {
|
|
315
|
-
await bucket.acquire(strategy);
|
|
316
|
-
}
|
|
317
|
-
catch (error) {
|
|
318
|
-
onRateLimited?.(windowMs / maxRequests);
|
|
319
|
-
throw error;
|
|
320
|
-
}
|
|
321
|
-
return next();
|
|
322
|
-
};
|
|
323
|
-
}
|
|
324
|
-
// =============================================================================
|
|
325
|
-
// Request/Response Transformation Interceptors
|
|
326
|
-
// =============================================================================
|
|
327
|
-
/**
|
|
328
|
-
* Request transformation interceptor
|
|
329
|
-
*
|
|
330
|
-
* Transform request before sending.
|
|
331
|
-
*
|
|
332
|
-
* @example
|
|
333
|
-
* ```typescript
|
|
334
|
-
* client.use(createRequestTransformInterceptor((request) => {
|
|
335
|
-
* // Add custom header based on request body
|
|
336
|
-
* if (request.body?.priority === 'high') {
|
|
337
|
-
* request.headers['X-Priority'] = 'high';
|
|
338
|
-
* }
|
|
339
|
-
* return request;
|
|
340
|
-
* }));
|
|
341
|
-
* ```
|
|
342
|
-
*/
|
|
343
|
-
export function createRequestTransformInterceptor(transform) {
|
|
344
|
-
return async (request, next) => {
|
|
345
|
-
const transformedRequest = await transform(request);
|
|
346
|
-
// Update the original request object
|
|
347
|
-
Object.assign(request, transformedRequest);
|
|
348
|
-
return next();
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
/**
|
|
352
|
-
* Response transformation interceptor
|
|
353
|
-
*
|
|
354
|
-
* Transform response before returning.
|
|
355
|
-
*
|
|
356
|
-
* @example
|
|
357
|
-
* ```typescript
|
|
358
|
-
* client.use(createResponseTransformInterceptor((response) => {
|
|
359
|
-
* // Add metadata to response
|
|
360
|
-
* response.context.processedAt = Date.now();
|
|
361
|
-
* return response;
|
|
362
|
-
* }));
|
|
363
|
-
* ```
|
|
364
|
-
*/
|
|
365
|
-
export function createResponseTransformInterceptor(transform) {
|
|
366
|
-
return async (request, next) => {
|
|
367
|
-
const response = await next();
|
|
368
|
-
return transform(response);
|
|
369
|
-
};
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Simple in-memory cache
|
|
373
|
-
*/
|
|
374
|
-
class SimpleCache {
|
|
375
|
-
cache = new Map();
|
|
376
|
-
maxSize;
|
|
377
|
-
constructor(maxSize = 1000) {
|
|
378
|
-
this.maxSize = maxSize;
|
|
379
|
-
}
|
|
380
|
-
get(key) {
|
|
381
|
-
const entry = this.cache.get(key);
|
|
382
|
-
if (!entry) {
|
|
383
|
-
return undefined;
|
|
384
|
-
}
|
|
385
|
-
if (Date.now() > entry.expires) {
|
|
386
|
-
this.cache.delete(key);
|
|
387
|
-
return undefined;
|
|
388
|
-
}
|
|
389
|
-
return entry.value;
|
|
390
|
-
}
|
|
391
|
-
set(key, value, ttl) {
|
|
392
|
-
// Evict oldest entries if cache is full
|
|
393
|
-
if (this.cache.size >= this.maxSize) {
|
|
394
|
-
const firstKey = this.cache.keys().next().value;
|
|
395
|
-
if (firstKey) {
|
|
396
|
-
this.cache.delete(firstKey);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
this.cache.set(key, {
|
|
400
|
-
value,
|
|
401
|
-
expires: Date.now() + ttl,
|
|
402
|
-
});
|
|
403
|
-
}
|
|
404
|
-
delete(key) {
|
|
405
|
-
this.cache.delete(key);
|
|
406
|
-
}
|
|
407
|
-
clear() {
|
|
408
|
-
this.cache.clear();
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* Caching interceptor
|
|
413
|
-
*
|
|
414
|
-
* Caches responses to reduce API calls.
|
|
415
|
-
*
|
|
416
|
-
* @example
|
|
417
|
-
* ```typescript
|
|
418
|
-
* client.use(createCacheInterceptor({
|
|
419
|
-
* ttl: 60000, // 1 minute
|
|
420
|
-
* methods: ['GET'],
|
|
421
|
-
* includePaths: [/\/api\/tools/, /\/api\/providers/],
|
|
422
|
-
* }));
|
|
423
|
-
* ```
|
|
424
|
-
*/
|
|
425
|
-
export function createCacheInterceptor(options) {
|
|
426
|
-
const { ttl, maxSize = 1000, keyGenerator = (req) => `${req.method}:${req.url}`, methods = ["GET"], includePaths, excludePaths, } = options;
|
|
427
|
-
const cache = new SimpleCache(maxSize);
|
|
428
|
-
return async (request, next) => {
|
|
429
|
-
// Check if request should be cached
|
|
430
|
-
if (!methods.includes(request.method)) {
|
|
431
|
-
return next();
|
|
432
|
-
}
|
|
433
|
-
// Check path filters
|
|
434
|
-
const url = new URL(request.url, "http://localhost");
|
|
435
|
-
if (excludePaths?.some((pattern) => pattern.test(url.pathname))) {
|
|
436
|
-
return next();
|
|
437
|
-
}
|
|
438
|
-
if (includePaths &&
|
|
439
|
-
!includePaths.some((pattern) => pattern.test(url.pathname))) {
|
|
440
|
-
return next();
|
|
441
|
-
}
|
|
442
|
-
const cacheKey = keyGenerator(request);
|
|
443
|
-
const cached = cache.get(cacheKey);
|
|
444
|
-
if (cached) {
|
|
445
|
-
// Return cached response with cache hit indicator
|
|
446
|
-
return {
|
|
447
|
-
...cached,
|
|
448
|
-
context: {
|
|
449
|
-
...cached.context,
|
|
450
|
-
cacheHit: true,
|
|
451
|
-
},
|
|
452
|
-
};
|
|
453
|
-
}
|
|
454
|
-
const response = await next();
|
|
455
|
-
// Only cache successful responses
|
|
456
|
-
if (response.status >= 200 && response.status < 300) {
|
|
457
|
-
cache.set(cacheKey, response, ttl);
|
|
458
|
-
}
|
|
459
|
-
return response;
|
|
460
|
-
};
|
|
461
|
-
}
|
|
462
|
-
/**
|
|
463
|
-
* Timeout interceptor
|
|
464
|
-
*
|
|
465
|
-
* Adds a timeout to requests.
|
|
466
|
-
*
|
|
467
|
-
* @example
|
|
468
|
-
* ```typescript
|
|
469
|
-
* client.use(createTimeoutInterceptor({
|
|
470
|
-
* timeout: 30000, // 30 seconds
|
|
471
|
-
* onTimeout: (request) => console.log('Request timed out:', request.url),
|
|
472
|
-
* }));
|
|
473
|
-
* ```
|
|
474
|
-
*/
|
|
475
|
-
export function createTimeoutInterceptor(options) {
|
|
476
|
-
const { timeout, onTimeout } = options;
|
|
477
|
-
return async (request, next) => {
|
|
478
|
-
const controller = new AbortController();
|
|
479
|
-
// Store the signal so downstream middleware/httpClient can also use it
|
|
480
|
-
request.context.timeoutSignal = controller.signal;
|
|
481
|
-
// Race next() against a timer that rejects on timeout
|
|
482
|
-
let timeoutId;
|
|
483
|
-
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
484
|
-
timeoutId = setTimeout(() => {
|
|
485
|
-
controller.abort();
|
|
486
|
-
onTimeout?.(request);
|
|
487
|
-
const error = new Error(`Request timed out after ${timeout}ms`);
|
|
488
|
-
error.name = "TimeoutError";
|
|
489
|
-
reject(error);
|
|
490
|
-
}, timeout);
|
|
491
|
-
});
|
|
492
|
-
try {
|
|
493
|
-
const response = await Promise.race([next(), timeoutPromise]);
|
|
494
|
-
clearTimeout(timeoutId);
|
|
495
|
-
return response;
|
|
496
|
-
}
|
|
497
|
-
catch (error) {
|
|
498
|
-
clearTimeout(timeoutId);
|
|
499
|
-
if (error.name === "TimeoutError" ||
|
|
500
|
-
error.name === "AbortError") {
|
|
501
|
-
throw new Error(`Request timed out after ${timeout}ms`, {
|
|
502
|
-
cause: error,
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
throw error;
|
|
506
|
-
}
|
|
507
|
-
};
|
|
508
|
-
}
|
|
509
|
-
/**
|
|
510
|
-
* Error handling interceptor
|
|
511
|
-
*
|
|
512
|
-
* Provides centralized error handling and transformation.
|
|
513
|
-
*
|
|
514
|
-
* @example
|
|
515
|
-
* ```typescript
|
|
516
|
-
* client.use(createErrorHandlerInterceptor({
|
|
517
|
-
* onError: (error, request) => {
|
|
518
|
-
* console.error('Request failed:', error.message);
|
|
519
|
-
* },
|
|
520
|
-
* reportError: async (error, context) => {
|
|
521
|
-
* await errorReportingService.report(error, context);
|
|
522
|
-
* },
|
|
523
|
-
* }));
|
|
524
|
-
* ```
|
|
525
|
-
*/
|
|
526
|
-
export function createErrorHandlerInterceptor(options = {}) {
|
|
527
|
-
const { onError, transformError, reportError } = options;
|
|
528
|
-
return async (request, next) => {
|
|
529
|
-
try {
|
|
530
|
-
return await next();
|
|
531
|
-
}
|
|
532
|
-
catch (error) {
|
|
533
|
-
// Report error if configured
|
|
534
|
-
if (reportError) {
|
|
535
|
-
await reportError(error, request.context);
|
|
536
|
-
}
|
|
537
|
-
// Transform error if configured
|
|
538
|
-
if (transformError) {
|
|
539
|
-
const transformed = transformError(error);
|
|
540
|
-
throw transformed;
|
|
541
|
-
}
|
|
542
|
-
// Call custom handler
|
|
543
|
-
if (onError) {
|
|
544
|
-
const result = onError(error, request);
|
|
545
|
-
if (result) {
|
|
546
|
-
throw result;
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
throw error;
|
|
550
|
-
}
|
|
551
|
-
};
|
|
552
|
-
}
|
|
553
|
-
// =============================================================================
|
|
554
|
-
// Composition Utilities
|
|
555
|
-
// =============================================================================
|
|
556
|
-
/**
|
|
557
|
-
* Compose multiple middleware into one
|
|
558
|
-
*
|
|
559
|
-
* @example
|
|
560
|
-
* ```typescript
|
|
561
|
-
* const combinedMiddleware = composeMiddleware(
|
|
562
|
-
* createLoggingInterceptor(),
|
|
563
|
-
* createRetryInterceptor({ maxAttempts: 3 }),
|
|
564
|
-
* createRateLimitInterceptor({ maxRequests: 100, windowMs: 60000 }),
|
|
565
|
-
* );
|
|
566
|
-
*
|
|
567
|
-
* client.use(combinedMiddleware);
|
|
568
|
-
* ```
|
|
569
|
-
*/
|
|
570
|
-
export function composeMiddleware(...middlewares) {
|
|
571
|
-
return async (request, next) => {
|
|
572
|
-
let index = 0;
|
|
573
|
-
const executeNext = async () => {
|
|
574
|
-
if (index < middlewares.length) {
|
|
575
|
-
const middleware = middlewares[index++];
|
|
576
|
-
return middleware(request, executeNext);
|
|
577
|
-
}
|
|
578
|
-
return next();
|
|
579
|
-
};
|
|
580
|
-
return executeNext();
|
|
581
|
-
};
|
|
582
|
-
}
|
|
583
|
-
/**
|
|
584
|
-
* Conditionally apply middleware
|
|
585
|
-
*
|
|
586
|
-
* @example
|
|
587
|
-
* ```typescript
|
|
588
|
-
* client.use(conditionalMiddleware(
|
|
589
|
-
* (request) => request.url.includes('/api/agents'),
|
|
590
|
-
* createLoggingInterceptor(),
|
|
591
|
-
* ));
|
|
592
|
-
* ```
|
|
593
|
-
*/
|
|
594
|
-
export function conditionalMiddleware(condition, middleware) {
|
|
595
|
-
return async (request, next) => {
|
|
596
|
-
if (condition(request)) {
|
|
597
|
-
return middleware(request, next);
|
|
598
|
-
}
|
|
599
|
-
return next();
|
|
600
|
-
};
|
|
601
|
-
}
|