@juspay/neurolink 9.32.0 → 9.32.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/auth/anthropicOAuth.js +1 -1
- package/dist/cli/commands/proxy.js +18 -5
- package/dist/client/aiSdkAdapter.js +1 -1
- package/dist/client/index.js +137 -501
- package/dist/core/factory.js +0 -1
- package/dist/core/redisConversationMemoryManager.js +1 -1
- package/dist/features/ppt/slideGenerator.js +0 -1
- package/dist/features/ppt/utils.js +0 -1
- package/dist/lib/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- package/dist/providers/azureOpenai.js +1 -1
- package/dist/providers/huggingFace.js +0 -1
- package/dist/providers/openaiCompatible.js +0 -1
- package/dist/sdk/toolRegistration.js +0 -1
- package/dist/server/openapi/generator.js +1 -1
- package/dist/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/types/configTypes.js +0 -5
- package/dist/types/modelTypes.js +0 -1
- package/dist/types/tools.js +0 -1
- package/dist/types/typeAliases.js +0 -1
- package/dist/types/utilities.js +1 -1
- package/dist/types/workflowTypes.js +0 -1
- package/dist/utils/providerRetry.js +0 -1
- package/dist/utils/providerUtils.js +0 -1
- package/package.json +2 -2
- package/dist/client/adapters/providerImageAdapter.js +0 -588
- package/dist/client/adapters/tts/googleTTSHandler.js +0 -344
- package/dist/client/adapters/video/directorPipeline.js +0 -516
- package/dist/client/adapters/video/ffmpegAdapter.js +0 -206
- package/dist/client/adapters/video/frameExtractor.js +0 -143
- package/dist/client/adapters/video/vertexVideoHandler.js +0 -763
- package/dist/client/adapters/video/videoAnalyzer.js +0 -238
- package/dist/client/adapters/video/videoMerger.js +0 -171
- package/dist/client/agent/directTools.js +0 -840
- package/dist/client/auth/AuthProviderFactory.js +0 -111
- package/dist/client/auth/AuthProviderRegistry.js +0 -190
- package/dist/client/auth/RequestContext.js +0 -78
- package/dist/client/auth/accountPool.js +0 -178
- package/dist/client/auth/anthropicOAuth.js +0 -974
- package/dist/client/auth/authContext.js +0 -314
- package/dist/client/auth/errors.js +0 -39
- package/dist/client/auth/index.js +0 -61
- package/dist/client/auth/middleware/AuthMiddleware.js +0 -519
- package/dist/client/auth/middleware/rateLimitByUser.js +0 -554
- package/dist/client/auth/providers/BaseAuthProvider.js +0 -723
- package/dist/client/auth/providers/CognitoProvider.js +0 -304
- package/dist/client/auth/providers/KeycloakProvider.js +0 -393
- package/dist/client/auth/providers/auth0.js +0 -274
- package/dist/client/auth/providers/betterAuth.js +0 -182
- package/dist/client/auth/providers/clerk.js +0 -317
- package/dist/client/auth/providers/custom.js +0 -112
- package/dist/client/auth/providers/firebase.js +0 -226
- package/dist/client/auth/providers/jwt.js +0 -212
- package/dist/client/auth/providers/oauth2.js +0 -303
- package/dist/client/auth/providers/supabase.js +0 -259
- package/dist/client/auth/providers/workos.js +0 -284
- package/dist/client/auth/serverBridge.js +0 -25
- package/dist/client/auth/sessionManager.js +0 -437
- package/dist/client/auth/tokenStore.js +0 -799
- package/dist/client/client/aiSdkAdapter.js +0 -487
- package/dist/client/client/auth.js +0 -473
- package/dist/client/client/errors.js +0 -552
- package/dist/client/client/httpClient.js +0 -837
- package/dist/client/client/index.js +0 -172
- package/dist/client/client/interceptors.js +0 -601
- package/dist/client/client/sseClient.js +0 -545
- package/dist/client/client/streamingClient.js +0 -917
- package/dist/client/client/wsClient.js +0 -369
- package/dist/client/config/configManager.js +0 -303
- package/dist/client/config/conversationMemory.js +0 -86
- package/dist/client/config/taskClassificationConfig.js +0 -148
- package/dist/client/constants/contextWindows.js +0 -295
- package/dist/client/constants/enums.js +0 -853
- package/dist/client/constants/index.js +0 -207
- package/dist/client/constants/performance.js +0 -389
- package/dist/client/constants/retry.js +0 -266
- package/dist/client/constants/timeouts.js +0 -182
- package/dist/client/constants/tokens.js +0 -380
- package/dist/client/constants/videoErrors.js +0 -46
- package/dist/client/context/budgetChecker.js +0 -98
- package/dist/client/context/contextCompactor.js +0 -205
- package/dist/client/context/emergencyTruncation.js +0 -88
- package/dist/client/context/errorDetection.js +0 -171
- package/dist/client/context/errors.js +0 -21
- package/dist/client/context/fileTokenBudget.js +0 -127
- package/dist/client/context/prompts/summarizationPrompt.js +0 -117
- package/dist/client/context/stages/fileReadDeduplicator.js +0 -66
- package/dist/client/context/stages/slidingWindowTruncator.js +0 -190
- package/dist/client/context/stages/structuredSummarizer.js +0 -99
- package/dist/client/context/stages/toolOutputPruner.js +0 -52
- package/dist/client/context/summarizationEngine.js +0 -136
- package/dist/client/context/toolOutputLimits.js +0 -78
- package/dist/client/context/toolPairRepair.js +0 -66
- package/dist/client/core/analytics.js +0 -88
- package/dist/client/core/baseProvider.js +0 -1385
- package/dist/client/core/constants.js +0 -140
- package/dist/client/core/conversationMemoryFactory.js +0 -141
- package/dist/client/core/conversationMemoryInitializer.js +0 -128
- package/dist/client/core/conversationMemoryManager.js +0 -344
- package/dist/client/core/dynamicModels.js +0 -358
- package/dist/client/core/evaluation.js +0 -309
- package/dist/client/core/evaluationProviders.js +0 -248
- package/dist/client/core/factory.js +0 -412
- package/dist/client/core/infrastructure/baseError.js +0 -22
- package/dist/client/core/infrastructure/baseFactory.js +0 -54
- package/dist/client/core/infrastructure/baseRegistry.js +0 -53
- package/dist/client/core/infrastructure/index.js +0 -5
- package/dist/client/core/infrastructure/retry.js +0 -20
- package/dist/client/core/infrastructure/typedEventEmitter.js +0 -23
- package/dist/client/core/modelConfiguration.js +0 -851
- package/dist/client/core/modules/GenerationHandler.js +0 -588
- package/dist/client/core/modules/MessageBuilder.js +0 -273
- package/dist/client/core/modules/StreamHandler.js +0 -185
- package/dist/client/core/modules/TelemetryHandler.js +0 -203
- package/dist/client/core/modules/ToolsManager.js +0 -499
- package/dist/client/core/modules/Utilities.js +0 -331
- package/dist/client/core/redisConversationMemoryManager.js +0 -1435
- package/dist/client/core/streamAnalytics.js +0 -131
- package/dist/client/evaluation/contextBuilder.js +0 -134
- package/dist/client/evaluation/index.js +0 -61
- package/dist/client/evaluation/prompts.js +0 -73
- package/dist/client/evaluation/ragasEvaluator.js +0 -110
- package/dist/client/evaluation/retryManager.js +0 -78
- package/dist/client/evaluation/scoring.js +0 -61
- package/dist/client/factories/providerFactory.js +0 -166
- package/dist/client/factories/providerRegistry.js +0 -166
- package/dist/client/features/ppt/constants.js +0 -896
- package/dist/client/features/ppt/contentPlanner.js +0 -529
- package/dist/client/features/ppt/presentationOrchestrator.js +0 -236
- package/dist/client/features/ppt/slideGenerator.js +0 -532
- package/dist/client/features/ppt/slideRenderers.js +0 -2383
- package/dist/client/features/ppt/slideTypeInference.js +0 -405
- package/dist/client/features/ppt/types.js +0 -13
- package/dist/client/features/ppt/utils.js +0 -443
- package/dist/client/files/fileReferenceRegistry.js +0 -1543
- package/dist/client/files/fileTools.js +0 -450
- package/dist/client/files/streamingReader.js +0 -321
- package/dist/client/files/types.js +0 -23
- package/dist/client/hitl/hitlErrors.js +0 -54
- package/dist/client/hitl/hitlManager.js +0 -460
- package/dist/client/mcp/agentExposure.js +0 -356
- package/dist/client/mcp/auth/index.js +0 -11
- package/dist/client/mcp/auth/oauthClientProvider.js +0 -325
- package/dist/client/mcp/auth/tokenStorage.js +0 -134
- package/dist/client/mcp/batching/index.js +0 -10
- package/dist/client/mcp/batching/requestBatcher.js +0 -441
- package/dist/client/mcp/caching/index.js +0 -10
- package/dist/client/mcp/caching/toolCache.js +0 -433
- package/dist/client/mcp/elicitation/elicitationManager.js +0 -376
- package/dist/client/mcp/elicitation/index.js +0 -11
- package/dist/client/mcp/elicitation/types.js +0 -10
- package/dist/client/mcp/elicitationProtocol.js +0 -375
- package/dist/client/mcp/enhancedToolDiscovery.js +0 -481
- package/dist/client/mcp/externalServerManager.js +0 -1478
- package/dist/client/mcp/factory.js +0 -161
- package/dist/client/mcp/flexibleToolValidator.js +0 -161
- package/dist/client/mcp/httpRateLimiter.js +0 -391
- package/dist/client/mcp/httpRetryHandler.js +0 -178
- package/dist/client/mcp/index.js +0 -74
- package/dist/client/mcp/mcpCircuitBreaker.js +0 -427
- package/dist/client/mcp/mcpClientFactory.js +0 -708
- package/dist/client/mcp/mcpRegistryClient.js +0 -488
- package/dist/client/mcp/mcpServerBase.js +0 -373
- package/dist/client/mcp/multiServerManager.js +0 -579
- package/dist/client/mcp/registry.js +0 -158
- package/dist/client/mcp/routing/index.js +0 -10
- package/dist/client/mcp/routing/toolRouter.js +0 -416
- package/dist/client/mcp/serverCapabilities.js +0 -502
- package/dist/client/mcp/servers/agent/directToolsServer.js +0 -150
- package/dist/client/mcp/toolAnnotations.js +0 -239
- package/dist/client/mcp/toolConverter.js +0 -258
- package/dist/client/mcp/toolDiscoveryService.js +0 -798
- package/dist/client/mcp/toolIntegration.js +0 -334
- package/dist/client/mcp/toolRegistry.js +0 -729
- package/dist/client/memory/hippocampusInitializer.js +0 -19
- package/dist/client/memory/memoryRetrievalTools.js +0 -166
- package/dist/client/middleware/builtin/analytics.js +0 -132
- package/dist/client/middleware/builtin/autoEvaluation.js +0 -203
- package/dist/client/middleware/builtin/guardrails.js +0 -109
- package/dist/client/middleware/builtin/lifecycle.js +0 -168
- package/dist/client/middleware/factory.js +0 -327
- package/dist/client/middleware/registry.js +0 -295
- package/dist/client/middleware/utils/guardrailsUtils.js +0 -396
- package/dist/client/models/anthropicModels.js +0 -527
- package/dist/client/neurolink.js +0 -8233
- package/dist/client/observability/exporterRegistry.js +0 -413
- package/dist/client/observability/exporters/arizeExporter.js +0 -138
- package/dist/client/observability/exporters/baseExporter.js +0 -190
- package/dist/client/observability/exporters/braintrustExporter.js +0 -154
- package/dist/client/observability/exporters/datadogExporter.js +0 -196
- package/dist/client/observability/exporters/laminarExporter.js +0 -302
- package/dist/client/observability/exporters/langfuseExporter.js +0 -209
- package/dist/client/observability/exporters/langsmithExporter.js +0 -143
- package/dist/client/observability/exporters/otelExporter.js +0 -164
- package/dist/client/observability/exporters/posthogExporter.js +0 -287
- package/dist/client/observability/exporters/sentryExporter.js +0 -165
- package/dist/client/observability/index.js +0 -31
- package/dist/client/observability/metricsAggregator.js +0 -556
- package/dist/client/observability/otelBridge.js +0 -131
- package/dist/client/observability/retryPolicy.js +0 -383
- package/dist/client/observability/sampling/samplers.js +0 -216
- package/dist/client/observability/spanProcessor.js +0 -303
- package/dist/client/observability/tokenTracker.js +0 -413
- package/dist/client/observability/types/exporterTypes.js +0 -5
- package/dist/client/observability/types/index.js +0 -4
- package/dist/client/observability/types/spanTypes.js +0 -92
- package/dist/client/observability/utils/safeMetadata.js +0 -25
- package/dist/client/observability/utils/spanSerializer.js +0 -292
- package/dist/client/processors/archive/ArchiveProcessor.js +0 -1308
- package/dist/client/processors/base/BaseFileProcessor.js +0 -614
- package/dist/client/processors/base/types.js +0 -82
- package/dist/client/processors/config/fileTypes.js +0 -520
- package/dist/client/processors/config/index.js +0 -92
- package/dist/client/processors/config/languageMap.js +0 -410
- package/dist/client/processors/config/mimeTypes.js +0 -363
- package/dist/client/processors/config/sizeLimits.js +0 -258
- package/dist/client/processors/document/ExcelProcessor.js +0 -590
- package/dist/client/processors/document/OpenDocumentProcessor.js +0 -212
- package/dist/client/processors/document/PptxProcessor.js +0 -157
- package/dist/client/processors/document/RtfProcessor.js +0 -361
- package/dist/client/processors/document/WordProcessor.js +0 -353
- package/dist/client/processors/errors/FileErrorCode.js +0 -255
- package/dist/client/processors/errors/errorHelpers.js +0 -386
- package/dist/client/processors/errors/errorSerializer.js +0 -507
- package/dist/client/processors/errors/index.js +0 -49
- package/dist/client/processors/markup/SvgProcessor.js +0 -240
- package/dist/client/processors/media/AudioProcessor.js +0 -707
- package/dist/client/processors/media/VideoProcessor.js +0 -1045
- package/dist/client/providers/amazonBedrock.js +0 -1512
- package/dist/client/providers/amazonSagemaker.js +0 -162
- package/dist/client/providers/anthropic.js +0 -831
- package/dist/client/providers/azureOpenai.js +0 -143
- package/dist/client/providers/googleAiStudio.js +0 -1200
- package/dist/client/providers/googleNativeGemini3.js +0 -543
- package/dist/client/providers/googleVertex.js +0 -2936
- package/dist/client/providers/huggingFace.js +0 -315
- package/dist/client/providers/litellm.js +0 -488
- package/dist/client/providers/mistral.js +0 -157
- package/dist/client/providers/ollama.js +0 -1579
- package/dist/client/providers/openAI.js +0 -627
- package/dist/client/providers/openRouter.js +0 -543
- package/dist/client/providers/openaiCompatible.js +0 -290
- package/dist/client/providers/providerTypeUtils.js +0 -46
- package/dist/client/providers/sagemaker/adaptive-semaphore.js +0 -215
- package/dist/client/providers/sagemaker/client.js +0 -472
- package/dist/client/providers/sagemaker/config.js +0 -317
- package/dist/client/providers/sagemaker/detection.js +0 -606
- package/dist/client/providers/sagemaker/error-constants.js +0 -227
- package/dist/client/providers/sagemaker/errors.js +0 -299
- package/dist/client/providers/sagemaker/language-model.js +0 -775
- package/dist/client/providers/sagemaker/parsers.js +0 -634
- package/dist/client/providers/sagemaker/streaming.js +0 -331
- package/dist/client/providers/sagemaker/structured-parser.js +0 -625
- package/dist/client/proxy/accountQuota.js +0 -162
- package/dist/client/proxy/claudeFormat.js +0 -595
- package/dist/client/proxy/modelRouter.js +0 -29
- package/dist/client/proxy/oauthFetch.js +0 -367
- package/dist/client/proxy/proxyFetch.js +0 -586
- package/dist/client/proxy/requestLogger.js +0 -207
- package/dist/client/proxy/tokenRefresh.js +0 -124
- package/dist/client/proxy/usageStats.js +0 -74
- package/dist/client/proxy/utils/noProxyUtils.js +0 -149
- package/dist/client/rag/ChunkerFactory.js +0 -320
- package/dist/client/rag/ChunkerRegistry.js +0 -421
- package/dist/client/rag/chunkers/BaseChunker.js +0 -143
- package/dist/client/rag/chunkers/CharacterChunker.js +0 -28
- package/dist/client/rag/chunkers/HTMLChunker.js +0 -38
- package/dist/client/rag/chunkers/JSONChunker.js +0 -68
- package/dist/client/rag/chunkers/LaTeXChunker.js +0 -63
- package/dist/client/rag/chunkers/MarkdownChunker.js +0 -306
- package/dist/client/rag/chunkers/RecursiveChunker.js +0 -139
- package/dist/client/rag/chunkers/SemanticMarkdownChunker.js +0 -138
- package/dist/client/rag/chunkers/SentenceChunker.js +0 -66
- package/dist/client/rag/chunkers/TokenChunker.js +0 -61
- package/dist/client/rag/chunkers/index.js +0 -15
- package/dist/client/rag/chunking/characterChunker.js +0 -142
- package/dist/client/rag/chunking/chunkerRegistry.js +0 -194
- package/dist/client/rag/chunking/htmlChunker.js +0 -247
- package/dist/client/rag/chunking/index.js +0 -17
- package/dist/client/rag/chunking/jsonChunker.js +0 -281
- package/dist/client/rag/chunking/latexChunker.js +0 -251
- package/dist/client/rag/chunking/markdownChunker.js +0 -373
- package/dist/client/rag/chunking/recursiveChunker.js +0 -148
- package/dist/client/rag/chunking/semanticChunker.js +0 -306
- package/dist/client/rag/chunking/sentenceChunker.js +0 -230
- package/dist/client/rag/chunking/tokenChunker.js +0 -183
- package/dist/client/rag/document/MDocument.js +0 -392
- package/dist/client/rag/document/index.js +0 -5
- package/dist/client/rag/document/loaders.js +0 -500
- package/dist/client/rag/errors/RAGError.js +0 -274
- package/dist/client/rag/errors/index.js +0 -6
- package/dist/client/rag/graphRag/graphRAG.js +0 -401
- package/dist/client/rag/graphRag/index.js +0 -4
- package/dist/client/rag/index.js +0 -141
- package/dist/client/rag/metadata/MetadataExtractorFactory.js +0 -418
- package/dist/client/rag/metadata/MetadataExtractorRegistry.js +0 -362
- package/dist/client/rag/metadata/index.js +0 -9
- package/dist/client/rag/metadata/metadataExtractor.js +0 -280
- package/dist/client/rag/pipeline/RAGPipeline.js +0 -436
- package/dist/client/rag/pipeline/contextAssembly.js +0 -341
- package/dist/client/rag/pipeline/index.js +0 -5
- package/dist/client/rag/ragIntegration.js +0 -321
- package/dist/client/rag/reranker/RerankerFactory.js +0 -430
- package/dist/client/rag/reranker/RerankerRegistry.js +0 -402
- package/dist/client/rag/reranker/index.js +0 -9
- package/dist/client/rag/reranker/reranker.js +0 -277
- package/dist/client/rag/resilience/CircuitBreaker.js +0 -431
- package/dist/client/rag/resilience/RetryHandler.js +0 -304
- package/dist/client/rag/resilience/index.js +0 -7
- package/dist/client/rag/retrieval/hybridSearch.js +0 -335
- package/dist/client/rag/retrieval/index.js +0 -5
- package/dist/client/rag/retrieval/vectorQueryTool.js +0 -307
- package/dist/client/rag/types.js +0 -8
- package/dist/client/sdk/toolRegistration.js +0 -377
- package/dist/client/server/abstract/baseServerAdapter.js +0 -575
- package/dist/client/server/adapters/expressAdapter.js +0 -486
- package/dist/client/server/adapters/fastifyAdapter.js +0 -472
- package/dist/client/server/adapters/honoAdapter.js +0 -632
- package/dist/client/server/adapters/koaAdapter.js +0 -510
- package/dist/client/server/errors.js +0 -486
- package/dist/client/server/factory/serverAdapterFactory.js +0 -160
- package/dist/client/server/index.js +0 -108
- package/dist/client/server/middleware/abortSignal.js +0 -111
- package/dist/client/server/middleware/auth.js +0 -388
- package/dist/client/server/middleware/cache.js +0 -359
- package/dist/client/server/middleware/common.js +0 -281
- package/dist/client/server/middleware/deprecation.js +0 -190
- package/dist/client/server/middleware/mcpBodyAttachment.js +0 -63
- package/dist/client/server/middleware/rateLimit.js +0 -227
- package/dist/client/server/middleware/validation.js +0 -388
- package/dist/client/server/openapi/generator.js +0 -398
- package/dist/client/server/openapi/index.js +0 -36
- package/dist/client/server/openapi/schemas.js +0 -695
- package/dist/client/server/openapi/templates.js +0 -374
- package/dist/client/server/routes/agentRoutes.js +0 -189
- package/dist/client/server/routes/claudeProxyRoutes.js +0 -1600
- package/dist/client/server/routes/healthRoutes.js +0 -187
- package/dist/client/server/routes/index.js +0 -57
- package/dist/client/server/routes/mcpRoutes.js +0 -342
- package/dist/client/server/routes/memoryRoutes.js +0 -350
- package/dist/client/server/routes/openApiRoutes.js +0 -126
- package/dist/client/server/routes/toolRoutes.js +0 -199
- package/dist/client/server/streaming/dataStream.js +0 -486
- package/dist/client/server/streaming/index.js +0 -11
- package/dist/client/server/types.js +0 -67
- package/dist/client/server/utils/redaction.js +0 -334
- package/dist/client/server/utils/validation.js +0 -243
- package/dist/client/server/websocket/WebSocketHandler.js +0 -383
- package/dist/client/server/websocket/index.js +0 -4
- package/dist/client/services/server/ai/observability/instrumentation.js +0 -808
- package/dist/client/telemetry/attributes.js +0 -100
- package/dist/client/telemetry/index.js +0 -26
- package/dist/client/telemetry/telemetryService.js +0 -308
- package/dist/client/telemetry/tracers.js +0 -17
- package/dist/client/telemetry/withSpan.js +0 -34
- package/dist/client/types/actionTypes.js +0 -6
- package/dist/client/types/analytics.js +0 -5
- package/dist/client/types/authTypes.js +0 -9
- package/dist/client/types/circuitBreakerErrors.js +0 -34
- package/dist/client/types/cli.js +0 -21
- package/dist/client/types/clientTypes.js +0 -10
- package/dist/client/types/common.js +0 -51
- package/dist/client/types/configTypes.js +0 -49
- package/dist/client/types/content.js +0 -19
- package/dist/client/types/contextTypes.js +0 -400
- package/dist/client/types/conversation.js +0 -47
- package/dist/client/types/conversationMemoryInterface.js +0 -6
- package/dist/client/types/domainTypes.js +0 -5
- package/dist/client/types/errors.js +0 -167
- package/dist/client/types/evaluation.js +0 -5
- package/dist/client/types/evaluationProviders.js +0 -5
- package/dist/client/types/evaluationTypes.js +0 -1
- package/dist/client/types/externalMcp.js +0 -6
- package/dist/client/types/fileReferenceTypes.js +0 -8
- package/dist/client/types/fileTypes.js +0 -4
- package/dist/client/types/generateTypes.js +0 -1
- package/dist/client/types/guardrails.js +0 -1
- package/dist/client/types/hitlTypes.js +0 -8
- package/dist/client/types/index.js +0 -57
- package/dist/client/types/mcpTypes.js +0 -5
- package/dist/client/types/middlewareTypes.js +0 -1
- package/dist/client/types/modelTypes.js +0 -30
- package/dist/client/types/multimodal.js +0 -135
- package/dist/client/types/observability.js +0 -6
- package/dist/client/types/pptTypes.js +0 -82
- package/dist/client/types/providers.js +0 -111
- package/dist/client/types/proxyTypes.js +0 -16
- package/dist/client/types/ragTypes.js +0 -7
- package/dist/client/types/sdkTypes.js +0 -8
- package/dist/client/types/serviceTypes.js +0 -5
- package/dist/client/types/streamTypes.js +0 -1
- package/dist/client/types/subscriptionTypes.js +0 -9
- package/dist/client/types/taskClassificationTypes.js +0 -5
- package/dist/client/types/tools.js +0 -24
- package/dist/client/types/ttsTypes.js +0 -57
- package/dist/client/types/typeAliases.js +0 -48
- package/dist/client/types/utilities.js +0 -4
- package/dist/client/types/workflowTypes.js +0 -30
- package/dist/client/utils/async/withTimeout.js +0 -98
- package/dist/client/utils/asyncMutex.js +0 -60
- package/dist/client/utils/conversationMemory.js +0 -431
- package/dist/client/utils/csvProcessor.js +0 -846
- package/dist/client/utils/errorHandling.js +0 -936
- package/dist/client/utils/evaluationUtils.js +0 -131
- package/dist/client/utils/factoryProcessing.js +0 -589
- package/dist/client/utils/fileDetector.js +0 -2161
- package/dist/client/utils/imageCache.js +0 -376
- package/dist/client/utils/imageProcessor.js +0 -704
- package/dist/client/utils/logger.js +0 -491
- package/dist/client/utils/mcpDefaults.js +0 -134
- package/dist/client/utils/messageBuilder.js +0 -1653
- package/dist/client/utils/modelAliasResolver.js +0 -54
- package/dist/client/utils/modelDetection.js +0 -80
- package/dist/client/utils/modelRouter.js +0 -292
- package/dist/client/utils/multimodalOptionsBuilder.js +0 -65
- package/dist/client/utils/observabilityHelpers.js +0 -47
- package/dist/client/utils/parameterValidation.js +0 -966
- package/dist/client/utils/pdfProcessor.js +0 -410
- package/dist/client/utils/performance.js +0 -222
- package/dist/client/utils/pricing.js +0 -340
- package/dist/client/utils/promptRedaction.js +0 -62
- package/dist/client/utils/providerConfig.js +0 -1009
- package/dist/client/utils/providerHealth.js +0 -1237
- package/dist/client/utils/providerRetry.js +0 -112
- package/dist/client/utils/providerUtils.js +0 -434
- package/dist/client/utils/rateLimiter.js +0 -200
- package/dist/client/utils/redis.js +0 -368
- package/dist/client/utils/retryHandler.js +0 -269
- package/dist/client/utils/retryability.js +0 -22
- package/dist/client/utils/sanitizers/svg.js +0 -481
- package/dist/client/utils/schemaConversion.js +0 -255
- package/dist/client/utils/taskClassificationUtils.js +0 -149
- package/dist/client/utils/taskClassifier.js +0 -94
- package/dist/client/utils/thinkingConfig.js +0 -104
- package/dist/client/utils/timeout.js +0 -359
- package/dist/client/utils/tokenEstimation.js +0 -142
- package/dist/client/utils/tokenLimits.js +0 -125
- package/dist/client/utils/tokenUtils.js +0 -239
- package/dist/client/utils/toolUtils.js +0 -75
- package/dist/client/utils/transformationUtils.js +0 -554
- package/dist/client/utils/ttsProcessor.js +0 -286
- package/dist/client/utils/typeUtils.js +0 -97
- package/dist/client/utils/videoAnalysisProcessor.js +0 -67
- package/dist/client/workflow/config.js +0 -398
- package/dist/client/workflow/core/ensembleExecutor.js +0 -407
- package/dist/client/workflow/core/judgeScorer.js +0 -544
- package/dist/client/workflow/core/responseConditioner.js +0 -225
- package/dist/client/workflow/core/types/conditionerTypes.js +0 -7
- package/dist/client/workflow/core/types/ensembleTypes.js +0 -7
- package/dist/client/workflow/core/types/index.js +0 -7
- package/dist/client/workflow/core/types/judgeTypes.js +0 -7
- package/dist/client/workflow/core/types/layerTypes.js +0 -7
- package/dist/client/workflow/core/types/registryTypes.js +0 -7
- package/dist/client/workflow/core/workflowRegistry.js +0 -304
- package/dist/client/workflow/core/workflowRunner.js +0 -586
- package/dist/client/workflow/index.js +0 -50
- package/dist/client/workflow/types.js +0 -9
- package/dist/client/workflow/utils/types/index.js +0 -7
- package/dist/client/workflow/utils/workflowMetrics.js +0 -311
- package/dist/client/workflow/utils/workflowValidation.js +0 -420
- package/dist/client/workflow/workflows/adaptiveWorkflow.js +0 -366
- package/dist/client/workflow/workflows/consensusWorkflow.js +0 -192
- package/dist/client/workflow/workflows/fallbackWorkflow.js +0 -225
- package/dist/client/workflow/workflows/multiJudgeWorkflow.js +0 -351
- /package/dist/client/{client/reactHooks.js → reactHooks.js} +0 -0
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cache Middleware
|
|
3
|
-
* Provides response caching for server adapters
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* In-memory LRU cache store
|
|
7
|
-
*/
|
|
8
|
-
export class InMemoryCacheStore {
|
|
9
|
-
cache = new Map();
|
|
10
|
-
accessOrder = [];
|
|
11
|
-
maxSize;
|
|
12
|
-
constructor(maxSize = 1000) {
|
|
13
|
-
this.maxSize = maxSize;
|
|
14
|
-
}
|
|
15
|
-
async get(key) {
|
|
16
|
-
const entry = this.cache.get(key);
|
|
17
|
-
if (!entry) {
|
|
18
|
-
return undefined;
|
|
19
|
-
}
|
|
20
|
-
// Check if expired
|
|
21
|
-
if (Date.now() - entry.createdAt > entry.ttlMs) {
|
|
22
|
-
await this.delete(key);
|
|
23
|
-
return undefined;
|
|
24
|
-
}
|
|
25
|
-
// Update access order (LRU)
|
|
26
|
-
this.updateAccessOrder(key);
|
|
27
|
-
return entry;
|
|
28
|
-
}
|
|
29
|
-
async set(key, entry) {
|
|
30
|
-
// Check size limit
|
|
31
|
-
if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
|
|
32
|
-
// Remove least recently used
|
|
33
|
-
const lruKey = this.accessOrder.shift();
|
|
34
|
-
if (lruKey) {
|
|
35
|
-
this.cache.delete(lruKey);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
this.cache.set(key, entry);
|
|
39
|
-
this.updateAccessOrder(key);
|
|
40
|
-
}
|
|
41
|
-
async delete(key) {
|
|
42
|
-
this.cache.delete(key);
|
|
43
|
-
const index = this.accessOrder.indexOf(key);
|
|
44
|
-
if (index > -1) {
|
|
45
|
-
this.accessOrder.splice(index, 1);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
async clear() {
|
|
49
|
-
this.cache.clear();
|
|
50
|
-
this.accessOrder = [];
|
|
51
|
-
}
|
|
52
|
-
updateAccessOrder(key) {
|
|
53
|
-
const index = this.accessOrder.indexOf(key);
|
|
54
|
-
if (index > -1) {
|
|
55
|
-
this.accessOrder.splice(index, 1);
|
|
56
|
-
}
|
|
57
|
-
this.accessOrder.push(key);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Create cache middleware
|
|
62
|
-
*
|
|
63
|
-
* Response headers set by this middleware:
|
|
64
|
-
* - `X-Cache`: "HIT" if served from cache, "MISS" if freshly generated
|
|
65
|
-
* - `X-Cache-Age`: Seconds since the response was cached (only on HIT)
|
|
66
|
-
* - `Cache-Control`: Caching directive with max-age (only on MISS)
|
|
67
|
-
*
|
|
68
|
-
* @example
|
|
69
|
-
* ```typescript
|
|
70
|
-
* const cacheMiddleware = createCacheMiddleware({
|
|
71
|
-
* ttlMs: 60 * 1000, // 1 minute
|
|
72
|
-
* methods: ["GET"],
|
|
73
|
-
* excludePaths: ["/api/health"],
|
|
74
|
-
* });
|
|
75
|
-
*
|
|
76
|
-
* server.registerMiddleware(cacheMiddleware);
|
|
77
|
-
* ```
|
|
78
|
-
*/
|
|
79
|
-
export function createCacheMiddleware(config) {
|
|
80
|
-
const { ttlMs, maxSize = 1000, keyGenerator = defaultKeyGenerator, methods = ["GET"], paths, excludePaths = [], store = new InMemoryCacheStore(maxSize), includeQuery: _includeQuery = true, ttlByPath = {}, } = config;
|
|
81
|
-
return {
|
|
82
|
-
name: "cache",
|
|
83
|
-
order: 20, // Run after auth but before route handlers
|
|
84
|
-
excludePaths,
|
|
85
|
-
handler: async (ctx, next) => {
|
|
86
|
-
// Only cache specified methods
|
|
87
|
-
if (!methods.includes(ctx.method.toUpperCase())) {
|
|
88
|
-
return next();
|
|
89
|
-
}
|
|
90
|
-
// Check if path should be cached
|
|
91
|
-
if (paths && !paths.some((p) => ctx.path.startsWith(p))) {
|
|
92
|
-
return next();
|
|
93
|
-
}
|
|
94
|
-
// Generate cache key
|
|
95
|
-
const cacheKey = keyGenerator(ctx);
|
|
96
|
-
// Check cache
|
|
97
|
-
const cached = await store.get(cacheKey);
|
|
98
|
-
if (cached) {
|
|
99
|
-
// Set cache headers in responseHeaders for actual HTTP response
|
|
100
|
-
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
101
|
-
ctx.responseHeaders["X-Cache"] = "HIT";
|
|
102
|
-
ctx.responseHeaders["X-Cache-Age"] = String(Math.floor((Date.now() - cached.createdAt) / 1000));
|
|
103
|
-
// Return cached data (middleware should handle this)
|
|
104
|
-
ctx.metadata.cachedResponse = cached.data;
|
|
105
|
-
return cached.data;
|
|
106
|
-
}
|
|
107
|
-
// Execute handler and cache result
|
|
108
|
-
const result = await next();
|
|
109
|
-
// Determine TTL for this path
|
|
110
|
-
let pathTtl = ttlMs;
|
|
111
|
-
for (const [pattern, patternTtl] of Object.entries(ttlByPath)) {
|
|
112
|
-
if (ctx.path.startsWith(pattern)) {
|
|
113
|
-
pathTtl = patternTtl;
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// Store in cache
|
|
118
|
-
await store.set(cacheKey, {
|
|
119
|
-
data: result,
|
|
120
|
-
createdAt: Date.now(),
|
|
121
|
-
ttlMs: pathTtl,
|
|
122
|
-
});
|
|
123
|
-
// Set cache headers in responseHeaders for actual HTTP response
|
|
124
|
-
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
125
|
-
ctx.responseHeaders["X-Cache"] = "MISS";
|
|
126
|
-
ctx.responseHeaders["Cache-Control"] =
|
|
127
|
-
`max-age=${Math.floor(pathTtl / 1000)}`;
|
|
128
|
-
return result;
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Default cache key generator
|
|
134
|
-
*/
|
|
135
|
-
function defaultKeyGenerator(ctx) {
|
|
136
|
-
const parts = [ctx.method, ctx.path];
|
|
137
|
-
// Include sorted query params
|
|
138
|
-
const queryKeys = Object.keys(ctx.query).sort();
|
|
139
|
-
if (queryKeys.length > 0) {
|
|
140
|
-
const queryPart = queryKeys.map((k) => `${k}=${ctx.query[k]}`).join("&");
|
|
141
|
-
parts.push(queryPart);
|
|
142
|
-
}
|
|
143
|
-
return parts.join(":");
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Create a cache invalidation helper
|
|
147
|
-
*/
|
|
148
|
-
export function createCacheInvalidator(store) {
|
|
149
|
-
return {
|
|
150
|
-
invalidate: async (pattern) => {
|
|
151
|
-
// For in-memory store, this would need iteration
|
|
152
|
-
// For Redis, you could use pattern matching
|
|
153
|
-
await store.delete(pattern);
|
|
154
|
-
},
|
|
155
|
-
clear: async () => {
|
|
156
|
-
await store.clear();
|
|
157
|
-
},
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
// ============================================
|
|
161
|
-
// LRU Cache (Synchronous)
|
|
162
|
-
// ============================================
|
|
163
|
-
/**
|
|
164
|
-
* Generic LRU (Least Recently Used) Cache
|
|
165
|
-
*
|
|
166
|
-
* Provides a simple in-memory cache with LRU eviction policy.
|
|
167
|
-
*
|
|
168
|
-
* @example
|
|
169
|
-
* ```typescript
|
|
170
|
-
* const cache = new LRUCache<string, number>(100);
|
|
171
|
-
*
|
|
172
|
-
* cache.set("key1", 42);
|
|
173
|
-
* cache.get("key1"); // => 42
|
|
174
|
-
* cache.has("key1"); // => true
|
|
175
|
-
* cache.delete("key1");
|
|
176
|
-
* ```
|
|
177
|
-
*/
|
|
178
|
-
export class LRUCache {
|
|
179
|
-
cache = new Map();
|
|
180
|
-
accessOrder = [];
|
|
181
|
-
maxSize;
|
|
182
|
-
constructor(maxSize = 1000) {
|
|
183
|
-
this.maxSize = maxSize;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Get a value from the cache
|
|
187
|
-
*/
|
|
188
|
-
get(key) {
|
|
189
|
-
const value = this.cache.get(key);
|
|
190
|
-
if (value !== undefined) {
|
|
191
|
-
this.updateAccessOrder(key);
|
|
192
|
-
}
|
|
193
|
-
return value;
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Set a value in the cache
|
|
197
|
-
*/
|
|
198
|
-
set(key, value) {
|
|
199
|
-
// Check size limit
|
|
200
|
-
if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
|
|
201
|
-
// Remove least recently used
|
|
202
|
-
const lruKey = this.accessOrder.shift();
|
|
203
|
-
if (lruKey !== undefined) {
|
|
204
|
-
this.cache.delete(lruKey);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
this.cache.set(key, value);
|
|
208
|
-
this.updateAccessOrder(key);
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Check if a key exists in the cache
|
|
212
|
-
*/
|
|
213
|
-
has(key) {
|
|
214
|
-
return this.cache.has(key);
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Delete a key from the cache
|
|
218
|
-
*/
|
|
219
|
-
delete(key) {
|
|
220
|
-
const deleted = this.cache.delete(key);
|
|
221
|
-
if (deleted) {
|
|
222
|
-
const index = this.accessOrder.indexOf(key);
|
|
223
|
-
if (index > -1) {
|
|
224
|
-
this.accessOrder.splice(index, 1);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
return deleted;
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Clear the cache
|
|
231
|
-
*/
|
|
232
|
-
clear() {
|
|
233
|
-
this.cache.clear();
|
|
234
|
-
this.accessOrder = [];
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Get the current size of the cache
|
|
238
|
-
*/
|
|
239
|
-
get size() {
|
|
240
|
-
return this.cache.size;
|
|
241
|
-
}
|
|
242
|
-
updateAccessOrder(key) {
|
|
243
|
-
const index = this.accessOrder.indexOf(key);
|
|
244
|
-
if (index > -1) {
|
|
245
|
-
this.accessOrder.splice(index, 1);
|
|
246
|
-
}
|
|
247
|
-
this.accessOrder.push(key);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
// ============================================
|
|
251
|
-
// Response Cache Store (Synchronous)
|
|
252
|
-
// ============================================
|
|
253
|
-
/**
|
|
254
|
-
* Synchronous response cache store with TTL support
|
|
255
|
-
*
|
|
256
|
-
* Designed for caching HTTP responses with automatic expiration.
|
|
257
|
-
*
|
|
258
|
-
* @example
|
|
259
|
-
* ```typescript
|
|
260
|
-
* const store = new ResponseCacheStore(100, 60000); // 100 entries, 60s TTL
|
|
261
|
-
*
|
|
262
|
-
* store.set("GET:/api/users", { status: 200, data: [...] });
|
|
263
|
-
* const cached = store.get("GET:/api/users");
|
|
264
|
-
*
|
|
265
|
-
* // Invalidate specific key
|
|
266
|
-
* store.invalidate("GET:/api/users");
|
|
267
|
-
*
|
|
268
|
-
* // Invalidate by pattern (e.g., all user endpoints)
|
|
269
|
-
* store.invalidateByPattern("/api/users");
|
|
270
|
-
* ```
|
|
271
|
-
*/
|
|
272
|
-
export class ResponseCacheStore {
|
|
273
|
-
cache;
|
|
274
|
-
ttlMs;
|
|
275
|
-
constructor(maxSize = 1000, ttlMs = 60000) {
|
|
276
|
-
this.cache = new LRUCache(maxSize);
|
|
277
|
-
this.ttlMs = ttlMs;
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* Get a value from the cache
|
|
281
|
-
*/
|
|
282
|
-
get(key) {
|
|
283
|
-
const entry = this.cache.get(key);
|
|
284
|
-
if (!entry) {
|
|
285
|
-
return undefined;
|
|
286
|
-
}
|
|
287
|
-
// Check if expired
|
|
288
|
-
if (Date.now() > entry.expiresAt) {
|
|
289
|
-
this.cache.delete(key);
|
|
290
|
-
return undefined;
|
|
291
|
-
}
|
|
292
|
-
return entry.value;
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Set a value in the cache
|
|
296
|
-
*/
|
|
297
|
-
set(key, value, ttlMs) {
|
|
298
|
-
const effectiveTtl = ttlMs ?? this.ttlMs;
|
|
299
|
-
this.cache.set(key, {
|
|
300
|
-
value,
|
|
301
|
-
expiresAt: Date.now() + effectiveTtl,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Check if a key exists and is not expired
|
|
306
|
-
*/
|
|
307
|
-
has(key) {
|
|
308
|
-
return this.get(key) !== undefined;
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Invalidate (delete) a specific key
|
|
312
|
-
*/
|
|
313
|
-
invalidate(key) {
|
|
314
|
-
return this.cache.delete(key);
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Invalidate all keys matching a pattern (substring match or regex)
|
|
318
|
-
* @param pattern - String to match or RegExp
|
|
319
|
-
*/
|
|
320
|
-
invalidateByPattern(pattern) {
|
|
321
|
-
return this.invalidatePattern(pattern);
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Invalidate all keys matching a pattern (substring match or regex)
|
|
325
|
-
* @param pattern - String to match or RegExp
|
|
326
|
-
*/
|
|
327
|
-
invalidatePattern(pattern) {
|
|
328
|
-
// Note: This is O(n) because we need to iterate through all keys
|
|
329
|
-
// For production, consider using a more efficient data structure
|
|
330
|
-
let invalidated = 0;
|
|
331
|
-
const keysToDelete = [];
|
|
332
|
-
// Get all keys (requires accessing internal cache)
|
|
333
|
-
const internalCache = this.cache.cache;
|
|
334
|
-
for (const key of internalCache.keys()) {
|
|
335
|
-
const matches = pattern instanceof RegExp ? pattern.test(key) : key.includes(pattern);
|
|
336
|
-
if (matches) {
|
|
337
|
-
keysToDelete.push(key);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
for (const key of keysToDelete) {
|
|
341
|
-
if (this.cache.delete(key)) {
|
|
342
|
-
invalidated++;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
return invalidated;
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Clear the entire cache
|
|
349
|
-
*/
|
|
350
|
-
clear() {
|
|
351
|
-
this.cache.clear();
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Get the current size of the cache
|
|
355
|
-
*/
|
|
356
|
-
get size() {
|
|
357
|
-
return this.cache.size;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Common Middleware Components
|
|
3
|
-
* Utility middleware for common server operations
|
|
4
|
-
*/
|
|
5
|
-
import { getMetricsAggregator } from "../../observability/index.js";
|
|
6
|
-
import { SpanSerializer, SpanStatus, SpanType, } from "../../observability/index.js";
|
|
7
|
-
import { logger } from "../../utils/logger.js";
|
|
8
|
-
/**
|
|
9
|
-
* Create request timing middleware
|
|
10
|
-
* Adds timing information to responses
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* server.registerMiddleware(createTimingMiddleware());
|
|
15
|
-
* ```
|
|
16
|
-
*/
|
|
17
|
-
export function createTimingMiddleware() {
|
|
18
|
-
return {
|
|
19
|
-
name: "timing",
|
|
20
|
-
order: 0, // Run first
|
|
21
|
-
handler: async (ctx, next) => {
|
|
22
|
-
const startTime = Date.now();
|
|
23
|
-
const startHrTime = process.hrtime.bigint();
|
|
24
|
-
// Store start time in metadata
|
|
25
|
-
ctx.metadata.requestStartTime = startTime;
|
|
26
|
-
const span = SpanSerializer.createSpan(SpanType.SERVER_REQUEST, "server.middleware.timing", {
|
|
27
|
-
"server.operation": "middleware",
|
|
28
|
-
"server.middleware": "timing",
|
|
29
|
-
});
|
|
30
|
-
try {
|
|
31
|
-
const result = await next();
|
|
32
|
-
// Calculate duration
|
|
33
|
-
const endHrTime = process.hrtime.bigint();
|
|
34
|
-
const durationNs = Number(endHrTime - startHrTime);
|
|
35
|
-
const durationMs = durationNs / 1_000_000;
|
|
36
|
-
// Add timing headers to responseHeaders (adapters read from here)
|
|
37
|
-
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
38
|
-
ctx.responseHeaders["X-Response-Time"] = `${durationMs.toFixed(2)}ms`;
|
|
39
|
-
ctx.responseHeaders["Server-Timing"] =
|
|
40
|
-
`total;dur=${durationMs.toFixed(2)}`;
|
|
41
|
-
span.durationMs = Date.now() - startTime;
|
|
42
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
|
|
43
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
span.durationMs = Date.now() - startTime;
|
|
48
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR);
|
|
49
|
-
endedSpan.statusMessage =
|
|
50
|
-
error instanceof Error ? error.message : String(error);
|
|
51
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
52
|
-
throw error;
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Create request ID middleware
|
|
59
|
-
* Ensures every request has a unique ID
|
|
60
|
-
*
|
|
61
|
-
* @example
|
|
62
|
-
* ```typescript
|
|
63
|
-
* server.registerMiddleware(createRequestIdMiddleware());
|
|
64
|
-
* ```
|
|
65
|
-
*/
|
|
66
|
-
export function createRequestIdMiddleware(options) {
|
|
67
|
-
const { headerName = "x-request-id", prefix = "req", generator = () => `${prefix}-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`, } = options ?? {};
|
|
68
|
-
return {
|
|
69
|
-
name: "request-id",
|
|
70
|
-
order: 0, // Run first
|
|
71
|
-
handler: async (ctx, next) => {
|
|
72
|
-
// Use existing ID or generate new one
|
|
73
|
-
ctx.requestId =
|
|
74
|
-
ctx.headers[headerName.toLowerCase()] || ctx.requestId || generator();
|
|
75
|
-
// Add request ID header to responseHeaders (adapters read from here)
|
|
76
|
-
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
77
|
-
ctx.responseHeaders["X-Request-ID"] = ctx.requestId;
|
|
78
|
-
return next();
|
|
79
|
-
},
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Create error handling middleware
|
|
84
|
-
* Catches errors and formats them consistently
|
|
85
|
-
*
|
|
86
|
-
* @example
|
|
87
|
-
* ```typescript
|
|
88
|
-
* server.registerMiddleware(createErrorHandlingMiddleware({
|
|
89
|
-
* includeStack: process.env.NODE_ENV === 'development',
|
|
90
|
-
* }));
|
|
91
|
-
* ```
|
|
92
|
-
*/
|
|
93
|
-
export function createErrorHandlingMiddleware(options) {
|
|
94
|
-
const { includeStack = false, onError, logErrors = true } = options ?? {};
|
|
95
|
-
return {
|
|
96
|
-
name: "error-handling",
|
|
97
|
-
order: 1, // Run very early to catch all errors
|
|
98
|
-
handler: async (ctx, next) => {
|
|
99
|
-
const span = SpanSerializer.createSpan(SpanType.SERVER_REQUEST, "server.middleware.errorHandling", {
|
|
100
|
-
"server.operation": "middleware",
|
|
101
|
-
"server.middleware": "error-handling",
|
|
102
|
-
});
|
|
103
|
-
const middlewareStartTime = Date.now();
|
|
104
|
-
try {
|
|
105
|
-
const result = await next();
|
|
106
|
-
span.durationMs = Date.now() - middlewareStartTime;
|
|
107
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
|
|
108
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
109
|
-
return result;
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
const err = error;
|
|
113
|
-
if (logErrors) {
|
|
114
|
-
logger.error("[ErrorMiddleware]", {
|
|
115
|
-
requestId: ctx.requestId,
|
|
116
|
-
error: err.message,
|
|
117
|
-
stack: err.stack,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
span.durationMs = Date.now() - middlewareStartTime;
|
|
121
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR);
|
|
122
|
-
endedSpan.statusMessage = err.message;
|
|
123
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
124
|
-
// Use custom handler if provided
|
|
125
|
-
if (onError) {
|
|
126
|
-
return onError(err, ctx);
|
|
127
|
-
}
|
|
128
|
-
// Default error response
|
|
129
|
-
const statusCode = err.statusCode || 500;
|
|
130
|
-
const errorResponse = {
|
|
131
|
-
error: {
|
|
132
|
-
code: err.code || `HTTP_${statusCode}`,
|
|
133
|
-
message: statusCode === 500 ? "Internal server error" : err.message,
|
|
134
|
-
},
|
|
135
|
-
metadata: {
|
|
136
|
-
requestId: ctx.requestId,
|
|
137
|
-
timestamp: new Date().toISOString(),
|
|
138
|
-
},
|
|
139
|
-
};
|
|
140
|
-
// Include stack in development
|
|
141
|
-
if (includeStack && err.stack) {
|
|
142
|
-
errorResponse.error.stack = err.stack;
|
|
143
|
-
}
|
|
144
|
-
// Store error response in metadata
|
|
145
|
-
ctx.metadata.errorResponse = errorResponse;
|
|
146
|
-
ctx.metadata.errorStatusCode = statusCode;
|
|
147
|
-
// Re-throw for adapter to handle
|
|
148
|
-
throw error;
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Create security headers middleware
|
|
155
|
-
* Adds common security headers to responses
|
|
156
|
-
*
|
|
157
|
-
* @example
|
|
158
|
-
* ```typescript
|
|
159
|
-
* server.registerMiddleware(createSecurityHeadersMiddleware());
|
|
160
|
-
* ```
|
|
161
|
-
*/
|
|
162
|
-
export function createSecurityHeadersMiddleware(options) {
|
|
163
|
-
const { contentSecurityPolicy, frameOptions = "DENY", contentTypeOptions = "nosniff", hstsMaxAge = 31536000, referrerPolicy = "strict-origin-when-cross-origin", customHeaders = {}, } = options ?? {};
|
|
164
|
-
// Build headers object
|
|
165
|
-
const securityHeaders = {};
|
|
166
|
-
if (contentSecurityPolicy) {
|
|
167
|
-
securityHeaders["Content-Security-Policy"] = contentSecurityPolicy;
|
|
168
|
-
}
|
|
169
|
-
if (frameOptions) {
|
|
170
|
-
securityHeaders["X-Frame-Options"] = frameOptions;
|
|
171
|
-
}
|
|
172
|
-
if (contentTypeOptions) {
|
|
173
|
-
securityHeaders["X-Content-Type-Options"] = contentTypeOptions;
|
|
174
|
-
}
|
|
175
|
-
if (hstsMaxAge !== false) {
|
|
176
|
-
securityHeaders["Strict-Transport-Security"] =
|
|
177
|
-
`max-age=${hstsMaxAge}; includeSubDomains`;
|
|
178
|
-
}
|
|
179
|
-
if (referrerPolicy) {
|
|
180
|
-
securityHeaders["Referrer-Policy"] = referrerPolicy;
|
|
181
|
-
}
|
|
182
|
-
// Add X-XSS-Protection for older browsers
|
|
183
|
-
securityHeaders["X-XSS-Protection"] = "1; mode=block";
|
|
184
|
-
// Add custom headers
|
|
185
|
-
Object.assign(securityHeaders, customHeaders);
|
|
186
|
-
return {
|
|
187
|
-
name: "security-headers",
|
|
188
|
-
order: 2,
|
|
189
|
-
handler: async (ctx, next) => {
|
|
190
|
-
// Add security headers to responseHeaders (adapters read from here)
|
|
191
|
-
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
192
|
-
Object.assign(ctx.responseHeaders, securityHeaders);
|
|
193
|
-
return next();
|
|
194
|
-
},
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Create request logging middleware
|
|
199
|
-
* Logs request and response information
|
|
200
|
-
*
|
|
201
|
-
* @example
|
|
202
|
-
* ```typescript
|
|
203
|
-
* server.registerMiddleware(createLoggingMiddleware({
|
|
204
|
-
* logBody: process.env.NODE_ENV === 'development',
|
|
205
|
-
* }));
|
|
206
|
-
* ```
|
|
207
|
-
*/
|
|
208
|
-
export function createLoggingMiddleware(options) {
|
|
209
|
-
const { logBody = false, logResponse = false, logger = console, skipPaths = ["/health", "/ready", "/metrics"], } = options ?? {};
|
|
210
|
-
return {
|
|
211
|
-
name: "logging",
|
|
212
|
-
order: 3,
|
|
213
|
-
excludePaths: skipPaths,
|
|
214
|
-
handler: async (ctx, next) => {
|
|
215
|
-
const startTime = Date.now();
|
|
216
|
-
// Log request
|
|
217
|
-
const requestLog = {
|
|
218
|
-
requestId: ctx.requestId,
|
|
219
|
-
method: ctx.method,
|
|
220
|
-
path: ctx.path,
|
|
221
|
-
query: Object.keys(ctx.query).length > 0 ? ctx.query : undefined,
|
|
222
|
-
};
|
|
223
|
-
if (logBody && ctx.body) {
|
|
224
|
-
requestLog.body = ctx.body;
|
|
225
|
-
}
|
|
226
|
-
logger.info(`[Request] ${ctx.method} ${ctx.path}`, requestLog);
|
|
227
|
-
try {
|
|
228
|
-
const result = await next();
|
|
229
|
-
const duration = Date.now() - startTime;
|
|
230
|
-
// Log response
|
|
231
|
-
const responseLog = {
|
|
232
|
-
requestId: ctx.requestId,
|
|
233
|
-
duration: `${duration}ms`,
|
|
234
|
-
status: 200,
|
|
235
|
-
};
|
|
236
|
-
if (logResponse && result) {
|
|
237
|
-
responseLog.response = result;
|
|
238
|
-
}
|
|
239
|
-
logger.info(`[Response] ${ctx.method} ${ctx.path}`, responseLog);
|
|
240
|
-
return result;
|
|
241
|
-
}
|
|
242
|
-
catch (error) {
|
|
243
|
-
const duration = Date.now() - startTime;
|
|
244
|
-
const err = error;
|
|
245
|
-
logger.error(`[Error] ${ctx.method} ${ctx.path}`, {
|
|
246
|
-
requestId: ctx.requestId,
|
|
247
|
-
duration: `${duration}ms`,
|
|
248
|
-
error: err.message,
|
|
249
|
-
status: err.statusCode || 500,
|
|
250
|
-
});
|
|
251
|
-
throw error;
|
|
252
|
-
}
|
|
253
|
-
},
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Create compression preference middleware
|
|
258
|
-
* Signals compression preference to adapters
|
|
259
|
-
*/
|
|
260
|
-
export function createCompressionMiddleware(options) {
|
|
261
|
-
const { threshold = 1024, contentTypes = [
|
|
262
|
-
"text/",
|
|
263
|
-
"application/json",
|
|
264
|
-
"application/javascript",
|
|
265
|
-
"application/xml",
|
|
266
|
-
], } = options ?? {};
|
|
267
|
-
return {
|
|
268
|
-
name: "compression",
|
|
269
|
-
order: 5,
|
|
270
|
-
handler: async (ctx, next) => {
|
|
271
|
-
// Store compression preferences in metadata
|
|
272
|
-
ctx.metadata.compression = {
|
|
273
|
-
enabled: true,
|
|
274
|
-
threshold,
|
|
275
|
-
contentTypes,
|
|
276
|
-
acceptEncoding: ctx.headers["accept-encoding"] || "",
|
|
277
|
-
};
|
|
278
|
-
return next();
|
|
279
|
-
},
|
|
280
|
-
};
|
|
281
|
-
}
|