@juspay/neurolink 9.31.2 → 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 +12 -0
- package/dist/auth/AuthProviderFactory.d.ts +71 -0
- package/dist/auth/AuthProviderFactory.js +111 -0
- package/dist/auth/AuthProviderRegistry.d.ts +33 -0
- package/dist/auth/AuthProviderRegistry.js +190 -0
- package/dist/auth/RequestContext.d.ts +23 -0
- package/dist/auth/RequestContext.js +78 -0
- package/dist/auth/anthropicOAuth.js +1 -1
- package/dist/auth/authContext.d.ts +198 -0
- package/dist/auth/authContext.js +314 -0
- package/dist/auth/errors.d.ts +63 -0
- package/dist/auth/errors.js +39 -0
- package/dist/auth/index.d.ts +20 -8
- package/dist/auth/index.js +35 -7
- package/dist/auth/middleware/AuthMiddleware.d.ts +181 -0
- package/dist/auth/middleware/AuthMiddleware.js +519 -0
- package/dist/auth/middleware/rateLimitByUser.d.ts +282 -0
- package/dist/auth/middleware/rateLimitByUser.js +554 -0
- package/dist/auth/providers/BaseAuthProvider.d.ts +259 -0
- package/dist/auth/providers/BaseAuthProvider.js +723 -0
- package/dist/auth/providers/CognitoProvider.d.ts +61 -0
- package/dist/auth/providers/CognitoProvider.js +304 -0
- package/dist/auth/providers/KeycloakProvider.d.ts +61 -0
- package/dist/auth/providers/KeycloakProvider.js +393 -0
- package/dist/auth/providers/auth0.d.ts +59 -0
- package/dist/auth/providers/auth0.js +274 -0
- package/dist/auth/providers/betterAuth.d.ts +51 -0
- package/dist/auth/providers/betterAuth.js +182 -0
- package/dist/auth/providers/clerk.d.ts +65 -0
- package/dist/auth/providers/clerk.js +317 -0
- package/dist/auth/providers/custom.d.ts +64 -0
- package/dist/auth/providers/custom.js +112 -0
- package/dist/auth/providers/firebase.d.ts +63 -0
- package/dist/auth/providers/firebase.js +226 -0
- package/dist/auth/providers/jwt.d.ts +68 -0
- package/dist/auth/providers/jwt.js +212 -0
- package/dist/auth/providers/oauth2.d.ts +73 -0
- package/dist/auth/providers/oauth2.js +303 -0
- package/dist/auth/providers/supabase.d.ts +63 -0
- package/dist/auth/providers/supabase.js +259 -0
- package/dist/auth/providers/workos.d.ts +61 -0
- package/dist/auth/providers/workos.js +284 -0
- package/dist/auth/serverBridge.d.ts +14 -0
- package/dist/auth/serverBridge.js +25 -0
- package/dist/auth/sessionManager.d.ts +142 -0
- package/dist/auth/sessionManager.js +437 -0
- package/dist/cli/commands/authProviders.d.ts +43 -0
- package/dist/cli/commands/authProviders.js +399 -0
- package/dist/cli/commands/proxy.js +18 -5
- package/dist/cli/factories/authCommandFactory.d.ts +23 -5
- package/dist/cli/factories/authCommandFactory.js +108 -5
- package/dist/cli/parser.js +1 -1
- package/dist/client/aiSdkAdapter.js +1 -1
- package/dist/client/index.js +138 -477
- package/dist/core/factory.js +0 -1
- package/dist/core/infrastructure/baseRegistry.d.ts +3 -1
- package/dist/core/infrastructure/baseRegistry.js +5 -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/index.d.ts +1 -0
- package/dist/index.js +25 -0
- package/dist/lib/auth/AuthProviderFactory.d.ts +71 -0
- package/dist/lib/auth/AuthProviderFactory.js +112 -0
- package/dist/lib/auth/AuthProviderRegistry.d.ts +33 -0
- package/dist/lib/auth/AuthProviderRegistry.js +191 -0
- package/dist/lib/auth/RequestContext.d.ts +23 -0
- package/dist/lib/auth/RequestContext.js +79 -0
- package/dist/lib/auth/authContext.d.ts +198 -0
- package/dist/lib/auth/authContext.js +315 -0
- package/dist/lib/auth/errors.d.ts +63 -0
- package/dist/lib/auth/errors.js +40 -0
- package/dist/lib/auth/index.d.ts +20 -8
- package/dist/lib/auth/index.js +35 -7
- package/dist/lib/auth/middleware/AuthMiddleware.d.ts +181 -0
- package/dist/lib/auth/middleware/AuthMiddleware.js +520 -0
- package/dist/lib/auth/middleware/rateLimitByUser.d.ts +282 -0
- package/dist/lib/auth/middleware/rateLimitByUser.js +555 -0
- package/dist/lib/auth/providers/BaseAuthProvider.d.ts +259 -0
- package/dist/lib/auth/providers/BaseAuthProvider.js +724 -0
- package/dist/lib/auth/providers/CognitoProvider.d.ts +61 -0
- package/dist/lib/auth/providers/CognitoProvider.js +305 -0
- package/dist/lib/auth/providers/KeycloakProvider.d.ts +61 -0
- package/dist/lib/auth/providers/KeycloakProvider.js +394 -0
- package/dist/lib/auth/providers/auth0.d.ts +59 -0
- package/dist/lib/auth/providers/auth0.js +275 -0
- package/dist/lib/auth/providers/betterAuth.d.ts +51 -0
- package/dist/lib/auth/providers/betterAuth.js +183 -0
- package/dist/lib/auth/providers/clerk.d.ts +65 -0
- package/dist/lib/auth/providers/clerk.js +318 -0
- package/dist/lib/auth/providers/custom.d.ts +64 -0
- package/dist/lib/auth/providers/custom.js +113 -0
- package/dist/lib/auth/providers/firebase.d.ts +63 -0
- package/dist/lib/auth/providers/firebase.js +227 -0
- package/dist/lib/auth/providers/jwt.d.ts +68 -0
- package/dist/lib/auth/providers/jwt.js +213 -0
- package/dist/lib/auth/providers/oauth2.d.ts +73 -0
- package/dist/lib/auth/providers/oauth2.js +304 -0
- package/dist/lib/auth/providers/supabase.d.ts +63 -0
- package/dist/lib/auth/providers/supabase.js +260 -0
- package/dist/lib/auth/providers/workos.d.ts +61 -0
- package/dist/lib/auth/providers/workos.js +285 -0
- package/dist/lib/auth/serverBridge.d.ts +14 -0
- package/dist/lib/auth/serverBridge.js +26 -0
- package/dist/lib/auth/sessionManager.d.ts +142 -0
- package/dist/lib/auth/sessionManager.js +438 -0
- package/dist/lib/core/infrastructure/baseRegistry.d.ts +3 -1
- package/dist/lib/core/infrastructure/baseRegistry.js +5 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +25 -0
- package/dist/lib/mcp/toolRegistry.js +11 -1
- package/dist/lib/neurolink.d.ts +42 -1
- package/dist/lib/neurolink.js +218 -0
- package/dist/lib/rag/ChunkerRegistry.js +2 -2
- package/dist/lib/rag/metadata/MetadataExtractorRegistry.js +2 -2
- package/dist/lib/rag/reranker/RerankerRegistry.js +2 -2
- package/dist/lib/server/routes/agentRoutes.js +20 -2
- package/dist/lib/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/lib/types/authTypes.d.ts +937 -1
- package/dist/lib/types/authTypes.js +2 -1
- package/dist/lib/types/configTypes.d.ts +46 -0
- package/dist/lib/types/generateTypes.d.ts +6 -0
- package/dist/lib/types/index.d.ts +1 -0
- package/dist/lib/types/streamTypes.d.ts +6 -0
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- package/dist/mcp/toolRegistry.js +11 -1
- package/dist/neurolink.d.ts +42 -1
- package/dist/neurolink.js +218 -0
- package/dist/providers/azureOpenai.js +1 -1
- package/dist/providers/huggingFace.js +0 -1
- package/dist/providers/openaiCompatible.js +0 -1
- package/dist/rag/ChunkerRegistry.js +2 -2
- package/dist/rag/metadata/MetadataExtractorRegistry.js +2 -2
- package/dist/rag/reranker/RerankerRegistry.js +2 -2
- package/dist/sdk/toolRegistration.js +0 -1
- package/dist/server/openapi/generator.js +1 -1
- package/dist/server/routes/agentRoutes.js +20 -2
- package/dist/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/types/authTypes.d.ts +937 -1
- package/dist/types/authTypes.js +2 -1
- package/dist/types/configTypes.d.ts +46 -0
- package/dist/types/configTypes.js +0 -5
- package/dist/types/generateTypes.d.ts +6 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/modelTypes.js +0 -1
- package/dist/types/streamTypes.d.ts +6 -0
- package/dist/types/tools.js +0 -1
- package/dist/types/typeAliases.js +0 -1
- package/dist/types/utilities.js +1 -1
- package/dist/types/workflowTypes.js +0 -1
- package/dist/utils/providerRetry.js +0 -1
- package/dist/utils/providerUtils.js +0 -1
- package/package.json +3 -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/anthropicOAuth.js +0 -974
- 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 -49
- 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 -719
- 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 -8015
- 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 -171
- 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 -8
- 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,344 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Conversation Memory Manager for NeuroLink
|
|
3
|
-
* Handles in-memory conversation storage, session management, and context injection
|
|
4
|
-
*/
|
|
5
|
-
import { randomUUID } from "crypto";
|
|
6
|
-
import { DEFAULT_MAX_SESSIONS, MEMORY_THRESHOLD_PERCENTAGE, MESSAGES_PER_TURN, } from "../config/conversationMemory.js";
|
|
7
|
-
import { TokenUtils } from "../constants/tokens.js";
|
|
8
|
-
import { SummarizationEngine } from "../context/summarizationEngine.js";
|
|
9
|
-
import { runWithCurrentLangfuseContext } from "../services/server/ai/observability/instrumentation.js";
|
|
10
|
-
import { tracers, withSpan } from "../telemetry/index.js";
|
|
11
|
-
import { ConversationMemoryError } from "../types/conversation.js";
|
|
12
|
-
import { buildContextFromPointer, getEffectiveTokenThreshold, } from "../utils/conversationMemory.js";
|
|
13
|
-
import { logger } from "../utils/logger.js";
|
|
14
|
-
export class ConversationMemoryManager {
|
|
15
|
-
sessions = new Map();
|
|
16
|
-
config;
|
|
17
|
-
isInitialized = false;
|
|
18
|
-
summarizationEngine = new SummarizationEngine();
|
|
19
|
-
/**
|
|
20
|
-
* Track sessions currently being summarized to prevent race conditions
|
|
21
|
-
*/
|
|
22
|
-
summarizationInProgress = new Set();
|
|
23
|
-
constructor(config) {
|
|
24
|
-
this.config = config;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Initialize the memory manager
|
|
28
|
-
*/
|
|
29
|
-
async initialize() {
|
|
30
|
-
if (this.isInitialized) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
try {
|
|
34
|
-
this.isInitialized = true;
|
|
35
|
-
logger.info("ConversationMemoryManager initialized", {
|
|
36
|
-
storage: "in-memory",
|
|
37
|
-
maxSessions: this.config.maxSessions,
|
|
38
|
-
maxTurnsPerSession: this.config.maxTurnsPerSession,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
throw new ConversationMemoryError("Failed to initialize conversation memory", "CONFIG_ERROR", {
|
|
43
|
-
error: error instanceof Error ? error.message : String(error),
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/** Whether this memory manager can persist data (always true for in-memory within process) */
|
|
48
|
-
get canPersist() {
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
/** Whether Redis client is configured (always false for in-memory) */
|
|
52
|
-
get isRedisConfigured() {
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
/** Get health status for monitoring */
|
|
56
|
-
getHealthStatus() {
|
|
57
|
-
return {
|
|
58
|
-
initialized: this.isInitialized,
|
|
59
|
-
connected: false,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Store a conversation turn for a session
|
|
64
|
-
* TOKEN-BASED: Validates message size and triggers summarization based on tokens
|
|
65
|
-
*/
|
|
66
|
-
async storeConversationTurn(options) {
|
|
67
|
-
return withSpan({
|
|
68
|
-
name: "neurolink.memory.storeTurn",
|
|
69
|
-
tracer: tracers.memory,
|
|
70
|
-
attributes: {
|
|
71
|
-
"memory.type": "in-memory",
|
|
72
|
-
"session.id": options.sessionId,
|
|
73
|
-
"memory.operation": "store_turn",
|
|
74
|
-
},
|
|
75
|
-
}, async (span) => {
|
|
76
|
-
await this.ensureInitialized();
|
|
77
|
-
try {
|
|
78
|
-
// Get or create session
|
|
79
|
-
let session = this.sessions.get(options.sessionId);
|
|
80
|
-
if (!session) {
|
|
81
|
-
session = this.createNewSession(options.sessionId, options.userId);
|
|
82
|
-
this.sessions.set(options.sessionId, session);
|
|
83
|
-
}
|
|
84
|
-
const tokenThreshold = options.providerDetails
|
|
85
|
-
? getEffectiveTokenThreshold(options.providerDetails.provider, options.providerDetails.model, this.config.tokenThreshold, session.tokenThreshold)
|
|
86
|
-
: this.config.tokenThreshold || 50000;
|
|
87
|
-
const userMsg = await this.validateAndPrepareMessage(options.userMessage, "user", tokenThreshold);
|
|
88
|
-
const assistantMsg = await this.validateAndPrepareMessage(options.aiResponse, "assistant", tokenThreshold);
|
|
89
|
-
if (options.events && options.events.length > 0) {
|
|
90
|
-
assistantMsg.events = options.events;
|
|
91
|
-
}
|
|
92
|
-
session.messages.push(userMsg, assistantMsg);
|
|
93
|
-
session.lastActivity = Date.now();
|
|
94
|
-
// Store API-reported token counts if available
|
|
95
|
-
if (options.tokenUsage) {
|
|
96
|
-
session.lastApiTokenCount = options.tokenUsage;
|
|
97
|
-
}
|
|
98
|
-
span.setAttribute("memory.message_count", session.messages.length);
|
|
99
|
-
const shouldSummarize = options.enableSummarization !== undefined
|
|
100
|
-
? options.enableSummarization
|
|
101
|
-
: this.config.enableSummarization;
|
|
102
|
-
if (shouldSummarize) {
|
|
103
|
-
// Only trigger summarization if not already in progress for this session
|
|
104
|
-
if (!this.summarizationInProgress.has(options.sessionId)) {
|
|
105
|
-
// Capture the current Langfuse ALS context before setImmediate,
|
|
106
|
-
// which breaks automatic AsyncLocalStorage propagation and would
|
|
107
|
-
// otherwise cause orphaned traces in Langfuse.
|
|
108
|
-
const summarizeWithContext = runWithCurrentLangfuseContext(async () => {
|
|
109
|
-
try {
|
|
110
|
-
await this.checkAndSummarize(session, tokenThreshold, options.requestId);
|
|
111
|
-
}
|
|
112
|
-
catch (error) {
|
|
113
|
-
logger.error("Background summarization failed", {
|
|
114
|
-
sessionId: session.sessionId,
|
|
115
|
-
requestId: options.requestId,
|
|
116
|
-
error: error instanceof Error ? error.message : String(error),
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
setImmediate(summarizeWithContext);
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
logger.debug("[ConversationMemoryManager] Summarization already in progress, skipping", {
|
|
124
|
-
sessionId: options.sessionId,
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
this.enforceSessionLimit();
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
throw new ConversationMemoryError(`Failed to store conversation turn for session ${options.sessionId}`, "STORAGE_ERROR", {
|
|
132
|
-
sessionId: options.sessionId,
|
|
133
|
-
error: error instanceof Error ? error.message : String(error),
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Validate and prepare a message before adding to session
|
|
140
|
-
* Truncates if message exceeds token limit
|
|
141
|
-
*/
|
|
142
|
-
async validateAndPrepareMessage(content, role, threshold) {
|
|
143
|
-
const id = randomUUID();
|
|
144
|
-
const tokenCount = TokenUtils.estimateTokenCount(content);
|
|
145
|
-
const maxMessageSize = Math.floor(threshold * MEMORY_THRESHOLD_PERCENTAGE);
|
|
146
|
-
if (tokenCount > maxMessageSize) {
|
|
147
|
-
const truncated = TokenUtils.truncateToTokenLimit(content, maxMessageSize);
|
|
148
|
-
logger.warn("Message truncated due to token limit", {
|
|
149
|
-
id,
|
|
150
|
-
role,
|
|
151
|
-
originalTokens: tokenCount,
|
|
152
|
-
threshold,
|
|
153
|
-
truncatedTo: maxMessageSize,
|
|
154
|
-
});
|
|
155
|
-
return {
|
|
156
|
-
id,
|
|
157
|
-
role,
|
|
158
|
-
content: truncated,
|
|
159
|
-
timestamp: new Date().toISOString(),
|
|
160
|
-
metadata: {
|
|
161
|
-
truncated: true,
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
return {
|
|
166
|
-
id,
|
|
167
|
-
role,
|
|
168
|
-
content,
|
|
169
|
-
timestamp: new Date().toISOString(),
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Check if summarization is needed based on token count
|
|
174
|
-
*/
|
|
175
|
-
async checkAndSummarize(session, threshold, requestId) {
|
|
176
|
-
// Acquire lock - if already in progress, skip
|
|
177
|
-
if (this.summarizationInProgress.has(session.sessionId)) {
|
|
178
|
-
logger.debug("[ConversationMemoryManager] Summarization already in progress, skipping", {
|
|
179
|
-
sessionId: session.sessionId,
|
|
180
|
-
});
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
this.summarizationInProgress.add(session.sessionId);
|
|
184
|
-
try {
|
|
185
|
-
await this.summarizationEngine.checkAndSummarize(session, threshold, this.config, "[ConversationMemory]", requestId);
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
logger.error("Token counting or summarization failed", {
|
|
189
|
-
sessionId: session.sessionId,
|
|
190
|
-
error: error instanceof Error ? error.message : String(error),
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
finally {
|
|
194
|
-
// Release lock when done
|
|
195
|
-
this.summarizationInProgress.delete(session.sessionId);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Estimate total tokens for a list of messages
|
|
200
|
-
*/
|
|
201
|
-
estimateTokens(messages) {
|
|
202
|
-
return messages.reduce((total, msg) => {
|
|
203
|
-
let msgTokens = TokenUtils.estimateTokenCount(msg.content);
|
|
204
|
-
if (msg.events && Array.isArray(msg.events) && msg.events.length > 0) {
|
|
205
|
-
const eventsJson = JSON.stringify(msg.events);
|
|
206
|
-
msgTokens += TokenUtils.estimateTokenCount(eventsJson);
|
|
207
|
-
}
|
|
208
|
-
return total + msgTokens;
|
|
209
|
-
}, 0);
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Build context messages for AI prompt injection (TOKEN-BASED)
|
|
213
|
-
* Returns messages from pointer onwards (or all if no pointer)
|
|
214
|
-
* Now consistently async to match Redis implementation
|
|
215
|
-
*/
|
|
216
|
-
async buildContextMessages(sessionId, _userId, _enableSummarization, requestId) {
|
|
217
|
-
return withSpan({
|
|
218
|
-
name: "neurolink.memory.buildContext",
|
|
219
|
-
tracer: tracers.memory,
|
|
220
|
-
attributes: {
|
|
221
|
-
"memory.type": "in-memory",
|
|
222
|
-
"session.id": sessionId,
|
|
223
|
-
"memory.operation": "build_context",
|
|
224
|
-
},
|
|
225
|
-
}, async (span) => {
|
|
226
|
-
const session = this.sessions.get(sessionId);
|
|
227
|
-
const messages = session
|
|
228
|
-
? buildContextFromPointer(session, requestId)
|
|
229
|
-
: [];
|
|
230
|
-
span.setAttribute("memory.message_count", messages.length);
|
|
231
|
-
return messages;
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
getSession(sessionId, _userId) {
|
|
235
|
-
return this.sessions.get(sessionId);
|
|
236
|
-
}
|
|
237
|
-
createSummarySystemMessage(content, summarizesFrom, summarizesTo) {
|
|
238
|
-
return {
|
|
239
|
-
id: `summary-${randomUUID()}`,
|
|
240
|
-
role: "system",
|
|
241
|
-
content: `Summary of previous conversation turns:\n\n${content}`,
|
|
242
|
-
timestamp: new Date().toISOString(),
|
|
243
|
-
metadata: {
|
|
244
|
-
isSummary: true,
|
|
245
|
-
summarizesFrom,
|
|
246
|
-
summarizesTo,
|
|
247
|
-
},
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
async ensureInitialized() {
|
|
251
|
-
if (!this.isInitialized) {
|
|
252
|
-
await this.initialize();
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
createNewSession(sessionId, userId) {
|
|
256
|
-
return {
|
|
257
|
-
sessionId,
|
|
258
|
-
userId,
|
|
259
|
-
messages: [],
|
|
260
|
-
createdAt: Date.now(),
|
|
261
|
-
lastActivity: Date.now(),
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
enforceSessionLimit() {
|
|
265
|
-
const maxSessions = this.config.maxSessions || DEFAULT_MAX_SESSIONS;
|
|
266
|
-
if (this.sessions.size <= maxSessions) {
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
const sessions = Array.from(this.sessions.entries()).sort(([, a], [, b]) => a.lastActivity - b.lastActivity);
|
|
270
|
-
const sessionsToRemove = sessions.slice(0, this.sessions.size - maxSessions);
|
|
271
|
-
for (const [sessionId] of sessionsToRemove) {
|
|
272
|
-
this.sessions.delete(sessionId);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
async getStats() {
|
|
276
|
-
await this.ensureInitialized();
|
|
277
|
-
const sessions = Array.from(this.sessions.values());
|
|
278
|
-
const totalTurns = sessions.reduce((sum, session) => sum + session.messages.length / MESSAGES_PER_TURN, 0);
|
|
279
|
-
return {
|
|
280
|
-
totalSessions: sessions.length,
|
|
281
|
-
totalTurns,
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
async clearSession(sessionId) {
|
|
285
|
-
return withSpan({
|
|
286
|
-
name: "neurolink.memory.clear",
|
|
287
|
-
tracer: tracers.memory,
|
|
288
|
-
attributes: {
|
|
289
|
-
"memory.type": "in-memory",
|
|
290
|
-
"session.id": sessionId,
|
|
291
|
-
"memory.operation": "clear_session",
|
|
292
|
-
},
|
|
293
|
-
}, async (span) => {
|
|
294
|
-
const session = this.sessions.get(sessionId);
|
|
295
|
-
if (!session) {
|
|
296
|
-
span.setAttribute("memory.session_found", false);
|
|
297
|
-
return false;
|
|
298
|
-
}
|
|
299
|
-
this.sessions.delete(sessionId);
|
|
300
|
-
span.setAttribute("memory.session_found", true);
|
|
301
|
-
logger.info("Session cleared", { sessionId });
|
|
302
|
-
return true;
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
async clearAllSessions() {
|
|
306
|
-
const sessionIds = Array.from(this.sessions.keys());
|
|
307
|
-
this.sessions.clear();
|
|
308
|
-
logger.info("All sessions cleared", { clearedCount: sessionIds.length });
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Get the raw messages array for a session.
|
|
312
|
-
* Returns the full messages list without context filtering or summarization.
|
|
313
|
-
* Returns a deep copy to prevent external mutation of internal state.
|
|
314
|
-
*/
|
|
315
|
-
async getSessionMessages(sessionId, _userId) {
|
|
316
|
-
await this.ensureInitialized();
|
|
317
|
-
const session = this.sessions.get(sessionId);
|
|
318
|
-
return session ? session.messages.map((msg) => ({ ...msg })) : [];
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Replace the entire messages array for a session.
|
|
322
|
-
* Creates the session if it does not exist.
|
|
323
|
-
* Resets summary pointers since old pointers may reference messages that no longer exist.
|
|
324
|
-
*/
|
|
325
|
-
async setSessionMessages(sessionId, messages, userId) {
|
|
326
|
-
await this.ensureInitialized();
|
|
327
|
-
let session = this.sessions.get(sessionId);
|
|
328
|
-
if (!session) {
|
|
329
|
-
session = this.createNewSession(sessionId, userId);
|
|
330
|
-
this.sessions.set(sessionId, session);
|
|
331
|
-
this.enforceSessionLimit();
|
|
332
|
-
}
|
|
333
|
-
session.messages = [...messages];
|
|
334
|
-
session.summarizedUpToMessageId = undefined;
|
|
335
|
-
session.summarizedMessage = undefined;
|
|
336
|
-
session.lastTokenCount = undefined;
|
|
337
|
-
session.lastCountedAt = undefined;
|
|
338
|
-
session.lastActivity = Date.now();
|
|
339
|
-
}
|
|
340
|
-
/** Close/shutdown — no-op for in-memory manager (no external connections to release) */
|
|
341
|
-
async close() {
|
|
342
|
-
// In-memory manager has nothing to close
|
|
343
|
-
}
|
|
344
|
-
}
|
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { isAbortError } from "../utils/errorHandling.js";
|
|
3
|
-
import { logger } from "../utils/logger.js";
|
|
4
|
-
/**
|
|
5
|
-
* Model configuration schema for validation
|
|
6
|
-
*/
|
|
7
|
-
const ModelConfigSchema = z.object({
|
|
8
|
-
id: z.string(),
|
|
9
|
-
displayName: z.string(),
|
|
10
|
-
capabilities: z.array(z.string()),
|
|
11
|
-
deprecated: z.boolean(),
|
|
12
|
-
pricing: z.object({
|
|
13
|
-
input: z.number(),
|
|
14
|
-
output: z.number(),
|
|
15
|
-
}),
|
|
16
|
-
contextWindow: z.number(),
|
|
17
|
-
releaseDate: z.string(),
|
|
18
|
-
});
|
|
19
|
-
const ModelRegistrySchema = z.object({
|
|
20
|
-
version: z.string(),
|
|
21
|
-
lastUpdated: z.string(),
|
|
22
|
-
models: z.record(z.string(), z.record(z.string(), ModelConfigSchema)),
|
|
23
|
-
aliases: z.record(z.string(), z.string()).optional(),
|
|
24
|
-
defaults: z.record(z.string(), z.string()).optional(),
|
|
25
|
-
});
|
|
26
|
-
/**
|
|
27
|
-
* Dynamic Model Provider
|
|
28
|
-
* Loads and manages model configurations from external sources
|
|
29
|
-
*/
|
|
30
|
-
export class DynamicModelProvider {
|
|
31
|
-
static instance;
|
|
32
|
-
modelRegistry = null;
|
|
33
|
-
lastFetch = 0;
|
|
34
|
-
CACHE_DURATION = 5 * 60 * 1000; // 5 minutes
|
|
35
|
-
constructor() { }
|
|
36
|
-
static getInstance() {
|
|
37
|
-
if (!this.instance) {
|
|
38
|
-
this.instance = new DynamicModelProvider();
|
|
39
|
-
}
|
|
40
|
-
return this.instance;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Initialize the model registry from multiple sources with timeout handling
|
|
44
|
-
* Addresses hanging issues when localhost:3001 is not running or GitHub URLs timeout
|
|
45
|
-
*/
|
|
46
|
-
async initialize() {
|
|
47
|
-
const sources = [
|
|
48
|
-
{
|
|
49
|
-
url: process.env.MODEL_CONFIG_URL || "http://localhost:3001/api/v1/models",
|
|
50
|
-
timeout: 3000, // 3s for localhost
|
|
51
|
-
name: "local-server",
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
url: `https://raw.githubusercontent.com/${process.env.MODEL_CONFIG_GITHUB_REPO || "juspay/neurolink"}/${process.env.MODEL_CONFIG_GITHUB_BRANCH || "release"}/config/models.json`,
|
|
55
|
-
timeout: 5000, // 5s for GitHub
|
|
56
|
-
name: "github-raw",
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
url: "./config/models.json",
|
|
60
|
-
timeout: 1000, // 1s for local file
|
|
61
|
-
name: "local-file",
|
|
62
|
-
},
|
|
63
|
-
];
|
|
64
|
-
const errors = [];
|
|
65
|
-
for (const source of sources) {
|
|
66
|
-
try {
|
|
67
|
-
logger.debug(`[DynamicModelProvider] Attempting to load from: ${source.url} (timeout: ${source.timeout}ms)`);
|
|
68
|
-
const config = await this.loadFromSourceWithTimeout(source.url, source.timeout);
|
|
69
|
-
// Validate the configuration
|
|
70
|
-
const validatedConfig = ModelRegistrySchema.parse(config);
|
|
71
|
-
this.modelRegistry = validatedConfig;
|
|
72
|
-
this.lastFetch = Date.now();
|
|
73
|
-
logger.info(`[DynamicModelProvider] Successfully loaded model registry from: ${source.name}`, {
|
|
74
|
-
source: source.url,
|
|
75
|
-
modelCount: this.getTotalModelCount(),
|
|
76
|
-
providerCount: Object.keys(validatedConfig.models).length,
|
|
77
|
-
loadTime: `<${source.timeout}ms`,
|
|
78
|
-
});
|
|
79
|
-
return; // Success, stop trying other sources
|
|
80
|
-
}
|
|
81
|
-
catch (error) {
|
|
82
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
83
|
-
errors.push({ source: source.name, error: errorMessage });
|
|
84
|
-
logger.warn(`[DynamicModelProvider] Failed to load from ${source.name} (${source.url}):`, {
|
|
85
|
-
error: errorMessage,
|
|
86
|
-
timeout: source.timeout,
|
|
87
|
-
});
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
// Log all failures for debugging
|
|
92
|
-
logger.warn(`[DynamicModelProvider] All model configuration sources failed`, { errors });
|
|
93
|
-
throw new Error(`Failed to load model configuration from all source. Attempted: ${errors.map((e) => e.source).join(", ")}`);
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Load configuration from a source with timeout handling
|
|
97
|
-
* Prevents hanging when local servers are down or network requests timeout
|
|
98
|
-
*/
|
|
99
|
-
async loadFromSourceWithTimeout(source, timeoutMs) {
|
|
100
|
-
if (source.startsWith("http")) {
|
|
101
|
-
// Setup timeout and abort controller
|
|
102
|
-
const controller = new AbortController();
|
|
103
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
104
|
-
try {
|
|
105
|
-
// Add health check for localhost before attempting full request
|
|
106
|
-
if (source.includes("localhost") || source.includes("127.0.0.1")) {
|
|
107
|
-
await this.healthCheckLocalhost(source, Math.min(timeoutMs, 1000));
|
|
108
|
-
}
|
|
109
|
-
const response = await fetch(source, {
|
|
110
|
-
headers: {
|
|
111
|
-
"User-Agent": "NeuroLink/1.0 (+https://github.com/juspay/neurolink)",
|
|
112
|
-
Accept: "application/json",
|
|
113
|
-
"Cache-Control": "no-cache",
|
|
114
|
-
},
|
|
115
|
-
signal: controller.signal,
|
|
116
|
-
});
|
|
117
|
-
clearTimeout(timeoutId);
|
|
118
|
-
if (!response.ok) {
|
|
119
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
120
|
-
}
|
|
121
|
-
const data = await response.json();
|
|
122
|
-
return data;
|
|
123
|
-
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
clearTimeout(timeoutId);
|
|
126
|
-
if (isAbortError(error)) {
|
|
127
|
-
throw new Error(`Request timeout after ${timeoutMs}ms`, {
|
|
128
|
-
cause: error,
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
throw error;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
// Load from local file with timeout (for very large files)
|
|
136
|
-
return new Promise((resolve, reject) => {
|
|
137
|
-
const timeoutId = setTimeout(() => {
|
|
138
|
-
reject(new Error(`File read timeout after ${timeoutMs}ms`));
|
|
139
|
-
}, timeoutMs);
|
|
140
|
-
(async () => {
|
|
141
|
-
try {
|
|
142
|
-
const fs = await import("fs");
|
|
143
|
-
const path = await import("path");
|
|
144
|
-
const fullPath = path.resolve(source);
|
|
145
|
-
// Check if file exists first
|
|
146
|
-
if (!fs.existsSync(fullPath)) {
|
|
147
|
-
throw new Error(`File not found: ${fullPath}`);
|
|
148
|
-
}
|
|
149
|
-
const content = fs.readFileSync(fullPath, "utf8");
|
|
150
|
-
const data = JSON.parse(content);
|
|
151
|
-
clearTimeout(timeoutId);
|
|
152
|
-
resolve(data);
|
|
153
|
-
}
|
|
154
|
-
catch (error) {
|
|
155
|
-
clearTimeout(timeoutId);
|
|
156
|
-
reject(error);
|
|
157
|
-
}
|
|
158
|
-
})();
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Quick health check for localhost endpoints
|
|
164
|
-
* Prevents hanging on non-responsive local servers
|
|
165
|
-
*/
|
|
166
|
-
async healthCheckLocalhost(url, timeoutMs) {
|
|
167
|
-
const healthUrl = url.replace(/\/api\/.*$/, "/health") || `${url}/health`;
|
|
168
|
-
const controller = new AbortController();
|
|
169
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
170
|
-
try {
|
|
171
|
-
const response = await fetch(healthUrl, {
|
|
172
|
-
method: "HEAD", // Lightweight request
|
|
173
|
-
signal: controller.signal,
|
|
174
|
-
});
|
|
175
|
-
clearTimeout(timeoutId);
|
|
176
|
-
// Don't throw on 404 - the main endpoint might still work
|
|
177
|
-
if (response.status >= 500) {
|
|
178
|
-
throw new Error(`Server error: ${response.status}`);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
catch (error) {
|
|
182
|
-
clearTimeout(timeoutId);
|
|
183
|
-
if (isAbortError(error)) {
|
|
184
|
-
throw new Error(`Localhost health check timeout - server may not be running`, { cause: error });
|
|
185
|
-
}
|
|
186
|
-
// For connection refused, throw a more specific error
|
|
187
|
-
if (error instanceof Error && error.message.includes("ECONNREFUSED")) {
|
|
188
|
-
throw new Error(`Localhost server not running at ${url}`, {
|
|
189
|
-
cause: error,
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
// For other errors, let the main request handle them
|
|
193
|
-
logger.debug(`Health check failed for ${url}, proceeding with main request`, {
|
|
194
|
-
error: error instanceof Error ? error.message : String(error),
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Get all available models for a provider
|
|
200
|
-
*/
|
|
201
|
-
getModelsForProvider(provider) {
|
|
202
|
-
this.ensureInitialized();
|
|
203
|
-
return this.modelRegistry?.models[provider] || {};
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Resolve a model by provider and model hint
|
|
207
|
-
*/
|
|
208
|
-
resolveModel(provider, modelHint) {
|
|
209
|
-
this.ensureInitialized();
|
|
210
|
-
const providerModels = this.getModelsForProvider(provider);
|
|
211
|
-
if (!modelHint) {
|
|
212
|
-
// Use default model for provider
|
|
213
|
-
const defaultModel = this.modelRegistry?.defaults?.[provider];
|
|
214
|
-
return defaultModel ? providerModels[defaultModel] : null;
|
|
215
|
-
}
|
|
216
|
-
// Check for exact match
|
|
217
|
-
if (providerModels[modelHint]) {
|
|
218
|
-
return providerModels[modelHint];
|
|
219
|
-
}
|
|
220
|
-
// Check aliases
|
|
221
|
-
const aliasTarget = this.modelRegistry?.aliases?.[modelHint];
|
|
222
|
-
if (aliasTarget) {
|
|
223
|
-
const [aliasProvider, aliasModel] = aliasTarget.split("/");
|
|
224
|
-
return this.resolveModel(aliasProvider, aliasModel);
|
|
225
|
-
}
|
|
226
|
-
// Fuzzy matching (partial string match)
|
|
227
|
-
const fuzzyMatch = Object.keys(providerModels).find((key) => key.toLowerCase().includes(modelHint.toLowerCase()) ||
|
|
228
|
-
modelHint.toLowerCase().includes(key.toLowerCase()));
|
|
229
|
-
return fuzzyMatch ? providerModels[fuzzyMatch] : null;
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Search models by capabilities
|
|
233
|
-
*/
|
|
234
|
-
searchByCapability(capability, options = {}) {
|
|
235
|
-
this.ensureInitialized();
|
|
236
|
-
const results = [];
|
|
237
|
-
if (!this.modelRegistry) {
|
|
238
|
-
return results;
|
|
239
|
-
}
|
|
240
|
-
for (const [providerName, models] of Object.entries(this.modelRegistry.models)) {
|
|
241
|
-
if (options.provider && providerName !== options.provider) {
|
|
242
|
-
continue;
|
|
243
|
-
}
|
|
244
|
-
for (const [modelName, modelConfig] of Object.entries(models)) {
|
|
245
|
-
if (options.excludeDeprecated && modelConfig.deprecated) {
|
|
246
|
-
continue;
|
|
247
|
-
}
|
|
248
|
-
if (options.maxPrice && modelConfig.pricing.input > options.maxPrice) {
|
|
249
|
-
continue;
|
|
250
|
-
}
|
|
251
|
-
if (!modelConfig.capabilities.includes(capability)) {
|
|
252
|
-
continue;
|
|
253
|
-
}
|
|
254
|
-
results.push({
|
|
255
|
-
provider: providerName,
|
|
256
|
-
model: modelName,
|
|
257
|
-
config: modelConfig,
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// Sort by price (cheapest first)
|
|
262
|
-
return results.sort((a, b) => a.config.pricing.input - b.config.pricing.input);
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Get the best model for a specific use case
|
|
266
|
-
*/
|
|
267
|
-
getBestModelFor(useCase) {
|
|
268
|
-
this.ensureInitialized();
|
|
269
|
-
switch (useCase) {
|
|
270
|
-
case "coding":
|
|
271
|
-
return (this.searchByCapability("functionCalling", {
|
|
272
|
-
excludeDeprecated: true,
|
|
273
|
-
})[0] || null);
|
|
274
|
-
case "analysis":
|
|
275
|
-
return (this.searchByCapability("analysis", { excludeDeprecated: true })[0] ||
|
|
276
|
-
null);
|
|
277
|
-
case "vision":
|
|
278
|
-
return (this.searchByCapability("vision", { excludeDeprecated: true })[0] ||
|
|
279
|
-
null);
|
|
280
|
-
case "fastest":
|
|
281
|
-
// Return cheapest as proxy for fastest (usually correlates)
|
|
282
|
-
return (this.getAllModels()
|
|
283
|
-
.filter((m) => !m.config.deprecated)
|
|
284
|
-
.sort((a, b) => a.config.pricing.input - b.config.pricing.input)[0] || null);
|
|
285
|
-
case "cheapest":
|
|
286
|
-
return (this.getAllModels()
|
|
287
|
-
.filter((m) => !m.config.deprecated)
|
|
288
|
-
.sort((a, b) => a.config.pricing.input - b.config.pricing.input)[0] || null);
|
|
289
|
-
default:
|
|
290
|
-
return null;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Get all models across all providers
|
|
295
|
-
*/
|
|
296
|
-
getAllModels() {
|
|
297
|
-
this.ensureInitialized();
|
|
298
|
-
const results = [];
|
|
299
|
-
if (!this.modelRegistry) {
|
|
300
|
-
return results;
|
|
301
|
-
}
|
|
302
|
-
for (const [providerName, models] of Object.entries(this.modelRegistry.models)) {
|
|
303
|
-
for (const [modelName, modelConfig] of Object.entries(models)) {
|
|
304
|
-
results.push({
|
|
305
|
-
provider: providerName,
|
|
306
|
-
model: modelName,
|
|
307
|
-
config: modelConfig,
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
return results;
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Get total number of models
|
|
315
|
-
*/
|
|
316
|
-
getTotalModelCount() {
|
|
317
|
-
if (!this.modelRegistry) {
|
|
318
|
-
return 0;
|
|
319
|
-
}
|
|
320
|
-
return Object.values(this.modelRegistry.models).reduce((total, providerModels) => total + Object.keys(providerModels).length, 0);
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Check if cache needs refresh
|
|
324
|
-
*/
|
|
325
|
-
needsRefresh() {
|
|
326
|
-
return Date.now() - this.lastFetch > this.CACHE_DURATION;
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Force refresh the model registry
|
|
330
|
-
*/
|
|
331
|
-
async refresh() {
|
|
332
|
-
this.modelRegistry = null;
|
|
333
|
-
await this.initialize();
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Ensure the registry is initialized
|
|
337
|
-
*/
|
|
338
|
-
ensureInitialized() {
|
|
339
|
-
if (!this.modelRegistry) {
|
|
340
|
-
throw new Error("Model registry not initialized. Call initialize() first.");
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Get registry metadata
|
|
345
|
-
*/
|
|
346
|
-
getMetadata() {
|
|
347
|
-
if (!this.modelRegistry) {
|
|
348
|
-
return null;
|
|
349
|
-
}
|
|
350
|
-
return {
|
|
351
|
-
version: this.modelRegistry.version,
|
|
352
|
-
lastUpdated: this.modelRegistry.lastUpdated,
|
|
353
|
-
modelCount: this.getTotalModelCount(),
|
|
354
|
-
};
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
// Export singleton instance
|
|
358
|
-
export const dynamicModelProvider = DynamicModelProvider.getInstance();
|