@juspay/neurolink 9.30.0 → 9.31.0
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 +14 -0
- package/README.md +2 -3
- package/dist/adapters/providerImageAdapter.js +13 -22
- package/dist/adapters/video/videoAnalyzer.d.ts +4 -4
- package/dist/adapters/video/videoAnalyzer.js +3 -3
- package/dist/agent/directTools.d.ts +20 -289
- package/dist/agent/directTools.js +11 -10
- package/dist/auth/accountPool.d.ts +68 -0
- package/dist/auth/accountPool.js +178 -0
- package/dist/auth/anthropicOAuth.d.ts +15 -5
- package/dist/auth/anthropicOAuth.js +117 -57
- package/dist/auth/index.d.ts +7 -5
- package/dist/auth/index.js +6 -2
- package/dist/auth/tokenStore.d.ts +71 -27
- package/dist/auth/tokenStore.js +342 -64
- package/dist/cli/commands/auth.d.ts +39 -2
- package/dist/cli/commands/auth.js +585 -36
- package/dist/cli/commands/config.d.ts +47 -574
- package/dist/cli/commands/config.js +142 -24
- package/dist/cli/commands/docs.d.ts +1 -5
- package/dist/cli/commands/observability.d.ts +1 -17
- package/dist/cli/commands/ollama.js +1 -1
- package/dist/cli/commands/proxy.d.ts +20 -0
- package/dist/cli/commands/proxy.js +1254 -0
- package/dist/cli/commands/setup-anthropic.js +1 -1
- package/dist/cli/commands/setup-azure.js +1 -1
- package/dist/cli/commands/setup-bedrock.js +2 -2
- package/dist/cli/commands/setup-gcp.js +1 -1
- package/dist/cli/commands/setup-google-ai.js +1 -1
- package/dist/cli/commands/setup-huggingface.js +2 -2
- package/dist/cli/commands/setup-mistral.js +1 -1
- package/dist/cli/commands/setup-openai.js +1 -1
- package/dist/cli/commands/setup.js +3 -3
- package/dist/cli/commands/telemetry.d.ts +1 -22
- package/dist/cli/factories/authCommandFactory.d.ts +16 -11
- package/dist/cli/factories/authCommandFactory.js +96 -1
- package/dist/cli/factories/ollamaCommandFactory.js +1 -1
- package/dist/cli/factories/sagemakerCommandFactory.js +25 -6
- package/dist/cli/index.d.ts +0 -6
- package/dist/cli/index.js +5 -2
- package/dist/cli/loop/conversationSelector.js +7 -2
- package/dist/cli/parser.js +19 -1
- package/dist/cli/utils/envManager.js +2 -2
- package/dist/cli/utils/ollamaUtils.d.ts +1 -2
- package/dist/client/adapters/providerImageAdapter.js +588 -0
- package/dist/client/adapters/tts/googleTTSHandler.js +344 -0
- package/dist/client/adapters/video/directorPipeline.js +516 -0
- package/dist/client/adapters/video/ffmpegAdapter.js +206 -0
- package/dist/client/adapters/video/frameExtractor.js +143 -0
- package/dist/client/adapters/video/vertexVideoHandler.js +763 -0
- package/dist/client/adapters/video/videoAnalyzer.js +238 -0
- package/dist/client/adapters/video/videoMerger.js +171 -0
- package/dist/client/agent/directTools.js +840 -0
- package/dist/client/aiSdkAdapter.d.ts +196 -0
- package/dist/client/aiSdkAdapter.js +487 -0
- package/dist/client/auth/anthropicOAuth.js +974 -0
- package/dist/client/auth/tokenStore.js +799 -0
- package/dist/client/auth.d.ts +248 -0
- package/dist/client/auth.js +473 -0
- package/dist/client/client/aiSdkAdapter.js +487 -0
- package/dist/client/client/auth.js +473 -0
- package/dist/client/client/errors.js +552 -0
- package/dist/client/client/httpClient.js +837 -0
- package/dist/client/client/index.js +172 -0
- package/dist/client/client/interceptors.js +601 -0
- package/dist/client/client/reactHooks.js +1159 -0
- package/dist/client/client/sseClient.js +545 -0
- package/dist/client/client/streamingClient.js +917 -0
- package/dist/client/client/wsClient.js +369 -0
- package/dist/client/config/configManager.js +303 -0
- package/dist/client/config/conversationMemory.js +86 -0
- package/dist/client/config/taskClassificationConfig.js +148 -0
- package/dist/client/constants/contextWindows.js +295 -0
- package/dist/client/constants/enums.js +853 -0
- package/dist/client/constants/index.js +207 -0
- package/dist/client/constants/performance.js +389 -0
- package/dist/client/constants/retry.js +266 -0
- package/dist/client/constants/timeouts.js +182 -0
- package/dist/client/constants/tokens.js +380 -0
- package/dist/client/constants/videoErrors.js +46 -0
- package/dist/client/context/budgetChecker.js +98 -0
- package/dist/client/context/contextCompactor.js +205 -0
- package/dist/client/context/emergencyTruncation.js +88 -0
- package/dist/client/context/errorDetection.js +171 -0
- package/dist/client/context/errors.js +21 -0
- package/dist/client/context/fileTokenBudget.js +127 -0
- package/dist/client/context/prompts/summarizationPrompt.js +117 -0
- package/dist/client/context/stages/fileReadDeduplicator.js +66 -0
- package/dist/client/context/stages/slidingWindowTruncator.js +190 -0
- package/dist/client/context/stages/structuredSummarizer.js +99 -0
- package/dist/client/context/stages/toolOutputPruner.js +52 -0
- package/dist/client/context/summarizationEngine.js +136 -0
- package/dist/client/context/toolOutputLimits.js +78 -0
- package/dist/client/context/toolPairRepair.js +66 -0
- package/dist/client/core/analytics.js +88 -0
- package/dist/client/core/baseProvider.js +1385 -0
- package/dist/client/core/constants.js +140 -0
- package/dist/client/core/conversationMemoryFactory.js +141 -0
- package/dist/client/core/conversationMemoryInitializer.js +128 -0
- package/dist/client/core/conversationMemoryManager.js +344 -0
- package/dist/client/core/dynamicModels.js +358 -0
- package/dist/client/core/evaluation.js +309 -0
- package/dist/client/core/evaluationProviders.js +248 -0
- package/dist/client/core/factory.js +412 -0
- package/dist/client/core/infrastructure/baseError.js +22 -0
- package/dist/client/core/infrastructure/baseFactory.js +54 -0
- package/dist/client/core/infrastructure/baseRegistry.js +49 -0
- package/dist/client/core/infrastructure/index.js +5 -0
- package/dist/client/core/infrastructure/retry.js +20 -0
- package/dist/client/core/infrastructure/typedEventEmitter.js +23 -0
- package/dist/client/core/modelConfiguration.js +851 -0
- package/dist/client/core/modules/GenerationHandler.js +588 -0
- package/dist/client/core/modules/MessageBuilder.js +273 -0
- package/dist/client/core/modules/StreamHandler.js +185 -0
- package/dist/client/core/modules/TelemetryHandler.js +203 -0
- package/dist/client/core/modules/ToolsManager.js +499 -0
- package/dist/client/core/modules/Utilities.js +331 -0
- package/dist/client/core/redisConversationMemoryManager.js +1435 -0
- package/dist/client/core/streamAnalytics.js +131 -0
- package/dist/client/errors.d.ts +299 -0
- package/dist/client/errors.js +552 -0
- package/dist/client/evaluation/contextBuilder.js +134 -0
- package/dist/client/evaluation/index.js +61 -0
- package/dist/client/evaluation/prompts.js +73 -0
- package/dist/client/evaluation/ragasEvaluator.js +110 -0
- package/dist/client/evaluation/retryManager.js +78 -0
- package/dist/client/evaluation/scoring.js +61 -0
- package/dist/client/factories/providerFactory.js +166 -0
- package/dist/client/factories/providerRegistry.js +166 -0
- package/dist/client/features/ppt/constants.js +896 -0
- package/dist/client/features/ppt/contentPlanner.js +529 -0
- package/dist/client/features/ppt/presentationOrchestrator.js +236 -0
- package/dist/client/features/ppt/slideGenerator.js +532 -0
- package/dist/client/features/ppt/slideRenderers.js +2383 -0
- package/dist/client/features/ppt/slideTypeInference.js +405 -0
- package/dist/client/features/ppt/types.js +13 -0
- package/dist/client/features/ppt/utils.js +443 -0
- package/dist/client/files/fileReferenceRegistry.js +1543 -0
- package/dist/client/files/fileTools.js +450 -0
- package/dist/client/files/streamingReader.js +321 -0
- package/dist/client/files/types.js +23 -0
- package/dist/client/hitl/hitlErrors.js +54 -0
- package/dist/client/hitl/hitlManager.js +460 -0
- package/dist/client/httpClient.d.ts +297 -0
- package/dist/client/httpClient.js +837 -0
- package/dist/client/index.d.ts +111 -0
- package/dist/client/index.js +511 -0
- package/dist/client/interceptors.d.ts +283 -0
- package/dist/client/interceptors.js +601 -0
- package/dist/client/mcp/agentExposure.js +356 -0
- package/dist/client/mcp/auth/index.js +11 -0
- package/dist/client/mcp/auth/oauthClientProvider.js +325 -0
- package/dist/client/mcp/auth/tokenStorage.js +134 -0
- package/dist/client/mcp/batching/index.js +10 -0
- package/dist/client/mcp/batching/requestBatcher.js +441 -0
- package/dist/client/mcp/caching/index.js +10 -0
- package/dist/client/mcp/caching/toolCache.js +433 -0
- package/dist/client/mcp/elicitation/elicitationManager.js +376 -0
- package/dist/client/mcp/elicitation/index.js +11 -0
- package/dist/client/mcp/elicitation/types.js +10 -0
- package/dist/client/mcp/elicitationProtocol.js +375 -0
- package/dist/client/mcp/enhancedToolDiscovery.js +481 -0
- package/dist/client/mcp/externalServerManager.js +1478 -0
- package/dist/client/mcp/factory.js +161 -0
- package/dist/client/mcp/flexibleToolValidator.js +161 -0
- package/dist/client/mcp/httpRateLimiter.js +391 -0
- package/dist/client/mcp/httpRetryHandler.js +178 -0
- package/dist/client/mcp/index.js +74 -0
- package/dist/client/mcp/mcpCircuitBreaker.js +427 -0
- package/dist/client/mcp/mcpClientFactory.js +708 -0
- package/dist/client/mcp/mcpRegistryClient.js +488 -0
- package/dist/client/mcp/mcpServerBase.js +373 -0
- package/dist/client/mcp/multiServerManager.js +579 -0
- package/dist/client/mcp/registry.js +158 -0
- package/dist/client/mcp/routing/index.js +10 -0
- package/dist/client/mcp/routing/toolRouter.js +416 -0
- package/dist/client/mcp/serverCapabilities.js +502 -0
- package/dist/client/mcp/servers/agent/directToolsServer.js +150 -0
- package/dist/client/mcp/toolAnnotations.js +239 -0
- package/dist/client/mcp/toolConverter.js +258 -0
- package/dist/client/mcp/toolDiscoveryService.js +798 -0
- package/dist/client/mcp/toolIntegration.js +334 -0
- package/dist/client/mcp/toolRegistry.js +719 -0
- package/dist/client/memory/hippocampusInitializer.js +19 -0
- package/dist/client/memory/memoryRetrievalTools.js +166 -0
- package/dist/client/middleware/builtin/analytics.js +132 -0
- package/dist/client/middleware/builtin/autoEvaluation.js +203 -0
- package/dist/client/middleware/builtin/guardrails.js +109 -0
- package/dist/client/middleware/builtin/lifecycle.js +168 -0
- package/dist/client/middleware/factory.js +327 -0
- package/dist/client/middleware/registry.js +295 -0
- package/dist/client/middleware/utils/guardrailsUtils.js +396 -0
- package/dist/client/models/anthropicModels.js +527 -0
- package/dist/client/neurolink.js +8015 -0
- package/dist/client/observability/exporterRegistry.js +413 -0
- package/dist/client/observability/exporters/arizeExporter.js +138 -0
- package/dist/client/observability/exporters/baseExporter.js +190 -0
- package/dist/client/observability/exporters/braintrustExporter.js +154 -0
- package/dist/client/observability/exporters/datadogExporter.js +196 -0
- package/dist/client/observability/exporters/laminarExporter.js +302 -0
- package/dist/client/observability/exporters/langfuseExporter.js +209 -0
- package/dist/client/observability/exporters/langsmithExporter.js +143 -0
- package/dist/client/observability/exporters/otelExporter.js +164 -0
- package/dist/client/observability/exporters/posthogExporter.js +287 -0
- package/dist/client/observability/exporters/sentryExporter.js +165 -0
- package/dist/client/observability/index.js +31 -0
- package/dist/client/observability/metricsAggregator.js +556 -0
- package/dist/client/observability/otelBridge.js +131 -0
- package/dist/client/observability/retryPolicy.js +383 -0
- package/dist/client/observability/sampling/samplers.js +216 -0
- package/dist/client/observability/spanProcessor.js +303 -0
- package/dist/client/observability/tokenTracker.js +413 -0
- package/dist/client/observability/types/exporterTypes.js +5 -0
- package/dist/client/observability/types/index.js +4 -0
- package/dist/client/observability/types/spanTypes.js +92 -0
- package/dist/client/observability/utils/safeMetadata.js +25 -0
- package/dist/client/observability/utils/spanSerializer.js +292 -0
- package/dist/client/processors/archive/ArchiveProcessor.js +1308 -0
- package/dist/client/processors/base/BaseFileProcessor.js +614 -0
- package/dist/client/processors/base/types.js +82 -0
- package/dist/client/processors/config/fileTypes.js +520 -0
- package/dist/client/processors/config/index.js +92 -0
- package/dist/client/processors/config/languageMap.js +410 -0
- package/dist/client/processors/config/mimeTypes.js +363 -0
- package/dist/client/processors/config/sizeLimits.js +258 -0
- package/dist/client/processors/document/ExcelProcessor.js +590 -0
- package/dist/client/processors/document/OpenDocumentProcessor.js +212 -0
- package/dist/client/processors/document/PptxProcessor.js +157 -0
- package/dist/client/processors/document/RtfProcessor.js +361 -0
- package/dist/client/processors/document/WordProcessor.js +353 -0
- package/dist/client/processors/errors/FileErrorCode.js +255 -0
- package/dist/client/processors/errors/errorHelpers.js +386 -0
- package/dist/client/processors/errors/errorSerializer.js +507 -0
- package/dist/client/processors/errors/index.js +49 -0
- package/dist/client/processors/markup/SvgProcessor.js +240 -0
- package/dist/client/processors/media/AudioProcessor.js +707 -0
- package/dist/client/processors/media/VideoProcessor.js +1045 -0
- package/dist/client/providers/amazonBedrock.js +1512 -0
- package/dist/client/providers/amazonSagemaker.js +162 -0
- package/dist/client/providers/anthropic.js +831 -0
- package/dist/client/providers/azureOpenai.js +143 -0
- package/dist/client/providers/googleAiStudio.js +1200 -0
- package/dist/client/providers/googleNativeGemini3.js +543 -0
- package/dist/client/providers/googleVertex.js +2936 -0
- package/dist/client/providers/huggingFace.js +315 -0
- package/dist/client/providers/litellm.js +488 -0
- package/dist/client/providers/mistral.js +157 -0
- package/dist/client/providers/ollama.js +1579 -0
- package/dist/client/providers/openAI.js +627 -0
- package/dist/client/providers/openRouter.js +543 -0
- package/dist/client/providers/openaiCompatible.js +290 -0
- package/dist/client/providers/providerTypeUtils.js +46 -0
- package/dist/client/providers/sagemaker/adaptive-semaphore.js +215 -0
- package/dist/client/providers/sagemaker/client.js +472 -0
- package/dist/client/providers/sagemaker/config.js +317 -0
- package/dist/client/providers/sagemaker/detection.js +606 -0
- package/dist/client/providers/sagemaker/error-constants.js +227 -0
- package/dist/client/providers/sagemaker/errors.js +299 -0
- package/dist/client/providers/sagemaker/language-model.js +775 -0
- package/dist/client/providers/sagemaker/parsers.js +634 -0
- package/dist/client/providers/sagemaker/streaming.js +331 -0
- package/dist/client/providers/sagemaker/structured-parser.js +625 -0
- package/dist/client/proxy/accountQuota.js +162 -0
- package/dist/client/proxy/claudeFormat.js +595 -0
- package/dist/client/proxy/modelRouter.js +29 -0
- package/dist/client/proxy/oauthFetch.js +367 -0
- package/dist/client/proxy/proxyFetch.js +586 -0
- package/dist/client/proxy/requestLogger.js +207 -0
- package/dist/client/proxy/tokenRefresh.js +124 -0
- package/dist/client/proxy/usageStats.js +74 -0
- package/dist/client/proxy/utils/noProxyUtils.js +149 -0
- package/dist/client/rag/ChunkerFactory.js +320 -0
- package/dist/client/rag/ChunkerRegistry.js +421 -0
- package/dist/client/rag/chunkers/BaseChunker.js +143 -0
- package/dist/client/rag/chunkers/CharacterChunker.js +28 -0
- package/dist/client/rag/chunkers/HTMLChunker.js +38 -0
- package/dist/client/rag/chunkers/JSONChunker.js +68 -0
- package/dist/client/rag/chunkers/LaTeXChunker.js +63 -0
- package/dist/client/rag/chunkers/MarkdownChunker.js +306 -0
- package/dist/client/rag/chunkers/RecursiveChunker.js +139 -0
- package/dist/client/rag/chunkers/SemanticMarkdownChunker.js +138 -0
- package/dist/client/rag/chunkers/SentenceChunker.js +66 -0
- package/dist/client/rag/chunkers/TokenChunker.js +61 -0
- package/dist/client/rag/chunkers/index.js +15 -0
- package/dist/client/rag/chunking/characterChunker.js +142 -0
- package/dist/client/rag/chunking/chunkerRegistry.js +194 -0
- package/dist/client/rag/chunking/htmlChunker.js +247 -0
- package/dist/client/rag/chunking/index.js +17 -0
- package/dist/client/rag/chunking/jsonChunker.js +281 -0
- package/dist/client/rag/chunking/latexChunker.js +251 -0
- package/dist/client/rag/chunking/markdownChunker.js +373 -0
- package/dist/client/rag/chunking/recursiveChunker.js +148 -0
- package/dist/client/rag/chunking/semanticChunker.js +306 -0
- package/dist/client/rag/chunking/sentenceChunker.js +230 -0
- package/dist/client/rag/chunking/tokenChunker.js +183 -0
- package/dist/client/rag/document/MDocument.js +392 -0
- package/dist/client/rag/document/index.js +5 -0
- package/dist/client/rag/document/loaders.js +500 -0
- package/dist/client/rag/errors/RAGError.js +274 -0
- package/dist/client/rag/errors/index.js +6 -0
- package/dist/client/rag/graphRag/graphRAG.js +401 -0
- package/dist/client/rag/graphRag/index.js +4 -0
- package/dist/client/rag/index.js +141 -0
- package/dist/client/rag/metadata/MetadataExtractorFactory.js +418 -0
- package/dist/client/rag/metadata/MetadataExtractorRegistry.js +362 -0
- package/dist/client/rag/metadata/index.js +9 -0
- package/dist/client/rag/metadata/metadataExtractor.js +280 -0
- package/dist/client/rag/pipeline/RAGPipeline.js +436 -0
- package/dist/client/rag/pipeline/contextAssembly.js +341 -0
- package/dist/client/rag/pipeline/index.js +5 -0
- package/dist/client/rag/ragIntegration.js +321 -0
- package/dist/client/rag/reranker/RerankerFactory.js +430 -0
- package/dist/client/rag/reranker/RerankerRegistry.js +402 -0
- package/dist/client/rag/reranker/index.js +9 -0
- package/dist/client/rag/reranker/reranker.js +277 -0
- package/dist/client/rag/resilience/CircuitBreaker.js +431 -0
- package/dist/client/rag/resilience/RetryHandler.js +304 -0
- package/dist/client/rag/resilience/index.js +7 -0
- package/dist/client/rag/retrieval/hybridSearch.js +335 -0
- package/dist/client/rag/retrieval/index.js +5 -0
- package/dist/client/rag/retrieval/vectorQueryTool.js +307 -0
- package/dist/client/rag/types.js +8 -0
- package/dist/client/reactHooks.d.ts +239 -0
- package/dist/client/reactHooks.tsx +1483 -0
- package/dist/client/sdk/toolRegistration.js +377 -0
- package/dist/client/server/abstract/baseServerAdapter.js +575 -0
- package/dist/client/server/adapters/expressAdapter.js +486 -0
- package/dist/client/server/adapters/fastifyAdapter.js +472 -0
- package/dist/client/server/adapters/honoAdapter.js +632 -0
- package/dist/client/server/adapters/koaAdapter.js +510 -0
- package/dist/client/server/errors.js +486 -0
- package/dist/client/server/factory/serverAdapterFactory.js +160 -0
- package/dist/client/server/index.js +108 -0
- package/dist/client/server/middleware/abortSignal.js +111 -0
- package/dist/client/server/middleware/auth.js +388 -0
- package/dist/client/server/middleware/cache.js +359 -0
- package/dist/client/server/middleware/common.js +281 -0
- package/dist/client/server/middleware/deprecation.js +190 -0
- package/dist/client/server/middleware/mcpBodyAttachment.js +63 -0
- package/dist/client/server/middleware/rateLimit.js +227 -0
- package/dist/client/server/middleware/validation.js +388 -0
- package/dist/client/server/openapi/generator.js +398 -0
- package/dist/client/server/openapi/index.js +36 -0
- package/dist/client/server/openapi/schemas.js +695 -0
- package/dist/client/server/openapi/templates.js +374 -0
- package/dist/client/server/routes/agentRoutes.js +171 -0
- package/dist/client/server/routes/claudeProxyRoutes.js +1600 -0
- package/dist/client/server/routes/healthRoutes.js +187 -0
- package/dist/client/server/routes/index.js +57 -0
- package/dist/client/server/routes/mcpRoutes.js +342 -0
- package/dist/client/server/routes/memoryRoutes.js +350 -0
- package/dist/client/server/routes/openApiRoutes.js +126 -0
- package/dist/client/server/routes/toolRoutes.js +199 -0
- package/dist/client/server/streaming/dataStream.js +486 -0
- package/dist/client/server/streaming/index.js +11 -0
- package/dist/client/server/types.js +67 -0
- package/dist/client/server/utils/redaction.js +334 -0
- package/dist/client/server/utils/validation.js +243 -0
- package/dist/client/server/websocket/WebSocketHandler.js +383 -0
- package/dist/client/server/websocket/index.js +4 -0
- package/dist/client/services/server/ai/observability/instrumentation.js +808 -0
- package/dist/client/sseClient.d.ts +156 -0
- package/dist/client/sseClient.js +545 -0
- package/dist/client/streamingClient.d.ts +327 -0
- package/dist/client/streamingClient.js +917 -0
- package/dist/client/telemetry/attributes.js +100 -0
- package/dist/client/telemetry/index.js +26 -0
- package/dist/client/telemetry/telemetryService.js +308 -0
- package/dist/client/telemetry/tracers.js +17 -0
- package/dist/client/telemetry/withSpan.js +34 -0
- package/dist/client/types/actionTypes.js +6 -0
- package/dist/client/types/analytics.js +5 -0
- package/dist/client/types/authTypes.js +8 -0
- package/dist/client/types/circuitBreakerErrors.js +34 -0
- package/dist/client/types/cli.js +21 -0
- package/dist/client/types/clientTypes.js +10 -0
- package/dist/client/types/common.js +51 -0
- package/dist/client/types/configTypes.js +49 -0
- package/dist/client/types/content.js +19 -0
- package/dist/client/types/contextTypes.js +400 -0
- package/dist/client/types/conversation.js +47 -0
- package/dist/client/types/conversationMemoryInterface.js +6 -0
- package/dist/client/types/domainTypes.js +5 -0
- package/dist/client/types/errors.js +167 -0
- package/dist/client/types/evaluation.js +5 -0
- package/dist/client/types/evaluationProviders.js +5 -0
- package/dist/client/types/evaluationTypes.js +1 -0
- package/dist/client/types/externalMcp.js +6 -0
- package/dist/client/types/fileReferenceTypes.js +8 -0
- package/dist/client/types/fileTypes.js +4 -0
- package/dist/client/types/generateTypes.js +1 -0
- package/dist/client/types/guardrails.js +1 -0
- package/dist/client/types/hitlTypes.js +8 -0
- package/dist/client/types/index.js +57 -0
- package/dist/client/types/mcpTypes.js +5 -0
- package/dist/client/types/middlewareTypes.js +1 -0
- package/dist/client/types/modelTypes.js +30 -0
- package/dist/client/types/multimodal.js +135 -0
- package/dist/client/types/observability.js +6 -0
- package/dist/client/types/pptTypes.js +82 -0
- package/dist/client/types/providers.js +111 -0
- package/dist/client/types/proxyTypes.js +16 -0
- package/dist/client/types/ragTypes.js +7 -0
- package/dist/client/types/sdkTypes.js +8 -0
- package/dist/client/types/serviceTypes.js +5 -0
- package/dist/client/types/streamTypes.js +1 -0
- package/dist/client/types/subscriptionTypes.js +9 -0
- package/dist/client/types/taskClassificationTypes.js +5 -0
- package/dist/client/types/tools.js +24 -0
- package/dist/client/types/ttsTypes.js +57 -0
- package/dist/client/types/typeAliases.js +48 -0
- package/dist/client/types/utilities.js +4 -0
- package/dist/client/types/workflowTypes.js +30 -0
- package/dist/client/utils/async/withTimeout.js +98 -0
- package/dist/client/utils/asyncMutex.js +60 -0
- package/dist/client/utils/conversationMemory.js +431 -0
- package/dist/client/utils/csvProcessor.js +846 -0
- package/dist/client/utils/errorHandling.js +936 -0
- package/dist/client/utils/evaluationUtils.js +131 -0
- package/dist/client/utils/factoryProcessing.js +589 -0
- package/dist/client/utils/fileDetector.js +2161 -0
- package/dist/client/utils/imageCache.js +376 -0
- package/dist/client/utils/imageProcessor.js +704 -0
- package/dist/client/utils/logger.js +491 -0
- package/dist/client/utils/mcpDefaults.js +134 -0
- package/dist/client/utils/messageBuilder.js +1653 -0
- package/dist/client/utils/modelAliasResolver.js +54 -0
- package/dist/client/utils/modelDetection.js +80 -0
- package/dist/client/utils/modelRouter.js +292 -0
- package/dist/client/utils/multimodalOptionsBuilder.js +65 -0
- package/dist/client/utils/observabilityHelpers.js +47 -0
- package/dist/client/utils/parameterValidation.js +966 -0
- package/dist/client/utils/pdfProcessor.js +410 -0
- package/dist/client/utils/performance.js +222 -0
- package/dist/client/utils/pricing.js +340 -0
- package/dist/client/utils/promptRedaction.js +62 -0
- package/dist/client/utils/providerConfig.js +1009 -0
- package/dist/client/utils/providerHealth.js +1237 -0
- package/dist/client/utils/providerRetry.js +112 -0
- package/dist/client/utils/providerUtils.js +434 -0
- package/dist/client/utils/rateLimiter.js +200 -0
- package/dist/client/utils/redis.js +368 -0
- package/dist/client/utils/retryHandler.js +269 -0
- package/dist/client/utils/retryability.js +22 -0
- package/dist/client/utils/sanitizers/svg.js +481 -0
- package/dist/client/utils/schemaConversion.js +255 -0
- package/dist/client/utils/taskClassificationUtils.js +149 -0
- package/dist/client/utils/taskClassifier.js +94 -0
- package/dist/client/utils/thinkingConfig.js +104 -0
- package/dist/client/utils/timeout.js +359 -0
- package/dist/client/utils/tokenEstimation.js +142 -0
- package/dist/client/utils/tokenLimits.js +125 -0
- package/dist/client/utils/tokenUtils.js +239 -0
- package/dist/client/utils/toolUtils.js +75 -0
- package/dist/client/utils/transformationUtils.js +554 -0
- package/dist/client/utils/ttsProcessor.js +286 -0
- package/dist/client/utils/typeUtils.js +97 -0
- package/dist/client/utils/videoAnalysisProcessor.js +67 -0
- package/dist/client/workflow/config.js +398 -0
- package/dist/client/workflow/core/ensembleExecutor.js +407 -0
- package/dist/client/workflow/core/judgeScorer.js +544 -0
- package/dist/client/workflow/core/responseConditioner.js +225 -0
- package/dist/client/workflow/core/types/conditionerTypes.js +7 -0
- package/dist/client/workflow/core/types/ensembleTypes.js +7 -0
- package/dist/client/workflow/core/types/index.js +7 -0
- package/dist/client/workflow/core/types/judgeTypes.js +7 -0
- package/dist/client/workflow/core/types/layerTypes.js +7 -0
- package/dist/client/workflow/core/types/registryTypes.js +7 -0
- package/dist/client/workflow/core/workflowRegistry.js +304 -0
- package/dist/client/workflow/core/workflowRunner.js +586 -0
- package/dist/client/workflow/index.js +50 -0
- package/dist/client/workflow/types.js +9 -0
- package/dist/client/workflow/utils/types/index.js +7 -0
- package/dist/client/workflow/utils/workflowMetrics.js +311 -0
- package/dist/client/workflow/utils/workflowValidation.js +420 -0
- package/dist/client/workflow/workflows/adaptiveWorkflow.js +366 -0
- package/dist/client/workflow/workflows/consensusWorkflow.js +192 -0
- package/dist/client/workflow/workflows/fallbackWorkflow.js +225 -0
- package/dist/client/workflow/workflows/multiJudgeWorkflow.js +351 -0
- package/dist/client/wsClient.d.ts +130 -0
- package/dist/client/wsClient.js +369 -0
- package/dist/config/configManager.js +2 -2
- package/dist/constants/contextWindows.js +15 -13
- package/dist/constants/enums.d.ts +10 -16
- package/dist/constants/enums.js +12 -18
- package/dist/constants/index.d.ts +0 -10
- package/dist/constants/index.js +1 -1
- package/dist/constants/tokens.d.ts +29 -16
- package/dist/constants/tokens.js +23 -16
- package/dist/core/baseProvider.d.ts +5 -5
- package/dist/core/baseProvider.js +6 -6
- package/dist/core/constants.js +6 -1
- package/dist/core/dynamicModels.js +10 -6
- package/dist/core/evaluationProviders.js +1 -1
- package/dist/core/infrastructure/baseError.d.ts +1 -1
- package/dist/core/infrastructure/baseFactory.d.ts +1 -6
- package/dist/core/infrastructure/baseRegistry.d.ts +6 -5
- package/dist/core/infrastructure/index.d.ts +6 -4
- package/dist/core/infrastructure/index.js +2 -2
- package/dist/core/modelConfiguration.js +3 -1
- package/dist/core/modules/GenerationHandler.d.ts +3 -3
- package/dist/core/modules/GenerationHandler.js +49 -41
- package/dist/core/modules/MessageBuilder.d.ts +5 -5
- package/dist/core/modules/MessageBuilder.js +4 -6
- package/dist/core/modules/StreamHandler.js +26 -12
- package/dist/core/modules/TelemetryHandler.d.ts +4 -6
- package/dist/core/modules/TelemetryHandler.js +7 -6
- package/dist/core/modules/ToolsManager.d.ts +2 -12
- package/dist/core/modules/ToolsManager.js +20 -4
- package/dist/core/modules/Utilities.js +3 -1
- package/dist/core/redisConversationMemoryManager.js +3 -3
- package/dist/core/streamAnalytics.js +23 -9
- package/dist/evaluation/contextBuilder.d.ts +2 -2
- package/dist/evaluation/contextBuilder.js +2 -2
- package/dist/evaluation/index.d.ts +2 -2
- package/dist/evaluation/retryManager.js +1 -1
- package/dist/factories/providerFactory.js +2 -2
- package/dist/features/ppt/constants.js +1 -1
- package/dist/features/ppt/presentationOrchestrator.js +7 -3
- package/dist/features/ppt/slideGenerator.d.ts +2 -1
- package/dist/features/ppt/slideGenerator.js +6 -1
- package/dist/files/fileTools.d.ts +16 -247
- package/dist/files/fileTools.js +16 -15
- package/dist/index.d.ts +5 -3
- package/dist/index.js +20 -3
- package/dist/lib/adapters/providerImageAdapter.js +13 -22
- package/dist/lib/adapters/video/videoAnalyzer.d.ts +4 -4
- package/dist/lib/adapters/video/videoAnalyzer.js +3 -3
- package/dist/lib/agent/directTools.d.ts +20 -289
- package/dist/lib/agent/directTools.js +11 -10
- package/dist/lib/auth/accountPool.d.ts +68 -0
- package/dist/lib/auth/accountPool.js +179 -0
- package/dist/lib/auth/anthropicOAuth.d.ts +15 -5
- package/dist/lib/auth/anthropicOAuth.js +117 -57
- package/dist/lib/auth/index.d.ts +7 -5
- package/dist/lib/auth/index.js +6 -2
- package/dist/lib/auth/tokenStore.d.ts +71 -27
- package/dist/lib/auth/tokenStore.js +342 -64
- package/dist/lib/client/aiSdkAdapter.d.ts +196 -0
- package/dist/lib/client/aiSdkAdapter.js +488 -0
- package/dist/lib/client/auth.d.ts +248 -0
- package/dist/lib/client/auth.js +474 -0
- package/dist/lib/client/errors.d.ts +299 -0
- package/dist/lib/client/errors.js +553 -0
- package/dist/lib/client/httpClient.d.ts +297 -0
- package/dist/lib/client/httpClient.js +838 -0
- package/dist/lib/client/index.d.ts +111 -0
- package/dist/lib/client/index.js +173 -0
- package/dist/lib/client/interceptors.d.ts +283 -0
- package/dist/lib/client/interceptors.js +602 -0
- package/dist/lib/client/reactHooks.d.ts +239 -0
- package/dist/lib/client/reactHooks.js +1160 -0
- package/dist/lib/client/sseClient.d.ts +156 -0
- package/dist/lib/client/sseClient.js +546 -0
- package/dist/lib/client/streamingClient.d.ts +327 -0
- package/dist/lib/client/streamingClient.js +918 -0
- package/dist/lib/client/wsClient.d.ts +130 -0
- package/dist/lib/client/wsClient.js +370 -0
- package/dist/lib/config/configManager.js +2 -2
- package/dist/lib/constants/contextWindows.js +15 -13
- package/dist/lib/constants/enums.d.ts +10 -16
- package/dist/lib/constants/enums.js +12 -18
- package/dist/lib/constants/index.d.ts +0 -10
- package/dist/lib/constants/index.js +1 -1
- package/dist/lib/constants/tokens.d.ts +29 -16
- package/dist/lib/constants/tokens.js +23 -16
- package/dist/lib/core/baseProvider.d.ts +5 -5
- package/dist/lib/core/baseProvider.js +6 -6
- package/dist/lib/core/constants.js +6 -1
- package/dist/lib/core/dynamicModels.js +10 -6
- package/dist/lib/core/evaluationProviders.js +1 -1
- package/dist/lib/core/infrastructure/baseError.d.ts +1 -1
- package/dist/lib/core/infrastructure/baseFactory.d.ts +1 -6
- package/dist/lib/core/infrastructure/baseRegistry.d.ts +6 -5
- package/dist/lib/core/infrastructure/index.d.ts +6 -4
- package/dist/lib/core/infrastructure/index.js +2 -2
- package/dist/lib/core/modelConfiguration.js +3 -1
- package/dist/lib/core/modules/GenerationHandler.d.ts +3 -3
- package/dist/lib/core/modules/GenerationHandler.js +49 -41
- package/dist/lib/core/modules/MessageBuilder.d.ts +5 -5
- package/dist/lib/core/modules/MessageBuilder.js +4 -6
- package/dist/lib/core/modules/StreamHandler.js +26 -12
- package/dist/lib/core/modules/TelemetryHandler.d.ts +4 -6
- package/dist/lib/core/modules/TelemetryHandler.js +7 -6
- package/dist/lib/core/modules/ToolsManager.d.ts +2 -12
- package/dist/lib/core/modules/ToolsManager.js +20 -4
- package/dist/lib/core/modules/Utilities.js +3 -1
- package/dist/lib/core/redisConversationMemoryManager.js +3 -3
- package/dist/lib/core/streamAnalytics.js +23 -9
- package/dist/lib/evaluation/contextBuilder.d.ts +2 -2
- package/dist/lib/evaluation/contextBuilder.js +2 -2
- package/dist/lib/evaluation/index.d.ts +2 -2
- package/dist/lib/evaluation/retryManager.js +1 -1
- package/dist/lib/factories/providerFactory.js +2 -2
- package/dist/lib/features/ppt/constants.js +1 -1
- package/dist/lib/features/ppt/presentationOrchestrator.js +7 -3
- package/dist/lib/features/ppt/slideGenerator.d.ts +2 -1
- package/dist/lib/features/ppt/slideGenerator.js +6 -1
- package/dist/lib/files/fileTools.d.ts +16 -247
- package/dist/lib/files/fileTools.js +16 -15
- package/dist/lib/index.d.ts +5 -3
- package/dist/lib/index.js +20 -3
- package/dist/lib/mcp/batching/requestBatcher.js +1 -1
- package/dist/lib/mcp/externalServerManager.js +5 -2
- package/dist/lib/mcp/factory.js +1 -1
- package/dist/lib/mcp/index.d.ts +1 -1
- package/dist/lib/mcp/index.js +1 -1
- package/dist/lib/mcp/mcpCircuitBreaker.d.ts +1 -0
- package/dist/lib/mcp/mcpCircuitBreaker.js +30 -4
- package/dist/lib/mcp/mcpClientFactory.js +33 -4
- package/dist/lib/mcp/toolDiscoveryService.js +52 -5
- package/dist/lib/mcp/toolRegistry.js +7 -1
- package/dist/lib/memory/memoryRetrievalTools.d.ts +5 -89
- package/dist/lib/memory/memoryRetrievalTools.js +1 -1
- package/dist/lib/middleware/builtin/analytics.js +3 -0
- package/dist/lib/middleware/builtin/autoEvaluation.js +46 -24
- package/dist/lib/middleware/builtin/guardrails.js +4 -0
- package/dist/lib/middleware/builtin/lifecycle.js +10 -6
- package/dist/lib/middleware/factory.d.ts +3 -3
- package/dist/lib/middleware/factory.js +3 -2
- package/dist/lib/middleware/index.d.ts +1 -1
- package/dist/lib/middleware/registry.d.ts +2 -2
- package/dist/lib/middleware/registry.js +1 -0
- package/dist/lib/middleware/utils/guardrailsUtils.d.ts +5 -6
- package/dist/lib/middleware/utils/guardrailsUtils.js +15 -6
- package/dist/lib/neurolink.d.ts +9 -20
- package/dist/lib/neurolink.js +278 -186
- package/dist/lib/observability/retryPolicy.d.ts +2 -13
- package/dist/lib/observability/sampling/samplers.d.ts +2 -11
- package/dist/lib/observability/spanProcessor.d.ts +2 -14
- package/dist/lib/processors/base/BaseFileProcessor.js +1 -1
- package/dist/lib/processors/document/OpenDocumentProcessor.js +5 -3
- package/dist/lib/processors/media/VideoProcessor.js +157 -101
- package/dist/lib/providers/amazonBedrock.js +12 -5
- package/dist/lib/providers/amazonSagemaker.d.ts +5 -5
- package/dist/lib/providers/amazonSagemaker.js +6 -2
- package/dist/lib/providers/anthropic.d.ts +3 -3
- package/dist/lib/providers/anthropic.js +23 -192
- package/dist/lib/providers/anthropicBaseProvider.d.ts +4 -4
- package/dist/lib/providers/anthropicBaseProvider.js +24 -13
- package/dist/lib/providers/azureOpenai.d.ts +2 -2
- package/dist/lib/providers/azureOpenai.js +6 -6
- package/dist/lib/providers/googleAiStudio.d.ts +2 -2
- package/dist/lib/providers/googleAiStudio.js +15 -7
- package/dist/lib/providers/googleNativeGemini3.d.ts +3 -54
- package/dist/lib/providers/googleNativeGemini3.js +14 -10
- package/dist/lib/providers/googleVertex.d.ts +6 -6
- package/dist/lib/providers/googleVertex.js +32 -26
- package/dist/lib/providers/huggingFace.d.ts +4 -4
- package/dist/lib/providers/huggingFace.js +15 -5
- package/dist/lib/providers/litellm.d.ts +4 -4
- package/dist/lib/providers/litellm.js +54 -42
- package/dist/lib/providers/mistral.d.ts +2 -2
- package/dist/lib/providers/mistral.js +5 -4
- package/dist/lib/providers/ollama.d.ts +7 -4
- package/dist/lib/providers/ollama.js +30 -8
- package/dist/lib/providers/openAI.d.ts +2 -2
- package/dist/lib/providers/openAI.js +46 -21
- package/dist/lib/providers/openRouter.d.ts +4 -4
- package/dist/lib/providers/openRouter.js +63 -35
- package/dist/lib/providers/openaiCompatible.d.ts +2 -2
- package/dist/lib/providers/openaiCompatible.js +18 -9
- package/dist/lib/providers/providerTypeUtils.d.ts +28 -0
- package/dist/lib/providers/providerTypeUtils.js +47 -0
- package/dist/lib/providers/sagemaker/config.js +5 -5
- package/dist/lib/providers/sagemaker/language-model.d.ts +23 -13
- package/dist/lib/providers/sagemaker/language-model.js +20 -8
- package/dist/lib/proxy/accountQuota.d.ts +33 -0
- package/dist/lib/proxy/accountQuota.js +163 -0
- package/dist/lib/proxy/claudeFormat.d.ts +143 -0
- package/dist/lib/proxy/claudeFormat.js +596 -0
- package/dist/lib/proxy/cloaking/index.d.ts +44 -0
- package/dist/lib/proxy/cloaking/index.js +87 -0
- package/dist/lib/proxy/cloaking/plugins/headerScrubber.d.ts +9 -0
- package/dist/lib/proxy/cloaking/plugins/headerScrubber.js +87 -0
- package/dist/lib/proxy/cloaking/plugins/sessionIdentity.d.ts +15 -0
- package/dist/lib/proxy/cloaking/plugins/sessionIdentity.js +66 -0
- package/dist/lib/proxy/cloaking/plugins/systemPromptInjector.d.ts +11 -0
- package/dist/lib/proxy/cloaking/plugins/systemPromptInjector.js +84 -0
- package/dist/lib/proxy/cloaking/plugins/tlsFingerprint.d.ts +14 -0
- package/dist/lib/proxy/cloaking/plugins/tlsFingerprint.js +39 -0
- package/dist/lib/proxy/cloaking/plugins/wordObfuscator.d.ts +9 -0
- package/dist/lib/proxy/cloaking/plugins/wordObfuscator.js +122 -0
- package/dist/lib/proxy/cloaking/types.d.ts +1 -0
- package/dist/lib/proxy/cloaking/types.js +2 -0
- package/dist/lib/proxy/modelRouter.d.ts +10 -0
- package/dist/lib/proxy/modelRouter.js +30 -0
- package/dist/lib/proxy/oauthFetch.d.ts +36 -0
- package/dist/lib/proxy/oauthFetch.js +368 -0
- package/dist/lib/proxy/proxyConfig.d.ts +42 -0
- package/dist/lib/proxy/proxyConfig.js +500 -0
- package/dist/lib/proxy/proxyFetch.js +2 -1
- package/dist/lib/proxy/requestLogger.d.ts +50 -0
- package/dist/lib/proxy/requestLogger.js +208 -0
- package/dist/lib/proxy/tokenRefresh.d.ts +4 -0
- package/dist/lib/proxy/tokenRefresh.js +125 -0
- package/dist/lib/proxy/usageStats.d.ts +13 -0
- package/dist/lib/proxy/usageStats.js +75 -0
- package/dist/lib/rag/document/loaders.js +1 -1
- package/dist/lib/rag/pipeline/contextAssembly.d.ts +4 -7
- package/dist/lib/rag/ragIntegration.d.ts +2 -14
- package/dist/lib/rag/ragIntegration.js +1 -1
- package/dist/lib/rag/resilience/CircuitBreaker.d.ts +5 -44
- package/dist/lib/rag/resilience/RetryHandler.js +1 -1
- package/dist/lib/rag/retrieval/vectorQueryTool.d.ts +1 -9
- package/dist/lib/rag/retrieval/vectorQueryTool.js +1 -1
- package/dist/lib/sdk/toolRegistration.js +12 -1
- package/dist/lib/server/abstract/baseServerAdapter.js +2 -2
- package/dist/lib/server/adapters/honoAdapter.d.ts +6 -0
- package/dist/lib/server/adapters/honoAdapter.js +76 -10
- package/dist/lib/server/middleware/cache.js +3 -0
- package/dist/lib/server/routes/claudeProxyRoutes.d.ts +44 -0
- package/dist/lib/server/routes/claudeProxyRoutes.js +1601 -0
- package/dist/lib/server/routes/healthRoutes.js +18 -1
- package/dist/lib/server/routes/index.d.ts +7 -0
- package/dist/lib/server/routes/index.js +8 -0
- package/dist/lib/server/streaming/dataStream.d.ts +1 -5
- package/dist/lib/server/streaming/dataStream.js +3 -0
- package/dist/lib/server/utils/validation.d.ts +24 -124
- package/dist/lib/server/utils/validation.js +2 -2
- package/dist/lib/services/server/ai/observability/instrumentation.js +4 -0
- package/dist/lib/telemetry/attributes.d.ts +38 -0
- package/dist/lib/telemetry/attributes.js +40 -0
- package/dist/lib/telemetry/tracers.d.ts +1 -0
- package/dist/lib/telemetry/tracers.js +1 -0
- package/dist/lib/types/authTypes.d.ts +56 -0
- package/dist/lib/types/authTypes.js +9 -0
- package/dist/lib/types/circuitBreakerErrors.d.ts +30 -0
- package/dist/lib/types/circuitBreakerErrors.js +35 -0
- package/dist/lib/types/cli.d.ts +258 -0
- package/dist/lib/types/clientTypes.d.ts +1050 -0
- package/dist/lib/types/clientTypes.js +11 -0
- package/dist/lib/types/common.d.ts +123 -0
- package/dist/lib/types/configTypes.d.ts +49 -0
- package/dist/lib/types/configTypes.js +4 -0
- package/dist/lib/types/conversation.d.ts +0 -5
- package/dist/lib/types/evaluationTypes.d.ts +2 -2
- package/dist/lib/types/fileTypes.d.ts +47 -0
- package/dist/lib/types/generateTypes.d.ts +7 -3
- package/dist/lib/types/guardrails.d.ts +2 -2
- package/dist/lib/types/index.d.ts +4 -1
- package/dist/lib/types/index.js +5 -0
- package/dist/lib/types/middlewareTypes.d.ts +3 -3
- package/dist/lib/types/modelTypes.d.ts +7 -97
- package/dist/lib/types/modelTypes.js +3 -3
- package/dist/lib/types/observability.d.ts +37 -0
- package/dist/lib/types/providers.d.ts +107 -0
- package/dist/lib/types/proxyTypes.d.ts +536 -0
- package/dist/lib/types/proxyTypes.js +17 -0
- package/dist/lib/types/ragTypes.d.ts +49 -1
- package/dist/lib/types/streamTypes.d.ts +37 -13
- package/dist/lib/types/subscriptionTypes.d.ts +77 -0
- package/dist/lib/types/subscriptionTypes.js +2 -0
- package/dist/lib/types/tools.d.ts +45 -1
- package/dist/lib/types/typeAliases.d.ts +8 -0
- package/dist/lib/types/typeAliases.js +1 -0
- package/dist/lib/utils/async/retry.d.ts +4 -33
- package/dist/lib/utils/asyncMutex.d.ts +14 -0
- package/dist/lib/utils/asyncMutex.js +61 -0
- package/dist/lib/utils/errorHandling.d.ts +2 -1
- package/dist/lib/utils/errorHandling.js +14 -6
- package/dist/lib/utils/fileDetector.d.ts +13 -1
- package/dist/lib/utils/fileDetector.js +114 -32
- package/dist/lib/utils/imageProcessor.js +7 -7
- package/dist/lib/utils/json/safeParse.d.ts +1 -8
- package/dist/lib/utils/mcpDefaults.d.ts +1 -1
- package/dist/lib/utils/mcpDefaults.js +11 -2
- package/dist/lib/utils/messageBuilder.d.ts +5 -5
- package/dist/lib/utils/messageBuilder.js +106 -80
- package/dist/lib/utils/modelChoices.d.ts +1 -8
- package/dist/lib/utils/pdfProcessor.d.ts +1 -25
- package/dist/lib/utils/pdfProcessor.js +5 -4
- package/dist/lib/utils/pricing.js +28 -5
- package/dist/lib/utils/providerHealth.d.ts +1 -1
- package/dist/lib/utils/rateLimiter.d.ts +1 -15
- package/dist/lib/utils/redis.d.ts +1 -1
- package/dist/lib/utils/redis.js +3 -3
- package/dist/lib/utils/sanitizers/filename.d.ts +2 -22
- package/dist/lib/utils/sanitizers/index.d.ts +4 -2
- package/dist/lib/utils/sanitizers/svg.d.ts +1 -11
- package/dist/lib/utils/schemaConversion.js +4 -1
- package/dist/lib/utils/thinkingConfig.d.ts +1 -33
- package/dist/lib/utils/tokenUtils.d.ts +1 -39
- package/dist/lib/utils/videoAnalysisProcessor.d.ts +5 -5
- package/dist/lib/utils/videoAnalysisProcessor.js +2 -2
- package/dist/lib/workflow/config.d.ts +89 -1257
- package/dist/lib/workflow/utils/workflowValidation.js +1 -1
- package/dist/mcp/batching/requestBatcher.js +1 -1
- package/dist/mcp/externalServerManager.js +5 -2
- package/dist/mcp/factory.js +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/mcpCircuitBreaker.d.ts +1 -0
- package/dist/mcp/mcpCircuitBreaker.js +30 -4
- package/dist/mcp/mcpClientFactory.js +33 -4
- package/dist/mcp/toolDiscoveryService.js +52 -5
- package/dist/mcp/toolRegistry.js +7 -1
- package/dist/memory/memoryRetrievalTools.d.ts +5 -89
- package/dist/memory/memoryRetrievalTools.js +1 -1
- package/dist/middleware/builtin/analytics.js +3 -0
- package/dist/middleware/builtin/autoEvaluation.js +46 -24
- package/dist/middleware/builtin/guardrails.js +4 -0
- package/dist/middleware/builtin/lifecycle.js +10 -6
- package/dist/middleware/factory.d.ts +3 -3
- package/dist/middleware/factory.js +3 -2
- package/dist/middleware/index.d.ts +1 -1
- package/dist/middleware/registry.d.ts +2 -2
- package/dist/middleware/registry.js +1 -0
- package/dist/middleware/utils/guardrailsUtils.d.ts +5 -6
- package/dist/middleware/utils/guardrailsUtils.js +15 -6
- package/dist/neurolink.d.ts +9 -20
- package/dist/neurolink.js +278 -186
- package/dist/observability/retryPolicy.d.ts +2 -13
- package/dist/observability/sampling/samplers.d.ts +2 -11
- package/dist/observability/spanProcessor.d.ts +2 -14
- package/dist/processors/base/BaseFileProcessor.js +1 -1
- package/dist/processors/document/OpenDocumentProcessor.js +5 -3
- package/dist/processors/media/VideoProcessor.js +157 -101
- package/dist/providers/amazonBedrock.js +12 -5
- package/dist/providers/amazonSagemaker.d.ts +5 -5
- package/dist/providers/amazonSagemaker.js +6 -2
- package/dist/providers/anthropic.d.ts +3 -3
- package/dist/providers/anthropic.js +23 -192
- package/dist/providers/anthropicBaseProvider.d.ts +4 -4
- package/dist/providers/anthropicBaseProvider.js +24 -13
- package/dist/providers/azureOpenai.d.ts +2 -2
- package/dist/providers/azureOpenai.js +6 -6
- package/dist/providers/googleAiStudio.d.ts +2 -2
- package/dist/providers/googleAiStudio.js +15 -7
- package/dist/providers/googleNativeGemini3.d.ts +3 -54
- package/dist/providers/googleNativeGemini3.js +14 -10
- package/dist/providers/googleVertex.d.ts +6 -6
- package/dist/providers/googleVertex.js +32 -26
- package/dist/providers/huggingFace.d.ts +4 -4
- package/dist/providers/huggingFace.js +15 -5
- package/dist/providers/litellm.d.ts +4 -4
- package/dist/providers/litellm.js +54 -42
- package/dist/providers/mistral.d.ts +2 -2
- package/dist/providers/mistral.js +5 -4
- package/dist/providers/ollama.d.ts +7 -4
- package/dist/providers/ollama.js +30 -8
- package/dist/providers/openAI.d.ts +2 -2
- package/dist/providers/openAI.js +46 -21
- package/dist/providers/openRouter.d.ts +4 -4
- package/dist/providers/openRouter.js +63 -35
- package/dist/providers/openaiCompatible.d.ts +2 -2
- package/dist/providers/openaiCompatible.js +18 -9
- package/dist/providers/providerTypeUtils.d.ts +28 -0
- package/dist/providers/providerTypeUtils.js +46 -0
- package/dist/providers/sagemaker/config.js +5 -5
- package/dist/providers/sagemaker/language-model.d.ts +23 -13
- package/dist/providers/sagemaker/language-model.js +20 -8
- package/dist/proxy/accountQuota.d.ts +33 -0
- package/dist/proxy/accountQuota.js +162 -0
- package/dist/proxy/claudeFormat.d.ts +143 -0
- package/dist/proxy/claudeFormat.js +595 -0
- package/dist/proxy/cloaking/index.d.ts +44 -0
- package/dist/proxy/cloaking/index.js +86 -0
- package/dist/proxy/cloaking/plugins/headerScrubber.d.ts +9 -0
- package/dist/proxy/cloaking/plugins/headerScrubber.js +86 -0
- package/dist/proxy/cloaking/plugins/sessionIdentity.d.ts +15 -0
- package/dist/proxy/cloaking/plugins/sessionIdentity.js +65 -0
- package/dist/proxy/cloaking/plugins/systemPromptInjector.d.ts +11 -0
- package/dist/proxy/cloaking/plugins/systemPromptInjector.js +83 -0
- package/dist/proxy/cloaking/plugins/tlsFingerprint.d.ts +14 -0
- package/dist/proxy/cloaking/plugins/tlsFingerprint.js +38 -0
- package/dist/proxy/cloaking/plugins/wordObfuscator.d.ts +9 -0
- package/dist/proxy/cloaking/plugins/wordObfuscator.js +121 -0
- package/dist/proxy/cloaking/types.d.ts +1 -0
- package/dist/proxy/cloaking/types.js +1 -0
- package/dist/proxy/modelRouter.d.ts +10 -0
- package/dist/proxy/modelRouter.js +29 -0
- package/dist/proxy/oauthFetch.d.ts +36 -0
- package/dist/proxy/oauthFetch.js +367 -0
- package/dist/proxy/proxyConfig.d.ts +42 -0
- package/dist/proxy/proxyConfig.js +499 -0
- package/dist/proxy/proxyFetch.js +2 -1
- package/dist/proxy/requestLogger.d.ts +50 -0
- package/dist/proxy/requestLogger.js +207 -0
- package/dist/proxy/tokenRefresh.d.ts +4 -0
- package/dist/proxy/tokenRefresh.js +124 -0
- package/dist/proxy/usageStats.d.ts +13 -0
- package/dist/proxy/usageStats.js +74 -0
- package/dist/rag/document/loaders.js +1 -1
- package/dist/rag/pipeline/contextAssembly.d.ts +4 -7
- package/dist/rag/ragIntegration.d.ts +2 -14
- package/dist/rag/ragIntegration.js +1 -1
- package/dist/rag/resilience/CircuitBreaker.d.ts +5 -44
- package/dist/rag/resilience/RetryHandler.js +1 -1
- package/dist/rag/retrieval/vectorQueryTool.d.ts +1 -9
- package/dist/rag/retrieval/vectorQueryTool.js +1 -1
- package/dist/sdk/toolRegistration.js +12 -1
- package/dist/server/abstract/baseServerAdapter.js +2 -2
- package/dist/server/adapters/honoAdapter.d.ts +6 -0
- package/dist/server/adapters/honoAdapter.js +76 -10
- package/dist/server/middleware/cache.js +3 -0
- package/dist/server/routes/claudeProxyRoutes.d.ts +44 -0
- package/dist/server/routes/claudeProxyRoutes.js +1600 -0
- package/dist/server/routes/healthRoutes.js +18 -1
- package/dist/server/routes/index.d.ts +7 -0
- package/dist/server/routes/index.js +8 -0
- package/dist/server/streaming/dataStream.d.ts +1 -5
- package/dist/server/streaming/dataStream.js +3 -0
- package/dist/server/utils/validation.d.ts +24 -124
- package/dist/server/utils/validation.js +2 -2
- package/dist/services/server/ai/observability/instrumentation.js +4 -0
- package/dist/telemetry/attributes.d.ts +38 -0
- package/dist/telemetry/attributes.js +40 -0
- package/dist/telemetry/tracers.d.ts +1 -0
- package/dist/telemetry/tracers.js +1 -0
- package/dist/types/authTypes.d.ts +56 -0
- package/dist/types/authTypes.js +8 -0
- package/dist/types/circuitBreakerErrors.d.ts +30 -0
- package/dist/types/circuitBreakerErrors.js +34 -0
- package/dist/types/cli.d.ts +258 -0
- package/dist/types/clientTypes.d.ts +1050 -0
- package/dist/types/clientTypes.js +10 -0
- package/dist/types/common.d.ts +123 -0
- package/dist/types/configTypes.d.ts +49 -0
- package/dist/types/configTypes.js +4 -0
- package/dist/types/conversation.d.ts +0 -5
- package/dist/types/evaluationTypes.d.ts +2 -2
- package/dist/types/fileTypes.d.ts +47 -0
- package/dist/types/generateTypes.d.ts +7 -3
- package/dist/types/guardrails.d.ts +2 -2
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.js +5 -0
- package/dist/types/middlewareTypes.d.ts +3 -3
- package/dist/types/modelTypes.d.ts +7 -97
- package/dist/types/modelTypes.js +3 -3
- package/dist/types/observability.d.ts +37 -0
- package/dist/types/providers.d.ts +107 -0
- package/dist/types/proxyTypes.d.ts +536 -0
- package/dist/types/proxyTypes.js +16 -0
- package/dist/types/ragTypes.d.ts +49 -1
- package/dist/types/streamTypes.d.ts +37 -13
- package/dist/types/subscriptionTypes.d.ts +77 -0
- package/dist/types/subscriptionTypes.js +2 -0
- package/dist/types/tools.d.ts +45 -1
- package/dist/types/typeAliases.d.ts +8 -0
- package/dist/types/typeAliases.js +1 -0
- package/dist/utils/async/retry.d.ts +4 -33
- package/dist/utils/asyncMutex.d.ts +14 -0
- package/dist/utils/asyncMutex.js +60 -0
- package/dist/utils/errorHandling.d.ts +2 -1
- package/dist/utils/errorHandling.js +14 -6
- package/dist/utils/fileDetector.d.ts +13 -1
- package/dist/utils/fileDetector.js +114 -32
- package/dist/utils/imageProcessor.js +7 -7
- package/dist/utils/json/safeParse.d.ts +1 -8
- package/dist/utils/mcpDefaults.d.ts +1 -1
- package/dist/utils/mcpDefaults.js +11 -2
- package/dist/utils/messageBuilder.d.ts +5 -5
- package/dist/utils/messageBuilder.js +106 -80
- package/dist/utils/modelChoices.d.ts +1 -8
- package/dist/utils/pdfProcessor.d.ts +1 -25
- package/dist/utils/pdfProcessor.js +5 -4
- package/dist/utils/pricing.js +28 -5
- package/dist/utils/rateLimiter.d.ts +1 -15
- package/dist/utils/redis.d.ts +1 -1
- package/dist/utils/redis.js +3 -3
- package/dist/utils/sanitizers/filename.d.ts +2 -22
- package/dist/utils/sanitizers/index.d.ts +4 -2
- package/dist/utils/sanitizers/svg.d.ts +1 -11
- package/dist/utils/schemaConversion.js +4 -1
- package/dist/utils/thinkingConfig.d.ts +1 -33
- package/dist/utils/tokenUtils.d.ts +1 -39
- package/dist/utils/videoAnalysisProcessor.d.ts +5 -5
- package/dist/utils/videoAnalysisProcessor.js +2 -2
- package/dist/workflow/config.d.ts +89 -1257
- package/dist/workflow/utils/workflowValidation.js +1 -1
- package/docs-site/mcp-server/index.js +2 -3
- package/package.json +138 -105
- package/dist/lib/memory/mem0Initializer.d.ts +0 -46
- package/dist/lib/memory/mem0Initializer.js +0 -85
- package/dist/memory/mem0Initializer.d.ts +0 -46
- package/dist/memory/mem0Initializer.js +0 -84
|
@@ -7,10 +7,12 @@
|
|
|
7
7
|
* - OAuth 2.1 authentication with PKCE (for Claude subscription)
|
|
8
8
|
*
|
|
9
9
|
* Subcommands:
|
|
10
|
-
* - login: Authenticate with a provider
|
|
10
|
+
* - login: Authenticate with a provider (supports --add/--label for multi-account)
|
|
11
11
|
* - logout: Clear stored credentials
|
|
12
12
|
* - status: Show authentication status
|
|
13
13
|
* - refresh: Manually refresh OAuth tokens
|
|
14
|
+
* - list: List all authenticated accounts
|
|
15
|
+
* - remove: Remove an authenticated account
|
|
14
16
|
*
|
|
15
17
|
* Currently supports:
|
|
16
18
|
* - Anthropic (API key + OAuth)
|
|
@@ -25,6 +27,7 @@ import ora from "ora";
|
|
|
25
27
|
import { logger } from "../../lib/utils/logger.js";
|
|
26
28
|
import { defaultTokenStore } from "../../lib/auth/tokenStore.js";
|
|
27
29
|
import { CLAUDE_CODE_CLIENT_ID, ANTHROPIC_AUTH_URL, ANTHROPIC_TOKEN_URL, ANTHROPIC_REDIRECT_URI, CLAUDE_CLI_USER_AGENT, OAUTH_BETA_HEADERS, } from "../../lib/auth/anthropicOAuth.js";
|
|
30
|
+
import { loadAccountQuotas } from "../../lib/proxy/accountQuota.js";
|
|
28
31
|
// =============================================================================
|
|
29
32
|
// CONSTANTS
|
|
30
33
|
// =============================================================================
|
|
@@ -65,6 +68,9 @@ const SUPPORTED_PROVIDERS = ["anthropic"];
|
|
|
65
68
|
/**
|
|
66
69
|
* Handle the login subcommand
|
|
67
70
|
* `neurolink auth login <provider>`
|
|
71
|
+
*
|
|
72
|
+
* When --add is specified, saves tokens to the TokenStore with a compound key
|
|
73
|
+
* (e.g., "anthropic:alice") to support multi-account pools.
|
|
68
74
|
*/
|
|
69
75
|
export async function handleLogin(argv) {
|
|
70
76
|
try {
|
|
@@ -75,20 +81,31 @@ export async function handleLogin(argv) {
|
|
|
75
81
|
process.exit(1);
|
|
76
82
|
}
|
|
77
83
|
// If method is specified, use it directly
|
|
84
|
+
// Each handler returns true when credentials were written to a file,
|
|
85
|
+
// false for .env-only or "keep existing" paths.
|
|
86
|
+
let wroteCredentials = false;
|
|
78
87
|
if (argv.method) {
|
|
79
88
|
if (argv.method === "api-key") {
|
|
80
|
-
await handleApiKeyAuth(provider, !argv.nonInteractive);
|
|
89
|
+
wroteCredentials = await handleApiKeyAuth(provider, !argv.nonInteractive);
|
|
81
90
|
}
|
|
82
91
|
else if (argv.method === "oauth") {
|
|
83
92
|
await handleOAuthAuth(provider);
|
|
93
|
+
wroteCredentials = true;
|
|
84
94
|
}
|
|
85
95
|
else if (argv.method === "create-api-key") {
|
|
86
96
|
await handleCreateApiKeyOAuth(provider);
|
|
97
|
+
wroteCredentials = true;
|
|
87
98
|
}
|
|
88
99
|
}
|
|
89
100
|
else {
|
|
90
101
|
// Interactive mode - ask user which method they prefer
|
|
91
|
-
await handleInteractiveAuth(provider);
|
|
102
|
+
wroteCredentials = await handleInteractiveAuth(provider);
|
|
103
|
+
}
|
|
104
|
+
// Only save to TokenStore when the auth flow actually wrote credentials.
|
|
105
|
+
// Skip for .env-only or "keep existing" paths — re-reading a stale or
|
|
106
|
+
// nonexistent credentials file is wasteful and can produce wrong entries.
|
|
107
|
+
if (wroteCredentials) {
|
|
108
|
+
await saveAccountToPool(provider, argv.label);
|
|
92
109
|
}
|
|
93
110
|
}
|
|
94
111
|
catch (error) {
|
|
@@ -97,6 +114,261 @@ export async function handleLogin(argv) {
|
|
|
97
114
|
process.exit(1);
|
|
98
115
|
}
|
|
99
116
|
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Quota display helpers
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
/**
|
|
121
|
+
* Convert a future unix timestamp (seconds) into a human-readable relative
|
|
122
|
+
* duration like "2h 15m" or "4d 3h". Returns "now" if the time has passed.
|
|
123
|
+
*/
|
|
124
|
+
function formatTimeUntil(unixTimestamp) {
|
|
125
|
+
const ms = unixTimestamp * 1000 - Date.now();
|
|
126
|
+
if (ms <= 0) {
|
|
127
|
+
return "now";
|
|
128
|
+
}
|
|
129
|
+
const hours = Math.floor(ms / 3600000);
|
|
130
|
+
const minutes = Math.floor((ms % 3600000) / 60000);
|
|
131
|
+
if (hours >= 24) {
|
|
132
|
+
const days = Math.floor(hours / 24);
|
|
133
|
+
const remainHours = hours % 24;
|
|
134
|
+
return `${days}d ${remainHours}h`;
|
|
135
|
+
}
|
|
136
|
+
return `${hours}h ${minutes}m`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Format session/weekly quota into compact display strings.
|
|
140
|
+
*/
|
|
141
|
+
function formatQuotaColumns(quota) {
|
|
142
|
+
const sessionRemaining = Math.round((1 - quota.sessionUsed) * 100);
|
|
143
|
+
const weeklyRemaining = Math.round((1 - quota.weeklyUsed) * 100);
|
|
144
|
+
const colorize = (pct, text) => {
|
|
145
|
+
if (pct <= 10) {
|
|
146
|
+
return chalk.red(text);
|
|
147
|
+
}
|
|
148
|
+
if (pct <= 30) {
|
|
149
|
+
return chalk.yellow(text);
|
|
150
|
+
}
|
|
151
|
+
return chalk.green(text);
|
|
152
|
+
};
|
|
153
|
+
return {
|
|
154
|
+
sessionText: colorize(sessionRemaining, `${sessionRemaining}% left`),
|
|
155
|
+
weeklyText: colorize(weeklyRemaining, `${weeklyRemaining}% left`),
|
|
156
|
+
sessionReset: quota.sessionResetAt > 0
|
|
157
|
+
? chalk.gray(`resets ${formatTimeUntil(quota.sessionResetAt)}`)
|
|
158
|
+
: "",
|
|
159
|
+
weeklyReset: quota.weeklyResetAt > 0
|
|
160
|
+
? chalk.gray(`resets ${formatTimeUntil(quota.weeklyResetAt)}`)
|
|
161
|
+
: "",
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Handle the list subcommand
|
|
166
|
+
* `neurolink auth list`
|
|
167
|
+
*
|
|
168
|
+
* Lists all authenticated accounts from the TokenStore.
|
|
169
|
+
*/
|
|
170
|
+
export async function handleList(argv) {
|
|
171
|
+
try {
|
|
172
|
+
const allKeys = await defaultTokenStore.listProviders();
|
|
173
|
+
if (allKeys.length === 0) {
|
|
174
|
+
if (argv.format === "json") {
|
|
175
|
+
logger.always(JSON.stringify([], null, 2));
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
logger.always(chalk.yellow("\nNo authenticated accounts found.\n"));
|
|
179
|
+
logger.always(chalk.blue("Run 'neurolink auth login <provider>' to authenticate.\n"));
|
|
180
|
+
}
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Build enriched account list with token metadata
|
|
184
|
+
const enrichedAccounts = await Promise.all(allKeys.map(async (key) => {
|
|
185
|
+
const parts = key.split(":");
|
|
186
|
+
const provider = parts[0];
|
|
187
|
+
const label = parts.length > 1 ? parts.slice(1).join(":") : undefined;
|
|
188
|
+
let tier;
|
|
189
|
+
let email;
|
|
190
|
+
let tokenStatus = "unknown";
|
|
191
|
+
let expiresAt;
|
|
192
|
+
// Derive email from the compound key label when it looks like an email.
|
|
193
|
+
// The credentials file is a shared singleton that gets overwritten on
|
|
194
|
+
// every login — reading email from it would show the LATEST login's
|
|
195
|
+
// email for ALL accounts. The label is the per-account source of truth.
|
|
196
|
+
if (label && label.includes("@")) {
|
|
197
|
+
email = label;
|
|
198
|
+
}
|
|
199
|
+
// Fall back to credentials file ONLY for the default (unlabeled) account.
|
|
200
|
+
// Compound-key entries (labeled accounts) must NOT read the shared
|
|
201
|
+
// credentials file because it gets overwritten on every login and would
|
|
202
|
+
// show the latest login's email/tier for all accounts. Per-account
|
|
203
|
+
// metadata is encoded in the token's scope field instead.
|
|
204
|
+
if (!email && !label) {
|
|
205
|
+
try {
|
|
206
|
+
const credPath = path.join(NEUROLINK_CONFIG_DIR, `${provider}-credentials.json`);
|
|
207
|
+
if (fs.existsSync(credPath)) {
|
|
208
|
+
const creds = JSON.parse(fs.readFileSync(credPath, "utf-8"));
|
|
209
|
+
email = creds.email;
|
|
210
|
+
if (creds.subscriptionTier) {
|
|
211
|
+
tier = creds.subscriptionTier;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
/* non-fatal */
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
const tokens = await defaultTokenStore.loadTokens(key);
|
|
221
|
+
if (tokens) {
|
|
222
|
+
expiresAt = tokens.expiresAt;
|
|
223
|
+
const isExpired = defaultTokenStore.isTokenExpired(tokens, 0);
|
|
224
|
+
tokenStatus = isExpired ? "expired" : "valid";
|
|
225
|
+
// Extract per-account metadata from scope (e.g. "tier:pro email:user@example.com")
|
|
226
|
+
if (tokens.scope) {
|
|
227
|
+
if (!tier) {
|
|
228
|
+
const tierMatch = tokens.scope.match(/tier:(\w+)/);
|
|
229
|
+
if (tierMatch) {
|
|
230
|
+
tier = tierMatch[1];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (!email) {
|
|
234
|
+
const emailMatch = tokens.scope.match(/email:(\S+)/);
|
|
235
|
+
if (emailMatch) {
|
|
236
|
+
email = emailMatch[1];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// Token load failed — show as unknown
|
|
244
|
+
}
|
|
245
|
+
return { key, provider, label, email, tier, tokenStatus, expiresAt };
|
|
246
|
+
}));
|
|
247
|
+
// Load persisted quota data (captured from proxy responses).
|
|
248
|
+
let quotas = {};
|
|
249
|
+
try {
|
|
250
|
+
quotas = await loadAccountQuotas();
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// Non-fatal — quota display is best-effort
|
|
254
|
+
}
|
|
255
|
+
if (argv.format === "json") {
|
|
256
|
+
// Merge quota data into each account object for JSON output
|
|
257
|
+
const withQuota = enrichedAccounts.map((acct) => {
|
|
258
|
+
const quotaKey = acct.label ?? acct.key;
|
|
259
|
+
const quota = quotas[quotaKey] ?? null;
|
|
260
|
+
return { ...acct, quota };
|
|
261
|
+
});
|
|
262
|
+
logger.always(JSON.stringify(withQuota, null, 2));
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
logger.always(chalk.bold("\nAuthenticated Accounts:\n"));
|
|
266
|
+
// Check if any account has quota data to decide column layout
|
|
267
|
+
const hasQuota = enrichedAccounts.some((acct) => {
|
|
268
|
+
const quotaKey = acct.label ?? acct.key;
|
|
269
|
+
return quotas[quotaKey] !== undefined;
|
|
270
|
+
});
|
|
271
|
+
// Table header
|
|
272
|
+
const colKey = "LABEL".padEnd(20);
|
|
273
|
+
const colEmail = "EMAIL".padEnd(28);
|
|
274
|
+
const colStatus = "TOKEN STATUS".padEnd(14);
|
|
275
|
+
const colProvider = "PROVIDER".padEnd(12);
|
|
276
|
+
const colSession = hasQuota ? "SESSION".padEnd(10) : "";
|
|
277
|
+
const colWeekly = hasQuota ? "WEEKLY".padEnd(10) : "";
|
|
278
|
+
logger.always(` ${chalk.gray(colKey)} ${chalk.gray(colProvider)} ${chalk.gray(colEmail)} ${chalk.gray(colStatus)}${hasQuota ? ` ${chalk.gray(colSession)} ${chalk.gray(colWeekly)}` : ""}`);
|
|
279
|
+
logger.always(` ${chalk.gray("-".repeat(hasQuota ? 100 : 78))}`);
|
|
280
|
+
for (const acct of enrichedAccounts) {
|
|
281
|
+
const displayLabel = (acct.label ?? acct.key).padEnd(20);
|
|
282
|
+
const displayEmail = (acct.email ?? "-").padEnd(28);
|
|
283
|
+
const displayProvider = acct.provider.padEnd(12);
|
|
284
|
+
let statusText;
|
|
285
|
+
if (acct.tokenStatus === "valid") {
|
|
286
|
+
statusText = chalk.green("valid".padEnd(14));
|
|
287
|
+
}
|
|
288
|
+
else if (acct.tokenStatus === "expired") {
|
|
289
|
+
statusText = chalk.red("expired".padEnd(14));
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
statusText = chalk.yellow("unknown".padEnd(14));
|
|
293
|
+
}
|
|
294
|
+
const quotaKey = acct.label ?? acct.key;
|
|
295
|
+
const quota = quotas[quotaKey];
|
|
296
|
+
if (hasQuota && quota) {
|
|
297
|
+
const qc = formatQuotaColumns(quota);
|
|
298
|
+
logger.always(` ${chalk.cyan(displayLabel)} ${displayProvider} ${displayEmail} ${statusText} ${qc.sessionText.padEnd(10)} ${qc.weeklyText.padEnd(10)}`);
|
|
299
|
+
// Second line: reset times (indented under session/weekly columns)
|
|
300
|
+
if (qc.sessionReset || qc.weeklyReset) {
|
|
301
|
+
const indent = " ".repeat(2 + 20 + 1 + 12 + 1 + 28 + 1 + 14 + 1);
|
|
302
|
+
logger.always(`${indent}${(qc.sessionReset || "").padEnd(10)} ${qc.weeklyReset || ""}`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
logger.always(` ${chalk.cyan(displayLabel)} ${displayProvider} ${displayEmail} ${statusText}${hasQuota ? " - -" : ""}`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
logger.always("");
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
logger.error(chalk.red("Failed to list accounts:"));
|
|
314
|
+
logger.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
|
|
315
|
+
process.exit(1);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Handle the remove subcommand
|
|
320
|
+
* `neurolink auth remove <provider> --label <label>` or `neurolink auth remove <provider> --account <key>`
|
|
321
|
+
*
|
|
322
|
+
* Removes an authenticated account from the TokenStore.
|
|
323
|
+
* When neither --label nor --account is given, removes the default (unlabelled) account
|
|
324
|
+
* for the specified provider.
|
|
325
|
+
*/
|
|
326
|
+
export async function handleRemove(argv) {
|
|
327
|
+
try {
|
|
328
|
+
const provider = argv.provider?.toLowerCase() ?? "anthropic";
|
|
329
|
+
// Resolve the compound key from --account, --label, or provider default
|
|
330
|
+
let compoundKey;
|
|
331
|
+
if (argv.account) {
|
|
332
|
+
compoundKey = argv.account;
|
|
333
|
+
}
|
|
334
|
+
else if (argv.label) {
|
|
335
|
+
compoundKey = `${provider}:${argv.label}`;
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
// Remove the default (unlabelled) account for this provider
|
|
339
|
+
compoundKey = provider;
|
|
340
|
+
}
|
|
341
|
+
// Check if the account exists
|
|
342
|
+
const allKeys = await defaultTokenStore.listProviders();
|
|
343
|
+
if (!allKeys.includes(compoundKey)) {
|
|
344
|
+
logger.error(chalk.red(`Account not found: ${compoundKey}`));
|
|
345
|
+
logger.always(chalk.blue("\nRun 'neurolink auth list' to see all authenticated accounts.\n"));
|
|
346
|
+
process.exit(1);
|
|
347
|
+
}
|
|
348
|
+
await defaultTokenStore.clearTokens(compoundKey);
|
|
349
|
+
// Only remove the legacy credentials file for bare provider keys.
|
|
350
|
+
// Compound keys (e.g., "anthropic:alice") should not touch the shared
|
|
351
|
+
// legacy credentials file — it may belong to the default account.
|
|
352
|
+
if (!compoundKey.includes(":")) {
|
|
353
|
+
const legacyCredFile = path.join(NEUROLINK_CONFIG_DIR, `${compoundKey}-credentials.json`);
|
|
354
|
+
try {
|
|
355
|
+
if (fs.existsSync(legacyCredFile)) {
|
|
356
|
+
fs.unlinkSync(legacyCredFile);
|
|
357
|
+
logger.debug(`Removed legacy credentials file: ${legacyCredFile}`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
// Non-fatal — legacy file may not exist or may already be gone
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
logger.always(chalk.green(`\nAccount removed: ${compoundKey}\n`));
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
logger.error(chalk.red("Failed to remove account:"));
|
|
368
|
+
logger.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
|
|
369
|
+
process.exit(1);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
100
372
|
/**
|
|
101
373
|
* Handle the logout subcommand
|
|
102
374
|
* `neurolink auth logout <provider>`
|
|
@@ -127,12 +399,25 @@ export async function handleLogout(argv) {
|
|
|
127
399
|
spinner.info("No stored credentials found");
|
|
128
400
|
}
|
|
129
401
|
}
|
|
130
|
-
// Also clear from TokenStore
|
|
402
|
+
// Also clear from TokenStore — both the bare provider key and all
|
|
403
|
+
// compound-key entries (provider:label) used by the account pool.
|
|
131
404
|
try {
|
|
132
405
|
await defaultTokenStore.clearTokens(provider);
|
|
133
406
|
}
|
|
134
407
|
catch {
|
|
135
|
-
// Ignore if no tokens stored
|
|
408
|
+
// Ignore if no tokens stored for bare key
|
|
409
|
+
}
|
|
410
|
+
try {
|
|
411
|
+
const allKeys = await defaultTokenStore.listProviders();
|
|
412
|
+
for (const k of allKeys) {
|
|
413
|
+
if (k.startsWith(`${provider}:`)) {
|
|
414
|
+
await defaultTokenStore.clearTokens(k);
|
|
415
|
+
logger.debug(`Cleared pooled account: ${k}`);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
// Ignore if listing/clearing fails
|
|
136
421
|
}
|
|
137
422
|
// Check for environment variable
|
|
138
423
|
const envVar = getEnvVarName(provider);
|
|
@@ -310,6 +595,30 @@ export async function handleRefresh(argv) {
|
|
|
310
595
|
createdAt: credentials.createdAt,
|
|
311
596
|
updatedAt: Date.now(),
|
|
312
597
|
});
|
|
598
|
+
// Also update the TokenStore pool entries for this provider.
|
|
599
|
+
// Update both the bare provider key and compound "provider:label" keys
|
|
600
|
+
// so that pooled accounts created via saveAccountToPool() stay current.
|
|
601
|
+
try {
|
|
602
|
+
const allKeys = await defaultTokenStore.listProviders();
|
|
603
|
+
for (const key of allKeys) {
|
|
604
|
+
if (key === provider || key.startsWith(`${provider}:`)) {
|
|
605
|
+
const existingTokens = await defaultTokenStore.loadTokens(key);
|
|
606
|
+
if (existingTokens) {
|
|
607
|
+
await defaultTokenStore.saveTokens(key, {
|
|
608
|
+
accessToken: newTokens.accessToken,
|
|
609
|
+
refreshToken: newTokens.refreshToken,
|
|
610
|
+
expiresAt: newTokens.expiresAt ?? Date.now() + 3600 * 1000,
|
|
611
|
+
tokenType: newTokens.tokenType || "Bearer",
|
|
612
|
+
scope: existingTokens.scope, // preserve existing scope metadata
|
|
613
|
+
});
|
|
614
|
+
logger.debug(`Updated TokenStore entry: ${key}`);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
catch (poolErr) {
|
|
620
|
+
logger.debug(`[auth] Failed to update TokenStore pool entries: ${poolErr instanceof Error ? poolErr.message : String(poolErr)}`);
|
|
621
|
+
}
|
|
313
622
|
if (spinner) {
|
|
314
623
|
spinner.succeed("Access token refreshed successfully!");
|
|
315
624
|
}
|
|
@@ -332,6 +641,103 @@ export async function handleRefresh(argv) {
|
|
|
332
641
|
process.exit(1);
|
|
333
642
|
}
|
|
334
643
|
}
|
|
644
|
+
/**
|
|
645
|
+
* Handle the cleanup subcommand
|
|
646
|
+
* `neurolink auth cleanup [--force]`
|
|
647
|
+
*
|
|
648
|
+
* Removes stale accounts from the token store:
|
|
649
|
+
* 1. Expired entries with no refresh token (via pruneExpired)
|
|
650
|
+
* 2. Permanently disabled entries (after confirmation)
|
|
651
|
+
*/
|
|
652
|
+
export async function handleCleanup(argv) {
|
|
653
|
+
try {
|
|
654
|
+
const removed = [];
|
|
655
|
+
// Step 1: Prune expired entries that have no refresh token
|
|
656
|
+
const pruned = await defaultTokenStore.pruneExpired();
|
|
657
|
+
for (const key of pruned) {
|
|
658
|
+
removed.push({ key, reason: "expired, no refresh token" });
|
|
659
|
+
}
|
|
660
|
+
// Step 2: Find disabled entries (pruneExpired already removes disabled
|
|
661
|
+
// entries, but in case the user runs cleanup with entries that were
|
|
662
|
+
// disabled between the prune call and now, check again)
|
|
663
|
+
const disabledKeys = await defaultTokenStore.listDisabled();
|
|
664
|
+
if (disabledKeys.length > 0) {
|
|
665
|
+
let shouldRemove = false;
|
|
666
|
+
if (argv.force || argv.nonInteractive) {
|
|
667
|
+
shouldRemove = true;
|
|
668
|
+
}
|
|
669
|
+
else {
|
|
670
|
+
logger.always(chalk.yellow(`\nFound ${disabledKeys.length} disabled account(s):`));
|
|
671
|
+
for (const key of disabledKeys) {
|
|
672
|
+
logger.always(` - ${key}`);
|
|
673
|
+
}
|
|
674
|
+
const { confirm } = await inquirer.prompt([
|
|
675
|
+
{
|
|
676
|
+
name: "confirm",
|
|
677
|
+
type: "confirm",
|
|
678
|
+
message: "Remove these disabled accounts?",
|
|
679
|
+
default: false,
|
|
680
|
+
},
|
|
681
|
+
]);
|
|
682
|
+
shouldRemove = confirm;
|
|
683
|
+
}
|
|
684
|
+
if (shouldRemove) {
|
|
685
|
+
for (const key of disabledKeys) {
|
|
686
|
+
await defaultTokenStore.clearTokens(key);
|
|
687
|
+
removed.push({ key, reason: "disabled: refresh_failed" });
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
// Report results
|
|
692
|
+
if (removed.length === 0) {
|
|
693
|
+
logger.always(chalk.green("No stale accounts found."));
|
|
694
|
+
}
|
|
695
|
+
else {
|
|
696
|
+
logger.always(chalk.green(`\nCleaned up ${removed.length} stale account${removed.length === 1 ? "" : "s"}:`));
|
|
697
|
+
for (const entry of removed) {
|
|
698
|
+
logger.always(` - ${entry.key} (${entry.reason})`);
|
|
699
|
+
}
|
|
700
|
+
logger.always("");
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
catch (error) {
|
|
704
|
+
logger.error(chalk.red("Cleanup failed:"));
|
|
705
|
+
logger.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
|
|
706
|
+
process.exit(1);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
/**
|
|
710
|
+
* Handle the enable subcommand
|
|
711
|
+
* `neurolink auth enable <account>`
|
|
712
|
+
*
|
|
713
|
+
* Re-enables a previously disabled account so it can be used by the proxy pool again.
|
|
714
|
+
*/
|
|
715
|
+
export async function handleEnable(argv) {
|
|
716
|
+
try {
|
|
717
|
+
// Resolve account key from --account option or positional arg
|
|
718
|
+
const accountKey = argv.account || (argv._ && argv._[2] ? String(argv._[2]) : undefined);
|
|
719
|
+
if (!accountKey) {
|
|
720
|
+
logger.error(chalk.red("Missing required argument: <account>"));
|
|
721
|
+
logger.always(chalk.blue("\nUsage: neurolink auth enable <account>\n" +
|
|
722
|
+
"Run 'neurolink auth list' to see all accounts.\n"));
|
|
723
|
+
process.exit(1);
|
|
724
|
+
}
|
|
725
|
+
// Check if account exists in the token store
|
|
726
|
+
const allKeys = await defaultTokenStore.listProviders();
|
|
727
|
+
if (!allKeys.includes(accountKey)) {
|
|
728
|
+
logger.error(chalk.red(`Account not found: ${accountKey}`));
|
|
729
|
+
logger.always(chalk.blue("\nRun 'neurolink auth list' to see all authenticated accounts.\n"));
|
|
730
|
+
process.exit(1);
|
|
731
|
+
}
|
|
732
|
+
await defaultTokenStore.markEnabled(accountKey);
|
|
733
|
+
logger.always(chalk.green(`\nRe-enabled account: ${accountKey}\n`));
|
|
734
|
+
}
|
|
735
|
+
catch (error) {
|
|
736
|
+
logger.error(chalk.red("Failed to enable account:"));
|
|
737
|
+
logger.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
|
|
738
|
+
process.exit(1);
|
|
739
|
+
}
|
|
740
|
+
}
|
|
335
741
|
// =============================================================================
|
|
336
742
|
// LEGACY HANDLER (for backward compatibility)
|
|
337
743
|
// =============================================================================
|
|
@@ -394,7 +800,7 @@ async function handleInteractiveAuth(provider) {
|
|
|
394
800
|
]);
|
|
395
801
|
if (!reconfigure) {
|
|
396
802
|
logger.always(chalk.blue("Keeping existing configuration."));
|
|
397
|
-
return;
|
|
803
|
+
return false;
|
|
398
804
|
}
|
|
399
805
|
}
|
|
400
806
|
// Show authentication method options
|
|
@@ -420,13 +826,15 @@ async function handleInteractiveAuth(provider) {
|
|
|
420
826
|
},
|
|
421
827
|
]);
|
|
422
828
|
if (method === "api-key") {
|
|
423
|
-
await handleApiKeyAuth(provider, true);
|
|
829
|
+
return await handleApiKeyAuth(provider, true);
|
|
424
830
|
}
|
|
425
831
|
else if (method === "create-api-key") {
|
|
426
832
|
await handleCreateApiKeyOAuth(provider);
|
|
833
|
+
return true;
|
|
427
834
|
}
|
|
428
835
|
else {
|
|
429
836
|
await handleOAuthAuth(provider);
|
|
837
|
+
return true;
|
|
430
838
|
}
|
|
431
839
|
}
|
|
432
840
|
/**
|
|
@@ -453,7 +861,7 @@ async function handleApiKeyAuth(provider, interactive) {
|
|
|
453
861
|
updatedAt: Date.now(),
|
|
454
862
|
});
|
|
455
863
|
logger.always(chalk.green("Using ANTHROPIC_API_KEY from environment."));
|
|
456
|
-
return;
|
|
864
|
+
return true;
|
|
457
865
|
}
|
|
458
866
|
throw new Error("Non-interactive mode requires ANTHROPIC_API_KEY environment variable when using --method api-key");
|
|
459
867
|
}
|
|
@@ -483,15 +891,15 @@ async function handleApiKeyAuth(provider, interactive) {
|
|
|
483
891
|
const isValid = await validateApiKey(provider, trimmedKey);
|
|
484
892
|
if (!isValid) {
|
|
485
893
|
spinner.fail("API key validation failed");
|
|
486
|
-
|
|
487
|
-
return;
|
|
894
|
+
throw new Error("The API key could not be validated. Please check and try again.");
|
|
488
895
|
}
|
|
489
896
|
spinner.succeed("API key validated successfully");
|
|
490
897
|
}
|
|
491
898
|
catch (error) {
|
|
492
899
|
spinner.fail("API key validation failed");
|
|
493
|
-
|
|
494
|
-
|
|
900
|
+
throw error instanceof Error
|
|
901
|
+
? error
|
|
902
|
+
: new Error(String(error) || "Validation error");
|
|
495
903
|
}
|
|
496
904
|
// Ask where to store the key
|
|
497
905
|
const { storageOption } = await inquirer.prompt([
|
|
@@ -524,6 +932,8 @@ async function handleApiKeyAuth(provider, interactive) {
|
|
|
524
932
|
logger.always("");
|
|
525
933
|
logger.always(chalk.green("Authentication configured successfully!"));
|
|
526
934
|
showUsageExample(provider);
|
|
935
|
+
// Credentials file was written only if user chose "config" or "both"
|
|
936
|
+
return storageOption === "config" || storageOption === "both";
|
|
527
937
|
}
|
|
528
938
|
catch (error) {
|
|
529
939
|
spinnerSave.fail("Failed to save API key");
|
|
@@ -690,7 +1100,9 @@ async function handleCreateApiKeyOAuth(provider) {
|
|
|
690
1100
|
if (error instanceof Error) {
|
|
691
1101
|
throw error;
|
|
692
1102
|
}
|
|
693
|
-
throw new Error(`Failed to create API key: ${String(error)}
|
|
1103
|
+
throw new Error(`Failed to create API key: ${String(error)}`, {
|
|
1104
|
+
cause: error,
|
|
1105
|
+
});
|
|
694
1106
|
}
|
|
695
1107
|
}
|
|
696
1108
|
/**
|
|
@@ -706,18 +1118,6 @@ async function handleOAuthAuth(provider) {
|
|
|
706
1118
|
logger.always(chalk.yellow("Note: After signing in, you'll see an authorization code."));
|
|
707
1119
|
logger.always(chalk.yellow("Copy that code and paste it back here.\n"));
|
|
708
1120
|
}
|
|
709
|
-
const { proceed } = await inquirer.prompt([
|
|
710
|
-
{
|
|
711
|
-
type: "confirm",
|
|
712
|
-
name: "proceed",
|
|
713
|
-
message: "Continue with OAuth authentication?",
|
|
714
|
-
default: true,
|
|
715
|
-
},
|
|
716
|
-
]);
|
|
717
|
-
if (!proceed) {
|
|
718
|
-
logger.always(chalk.yellow("OAuth authentication cancelled."));
|
|
719
|
-
return;
|
|
720
|
-
}
|
|
721
1121
|
const spinner = ora("Starting OAuth flow...").start();
|
|
722
1122
|
// Generate PKCE challenge - state = verifier (OpenCode's approach)
|
|
723
1123
|
const codeVerifier = randomBytes(32).toString("base64url");
|
|
@@ -817,13 +1217,45 @@ async function handleOAuthAuth(provider) {
|
|
|
817
1217
|
tokenType: tokenData.token_type || "Bearer",
|
|
818
1218
|
scope: tokenData.scope,
|
|
819
1219
|
};
|
|
820
|
-
//
|
|
821
|
-
|
|
1220
|
+
// === Triple fallback chain for email & subscription tier ===
|
|
1221
|
+
// Primary: extract email from token exchange response
|
|
1222
|
+
let email = tokenData.account?.email_address;
|
|
1223
|
+
let subscriptionTier;
|
|
1224
|
+
// Fallback 1: validation endpoint (/v1/oauth/validate)
|
|
1225
|
+
// Always try when email OR tier is missing — token exchange gives email but not tier
|
|
1226
|
+
if (!email || !subscriptionTier) {
|
|
1227
|
+
try {
|
|
1228
|
+
const { AnthropicOAuth } = await import("../../lib/auth/anthropicOAuth.js");
|
|
1229
|
+
const oauth = new AnthropicOAuth();
|
|
1230
|
+
const validationResult = await oauth.validateTokenWithDetails(tokens.accessToken);
|
|
1231
|
+
if (validationResult.user) {
|
|
1232
|
+
email = email || validationResult.user.email;
|
|
1233
|
+
if (validationResult.user.subscription) {
|
|
1234
|
+
subscriptionTier = validationResult.user
|
|
1235
|
+
.subscription;
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
catch {
|
|
1240
|
+
/* non-fatal — validation is best-effort */
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
// Fallback 2: /v1/me endpoint (also detects subscription tier)
|
|
1244
|
+
if (!subscriptionTier || !email) {
|
|
1245
|
+
const meResult = await detectSubscriptionTierAndEmail(tokens.accessToken);
|
|
1246
|
+
if (!subscriptionTier && meResult.tier) {
|
|
1247
|
+
subscriptionTier = meResult.tier;
|
|
1248
|
+
}
|
|
1249
|
+
if (!email && meResult.email) {
|
|
1250
|
+
email = meResult.email;
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
822
1253
|
await saveStoredCredentials(provider, {
|
|
823
1254
|
type: "oauth",
|
|
824
1255
|
oauth: tokens,
|
|
825
1256
|
provider,
|
|
826
1257
|
subscriptionTier,
|
|
1258
|
+
email,
|
|
827
1259
|
createdAt: Date.now(),
|
|
828
1260
|
updatedAt: Date.now(),
|
|
829
1261
|
});
|
|
@@ -833,6 +1265,9 @@ async function handleOAuthAuth(provider) {
|
|
|
833
1265
|
logger.always(chalk.green.bold(" Authentication configured successfully!"));
|
|
834
1266
|
logger.always(chalk.green("═".repeat(60)));
|
|
835
1267
|
logger.always("");
|
|
1268
|
+
if (email) {
|
|
1269
|
+
logger.always(` Email: ${chalk.blue(email)}`);
|
|
1270
|
+
}
|
|
836
1271
|
if (subscriptionTier) {
|
|
837
1272
|
logger.always(` Subscription Tier: ${chalk.blue(subscriptionTier)}`);
|
|
838
1273
|
}
|
|
@@ -841,6 +1276,117 @@ async function handleOAuthAuth(provider) {
|
|
|
841
1276
|
showUsageExample(provider);
|
|
842
1277
|
}
|
|
843
1278
|
// =============================================================================
|
|
1279
|
+
// MULTI-ACCOUNT HELPERS
|
|
1280
|
+
// =============================================================================
|
|
1281
|
+
/**
|
|
1282
|
+
* Save the most recently authenticated credentials to the TokenStore
|
|
1283
|
+
* using a compound key (e.g., "anthropic:alice") for multi-account pools.
|
|
1284
|
+
*
|
|
1285
|
+
* Reads back the credentials file that was just written by the auth flow,
|
|
1286
|
+
* then saves the tokens into the TokenStore under the compound key.
|
|
1287
|
+
*/
|
|
1288
|
+
async function saveAccountToPool(provider, label) {
|
|
1289
|
+
const credentials = await getStoredCredentials(provider);
|
|
1290
|
+
if (!credentials) {
|
|
1291
|
+
logger.error(chalk.red("Could not read back credentials after authentication. Multi-account save skipped."));
|
|
1292
|
+
return;
|
|
1293
|
+
}
|
|
1294
|
+
// Determine the compound key
|
|
1295
|
+
// Use email as the label when available (human-readable, unique per account)
|
|
1296
|
+
const credEmail = credentials.email;
|
|
1297
|
+
let compoundKey;
|
|
1298
|
+
if (label) {
|
|
1299
|
+
compoundKey = `${provider}:${label}`;
|
|
1300
|
+
}
|
|
1301
|
+
else {
|
|
1302
|
+
const autoLabel = credEmail ?? Date.now().toString(36).slice(-6);
|
|
1303
|
+
compoundKey = `${provider}:${autoLabel}`;
|
|
1304
|
+
}
|
|
1305
|
+
// Decision 10A: Auto-prune stale token-prefix entries when email is known.
|
|
1306
|
+
// When we have a real email, remove old entries whose stored token value is
|
|
1307
|
+
// identical to the one we are about to save. This avoids false positives on
|
|
1308
|
+
// legitimate user labels like "primary", "work123", or "office42" that the old
|
|
1309
|
+
// broad regex (^[A-Za-z0-9_]{5,8}$) would incorrectly match.
|
|
1310
|
+
if (credEmail) {
|
|
1311
|
+
const newAccessToken = credentials.type === "oauth"
|
|
1312
|
+
? credentials.oauth?.accessToken
|
|
1313
|
+
: credentials.apiKey;
|
|
1314
|
+
try {
|
|
1315
|
+
const allKeys = await defaultTokenStore.listProviders();
|
|
1316
|
+
for (const k of allKeys) {
|
|
1317
|
+
if (!k.startsWith(`${provider}:`)) {
|
|
1318
|
+
continue;
|
|
1319
|
+
}
|
|
1320
|
+
const existingLabel = k.split(":").slice(1).join(":");
|
|
1321
|
+
// Skip the email key we are about to write
|
|
1322
|
+
if (existingLabel === credEmail) {
|
|
1323
|
+
continue;
|
|
1324
|
+
}
|
|
1325
|
+
// Skip the explicit user label we are about to write
|
|
1326
|
+
if (label && existingLabel === label) {
|
|
1327
|
+
continue;
|
|
1328
|
+
}
|
|
1329
|
+
// Only prune when the stored token value is identical (true duplicate)
|
|
1330
|
+
if (newAccessToken) {
|
|
1331
|
+
try {
|
|
1332
|
+
const existingTokens = await defaultTokenStore.loadTokens(k);
|
|
1333
|
+
if (existingTokens &&
|
|
1334
|
+
existingTokens.accessToken === newAccessToken) {
|
|
1335
|
+
logger.debug(`Auto-pruning duplicate token entry: ${k}`);
|
|
1336
|
+
await defaultTokenStore.clearTokens(k);
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
catch {
|
|
1340
|
+
// Non-fatal — skip entries we can't read
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
catch {
|
|
1346
|
+
// Non-fatal — dedup is best-effort
|
|
1347
|
+
logger.debug("Failed to auto-prune stale entries during login");
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
// Build per-account metadata scope string so email/tier are stored
|
|
1351
|
+
// alongside the token rather than in the shared credentials file.
|
|
1352
|
+
const metaParts = [];
|
|
1353
|
+
if (credentials.subscriptionTier) {
|
|
1354
|
+
metaParts.push(`tier:${credentials.subscriptionTier}`);
|
|
1355
|
+
}
|
|
1356
|
+
if (credentials.email) {
|
|
1357
|
+
metaParts.push(`email:${credentials.email}`);
|
|
1358
|
+
}
|
|
1359
|
+
// Build StoredOAuthTokens for the TokenStore
|
|
1360
|
+
if (credentials.type === "oauth" && credentials.oauth) {
|
|
1361
|
+
const baseScope = credentials.oauth.scope ?? "";
|
|
1362
|
+
const scopeWithMeta = [baseScope, ...metaParts].filter(Boolean).join(" ");
|
|
1363
|
+
await defaultTokenStore.saveTokens(compoundKey, {
|
|
1364
|
+
accessToken: credentials.oauth.accessToken,
|
|
1365
|
+
refreshToken: credentials.oauth.refreshToken,
|
|
1366
|
+
expiresAt: credentials.oauth.expiresAt ?? Date.now() + 3600 * 1000,
|
|
1367
|
+
tokenType: credentials.oauth.tokenType || "Bearer",
|
|
1368
|
+
scope: scopeWithMeta || undefined,
|
|
1369
|
+
});
|
|
1370
|
+
}
|
|
1371
|
+
else if (credentials.type === "api-key" && credentials.apiKey) {
|
|
1372
|
+
// For API keys, store as a non-expiring token in the TokenStore.
|
|
1373
|
+
// Use Number.MAX_SAFE_INTEGER so isTokenExpired() and pruneExpired()
|
|
1374
|
+
// never treat a perfectly valid API key as expired.
|
|
1375
|
+
const scopeWithMeta = metaParts.join(" ") || undefined;
|
|
1376
|
+
await defaultTokenStore.saveTokens(compoundKey, {
|
|
1377
|
+
accessToken: credentials.apiKey,
|
|
1378
|
+
expiresAt: Number.MAX_SAFE_INTEGER,
|
|
1379
|
+
tokenType: "api-key",
|
|
1380
|
+
scope: scopeWithMeta,
|
|
1381
|
+
});
|
|
1382
|
+
}
|
|
1383
|
+
else {
|
|
1384
|
+
logger.error(chalk.red("No valid credentials found. Multi-account save skipped."));
|
|
1385
|
+
return;
|
|
1386
|
+
}
|
|
1387
|
+
logger.always(chalk.green(`\nAccount added: ${compoundKey}\n`));
|
|
1388
|
+
}
|
|
1389
|
+
// =============================================================================
|
|
844
1390
|
// HELPER FUNCTIONS
|
|
845
1391
|
// =============================================================================
|
|
846
1392
|
/**
|
|
@@ -885,29 +1431,32 @@ async function getAuthStatus(provider) {
|
|
|
885
1431
|
return result;
|
|
886
1432
|
}
|
|
887
1433
|
/**
|
|
888
|
-
* Detect subscription tier
|
|
1434
|
+
* Detect subscription tier and email from /v1/me endpoint.
|
|
1435
|
+
* Returns both tier and email when available (used as fallback 2 in the
|
|
1436
|
+
* triple fallback chain for email resolution).
|
|
889
1437
|
*/
|
|
890
|
-
async function
|
|
1438
|
+
async function detectSubscriptionTierAndEmail(accessToken) {
|
|
891
1439
|
try {
|
|
892
|
-
// Attempt to call an endpoint that returns user info
|
|
893
|
-
// This is a placeholder - actual implementation depends on Anthropic's API
|
|
894
1440
|
const response = await fetch("https://api.anthropic.com/v1/me", {
|
|
895
1441
|
headers: {
|
|
896
1442
|
Authorization: `Bearer ${accessToken}`,
|
|
897
1443
|
"Content-Type": "application/json",
|
|
1444
|
+
"User-Agent": "claude-cli/2.1.80 (external, cli)",
|
|
1445
|
+
"anthropic-version": "2023-06-01",
|
|
898
1446
|
},
|
|
899
1447
|
});
|
|
900
1448
|
if (response.ok) {
|
|
901
1449
|
const data = (await response.json());
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
1450
|
+
return {
|
|
1451
|
+
tier: data.subscription,
|
|
1452
|
+
email: data.email || data.email_address,
|
|
1453
|
+
};
|
|
905
1454
|
}
|
|
906
1455
|
}
|
|
907
1456
|
catch {
|
|
908
|
-
// Ignore errors - subscription detection is optional
|
|
1457
|
+
// Ignore errors - subscription/email detection is optional
|
|
909
1458
|
}
|
|
910
|
-
return
|
|
1459
|
+
return {};
|
|
911
1460
|
}
|
|
912
1461
|
/**
|
|
913
1462
|
* Open URL in the default browser (cross-platform)
|