@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,529 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PPT Content Planner
|
|
3
|
-
*
|
|
4
|
-
* Generates structured slide content plan using AI.
|
|
5
|
-
* Takes a topic and configuration, returns a detailed ContentPlan JSON.
|
|
6
|
-
*
|
|
7
|
-
* Follows the video handler pattern (vertexVideoHandler.ts):
|
|
8
|
-
* - Standalone module with clear responsibility
|
|
9
|
-
* - Uses AI provider for generation
|
|
10
|
-
* - Returns structured result
|
|
11
|
-
*
|
|
12
|
-
* @module presentation/contentPlanner
|
|
13
|
-
*/
|
|
14
|
-
import { PPTError, PPT_ERROR_CODES } from "./types.js";
|
|
15
|
-
import { CONTENT_PLANNING_SYSTEM_PROMPT, buildContentPlanningPrompt, CONTENT_PLANNING_TIMEOUT_MS, SLIDE_TYPE_TO_LAYOUT, } from "./constants.js";
|
|
16
|
-
import { normalizeSlideWithInference, applyBulletStyleToContent, } from "./slideTypeInference.js";
|
|
17
|
-
import { logger } from "../../utils/logger.js";
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// VALID TYPE/LAYOUT CONSTANTS
|
|
20
|
-
// ============================================================================
|
|
21
|
-
/**
|
|
22
|
-
* All valid slide types (must match SlideType in pptTypes.ts)
|
|
23
|
-
*/
|
|
24
|
-
const VALID_SLIDE_TYPES = new Set([
|
|
25
|
-
// Opening/Closing
|
|
26
|
-
"title",
|
|
27
|
-
"section-header",
|
|
28
|
-
"thank-you",
|
|
29
|
-
"closing",
|
|
30
|
-
// Content
|
|
31
|
-
"content",
|
|
32
|
-
"agenda",
|
|
33
|
-
"bullets",
|
|
34
|
-
"numbered-list",
|
|
35
|
-
// Visual
|
|
36
|
-
"image-focus",
|
|
37
|
-
"image-left",
|
|
38
|
-
"image-right",
|
|
39
|
-
"full-bleed-image",
|
|
40
|
-
"gallery",
|
|
41
|
-
// Layout
|
|
42
|
-
"two-column",
|
|
43
|
-
"three-column",
|
|
44
|
-
"split-content",
|
|
45
|
-
// Data
|
|
46
|
-
"table",
|
|
47
|
-
"chart-bar",
|
|
48
|
-
"chart-line",
|
|
49
|
-
"chart-pie",
|
|
50
|
-
"chart-area",
|
|
51
|
-
"statistics",
|
|
52
|
-
// Special
|
|
53
|
-
"quote",
|
|
54
|
-
"timeline",
|
|
55
|
-
"process-flow",
|
|
56
|
-
"comparison",
|
|
57
|
-
"features",
|
|
58
|
-
"team",
|
|
59
|
-
"icons",
|
|
60
|
-
"conclusion",
|
|
61
|
-
"blank",
|
|
62
|
-
// Composite/Dashboard (multiple content types)
|
|
63
|
-
"dashboard",
|
|
64
|
-
"mixed-content",
|
|
65
|
-
"stats-grid",
|
|
66
|
-
"icon-grid",
|
|
67
|
-
]);
|
|
68
|
-
/**
|
|
69
|
-
* All valid slide layouts (must match SlideLayout in pptTypes.ts)
|
|
70
|
-
*/
|
|
71
|
-
const VALID_SLIDE_LAYOUTS = new Set([
|
|
72
|
-
// Title
|
|
73
|
-
"title-centered",
|
|
74
|
-
"title-bottom",
|
|
75
|
-
"title-left-aligned",
|
|
76
|
-
// Content
|
|
77
|
-
"title-content",
|
|
78
|
-
"title-content-footer",
|
|
79
|
-
"content-only",
|
|
80
|
-
// Image
|
|
81
|
-
"image-left-content-right",
|
|
82
|
-
"image-right-content-left",
|
|
83
|
-
"image-top-content-bottom",
|
|
84
|
-
"image-bottom-content-top",
|
|
85
|
-
"image-full-overlay",
|
|
86
|
-
"image-centered",
|
|
87
|
-
"image-grid-2x2",
|
|
88
|
-
// Column
|
|
89
|
-
"two-column-equal",
|
|
90
|
-
"two-column-wide-left",
|
|
91
|
-
"two-column-wide-right",
|
|
92
|
-
"three-column-equal",
|
|
93
|
-
// Data
|
|
94
|
-
"chart-full",
|
|
95
|
-
"chart-with-bullets",
|
|
96
|
-
"table-full",
|
|
97
|
-
"table-with-notes",
|
|
98
|
-
// Special
|
|
99
|
-
"quote-centered",
|
|
100
|
-
"quote-with-image",
|
|
101
|
-
"statistics-row",
|
|
102
|
-
"statistics-grid",
|
|
103
|
-
"timeline-horizontal",
|
|
104
|
-
"timeline-vertical",
|
|
105
|
-
"process-horizontal",
|
|
106
|
-
"process-vertical",
|
|
107
|
-
"comparison-side-by-side",
|
|
108
|
-
"comparison-table",
|
|
109
|
-
"team-grid",
|
|
110
|
-
"icon-grid",
|
|
111
|
-
"summary-bullets",
|
|
112
|
-
"contact-info",
|
|
113
|
-
"blank-full",
|
|
114
|
-
]);
|
|
115
|
-
/**
|
|
116
|
-
* Validate and normalize slide type
|
|
117
|
-
*/
|
|
118
|
-
function validateSlideType(type, fallback = "content") {
|
|
119
|
-
if (typeof type === "string" && VALID_SLIDE_TYPES.has(type)) {
|
|
120
|
-
return type;
|
|
121
|
-
}
|
|
122
|
-
logger.warn(`[ContentPlanner] Invalid slide type "${type}", using "${fallback}"`);
|
|
123
|
-
return fallback;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Validate and normalize slide layout
|
|
127
|
-
*/
|
|
128
|
-
function validateSlideLayout(layout, slideType) {
|
|
129
|
-
// If valid layout, use it
|
|
130
|
-
if (typeof layout === "string" &&
|
|
131
|
-
VALID_SLIDE_LAYOUTS.has(layout)) {
|
|
132
|
-
return layout;
|
|
133
|
-
}
|
|
134
|
-
// Get default layout for this slide type
|
|
135
|
-
const defaultLayouts = SLIDE_TYPE_TO_LAYOUT[slideType];
|
|
136
|
-
const fallback = defaultLayouts?.[0] || "title-content";
|
|
137
|
-
logger.warn(`[ContentPlanner] Invalid layout "${layout}" for type "${slideType}", using "${fallback}"`);
|
|
138
|
-
return fallback;
|
|
139
|
-
}
|
|
140
|
-
// ============================================================================
|
|
141
|
-
// CONTENT NORMALIZATION (Hybrid Bullet Formatting)
|
|
142
|
-
// Handles various AI output formats and converts to expected structure
|
|
143
|
-
// ============================================================================
|
|
144
|
-
/** Valid bullet styles for validation */
|
|
145
|
-
const VALID_BULLET_STYLES = new Set([
|
|
146
|
-
"disc",
|
|
147
|
-
"number",
|
|
148
|
-
"checkmark",
|
|
149
|
-
"arrow",
|
|
150
|
-
"dash",
|
|
151
|
-
"none",
|
|
152
|
-
]);
|
|
153
|
-
/**
|
|
154
|
-
* Normalize a single bullet item from AI output
|
|
155
|
-
* Handles: string, {text: string}, or malformed objects
|
|
156
|
-
*/
|
|
157
|
-
function normalizeBulletItem(item) {
|
|
158
|
-
// Case 1: Already a valid BulletPoint object
|
|
159
|
-
if (item && typeof item === "object" && "text" in item) {
|
|
160
|
-
const obj = item;
|
|
161
|
-
const normalized = {
|
|
162
|
-
text: String(obj.text || ""),
|
|
163
|
-
};
|
|
164
|
-
// Preserve optional fields if valid
|
|
165
|
-
if (Array.isArray(obj.subBullets)) {
|
|
166
|
-
normalized.subBullets = obj.subBullets.map((s) => String(s));
|
|
167
|
-
}
|
|
168
|
-
if (typeof obj.icon === "string") {
|
|
169
|
-
normalized.icon = obj.icon;
|
|
170
|
-
}
|
|
171
|
-
if (typeof obj.emphasis === "boolean") {
|
|
172
|
-
normalized.emphasis = obj.emphasis;
|
|
173
|
-
}
|
|
174
|
-
// Preserve AI-specified formatting if valid
|
|
175
|
-
if (typeof obj.fontSize === "number" &&
|
|
176
|
-
obj.fontSize >= 8 &&
|
|
177
|
-
obj.fontSize <= 48) {
|
|
178
|
-
normalized.fontSize = obj.fontSize;
|
|
179
|
-
}
|
|
180
|
-
if (typeof obj.bulletStyle === "string" &&
|
|
181
|
-
VALID_BULLET_STYLES.has(obj.bulletStyle)) {
|
|
182
|
-
normalized.bulletStyle = obj.bulletStyle;
|
|
183
|
-
}
|
|
184
|
-
if (typeof obj.color === "string" &&
|
|
185
|
-
obj.color.match(/^#?[0-9A-Fa-f]{6}$/)) {
|
|
186
|
-
normalized.color = obj.color.startsWith("#")
|
|
187
|
-
? obj.color
|
|
188
|
-
: `#${obj.color}`;
|
|
189
|
-
}
|
|
190
|
-
if (typeof obj.bold === "boolean") {
|
|
191
|
-
normalized.bold = obj.bold;
|
|
192
|
-
}
|
|
193
|
-
return normalized.text ? normalized : null;
|
|
194
|
-
}
|
|
195
|
-
// Case 2: Plain string - convert to BulletPoint
|
|
196
|
-
if (typeof item === "string" && item.trim()) {
|
|
197
|
-
return { text: item.trim() };
|
|
198
|
-
}
|
|
199
|
-
// Case 3: Invalid - skip
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Normalize an array of bullets from AI output
|
|
204
|
-
* Handles: string[], {text: string}[], or mixed arrays
|
|
205
|
-
*/
|
|
206
|
-
function normalizeBullets(bullets) {
|
|
207
|
-
if (!Array.isArray(bullets)) {
|
|
208
|
-
return [];
|
|
209
|
-
}
|
|
210
|
-
const normalized = [];
|
|
211
|
-
for (const item of bullets) {
|
|
212
|
-
const bullet = normalizeBulletItem(item);
|
|
213
|
-
if (bullet) {
|
|
214
|
-
normalized.push(bullet);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return normalized;
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Normalize slide content from AI output
|
|
221
|
-
* Ensures bullets are in correct format, preserves other content fields
|
|
222
|
-
*/
|
|
223
|
-
function normalizeSlideContent(content) {
|
|
224
|
-
if (!content || typeof content !== "object") {
|
|
225
|
-
return {};
|
|
226
|
-
}
|
|
227
|
-
const raw = content;
|
|
228
|
-
const normalized = {};
|
|
229
|
-
// Normalize main bullets array
|
|
230
|
-
if (raw.bullets) {
|
|
231
|
-
normalized.bullets = normalizeBullets(raw.bullets);
|
|
232
|
-
}
|
|
233
|
-
// Normalize column bullets (for two-column, three-column layouts)
|
|
234
|
-
if (raw.leftColumn && typeof raw.leftColumn === "object") {
|
|
235
|
-
const col = raw.leftColumn;
|
|
236
|
-
normalized.leftColumn = {
|
|
237
|
-
title: typeof col.title === "string" ? col.title : undefined,
|
|
238
|
-
bullets: col.bullets ? normalizeBullets(col.bullets) : undefined,
|
|
239
|
-
image: typeof col.image === "string" ? col.image : undefined,
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
if (raw.rightColumn && typeof raw.rightColumn === "object") {
|
|
243
|
-
const col = raw.rightColumn;
|
|
244
|
-
normalized.rightColumn = {
|
|
245
|
-
title: typeof col.title === "string" ? col.title : undefined,
|
|
246
|
-
bullets: col.bullets ? normalizeBullets(col.bullets) : undefined,
|
|
247
|
-
image: typeof col.image === "string" ? col.image : undefined,
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
if (raw.centerColumn && typeof raw.centerColumn === "object") {
|
|
251
|
-
const col = raw.centerColumn;
|
|
252
|
-
normalized.centerColumn = {
|
|
253
|
-
title: typeof col.title === "string" ? col.title : undefined,
|
|
254
|
-
bullets: col.bullets ? normalizeBullets(col.bullets) : undefined,
|
|
255
|
-
image: typeof col.image === "string" ? col.image : undefined,
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
// Pass through other content fields as-is (quote, statistics, chartData, etc.)
|
|
259
|
-
// Using keyof SlideContent for type safety
|
|
260
|
-
const passThrough = [
|
|
261
|
-
"subtitle",
|
|
262
|
-
"body",
|
|
263
|
-
"sectionNumber",
|
|
264
|
-
"quote",
|
|
265
|
-
"quoteAuthor",
|
|
266
|
-
"quoteAuthorTitle",
|
|
267
|
-
"caption",
|
|
268
|
-
"galleryImages",
|
|
269
|
-
"statistics",
|
|
270
|
-
"chartData",
|
|
271
|
-
"tableData",
|
|
272
|
-
"timeline",
|
|
273
|
-
"processSteps",
|
|
274
|
-
"features",
|
|
275
|
-
"icons",
|
|
276
|
-
"teamMembers",
|
|
277
|
-
"comparison",
|
|
278
|
-
"nextSteps",
|
|
279
|
-
"cta",
|
|
280
|
-
"ctaButton",
|
|
281
|
-
"contactInfo",
|
|
282
|
-
"layoutOptions",
|
|
283
|
-
"dashboard",
|
|
284
|
-
];
|
|
285
|
-
for (const key of passThrough) {
|
|
286
|
-
if (raw[key] !== undefined) {
|
|
287
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
288
|
-
normalized[key] = raw[key];
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
return normalized;
|
|
292
|
-
}
|
|
293
|
-
// ============================================================================
|
|
294
|
-
// CONTENT PLAN VALIDATION
|
|
295
|
-
// ============================================================================
|
|
296
|
-
/**
|
|
297
|
-
* Validate the structure of AI-generated content plan
|
|
298
|
-
*/
|
|
299
|
-
function validateContentPlan(plan, expectedSlides) {
|
|
300
|
-
if (!plan || typeof plan !== "object") {
|
|
301
|
-
throw new PPTError("AI returned invalid response: expected object", PPT_ERROR_CODES.INVALID_AI_RESPONSE, { received: typeof plan });
|
|
302
|
-
}
|
|
303
|
-
const p = plan;
|
|
304
|
-
// Validate required fields
|
|
305
|
-
if (typeof p.title !== "string" || !p.title.trim()) {
|
|
306
|
-
throw new PPTError("AI response missing valid 'title' field", PPT_ERROR_CODES.INVALID_AI_RESPONSE, { field: "title", received: p.title });
|
|
307
|
-
}
|
|
308
|
-
if (!Array.isArray(p.slides)) {
|
|
309
|
-
throw new PPTError("AI response missing 'slides' array", PPT_ERROR_CODES.INVALID_AI_RESPONSE, { field: "slides", received: typeof p.slides });
|
|
310
|
-
}
|
|
311
|
-
if (p.slides.length !== expectedSlides) {
|
|
312
|
-
logger.warn(`[ContentPlanner] AI returned ${p.slides.length} slides, expected ${expectedSlides}. Adjusting...`);
|
|
313
|
-
// Don't throw - we'll work with what we got
|
|
314
|
-
}
|
|
315
|
-
// Validate each slide
|
|
316
|
-
const validatedSlides = [];
|
|
317
|
-
for (let i = 0; i < p.slides.length; i++) {
|
|
318
|
-
const slide = p.slides[i];
|
|
319
|
-
if (!slide || typeof slide !== "object") {
|
|
320
|
-
throw new PPTError(`Invalid slide at index ${i}`, PPT_ERROR_CODES.INVALID_AI_RESPONSE, { index: i, received: typeof slide });
|
|
321
|
-
}
|
|
322
|
-
// Validate required slide fields
|
|
323
|
-
if (typeof slide.title !== "string") {
|
|
324
|
-
slide.title = `Slide ${i + 1}`;
|
|
325
|
-
logger.warn(`[ContentPlanner] Slide ${i + 1} missing title, using default`);
|
|
326
|
-
}
|
|
327
|
-
// Validate and normalize type with proper type checking
|
|
328
|
-
const validatedType = validateSlideType(slide.type, "content");
|
|
329
|
-
// Normalize content - handles string bullets, mixed formats, etc.
|
|
330
|
-
const normalizedContent = normalizeSlideContent(slide.content);
|
|
331
|
-
// Smart inference: Infer slide type and bullet style from title keywords
|
|
332
|
-
// This helps when AI doesn't explicitly specify the right type
|
|
333
|
-
const { type: inferredType, bulletStyle, wasInferred, } = normalizeSlideWithInference(slide.title, validatedType, normalizedContent);
|
|
334
|
-
// Use inferred type if different from what AI provided
|
|
335
|
-
const finalType = wasInferred && inferredType !== validatedType
|
|
336
|
-
? inferredType
|
|
337
|
-
: validatedType;
|
|
338
|
-
if (wasInferred && inferredType !== validatedType) {
|
|
339
|
-
logger.debug(`[ContentPlanner] Slide ${i + 1} type inferred from title: "${slide.title}" → ${finalType}`);
|
|
340
|
-
}
|
|
341
|
-
// Apply bullet style to content based on slide type
|
|
342
|
-
const contentWithBulletStyle = applyBulletStyleToContent(normalizedContent, bulletStyle);
|
|
343
|
-
// Validate and normalize layout based on final type
|
|
344
|
-
const validatedLayout = validateSlideLayout(slide.layout, finalType);
|
|
345
|
-
// Ensure speakerNotes is a string
|
|
346
|
-
if (typeof slide.speakerNotes !== "string") {
|
|
347
|
-
slide.speakerNotes = "";
|
|
348
|
-
}
|
|
349
|
-
// Validate imagePrompt (can be string or null)
|
|
350
|
-
if (slide.imagePrompt !== null && typeof slide.imagePrompt !== "string") {
|
|
351
|
-
slide.imagePrompt = null;
|
|
352
|
-
}
|
|
353
|
-
validatedSlides.push({
|
|
354
|
-
slideNumber: i + 1,
|
|
355
|
-
type: finalType,
|
|
356
|
-
layout: validatedLayout,
|
|
357
|
-
title: slide.title,
|
|
358
|
-
content: contentWithBulletStyle,
|
|
359
|
-
imagePrompt: slide.imagePrompt,
|
|
360
|
-
speakerNotes: slide.speakerNotes,
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
return {
|
|
364
|
-
title: p.title,
|
|
365
|
-
totalSlides: validatedSlides.length,
|
|
366
|
-
audience: p.audience || "general",
|
|
367
|
-
tone: p.tone || "professional",
|
|
368
|
-
theme: p.theme || "modern",
|
|
369
|
-
slides: validatedSlides,
|
|
370
|
-
keyMessages: Array.isArray(p.keyMessages)
|
|
371
|
-
? p.keyMessages
|
|
372
|
-
: undefined,
|
|
373
|
-
};
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Parse AI response to extract JSON
|
|
377
|
-
* Handles markdown code blocks and raw JSON
|
|
378
|
-
*/
|
|
379
|
-
function parseAIResponse(content) {
|
|
380
|
-
let jsonString = content.trim();
|
|
381
|
-
// Strip markdown code fences if present
|
|
382
|
-
if (jsonString.startsWith("```")) {
|
|
383
|
-
jsonString = jsonString
|
|
384
|
-
.replace(/^```(?:json)?\s*\n?/, "")
|
|
385
|
-
.replace(/\n?```\s*$/, "");
|
|
386
|
-
}
|
|
387
|
-
try {
|
|
388
|
-
return JSON.parse(jsonString);
|
|
389
|
-
}
|
|
390
|
-
catch (error) {
|
|
391
|
-
throw new PPTError(`Failed to parse AI response as JSON: ${error instanceof Error ? error.message : String(error)}`, PPT_ERROR_CODES.INVALID_AI_RESPONSE, {
|
|
392
|
-
contentPreview: content.substring(0, 500),
|
|
393
|
-
parseError: error instanceof Error ? error.message : String(error),
|
|
394
|
-
});
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
// ============================================================================
|
|
398
|
-
// MAIN CONTENT PLANNING FUNCTION
|
|
399
|
-
// ============================================================================
|
|
400
|
-
/**
|
|
401
|
-
* Generate a content plan for the presentation
|
|
402
|
-
*
|
|
403
|
-
* This is the main entry point for content planning. It:
|
|
404
|
-
* 1. Builds the AI prompt with all configuration
|
|
405
|
-
* 2. Calls the AI provider to generate the plan
|
|
406
|
-
* 3. Parses and validates the response
|
|
407
|
-
* 4. Returns a structured ContentPlan
|
|
408
|
-
*
|
|
409
|
-
* @param context - PPT generation context (extracted from GenerateOptions)
|
|
410
|
-
* @param provider - AI provider instance (already validated)
|
|
411
|
-
* @returns Promise<ContentPlan> - Structured slide plan
|
|
412
|
-
*
|
|
413
|
-
* @example
|
|
414
|
-
* ```typescript
|
|
415
|
-
* const context = extractPPTContext(options);
|
|
416
|
-
* const plan = await generateContentPlan(context, provider);
|
|
417
|
-
* console.log(`Generated ${plan.totalSlides} slides`);
|
|
418
|
-
* ```
|
|
419
|
-
*/
|
|
420
|
-
export async function generateContentPlan(context, provider) {
|
|
421
|
-
const startTime = Date.now();
|
|
422
|
-
const sessionId = `session-${Date.now()}`;
|
|
423
|
-
logger.info("[ContentPlanner] Starting content planning", {
|
|
424
|
-
topic: context.topic.substring(0, 100),
|
|
425
|
-
pages: context.pages,
|
|
426
|
-
audience: context.audience,
|
|
427
|
-
tone: context.tone,
|
|
428
|
-
theme: context.theme,
|
|
429
|
-
generateAIImages: context.generateAIImages,
|
|
430
|
-
provider: context.provider,
|
|
431
|
-
model: context.model,
|
|
432
|
-
sessionId,
|
|
433
|
-
});
|
|
434
|
-
// Build the prompt with model info for tier detection (basic vs advanced)
|
|
435
|
-
const userPrompt = buildContentPlanningPrompt({
|
|
436
|
-
topic: context.topic,
|
|
437
|
-
pages: context.pages,
|
|
438
|
-
audience: context.audience,
|
|
439
|
-
tone: context.tone,
|
|
440
|
-
theme: context.theme,
|
|
441
|
-
generateAIImages: context.generateAIImages,
|
|
442
|
-
modelInfo: {
|
|
443
|
-
name: context.model || "unknown",
|
|
444
|
-
provider: context.provider || "auto-selected",
|
|
445
|
-
},
|
|
446
|
-
});
|
|
447
|
-
try {
|
|
448
|
-
// Call AI provider
|
|
449
|
-
// Provider is already validated and has model set internally
|
|
450
|
-
const result = await provider.generate({
|
|
451
|
-
prompt: userPrompt,
|
|
452
|
-
systemPrompt: CONTENT_PLANNING_SYSTEM_PROMPT,
|
|
453
|
-
temperature: 0.7, // Some creativity for content
|
|
454
|
-
maxTokens: 8192, // Need space for full plan
|
|
455
|
-
disableTools: true, // Pure text generation, no tools
|
|
456
|
-
timeout: CONTENT_PLANNING_TIMEOUT_MS,
|
|
457
|
-
});
|
|
458
|
-
if (!result || !result.content) {
|
|
459
|
-
throw new PPTError("AI provider returned empty response", PPT_ERROR_CODES.PLANNING_FAILED, { provider: context.provider });
|
|
460
|
-
}
|
|
461
|
-
const planningTime = Date.now() - startTime;
|
|
462
|
-
logger.debug("[ContentPlanner] AI response received", {
|
|
463
|
-
contentLength: result.content.length,
|
|
464
|
-
planningTime,
|
|
465
|
-
});
|
|
466
|
-
// Parse the JSON response
|
|
467
|
-
const parsed = parseAIResponse(result.content);
|
|
468
|
-
// Validate and structure the plan
|
|
469
|
-
const plan = validateContentPlan(parsed, context.pages);
|
|
470
|
-
logger.info("[ContentPlanner] Content plan generated successfully", {
|
|
471
|
-
title: plan.title,
|
|
472
|
-
totalSlides: plan.totalSlides,
|
|
473
|
-
planningTime,
|
|
474
|
-
keyMessages: plan.keyMessages?.length || 0,
|
|
475
|
-
});
|
|
476
|
-
return plan;
|
|
477
|
-
}
|
|
478
|
-
catch (error) {
|
|
479
|
-
// Re-throw PPTError as-is
|
|
480
|
-
if (error instanceof PPTError) {
|
|
481
|
-
throw error;
|
|
482
|
-
}
|
|
483
|
-
// Wrap other errors
|
|
484
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
485
|
-
throw new PPTError(`Content planning failed: ${message}`, PPT_ERROR_CODES.PLANNING_FAILED, {
|
|
486
|
-
topic: context.topic.substring(0, 100),
|
|
487
|
-
provider: context.provider,
|
|
488
|
-
}, error instanceof Error ? error : undefined);
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
// ============================================================================
|
|
492
|
-
// PLAN ADJUSTMENT UTILITIES
|
|
493
|
-
// ============================================================================
|
|
494
|
-
/**
|
|
495
|
-
* Ensure first slide is title type
|
|
496
|
-
*/
|
|
497
|
-
export function ensureTitleSlide(plan) {
|
|
498
|
-
if (plan.slides.length > 0 && plan.slides[0].type !== "title") {
|
|
499
|
-
plan.slides[0] = {
|
|
500
|
-
...plan.slides[0],
|
|
501
|
-
type: "title",
|
|
502
|
-
layout: "title-centered",
|
|
503
|
-
};
|
|
504
|
-
}
|
|
505
|
-
return plan;
|
|
506
|
-
}
|
|
507
|
-
/**
|
|
508
|
-
* Ensure last slide is thank-you type
|
|
509
|
-
*/
|
|
510
|
-
export function ensureThankYouSlide(plan) {
|
|
511
|
-
const lastIndex = plan.slides.length - 1;
|
|
512
|
-
if (lastIndex >= 0 && plan.slides[lastIndex].type !== "thank-you") {
|
|
513
|
-
plan.slides[lastIndex] = {
|
|
514
|
-
...plan.slides[lastIndex],
|
|
515
|
-
type: "thank-you",
|
|
516
|
-
layout: "contact-info",
|
|
517
|
-
};
|
|
518
|
-
}
|
|
519
|
-
return plan;
|
|
520
|
-
}
|
|
521
|
-
/**
|
|
522
|
-
* Apply post-processing to ensure plan follows best practices
|
|
523
|
-
*/
|
|
524
|
-
export function postProcessPlan(plan) {
|
|
525
|
-
let processed = { ...plan, slides: [...plan.slides] };
|
|
526
|
-
processed = ensureTitleSlide(processed);
|
|
527
|
-
processed = ensureThankYouSlide(processed);
|
|
528
|
-
return processed;
|
|
529
|
-
}
|