@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,410 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PDF Processor with Image Fallback Support
|
|
3
|
-
*
|
|
4
|
-
* Handles PDF processing for all providers:
|
|
5
|
-
* - Native PDF support for providers that accept PDF directly (Google AI, Vertex, OpenAI, Anthropic, Bedrock)
|
|
6
|
-
* - PDF → Image conversion for providers that don't support native PDF (Azure, Mistral, Ollama)
|
|
7
|
-
*
|
|
8
|
-
* The conversion uses pdf-to-img package (MuPDF-based) for high-quality conversion.
|
|
9
|
-
*/
|
|
10
|
-
import { PDF_LIMITS } from "../core/constants.js";
|
|
11
|
-
import { ErrorFactory } from "./errorHandling.js";
|
|
12
|
-
import { logger } from "./logger.js";
|
|
13
|
-
/**
|
|
14
|
-
* Provider configurations for PDF handling
|
|
15
|
-
*
|
|
16
|
-
* supportsNative: true = Send PDF as FilePart (mimeType: application/pdf)
|
|
17
|
-
* supportsNative: false = Convert PDF pages to PNG images and send as ImageParts
|
|
18
|
-
*/
|
|
19
|
-
const PDF_PROVIDER_CONFIGS = {
|
|
20
|
-
anthropic: {
|
|
21
|
-
maxSizeMB: 5,
|
|
22
|
-
maxPages: 100,
|
|
23
|
-
supportsNative: true,
|
|
24
|
-
requiresCitations: false,
|
|
25
|
-
apiType: "document",
|
|
26
|
-
},
|
|
27
|
-
bedrock: {
|
|
28
|
-
maxSizeMB: 5,
|
|
29
|
-
maxPages: 100,
|
|
30
|
-
supportsNative: true,
|
|
31
|
-
requiresCitations: "auto",
|
|
32
|
-
apiType: "document",
|
|
33
|
-
},
|
|
34
|
-
"google-vertex": {
|
|
35
|
-
maxSizeMB: 5,
|
|
36
|
-
maxPages: 100,
|
|
37
|
-
supportsNative: true,
|
|
38
|
-
requiresCitations: false,
|
|
39
|
-
apiType: "document",
|
|
40
|
-
},
|
|
41
|
-
vertex: {
|
|
42
|
-
maxSizeMB: 5,
|
|
43
|
-
maxPages: 100,
|
|
44
|
-
supportsNative: true,
|
|
45
|
-
requiresCitations: false,
|
|
46
|
-
apiType: "document",
|
|
47
|
-
},
|
|
48
|
-
"google-ai-studio": {
|
|
49
|
-
maxSizeMB: 2000,
|
|
50
|
-
maxPages: 100,
|
|
51
|
-
supportsNative: true,
|
|
52
|
-
requiresCitations: false,
|
|
53
|
-
apiType: "files-api",
|
|
54
|
-
},
|
|
55
|
-
gemini: {
|
|
56
|
-
maxSizeMB: 2000,
|
|
57
|
-
maxPages: 100,
|
|
58
|
-
supportsNative: true,
|
|
59
|
-
requiresCitations: false,
|
|
60
|
-
apiType: "files-api",
|
|
61
|
-
},
|
|
62
|
-
"google-ai": {
|
|
63
|
-
maxSizeMB: 2000,
|
|
64
|
-
maxPages: 100,
|
|
65
|
-
supportsNative: true,
|
|
66
|
-
requiresCitations: false,
|
|
67
|
-
apiType: "files-api",
|
|
68
|
-
},
|
|
69
|
-
openai: {
|
|
70
|
-
maxSizeMB: 10,
|
|
71
|
-
maxPages: 100,
|
|
72
|
-
supportsNative: true,
|
|
73
|
-
requiresCitations: false,
|
|
74
|
-
apiType: "files-api",
|
|
75
|
-
},
|
|
76
|
-
// Azure does NOT support native PDF - must convert to images
|
|
77
|
-
azure: {
|
|
78
|
-
maxSizeMB: 10,
|
|
79
|
-
maxPages: 100,
|
|
80
|
-
supportsNative: false,
|
|
81
|
-
requiresCitations: false,
|
|
82
|
-
apiType: "files-api",
|
|
83
|
-
},
|
|
84
|
-
"azure-openai": {
|
|
85
|
-
maxSizeMB: 10,
|
|
86
|
-
maxPages: 100,
|
|
87
|
-
supportsNative: false,
|
|
88
|
-
requiresCitations: false,
|
|
89
|
-
apiType: "files-api",
|
|
90
|
-
},
|
|
91
|
-
litellm: {
|
|
92
|
-
maxSizeMB: 10,
|
|
93
|
-
maxPages: 100,
|
|
94
|
-
supportsNative: true,
|
|
95
|
-
requiresCitations: false,
|
|
96
|
-
apiType: "files-api",
|
|
97
|
-
},
|
|
98
|
-
"openai-compatible": {
|
|
99
|
-
maxSizeMB: 10,
|
|
100
|
-
maxPages: 100,
|
|
101
|
-
supportsNative: false, // LiteLLM is a proxy — underlying model may not support native PDF; default to safe text extraction
|
|
102
|
-
requiresCitations: false,
|
|
103
|
-
apiType: "files-api",
|
|
104
|
-
},
|
|
105
|
-
mistral: {
|
|
106
|
-
maxSizeMB: 10,
|
|
107
|
-
maxPages: 100,
|
|
108
|
-
supportsNative: false,
|
|
109
|
-
requiresCitations: false,
|
|
110
|
-
apiType: "files-api",
|
|
111
|
-
},
|
|
112
|
-
"hugging-face": {
|
|
113
|
-
maxSizeMB: 10,
|
|
114
|
-
maxPages: 100,
|
|
115
|
-
supportsNative: true,
|
|
116
|
-
requiresCitations: false,
|
|
117
|
-
apiType: "files-api",
|
|
118
|
-
},
|
|
119
|
-
huggingface: {
|
|
120
|
-
maxSizeMB: 10,
|
|
121
|
-
maxPages: 100,
|
|
122
|
-
supportsNative: true,
|
|
123
|
-
requiresCitations: false,
|
|
124
|
-
apiType: "files-api",
|
|
125
|
-
},
|
|
126
|
-
};
|
|
127
|
-
export class PDFProcessor {
|
|
128
|
-
// PDF magic bytes: %PDF-
|
|
129
|
-
static PDF_SIGNATURE = Buffer.from("%PDF-", "ascii");
|
|
130
|
-
// ============================================================================
|
|
131
|
-
// PDF Validation & Processing
|
|
132
|
-
// ============================================================================
|
|
133
|
-
static async process(content, options) {
|
|
134
|
-
const provider = (options?.provider || "unknown").toLowerCase();
|
|
135
|
-
const config = PDF_PROVIDER_CONFIGS[provider];
|
|
136
|
-
if (!PDFProcessor.isValidPDF(content)) {
|
|
137
|
-
throw new Error("Invalid PDF file format. File must start with %PDF- header.");
|
|
138
|
-
}
|
|
139
|
-
if (!config) {
|
|
140
|
-
const supportedProviders = Object.keys(PDF_PROVIDER_CONFIGS).join(", ");
|
|
141
|
-
throw new Error(`PDF files are not configured for ${provider} provider.\n` +
|
|
142
|
-
`Configured providers: ${supportedProviders}\n` +
|
|
143
|
-
`Current provider: ${provider}\n\n` +
|
|
144
|
-
`Options:\n` +
|
|
145
|
-
`1. Switch to a configured provider (--provider openai or --provider vertex)\n` +
|
|
146
|
-
`2. Contact support to add ${provider} PDF configuration`);
|
|
147
|
-
}
|
|
148
|
-
const sizeMB = content.length / (1024 * 1024);
|
|
149
|
-
if (sizeMB > config.maxSizeMB) {
|
|
150
|
-
throw new Error(`PDF size ${sizeMB.toFixed(2)}MB exceeds ${config.maxSizeMB}MB limit for ${provider}`);
|
|
151
|
-
}
|
|
152
|
-
const metadata = PDFProcessor.extractBasicMetadata(content);
|
|
153
|
-
if (metadata.estimatedPages && metadata.estimatedPages > config.maxPages) {
|
|
154
|
-
const enforceLimits = options?.enforceLimits !== false;
|
|
155
|
-
if (enforceLimits) {
|
|
156
|
-
throw ErrorFactory.pdfPageLimitExceeded(metadata.estimatedPages, config.maxPages, provider);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
logger.warn(`[PDF] ⚠️ LIMIT BYPASS: Processing ${metadata.estimatedPages}-page PDF despite ${config.maxPages}-page limit for ${provider}. ` +
|
|
160
|
-
`This may cause API rejection, token errors, or unexpected costs. ` +
|
|
161
|
-
`Consider splitting the PDF or using a different provider.`);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
if (provider === "bedrock" && options?.bedrockApiMode === "converse") {
|
|
165
|
-
logger.info("[PDF] Using Bedrock Converse API. " +
|
|
166
|
-
"Visual PDF analysis requires citations enabled. " +
|
|
167
|
-
"Text-only mode: ~1,000 tokens/3 pages. " +
|
|
168
|
-
"Visual mode: ~7,000 tokens/3 pages.");
|
|
169
|
-
}
|
|
170
|
-
logger.info("[PDF] ✅ Validated PDF file", {
|
|
171
|
-
provider,
|
|
172
|
-
size: `${sizeMB.toFixed(2)}MB`,
|
|
173
|
-
version: metadata.version,
|
|
174
|
-
estimatedPages: metadata.estimatedPages,
|
|
175
|
-
apiType: config.apiType,
|
|
176
|
-
supportsNative: config.supportsNative,
|
|
177
|
-
});
|
|
178
|
-
return {
|
|
179
|
-
type: "pdf",
|
|
180
|
-
content,
|
|
181
|
-
mimeType: "application/pdf",
|
|
182
|
-
metadata: {
|
|
183
|
-
confidence: 100,
|
|
184
|
-
size: content.length,
|
|
185
|
-
...metadata,
|
|
186
|
-
provider,
|
|
187
|
-
apiType: config.apiType,
|
|
188
|
-
},
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Check if a provider supports native PDF input
|
|
193
|
-
* @param provider - Provider name
|
|
194
|
-
* @returns true if provider can accept PDF directly, false if requires image conversion
|
|
195
|
-
*/
|
|
196
|
-
static supportsNativePDF(provider) {
|
|
197
|
-
const normalizedProvider = provider.toLowerCase();
|
|
198
|
-
const config = PDF_PROVIDER_CONFIGS[normalizedProvider];
|
|
199
|
-
return config?.supportsNative ?? false;
|
|
200
|
-
}
|
|
201
|
-
static getProviderConfig(provider) {
|
|
202
|
-
return PDF_PROVIDER_CONFIGS[provider] || null;
|
|
203
|
-
}
|
|
204
|
-
static isValidPDF(buffer) {
|
|
205
|
-
if (buffer.length < 5) {
|
|
206
|
-
return false;
|
|
207
|
-
}
|
|
208
|
-
return buffer.subarray(0, 5).equals(PDFProcessor.PDF_SIGNATURE);
|
|
209
|
-
}
|
|
210
|
-
static extractBasicMetadata(buffer) {
|
|
211
|
-
const headerSize = Math.min(10000, buffer.length);
|
|
212
|
-
const header = buffer.toString("utf-8", 0, headerSize);
|
|
213
|
-
const versionMatch = header.match(/%PDF-(\d\.\d)/);
|
|
214
|
-
const version = versionMatch ? versionMatch[1] : "unknown";
|
|
215
|
-
const pageMatches = header.match(/\/Type\s*\/Page[^s]/g);
|
|
216
|
-
const estimatedPages = pageMatches ? pageMatches.length : null;
|
|
217
|
-
return {
|
|
218
|
-
version,
|
|
219
|
-
estimatedPages,
|
|
220
|
-
filename: undefined,
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
static estimateTokens(pageCount, mode = "visual") {
|
|
224
|
-
if (mode === "text-only") {
|
|
225
|
-
return Math.ceil((pageCount / 3) * 1000);
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
return Math.ceil((pageCount / 3) * 7000);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
// ============================================================================
|
|
232
|
-
// PDF → Image Conversion (for providers without native PDF support)
|
|
233
|
-
// ============================================================================
|
|
234
|
-
/**
|
|
235
|
-
* Convert a PDF buffer to an array of base64 PNG images
|
|
236
|
-
*
|
|
237
|
-
* This is used automatically when a provider (like Azure, Mistral, Ollama) doesn't
|
|
238
|
-
* support native PDF input but does support image input. The PDF pages are converted
|
|
239
|
-
* to PNG images and sent as vision content.
|
|
240
|
-
*
|
|
241
|
-
* @param pdfBuffer - PDF file content as Buffer
|
|
242
|
-
* @param options - Conversion options
|
|
243
|
-
* @returns Promise with conversion result including base64 images
|
|
244
|
-
*
|
|
245
|
-
* @example
|
|
246
|
-
* ```typescript
|
|
247
|
-
* // Check if conversion is needed
|
|
248
|
-
* if (!PDFProcessor.supportsNativePDF('azure')) {
|
|
249
|
-
* const result = await PDFProcessor.convertToImages(pdfBuffer, {
|
|
250
|
-
* scale: 2,
|
|
251
|
-
* maxPages: 10
|
|
252
|
-
* });
|
|
253
|
-
* // Use images in LLM input instead of PDF
|
|
254
|
-
* options.input.images = result.images;
|
|
255
|
-
* }
|
|
256
|
-
* ```
|
|
257
|
-
*/
|
|
258
|
-
static async convertToImages(pdfBuffer, options) {
|
|
259
|
-
const startTime = Date.now();
|
|
260
|
-
const { scale = 2, maxPages = PDF_LIMITS.DEFAULT_MAX_PAGES, format = "png", } = options || {};
|
|
261
|
-
const images = [];
|
|
262
|
-
const warnings = [];
|
|
263
|
-
// ============================================================================
|
|
264
|
-
// INPUT VALIDATION (Security: Prevent malformed/malicious PDF processing)
|
|
265
|
-
// ============================================================================
|
|
266
|
-
// 0. Validate format is supported and case-sensitive
|
|
267
|
-
if (format !== "png") {
|
|
268
|
-
throw new Error(`Invalid format: "${format}". Only "png" format is currently supported.`);
|
|
269
|
-
}
|
|
270
|
-
// 1. Validate buffer is not empty or too small
|
|
271
|
-
if (!pdfBuffer || pdfBuffer.length < 5) {
|
|
272
|
-
throw new Error("Invalid PDF: Buffer is too small or empty. " +
|
|
273
|
-
"A valid PDF must be at least 5 bytes (PDF header).");
|
|
274
|
-
}
|
|
275
|
-
// 2. Validate PDF magic bytes (%PDF-)
|
|
276
|
-
if (!PDFProcessor.isValidPDF(pdfBuffer)) {
|
|
277
|
-
throw new Error("Invalid PDF: File must start with %PDF- header. " +
|
|
278
|
-
"The provided buffer does not appear to be a valid PDF file.");
|
|
279
|
-
}
|
|
280
|
-
// 3. Validate maximum buffer size to prevent memory exhaustion
|
|
281
|
-
const sizeMB = pdfBuffer.length / (1024 * 1024);
|
|
282
|
-
if (sizeMB > PDF_LIMITS.MAX_SIZE_MB) {
|
|
283
|
-
throw new Error(`PDF too large for image conversion: ${sizeMB.toFixed(2)}MB exceeds ${PDF_LIMITS.MAX_SIZE_MB}MB limit. ` +
|
|
284
|
-
"Consider splitting the PDF or using a provider with native PDF support.");
|
|
285
|
-
}
|
|
286
|
-
logger.debug("[PDF→Image] ✅ PDF validation passed", {
|
|
287
|
-
bufferSize: pdfBuffer.length,
|
|
288
|
-
sizeMB: sizeMB.toFixed(2),
|
|
289
|
-
maxPages,
|
|
290
|
-
});
|
|
291
|
-
try {
|
|
292
|
-
// Dynamic import to avoid loading MuPDF binaries until needed
|
|
293
|
-
const pdfToImgModule = await import("pdf-to-img");
|
|
294
|
-
const pdf = pdfToImgModule.pdf;
|
|
295
|
-
logger.debug("[PDF→Image] Starting PDF to image conversion", {
|
|
296
|
-
bufferSize: pdfBuffer.length,
|
|
297
|
-
scale,
|
|
298
|
-
maxPages: maxPages || "all",
|
|
299
|
-
});
|
|
300
|
-
// Create PDF document iterator
|
|
301
|
-
const document = await pdf(pdfBuffer, { scale });
|
|
302
|
-
let pageIndex = 0;
|
|
303
|
-
// Iterate through pages and convert to base64
|
|
304
|
-
for await (const page of document) {
|
|
305
|
-
// Check if we've reached the max pages limit
|
|
306
|
-
if (maxPages !== undefined && pageIndex >= maxPages) {
|
|
307
|
-
warnings.push(`Stopped at page ${pageIndex} (maxPages limit: ${maxPages})`);
|
|
308
|
-
break;
|
|
309
|
-
}
|
|
310
|
-
// Convert PNG buffer to base64
|
|
311
|
-
const base64Image = page.toString("base64");
|
|
312
|
-
images.push(base64Image);
|
|
313
|
-
pageIndex++;
|
|
314
|
-
logger.debug(`[PDF→Image] Converted page ${pageIndex}`, {
|
|
315
|
-
imageSizeBytes: page.length,
|
|
316
|
-
base64Length: base64Image.length,
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
// Check for empty PDF (0 pages)
|
|
320
|
-
if (images.length === 0) {
|
|
321
|
-
throw new Error("PDF has 0 pages. Cannot convert empty PDF to images.");
|
|
322
|
-
}
|
|
323
|
-
const conversionTimeMs = Date.now() - startTime;
|
|
324
|
-
logger.info("[PDF→Image] ✅ PDF conversion completed", {
|
|
325
|
-
pageCount: images.length,
|
|
326
|
-
conversionTimeMs,
|
|
327
|
-
totalImageBytes: images.reduce((sum, img) => sum + img.length, 0),
|
|
328
|
-
});
|
|
329
|
-
return {
|
|
330
|
-
images,
|
|
331
|
-
pageCount: images.length,
|
|
332
|
-
conversionTimeMs,
|
|
333
|
-
warnings: warnings.length > 0 ? warnings : undefined,
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
|
-
catch (error) {
|
|
337
|
-
const conversionTimeMs = Date.now() - startTime;
|
|
338
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
339
|
-
logger.error("[PDF→Image] ❌ PDF conversion failed", {
|
|
340
|
-
error: errorMessage,
|
|
341
|
-
conversionTimeMs,
|
|
342
|
-
});
|
|
343
|
-
throw new Error(`PDF to image conversion failed: ${errorMessage}`, {
|
|
344
|
-
cause: error,
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* Convert a PDF file path to an array of base64 PNG images
|
|
350
|
-
*
|
|
351
|
-
* @param pdfPath - Path to the PDF file
|
|
352
|
-
* @param options - Conversion options
|
|
353
|
-
* @returns Promise with conversion result
|
|
354
|
-
*/
|
|
355
|
-
static async convertFromPath(pdfPath, options) {
|
|
356
|
-
const fs = await import("fs/promises");
|
|
357
|
-
const pdfBuffer = await fs.readFile(pdfPath);
|
|
358
|
-
return PDFProcessor.convertToImages(pdfBuffer, options);
|
|
359
|
-
}
|
|
360
|
-
/**
|
|
361
|
-
* Check if PDF to image conversion is available
|
|
362
|
-
* Useful for feature detection
|
|
363
|
-
*
|
|
364
|
-
* @returns true if pdf-to-img package is available
|
|
365
|
-
*/
|
|
366
|
-
static async isImageConversionAvailable() {
|
|
367
|
-
try {
|
|
368
|
-
await import("pdf-to-img");
|
|
369
|
-
return true;
|
|
370
|
-
}
|
|
371
|
-
catch {
|
|
372
|
-
return false;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Get estimated memory usage for converting a PDF
|
|
377
|
-
*
|
|
378
|
-
* @param pdfSizeBytes - Size of PDF file in bytes
|
|
379
|
-
* @param pageCount - Estimated number of pages
|
|
380
|
-
* @param scale - Scale factor
|
|
381
|
-
* @returns Estimated memory usage in MB
|
|
382
|
-
*/
|
|
383
|
-
static estimateConversionMemoryUsage(pdfSizeBytes, pageCount, scale = 2) {
|
|
384
|
-
// Rough estimation:
|
|
385
|
-
// - Each page at scale 2 produces ~1-3MB PNG
|
|
386
|
-
// - MuPDF needs ~2x PDF size for processing
|
|
387
|
-
// - Output images need ~2MB per page on average
|
|
388
|
-
const pdfProcessingMB = (pdfSizeBytes / (1024 * 1024)) * 2;
|
|
389
|
-
const outputImagesMB = pageCount * 2 * scale;
|
|
390
|
-
return Math.ceil(pdfProcessingMB + outputImagesMB);
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* Get list of providers that require PDF → Image conversion
|
|
394
|
-
*/
|
|
395
|
-
static getImageFallbackProviders() {
|
|
396
|
-
return Object.entries(PDF_PROVIDER_CONFIGS)
|
|
397
|
-
.filter(([_, config]) => !config.supportsNative)
|
|
398
|
-
.map(([name]) => name);
|
|
399
|
-
}
|
|
400
|
-
/**
|
|
401
|
-
* Get list of providers that support native PDF
|
|
402
|
-
*/
|
|
403
|
-
static getNativePDFProviders() {
|
|
404
|
-
return Object.entries(PDF_PROVIDER_CONFIGS)
|
|
405
|
-
.filter(([_, config]) => config.supportsNative)
|
|
406
|
-
.map(([name]) => name);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
// Export PDFImageConverter as an alias for backward compatibility
|
|
410
|
-
export const PDFImageConverter = PDFProcessor;
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Performance measurement and memory management utilities
|
|
3
|
-
* Part of Sub-phase 3.3.1-3.3.2 optimization efforts
|
|
4
|
-
*/
|
|
5
|
-
import { logger } from "./logger.js";
|
|
6
|
-
/**
|
|
7
|
-
* Performance measurement utility for tracking operations
|
|
8
|
-
*/
|
|
9
|
-
export class PerformanceTracker {
|
|
10
|
-
metrics = new Map();
|
|
11
|
-
/**
|
|
12
|
-
* Start tracking performance for an operation
|
|
13
|
-
*/
|
|
14
|
-
start(operationName) {
|
|
15
|
-
this.metrics.set(operationName, {
|
|
16
|
-
startTime: Date.now(),
|
|
17
|
-
memoryStart: process.memoryUsage(),
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* End tracking and calculate metrics
|
|
22
|
-
*/
|
|
23
|
-
end(operationName) {
|
|
24
|
-
const metric = this.metrics.get(operationName);
|
|
25
|
-
if (!metric) {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
const endTime = Date.now();
|
|
29
|
-
const memoryEnd = process.memoryUsage();
|
|
30
|
-
const completedMetric = {
|
|
31
|
-
...metric,
|
|
32
|
-
endTime,
|
|
33
|
-
duration: endTime - metric.startTime,
|
|
34
|
-
memoryEnd,
|
|
35
|
-
memoryDelta: {
|
|
36
|
-
rss: memoryEnd.rss - metric.memoryStart.rss,
|
|
37
|
-
heapTotal: memoryEnd.heapTotal - metric.memoryStart.heapTotal,
|
|
38
|
-
heapUsed: memoryEnd.heapUsed - metric.memoryStart.heapUsed,
|
|
39
|
-
external: memoryEnd.external - metric.memoryStart.external,
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
this.metrics.set(operationName, completedMetric);
|
|
43
|
-
return completedMetric;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Get metrics for an operation
|
|
47
|
-
*/
|
|
48
|
-
getMetrics(operationName) {
|
|
49
|
-
return this.metrics.get(operationName) || null;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Clear all metrics
|
|
53
|
-
*/
|
|
54
|
-
clear() {
|
|
55
|
-
this.metrics.clear();
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Format metrics for display
|
|
59
|
-
*/
|
|
60
|
-
formatMetrics(operationName) {
|
|
61
|
-
const metric = this.metrics.get(operationName);
|
|
62
|
-
if (!metric || !metric.duration) {
|
|
63
|
-
return `${operationName}: No metrics available`;
|
|
64
|
-
}
|
|
65
|
-
const memoryMB = (bytes) => (bytes / 1024 / 1024).toFixed(1);
|
|
66
|
-
if (!metric.memoryDelta) {
|
|
67
|
-
return [
|
|
68
|
-
`${operationName}:`,
|
|
69
|
-
` Duration: ${metric.duration}ms`,
|
|
70
|
-
` Memory Delta: Not available`,
|
|
71
|
-
].join("\n");
|
|
72
|
-
}
|
|
73
|
-
const signHeap = metric.memoryDelta.heapUsed >= 0 ? "+" : "-";
|
|
74
|
-
const signRss = metric.memoryDelta.rss >= 0 ? "+" : "-";
|
|
75
|
-
return [
|
|
76
|
-
`${operationName}:`,
|
|
77
|
-
` Duration: ${metric.duration}ms`,
|
|
78
|
-
` Memory Delta: ${signHeap}${memoryMB(Math.abs(metric.memoryDelta.heapUsed))}MB heap`,
|
|
79
|
-
` RSS Delta: ${signRss}${memoryMB(Math.abs(metric.memoryDelta.rss))}MB`,
|
|
80
|
-
].join("\n");
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Global performance tracker instance
|
|
85
|
-
*/
|
|
86
|
-
export const globalTracker = new PerformanceTracker();
|
|
87
|
-
/**
|
|
88
|
-
* Memory management utilities
|
|
89
|
-
*/
|
|
90
|
-
export class MemoryManager {
|
|
91
|
-
/**
|
|
92
|
-
* Force garbage collection if available
|
|
93
|
-
*/
|
|
94
|
-
static forceGC() {
|
|
95
|
-
if (typeof global !== "undefined" && global.gc) {
|
|
96
|
-
global.gc();
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Get current memory usage in MB
|
|
103
|
-
*/
|
|
104
|
-
static getMemoryUsageMB() {
|
|
105
|
-
const usage = process.memoryUsage();
|
|
106
|
-
return {
|
|
107
|
-
rss: Math.round(usage.rss / 1024 / 1024),
|
|
108
|
-
heapTotal: Math.round(usage.heapTotal / 1024 / 1024),
|
|
109
|
-
heapUsed: Math.round(usage.heapUsed / 1024 / 1024),
|
|
110
|
-
external: Math.round(usage.external / 1024 / 1024),
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Monitor memory usage and warn if it exceeds threshold
|
|
115
|
-
*/
|
|
116
|
-
static monitorMemory(threshold = 100) {
|
|
117
|
-
const usage = this.getMemoryUsageMB();
|
|
118
|
-
if (usage.heapUsed > threshold) {
|
|
119
|
-
logger.warn(`⚠️ High memory usage: ${usage.heapUsed}MB heap (threshold: ${threshold}MB)`);
|
|
120
|
-
return true;
|
|
121
|
-
}
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Clean up and optimize memory usage.
|
|
126
|
-
* Attempts to force garbage collection if available.
|
|
127
|
-
*
|
|
128
|
-
* @returns {object|null} Memory usage statistics if cleanup was performed, or null if not possible.
|
|
129
|
-
* - If manual garbage collection is not available (i.e., Node.js not run with --expose-gc),
|
|
130
|
-
* no cleanup is performed and null is returned.
|
|
131
|
-
* - Clearing the require cache is not attempted due to potential side effects.
|
|
132
|
-
*/
|
|
133
|
-
static cleanup() {
|
|
134
|
-
const before = this.getMemoryUsageMB();
|
|
135
|
-
const gcForced = this.forceGC();
|
|
136
|
-
if (!gcForced) {
|
|
137
|
-
// Manual garbage collection not available.
|
|
138
|
-
// No cleanup performed. Clearing require cache is dangerous and not attempted.
|
|
139
|
-
// Memory cleanup relies on Node.js natural garbage collection.
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
const after = this.getMemoryUsageMB();
|
|
143
|
-
return {
|
|
144
|
-
beforeMB: before.heapUsed,
|
|
145
|
-
afterMB: after.heapUsed,
|
|
146
|
-
freedMB: before.heapUsed - after.heapUsed,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Decorator for tracking performance of async functions
|
|
152
|
-
*/
|
|
153
|
-
export function trackPerformance(operationName) {
|
|
154
|
-
return function (_target, _propertyName, descriptor) {
|
|
155
|
-
const method = descriptor.value;
|
|
156
|
-
if (!method) {
|
|
157
|
-
throw new Error(`Method descriptor value is required for performance tracking`);
|
|
158
|
-
}
|
|
159
|
-
descriptor.value = async function (...args) {
|
|
160
|
-
globalTracker.start(operationName);
|
|
161
|
-
try {
|
|
162
|
-
const result = await method.apply(this, args);
|
|
163
|
-
globalTracker.end(operationName);
|
|
164
|
-
return result;
|
|
165
|
-
}
|
|
166
|
-
catch (error) {
|
|
167
|
-
globalTracker.end(operationName);
|
|
168
|
-
throw error;
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
return descriptor;
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Performance monitoring for CLI operations
|
|
176
|
-
*/
|
|
177
|
-
export class CLIPerformanceMonitor {
|
|
178
|
-
static instance;
|
|
179
|
-
enabled = false;
|
|
180
|
-
static getInstance() {
|
|
181
|
-
if (!CLIPerformanceMonitor.instance) {
|
|
182
|
-
CLIPerformanceMonitor.instance = new CLIPerformanceMonitor();
|
|
183
|
-
}
|
|
184
|
-
return CLIPerformanceMonitor.instance;
|
|
185
|
-
}
|
|
186
|
-
enable() {
|
|
187
|
-
this.enabled = true;
|
|
188
|
-
}
|
|
189
|
-
disable() {
|
|
190
|
-
this.enabled = false;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Monitor a CLI operation
|
|
194
|
-
*/
|
|
195
|
-
async monitorOperation(operationName, operation) {
|
|
196
|
-
if (!this.enabled) {
|
|
197
|
-
return operation();
|
|
198
|
-
}
|
|
199
|
-
globalTracker.start(operationName);
|
|
200
|
-
const startMemory = MemoryManager.getMemoryUsageMB();
|
|
201
|
-
try {
|
|
202
|
-
const result = await operation();
|
|
203
|
-
const metrics = globalTracker.end(operationName);
|
|
204
|
-
const endMemory = MemoryManager.getMemoryUsageMB();
|
|
205
|
-
if (metrics) {
|
|
206
|
-
logger.debug(`\n🔍 Performance: ${operationName}`);
|
|
207
|
-
logger.debug(` Duration: ${metrics.duration}ms`);
|
|
208
|
-
logger.debug(` Memory: ${startMemory.heapUsed}MB → ${endMemory.heapUsed}MB`);
|
|
209
|
-
logger.debug(` Delta: +${endMemory.heapUsed - startMemory.heapUsed}MB`);
|
|
210
|
-
}
|
|
211
|
-
return result;
|
|
212
|
-
}
|
|
213
|
-
catch (error) {
|
|
214
|
-
globalTracker.end(operationName);
|
|
215
|
-
throw error;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Export singleton monitor for easy access
|
|
221
|
-
*/
|
|
222
|
-
export const cliMonitor = CLIPerformanceMonitor.getInstance();
|