@juspay/neurolink 9.5.2 → 9.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/README.md +29 -25
- package/dist/agent/directTools.d.ts +5 -5
- package/dist/cli/commands/config.d.ts +9 -9
- package/dist/cli/commands/serve.d.ts +37 -0
- package/dist/cli/commands/serve.js +302 -229
- package/dist/cli/commands/setup-anthropic.d.ts +2 -2
- package/dist/cli/commands/setup-azure.d.ts +2 -2
- package/dist/cli/commands/setup-bedrock.d.ts +2 -2
- package/dist/cli/commands/setup-gcp.d.ts +2 -2
- package/dist/cli/commands/setup-google-ai.d.ts +2 -2
- package/dist/cli/commands/setup-huggingface.d.ts +2 -2
- package/dist/cli/commands/setup-mistral.d.ts +2 -2
- package/dist/cli/commands/setup-openai.d.ts +2 -2
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/factories/commandFactory.js +16 -2
- package/dist/cli/loop/optionsSchema.d.ts +2 -2
- package/dist/cli/loop/session.d.ts +4 -0
- package/dist/cli/loop/session.js +49 -4
- package/dist/cli/utils/interactiveSetup.d.ts +4 -4
- package/dist/config/conversationMemory.d.ts +2 -0
- package/dist/config/conversationMemory.js +5 -5
- package/dist/constants/contextWindows.d.ts +46 -0
- package/dist/constants/contextWindows.js +156 -0
- package/dist/context/budgetChecker.d.ts +18 -0
- package/dist/context/budgetChecker.js +71 -0
- package/dist/context/contextCompactor.d.ts +22 -0
- package/dist/context/contextCompactor.js +106 -0
- package/dist/context/effectiveHistory.d.ts +52 -0
- package/dist/context/effectiveHistory.js +105 -0
- package/dist/context/errorDetection.d.ts +14 -0
- package/dist/context/errorDetection.js +124 -0
- package/dist/context/fileSummarizationService.d.ts +54 -0
- package/dist/context/fileSummarizationService.js +255 -0
- package/dist/context/fileSummarizer.d.ts +56 -0
- package/dist/context/fileSummarizer.js +145 -0
- package/dist/context/fileTokenBudget.d.ts +53 -0
- package/dist/context/fileTokenBudget.js +127 -0
- package/dist/context/prompts/summarizationPrompt.d.ts +17 -0
- package/dist/context/prompts/summarizationPrompt.js +110 -0
- package/dist/context/stages/fileReadDeduplicator.d.ts +10 -0
- package/dist/context/stages/fileReadDeduplicator.js +66 -0
- package/dist/context/stages/slidingWindowTruncator.d.ts +11 -0
- package/dist/context/stages/slidingWindowTruncator.js +42 -0
- package/dist/context/stages/structuredSummarizer.d.ts +10 -0
- package/dist/context/stages/structuredSummarizer.js +49 -0
- package/dist/context/stages/toolOutputPruner.d.ts +10 -0
- package/dist/context/stages/toolOutputPruner.js +52 -0
- package/dist/context/summarizationEngine.d.ts +45 -0
- package/dist/context/summarizationEngine.js +110 -0
- package/dist/context/toolOutputLimits.d.ts +17 -0
- package/dist/context/toolOutputLimits.js +84 -0
- package/dist/context/toolPairRepair.d.ts +16 -0
- package/dist/context/toolPairRepair.js +66 -0
- package/dist/core/conversationMemoryManager.d.ts +5 -15
- package/dist/core/conversationMemoryManager.js +15 -75
- package/dist/core/modules/MessageBuilder.d.ts +1 -1
- package/dist/core/modules/MessageBuilder.js +2 -0
- package/dist/core/modules/TelemetryHandler.d.ts +2 -3
- package/dist/core/modules/TelemetryHandler.js +3 -3
- package/dist/core/modules/ToolsManager.d.ts +2 -2
- package/dist/core/redisConversationMemoryManager.d.ts +8 -14
- package/dist/core/redisConversationMemoryManager.js +69 -78
- package/dist/factories/providerFactory.d.ts +2 -2
- package/dist/files/fileReferenceRegistry.d.ts +276 -0
- package/dist/files/fileReferenceRegistry.js +1543 -0
- package/dist/files/fileTools.d.ts +423 -0
- package/dist/files/fileTools.js +449 -0
- package/dist/files/index.d.ts +14 -0
- package/dist/files/index.js +13 -0
- package/dist/files/streamingReader.d.ts +93 -0
- package/dist/files/streamingReader.js +321 -0
- package/dist/files/types.d.ts +23 -0
- package/dist/files/types.js +23 -0
- package/dist/image-gen/imageGenTools.d.ts +2 -2
- package/dist/image-gen/types.d.ts +12 -12
- package/dist/lib/agent/directTools.d.ts +7 -7
- package/dist/lib/config/conversationMemory.d.ts +2 -0
- package/dist/lib/config/conversationMemory.js +5 -5
- package/dist/lib/constants/contextWindows.d.ts +46 -0
- package/dist/lib/constants/contextWindows.js +157 -0
- package/dist/lib/context/budgetChecker.d.ts +18 -0
- package/dist/lib/context/budgetChecker.js +72 -0
- package/dist/lib/context/contextCompactor.d.ts +22 -0
- package/dist/lib/context/contextCompactor.js +107 -0
- package/dist/lib/context/effectiveHistory.d.ts +52 -0
- package/dist/lib/context/effectiveHistory.js +106 -0
- package/dist/lib/context/errorDetection.d.ts +14 -0
- package/dist/lib/context/errorDetection.js +125 -0
- package/dist/lib/context/fileSummarizationService.d.ts +54 -0
- package/dist/lib/context/fileSummarizationService.js +256 -0
- package/dist/lib/context/fileSummarizer.d.ts +56 -0
- package/dist/lib/context/fileSummarizer.js +146 -0
- package/dist/lib/context/fileTokenBudget.d.ts +53 -0
- package/dist/lib/context/fileTokenBudget.js +128 -0
- package/dist/lib/context/prompts/summarizationPrompt.d.ts +17 -0
- package/dist/lib/context/prompts/summarizationPrompt.js +111 -0
- package/dist/lib/context/stages/fileReadDeduplicator.d.ts +10 -0
- package/dist/lib/context/stages/fileReadDeduplicator.js +67 -0
- package/dist/lib/context/stages/slidingWindowTruncator.d.ts +11 -0
- package/dist/lib/context/stages/slidingWindowTruncator.js +43 -0
- package/dist/lib/context/stages/structuredSummarizer.d.ts +10 -0
- package/dist/lib/context/stages/structuredSummarizer.js +50 -0
- package/dist/lib/context/stages/toolOutputPruner.d.ts +10 -0
- package/dist/lib/context/stages/toolOutputPruner.js +53 -0
- package/dist/lib/context/summarizationEngine.d.ts +45 -0
- package/dist/lib/context/summarizationEngine.js +111 -0
- package/dist/lib/context/toolOutputLimits.d.ts +17 -0
- package/dist/lib/context/toolOutputLimits.js +85 -0
- package/dist/lib/context/toolPairRepair.d.ts +16 -0
- package/dist/lib/context/toolPairRepair.js +67 -0
- package/dist/lib/core/conversationMemoryManager.d.ts +5 -15
- package/dist/lib/core/conversationMemoryManager.js +15 -75
- package/dist/lib/core/modules/MessageBuilder.d.ts +1 -1
- package/dist/lib/core/modules/MessageBuilder.js +2 -0
- package/dist/lib/core/modules/TelemetryHandler.d.ts +2 -3
- package/dist/lib/core/modules/TelemetryHandler.js +3 -3
- package/dist/lib/core/modules/ToolsManager.d.ts +2 -2
- package/dist/lib/core/redisConversationMemoryManager.d.ts +8 -14
- package/dist/lib/core/redisConversationMemoryManager.js +69 -78
- package/dist/lib/factories/providerFactory.d.ts +2 -2
- package/dist/lib/files/fileReferenceRegistry.d.ts +276 -0
- package/dist/lib/files/fileReferenceRegistry.js +1544 -0
- package/dist/lib/files/fileTools.d.ts +423 -0
- package/dist/lib/files/fileTools.js +450 -0
- package/dist/lib/files/index.d.ts +14 -0
- package/dist/lib/files/index.js +14 -0
- package/dist/lib/files/streamingReader.d.ts +93 -0
- package/dist/lib/files/streamingReader.js +322 -0
- package/dist/lib/files/types.d.ts +23 -0
- package/dist/lib/files/types.js +24 -0
- package/dist/lib/image-gen/imageGenTools.d.ts +2 -2
- package/dist/lib/image-gen/types.d.ts +12 -12
- package/dist/lib/memory/mem0Initializer.d.ts +2 -2
- package/dist/lib/neurolink.d.ts +61 -2
- package/dist/lib/neurolink.js +619 -307
- package/dist/lib/processors/archive/ArchiveProcessor.d.ts +327 -0
- package/dist/lib/processors/archive/ArchiveProcessor.js +1309 -0
- package/dist/lib/processors/archive/index.d.ts +33 -0
- package/dist/lib/processors/archive/index.js +43 -0
- package/dist/lib/processors/base/types.d.ts +70 -64
- package/dist/lib/processors/base/types.js +6 -0
- package/dist/lib/processors/cli/fileProcessorCli.d.ts +8 -8
- package/dist/lib/processors/cli/fileProcessorCli.js +5 -5
- package/dist/lib/processors/config/mimeTypes.js +25 -0
- package/dist/lib/processors/config/sizeLimits.d.ts +52 -40
- package/dist/lib/processors/config/sizeLimits.js +56 -44
- package/dist/lib/processors/document/ExcelProcessor.d.ts +14 -0
- package/dist/lib/processors/document/ExcelProcessor.js +72 -1
- package/dist/lib/processors/document/PptxProcessor.d.ts +63 -0
- package/dist/lib/processors/document/PptxProcessor.js +158 -0
- package/dist/lib/processors/document/index.d.ts +1 -0
- package/dist/lib/processors/document/index.js +6 -0
- package/dist/lib/processors/errors/FileErrorCode.d.ts +2 -2
- package/dist/lib/processors/errors/errorHelpers.d.ts +2 -2
- package/dist/lib/processors/errors/errorSerializer.d.ts +4 -4
- package/dist/lib/processors/index.d.ts +8 -2
- package/dist/lib/processors/index.js +5 -2
- package/dist/lib/processors/integration/FileProcessorIntegration.d.ts +8 -8
- package/dist/lib/processors/integration/FileProcessorIntegration.js +7 -7
- package/dist/lib/processors/media/AudioProcessor.d.ts +328 -0
- package/dist/lib/processors/media/AudioProcessor.js +708 -0
- package/dist/lib/processors/media/VideoProcessor.d.ts +350 -0
- package/dist/lib/processors/media/VideoProcessor.js +992 -0
- package/dist/lib/processors/media/index.d.ts +27 -0
- package/dist/lib/processors/media/index.js +37 -0
- package/dist/lib/processors/registry/ProcessorRegistry.d.ts +19 -5
- package/dist/lib/processors/registry/ProcessorRegistry.js +103 -8
- package/dist/lib/processors/registry/index.d.ts +1 -1
- package/dist/lib/processors/registry/index.js +1 -1
- package/dist/lib/processors/registry/types.d.ts +2 -2
- package/dist/lib/providers/googleAiStudio.d.ts +34 -0
- package/dist/lib/providers/googleAiStudio.js +267 -397
- package/dist/lib/providers/googleVertex.d.ts +55 -1
- package/dist/lib/providers/googleVertex.js +452 -719
- package/dist/lib/providers/sagemaker/detection.d.ts +6 -6
- package/dist/lib/providers/sagemaker/diagnostics.d.ts +4 -4
- package/dist/lib/providers/sagemaker/parsers.d.ts +4 -4
- package/dist/lib/rag/chunkers/RecursiveChunker.js +2 -2
- package/dist/lib/rag/document/loaders.d.ts +6 -71
- package/dist/lib/rag/document/loaders.js +5 -5
- package/dist/lib/rag/graphRag/graphRAG.js +26 -9
- package/dist/lib/rag/metadata/MetadataExtractorFactory.d.ts +5 -55
- package/dist/lib/rag/metadata/metadataExtractor.js +6 -3
- package/dist/lib/rag/pipeline/RAGPipeline.d.ts +8 -126
- package/dist/lib/rag/pipeline/RAGPipeline.js +11 -11
- package/dist/lib/rag/pipeline/contextAssembly.d.ts +3 -42
- package/dist/lib/rag/pipeline/contextAssembly.js +6 -3
- package/dist/lib/rag/reranker/RerankerFactory.d.ts +5 -60
- package/dist/lib/rag/resilience/CircuitBreaker.d.ts +3 -33
- package/dist/lib/rag/resilience/RetryHandler.d.ts +2 -21
- package/dist/lib/rag/retrieval/hybridSearch.d.ts +3 -41
- package/dist/lib/rag/retrieval/vectorQueryTool.d.ts +2 -13
- package/dist/lib/rag/retrieval/vectorQueryTool.js +4 -3
- package/dist/lib/rag/types.d.ts +3 -3
- package/dist/lib/sdk/toolRegistration.d.ts +2 -2
- package/dist/lib/server/middleware/cache.d.ts +2 -2
- package/dist/lib/server/middleware/rateLimit.d.ts +2 -2
- package/dist/lib/server/routes/mcpRoutes.js +277 -249
- package/dist/lib/server/routes/memoryRoutes.js +287 -281
- package/dist/lib/server/utils/validation.d.ts +10 -10
- package/dist/lib/session/globalSessionState.d.ts +2 -2
- package/dist/lib/telemetry/telemetryService.d.ts +2 -2
- package/dist/lib/types/common.d.ts +39 -0
- package/dist/lib/types/contextTypes.d.ts +255 -0
- package/dist/lib/types/contextTypes.js +0 -2
- package/dist/lib/types/conversation.d.ts +62 -0
- package/dist/lib/types/conversationMemoryInterface.d.ts +27 -0
- package/dist/lib/types/conversationMemoryInterface.js +7 -0
- package/dist/lib/types/fileReferenceTypes.d.ts +222 -0
- package/dist/lib/types/fileReferenceTypes.js +9 -0
- package/dist/lib/types/fileTypes.d.ts +26 -3
- package/dist/lib/types/generateTypes.d.ts +22 -1
- package/dist/lib/types/index.d.ts +4 -5
- package/dist/lib/types/index.js +8 -10
- package/dist/lib/types/modelTypes.d.ts +2 -2
- package/dist/lib/types/processorTypes.d.ts +597 -0
- package/dist/lib/types/processorTypes.js +91 -0
- package/dist/lib/types/ragTypes.d.ts +481 -0
- package/dist/lib/types/ragTypes.js +8 -0
- package/dist/lib/types/sdkTypes.d.ts +17 -18
- package/dist/lib/types/streamTypes.d.ts +11 -1
- package/dist/lib/utils/async/retry.d.ts +2 -2
- package/dist/lib/utils/async/withTimeout.js +3 -1
- package/dist/lib/utils/conversationMemory.d.ts +12 -6
- package/dist/lib/utils/conversationMemory.js +76 -36
- package/dist/lib/utils/fileDetector.d.ts +62 -0
- package/dist/lib/utils/fileDetector.js +1014 -14
- package/dist/lib/utils/json/safeParse.d.ts +2 -2
- package/dist/lib/utils/messageBuilder.js +806 -153
- package/dist/lib/utils/modelChoices.d.ts +2 -2
- package/dist/lib/utils/multimodalOptionsBuilder.d.ts +2 -1
- package/dist/lib/utils/multimodalOptionsBuilder.js +1 -0
- package/dist/lib/utils/rateLimiter.d.ts +2 -2
- package/dist/lib/utils/sanitizers/filename.d.ts +4 -4
- package/dist/lib/utils/sanitizers/svg.d.ts +2 -2
- package/dist/lib/utils/thinkingConfig.d.ts +6 -6
- package/dist/lib/utils/tokenEstimation.d.ts +68 -0
- package/dist/lib/utils/tokenEstimation.js +113 -0
- package/dist/lib/utils/tokenUtils.d.ts +4 -4
- package/dist/lib/utils/ttsProcessor.d.ts +2 -2
- package/dist/lib/workflow/config.d.ts +150 -150
- package/dist/memory/mem0Initializer.d.ts +2 -2
- package/dist/neurolink.d.ts +61 -2
- package/dist/neurolink.js +619 -307
- package/dist/processors/archive/ArchiveProcessor.d.ts +327 -0
- package/dist/processors/archive/ArchiveProcessor.js +1308 -0
- package/dist/processors/archive/index.d.ts +33 -0
- package/dist/processors/archive/index.js +42 -0
- package/dist/processors/base/types.d.ts +70 -64
- package/dist/processors/base/types.js +6 -0
- package/dist/processors/cli/fileProcessorCli.d.ts +8 -8
- package/dist/processors/cli/fileProcessorCli.js +5 -5
- package/dist/processors/config/mimeTypes.js +25 -0
- package/dist/processors/config/sizeLimits.d.ts +52 -40
- package/dist/processors/config/sizeLimits.js +56 -44
- package/dist/processors/document/ExcelProcessor.d.ts +14 -0
- package/dist/processors/document/ExcelProcessor.js +72 -1
- package/dist/processors/document/PptxProcessor.d.ts +63 -0
- package/dist/processors/document/PptxProcessor.js +157 -0
- package/dist/processors/document/index.d.ts +1 -0
- package/dist/processors/document/index.js +6 -0
- package/dist/processors/errors/FileErrorCode.d.ts +2 -2
- package/dist/processors/errors/errorHelpers.d.ts +2 -2
- package/dist/processors/errors/errorSerializer.d.ts +4 -4
- package/dist/processors/index.d.ts +8 -2
- package/dist/processors/index.js +5 -2
- package/dist/processors/integration/FileProcessorIntegration.d.ts +8 -8
- package/dist/processors/integration/FileProcessorIntegration.js +7 -7
- package/dist/processors/media/AudioProcessor.d.ts +328 -0
- package/dist/processors/media/AudioProcessor.js +707 -0
- package/dist/processors/media/VideoProcessor.d.ts +350 -0
- package/dist/processors/media/VideoProcessor.js +991 -0
- package/dist/processors/media/ffprobe-static.d.ts +4 -0
- package/dist/processors/media/index.d.ts +27 -0
- package/dist/processors/media/index.js +36 -0
- package/dist/processors/registry/ProcessorRegistry.d.ts +19 -5
- package/dist/processors/registry/ProcessorRegistry.js +103 -8
- package/dist/processors/registry/index.d.ts +1 -1
- package/dist/processors/registry/index.js +1 -1
- package/dist/processors/registry/types.d.ts +2 -2
- package/dist/providers/googleAiStudio.d.ts +34 -0
- package/dist/providers/googleAiStudio.js +267 -397
- package/dist/providers/googleVertex.d.ts +55 -1
- package/dist/providers/googleVertex.js +452 -719
- package/dist/providers/sagemaker/detection.d.ts +6 -6
- package/dist/providers/sagemaker/diagnostics.d.ts +4 -4
- package/dist/providers/sagemaker/parsers.d.ts +4 -4
- package/dist/rag/chunkers/RecursiveChunker.js +2 -2
- package/dist/rag/document/loaders.d.ts +6 -71
- package/dist/rag/document/loaders.js +5 -5
- package/dist/rag/graphRag/graphRAG.js +26 -9
- package/dist/rag/metadata/MetadataExtractorFactory.d.ts +5 -55
- package/dist/rag/metadata/metadataExtractor.js +6 -3
- package/dist/rag/pipeline/RAGPipeline.d.ts +8 -126
- package/dist/rag/pipeline/RAGPipeline.js +11 -11
- package/dist/rag/pipeline/contextAssembly.d.ts +3 -42
- package/dist/rag/pipeline/contextAssembly.js +6 -3
- package/dist/rag/reranker/RerankerFactory.d.ts +5 -60
- package/dist/rag/resilience/CircuitBreaker.d.ts +3 -33
- package/dist/rag/resilience/RetryHandler.d.ts +2 -21
- package/dist/rag/retrieval/hybridSearch.d.ts +3 -41
- package/dist/rag/retrieval/vectorQueryTool.d.ts +2 -13
- package/dist/rag/retrieval/vectorQueryTool.js +4 -3
- package/dist/rag/types.d.ts +3 -3
- package/dist/sdk/toolRegistration.d.ts +2 -2
- package/dist/server/middleware/cache.d.ts +2 -2
- package/dist/server/middleware/rateLimit.d.ts +2 -2
- package/dist/server/routes/mcpRoutes.js +277 -249
- package/dist/server/routes/memoryRoutes.js +287 -281
- package/dist/server/utils/validation.d.ts +4 -4
- package/dist/session/globalSessionState.d.ts +2 -2
- package/dist/telemetry/telemetryService.d.ts +2 -2
- package/dist/types/common.d.ts +39 -0
- package/dist/types/contextTypes.d.ts +255 -0
- package/dist/types/contextTypes.js +0 -2
- package/dist/types/conversation.d.ts +62 -0
- package/dist/types/conversationMemoryInterface.d.ts +27 -0
- package/dist/types/conversationMemoryInterface.js +6 -0
- package/dist/types/fileReferenceTypes.d.ts +222 -0
- package/dist/types/fileReferenceTypes.js +8 -0
- package/dist/types/fileTypes.d.ts +26 -3
- package/dist/types/generateTypes.d.ts +22 -1
- package/dist/types/index.d.ts +4 -5
- package/dist/types/index.js +8 -10
- package/dist/types/processorTypes.d.ts +597 -0
- package/dist/types/processorTypes.js +90 -0
- package/dist/types/ragTypes.d.ts +481 -0
- package/dist/types/ragTypes.js +7 -0
- package/dist/types/sdkTypes.d.ts +17 -18
- package/dist/types/streamTypes.d.ts +11 -1
- package/dist/utils/async/retry.d.ts +2 -2
- package/dist/utils/async/withTimeout.js +3 -1
- package/dist/utils/conversationMemory.d.ts +12 -6
- package/dist/utils/conversationMemory.js +76 -36
- package/dist/utils/fileDetector.d.ts +62 -0
- package/dist/utils/fileDetector.js +1014 -14
- package/dist/utils/json/safeParse.d.ts +2 -2
- package/dist/utils/messageBuilder.js +806 -153
- package/dist/utils/modelChoices.d.ts +2 -2
- package/dist/utils/multimodalOptionsBuilder.d.ts +2 -1
- package/dist/utils/multimodalOptionsBuilder.js +1 -0
- package/dist/utils/rateLimiter.d.ts +2 -2
- package/dist/utils/sanitizers/filename.d.ts +4 -4
- package/dist/utils/sanitizers/svg.d.ts +2 -2
- package/dist/utils/thinkingConfig.d.ts +6 -6
- package/dist/utils/tokenEstimation.d.ts +68 -0
- package/dist/utils/tokenEstimation.js +112 -0
- package/dist/utils/tokenUtils.d.ts +4 -4
- package/dist/utils/ttsProcessor.d.ts +2 -2
- package/dist/workflow/config.d.ts +104 -104
- package/package.json +18 -6
- package/dist/lib/utils/conversationMemoryUtils.d.ts +0 -25
- package/dist/lib/utils/conversationMemoryUtils.js +0 -138
- package/dist/utils/conversationMemoryUtils.d.ts +0 -25
- package/dist/utils/conversationMemoryUtils.js +0 -137
|
@@ -3,6 +3,286 @@
|
|
|
3
3
|
* Endpoints for conversation memory management
|
|
4
4
|
*/
|
|
5
5
|
import { createErrorResponse, IdParamSchema, SessionIdParamSchema, validateParams, } from "../utils/validation.js";
|
|
6
|
+
/**
|
|
7
|
+
* Handler: Get messages for a session
|
|
8
|
+
*/
|
|
9
|
+
async function handleGetSessionMessages(ctx) {
|
|
10
|
+
// Validate path params
|
|
11
|
+
const paramValidation = validateParams(IdParamSchema, ctx.params, ctx.requestId);
|
|
12
|
+
if (!paramValidation.success) {
|
|
13
|
+
return paramValidation.error;
|
|
14
|
+
}
|
|
15
|
+
const { id: sessionId } = paramValidation.data;
|
|
16
|
+
// Parse query params for pagination
|
|
17
|
+
const limitParam = ctx.query.limit ? parseInt(ctx.query.limit, 10) : 50;
|
|
18
|
+
const offsetParam = ctx.query.offset ? parseInt(ctx.query.offset, 10) : 0;
|
|
19
|
+
// Validate pagination params
|
|
20
|
+
const limit = isNaN(limitParam) || limitParam < 1 ? 50 : Math.min(limitParam, 100);
|
|
21
|
+
const offset = isNaN(offsetParam) || offsetParam < 0 ? 0 : offsetParam;
|
|
22
|
+
const memory = ctx.neurolink.conversationMemory;
|
|
23
|
+
if (!memory) {
|
|
24
|
+
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
let messages = [];
|
|
28
|
+
// Handle Redis memory manager (has getUserSessionHistory)
|
|
29
|
+
if ("getUserSessionHistory" in memory) {
|
|
30
|
+
// For Redis, we need a userId - check query params or use a default
|
|
31
|
+
const userId = ctx.query.userId || "default";
|
|
32
|
+
const sessionMessages = await memory.getUserSessionHistory(userId, sessionId);
|
|
33
|
+
if (sessionMessages === null) {
|
|
34
|
+
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found`, undefined, ctx.requestId);
|
|
35
|
+
}
|
|
36
|
+
messages = sessionMessages;
|
|
37
|
+
}
|
|
38
|
+
// Handle in-memory manager (has getSession)
|
|
39
|
+
else if ("getSession" in memory) {
|
|
40
|
+
const session = memory.getSession(sessionId);
|
|
41
|
+
if (!session) {
|
|
42
|
+
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found`, undefined, ctx.requestId);
|
|
43
|
+
}
|
|
44
|
+
messages = session.messages;
|
|
45
|
+
}
|
|
46
|
+
// Fallback: try buildContextMessages if available
|
|
47
|
+
else if ("buildContextMessages" in memory) {
|
|
48
|
+
messages = await memory.buildContextMessages(sessionId);
|
|
49
|
+
// If no messages, session might not exist
|
|
50
|
+
if (messages.length === 0) {
|
|
51
|
+
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found or has no messages`, undefined, ctx.requestId);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const total = messages.length;
|
|
55
|
+
const paginatedMessages = messages.slice(offset, offset + limit);
|
|
56
|
+
return {
|
|
57
|
+
sessionId,
|
|
58
|
+
messages: paginatedMessages,
|
|
59
|
+
total,
|
|
60
|
+
limit,
|
|
61
|
+
offset,
|
|
62
|
+
metadata: {
|
|
63
|
+
timestamp: new Date().toISOString(),
|
|
64
|
+
requestId: ctx.requestId,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
return createErrorResponse("MEMORY_ERROR", error instanceof Error ? error.message : "Failed to get session messages", undefined, ctx.requestId);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Handler: Get session by ID
|
|
74
|
+
*/
|
|
75
|
+
async function handleGetSession(ctx) {
|
|
76
|
+
// Validate path params
|
|
77
|
+
const paramValidation = validateParams(IdParamSchema, ctx.params, ctx.requestId);
|
|
78
|
+
if (!paramValidation.success) {
|
|
79
|
+
return paramValidation.error;
|
|
80
|
+
}
|
|
81
|
+
const { id: sessionId } = paramValidation.data;
|
|
82
|
+
const memory = ctx.neurolink.conversationMemory;
|
|
83
|
+
if (!memory) {
|
|
84
|
+
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
// Handle Redis memory manager (has getUserSessionObject or getUserSessionMetadata)
|
|
88
|
+
if ("getUserSessionObject" in memory) {
|
|
89
|
+
// For Redis, we need a userId - check query params or use a default
|
|
90
|
+
const userId = ctx.query.userId || "default";
|
|
91
|
+
const sessionObject = await memory.getUserSessionObject(userId, sessionId);
|
|
92
|
+
if (sessionObject === null) {
|
|
93
|
+
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found`, undefined, ctx.requestId);
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
session: sessionObject,
|
|
97
|
+
metadata: {
|
|
98
|
+
timestamp: new Date().toISOString(),
|
|
99
|
+
requestId: ctx.requestId,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Handle in-memory manager (has getSession)
|
|
104
|
+
else if ("getSession" in memory) {
|
|
105
|
+
const session = memory.getSession(sessionId);
|
|
106
|
+
if (!session) {
|
|
107
|
+
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found`, undefined, ctx.requestId);
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
session,
|
|
111
|
+
metadata: {
|
|
112
|
+
timestamp: new Date().toISOString(),
|
|
113
|
+
requestId: ctx.requestId,
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return createErrorResponse("MEMORY_ERROR", "Session retrieval not supported for this memory type", undefined, ctx.requestId);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
return createErrorResponse("MEMORY_ERROR", error instanceof Error ? error.message : "Failed to get session", undefined, ctx.requestId);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Handler: List all conversation sessions
|
|
125
|
+
*/
|
|
126
|
+
async function handleListSessions(ctx) {
|
|
127
|
+
// Parse query params
|
|
128
|
+
const userId = ctx.query.userId;
|
|
129
|
+
const limitParam = ctx.query.limit ? parseInt(ctx.query.limit, 10) : 50;
|
|
130
|
+
const offsetParam = ctx.query.offset ? parseInt(ctx.query.offset, 10) : 0;
|
|
131
|
+
// Validate pagination params
|
|
132
|
+
const limit = isNaN(limitParam) || limitParam < 1 ? 50 : Math.min(limitParam, 100);
|
|
133
|
+
const offset = isNaN(offsetParam) || offsetParam < 0 ? 0 : offsetParam;
|
|
134
|
+
const memory = ctx.neurolink.conversationMemory;
|
|
135
|
+
if (!memory) {
|
|
136
|
+
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
let sessions = [];
|
|
140
|
+
// Handle Redis memory manager (has getUserAllSessionsHistory or getUserSessions)
|
|
141
|
+
if ("getUserAllSessionsHistory" in memory && userId) {
|
|
142
|
+
sessions = await memory.getUserAllSessionsHistory(userId);
|
|
143
|
+
}
|
|
144
|
+
else if ("getUserSessions" in memory && userId) {
|
|
145
|
+
// Get session IDs and then fetch metadata for each
|
|
146
|
+
const sessionIds = await memory.getUserSessions(userId);
|
|
147
|
+
// If we can get metadata, do so
|
|
148
|
+
if ("getUserSessionMetadata" in memory) {
|
|
149
|
+
const metadataPromises = sessionIds.map((id) => memory.getUserSessionMetadata(userId, id));
|
|
150
|
+
const metadataResults = await Promise.all(metadataPromises);
|
|
151
|
+
sessions = metadataResults.filter((m) => m !== null);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Just return session IDs as basic objects
|
|
155
|
+
sessions = sessionIds.map((id) => ({ id }));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Handle in-memory manager - iterate over internal sessions Map
|
|
159
|
+
else if ("getStats" in memory) {
|
|
160
|
+
// For in-memory, we can use getSession to check if sessions exist
|
|
161
|
+
// but we need to know the session IDs first. The in-memory manager
|
|
162
|
+
// doesn't expose a listSessions method, so we return stats info instead.
|
|
163
|
+
const stats = await memory.getStats?.();
|
|
164
|
+
return {
|
|
165
|
+
sessions: [],
|
|
166
|
+
total: stats?.totalSessions || 0,
|
|
167
|
+
limit,
|
|
168
|
+
offset,
|
|
169
|
+
message: "Session listing not fully supported for in-memory storage. Use /stats endpoint for session counts.",
|
|
170
|
+
metadata: {
|
|
171
|
+
timestamp: new Date().toISOString(),
|
|
172
|
+
requestId: ctx.requestId,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
const total = sessions.length;
|
|
177
|
+
const paginatedSessions = sessions.slice(offset, offset + limit);
|
|
178
|
+
return {
|
|
179
|
+
sessions: paginatedSessions,
|
|
180
|
+
total,
|
|
181
|
+
limit,
|
|
182
|
+
offset,
|
|
183
|
+
metadata: {
|
|
184
|
+
timestamp: new Date().toISOString(),
|
|
185
|
+
requestId: ctx.requestId,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
return createErrorResponse("MEMORY_ERROR", error instanceof Error ? error.message : "Failed to list sessions", undefined, ctx.requestId);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Handler: Get memory statistics
|
|
195
|
+
*/
|
|
196
|
+
async function handleGetStats(ctx) {
|
|
197
|
+
const memory = ctx.neurolink.conversationMemory;
|
|
198
|
+
if (!memory) {
|
|
199
|
+
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
// Get memory statistics if available
|
|
203
|
+
const stats = await memory.getStats?.();
|
|
204
|
+
return {
|
|
205
|
+
available: true,
|
|
206
|
+
type: memory.constructor.name,
|
|
207
|
+
stats: stats || {
|
|
208
|
+
message: "Statistics not available for this memory type",
|
|
209
|
+
},
|
|
210
|
+
timestamp: new Date().toISOString(),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
return createErrorResponse("MEMORY_ERROR", error instanceof Error ? error.message : "Failed to get statistics", undefined, ctx.requestId);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Handler: Clear a conversation session
|
|
219
|
+
*/
|
|
220
|
+
async function handleClearSession(ctx) {
|
|
221
|
+
// Validate params
|
|
222
|
+
const paramValidation = validateParams(SessionIdParamSchema, ctx.params, ctx.requestId);
|
|
223
|
+
if (!paramValidation.success) {
|
|
224
|
+
return paramValidation.error;
|
|
225
|
+
}
|
|
226
|
+
const { sessionId } = paramValidation.data;
|
|
227
|
+
const memory = ctx.neurolink.conversationMemory;
|
|
228
|
+
if (!memory) {
|
|
229
|
+
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
// Use clearSession for ConversationMemoryManager
|
|
233
|
+
const cleared = await memory.clearSession?.(sessionId);
|
|
234
|
+
if (cleared === false) {
|
|
235
|
+
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found`, undefined, ctx.requestId);
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
success: true,
|
|
239
|
+
sessionId,
|
|
240
|
+
message: "Session cleared successfully",
|
|
241
|
+
metadata: {
|
|
242
|
+
timestamp: new Date().toISOString(),
|
|
243
|
+
requestId: ctx.requestId,
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
return createErrorResponse("MEMORY_ERROR", error instanceof Error ? error.message : "Failed to clear session", undefined, ctx.requestId);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Handler: Clear all conversation sessions
|
|
253
|
+
*/
|
|
254
|
+
async function handleClearAllSessions(ctx) {
|
|
255
|
+
const memory = ctx.neurolink.conversationMemory;
|
|
256
|
+
if (!memory) {
|
|
257
|
+
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
258
|
+
}
|
|
259
|
+
try {
|
|
260
|
+
// Use clearAllSessions for ConversationMemoryManager
|
|
261
|
+
await memory.clearAllSessions?.();
|
|
262
|
+
return {
|
|
263
|
+
success: true,
|
|
264
|
+
message: "All sessions cleared successfully",
|
|
265
|
+
metadata: {
|
|
266
|
+
timestamp: new Date().toISOString(),
|
|
267
|
+
requestId: ctx.requestId,
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
return createErrorResponse("MEMORY_ERROR", error instanceof Error ? error.message : "Failed to clear sessions", undefined, ctx.requestId);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Handler: Check memory system health
|
|
277
|
+
*/
|
|
278
|
+
async function handleMemoryHealth(ctx) {
|
|
279
|
+
const memory = ctx.neurolink.conversationMemory;
|
|
280
|
+
return {
|
|
281
|
+
available: !!memory,
|
|
282
|
+
type: memory?.constructor.name || "none",
|
|
283
|
+
timestamp: new Date().toISOString(),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
6
286
|
/**
|
|
7
287
|
* Create memory management routes
|
|
8
288
|
* Note: These routes provide a simplified interface to conversation memory.
|
|
@@ -17,77 +297,7 @@ export function createMemoryRoutes(basePath = "/api") {
|
|
|
17
297
|
{
|
|
18
298
|
method: "GET",
|
|
19
299
|
path: `${basePath}/memory/sessions/:id/messages`,
|
|
20
|
-
handler:
|
|
21
|
-
// Validate path params
|
|
22
|
-
const paramValidation = validateParams(IdParamSchema, ctx.params, ctx.requestId);
|
|
23
|
-
if (!paramValidation.success) {
|
|
24
|
-
return paramValidation.error;
|
|
25
|
-
}
|
|
26
|
-
const { id: sessionId } = paramValidation.data;
|
|
27
|
-
// Parse query params for pagination
|
|
28
|
-
const limitParam = ctx.query.limit
|
|
29
|
-
? parseInt(ctx.query.limit, 10)
|
|
30
|
-
: 50;
|
|
31
|
-
const offsetParam = ctx.query.offset
|
|
32
|
-
? parseInt(ctx.query.offset, 10)
|
|
33
|
-
: 0;
|
|
34
|
-
// Validate pagination params
|
|
35
|
-
const limit = isNaN(limitParam) || limitParam < 1
|
|
36
|
-
? 50
|
|
37
|
-
: Math.min(limitParam, 100);
|
|
38
|
-
const offset = isNaN(offsetParam) || offsetParam < 0 ? 0 : offsetParam;
|
|
39
|
-
const memory = ctx.neurolink.conversationMemory;
|
|
40
|
-
if (!memory) {
|
|
41
|
-
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
42
|
-
}
|
|
43
|
-
try {
|
|
44
|
-
let messages = [];
|
|
45
|
-
// Handle Redis memory manager (has getUserSessionHistory)
|
|
46
|
-
if ("getUserSessionHistory" in memory) {
|
|
47
|
-
// For Redis, we need a userId - check query params or use a default
|
|
48
|
-
const userId = ctx.query.userId || "default";
|
|
49
|
-
const sessionMessages = await memory.getUserSessionHistory(userId, sessionId);
|
|
50
|
-
if (sessionMessages === null) {
|
|
51
|
-
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found`, undefined, ctx.requestId);
|
|
52
|
-
}
|
|
53
|
-
messages = sessionMessages;
|
|
54
|
-
}
|
|
55
|
-
// Handle in-memory manager (has getSession)
|
|
56
|
-
else if ("getSession" in memory) {
|
|
57
|
-
const session = memory.getSession(sessionId);
|
|
58
|
-
if (!session) {
|
|
59
|
-
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found`, undefined, ctx.requestId);
|
|
60
|
-
}
|
|
61
|
-
messages = session.messages;
|
|
62
|
-
}
|
|
63
|
-
// Fallback: try buildContextMessages if available
|
|
64
|
-
else if ("buildContextMessages" in memory) {
|
|
65
|
-
messages = await memory.buildContextMessages(sessionId);
|
|
66
|
-
// If no messages, session might not exist
|
|
67
|
-
if (messages.length === 0) {
|
|
68
|
-
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found or has no messages`, undefined, ctx.requestId);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
const total = messages.length;
|
|
72
|
-
const paginatedMessages = messages.slice(offset, offset + limit);
|
|
73
|
-
return {
|
|
74
|
-
sessionId,
|
|
75
|
-
messages: paginatedMessages,
|
|
76
|
-
total,
|
|
77
|
-
limit,
|
|
78
|
-
offset,
|
|
79
|
-
metadata: {
|
|
80
|
-
timestamp: new Date().toISOString(),
|
|
81
|
-
requestId: ctx.requestId,
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
return createErrorResponse("MEMORY_ERROR", error instanceof Error
|
|
87
|
-
? error.message
|
|
88
|
-
: "Failed to get session messages", undefined, ctx.requestId);
|
|
89
|
-
}
|
|
90
|
-
},
|
|
300
|
+
handler: handleGetSessionMessages,
|
|
91
301
|
description: "Get messages for a session",
|
|
92
302
|
tags: ["memory"],
|
|
93
303
|
},
|
|
@@ -95,54 +305,7 @@ export function createMemoryRoutes(basePath = "/api") {
|
|
|
95
305
|
{
|
|
96
306
|
method: "GET",
|
|
97
307
|
path: `${basePath}/memory/sessions/:id`,
|
|
98
|
-
handler:
|
|
99
|
-
// Validate path params
|
|
100
|
-
const paramValidation = validateParams(IdParamSchema, ctx.params, ctx.requestId);
|
|
101
|
-
if (!paramValidation.success) {
|
|
102
|
-
return paramValidation.error;
|
|
103
|
-
}
|
|
104
|
-
const { id: sessionId } = paramValidation.data;
|
|
105
|
-
const memory = ctx.neurolink.conversationMemory;
|
|
106
|
-
if (!memory) {
|
|
107
|
-
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
108
|
-
}
|
|
109
|
-
try {
|
|
110
|
-
// Handle Redis memory manager (has getUserSessionObject or getUserSessionMetadata)
|
|
111
|
-
if ("getUserSessionObject" in memory) {
|
|
112
|
-
// For Redis, we need a userId - check query params or use a default
|
|
113
|
-
const userId = ctx.query.userId || "default";
|
|
114
|
-
const sessionObject = await memory.getUserSessionObject(userId, sessionId);
|
|
115
|
-
if (sessionObject === null) {
|
|
116
|
-
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found`, undefined, ctx.requestId);
|
|
117
|
-
}
|
|
118
|
-
return {
|
|
119
|
-
session: sessionObject,
|
|
120
|
-
metadata: {
|
|
121
|
-
timestamp: new Date().toISOString(),
|
|
122
|
-
requestId: ctx.requestId,
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
// Handle in-memory manager (has getSession)
|
|
127
|
-
else if ("getSession" in memory) {
|
|
128
|
-
const session = memory.getSession(sessionId);
|
|
129
|
-
if (!session) {
|
|
130
|
-
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found`, undefined, ctx.requestId);
|
|
131
|
-
}
|
|
132
|
-
return {
|
|
133
|
-
session,
|
|
134
|
-
metadata: {
|
|
135
|
-
timestamp: new Date().toISOString(),
|
|
136
|
-
requestId: ctx.requestId,
|
|
137
|
-
},
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
return createErrorResponse("MEMORY_ERROR", "Session retrieval not supported for this memory type", undefined, ctx.requestId);
|
|
141
|
-
}
|
|
142
|
-
catch (error) {
|
|
143
|
-
return createErrorResponse("MEMORY_ERROR", error instanceof Error ? error.message : "Failed to get session", undefined, ctx.requestId);
|
|
144
|
-
}
|
|
145
|
-
},
|
|
308
|
+
handler: handleGetSession,
|
|
146
309
|
description: "Get session by ID",
|
|
147
310
|
tags: ["memory"],
|
|
148
311
|
},
|
|
@@ -150,192 +313,35 @@ export function createMemoryRoutes(basePath = "/api") {
|
|
|
150
313
|
{
|
|
151
314
|
method: "GET",
|
|
152
315
|
path: `${basePath}/memory/sessions`,
|
|
153
|
-
handler:
|
|
154
|
-
// Parse query params
|
|
155
|
-
const userId = ctx.query.userId;
|
|
156
|
-
const limitParam = ctx.query.limit
|
|
157
|
-
? parseInt(ctx.query.limit, 10)
|
|
158
|
-
: 50;
|
|
159
|
-
const offsetParam = ctx.query.offset
|
|
160
|
-
? parseInt(ctx.query.offset, 10)
|
|
161
|
-
: 0;
|
|
162
|
-
// Validate pagination params
|
|
163
|
-
const limit = isNaN(limitParam) || limitParam < 1
|
|
164
|
-
? 50
|
|
165
|
-
: Math.min(limitParam, 100);
|
|
166
|
-
const offset = isNaN(offsetParam) || offsetParam < 0 ? 0 : offsetParam;
|
|
167
|
-
const memory = ctx.neurolink.conversationMemory;
|
|
168
|
-
if (!memory) {
|
|
169
|
-
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
170
|
-
}
|
|
171
|
-
try {
|
|
172
|
-
let sessions = [];
|
|
173
|
-
// Handle Redis memory manager (has getUserAllSessionsHistory or getUserSessions)
|
|
174
|
-
if ("getUserAllSessionsHistory" in memory && userId) {
|
|
175
|
-
sessions = await memory.getUserAllSessionsHistory(userId);
|
|
176
|
-
}
|
|
177
|
-
else if ("getUserSessions" in memory && userId) {
|
|
178
|
-
// Get session IDs and then fetch metadata for each
|
|
179
|
-
const sessionIds = await memory.getUserSessions(userId);
|
|
180
|
-
// If we can get metadata, do so
|
|
181
|
-
if ("getUserSessionMetadata" in memory) {
|
|
182
|
-
const metadataPromises = sessionIds.map((id) => memory.getUserSessionMetadata(userId, id));
|
|
183
|
-
const metadataResults = await Promise.all(metadataPromises);
|
|
184
|
-
sessions = metadataResults.filter((m) => m !== null);
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
// Just return session IDs as basic objects
|
|
188
|
-
sessions = sessionIds.map((id) => ({ id }));
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
// Handle in-memory manager - iterate over internal sessions Map
|
|
192
|
-
else if ("getStats" in memory) {
|
|
193
|
-
// For in-memory, we can use getSession to check if sessions exist
|
|
194
|
-
// but we need to know the session IDs first. The in-memory manager
|
|
195
|
-
// doesn't expose a listSessions method, so we return stats info instead.
|
|
196
|
-
const stats = await memory.getStats?.();
|
|
197
|
-
return {
|
|
198
|
-
sessions: [],
|
|
199
|
-
total: stats?.totalSessions || 0,
|
|
200
|
-
limit,
|
|
201
|
-
offset,
|
|
202
|
-
message: "Session listing not fully supported for in-memory storage. Use /stats endpoint for session counts.",
|
|
203
|
-
metadata: {
|
|
204
|
-
timestamp: new Date().toISOString(),
|
|
205
|
-
requestId: ctx.requestId,
|
|
206
|
-
},
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
const total = sessions.length;
|
|
210
|
-
const paginatedSessions = sessions.slice(offset, offset + limit);
|
|
211
|
-
return {
|
|
212
|
-
sessions: paginatedSessions,
|
|
213
|
-
total,
|
|
214
|
-
limit,
|
|
215
|
-
offset,
|
|
216
|
-
metadata: {
|
|
217
|
-
timestamp: new Date().toISOString(),
|
|
218
|
-
requestId: ctx.requestId,
|
|
219
|
-
},
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
catch (error) {
|
|
223
|
-
return createErrorResponse("MEMORY_ERROR", error instanceof Error
|
|
224
|
-
? error.message
|
|
225
|
-
: "Failed to list sessions", undefined, ctx.requestId);
|
|
226
|
-
}
|
|
227
|
-
},
|
|
316
|
+
handler: handleListSessions,
|
|
228
317
|
description: "List all conversation sessions",
|
|
229
318
|
tags: ["memory"],
|
|
230
319
|
},
|
|
231
320
|
{
|
|
232
321
|
method: "GET",
|
|
233
322
|
path: `${basePath}/memory/stats`,
|
|
234
|
-
handler:
|
|
235
|
-
const memory = ctx.neurolink.conversationMemory;
|
|
236
|
-
if (!memory) {
|
|
237
|
-
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
238
|
-
}
|
|
239
|
-
try {
|
|
240
|
-
// Get memory statistics if available
|
|
241
|
-
const stats = await memory.getStats?.();
|
|
242
|
-
return {
|
|
243
|
-
available: true,
|
|
244
|
-
type: memory.constructor.name,
|
|
245
|
-
stats: stats || {
|
|
246
|
-
message: "Statistics not available for this memory type",
|
|
247
|
-
},
|
|
248
|
-
timestamp: new Date().toISOString(),
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
catch (error) {
|
|
252
|
-
return createErrorResponse("MEMORY_ERROR", error instanceof Error
|
|
253
|
-
? error.message
|
|
254
|
-
: "Failed to get statistics", undefined, ctx.requestId);
|
|
255
|
-
}
|
|
256
|
-
},
|
|
323
|
+
handler: handleGetStats,
|
|
257
324
|
description: "Get memory statistics",
|
|
258
325
|
tags: ["memory"],
|
|
259
326
|
},
|
|
260
327
|
{
|
|
261
328
|
method: "DELETE",
|
|
262
329
|
path: `${basePath}/memory/sessions/:sessionId`,
|
|
263
|
-
handler:
|
|
264
|
-
// Validate params
|
|
265
|
-
const paramValidation = validateParams(SessionIdParamSchema, ctx.params, ctx.requestId);
|
|
266
|
-
if (!paramValidation.success) {
|
|
267
|
-
return paramValidation.error;
|
|
268
|
-
}
|
|
269
|
-
const { sessionId } = paramValidation.data;
|
|
270
|
-
const memory = ctx.neurolink.conversationMemory;
|
|
271
|
-
if (!memory) {
|
|
272
|
-
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
273
|
-
}
|
|
274
|
-
try {
|
|
275
|
-
// Use clearSession for ConversationMemoryManager
|
|
276
|
-
const cleared = await memory.clearSession?.(sessionId);
|
|
277
|
-
if (cleared === false) {
|
|
278
|
-
return createErrorResponse("SESSION_NOT_FOUND", `Session '${sessionId}' not found`, undefined, ctx.requestId);
|
|
279
|
-
}
|
|
280
|
-
return {
|
|
281
|
-
success: true,
|
|
282
|
-
sessionId,
|
|
283
|
-
message: "Session cleared successfully",
|
|
284
|
-
metadata: {
|
|
285
|
-
timestamp: new Date().toISOString(),
|
|
286
|
-
requestId: ctx.requestId,
|
|
287
|
-
},
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
catch (error) {
|
|
291
|
-
return createErrorResponse("MEMORY_ERROR", error instanceof Error
|
|
292
|
-
? error.message
|
|
293
|
-
: "Failed to clear session", undefined, ctx.requestId);
|
|
294
|
-
}
|
|
295
|
-
},
|
|
330
|
+
handler: handleClearSession,
|
|
296
331
|
description: "Clear a conversation session",
|
|
297
332
|
tags: ["memory"],
|
|
298
333
|
},
|
|
299
334
|
{
|
|
300
335
|
method: "DELETE",
|
|
301
336
|
path: `${basePath}/memory/sessions`,
|
|
302
|
-
handler:
|
|
303
|
-
const memory = ctx.neurolink.conversationMemory;
|
|
304
|
-
if (!memory) {
|
|
305
|
-
return createErrorResponse("MEMORY_UNAVAILABLE", "Conversation memory not available", undefined, ctx.requestId);
|
|
306
|
-
}
|
|
307
|
-
try {
|
|
308
|
-
// Use clearAllSessions for ConversationMemoryManager
|
|
309
|
-
await memory.clearAllSessions?.();
|
|
310
|
-
return {
|
|
311
|
-
success: true,
|
|
312
|
-
message: "All sessions cleared successfully",
|
|
313
|
-
metadata: {
|
|
314
|
-
timestamp: new Date().toISOString(),
|
|
315
|
-
requestId: ctx.requestId,
|
|
316
|
-
},
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
catch (error) {
|
|
320
|
-
return createErrorResponse("MEMORY_ERROR", error instanceof Error
|
|
321
|
-
? error.message
|
|
322
|
-
: "Failed to clear sessions", undefined, ctx.requestId);
|
|
323
|
-
}
|
|
324
|
-
},
|
|
337
|
+
handler: handleClearAllSessions,
|
|
325
338
|
description: "Clear all conversation sessions",
|
|
326
339
|
tags: ["memory"],
|
|
327
340
|
},
|
|
328
341
|
{
|
|
329
342
|
method: "GET",
|
|
330
343
|
path: `${basePath}/memory/health`,
|
|
331
|
-
handler:
|
|
332
|
-
const memory = ctx.neurolink.conversationMemory;
|
|
333
|
-
return {
|
|
334
|
-
available: !!memory,
|
|
335
|
-
type: memory?.constructor.name || "none",
|
|
336
|
-
timestamp: new Date().toISOString(),
|
|
337
|
-
};
|
|
338
|
-
},
|
|
344
|
+
handler: handleMemoryHealth,
|
|
339
345
|
description: "Check memory system health",
|
|
340
346
|
tags: ["memory", "health"],
|
|
341
347
|
},
|