@juspay/neurolink 9.31.2 → 9.32.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/auth/AuthProviderFactory.d.ts +71 -0
- package/dist/auth/AuthProviderFactory.js +111 -0
- package/dist/auth/AuthProviderRegistry.d.ts +33 -0
- package/dist/auth/AuthProviderRegistry.js +190 -0
- package/dist/auth/RequestContext.d.ts +23 -0
- package/dist/auth/RequestContext.js +78 -0
- package/dist/auth/anthropicOAuth.js +1 -1
- package/dist/auth/authContext.d.ts +198 -0
- package/dist/auth/authContext.js +314 -0
- package/dist/auth/errors.d.ts +63 -0
- package/dist/auth/errors.js +39 -0
- package/dist/auth/index.d.ts +20 -8
- package/dist/auth/index.js +35 -7
- package/dist/auth/middleware/AuthMiddleware.d.ts +181 -0
- package/dist/auth/middleware/AuthMiddleware.js +519 -0
- package/dist/auth/middleware/rateLimitByUser.d.ts +282 -0
- package/dist/auth/middleware/rateLimitByUser.js +554 -0
- package/dist/auth/providers/BaseAuthProvider.d.ts +259 -0
- package/dist/auth/providers/BaseAuthProvider.js +723 -0
- package/dist/auth/providers/CognitoProvider.d.ts +61 -0
- package/dist/auth/providers/CognitoProvider.js +304 -0
- package/dist/auth/providers/KeycloakProvider.d.ts +61 -0
- package/dist/auth/providers/KeycloakProvider.js +393 -0
- package/dist/auth/providers/auth0.d.ts +59 -0
- package/dist/auth/providers/auth0.js +274 -0
- package/dist/auth/providers/betterAuth.d.ts +51 -0
- package/dist/auth/providers/betterAuth.js +182 -0
- package/dist/auth/providers/clerk.d.ts +65 -0
- package/dist/auth/providers/clerk.js +317 -0
- package/dist/auth/providers/custom.d.ts +64 -0
- package/dist/auth/providers/custom.js +112 -0
- package/dist/auth/providers/firebase.d.ts +63 -0
- package/dist/auth/providers/firebase.js +226 -0
- package/dist/auth/providers/jwt.d.ts +68 -0
- package/dist/auth/providers/jwt.js +212 -0
- package/dist/auth/providers/oauth2.d.ts +73 -0
- package/dist/auth/providers/oauth2.js +303 -0
- package/dist/auth/providers/supabase.d.ts +63 -0
- package/dist/auth/providers/supabase.js +259 -0
- package/dist/auth/providers/workos.d.ts +61 -0
- package/dist/auth/providers/workos.js +284 -0
- package/dist/auth/serverBridge.d.ts +14 -0
- package/dist/auth/serverBridge.js +25 -0
- package/dist/auth/sessionManager.d.ts +142 -0
- package/dist/auth/sessionManager.js +437 -0
- package/dist/cli/commands/authProviders.d.ts +43 -0
- package/dist/cli/commands/authProviders.js +399 -0
- package/dist/cli/commands/proxy.js +18 -5
- package/dist/cli/factories/authCommandFactory.d.ts +23 -5
- package/dist/cli/factories/authCommandFactory.js +108 -5
- package/dist/cli/parser.js +1 -1
- package/dist/client/aiSdkAdapter.js +1 -1
- package/dist/client/index.js +138 -477
- package/dist/core/factory.js +0 -1
- package/dist/core/infrastructure/baseRegistry.d.ts +3 -1
- package/dist/core/infrastructure/baseRegistry.js +5 -1
- package/dist/core/redisConversationMemoryManager.js +1 -1
- package/dist/features/ppt/slideGenerator.js +0 -1
- package/dist/features/ppt/utils.js +0 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +25 -0
- package/dist/lib/auth/AuthProviderFactory.d.ts +71 -0
- package/dist/lib/auth/AuthProviderFactory.js +112 -0
- package/dist/lib/auth/AuthProviderRegistry.d.ts +33 -0
- package/dist/lib/auth/AuthProviderRegistry.js +191 -0
- package/dist/lib/auth/RequestContext.d.ts +23 -0
- package/dist/lib/auth/RequestContext.js +79 -0
- package/dist/lib/auth/authContext.d.ts +198 -0
- package/dist/lib/auth/authContext.js +315 -0
- package/dist/lib/auth/errors.d.ts +63 -0
- package/dist/lib/auth/errors.js +40 -0
- package/dist/lib/auth/index.d.ts +20 -8
- package/dist/lib/auth/index.js +35 -7
- package/dist/lib/auth/middleware/AuthMiddleware.d.ts +181 -0
- package/dist/lib/auth/middleware/AuthMiddleware.js +520 -0
- package/dist/lib/auth/middleware/rateLimitByUser.d.ts +282 -0
- package/dist/lib/auth/middleware/rateLimitByUser.js +555 -0
- package/dist/lib/auth/providers/BaseAuthProvider.d.ts +259 -0
- package/dist/lib/auth/providers/BaseAuthProvider.js +724 -0
- package/dist/lib/auth/providers/CognitoProvider.d.ts +61 -0
- package/dist/lib/auth/providers/CognitoProvider.js +305 -0
- package/dist/lib/auth/providers/KeycloakProvider.d.ts +61 -0
- package/dist/lib/auth/providers/KeycloakProvider.js +394 -0
- package/dist/lib/auth/providers/auth0.d.ts +59 -0
- package/dist/lib/auth/providers/auth0.js +275 -0
- package/dist/lib/auth/providers/betterAuth.d.ts +51 -0
- package/dist/lib/auth/providers/betterAuth.js +183 -0
- package/dist/lib/auth/providers/clerk.d.ts +65 -0
- package/dist/lib/auth/providers/clerk.js +318 -0
- package/dist/lib/auth/providers/custom.d.ts +64 -0
- package/dist/lib/auth/providers/custom.js +113 -0
- package/dist/lib/auth/providers/firebase.d.ts +63 -0
- package/dist/lib/auth/providers/firebase.js +227 -0
- package/dist/lib/auth/providers/jwt.d.ts +68 -0
- package/dist/lib/auth/providers/jwt.js +213 -0
- package/dist/lib/auth/providers/oauth2.d.ts +73 -0
- package/dist/lib/auth/providers/oauth2.js +304 -0
- package/dist/lib/auth/providers/supabase.d.ts +63 -0
- package/dist/lib/auth/providers/supabase.js +260 -0
- package/dist/lib/auth/providers/workos.d.ts +61 -0
- package/dist/lib/auth/providers/workos.js +285 -0
- package/dist/lib/auth/serverBridge.d.ts +14 -0
- package/dist/lib/auth/serverBridge.js +26 -0
- package/dist/lib/auth/sessionManager.d.ts +142 -0
- package/dist/lib/auth/sessionManager.js +438 -0
- package/dist/lib/core/infrastructure/baseRegistry.d.ts +3 -1
- package/dist/lib/core/infrastructure/baseRegistry.js +5 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +25 -0
- package/dist/lib/mcp/toolRegistry.js +11 -1
- package/dist/lib/neurolink.d.ts +42 -1
- package/dist/lib/neurolink.js +218 -0
- package/dist/lib/rag/ChunkerRegistry.js +2 -2
- package/dist/lib/rag/metadata/MetadataExtractorRegistry.js +2 -2
- package/dist/lib/rag/reranker/RerankerRegistry.js +2 -2
- package/dist/lib/server/routes/agentRoutes.js +20 -2
- package/dist/lib/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/lib/types/authTypes.d.ts +937 -1
- package/dist/lib/types/authTypes.js +2 -1
- package/dist/lib/types/configTypes.d.ts +46 -0
- package/dist/lib/types/generateTypes.d.ts +6 -0
- package/dist/lib/types/index.d.ts +1 -0
- package/dist/lib/types/streamTypes.d.ts +6 -0
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- package/dist/mcp/toolRegistry.js +11 -1
- package/dist/neurolink.d.ts +42 -1
- package/dist/neurolink.js +218 -0
- package/dist/providers/azureOpenai.js +1 -1
- package/dist/providers/huggingFace.js +0 -1
- package/dist/providers/openaiCompatible.js +0 -1
- package/dist/rag/ChunkerRegistry.js +2 -2
- package/dist/rag/metadata/MetadataExtractorRegistry.js +2 -2
- package/dist/rag/reranker/RerankerRegistry.js +2 -2
- package/dist/sdk/toolRegistration.js +0 -1
- package/dist/server/openapi/generator.js +1 -1
- package/dist/server/routes/agentRoutes.js +20 -2
- package/dist/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/types/authTypes.d.ts +937 -1
- package/dist/types/authTypes.js +2 -1
- package/dist/types/configTypes.d.ts +46 -0
- package/dist/types/configTypes.js +0 -5
- package/dist/types/generateTypes.d.ts +6 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/modelTypes.js +0 -1
- package/dist/types/streamTypes.d.ts +6 -0
- package/dist/types/tools.js +0 -1
- package/dist/types/typeAliases.js +0 -1
- package/dist/types/utilities.js +1 -1
- package/dist/types/workflowTypes.js +0 -1
- package/dist/utils/providerRetry.js +0 -1
- package/dist/utils/providerUtils.js +0 -1
- package/package.json +3 -2
- package/dist/client/adapters/providerImageAdapter.js +0 -588
- package/dist/client/adapters/tts/googleTTSHandler.js +0 -344
- package/dist/client/adapters/video/directorPipeline.js +0 -516
- package/dist/client/adapters/video/ffmpegAdapter.js +0 -206
- package/dist/client/adapters/video/frameExtractor.js +0 -143
- package/dist/client/adapters/video/vertexVideoHandler.js +0 -763
- package/dist/client/adapters/video/videoAnalyzer.js +0 -238
- package/dist/client/adapters/video/videoMerger.js +0 -171
- package/dist/client/agent/directTools.js +0 -840
- package/dist/client/auth/anthropicOAuth.js +0 -974
- package/dist/client/auth/tokenStore.js +0 -799
- package/dist/client/client/aiSdkAdapter.js +0 -487
- package/dist/client/client/auth.js +0 -473
- package/dist/client/client/errors.js +0 -552
- package/dist/client/client/httpClient.js +0 -837
- package/dist/client/client/index.js +0 -172
- package/dist/client/client/interceptors.js +0 -601
- package/dist/client/client/sseClient.js +0 -545
- package/dist/client/client/streamingClient.js +0 -917
- package/dist/client/client/wsClient.js +0 -369
- package/dist/client/config/configManager.js +0 -303
- package/dist/client/config/conversationMemory.js +0 -86
- package/dist/client/config/taskClassificationConfig.js +0 -148
- package/dist/client/constants/contextWindows.js +0 -295
- package/dist/client/constants/enums.js +0 -853
- package/dist/client/constants/index.js +0 -207
- package/dist/client/constants/performance.js +0 -389
- package/dist/client/constants/retry.js +0 -266
- package/dist/client/constants/timeouts.js +0 -182
- package/dist/client/constants/tokens.js +0 -380
- package/dist/client/constants/videoErrors.js +0 -46
- package/dist/client/context/budgetChecker.js +0 -98
- package/dist/client/context/contextCompactor.js +0 -205
- package/dist/client/context/emergencyTruncation.js +0 -88
- package/dist/client/context/errorDetection.js +0 -171
- package/dist/client/context/errors.js +0 -21
- package/dist/client/context/fileTokenBudget.js +0 -127
- package/dist/client/context/prompts/summarizationPrompt.js +0 -117
- package/dist/client/context/stages/fileReadDeduplicator.js +0 -66
- package/dist/client/context/stages/slidingWindowTruncator.js +0 -190
- package/dist/client/context/stages/structuredSummarizer.js +0 -99
- package/dist/client/context/stages/toolOutputPruner.js +0 -52
- package/dist/client/context/summarizationEngine.js +0 -136
- package/dist/client/context/toolOutputLimits.js +0 -78
- package/dist/client/context/toolPairRepair.js +0 -66
- package/dist/client/core/analytics.js +0 -88
- package/dist/client/core/baseProvider.js +0 -1385
- package/dist/client/core/constants.js +0 -140
- package/dist/client/core/conversationMemoryFactory.js +0 -141
- package/dist/client/core/conversationMemoryInitializer.js +0 -128
- package/dist/client/core/conversationMemoryManager.js +0 -344
- package/dist/client/core/dynamicModels.js +0 -358
- package/dist/client/core/evaluation.js +0 -309
- package/dist/client/core/evaluationProviders.js +0 -248
- package/dist/client/core/factory.js +0 -412
- package/dist/client/core/infrastructure/baseError.js +0 -22
- package/dist/client/core/infrastructure/baseFactory.js +0 -54
- package/dist/client/core/infrastructure/baseRegistry.js +0 -49
- package/dist/client/core/infrastructure/index.js +0 -5
- package/dist/client/core/infrastructure/retry.js +0 -20
- package/dist/client/core/infrastructure/typedEventEmitter.js +0 -23
- package/dist/client/core/modelConfiguration.js +0 -851
- package/dist/client/core/modules/GenerationHandler.js +0 -588
- package/dist/client/core/modules/MessageBuilder.js +0 -273
- package/dist/client/core/modules/StreamHandler.js +0 -185
- package/dist/client/core/modules/TelemetryHandler.js +0 -203
- package/dist/client/core/modules/ToolsManager.js +0 -499
- package/dist/client/core/modules/Utilities.js +0 -331
- package/dist/client/core/redisConversationMemoryManager.js +0 -1435
- package/dist/client/core/streamAnalytics.js +0 -131
- package/dist/client/evaluation/contextBuilder.js +0 -134
- package/dist/client/evaluation/index.js +0 -61
- package/dist/client/evaluation/prompts.js +0 -73
- package/dist/client/evaluation/ragasEvaluator.js +0 -110
- package/dist/client/evaluation/retryManager.js +0 -78
- package/dist/client/evaluation/scoring.js +0 -61
- package/dist/client/factories/providerFactory.js +0 -166
- package/dist/client/factories/providerRegistry.js +0 -166
- package/dist/client/features/ppt/constants.js +0 -896
- package/dist/client/features/ppt/contentPlanner.js +0 -529
- package/dist/client/features/ppt/presentationOrchestrator.js +0 -236
- package/dist/client/features/ppt/slideGenerator.js +0 -532
- package/dist/client/features/ppt/slideRenderers.js +0 -2383
- package/dist/client/features/ppt/slideTypeInference.js +0 -405
- package/dist/client/features/ppt/types.js +0 -13
- package/dist/client/features/ppt/utils.js +0 -443
- package/dist/client/files/fileReferenceRegistry.js +0 -1543
- package/dist/client/files/fileTools.js +0 -450
- package/dist/client/files/streamingReader.js +0 -321
- package/dist/client/files/types.js +0 -23
- package/dist/client/hitl/hitlErrors.js +0 -54
- package/dist/client/hitl/hitlManager.js +0 -460
- package/dist/client/mcp/agentExposure.js +0 -356
- package/dist/client/mcp/auth/index.js +0 -11
- package/dist/client/mcp/auth/oauthClientProvider.js +0 -325
- package/dist/client/mcp/auth/tokenStorage.js +0 -134
- package/dist/client/mcp/batching/index.js +0 -10
- package/dist/client/mcp/batching/requestBatcher.js +0 -441
- package/dist/client/mcp/caching/index.js +0 -10
- package/dist/client/mcp/caching/toolCache.js +0 -433
- package/dist/client/mcp/elicitation/elicitationManager.js +0 -376
- package/dist/client/mcp/elicitation/index.js +0 -11
- package/dist/client/mcp/elicitation/types.js +0 -10
- package/dist/client/mcp/elicitationProtocol.js +0 -375
- package/dist/client/mcp/enhancedToolDiscovery.js +0 -481
- package/dist/client/mcp/externalServerManager.js +0 -1478
- package/dist/client/mcp/factory.js +0 -161
- package/dist/client/mcp/flexibleToolValidator.js +0 -161
- package/dist/client/mcp/httpRateLimiter.js +0 -391
- package/dist/client/mcp/httpRetryHandler.js +0 -178
- package/dist/client/mcp/index.js +0 -74
- package/dist/client/mcp/mcpCircuitBreaker.js +0 -427
- package/dist/client/mcp/mcpClientFactory.js +0 -708
- package/dist/client/mcp/mcpRegistryClient.js +0 -488
- package/dist/client/mcp/mcpServerBase.js +0 -373
- package/dist/client/mcp/multiServerManager.js +0 -579
- package/dist/client/mcp/registry.js +0 -158
- package/dist/client/mcp/routing/index.js +0 -10
- package/dist/client/mcp/routing/toolRouter.js +0 -416
- package/dist/client/mcp/serverCapabilities.js +0 -502
- package/dist/client/mcp/servers/agent/directToolsServer.js +0 -150
- package/dist/client/mcp/toolAnnotations.js +0 -239
- package/dist/client/mcp/toolConverter.js +0 -258
- package/dist/client/mcp/toolDiscoveryService.js +0 -798
- package/dist/client/mcp/toolIntegration.js +0 -334
- package/dist/client/mcp/toolRegistry.js +0 -719
- package/dist/client/memory/hippocampusInitializer.js +0 -19
- package/dist/client/memory/memoryRetrievalTools.js +0 -166
- package/dist/client/middleware/builtin/analytics.js +0 -132
- package/dist/client/middleware/builtin/autoEvaluation.js +0 -203
- package/dist/client/middleware/builtin/guardrails.js +0 -109
- package/dist/client/middleware/builtin/lifecycle.js +0 -168
- package/dist/client/middleware/factory.js +0 -327
- package/dist/client/middleware/registry.js +0 -295
- package/dist/client/middleware/utils/guardrailsUtils.js +0 -396
- package/dist/client/models/anthropicModels.js +0 -527
- package/dist/client/neurolink.js +0 -8015
- package/dist/client/observability/exporterRegistry.js +0 -413
- package/dist/client/observability/exporters/arizeExporter.js +0 -138
- package/dist/client/observability/exporters/baseExporter.js +0 -190
- package/dist/client/observability/exporters/braintrustExporter.js +0 -154
- package/dist/client/observability/exporters/datadogExporter.js +0 -196
- package/dist/client/observability/exporters/laminarExporter.js +0 -302
- package/dist/client/observability/exporters/langfuseExporter.js +0 -209
- package/dist/client/observability/exporters/langsmithExporter.js +0 -143
- package/dist/client/observability/exporters/otelExporter.js +0 -164
- package/dist/client/observability/exporters/posthogExporter.js +0 -287
- package/dist/client/observability/exporters/sentryExporter.js +0 -165
- package/dist/client/observability/index.js +0 -31
- package/dist/client/observability/metricsAggregator.js +0 -556
- package/dist/client/observability/otelBridge.js +0 -131
- package/dist/client/observability/retryPolicy.js +0 -383
- package/dist/client/observability/sampling/samplers.js +0 -216
- package/dist/client/observability/spanProcessor.js +0 -303
- package/dist/client/observability/tokenTracker.js +0 -413
- package/dist/client/observability/types/exporterTypes.js +0 -5
- package/dist/client/observability/types/index.js +0 -4
- package/dist/client/observability/types/spanTypes.js +0 -92
- package/dist/client/observability/utils/safeMetadata.js +0 -25
- package/dist/client/observability/utils/spanSerializer.js +0 -292
- package/dist/client/processors/archive/ArchiveProcessor.js +0 -1308
- package/dist/client/processors/base/BaseFileProcessor.js +0 -614
- package/dist/client/processors/base/types.js +0 -82
- package/dist/client/processors/config/fileTypes.js +0 -520
- package/dist/client/processors/config/index.js +0 -92
- package/dist/client/processors/config/languageMap.js +0 -410
- package/dist/client/processors/config/mimeTypes.js +0 -363
- package/dist/client/processors/config/sizeLimits.js +0 -258
- package/dist/client/processors/document/ExcelProcessor.js +0 -590
- package/dist/client/processors/document/OpenDocumentProcessor.js +0 -212
- package/dist/client/processors/document/PptxProcessor.js +0 -157
- package/dist/client/processors/document/RtfProcessor.js +0 -361
- package/dist/client/processors/document/WordProcessor.js +0 -353
- package/dist/client/processors/errors/FileErrorCode.js +0 -255
- package/dist/client/processors/errors/errorHelpers.js +0 -386
- package/dist/client/processors/errors/errorSerializer.js +0 -507
- package/dist/client/processors/errors/index.js +0 -49
- package/dist/client/processors/markup/SvgProcessor.js +0 -240
- package/dist/client/processors/media/AudioProcessor.js +0 -707
- package/dist/client/processors/media/VideoProcessor.js +0 -1045
- package/dist/client/providers/amazonBedrock.js +0 -1512
- package/dist/client/providers/amazonSagemaker.js +0 -162
- package/dist/client/providers/anthropic.js +0 -831
- package/dist/client/providers/azureOpenai.js +0 -143
- package/dist/client/providers/googleAiStudio.js +0 -1200
- package/dist/client/providers/googleNativeGemini3.js +0 -543
- package/dist/client/providers/googleVertex.js +0 -2936
- package/dist/client/providers/huggingFace.js +0 -315
- package/dist/client/providers/litellm.js +0 -488
- package/dist/client/providers/mistral.js +0 -157
- package/dist/client/providers/ollama.js +0 -1579
- package/dist/client/providers/openAI.js +0 -627
- package/dist/client/providers/openRouter.js +0 -543
- package/dist/client/providers/openaiCompatible.js +0 -290
- package/dist/client/providers/providerTypeUtils.js +0 -46
- package/dist/client/providers/sagemaker/adaptive-semaphore.js +0 -215
- package/dist/client/providers/sagemaker/client.js +0 -472
- package/dist/client/providers/sagemaker/config.js +0 -317
- package/dist/client/providers/sagemaker/detection.js +0 -606
- package/dist/client/providers/sagemaker/error-constants.js +0 -227
- package/dist/client/providers/sagemaker/errors.js +0 -299
- package/dist/client/providers/sagemaker/language-model.js +0 -775
- package/dist/client/providers/sagemaker/parsers.js +0 -634
- package/dist/client/providers/sagemaker/streaming.js +0 -331
- package/dist/client/providers/sagemaker/structured-parser.js +0 -625
- package/dist/client/proxy/accountQuota.js +0 -162
- package/dist/client/proxy/claudeFormat.js +0 -595
- package/dist/client/proxy/modelRouter.js +0 -29
- package/dist/client/proxy/oauthFetch.js +0 -367
- package/dist/client/proxy/proxyFetch.js +0 -586
- package/dist/client/proxy/requestLogger.js +0 -207
- package/dist/client/proxy/tokenRefresh.js +0 -124
- package/dist/client/proxy/usageStats.js +0 -74
- package/dist/client/proxy/utils/noProxyUtils.js +0 -149
- package/dist/client/rag/ChunkerFactory.js +0 -320
- package/dist/client/rag/ChunkerRegistry.js +0 -421
- package/dist/client/rag/chunkers/BaseChunker.js +0 -143
- package/dist/client/rag/chunkers/CharacterChunker.js +0 -28
- package/dist/client/rag/chunkers/HTMLChunker.js +0 -38
- package/dist/client/rag/chunkers/JSONChunker.js +0 -68
- package/dist/client/rag/chunkers/LaTeXChunker.js +0 -63
- package/dist/client/rag/chunkers/MarkdownChunker.js +0 -306
- package/dist/client/rag/chunkers/RecursiveChunker.js +0 -139
- package/dist/client/rag/chunkers/SemanticMarkdownChunker.js +0 -138
- package/dist/client/rag/chunkers/SentenceChunker.js +0 -66
- package/dist/client/rag/chunkers/TokenChunker.js +0 -61
- package/dist/client/rag/chunkers/index.js +0 -15
- package/dist/client/rag/chunking/characterChunker.js +0 -142
- package/dist/client/rag/chunking/chunkerRegistry.js +0 -194
- package/dist/client/rag/chunking/htmlChunker.js +0 -247
- package/dist/client/rag/chunking/index.js +0 -17
- package/dist/client/rag/chunking/jsonChunker.js +0 -281
- package/dist/client/rag/chunking/latexChunker.js +0 -251
- package/dist/client/rag/chunking/markdownChunker.js +0 -373
- package/dist/client/rag/chunking/recursiveChunker.js +0 -148
- package/dist/client/rag/chunking/semanticChunker.js +0 -306
- package/dist/client/rag/chunking/sentenceChunker.js +0 -230
- package/dist/client/rag/chunking/tokenChunker.js +0 -183
- package/dist/client/rag/document/MDocument.js +0 -392
- package/dist/client/rag/document/index.js +0 -5
- package/dist/client/rag/document/loaders.js +0 -500
- package/dist/client/rag/errors/RAGError.js +0 -274
- package/dist/client/rag/errors/index.js +0 -6
- package/dist/client/rag/graphRag/graphRAG.js +0 -401
- package/dist/client/rag/graphRag/index.js +0 -4
- package/dist/client/rag/index.js +0 -141
- package/dist/client/rag/metadata/MetadataExtractorFactory.js +0 -418
- package/dist/client/rag/metadata/MetadataExtractorRegistry.js +0 -362
- package/dist/client/rag/metadata/index.js +0 -9
- package/dist/client/rag/metadata/metadataExtractor.js +0 -280
- package/dist/client/rag/pipeline/RAGPipeline.js +0 -436
- package/dist/client/rag/pipeline/contextAssembly.js +0 -341
- package/dist/client/rag/pipeline/index.js +0 -5
- package/dist/client/rag/ragIntegration.js +0 -321
- package/dist/client/rag/reranker/RerankerFactory.js +0 -430
- package/dist/client/rag/reranker/RerankerRegistry.js +0 -402
- package/dist/client/rag/reranker/index.js +0 -9
- package/dist/client/rag/reranker/reranker.js +0 -277
- package/dist/client/rag/resilience/CircuitBreaker.js +0 -431
- package/dist/client/rag/resilience/RetryHandler.js +0 -304
- package/dist/client/rag/resilience/index.js +0 -7
- package/dist/client/rag/retrieval/hybridSearch.js +0 -335
- package/dist/client/rag/retrieval/index.js +0 -5
- package/dist/client/rag/retrieval/vectorQueryTool.js +0 -307
- package/dist/client/rag/types.js +0 -8
- package/dist/client/sdk/toolRegistration.js +0 -377
- package/dist/client/server/abstract/baseServerAdapter.js +0 -575
- package/dist/client/server/adapters/expressAdapter.js +0 -486
- package/dist/client/server/adapters/fastifyAdapter.js +0 -472
- package/dist/client/server/adapters/honoAdapter.js +0 -632
- package/dist/client/server/adapters/koaAdapter.js +0 -510
- package/dist/client/server/errors.js +0 -486
- package/dist/client/server/factory/serverAdapterFactory.js +0 -160
- package/dist/client/server/index.js +0 -108
- package/dist/client/server/middleware/abortSignal.js +0 -111
- package/dist/client/server/middleware/auth.js +0 -388
- package/dist/client/server/middleware/cache.js +0 -359
- package/dist/client/server/middleware/common.js +0 -281
- package/dist/client/server/middleware/deprecation.js +0 -190
- package/dist/client/server/middleware/mcpBodyAttachment.js +0 -63
- package/dist/client/server/middleware/rateLimit.js +0 -227
- package/dist/client/server/middleware/validation.js +0 -388
- package/dist/client/server/openapi/generator.js +0 -398
- package/dist/client/server/openapi/index.js +0 -36
- package/dist/client/server/openapi/schemas.js +0 -695
- package/dist/client/server/openapi/templates.js +0 -374
- package/dist/client/server/routes/agentRoutes.js +0 -171
- package/dist/client/server/routes/claudeProxyRoutes.js +0 -1600
- package/dist/client/server/routes/healthRoutes.js +0 -187
- package/dist/client/server/routes/index.js +0 -57
- package/dist/client/server/routes/mcpRoutes.js +0 -342
- package/dist/client/server/routes/memoryRoutes.js +0 -350
- package/dist/client/server/routes/openApiRoutes.js +0 -126
- package/dist/client/server/routes/toolRoutes.js +0 -199
- package/dist/client/server/streaming/dataStream.js +0 -486
- package/dist/client/server/streaming/index.js +0 -11
- package/dist/client/server/types.js +0 -67
- package/dist/client/server/utils/redaction.js +0 -334
- package/dist/client/server/utils/validation.js +0 -243
- package/dist/client/server/websocket/WebSocketHandler.js +0 -383
- package/dist/client/server/websocket/index.js +0 -4
- package/dist/client/services/server/ai/observability/instrumentation.js +0 -808
- package/dist/client/telemetry/attributes.js +0 -100
- package/dist/client/telemetry/index.js +0 -26
- package/dist/client/telemetry/telemetryService.js +0 -308
- package/dist/client/telemetry/tracers.js +0 -17
- package/dist/client/telemetry/withSpan.js +0 -34
- package/dist/client/types/actionTypes.js +0 -6
- package/dist/client/types/analytics.js +0 -5
- package/dist/client/types/authTypes.js +0 -8
- package/dist/client/types/circuitBreakerErrors.js +0 -34
- package/dist/client/types/cli.js +0 -21
- package/dist/client/types/clientTypes.js +0 -10
- package/dist/client/types/common.js +0 -51
- package/dist/client/types/configTypes.js +0 -49
- package/dist/client/types/content.js +0 -19
- package/dist/client/types/contextTypes.js +0 -400
- package/dist/client/types/conversation.js +0 -47
- package/dist/client/types/conversationMemoryInterface.js +0 -6
- package/dist/client/types/domainTypes.js +0 -5
- package/dist/client/types/errors.js +0 -167
- package/dist/client/types/evaluation.js +0 -5
- package/dist/client/types/evaluationProviders.js +0 -5
- package/dist/client/types/evaluationTypes.js +0 -1
- package/dist/client/types/externalMcp.js +0 -6
- package/dist/client/types/fileReferenceTypes.js +0 -8
- package/dist/client/types/fileTypes.js +0 -4
- package/dist/client/types/generateTypes.js +0 -1
- package/dist/client/types/guardrails.js +0 -1
- package/dist/client/types/hitlTypes.js +0 -8
- package/dist/client/types/index.js +0 -57
- package/dist/client/types/mcpTypes.js +0 -5
- package/dist/client/types/middlewareTypes.js +0 -1
- package/dist/client/types/modelTypes.js +0 -30
- package/dist/client/types/multimodal.js +0 -135
- package/dist/client/types/observability.js +0 -6
- package/dist/client/types/pptTypes.js +0 -82
- package/dist/client/types/providers.js +0 -111
- package/dist/client/types/proxyTypes.js +0 -16
- package/dist/client/types/ragTypes.js +0 -7
- package/dist/client/types/sdkTypes.js +0 -8
- package/dist/client/types/serviceTypes.js +0 -5
- package/dist/client/types/streamTypes.js +0 -1
- package/dist/client/types/subscriptionTypes.js +0 -9
- package/dist/client/types/taskClassificationTypes.js +0 -5
- package/dist/client/types/tools.js +0 -24
- package/dist/client/types/ttsTypes.js +0 -57
- package/dist/client/types/typeAliases.js +0 -48
- package/dist/client/types/utilities.js +0 -4
- package/dist/client/types/workflowTypes.js +0 -30
- package/dist/client/utils/async/withTimeout.js +0 -98
- package/dist/client/utils/asyncMutex.js +0 -60
- package/dist/client/utils/conversationMemory.js +0 -431
- package/dist/client/utils/csvProcessor.js +0 -846
- package/dist/client/utils/errorHandling.js +0 -936
- package/dist/client/utils/evaluationUtils.js +0 -131
- package/dist/client/utils/factoryProcessing.js +0 -589
- package/dist/client/utils/fileDetector.js +0 -2161
- package/dist/client/utils/imageCache.js +0 -376
- package/dist/client/utils/imageProcessor.js +0 -704
- package/dist/client/utils/logger.js +0 -491
- package/dist/client/utils/mcpDefaults.js +0 -134
- package/dist/client/utils/messageBuilder.js +0 -1653
- package/dist/client/utils/modelAliasResolver.js +0 -54
- package/dist/client/utils/modelDetection.js +0 -80
- package/dist/client/utils/modelRouter.js +0 -292
- package/dist/client/utils/multimodalOptionsBuilder.js +0 -65
- package/dist/client/utils/observabilityHelpers.js +0 -47
- package/dist/client/utils/parameterValidation.js +0 -966
- package/dist/client/utils/pdfProcessor.js +0 -410
- package/dist/client/utils/performance.js +0 -222
- package/dist/client/utils/pricing.js +0 -340
- package/dist/client/utils/promptRedaction.js +0 -62
- package/dist/client/utils/providerConfig.js +0 -1009
- package/dist/client/utils/providerHealth.js +0 -1237
- package/dist/client/utils/providerRetry.js +0 -112
- package/dist/client/utils/providerUtils.js +0 -434
- package/dist/client/utils/rateLimiter.js +0 -200
- package/dist/client/utils/redis.js +0 -368
- package/dist/client/utils/retryHandler.js +0 -269
- package/dist/client/utils/retryability.js +0 -22
- package/dist/client/utils/sanitizers/svg.js +0 -481
- package/dist/client/utils/schemaConversion.js +0 -255
- package/dist/client/utils/taskClassificationUtils.js +0 -149
- package/dist/client/utils/taskClassifier.js +0 -94
- package/dist/client/utils/thinkingConfig.js +0 -104
- package/dist/client/utils/timeout.js +0 -359
- package/dist/client/utils/tokenEstimation.js +0 -142
- package/dist/client/utils/tokenLimits.js +0 -125
- package/dist/client/utils/tokenUtils.js +0 -239
- package/dist/client/utils/toolUtils.js +0 -75
- package/dist/client/utils/transformationUtils.js +0 -554
- package/dist/client/utils/ttsProcessor.js +0 -286
- package/dist/client/utils/typeUtils.js +0 -97
- package/dist/client/utils/videoAnalysisProcessor.js +0 -67
- package/dist/client/workflow/config.js +0 -398
- package/dist/client/workflow/core/ensembleExecutor.js +0 -407
- package/dist/client/workflow/core/judgeScorer.js +0 -544
- package/dist/client/workflow/core/responseConditioner.js +0 -225
- package/dist/client/workflow/core/types/conditionerTypes.js +0 -7
- package/dist/client/workflow/core/types/ensembleTypes.js +0 -7
- package/dist/client/workflow/core/types/index.js +0 -7
- package/dist/client/workflow/core/types/judgeTypes.js +0 -7
- package/dist/client/workflow/core/types/layerTypes.js +0 -7
- package/dist/client/workflow/core/types/registryTypes.js +0 -7
- package/dist/client/workflow/core/workflowRegistry.js +0 -304
- package/dist/client/workflow/core/workflowRunner.js +0 -586
- package/dist/client/workflow/index.js +0 -50
- package/dist/client/workflow/types.js +0 -9
- package/dist/client/workflow/utils/types/index.js +0 -7
- package/dist/client/workflow/utils/workflowMetrics.js +0 -311
- package/dist/client/workflow/utils/workflowValidation.js +0 -420
- package/dist/client/workflow/workflows/adaptiveWorkflow.js +0 -366
- package/dist/client/workflow/workflows/consensusWorkflow.js +0 -192
- package/dist/client/workflow/workflows/fallbackWorkflow.js +0 -225
- package/dist/client/workflow/workflows/multiJudgeWorkflow.js +0 -351
- /package/dist/client/{client/reactHooks.js → reactHooks.js} +0 -0
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuthMiddleware - Authentication and authorization middleware
|
|
3
|
+
*
|
|
4
|
+
* Provides middleware factories for:
|
|
5
|
+
* - Token extraction and validation
|
|
6
|
+
* - User context propagation
|
|
7
|
+
* - RBAC enforcement
|
|
8
|
+
* - Public route handling
|
|
9
|
+
*/
|
|
10
|
+
import { createErrorFactory } from "../../core/infrastructure/baseError.js";
|
|
11
|
+
import { withTimeout } from "../../utils/async/withTimeout.js";
|
|
12
|
+
import { logger } from "../../utils/logger.js";
|
|
13
|
+
import { AuthProviderFactory } from "../AuthProviderFactory.js";
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// ERROR FACTORY
|
|
16
|
+
// =============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Auth middleware error codes
|
|
19
|
+
*/
|
|
20
|
+
export const AuthMiddlewareErrorCodes = {
|
|
21
|
+
MISSING_TOKEN: "AUTH_MIDDLEWARE-001",
|
|
22
|
+
INVALID_TOKEN: "AUTH_MIDDLEWARE-002",
|
|
23
|
+
UNAUTHORIZED: "AUTH_MIDDLEWARE-003",
|
|
24
|
+
FORBIDDEN: "AUTH_MIDDLEWARE-004",
|
|
25
|
+
PROVIDER_ERROR: "AUTH_MIDDLEWARE-005",
|
|
26
|
+
CONFIGURATION_ERROR: "AUTH_MIDDLEWARE-006",
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Auth middleware error factory
|
|
30
|
+
*/
|
|
31
|
+
export const AuthMiddlewareError = createErrorFactory("AuthMiddleware", AuthMiddlewareErrorCodes);
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// HELPERS
|
|
34
|
+
// =============================================================================
|
|
35
|
+
/**
|
|
36
|
+
* Create an AuthErrorInfo object for the onError callback.
|
|
37
|
+
*
|
|
38
|
+
* Avoids `as any` by constructing a proper Error with the required `code` field.
|
|
39
|
+
*/
|
|
40
|
+
function createAuthErrorInfo(message, code) {
|
|
41
|
+
const err = new Error(message);
|
|
42
|
+
err.code = code;
|
|
43
|
+
return err;
|
|
44
|
+
}
|
|
45
|
+
// =============================================================================
|
|
46
|
+
// TOKEN EXTRACTION
|
|
47
|
+
// =============================================================================
|
|
48
|
+
/**
|
|
49
|
+
* Extract token from request context based on configuration
|
|
50
|
+
*/
|
|
51
|
+
export async function extractToken(context, config) {
|
|
52
|
+
// Default: extract from Authorization header
|
|
53
|
+
const headerConfig = config?.fromHeader ?? {
|
|
54
|
+
name: "authorization",
|
|
55
|
+
prefix: "Bearer",
|
|
56
|
+
};
|
|
57
|
+
// Try header extraction (case-insensitive header lookup)
|
|
58
|
+
const headerName = headerConfig.name?.toLowerCase() ?? "authorization";
|
|
59
|
+
// Find header value with case-insensitive lookup
|
|
60
|
+
let headerValue;
|
|
61
|
+
for (const [key, value] of Object.entries(context.headers)) {
|
|
62
|
+
if (key.toLowerCase() === headerName) {
|
|
63
|
+
headerValue = value;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (headerValue) {
|
|
68
|
+
const value = Array.isArray(headerValue) ? headerValue[0] : headerValue;
|
|
69
|
+
if (value) {
|
|
70
|
+
const prefix = headerConfig.prefix ?? "Bearer";
|
|
71
|
+
if (!prefix) {
|
|
72
|
+
// If no prefix required, return as-is
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
// Compare scheme case-insensitively per RFC 7235
|
|
76
|
+
const prefixWithSpace = `${prefix} `;
|
|
77
|
+
if (value.length > prefixWithSpace.length &&
|
|
78
|
+
value.slice(0, prefixWithSpace.length).toLowerCase() ===
|
|
79
|
+
prefixWithSpace.toLowerCase()) {
|
|
80
|
+
return value.slice(prefixWithSpace.length);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Try cookie extraction
|
|
85
|
+
if (config?.fromCookie?.name && context.cookies) {
|
|
86
|
+
const cookieToken = context.cookies[config.fromCookie.name];
|
|
87
|
+
if (cookieToken) {
|
|
88
|
+
return cookieToken;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Try query parameter extraction
|
|
92
|
+
if (config?.fromQuery?.name && context.query) {
|
|
93
|
+
const queryToken = context.query[config.fromQuery.name];
|
|
94
|
+
if (queryToken) {
|
|
95
|
+
return Array.isArray(queryToken) ? queryToken[0] : queryToken;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Try custom extraction
|
|
99
|
+
if (config?.custom) {
|
|
100
|
+
const customToken = await config.custom(context);
|
|
101
|
+
if (customToken) {
|
|
102
|
+
return customToken;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
// =============================================================================
|
|
108
|
+
// AUTH MIDDLEWARE FACTORY
|
|
109
|
+
// =============================================================================
|
|
110
|
+
/**
|
|
111
|
+
* Create authentication middleware
|
|
112
|
+
*
|
|
113
|
+
* Validates tokens and attaches user context to requests.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```typescript
|
|
117
|
+
* const authMiddleware = await createAuthMiddleware({
|
|
118
|
+
* provider: 'auth0',
|
|
119
|
+
* providerConfig: {
|
|
120
|
+
* type: 'auth0',
|
|
121
|
+
* domain: 'your-tenant.auth0.com',
|
|
122
|
+
* clientId: 'your-client-id',
|
|
123
|
+
* },
|
|
124
|
+
* publicRoutes: ['/health', '/public/*'],
|
|
125
|
+
* });
|
|
126
|
+
*
|
|
127
|
+
* // Use in request handler
|
|
128
|
+
* const result = await authMiddleware(requestContext);
|
|
129
|
+
* if (result.proceed) {
|
|
130
|
+
* // Access authenticated context
|
|
131
|
+
* console.log('User:', result.context?.user);
|
|
132
|
+
* } else {
|
|
133
|
+
* // Return error response
|
|
134
|
+
* res.status(result.error.statusCode).json({ error: result.error.message });
|
|
135
|
+
* }
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export async function createAuthMiddleware(config) {
|
|
139
|
+
// Create provider instance
|
|
140
|
+
const provider = await AuthProviderFactory.createProvider(config.provider, config.providerConfig);
|
|
141
|
+
logger.debug(`[AuthMiddleware] Created middleware with ${config.provider} provider`);
|
|
142
|
+
return async (context) => {
|
|
143
|
+
try {
|
|
144
|
+
// Check if route is public
|
|
145
|
+
if (isPublicRoute(context.path ?? "", config.publicRoutes)) {
|
|
146
|
+
logger.debug(`[AuthMiddleware] Public route: ${context.path}`);
|
|
147
|
+
return { proceed: true };
|
|
148
|
+
}
|
|
149
|
+
// Extract token
|
|
150
|
+
const token = await extractToken(context, config.tokenExtraction);
|
|
151
|
+
if (!token) {
|
|
152
|
+
// If auth is optional, proceed without user
|
|
153
|
+
if (config.optional) {
|
|
154
|
+
return { proceed: true };
|
|
155
|
+
}
|
|
156
|
+
const error = {
|
|
157
|
+
statusCode: 401,
|
|
158
|
+
message: "Authentication required",
|
|
159
|
+
code: "AUTH-005",
|
|
160
|
+
};
|
|
161
|
+
if (config.onError) {
|
|
162
|
+
await config.onError(createAuthErrorInfo(error.message, error.code), context);
|
|
163
|
+
}
|
|
164
|
+
return { proceed: false, error };
|
|
165
|
+
}
|
|
166
|
+
// Validate token (with 5s timeout to prevent hanging on slow providers)
|
|
167
|
+
const validationResult = await withTimeout(provider.authenticateToken(token), 5000, "Token authentication timed out after 5000ms");
|
|
168
|
+
if (!validationResult.valid) {
|
|
169
|
+
// If auth is optional, proceed without user
|
|
170
|
+
if (config.optional) {
|
|
171
|
+
return { proceed: true };
|
|
172
|
+
}
|
|
173
|
+
const errorCode = validationResult.errorCode ?? "AUTH-001";
|
|
174
|
+
const error = {
|
|
175
|
+
statusCode: 401,
|
|
176
|
+
message: validationResult.error ?? "Invalid token",
|
|
177
|
+
code: errorCode,
|
|
178
|
+
};
|
|
179
|
+
if (config.onError) {
|
|
180
|
+
await config.onError(createAuthErrorInfo(error.message, error.code), context);
|
|
181
|
+
}
|
|
182
|
+
return { proceed: false, error };
|
|
183
|
+
}
|
|
184
|
+
// Fail closed: valid token without a user object is treated as failure
|
|
185
|
+
if (!validationResult.user) {
|
|
186
|
+
const error = {
|
|
187
|
+
statusCode: 401,
|
|
188
|
+
message: "Token valid but no user identity resolved",
|
|
189
|
+
code: "AUTH-001",
|
|
190
|
+
};
|
|
191
|
+
if (config.onError) {
|
|
192
|
+
await config.onError(createAuthErrorInfo(error.message, error.code), context);
|
|
193
|
+
}
|
|
194
|
+
return { proceed: false, error };
|
|
195
|
+
}
|
|
196
|
+
// Create authenticated context
|
|
197
|
+
// Providers populate `payload` (most) or `claims` (Cognito, Keycloak).
|
|
198
|
+
// Prefer `payload`, fall back to `claims` for compatibility.
|
|
199
|
+
const authenticatedContext = {
|
|
200
|
+
...context,
|
|
201
|
+
user: validationResult.user,
|
|
202
|
+
token,
|
|
203
|
+
claims: validationResult.payload ??
|
|
204
|
+
validationResult.claims,
|
|
205
|
+
};
|
|
206
|
+
// Call success hook
|
|
207
|
+
if (config.onAuthenticated) {
|
|
208
|
+
await config.onAuthenticated(authenticatedContext);
|
|
209
|
+
}
|
|
210
|
+
logger.debug(`[AuthMiddleware] Authenticated user: ${validationResult.user?.id}`);
|
|
211
|
+
return { proceed: true, context: authenticatedContext };
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
logger.error(`[AuthMiddleware] Error:`, error);
|
|
215
|
+
const errorResult = {
|
|
216
|
+
statusCode: 500,
|
|
217
|
+
message: error instanceof Error ? error.message : "Authentication error",
|
|
218
|
+
code: "AUTH-014",
|
|
219
|
+
};
|
|
220
|
+
if (config.onError) {
|
|
221
|
+
await config.onError(createAuthErrorInfo(errorResult.message, errorResult.code), context);
|
|
222
|
+
}
|
|
223
|
+
return { proceed: false, error: errorResult };
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
// =============================================================================
|
|
228
|
+
// RBAC MIDDLEWARE FACTORY
|
|
229
|
+
// =============================================================================
|
|
230
|
+
/**
|
|
231
|
+
* Create RBAC (Role-Based Access Control) middleware
|
|
232
|
+
*
|
|
233
|
+
* Checks if authenticated user has required roles/permissions.
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* ```typescript
|
|
237
|
+
* const rbacMiddleware = createRBACMiddleware({
|
|
238
|
+
* roles: ['admin', 'moderator'],
|
|
239
|
+
* permissions: ['read:users'],
|
|
240
|
+
* });
|
|
241
|
+
*
|
|
242
|
+
* // Use after auth middleware
|
|
243
|
+
* const authResult = await authMiddleware(context);
|
|
244
|
+
* if (authResult.proceed && authResult.context) {
|
|
245
|
+
* const rbacResult = await rbacMiddleware(authResult.context);
|
|
246
|
+
* if (!rbacResult.proceed) {
|
|
247
|
+
* res.status(403).json({ error: rbacResult.error.message });
|
|
248
|
+
* }
|
|
249
|
+
* }
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
export function createRBACMiddleware(config) {
|
|
253
|
+
return async (context) => {
|
|
254
|
+
try {
|
|
255
|
+
const user = context.user;
|
|
256
|
+
if (!user) {
|
|
257
|
+
return {
|
|
258
|
+
proceed: false,
|
|
259
|
+
error: {
|
|
260
|
+
statusCode: 401,
|
|
261
|
+
message: "User not authenticated",
|
|
262
|
+
code: "AUTH-005",
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
// Super admin roles bypass all role/permission checks
|
|
267
|
+
const superAdminRoles = config.superAdminRoles ?? [];
|
|
268
|
+
if (superAdminRoles.length > 0 &&
|
|
269
|
+
user.roles.some((r) => superAdminRoles.includes(r))) {
|
|
270
|
+
logger.debug(`[RBACMiddleware] Super admin bypass for user: ${user.id}`);
|
|
271
|
+
return { proceed: true, context };
|
|
272
|
+
}
|
|
273
|
+
// Build effective permissions from rolePermissions mapping and
|
|
274
|
+
// role hierarchy so that checks below consider inherited grants.
|
|
275
|
+
const effectivePermissions = new Set(user.permissions);
|
|
276
|
+
const rolePermissions = config.rolePermissions ?? {};
|
|
277
|
+
const roleHierarchy = config.roleHierarchy ?? {};
|
|
278
|
+
const expandRoles = (roles) => {
|
|
279
|
+
const expanded = new Set();
|
|
280
|
+
const queue = [...roles];
|
|
281
|
+
while (queue.length > 0) {
|
|
282
|
+
const role = queue.pop();
|
|
283
|
+
if (role === undefined || expanded.has(role)) {
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
expanded.add(role);
|
|
287
|
+
const children = roleHierarchy[role];
|
|
288
|
+
if (children) {
|
|
289
|
+
queue.push(...children);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return [...expanded];
|
|
293
|
+
};
|
|
294
|
+
const allRoles = expandRoles(user.roles);
|
|
295
|
+
for (const role of allRoles) {
|
|
296
|
+
const perms = rolePermissions[role];
|
|
297
|
+
if (perms) {
|
|
298
|
+
for (const p of perms) {
|
|
299
|
+
effectivePermissions.add(p);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Check custom authorization first
|
|
304
|
+
if (config.custom) {
|
|
305
|
+
const customResult = await config.custom(user, context);
|
|
306
|
+
if (!customResult) {
|
|
307
|
+
const result = {
|
|
308
|
+
authorized: false,
|
|
309
|
+
user,
|
|
310
|
+
reason: "Custom authorization denied",
|
|
311
|
+
};
|
|
312
|
+
if (config.onDenied) {
|
|
313
|
+
await config.onDenied(result, context);
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
proceed: false,
|
|
317
|
+
error: {
|
|
318
|
+
statusCode: 403,
|
|
319
|
+
message: "Access denied",
|
|
320
|
+
code: "AUTH-013",
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// Check roles (includes inherited roles from hierarchy)
|
|
326
|
+
if (config.roles && config.roles.length > 0) {
|
|
327
|
+
const userRolesSet = new Set(allRoles);
|
|
328
|
+
const hasRequiredRoles = config.requireAllRoles
|
|
329
|
+
? config.roles.every((r) => userRolesSet.has(r))
|
|
330
|
+
: config.roles.some((r) => userRolesSet.has(r));
|
|
331
|
+
if (!hasRequiredRoles) {
|
|
332
|
+
const missingRoles = config.roles.filter((r) => !userRolesSet.has(r));
|
|
333
|
+
const result = {
|
|
334
|
+
authorized: false,
|
|
335
|
+
user,
|
|
336
|
+
requiredRoles: config.roles,
|
|
337
|
+
missingRoles,
|
|
338
|
+
reason: `Missing roles: ${missingRoles.join(", ")}`,
|
|
339
|
+
};
|
|
340
|
+
if (config.onDenied) {
|
|
341
|
+
await config.onDenied(result, context);
|
|
342
|
+
}
|
|
343
|
+
return {
|
|
344
|
+
proceed: false,
|
|
345
|
+
error: {
|
|
346
|
+
statusCode: 403,
|
|
347
|
+
message: `Insufficient roles. Required: ${config.roles.join(", ")}`,
|
|
348
|
+
code: "AUTH-012",
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// Check permissions (all required; uses effective permissions from role mapping)
|
|
354
|
+
if (config.permissions && config.permissions.length > 0) {
|
|
355
|
+
const missingPermissions = config.permissions.filter((p) => !effectivePermissions.has(p));
|
|
356
|
+
if (missingPermissions.length > 0) {
|
|
357
|
+
const result = {
|
|
358
|
+
authorized: false,
|
|
359
|
+
user,
|
|
360
|
+
requiredPermissions: config.permissions,
|
|
361
|
+
missingPermissions,
|
|
362
|
+
reason: `Missing permissions: ${missingPermissions.join(", ")}`,
|
|
363
|
+
};
|
|
364
|
+
if (config.onDenied) {
|
|
365
|
+
await config.onDenied(result, context);
|
|
366
|
+
}
|
|
367
|
+
return {
|
|
368
|
+
proceed: false,
|
|
369
|
+
error: {
|
|
370
|
+
statusCode: 403,
|
|
371
|
+
message: `Insufficient permissions. Required: ${config.permissions.join(", ")}`,
|
|
372
|
+
code: "AUTH-011",
|
|
373
|
+
},
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
logger.debug(`[RBACMiddleware] Authorized user: ${user.id}`);
|
|
378
|
+
return { proceed: true, context };
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
logger.error(`[RBACMiddleware] Error:`, error);
|
|
382
|
+
return {
|
|
383
|
+
proceed: false,
|
|
384
|
+
error: {
|
|
385
|
+
statusCode: 500,
|
|
386
|
+
message: error instanceof Error ? error.message : "Authorization error",
|
|
387
|
+
code: "AUTH-014",
|
|
388
|
+
},
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
// =============================================================================
|
|
394
|
+
// COMBINED MIDDLEWARE
|
|
395
|
+
// =============================================================================
|
|
396
|
+
/**
|
|
397
|
+
* Create combined auth + RBAC middleware
|
|
398
|
+
*
|
|
399
|
+
* Convenience function that combines authentication and authorization.
|
|
400
|
+
*
|
|
401
|
+
* @example
|
|
402
|
+
* ```typescript
|
|
403
|
+
* const protectedMiddleware = await createProtectedMiddleware({
|
|
404
|
+
* auth: {
|
|
405
|
+
* provider: 'auth0',
|
|
406
|
+
* providerConfig: { type: 'auth0', domain: '...', clientId: '...' },
|
|
407
|
+
* },
|
|
408
|
+
* rbac: {
|
|
409
|
+
* roles: ['admin'],
|
|
410
|
+
* },
|
|
411
|
+
* });
|
|
412
|
+
*
|
|
413
|
+
* const result = await protectedMiddleware(context);
|
|
414
|
+
* ```
|
|
415
|
+
*/
|
|
416
|
+
export async function createProtectedMiddleware(config) {
|
|
417
|
+
const authMiddleware = await createAuthMiddleware(config.auth);
|
|
418
|
+
const rbacMiddleware = config.rbac ? createRBACMiddleware(config.rbac) : null;
|
|
419
|
+
return async (context) => {
|
|
420
|
+
// Run auth middleware
|
|
421
|
+
const authResult = await authMiddleware(context);
|
|
422
|
+
if (!authResult.proceed) {
|
|
423
|
+
return authResult;
|
|
424
|
+
}
|
|
425
|
+
// If no RBAC configured, return auth result as-is
|
|
426
|
+
if (!rbacMiddleware) {
|
|
427
|
+
return authResult;
|
|
428
|
+
}
|
|
429
|
+
// Build the context for RBAC. When auth is optional and no token was
|
|
430
|
+
// provided, authResult.context is undefined. We still need to run RBAC
|
|
431
|
+
// so that role/permission checks are not silently bypassed. Pass a
|
|
432
|
+
// context without a user — the RBAC middleware already handles the
|
|
433
|
+
// missing-user case and returns a 401.
|
|
434
|
+
const rbacContext = authResult.context ?? context;
|
|
435
|
+
// Run RBAC middleware
|
|
436
|
+
return rbacMiddleware(rbacContext);
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
// =============================================================================
|
|
440
|
+
// UTILITY FUNCTIONS
|
|
441
|
+
// =============================================================================
|
|
442
|
+
/**
|
|
443
|
+
* Check if a path matches public routes
|
|
444
|
+
*/
|
|
445
|
+
function isPublicRoute(path, publicRoutes) {
|
|
446
|
+
if (!publicRoutes || publicRoutes.length === 0) {
|
|
447
|
+
return false;
|
|
448
|
+
}
|
|
449
|
+
// Strip query string before matching
|
|
450
|
+
const pathWithoutQuery = path.split("?")[0];
|
|
451
|
+
const normalizedPath = pathWithoutQuery.replace(/\/$/, "") || "/";
|
|
452
|
+
for (const route of publicRoutes) {
|
|
453
|
+
// Exact match
|
|
454
|
+
if (route === normalizedPath) {
|
|
455
|
+
return true;
|
|
456
|
+
}
|
|
457
|
+
// Wildcard match (e.g., '/public/*')
|
|
458
|
+
if (route.endsWith("*")) {
|
|
459
|
+
const prefix = route.slice(0, -1);
|
|
460
|
+
if (normalizedPath.startsWith(prefix)) {
|
|
461
|
+
return true;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
// Pattern match with path segments
|
|
465
|
+
if (route.includes(":")) {
|
|
466
|
+
const routeParts = route.split("/");
|
|
467
|
+
const pathParts = normalizedPath.split("/");
|
|
468
|
+
if (routeParts.length === pathParts.length) {
|
|
469
|
+
const matches = routeParts.every((part, i) => {
|
|
470
|
+
return part.startsWith(":") || part === pathParts[i];
|
|
471
|
+
});
|
|
472
|
+
if (matches) {
|
|
473
|
+
return true;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return false;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Create request context from standard request object
|
|
482
|
+
*/
|
|
483
|
+
export function createRequestContext(req) {
|
|
484
|
+
return {
|
|
485
|
+
method: req.method ?? "GET",
|
|
486
|
+
path: req.path ?? req.url ?? "/",
|
|
487
|
+
headers: req.headers ?? {},
|
|
488
|
+
cookies: req.cookies,
|
|
489
|
+
query: req.query,
|
|
490
|
+
body: req.body,
|
|
491
|
+
ip: req.ip,
|
|
492
|
+
ipAddress: req.ip,
|
|
493
|
+
userAgent: req.headers?.["user-agent"],
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Create Express-compatible middleware
|
|
498
|
+
*/
|
|
499
|
+
export async function createExpressAuthMiddleware(config) {
|
|
500
|
+
const middleware = await createAuthMiddleware(config);
|
|
501
|
+
return async (req, res, next) => {
|
|
502
|
+
const context = createRequestContext(req);
|
|
503
|
+
const result = await middleware(context);
|
|
504
|
+
if (result.proceed) {
|
|
505
|
+
// Attach user to request
|
|
506
|
+
if (result.context) {
|
|
507
|
+
req.user = result.context.user;
|
|
508
|
+
req.authContext = result.context;
|
|
509
|
+
}
|
|
510
|
+
next();
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
res.status(result.error?.statusCode ?? 401).json({
|
|
514
|
+
error: result.error?.message ?? "Unauthorized",
|
|
515
|
+
code: result.error?.code,
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
};
|
|
519
|
+
}
|