@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,98 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Timeout Utilities
|
|
3
|
-
*
|
|
4
|
-
* Wrapper functions for adding timeout protection to async operations.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Error thrown when an operation times out.
|
|
8
|
-
*/
|
|
9
|
-
export class TimeoutError extends Error {
|
|
10
|
-
timeoutMs;
|
|
11
|
-
/**
|
|
12
|
-
* Creates a new TimeoutError.
|
|
13
|
-
*
|
|
14
|
-
* @param message - Error message describing the timeout
|
|
15
|
-
* @param timeoutMs - The timeout duration that was exceeded
|
|
16
|
-
*/
|
|
17
|
-
constructor(message, timeoutMs) {
|
|
18
|
-
super(message);
|
|
19
|
-
this.timeoutMs = timeoutMs;
|
|
20
|
-
this.name = "TimeoutError";
|
|
21
|
-
// Maintains proper stack trace for where error was thrown (V8 engines)
|
|
22
|
-
if (Error.captureStackTrace) {
|
|
23
|
-
Error.captureStackTrace(this, TimeoutError);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Execute a promise with timeout protection.
|
|
29
|
-
*
|
|
30
|
-
* Wraps a promise and rejects with a TimeoutError if the operation
|
|
31
|
-
* takes longer than the specified duration.
|
|
32
|
-
*
|
|
33
|
-
* @param promise - The promise to wrap with timeout
|
|
34
|
-
* @param ms - Maximum time to wait in milliseconds
|
|
35
|
-
* @param message - Optional custom error message for timeout
|
|
36
|
-
* @returns Promise that resolves with the result or rejects on timeout
|
|
37
|
-
* @throws {TimeoutError} If the operation exceeds the timeout duration
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```typescript
|
|
41
|
-
* const result = await withTimeout(
|
|
42
|
-
* fetchData(),
|
|
43
|
-
* 5000,
|
|
44
|
-
* 'Data fetch timed out'
|
|
45
|
-
* );
|
|
46
|
-
* ```
|
|
47
|
-
*
|
|
48
|
-
* @example
|
|
49
|
-
* ```typescript
|
|
50
|
-
* try {
|
|
51
|
-
* const data = await withTimeout(slowOperation(), 3000);
|
|
52
|
-
* } catch (error) {
|
|
53
|
-
* if (error instanceof TimeoutError) {
|
|
54
|
-
* console.log(`Timed out after ${error.timeoutMs}ms`);
|
|
55
|
-
* }
|
|
56
|
-
* }
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
export async function withTimeout(promise, ms, message) {
|
|
60
|
-
let timeoutId;
|
|
61
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
62
|
-
timeoutId = setTimeout(() => {
|
|
63
|
-
reject(new TimeoutError(message || `Operation timed out after ${ms}ms`, ms));
|
|
64
|
-
}, ms);
|
|
65
|
-
});
|
|
66
|
-
try {
|
|
67
|
-
return await Promise.race([promise, timeoutPromise]);
|
|
68
|
-
}
|
|
69
|
-
finally {
|
|
70
|
-
if (timeoutId !== undefined) {
|
|
71
|
-
clearTimeout(timeoutId);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Execute a function with timeout protection.
|
|
77
|
-
*
|
|
78
|
-
* Alternative signature that accepts a function instead of a promise,
|
|
79
|
-
* useful when you want to delay starting the operation.
|
|
80
|
-
*
|
|
81
|
-
* @param fn - Async function to execute
|
|
82
|
-
* @param ms - Maximum time to wait in milliseconds
|
|
83
|
-
* @param message - Optional custom error message for timeout
|
|
84
|
-
* @returns Promise that resolves with the function result or rejects on timeout
|
|
85
|
-
* @throws {TimeoutError} If the operation exceeds the timeout duration
|
|
86
|
-
*
|
|
87
|
-
* @example
|
|
88
|
-
* ```typescript
|
|
89
|
-
* const result = await withTimeoutFn(
|
|
90
|
-
* () => fetchData(),
|
|
91
|
-
* 5000,
|
|
92
|
-
* 'Data fetch timed out'
|
|
93
|
-
* );
|
|
94
|
-
* ```
|
|
95
|
-
*/
|
|
96
|
-
export async function withTimeoutFn(fn, ms, message) {
|
|
97
|
-
return withTimeout(fn(), ms, message);
|
|
98
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Promise-based async mutex for serializing concurrent async operations.
|
|
3
|
-
* No external dependencies — uses a simple FIFO queue of pending resolvers.
|
|
4
|
-
*/
|
|
5
|
-
export class AsyncMutex {
|
|
6
|
-
/** Default timeout for lock-held operations: 30 seconds */
|
|
7
|
-
static DEFAULT_TIMEOUT_MS = 30_000;
|
|
8
|
-
_locked = false;
|
|
9
|
-
_queue = [];
|
|
10
|
-
isLocked() {
|
|
11
|
-
return this._locked;
|
|
12
|
-
}
|
|
13
|
-
async runExclusive(fn, timeoutMs = AsyncMutex.DEFAULT_TIMEOUT_MS) {
|
|
14
|
-
await this._acquire();
|
|
15
|
-
let timer;
|
|
16
|
-
// Store fn()'s promise so we can ensure it settles before releasing the lock,
|
|
17
|
-
// even when the timeout fires first.
|
|
18
|
-
const fnPromise = fn();
|
|
19
|
-
try {
|
|
20
|
-
return await Promise.race([
|
|
21
|
-
fnPromise,
|
|
22
|
-
new Promise((_resolve, reject) => {
|
|
23
|
-
timer = setTimeout(() => reject(new Error(`AsyncMutex: lock-held operation timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
24
|
-
}),
|
|
25
|
-
]);
|
|
26
|
-
}
|
|
27
|
-
finally {
|
|
28
|
-
if (timer !== undefined) {
|
|
29
|
-
clearTimeout(timer);
|
|
30
|
-
}
|
|
31
|
-
// Wait for fn() to settle before releasing the lock.
|
|
32
|
-
// If the timeout fired, fn() may still be running — we must not
|
|
33
|
-
// let another caller acquire the lock until fn() completes.
|
|
34
|
-
await fnPromise.catch((_settleErr) => {
|
|
35
|
-
// Intentionally swallowed — we only await settlement to keep
|
|
36
|
-
// the lock held until fn() finishes. The caller already received
|
|
37
|
-
// the timeout rejection from Promise.race above.
|
|
38
|
-
});
|
|
39
|
-
this._release();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
_acquire() {
|
|
43
|
-
if (!this._locked) {
|
|
44
|
-
this._locked = true;
|
|
45
|
-
return Promise.resolve();
|
|
46
|
-
}
|
|
47
|
-
return new Promise((resolve) => {
|
|
48
|
-
this._queue.push(resolve);
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
_release() {
|
|
52
|
-
const next = this._queue.shift();
|
|
53
|
-
if (next) {
|
|
54
|
-
next();
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
this._locked = false;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
@@ -1,431 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Conversation Memory Utilities
|
|
3
|
-
* Handles configuration merging and conversation memory operations
|
|
4
|
-
*/
|
|
5
|
-
import { SpanKind, SpanStatusCode } from "@opentelemetry/api";
|
|
6
|
-
import { tracers } from "../telemetry/tracers.js";
|
|
7
|
-
import { withTimeout } from "./errorHandling.js";
|
|
8
|
-
import { DEFAULT_FALLBACK_THRESHOLD, getConversationMemoryDefaults, MEMORY_THRESHOLD_PERCENTAGE, } from "../config/conversationMemory.js";
|
|
9
|
-
import { getAvailableInputTokens } from "../constants/contextWindows.js";
|
|
10
|
-
import { buildSummarizationPrompt } from "../context/prompts/summarizationPrompt.js";
|
|
11
|
-
import { logger } from "./logger.js";
|
|
12
|
-
const memoryTracer = tracers.memory;
|
|
13
|
-
// Cached NeuroLink instance for summarization to avoid creating a new instance per call
|
|
14
|
-
let cachedSummarizer = null;
|
|
15
|
-
/**
|
|
16
|
-
* Apply conversation memory defaults to user configuration
|
|
17
|
-
* Merges user config with environment variables and default values
|
|
18
|
-
*/
|
|
19
|
-
export function applyConversationMemoryDefaults(userConfig) {
|
|
20
|
-
const defaults = getConversationMemoryDefaults();
|
|
21
|
-
return {
|
|
22
|
-
...defaults,
|
|
23
|
-
...userConfig,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Get conversation history as message array, summarizing if needed.
|
|
28
|
-
*/
|
|
29
|
-
export async function getConversationMessages(conversationMemory, options) {
|
|
30
|
-
if (!conversationMemory || !options.context) {
|
|
31
|
-
logger.warn("[conversationMemoryUtils] No memory or context, returning empty messages");
|
|
32
|
-
return [];
|
|
33
|
-
}
|
|
34
|
-
const sessionId = options.context?.sessionId;
|
|
35
|
-
if (typeof sessionId !== "string" || !sessionId) {
|
|
36
|
-
logger.warn("[conversationMemoryUtils] Invalid or missing sessionId in context", {
|
|
37
|
-
sessionIdType: typeof sessionId,
|
|
38
|
-
sessionIdValue: sessionId,
|
|
39
|
-
});
|
|
40
|
-
return [];
|
|
41
|
-
}
|
|
42
|
-
return memoryTracer.startActiveSpan("neurolink.conversation.getMessages", {
|
|
43
|
-
kind: SpanKind.INTERNAL,
|
|
44
|
-
attributes: {
|
|
45
|
-
"session.id": sessionId,
|
|
46
|
-
"memory.type": conversationMemory.constructor.name,
|
|
47
|
-
},
|
|
48
|
-
}, async (span) => {
|
|
49
|
-
try {
|
|
50
|
-
// Extract userId from context
|
|
51
|
-
const userId = options.context?.userId;
|
|
52
|
-
if (userId) {
|
|
53
|
-
span.setAttribute("user.id", userId);
|
|
54
|
-
}
|
|
55
|
-
const enableSummarization = options.enableSummarization ?? undefined;
|
|
56
|
-
const messages = await conversationMemory.buildContextMessages(sessionId, userId, enableSummarization);
|
|
57
|
-
span.setAttribute("message.count", messages.length);
|
|
58
|
-
if (logger.shouldLog("debug")) {
|
|
59
|
-
logger.debug("[conversationMemoryUtils] Conversation messages retrieved successfully", {
|
|
60
|
-
sessionId,
|
|
61
|
-
messageCount: messages.length,
|
|
62
|
-
messageTypes: messages.map((m) => m.role),
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
return messages;
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
span.setStatus({
|
|
69
|
-
code: SpanStatusCode.ERROR,
|
|
70
|
-
message: error instanceof Error ? error.message : String(error),
|
|
71
|
-
});
|
|
72
|
-
span.recordException(error instanceof Error ? error : new Error(String(error)));
|
|
73
|
-
logger.warn("[conversationMemoryUtils] Failed to get conversation messages", {
|
|
74
|
-
sessionId,
|
|
75
|
-
memoryType: conversationMemory.constructor.name,
|
|
76
|
-
error: error instanceof Error ? error.message : String(error),
|
|
77
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
78
|
-
});
|
|
79
|
-
return [];
|
|
80
|
-
}
|
|
81
|
-
finally {
|
|
82
|
-
span.end();
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Store conversation turn for future context
|
|
88
|
-
* Saves user messages and AI responses for conversation memory
|
|
89
|
-
*/
|
|
90
|
-
export async function storeConversationTurn(conversationMemory, originalOptions, result, startTimeStamp, requestId) {
|
|
91
|
-
logger.debug("[conversationMemoryUtils] storeConversationTurn called", {
|
|
92
|
-
requestId,
|
|
93
|
-
hasMemory: !!conversationMemory,
|
|
94
|
-
memoryType: conversationMemory?.constructor?.name || "NONE",
|
|
95
|
-
hasContext: !!originalOptions.context,
|
|
96
|
-
hasResult: !!result,
|
|
97
|
-
resultContentLength: result?.content?.length || 0,
|
|
98
|
-
});
|
|
99
|
-
if (!conversationMemory || !originalOptions.context) {
|
|
100
|
-
logger.debug("[conversationMemoryUtils] No memory or context, skipping conversation storage");
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
const context = originalOptions.context;
|
|
104
|
-
const sessionId = context.sessionId;
|
|
105
|
-
const userId = typeof context.userId === "string" ? context.userId : undefined;
|
|
106
|
-
logger.debug("[conversationMemoryUtils] Extracted session details from context", {
|
|
107
|
-
requestId,
|
|
108
|
-
sessionId,
|
|
109
|
-
userId,
|
|
110
|
-
contextKeys: Object.keys(context),
|
|
111
|
-
hasValidSessionId: typeof sessionId === "string" && !!sessionId,
|
|
112
|
-
});
|
|
113
|
-
if (typeof sessionId !== "string" || !sessionId) {
|
|
114
|
-
logger.warn("[conversationMemoryUtils] Invalid or missing sessionId in context", {
|
|
115
|
-
sessionIdType: typeof sessionId,
|
|
116
|
-
sessionIdValue: sessionId,
|
|
117
|
-
});
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
const userMessage = originalOptions.originalPrompt || originalOptions.prompt || "";
|
|
121
|
-
const aiResponse = result.content ?? "";
|
|
122
|
-
// Guard: skip storing conversation turn if AI response is empty AND no tools were used.
|
|
123
|
-
// Empty assistant messages cause "text content blocks must be non-empty" errors
|
|
124
|
-
// when loaded as conversation history on the next interaction.
|
|
125
|
-
// However, tool-only turns (empty text but tools were invoked) must still be stored
|
|
126
|
-
// to preserve tool-calling conversation history.
|
|
127
|
-
const hasToolActivity = (result.toolsUsed && result.toolsUsed.length > 0) ||
|
|
128
|
-
(result.toolExecutions && result.toolExecutions.length > 0);
|
|
129
|
-
if (!aiResponse.trim() && !hasToolActivity) {
|
|
130
|
-
logger.warn("[conversationMemoryUtils] Skipping conversation turn storage — AI response is empty and no tool activity", {
|
|
131
|
-
sessionId,
|
|
132
|
-
userId,
|
|
133
|
-
userMessageLength: userMessage.length,
|
|
134
|
-
});
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
let providerDetails;
|
|
138
|
-
if (result.provider && result.model) {
|
|
139
|
-
providerDetails = {
|
|
140
|
-
provider: result.provider,
|
|
141
|
-
model: result.model,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
await memoryTracer.startActiveSpan("neurolink.conversation.storeTurn", {
|
|
145
|
-
kind: SpanKind.INTERNAL,
|
|
146
|
-
attributes: {
|
|
147
|
-
"session.id": sessionId,
|
|
148
|
-
"content.length": userMessage.length + aiResponse.length,
|
|
149
|
-
},
|
|
150
|
-
}, async (span) => {
|
|
151
|
-
if (userId) {
|
|
152
|
-
span.setAttribute("user.id", userId);
|
|
153
|
-
}
|
|
154
|
-
try {
|
|
155
|
-
await conversationMemory.storeConversationTurn({
|
|
156
|
-
sessionId,
|
|
157
|
-
userId,
|
|
158
|
-
userMessage,
|
|
159
|
-
aiResponse,
|
|
160
|
-
startTimeStamp,
|
|
161
|
-
providerDetails,
|
|
162
|
-
enableSummarization: originalOptions.enableSummarization,
|
|
163
|
-
requestId,
|
|
164
|
-
tokenUsage: result.usage
|
|
165
|
-
? {
|
|
166
|
-
inputTokens: result.usage.input,
|
|
167
|
-
outputTokens: result.usage.output,
|
|
168
|
-
totalTokens: result.usage.total,
|
|
169
|
-
cacheReadTokens: result.usage.cacheReadTokens,
|
|
170
|
-
cacheWriteTokens: result.usage.cacheCreationTokens,
|
|
171
|
-
}
|
|
172
|
-
: undefined,
|
|
173
|
-
});
|
|
174
|
-
logger.debug("[conversationMemoryUtils] Conversation turn stored successfully", {
|
|
175
|
-
requestId,
|
|
176
|
-
sessionId,
|
|
177
|
-
userId,
|
|
178
|
-
memoryType: conversationMemory.constructor.name,
|
|
179
|
-
userMessageLength: userMessage.length,
|
|
180
|
-
aiResponseLength: aiResponse.length,
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
span.setStatus({
|
|
185
|
-
code: SpanStatusCode.ERROR,
|
|
186
|
-
message: error instanceof Error ? error.message : String(error),
|
|
187
|
-
});
|
|
188
|
-
span.recordException(error instanceof Error ? error : new Error(String(error)));
|
|
189
|
-
const details = error?.details;
|
|
190
|
-
logger.warn("[conversationMemoryUtils] Failed to store conversation turn", {
|
|
191
|
-
sessionId,
|
|
192
|
-
userId,
|
|
193
|
-
memoryType: conversationMemory.constructor.name,
|
|
194
|
-
error: error instanceof Error ? error.message : String(error),
|
|
195
|
-
innerError: details?.error || "none",
|
|
196
|
-
errorCode: error?.code || "unknown",
|
|
197
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
finally {
|
|
201
|
-
span.end();
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Build context messages from pointer onwards (token-based memory)
|
|
207
|
-
* Returns summary message (if exists) + all messages after the summarized pointer
|
|
208
|
-
* @param session - Session memory with pointer
|
|
209
|
-
* @returns Context messages to send to LLM
|
|
210
|
-
*/
|
|
211
|
-
export function buildContextFromPointer(session, requestId) {
|
|
212
|
-
if (!session.summarizedUpToMessageId || !session.summarizedMessage) {
|
|
213
|
-
// Log context built for LLM (no summary)
|
|
214
|
-
const totalChars = session.messages.reduce((sum, msg) => sum + msg.content.length, 0);
|
|
215
|
-
logger.info("[ConversationMemory] Context built for LLM", {
|
|
216
|
-
requestId,
|
|
217
|
-
sessionId: session.sessionId,
|
|
218
|
-
contextMessages: session.messages.length,
|
|
219
|
-
summaryPrepended: false,
|
|
220
|
-
estimatedTokens: Math.ceil(totalChars / 4),
|
|
221
|
-
});
|
|
222
|
-
return session.messages;
|
|
223
|
-
}
|
|
224
|
-
// find a better way to wirte this
|
|
225
|
-
const pointerIndex = session.messages.findIndex((msg) => msg.id === session.summarizedUpToMessageId);
|
|
226
|
-
if (pointerIndex === -1) {
|
|
227
|
-
logger.warn("Pointer message not found, returning all messages", {
|
|
228
|
-
sessionId: session.sessionId,
|
|
229
|
-
pointer: session.summarizedUpToMessageId,
|
|
230
|
-
totalMessages: session.messages.length,
|
|
231
|
-
});
|
|
232
|
-
// Log context built for LLM (pointer not found fallback)
|
|
233
|
-
const totalChars = session.messages.reduce((sum, msg) => sum + msg.content.length, 0);
|
|
234
|
-
logger.info("[ConversationMemory] Context built for LLM", {
|
|
235
|
-
requestId,
|
|
236
|
-
sessionId: session.sessionId,
|
|
237
|
-
contextMessages: session.messages.length,
|
|
238
|
-
summaryPrepended: false,
|
|
239
|
-
estimatedTokens: Math.ceil(totalChars / 4),
|
|
240
|
-
});
|
|
241
|
-
return session.messages;
|
|
242
|
-
}
|
|
243
|
-
const messagesAfterPointer = session.messages.slice(pointerIndex + 1);
|
|
244
|
-
// Construct context: summary message + recent messages
|
|
245
|
-
const summaryMessage = {
|
|
246
|
-
id: `summary-${session.summarizedUpToMessageId}`,
|
|
247
|
-
role: "user",
|
|
248
|
-
content: `[Previous conversation summary]: ${session.summarizedMessage}`,
|
|
249
|
-
timestamp: new Date().toISOString(),
|
|
250
|
-
metadata: {
|
|
251
|
-
isSummary: true,
|
|
252
|
-
summarizesTo: session.summarizedUpToMessageId,
|
|
253
|
-
},
|
|
254
|
-
};
|
|
255
|
-
logger.debug("Building context with summary", {
|
|
256
|
-
sessionId: session.sessionId,
|
|
257
|
-
pointerIndex,
|
|
258
|
-
messagesAfterPointer: messagesAfterPointer.length,
|
|
259
|
-
totalMessages: session.messages.length,
|
|
260
|
-
summaryLength: session.summarizedMessage.length,
|
|
261
|
-
});
|
|
262
|
-
const contextMessages = [summaryMessage, ...messagesAfterPointer];
|
|
263
|
-
// Log context built for LLM with structural metadata
|
|
264
|
-
const totalChars = contextMessages.reduce((sum, msg) => sum + msg.content.length, 0);
|
|
265
|
-
logger.info("[ConversationMemory] Context built for LLM", {
|
|
266
|
-
requestId,
|
|
267
|
-
sessionId: session.sessionId,
|
|
268
|
-
contextMessages: contextMessages.length,
|
|
269
|
-
summaryPrepended: true,
|
|
270
|
-
estimatedTokens: Math.ceil(totalChars / 4),
|
|
271
|
-
});
|
|
272
|
-
return contextMessages;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Create summarization prompt from message history
|
|
276
|
-
* Used by both in-memory and Redis conversation managers
|
|
277
|
-
* @param history - Messages to summarize
|
|
278
|
-
* @param previousSummary - Optional previous summary to build upon
|
|
279
|
-
*/
|
|
280
|
-
export function createSummarizationPrompt(history, previousSummary) {
|
|
281
|
-
const formattedHistory = history
|
|
282
|
-
.map((msg) => `${msg.role}: ${msg.content}`)
|
|
283
|
-
.join("\n\n");
|
|
284
|
-
const structuredPrompt = buildSummarizationPrompt({
|
|
285
|
-
isIncremental: !!previousSummary,
|
|
286
|
-
previousSummary,
|
|
287
|
-
});
|
|
288
|
-
return `${structuredPrompt}
|
|
289
|
-
|
|
290
|
-
Conversation History to Summarize:
|
|
291
|
-
---
|
|
292
|
-
${formattedHistory}
|
|
293
|
-
---`;
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Calculate token threshold based on model's context window and available input tokens
|
|
297
|
-
* Uses context window registry for accurate per-provider, per-model limits
|
|
298
|
-
* @param provider - AI provider name
|
|
299
|
-
* @param model - Model name
|
|
300
|
-
* @param maxTokens - Optional explicit maxTokens for output reserve calculation
|
|
301
|
-
* @returns Token threshold (80% of available input tokens)
|
|
302
|
-
*/
|
|
303
|
-
export function calculateTokenThreshold(provider, model, maxTokens) {
|
|
304
|
-
if (!provider) {
|
|
305
|
-
return DEFAULT_FALLBACK_THRESHOLD;
|
|
306
|
-
}
|
|
307
|
-
const availableInput = getAvailableInputTokens(provider, model, maxTokens);
|
|
308
|
-
if (availableInput <= 0) {
|
|
309
|
-
return DEFAULT_FALLBACK_THRESHOLD;
|
|
310
|
-
}
|
|
311
|
-
return Math.floor(availableInput * MEMORY_THRESHOLD_PERCENTAGE);
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Get effective token threshold for a session
|
|
315
|
-
* Priority: session override > env var > model-based (80%) > fallback
|
|
316
|
-
* @param provider - AI provider name
|
|
317
|
-
* @param model - Model name
|
|
318
|
-
* @param envOverride - Environment variable override
|
|
319
|
-
* @param sessionOverride - Per-session token threshold override
|
|
320
|
-
* @returns Effective token threshold
|
|
321
|
-
*/
|
|
322
|
-
export function getEffectiveTokenThreshold(provider, model, envOverride, sessionOverride) {
|
|
323
|
-
// Priority 1: Session-level override
|
|
324
|
-
if (sessionOverride && sessionOverride > 0) {
|
|
325
|
-
return sessionOverride;
|
|
326
|
-
}
|
|
327
|
-
// Priority 2: Environment variable override
|
|
328
|
-
if (envOverride && envOverride > 0) {
|
|
329
|
-
return envOverride;
|
|
330
|
-
}
|
|
331
|
-
// Priority 3: Model-based calculation (80% of context window)
|
|
332
|
-
try {
|
|
333
|
-
return calculateTokenThreshold(provider, model);
|
|
334
|
-
}
|
|
335
|
-
catch (error) {
|
|
336
|
-
logger.warn("Failed to calculate effective threshold, using fallback", {
|
|
337
|
-
provider,
|
|
338
|
-
model,
|
|
339
|
-
error: error instanceof Error ? error.message : String(error),
|
|
340
|
-
});
|
|
341
|
-
// Priority 4: Fallback for unknown models
|
|
342
|
-
return DEFAULT_FALLBACK_THRESHOLD;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
/**
|
|
346
|
-
* Generate summary using configured provider and model
|
|
347
|
-
* Centralized summarization logic used by both ConversationMemoryManager and RedisConversationMemoryManager
|
|
348
|
-
* @param messages - Messages to summarize
|
|
349
|
-
* @param config - Conversation memory configuration containing provider/model settings
|
|
350
|
-
* @param previousSummary - Optional previous summary to build upon
|
|
351
|
-
* @param logPrefix - Prefix for log messages (e.g., "[ConversationMemory]" or "[RedisConversationMemoryManager]")
|
|
352
|
-
* @param requestId - Optional request ID for request-scoped tracing
|
|
353
|
-
* @returns Summary text or null if generation fails
|
|
354
|
-
*/
|
|
355
|
-
export async function generateSummary(messages, config, logPrefix = "[ConversationMemory]", previousSummary, requestId) {
|
|
356
|
-
const summarizationPrompt = createSummarizationPrompt(messages, previousSummary);
|
|
357
|
-
const SUMMARIZER_INIT_TIMEOUT = 15_000;
|
|
358
|
-
const SUMMARIZER_GENERATE_TIMEOUT = 60_000;
|
|
359
|
-
try {
|
|
360
|
-
if (!cachedSummarizer) {
|
|
361
|
-
cachedSummarizer = await withTimeout((async () => {
|
|
362
|
-
const { NeuroLink: NeuroLinkClass } = await import("../neurolink.js");
|
|
363
|
-
return new NeuroLinkClass({
|
|
364
|
-
conversationMemory: { enabled: false },
|
|
365
|
-
});
|
|
366
|
-
})(), SUMMARIZER_INIT_TIMEOUT, new Error("Summarizer initialization timed out"));
|
|
367
|
-
}
|
|
368
|
-
if (!config.summarizationProvider || !config.summarizationModel) {
|
|
369
|
-
logger.error(`${logPrefix} Missing summarization provider`, {
|
|
370
|
-
requestId,
|
|
371
|
-
});
|
|
372
|
-
return null;
|
|
373
|
-
}
|
|
374
|
-
const summaryResult = await withTimeout(cachedSummarizer.generate({
|
|
375
|
-
input: { text: summarizationPrompt },
|
|
376
|
-
provider: config.summarizationProvider,
|
|
377
|
-
model: config.summarizationModel,
|
|
378
|
-
disableTools: true,
|
|
379
|
-
}), SUMMARIZER_GENERATE_TIMEOUT, new Error("Summary generation timed out"));
|
|
380
|
-
return summaryResult.content || null;
|
|
381
|
-
}
|
|
382
|
-
catch (error) {
|
|
383
|
-
logger.error(`${logPrefix} Error generating summary`, { requestId, error });
|
|
384
|
-
return null;
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* Check if Redis is available for conversation memory.
|
|
389
|
-
* Migrated from the deprecated conversationMemoryUtils.ts.
|
|
390
|
-
*/
|
|
391
|
-
export async function checkRedisAvailability() {
|
|
392
|
-
const { createRedisClient, getNormalizedConfig } = await import("./redis.js");
|
|
393
|
-
let testClient = null;
|
|
394
|
-
try {
|
|
395
|
-
const testConfig = getNormalizedConfig({
|
|
396
|
-
host: process.env.REDIS_HOST,
|
|
397
|
-
port: process.env.REDIS_PORT ? Number(process.env.REDIS_PORT) : undefined,
|
|
398
|
-
password: process.env.REDIS_PASSWORD,
|
|
399
|
-
db: process.env.REDIS_DB ? Number(process.env.REDIS_DB) : undefined,
|
|
400
|
-
keyPrefix: process.env.REDIS_KEY_PREFIX,
|
|
401
|
-
ttl: process.env.REDIS_TTL ? Number(process.env.REDIS_TTL) : undefined,
|
|
402
|
-
connectionOptions: {
|
|
403
|
-
connectTimeout: 5000,
|
|
404
|
-
maxRetriesPerRequest: 1,
|
|
405
|
-
retryDelayOnFailover: 100,
|
|
406
|
-
},
|
|
407
|
-
});
|
|
408
|
-
testClient = await createRedisClient(testConfig);
|
|
409
|
-
await testClient.ping();
|
|
410
|
-
logger.debug("Redis connection test successful");
|
|
411
|
-
return true;
|
|
412
|
-
}
|
|
413
|
-
catch (error) {
|
|
414
|
-
logger.debug("Redis connection test failed", {
|
|
415
|
-
error: error instanceof Error ? error.message : String(error),
|
|
416
|
-
});
|
|
417
|
-
return false;
|
|
418
|
-
}
|
|
419
|
-
finally {
|
|
420
|
-
if (testClient) {
|
|
421
|
-
try {
|
|
422
|
-
await testClient.quit();
|
|
423
|
-
}
|
|
424
|
-
catch (quitError) {
|
|
425
|
-
logger.debug("Error during Redis test client disconnect", {
|
|
426
|
-
error: quitError instanceof Error ? quitError.message : String(quitError),
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
}
|