@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,200 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token Bucket Rate Limiter for URL Downloads
|
|
3
|
-
*
|
|
4
|
-
* Implements a token bucket algorithm to limit concurrent URL downloads.
|
|
5
|
-
* This prevents DoS attacks from rapid URL download requests.
|
|
6
|
-
*
|
|
7
|
-
* Default configuration: 10 downloads per second
|
|
8
|
-
*/
|
|
9
|
-
import { logger } from "./logger.js";
|
|
10
|
-
import { ErrorFactory } from "./errorHandling.js";
|
|
11
|
-
/**
|
|
12
|
-
* Default configuration: 10 downloads per second
|
|
13
|
-
*/
|
|
14
|
-
const DEFAULT_CONFIG = {
|
|
15
|
-
maxTokens: 10,
|
|
16
|
-
refillIntervalMs: 1000,
|
|
17
|
-
tokensPerRefill: 10,
|
|
18
|
-
maxQueueSize: 100,
|
|
19
|
-
queueTimeoutMs: 30000,
|
|
20
|
-
};
|
|
21
|
-
/**
|
|
22
|
-
* Token Bucket Rate Limiter
|
|
23
|
-
*
|
|
24
|
-
* Uses a token bucket algorithm where:
|
|
25
|
-
* - Tokens are consumed when a download is requested
|
|
26
|
-
* - Tokens are refilled at a fixed rate
|
|
27
|
-
* - Requests that exceed the limit are queued
|
|
28
|
-
*/
|
|
29
|
-
export class TokenBucketRateLimiter {
|
|
30
|
-
tokens;
|
|
31
|
-
config;
|
|
32
|
-
queue = [];
|
|
33
|
-
refillTimer = null;
|
|
34
|
-
lastRefillTime;
|
|
35
|
-
constructor(config = {}) {
|
|
36
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
37
|
-
this.tokens = this.config.maxTokens;
|
|
38
|
-
this.lastRefillTime = Date.now();
|
|
39
|
-
this.startRefillTimer();
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Start the token refill timer
|
|
43
|
-
*/
|
|
44
|
-
startRefillTimer() {
|
|
45
|
-
if (this.refillTimer) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
this.refillTimer = setInterval(() => {
|
|
49
|
-
this.refillTokens();
|
|
50
|
-
this.processQueue();
|
|
51
|
-
}, this.config.refillIntervalMs);
|
|
52
|
-
// Unref to prevent keeping the process alive
|
|
53
|
-
this.refillTimer.unref();
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Refill tokens based on elapsed time
|
|
57
|
-
*/
|
|
58
|
-
refillTokens() {
|
|
59
|
-
const now = Date.now();
|
|
60
|
-
const elapsed = now - this.lastRefillTime;
|
|
61
|
-
const intervalsElapsed = Math.floor(elapsed / this.config.refillIntervalMs);
|
|
62
|
-
if (intervalsElapsed > 0) {
|
|
63
|
-
const tokensToAdd = intervalsElapsed * this.config.tokensPerRefill;
|
|
64
|
-
this.tokens = Math.min(this.config.maxTokens, this.tokens + tokensToAdd);
|
|
65
|
-
this.lastRefillTime = now;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Process queued requests when tokens become available
|
|
70
|
-
*/
|
|
71
|
-
processQueue() {
|
|
72
|
-
const now = Date.now();
|
|
73
|
-
// Remove timed out requests
|
|
74
|
-
while (this.queue.length > 0) {
|
|
75
|
-
const request = this.queue[0];
|
|
76
|
-
if (now - request.timestamp > this.config.queueTimeoutMs) {
|
|
77
|
-
this.queue.shift();
|
|
78
|
-
if (request.timeoutTimer) {
|
|
79
|
-
clearTimeout(request.timeoutTimer);
|
|
80
|
-
}
|
|
81
|
-
request.reject(ErrorFactory.rateLimiterQueueTimeout(this.config.queueTimeoutMs));
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// Process requests while we have tokens
|
|
88
|
-
while (this.tokens > 0 && this.queue.length > 0) {
|
|
89
|
-
const request = this.queue.shift();
|
|
90
|
-
if (request) {
|
|
91
|
-
if (request.timeoutTimer) {
|
|
92
|
-
clearTimeout(request.timeoutTimer);
|
|
93
|
-
}
|
|
94
|
-
this.tokens--;
|
|
95
|
-
request.resolve();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Acquire a token for a download
|
|
101
|
-
* Returns immediately if token is available, otherwise queues the request
|
|
102
|
-
*
|
|
103
|
-
* @throws NeuroLinkError if queue is full or request times out
|
|
104
|
-
*/
|
|
105
|
-
async acquire() {
|
|
106
|
-
// Refill tokens based on elapsed time
|
|
107
|
-
this.refillTokens();
|
|
108
|
-
// If token available, consume it immediately
|
|
109
|
-
if (this.tokens > 0) {
|
|
110
|
-
this.tokens--;
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
// Check queue size limit
|
|
114
|
-
if (this.queue.length >= this.config.maxQueueSize) {
|
|
115
|
-
logger.warn(`Rate limiter queue full (${this.config.maxQueueSize} requests pending)`);
|
|
116
|
-
throw ErrorFactory.rateLimiterQueueFull(this.config.maxQueueSize);
|
|
117
|
-
}
|
|
118
|
-
// Queue the request with per-request timeout handling
|
|
119
|
-
return new Promise((resolve, reject) => {
|
|
120
|
-
// Create per-request timeout timer for robust timeout handling
|
|
121
|
-
const timeoutTimer = setTimeout(() => {
|
|
122
|
-
// Remove from queue if still present
|
|
123
|
-
const index = this.queue.findIndex((req) => req.timeoutTimer === timeoutTimer);
|
|
124
|
-
if (index !== -1) {
|
|
125
|
-
this.queue.splice(index, 1);
|
|
126
|
-
reject(ErrorFactory.rateLimiterQueueTimeout(this.config.queueTimeoutMs));
|
|
127
|
-
}
|
|
128
|
-
}, this.config.queueTimeoutMs);
|
|
129
|
-
this.queue.push({
|
|
130
|
-
resolve,
|
|
131
|
-
reject,
|
|
132
|
-
timestamp: Date.now(),
|
|
133
|
-
timeoutTimer,
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Get current rate limiter statistics
|
|
139
|
-
*/
|
|
140
|
-
getStats() {
|
|
141
|
-
return {
|
|
142
|
-
availableTokens: this.tokens,
|
|
143
|
-
queueLength: this.queue.length,
|
|
144
|
-
maxTokens: this.config.maxTokens,
|
|
145
|
-
maxQueueSize: this.config.maxQueueSize,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Reset the rate limiter to initial state
|
|
150
|
-
*/
|
|
151
|
-
reset() {
|
|
152
|
-
this.tokens = this.config.maxTokens;
|
|
153
|
-
this.lastRefillTime = Date.now();
|
|
154
|
-
// Reject all queued requests and clear timeout timers
|
|
155
|
-
while (this.queue.length > 0) {
|
|
156
|
-
const request = this.queue.shift();
|
|
157
|
-
if (request) {
|
|
158
|
-
if (request.timeoutTimer) {
|
|
159
|
-
clearTimeout(request.timeoutTimer);
|
|
160
|
-
}
|
|
161
|
-
request.reject(ErrorFactory.rateLimiterReset());
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Stop the rate limiter and clean up resources
|
|
167
|
-
*/
|
|
168
|
-
stop() {
|
|
169
|
-
if (this.refillTimer) {
|
|
170
|
-
clearInterval(this.refillTimer);
|
|
171
|
-
this.refillTimer = null;
|
|
172
|
-
}
|
|
173
|
-
this.reset();
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Global rate limiter instance for URL downloads
|
|
178
|
-
* Default: 10 downloads per second
|
|
179
|
-
*/
|
|
180
|
-
export const urlDownloadRateLimiter = new TokenBucketRateLimiter({
|
|
181
|
-
maxTokens: 10,
|
|
182
|
-
refillIntervalMs: 1000,
|
|
183
|
-
tokensPerRefill: 10,
|
|
184
|
-
maxQueueSize: 100,
|
|
185
|
-
queueTimeoutMs: 30000,
|
|
186
|
-
});
|
|
187
|
-
/**
|
|
188
|
-
* Rate-limited wrapper for async functions
|
|
189
|
-
* Ensures the function is rate-limited using the provided rate limiter
|
|
190
|
-
*
|
|
191
|
-
* @param fn - The async function to wrap
|
|
192
|
-
* @param rateLimiter - The rate limiter to use (defaults to urlDownloadRateLimiter)
|
|
193
|
-
* @returns A rate-limited version of the function
|
|
194
|
-
*/
|
|
195
|
-
export function withRateLimit(fn, rateLimiter = urlDownloadRateLimiter) {
|
|
196
|
-
return async (...args) => {
|
|
197
|
-
await rateLimiter.acquire();
|
|
198
|
-
return fn(...args);
|
|
199
|
-
};
|
|
200
|
-
}
|
|
@@ -1,368 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Redis Utilities for NeuroLink
|
|
3
|
-
* Helper functions for Redis storage operations
|
|
4
|
-
*/
|
|
5
|
-
import { createClient } from "redis";
|
|
6
|
-
import { logger } from "./logger.js";
|
|
7
|
-
const SESSION_ONLY_PREFIX = "session-only:";
|
|
8
|
-
// Connection pool - keyed by host:port:db
|
|
9
|
-
const connectionPool = new Map();
|
|
10
|
-
const pendingConnections = new Map();
|
|
11
|
-
/**
|
|
12
|
-
* Get a pooled Redis connection. Multiple callers with the same host:port:db
|
|
13
|
-
* share a single connection, reducing connection count.
|
|
14
|
-
*/
|
|
15
|
-
export async function getPooledRedisClient(config) {
|
|
16
|
-
const key = `${config.host}:${config.port}:${config.db}:${config.password ? "auth" : "noauth"}`;
|
|
17
|
-
const existing = connectionPool.get(key);
|
|
18
|
-
if (existing && existing.client.isOpen) {
|
|
19
|
-
existing.refCount++;
|
|
20
|
-
logger.debug("[Redis] Reusing pooled connection", {
|
|
21
|
-
key,
|
|
22
|
-
refCount: existing.refCount,
|
|
23
|
-
});
|
|
24
|
-
return existing.client;
|
|
25
|
-
}
|
|
26
|
-
// Check pending BEFORE cleaning up stale entries to prevent TOCTOU race:
|
|
27
|
-
// Two callers seeing a stale entry could both skip this check and both
|
|
28
|
-
// attempt to create new connections if we cleaned up first.
|
|
29
|
-
const pending = pendingConnections.get(key);
|
|
30
|
-
if (pending) {
|
|
31
|
-
const client = await pending;
|
|
32
|
-
const entry = connectionPool.get(key);
|
|
33
|
-
if (entry) {
|
|
34
|
-
if (!entry.client.isOpen) {
|
|
35
|
-
// Client was closed while awaiting; clean up and create fresh
|
|
36
|
-
connectionPool.delete(key);
|
|
37
|
-
const freshClient = await createRedisClient(config);
|
|
38
|
-
connectionPool.set(key, { client: freshClient, refCount: 1 });
|
|
39
|
-
return freshClient;
|
|
40
|
-
}
|
|
41
|
-
entry.refCount++;
|
|
42
|
-
}
|
|
43
|
-
else if (client.isOpen) {
|
|
44
|
-
// Entry was released while we awaited; re-register
|
|
45
|
-
connectionPool.set(key, { client, refCount: 1 });
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
// Client was closed while we awaited; create fresh connection
|
|
49
|
-
const freshClient = await createRedisClient(config);
|
|
50
|
-
connectionPool.set(key, { client: freshClient, refCount: 1 });
|
|
51
|
-
return freshClient;
|
|
52
|
-
}
|
|
53
|
-
return client;
|
|
54
|
-
}
|
|
55
|
-
// Clean up stale entry if exists (connection closed)
|
|
56
|
-
if (existing) {
|
|
57
|
-
connectionPool.delete(key);
|
|
58
|
-
}
|
|
59
|
-
// Create the promise and register it in pendingConnections atomically
|
|
60
|
-
// (synchronous) before any await, so concurrent callers will find it.
|
|
61
|
-
const connectPromise = createRedisClient(config);
|
|
62
|
-
pendingConnections.set(key, connectPromise);
|
|
63
|
-
try {
|
|
64
|
-
const client = await connectPromise;
|
|
65
|
-
connectionPool.set(key, { client, refCount: 1 });
|
|
66
|
-
logger.info("[Redis] Created pooled connection", { key, refCount: 1 });
|
|
67
|
-
return client;
|
|
68
|
-
}
|
|
69
|
-
finally {
|
|
70
|
-
pendingConnections.delete(key);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Release a pooled Redis connection. Only closes when refCount reaches 0.
|
|
75
|
-
*/
|
|
76
|
-
export async function releasePooledRedisClient(config) {
|
|
77
|
-
const key = `${config.host}:${config.port}:${config.db}:${config.password ? "auth" : "noauth"}`;
|
|
78
|
-
const entry = connectionPool.get(key);
|
|
79
|
-
if (!entry) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
entry.refCount--;
|
|
83
|
-
logger.debug("[Redis] Released pooled connection", {
|
|
84
|
-
key,
|
|
85
|
-
refCount: entry.refCount,
|
|
86
|
-
});
|
|
87
|
-
if (entry.refCount <= 0) {
|
|
88
|
-
try {
|
|
89
|
-
if (entry.client.isOpen) {
|
|
90
|
-
await entry.client.quit();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
catch (e) {
|
|
94
|
-
logger.warn("[Redis] Error closing pooled connection", {
|
|
95
|
-
key,
|
|
96
|
-
error: String(e),
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
connectionPool.delete(key);
|
|
100
|
-
logger.info("[Redis] Closed pooled connection", { key });
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Get stats about the connection pool
|
|
105
|
-
*/
|
|
106
|
-
export function getPoolStats() {
|
|
107
|
-
return Array.from(connectionPool.entries()).map(([key, entry]) => ({
|
|
108
|
-
key,
|
|
109
|
-
refCount: entry.refCount,
|
|
110
|
-
isOpen: entry.client.isOpen,
|
|
111
|
-
}));
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Creates a Redis client with the provided configuration
|
|
115
|
-
*/
|
|
116
|
-
export async function createRedisClient(config) {
|
|
117
|
-
const url = `redis://${config.host}:${config.port}/${config.db}`;
|
|
118
|
-
// Create client options
|
|
119
|
-
const clientOptions = {
|
|
120
|
-
url,
|
|
121
|
-
socket: {
|
|
122
|
-
connectTimeout: config.connectionOptions?.connectTimeout,
|
|
123
|
-
reconnectStrategy: (retries) => {
|
|
124
|
-
if (retries > (config.connectionOptions?.maxRetriesPerRequest || 3)) {
|
|
125
|
-
logger.error("Redis connection retries exhausted");
|
|
126
|
-
return new Error("Redis connection retries exhausted");
|
|
127
|
-
}
|
|
128
|
-
const delay = Math.min((config.connectionOptions?.retryDelayOnFailover || 100) *
|
|
129
|
-
Math.pow(2, retries), 10000);
|
|
130
|
-
return delay;
|
|
131
|
-
},
|
|
132
|
-
},
|
|
133
|
-
};
|
|
134
|
-
if (config.password) {
|
|
135
|
-
clientOptions.password = config.password;
|
|
136
|
-
}
|
|
137
|
-
// Create client with secured options
|
|
138
|
-
const client = createClient(clientOptions);
|
|
139
|
-
client.on("error", (err) => {
|
|
140
|
-
const sanitizedMessage = err.message.replace(/redis:\/\/.*?@/g, "redis://[redacted]@");
|
|
141
|
-
logger.error("Redis client error", { error: sanitizedMessage });
|
|
142
|
-
});
|
|
143
|
-
client.on("connect", () => {
|
|
144
|
-
logger.debug("Redis client connected", {
|
|
145
|
-
host: config.host,
|
|
146
|
-
port: config.port,
|
|
147
|
-
db: config.db,
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
client.on("reconnecting", () => {
|
|
151
|
-
logger.debug("Redis client reconnecting");
|
|
152
|
-
});
|
|
153
|
-
if (!client.isOpen) {
|
|
154
|
-
await client.connect();
|
|
155
|
-
}
|
|
156
|
-
return client;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Generates a Redis key for session messages
|
|
160
|
-
*/
|
|
161
|
-
export function getSessionKey(config, sessionId, userId) {
|
|
162
|
-
if (!userId) {
|
|
163
|
-
logger.warn("[REDIS] getSessionKey called without userId", { sessionId });
|
|
164
|
-
return `${config.keyPrefix}${SESSION_ONLY_PREFIX}${sessionId}`;
|
|
165
|
-
}
|
|
166
|
-
const key = `${config.keyPrefix}${userId}:${sessionId}`;
|
|
167
|
-
logger.debug("[redisUtils] Generated session key", {
|
|
168
|
-
sessionId,
|
|
169
|
-
userId,
|
|
170
|
-
keyPrefix: config.keyPrefix,
|
|
171
|
-
fullKey: key,
|
|
172
|
-
});
|
|
173
|
-
return key;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Generates a Redis key for user sessions mapping
|
|
177
|
-
*/
|
|
178
|
-
export function getUserSessionsKey(config, userId) {
|
|
179
|
-
return `${config.userSessionsKeyPrefix}${userId}`;
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Serializes conversation object for Redis storage
|
|
183
|
-
*/
|
|
184
|
-
export function serializeConversation(conversation) {
|
|
185
|
-
try {
|
|
186
|
-
const serialized = JSON.stringify(conversation);
|
|
187
|
-
return serialized;
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
logger.error("[redisUtils] Failed to serialize conversation", {
|
|
191
|
-
error: error instanceof Error ? error.message : String(error),
|
|
192
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
193
|
-
sessionId: conversation?.sessionId,
|
|
194
|
-
userId: conversation?.userId,
|
|
195
|
-
});
|
|
196
|
-
throw error;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Deserializes conversation object from Redis storage
|
|
201
|
-
*/
|
|
202
|
-
export function deserializeConversation(data) {
|
|
203
|
-
if (!data) {
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
try {
|
|
207
|
-
// Parse as unknown first, then validate before casting
|
|
208
|
-
const parsedData = JSON.parse(String(data));
|
|
209
|
-
// Check if the parsed data is an object with required properties
|
|
210
|
-
if (typeof parsedData !== "object" ||
|
|
211
|
-
parsedData === null ||
|
|
212
|
-
!("title" in parsedData) ||
|
|
213
|
-
!("sessionId" in parsedData) ||
|
|
214
|
-
!("userId" in parsedData) ||
|
|
215
|
-
!("createdAt" in parsedData) ||
|
|
216
|
-
!("updatedAt" in parsedData) ||
|
|
217
|
-
!("messages" in parsedData)) {
|
|
218
|
-
logger.warn("[redisUtils] Deserialized data is not a valid conversation object", {
|
|
219
|
-
type: typeof parsedData,
|
|
220
|
-
hasRequiredFields: parsedData && typeof parsedData === "object"
|
|
221
|
-
? Object.keys(parsedData).join(", ")
|
|
222
|
-
: "none",
|
|
223
|
-
preview: JSON.stringify(parsedData).substring(0, 100),
|
|
224
|
-
});
|
|
225
|
-
return null;
|
|
226
|
-
}
|
|
227
|
-
const conversation = parsedData;
|
|
228
|
-
// Validate messages is an array
|
|
229
|
-
if (!Array.isArray(conversation.messages)) {
|
|
230
|
-
logger.warn("[redisUtils] messages is not an array", {
|
|
231
|
-
type: typeof conversation.messages,
|
|
232
|
-
});
|
|
233
|
-
return null;
|
|
234
|
-
}
|
|
235
|
-
// Validate each message in the messages array
|
|
236
|
-
const isValidHistory = conversation.messages.every((m) => typeof m === "object" &&
|
|
237
|
-
m !== null &&
|
|
238
|
-
"role" in m &&
|
|
239
|
-
"content" in m &&
|
|
240
|
-
typeof m.role === "string" &&
|
|
241
|
-
typeof m.content === "string" &&
|
|
242
|
-
(m.role === "user" ||
|
|
243
|
-
m.role === "assistant" ||
|
|
244
|
-
m.role === "system" ||
|
|
245
|
-
m.role === "tool_call" ||
|
|
246
|
-
m.role === "tool_result"));
|
|
247
|
-
if (!isValidHistory) {
|
|
248
|
-
logger.warn("[redisUtils] Invalid messages structure", {
|
|
249
|
-
messageCount: conversation.messages.length,
|
|
250
|
-
firstMessage: conversation.messages.length > 0
|
|
251
|
-
? JSON.stringify(conversation.messages[0])
|
|
252
|
-
: null,
|
|
253
|
-
});
|
|
254
|
-
return null;
|
|
255
|
-
}
|
|
256
|
-
logger.debug("[redisUtils] Conversation deserialized successfully", {
|
|
257
|
-
sessionId: conversation.sessionId,
|
|
258
|
-
userId: conversation.userId,
|
|
259
|
-
title: conversation.title,
|
|
260
|
-
messageCount: conversation.messages.length,
|
|
261
|
-
createdAt: conversation.createdAt,
|
|
262
|
-
updatedAt: conversation.updatedAt,
|
|
263
|
-
});
|
|
264
|
-
return conversation;
|
|
265
|
-
}
|
|
266
|
-
catch (error) {
|
|
267
|
-
logger.error("[redisUtils] Failed to deserialize conversation", {
|
|
268
|
-
error: error instanceof Error ? error.message : String(error),
|
|
269
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
270
|
-
dataLength: data.length,
|
|
271
|
-
dataPreview: "[REDACTED]", // Prevent exposure of potentially sensitive data
|
|
272
|
-
});
|
|
273
|
-
return null;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Checks if Redis client is healthy
|
|
278
|
-
*/
|
|
279
|
-
export async function isRedisHealthy(client) {
|
|
280
|
-
try {
|
|
281
|
-
const pong = await client.ping();
|
|
282
|
-
return pong === "PONG";
|
|
283
|
-
}
|
|
284
|
-
catch (error) {
|
|
285
|
-
logger.error("Redis health check failed", { error });
|
|
286
|
-
return false;
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* Scan Redis keys matching a pattern without blocking the server
|
|
291
|
-
* This is a non-blocking alternative to the KEYS command
|
|
292
|
-
*
|
|
293
|
-
* @param client Redis client
|
|
294
|
-
* @param pattern Pattern to match keys (e.g. "prefix:*")
|
|
295
|
-
* @param batchSize Number of keys to scan in each iteration (default: 100)
|
|
296
|
-
* @returns Array of keys matching the pattern
|
|
297
|
-
*/
|
|
298
|
-
export async function scanKeys(client, pattern, batchSize = 100) {
|
|
299
|
-
logger.debug("[redisUtils] Starting SCAN operation", {
|
|
300
|
-
pattern,
|
|
301
|
-
batchSize,
|
|
302
|
-
});
|
|
303
|
-
const allKeys = [];
|
|
304
|
-
let cursor = "0";
|
|
305
|
-
let iterations = 0;
|
|
306
|
-
let totalScanned = 0;
|
|
307
|
-
try {
|
|
308
|
-
do {
|
|
309
|
-
iterations++;
|
|
310
|
-
// Use SCAN instead of KEYS to avoid blocking the server
|
|
311
|
-
const result = await client.scan(cursor, {
|
|
312
|
-
MATCH: pattern,
|
|
313
|
-
COUNT: batchSize,
|
|
314
|
-
});
|
|
315
|
-
// Extract cursor and keys from result
|
|
316
|
-
cursor = String(result.cursor);
|
|
317
|
-
const keys = (result.keys || []).map(String);
|
|
318
|
-
// Add keys to result array
|
|
319
|
-
allKeys.push(...keys);
|
|
320
|
-
totalScanned += keys.length;
|
|
321
|
-
logger.debug("[redisUtils] SCAN iteration completed", {
|
|
322
|
-
iteration: iterations,
|
|
323
|
-
currentCursor: cursor,
|
|
324
|
-
keysInBatch: keys.length,
|
|
325
|
-
totalKeysFound: allKeys.length,
|
|
326
|
-
});
|
|
327
|
-
} while (cursor !== "0"); // Continue until cursor is 0
|
|
328
|
-
logger.info("[redisUtils] SCAN operation completed", {
|
|
329
|
-
pattern,
|
|
330
|
-
totalIterations: iterations,
|
|
331
|
-
totalKeysFound: allKeys.length,
|
|
332
|
-
totalScanned,
|
|
333
|
-
});
|
|
334
|
-
return allKeys;
|
|
335
|
-
}
|
|
336
|
-
catch (error) {
|
|
337
|
-
logger.error("[redisUtils] Error during SCAN operation", {
|
|
338
|
-
pattern,
|
|
339
|
-
error: error instanceof Error ? error.message : String(error),
|
|
340
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
341
|
-
});
|
|
342
|
-
throw error;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
/**
|
|
346
|
-
* Get normalized Redis configuration with defaults
|
|
347
|
-
*/
|
|
348
|
-
export function getNormalizedConfig(config) {
|
|
349
|
-
const keyPrefix = config.keyPrefix || "neurolink:conversation:";
|
|
350
|
-
// Intelligent default: derive user sessions prefix from conversation prefix
|
|
351
|
-
const defaultUserSessionsPrefix = keyPrefix.replace(/conversation:?$/, "user:sessions:");
|
|
352
|
-
return {
|
|
353
|
-
host: config.host || "localhost",
|
|
354
|
-
port: config.port || 6379,
|
|
355
|
-
password: config.password || "",
|
|
356
|
-
db: config.db || 0,
|
|
357
|
-
keyPrefix,
|
|
358
|
-
userSessionsKeyPrefix: config.userSessionsKeyPrefix || defaultUserSessionsPrefix,
|
|
359
|
-
ttl: config.ttl || 86400,
|
|
360
|
-
connectionOptions: {
|
|
361
|
-
connectTimeout: 30000,
|
|
362
|
-
lazyConnect: true,
|
|
363
|
-
retryDelayOnFailover: 100,
|
|
364
|
-
maxRetriesPerRequest: 3,
|
|
365
|
-
...config.connectionOptions,
|
|
366
|
-
},
|
|
367
|
-
};
|
|
368
|
-
}
|