@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,212 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenDocument Processor
|
|
3
|
-
*
|
|
4
|
-
* Processes OpenDocument format files (.odt, .ods, .odp) by extracting
|
|
5
|
-
* text content from the internal XML structure.
|
|
6
|
-
*
|
|
7
|
-
* @module processors/document/OpenDocumentProcessor
|
|
8
|
-
*/
|
|
9
|
-
import { createRequire } from "node:module";
|
|
10
|
-
import { BaseFileProcessor } from "../base/BaseFileProcessor.js";
|
|
11
|
-
import { SIZE_LIMITS } from "../config/index.js";
|
|
12
|
-
const require = createRequire(import.meta.url);
|
|
13
|
-
/**
|
|
14
|
-
* OpenDocument Processor - handles .odt, .ods, .odp files
|
|
15
|
-
*
|
|
16
|
-
* OpenDocument files are ZIP archives containing XML content.
|
|
17
|
-
* The main content is in content.xml within the archive.
|
|
18
|
-
*
|
|
19
|
-
* Priority: ~105 (between Word and Text)
|
|
20
|
-
*/
|
|
21
|
-
export class OpenDocumentProcessor extends BaseFileProcessor {
|
|
22
|
-
constructor() {
|
|
23
|
-
super({
|
|
24
|
-
maxSizeMB: SIZE_LIMITS.DOCUMENT_MAX_MB,
|
|
25
|
-
timeoutMs: 60000,
|
|
26
|
-
supportedMimeTypes: [
|
|
27
|
-
"application/vnd.oasis.opendocument.text",
|
|
28
|
-
"application/vnd.oasis.opendocument.spreadsheet",
|
|
29
|
-
"application/vnd.oasis.opendocument.presentation",
|
|
30
|
-
],
|
|
31
|
-
supportedExtensions: [".odt", ".ods", ".odp"],
|
|
32
|
-
fileTypeName: "OpenDocument",
|
|
33
|
-
defaultFilename: "document.odt",
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Validate that the file is a valid ZIP archive (OpenDocument format)
|
|
38
|
-
*/
|
|
39
|
-
async validateDownloadedFile(buffer, _fileInfo) {
|
|
40
|
-
if (buffer.length < 4) {
|
|
41
|
-
return "File too small to be a valid OpenDocument file";
|
|
42
|
-
}
|
|
43
|
-
// Check for PK (ZIP) signature
|
|
44
|
-
const signature = buffer.subarray(0, 2).toString("ascii");
|
|
45
|
-
if (signature !== "PK") {
|
|
46
|
-
return "Invalid OpenDocument format - not a valid ZIP archive";
|
|
47
|
-
}
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Build the processed result by extracting content from the OpenDocument
|
|
52
|
-
*/
|
|
53
|
-
buildProcessedResult(buffer, fileInfo) {
|
|
54
|
-
const ext = this.getExtension(fileInfo.name);
|
|
55
|
-
const format = this.detectFormat(ext);
|
|
56
|
-
let textContent;
|
|
57
|
-
let paragraphCount;
|
|
58
|
-
let truncated = false;
|
|
59
|
-
try {
|
|
60
|
-
// Dynamically import adm-zip to avoid issues if not available
|
|
61
|
-
const AdmZip = require("adm-zip");
|
|
62
|
-
const zip = new AdmZip(buffer);
|
|
63
|
-
// Try to get content.xml
|
|
64
|
-
const contentEntry = zip.getEntry("content.xml");
|
|
65
|
-
if (contentEntry) {
|
|
66
|
-
const xmlContent = contentEntry.getData().toString("utf-8");
|
|
67
|
-
const extracted = this.extractTextFromXml(xmlContent);
|
|
68
|
-
textContent = extracted.text;
|
|
69
|
-
paragraphCount = extracted.paragraphCount;
|
|
70
|
-
// Check for truncation
|
|
71
|
-
const maxChars = 500000; // ~500KB of text
|
|
72
|
-
if (textContent.length > maxChars) {
|
|
73
|
-
textContent =
|
|
74
|
-
textContent.substring(0, maxChars) + "\n\n... [Content truncated]";
|
|
75
|
-
truncated = true;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
throw new Error("content.xml not found in OpenDocument archive");
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
const message = error instanceof Error ? error.message : "Unknown error";
|
|
84
|
-
throw new Error(`Failed to extract OpenDocument content: ${message}`, {
|
|
85
|
-
cause: error,
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
return {
|
|
89
|
-
textContent,
|
|
90
|
-
format,
|
|
91
|
-
paragraphCount,
|
|
92
|
-
truncated,
|
|
93
|
-
buffer,
|
|
94
|
-
mimetype: fileInfo.mimetype || "application/vnd.oasis.opendocument.text",
|
|
95
|
-
size: fileInfo.size,
|
|
96
|
-
filename: this.getFilename(fileInfo),
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Decode HTML entities in a single pass to prevent double-unescaping.
|
|
101
|
-
* Sequential replacement is vulnerable: "&lt;" → "<" → "<"
|
|
102
|
-
* Single-pass avoids this by replacing each entity exactly once.
|
|
103
|
-
*/
|
|
104
|
-
decodeHtmlEntities(text) {
|
|
105
|
-
const entityMap = {
|
|
106
|
-
"&": "&",
|
|
107
|
-
"<": "<",
|
|
108
|
-
">": ">",
|
|
109
|
-
""": '"',
|
|
110
|
-
"'": "'",
|
|
111
|
-
};
|
|
112
|
-
return text.replace(/&(?:amp|lt|gt|quot|apos);/g, (match) => entityMap[match] ?? match);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Extract text content from OpenDocument XML
|
|
116
|
-
*/
|
|
117
|
-
extractTextFromXml(xml) {
|
|
118
|
-
const paragraphs = [];
|
|
119
|
-
// Extract text from <text:p> elements (paragraphs)
|
|
120
|
-
// Also handle <text:h> (headings) and <text:span> (spans)
|
|
121
|
-
const textPattern = /<text:(?:p|h|span)[^>]*>([\s\S]*?)<\/text:(?:p|h|span)>/gi;
|
|
122
|
-
const matches = xml.matchAll(textPattern);
|
|
123
|
-
for (const match of matches) {
|
|
124
|
-
// Remove nested tags iteratively to handle fragments like "<scr<script>ipt>"
|
|
125
|
-
let stripped = match[1];
|
|
126
|
-
let prev;
|
|
127
|
-
do {
|
|
128
|
-
prev = stripped;
|
|
129
|
-
stripped = stripped.replace(/<[^>]+>/g, "");
|
|
130
|
-
} while (stripped !== prev);
|
|
131
|
-
const text = this.decodeHtmlEntities(stripped).trim();
|
|
132
|
-
if (text) {
|
|
133
|
-
paragraphs.push(text);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// Also try a simpler approach for spreadsheets and presentations
|
|
137
|
-
// where content might be in different structures
|
|
138
|
-
if (paragraphs.length === 0) {
|
|
139
|
-
// Try to extract any text content between tags (iterative to handle nested fragments)
|
|
140
|
-
let stripped = xml;
|
|
141
|
-
let prev;
|
|
142
|
-
do {
|
|
143
|
-
prev = stripped;
|
|
144
|
-
stripped = stripped.replace(/<[^>]+>/g, " ");
|
|
145
|
-
} while (stripped !== prev);
|
|
146
|
-
const simpleText = this.decodeHtmlEntities(stripped.replace(/\s+/g, " ")).trim();
|
|
147
|
-
if (simpleText) {
|
|
148
|
-
paragraphs.push(simpleText);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return {
|
|
152
|
-
text: paragraphs.join("\n\n"),
|
|
153
|
-
paragraphCount: paragraphs.length,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Detect the OpenDocument format from file extension
|
|
158
|
-
*/
|
|
159
|
-
detectFormat(ext) {
|
|
160
|
-
switch (ext?.toLowerCase()) {
|
|
161
|
-
case ".odt":
|
|
162
|
-
return "odt";
|
|
163
|
-
case ".ods":
|
|
164
|
-
return "ods";
|
|
165
|
-
case ".odp":
|
|
166
|
-
return "odp";
|
|
167
|
-
default:
|
|
168
|
-
return "unknown";
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Get file extension from filename
|
|
173
|
-
*/
|
|
174
|
-
getExtension(filename) {
|
|
175
|
-
const match = filename.toLowerCase().match(/\.[^.]+$/);
|
|
176
|
-
return match ? match[0] : null;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
// =============================================================================
|
|
180
|
-
// SINGLETON INSTANCE
|
|
181
|
-
// =============================================================================
|
|
182
|
-
/**
|
|
183
|
-
* Singleton instance of OpenDocumentProcessor
|
|
184
|
-
*/
|
|
185
|
-
export const openDocumentProcessor = new OpenDocumentProcessor();
|
|
186
|
-
// =============================================================================
|
|
187
|
-
// HELPER FUNCTIONS
|
|
188
|
-
// =============================================================================
|
|
189
|
-
/**
|
|
190
|
-
* Check if a file is an OpenDocument file by MIME type or extension
|
|
191
|
-
*/
|
|
192
|
-
export function isOpenDocumentFile(mimetype, filename) {
|
|
193
|
-
return openDocumentProcessor.isFileSupported(mimetype, filename);
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Validate OpenDocument file size against limits
|
|
197
|
-
*/
|
|
198
|
-
export function validateOpenDocumentSize(sizeBytes) {
|
|
199
|
-
return sizeBytes <= SIZE_LIMITS.DOCUMENT_MAX_MB * 1024 * 1024;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Process an OpenDocument file
|
|
203
|
-
*/
|
|
204
|
-
export async function processOpenDocument(fileInfo, options) {
|
|
205
|
-
return openDocumentProcessor.processFile(fileInfo, options);
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Get the maximum allowed OpenDocument file size in MB
|
|
209
|
-
*/
|
|
210
|
-
export function getOpenDocumentMaxSizeMB() {
|
|
211
|
-
return SIZE_LIMITS.DOCUMENT_MAX_MB;
|
|
212
|
-
}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PowerPoint (PPTX) Processing Utility
|
|
3
|
-
*
|
|
4
|
-
* Extracts text content from PowerPoint (.pptx) files by treating them
|
|
5
|
-
* as ZIP archives and parsing the slide XML files within.
|
|
6
|
-
*
|
|
7
|
-
* PPTX files are ZIP archives containing:
|
|
8
|
-
* - ppt/slides/slide1.xml, slide2.xml, ... — slide content
|
|
9
|
-
* - ppt/slideMasters/ — master slide templates
|
|
10
|
-
* - ppt/slideLayouts/ — slide layout definitions
|
|
11
|
-
*
|
|
12
|
-
* Text is extracted from `<a:t>` elements in the slide XML files.
|
|
13
|
-
* Slides are sorted by number and presented in reading order.
|
|
14
|
-
*
|
|
15
|
-
* Uses `adm-zip` (already a project dependency) for ZIP extraction.
|
|
16
|
-
*
|
|
17
|
-
* @module processors/document/PptxProcessor
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* import { PptxProcessor } from "./PptxProcessor.js";
|
|
22
|
-
*
|
|
23
|
-
* const text = await PptxProcessor.extractText(buffer);
|
|
24
|
-
* if (text) {
|
|
25
|
-
* console.log("Extracted text:", text);
|
|
26
|
-
* }
|
|
27
|
-
* ```
|
|
28
|
-
*/
|
|
29
|
-
import AdmZip from "adm-zip";
|
|
30
|
-
/**
|
|
31
|
-
* Regex to match text content within PowerPoint XML `<a:t>` elements.
|
|
32
|
-
* These elements contain the actual visible text on slides.
|
|
33
|
-
*/
|
|
34
|
-
const TEXT_ELEMENT_REGEX = /<a:t[^>]*>([\s\S]*?)<\/a:t>/g;
|
|
35
|
-
/**
|
|
36
|
-
* Regex to match slide filenames and extract slide number.
|
|
37
|
-
* Matches entries like "ppt/slides/slide1.xml", "ppt/slides/slide12.xml".
|
|
38
|
-
*/
|
|
39
|
-
const SLIDE_ENTRY_REGEX = /^ppt\/slides\/slide(\d+)\.xml$/;
|
|
40
|
-
/**
|
|
41
|
-
* Static utility class for extracting text from PPTX files.
|
|
42
|
-
*
|
|
43
|
-
* Designed as a static class (not extending BaseFileProcessor) because
|
|
44
|
-
* PPTX processing is straightforward ZIP+XML extraction and does not
|
|
45
|
-
* need the full download/validate/process pipeline of BaseFileProcessor.
|
|
46
|
-
*/
|
|
47
|
-
export class PptxProcessor {
|
|
48
|
-
/**
|
|
49
|
-
* Extract all text content from a PPTX buffer.
|
|
50
|
-
*
|
|
51
|
-
* @param content - Raw PPTX file buffer
|
|
52
|
-
* @returns Formatted text content with slide headers, or null if no text found
|
|
53
|
-
* @throws Error if the buffer is not a valid ZIP/PPTX file
|
|
54
|
-
*/
|
|
55
|
-
static async extractText(content) {
|
|
56
|
-
const zip = new AdmZip(content);
|
|
57
|
-
const entries = zip.getEntries();
|
|
58
|
-
// Collect slide entries with their slide numbers for sorting
|
|
59
|
-
const slides = [];
|
|
60
|
-
for (const entry of entries) {
|
|
61
|
-
const match = entry.entryName.match(SLIDE_ENTRY_REGEX);
|
|
62
|
-
if (match) {
|
|
63
|
-
const slideNumber = parseInt(match[1], 10);
|
|
64
|
-
const xmlContent = entry.getData().toString("utf-8");
|
|
65
|
-
slides.push({ slideNumber, xml: xmlContent });
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// Sort slides by number (slide1, slide2, ...)
|
|
69
|
-
slides.sort((a, b) => a.slideNumber - b.slideNumber);
|
|
70
|
-
if (slides.length === 0) {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
const parts = [];
|
|
74
|
-
parts.push(`Presentation: ${slides.length} slide(s)\n`);
|
|
75
|
-
for (const slide of slides) {
|
|
76
|
-
const texts = PptxProcessor.extractTextFromXml(slide.xml);
|
|
77
|
-
if (texts.length > 0) {
|
|
78
|
-
parts.push(`### Slide ${slide.slideNumber}`);
|
|
79
|
-
parts.push(texts.join("\n"));
|
|
80
|
-
parts.push(""); // blank line between slides
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
const result = parts.join("\n").trim();
|
|
84
|
-
return result || null;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Extract text strings from a slide XML document.
|
|
88
|
-
* Finds all `<a:t>` elements and returns their text content.
|
|
89
|
-
*
|
|
90
|
-
* @param xml - Raw XML string from a slide file
|
|
91
|
-
* @returns Array of text strings found in the slide
|
|
92
|
-
*/
|
|
93
|
-
static extractTextFromXml(xml) {
|
|
94
|
-
const texts = [];
|
|
95
|
-
// Reset regex state for re-entrant usage
|
|
96
|
-
TEXT_ELEMENT_REGEX.lastIndex = 0;
|
|
97
|
-
for (let match = TEXT_ELEMENT_REGEX.exec(xml); match !== null; match = TEXT_ELEMENT_REGEX.exec(xml)) {
|
|
98
|
-
const text = match[1].trim();
|
|
99
|
-
if (text) {
|
|
100
|
-
texts.push(text);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return texts;
|
|
104
|
-
}
|
|
105
|
-
// ===========================================================================
|
|
106
|
-
// TARGETED EXTRACTION API
|
|
107
|
-
// ===========================================================================
|
|
108
|
-
/**
|
|
109
|
-
* Extract text from specific slides in a PPTX file.
|
|
110
|
-
*
|
|
111
|
-
* Called by the `extract_file_content` tool for targeted slide access.
|
|
112
|
-
*
|
|
113
|
-
* @param content - Raw PPTX file buffer
|
|
114
|
-
* @param slideNumbers - Array of 1-indexed slide numbers to extract
|
|
115
|
-
* @returns Formatted text from the requested slides
|
|
116
|
-
*/
|
|
117
|
-
static async extractSlides(content, slideNumbers) {
|
|
118
|
-
const zip = new AdmZip(content);
|
|
119
|
-
const entries = zip.getEntries();
|
|
120
|
-
// Collect all slides
|
|
121
|
-
const slides = [];
|
|
122
|
-
for (const entry of entries) {
|
|
123
|
-
const match = entry.entryName.match(SLIDE_ENTRY_REGEX);
|
|
124
|
-
if (match) {
|
|
125
|
-
const slideNumber = parseInt(match[1], 10);
|
|
126
|
-
if (slideNumbers.includes(slideNumber)) {
|
|
127
|
-
const xmlContent = entry.getData().toString("utf-8");
|
|
128
|
-
slides.push({ slideNumber, xml: xmlContent });
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
slides.sort((a, b) => a.slideNumber - b.slideNumber);
|
|
133
|
-
if (slides.length === 0) {
|
|
134
|
-
// List total slides to help the LLM
|
|
135
|
-
let totalSlides = 0;
|
|
136
|
-
for (const entry of entries) {
|
|
137
|
-
if (SLIDE_ENTRY_REGEX.test(entry.entryName)) {
|
|
138
|
-
totalSlides++;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return `Slides ${slideNumbers.join(", ")} not found. This presentation has ${totalSlides} slide(s).`;
|
|
142
|
-
}
|
|
143
|
-
const parts = [];
|
|
144
|
-
for (const slide of slides) {
|
|
145
|
-
const texts = PptxProcessor.extractTextFromXml(slide.xml);
|
|
146
|
-
parts.push(`### Slide ${slide.slideNumber}`);
|
|
147
|
-
if (texts.length > 0) {
|
|
148
|
-
parts.push(texts.join("\n"));
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
parts.push("(No text content on this slide)");
|
|
152
|
-
}
|
|
153
|
-
parts.push("");
|
|
154
|
-
}
|
|
155
|
-
return parts.join("\n").trim();
|
|
156
|
-
}
|
|
157
|
-
}
|