@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.
Files changed (977) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +2 -3
  3. package/dist/adapters/providerImageAdapter.js +13 -22
  4. package/dist/adapters/video/videoAnalyzer.d.ts +4 -4
  5. package/dist/adapters/video/videoAnalyzer.js +3 -3
  6. package/dist/agent/directTools.d.ts +20 -289
  7. package/dist/agent/directTools.js +11 -10
  8. package/dist/auth/accountPool.d.ts +68 -0
  9. package/dist/auth/accountPool.js +178 -0
  10. package/dist/auth/anthropicOAuth.d.ts +15 -5
  11. package/dist/auth/anthropicOAuth.js +117 -57
  12. package/dist/auth/index.d.ts +7 -5
  13. package/dist/auth/index.js +6 -2
  14. package/dist/auth/tokenStore.d.ts +71 -27
  15. package/dist/auth/tokenStore.js +342 -64
  16. package/dist/cli/commands/auth.d.ts +39 -2
  17. package/dist/cli/commands/auth.js +585 -36
  18. package/dist/cli/commands/config.d.ts +47 -574
  19. package/dist/cli/commands/config.js +142 -24
  20. package/dist/cli/commands/docs.d.ts +1 -5
  21. package/dist/cli/commands/observability.d.ts +1 -17
  22. package/dist/cli/commands/ollama.js +1 -1
  23. package/dist/cli/commands/proxy.d.ts +20 -0
  24. package/dist/cli/commands/proxy.js +1254 -0
  25. package/dist/cli/commands/setup-anthropic.js +1 -1
  26. package/dist/cli/commands/setup-azure.js +1 -1
  27. package/dist/cli/commands/setup-bedrock.js +2 -2
  28. package/dist/cli/commands/setup-gcp.js +1 -1
  29. package/dist/cli/commands/setup-google-ai.js +1 -1
  30. package/dist/cli/commands/setup-huggingface.js +2 -2
  31. package/dist/cli/commands/setup-mistral.js +1 -1
  32. package/dist/cli/commands/setup-openai.js +1 -1
  33. package/dist/cli/commands/setup.js +3 -3
  34. package/dist/cli/commands/telemetry.d.ts +1 -22
  35. package/dist/cli/factories/authCommandFactory.d.ts +16 -11
  36. package/dist/cli/factories/authCommandFactory.js +96 -1
  37. package/dist/cli/factories/ollamaCommandFactory.js +1 -1
  38. package/dist/cli/factories/sagemakerCommandFactory.js +25 -6
  39. package/dist/cli/index.d.ts +0 -6
  40. package/dist/cli/index.js +5 -2
  41. package/dist/cli/loop/conversationSelector.js +7 -2
  42. package/dist/cli/parser.js +19 -1
  43. package/dist/cli/utils/envManager.js +2 -2
  44. package/dist/cli/utils/ollamaUtils.d.ts +1 -2
  45. package/dist/client/adapters/providerImageAdapter.js +588 -0
  46. package/dist/client/adapters/tts/googleTTSHandler.js +344 -0
  47. package/dist/client/adapters/video/directorPipeline.js +516 -0
  48. package/dist/client/adapters/video/ffmpegAdapter.js +206 -0
  49. package/dist/client/adapters/video/frameExtractor.js +143 -0
  50. package/dist/client/adapters/video/vertexVideoHandler.js +763 -0
  51. package/dist/client/adapters/video/videoAnalyzer.js +238 -0
  52. package/dist/client/adapters/video/videoMerger.js +171 -0
  53. package/dist/client/agent/directTools.js +840 -0
  54. package/dist/client/aiSdkAdapter.d.ts +196 -0
  55. package/dist/client/aiSdkAdapter.js +487 -0
  56. package/dist/client/auth/anthropicOAuth.js +974 -0
  57. package/dist/client/auth/tokenStore.js +799 -0
  58. package/dist/client/auth.d.ts +248 -0
  59. package/dist/client/auth.js +473 -0
  60. package/dist/client/client/aiSdkAdapter.js +487 -0
  61. package/dist/client/client/auth.js +473 -0
  62. package/dist/client/client/errors.js +552 -0
  63. package/dist/client/client/httpClient.js +837 -0
  64. package/dist/client/client/index.js +172 -0
  65. package/dist/client/client/interceptors.js +601 -0
  66. package/dist/client/client/reactHooks.js +1159 -0
  67. package/dist/client/client/sseClient.js +545 -0
  68. package/dist/client/client/streamingClient.js +917 -0
  69. package/dist/client/client/wsClient.js +369 -0
  70. package/dist/client/config/configManager.js +303 -0
  71. package/dist/client/config/conversationMemory.js +86 -0
  72. package/dist/client/config/taskClassificationConfig.js +148 -0
  73. package/dist/client/constants/contextWindows.js +295 -0
  74. package/dist/client/constants/enums.js +853 -0
  75. package/dist/client/constants/index.js +207 -0
  76. package/dist/client/constants/performance.js +389 -0
  77. package/dist/client/constants/retry.js +266 -0
  78. package/dist/client/constants/timeouts.js +182 -0
  79. package/dist/client/constants/tokens.js +380 -0
  80. package/dist/client/constants/videoErrors.js +46 -0
  81. package/dist/client/context/budgetChecker.js +98 -0
  82. package/dist/client/context/contextCompactor.js +205 -0
  83. package/dist/client/context/emergencyTruncation.js +88 -0
  84. package/dist/client/context/errorDetection.js +171 -0
  85. package/dist/client/context/errors.js +21 -0
  86. package/dist/client/context/fileTokenBudget.js +127 -0
  87. package/dist/client/context/prompts/summarizationPrompt.js +117 -0
  88. package/dist/client/context/stages/fileReadDeduplicator.js +66 -0
  89. package/dist/client/context/stages/slidingWindowTruncator.js +190 -0
  90. package/dist/client/context/stages/structuredSummarizer.js +99 -0
  91. package/dist/client/context/stages/toolOutputPruner.js +52 -0
  92. package/dist/client/context/summarizationEngine.js +136 -0
  93. package/dist/client/context/toolOutputLimits.js +78 -0
  94. package/dist/client/context/toolPairRepair.js +66 -0
  95. package/dist/client/core/analytics.js +88 -0
  96. package/dist/client/core/baseProvider.js +1385 -0
  97. package/dist/client/core/constants.js +140 -0
  98. package/dist/client/core/conversationMemoryFactory.js +141 -0
  99. package/dist/client/core/conversationMemoryInitializer.js +128 -0
  100. package/dist/client/core/conversationMemoryManager.js +344 -0
  101. package/dist/client/core/dynamicModels.js +358 -0
  102. package/dist/client/core/evaluation.js +309 -0
  103. package/dist/client/core/evaluationProviders.js +248 -0
  104. package/dist/client/core/factory.js +412 -0
  105. package/dist/client/core/infrastructure/baseError.js +22 -0
  106. package/dist/client/core/infrastructure/baseFactory.js +54 -0
  107. package/dist/client/core/infrastructure/baseRegistry.js +49 -0
  108. package/dist/client/core/infrastructure/index.js +5 -0
  109. package/dist/client/core/infrastructure/retry.js +20 -0
  110. package/dist/client/core/infrastructure/typedEventEmitter.js +23 -0
  111. package/dist/client/core/modelConfiguration.js +851 -0
  112. package/dist/client/core/modules/GenerationHandler.js +588 -0
  113. package/dist/client/core/modules/MessageBuilder.js +273 -0
  114. package/dist/client/core/modules/StreamHandler.js +185 -0
  115. package/dist/client/core/modules/TelemetryHandler.js +203 -0
  116. package/dist/client/core/modules/ToolsManager.js +499 -0
  117. package/dist/client/core/modules/Utilities.js +331 -0
  118. package/dist/client/core/redisConversationMemoryManager.js +1435 -0
  119. package/dist/client/core/streamAnalytics.js +131 -0
  120. package/dist/client/errors.d.ts +299 -0
  121. package/dist/client/errors.js +552 -0
  122. package/dist/client/evaluation/contextBuilder.js +134 -0
  123. package/dist/client/evaluation/index.js +61 -0
  124. package/dist/client/evaluation/prompts.js +73 -0
  125. package/dist/client/evaluation/ragasEvaluator.js +110 -0
  126. package/dist/client/evaluation/retryManager.js +78 -0
  127. package/dist/client/evaluation/scoring.js +61 -0
  128. package/dist/client/factories/providerFactory.js +166 -0
  129. package/dist/client/factories/providerRegistry.js +166 -0
  130. package/dist/client/features/ppt/constants.js +896 -0
  131. package/dist/client/features/ppt/contentPlanner.js +529 -0
  132. package/dist/client/features/ppt/presentationOrchestrator.js +236 -0
  133. package/dist/client/features/ppt/slideGenerator.js +532 -0
  134. package/dist/client/features/ppt/slideRenderers.js +2383 -0
  135. package/dist/client/features/ppt/slideTypeInference.js +405 -0
  136. package/dist/client/features/ppt/types.js +13 -0
  137. package/dist/client/features/ppt/utils.js +443 -0
  138. package/dist/client/files/fileReferenceRegistry.js +1543 -0
  139. package/dist/client/files/fileTools.js +450 -0
  140. package/dist/client/files/streamingReader.js +321 -0
  141. package/dist/client/files/types.js +23 -0
  142. package/dist/client/hitl/hitlErrors.js +54 -0
  143. package/dist/client/hitl/hitlManager.js +460 -0
  144. package/dist/client/httpClient.d.ts +297 -0
  145. package/dist/client/httpClient.js +837 -0
  146. package/dist/client/index.d.ts +111 -0
  147. package/dist/client/index.js +511 -0
  148. package/dist/client/interceptors.d.ts +283 -0
  149. package/dist/client/interceptors.js +601 -0
  150. package/dist/client/mcp/agentExposure.js +356 -0
  151. package/dist/client/mcp/auth/index.js +11 -0
  152. package/dist/client/mcp/auth/oauthClientProvider.js +325 -0
  153. package/dist/client/mcp/auth/tokenStorage.js +134 -0
  154. package/dist/client/mcp/batching/index.js +10 -0
  155. package/dist/client/mcp/batching/requestBatcher.js +441 -0
  156. package/dist/client/mcp/caching/index.js +10 -0
  157. package/dist/client/mcp/caching/toolCache.js +433 -0
  158. package/dist/client/mcp/elicitation/elicitationManager.js +376 -0
  159. package/dist/client/mcp/elicitation/index.js +11 -0
  160. package/dist/client/mcp/elicitation/types.js +10 -0
  161. package/dist/client/mcp/elicitationProtocol.js +375 -0
  162. package/dist/client/mcp/enhancedToolDiscovery.js +481 -0
  163. package/dist/client/mcp/externalServerManager.js +1478 -0
  164. package/dist/client/mcp/factory.js +161 -0
  165. package/dist/client/mcp/flexibleToolValidator.js +161 -0
  166. package/dist/client/mcp/httpRateLimiter.js +391 -0
  167. package/dist/client/mcp/httpRetryHandler.js +178 -0
  168. package/dist/client/mcp/index.js +74 -0
  169. package/dist/client/mcp/mcpCircuitBreaker.js +427 -0
  170. package/dist/client/mcp/mcpClientFactory.js +708 -0
  171. package/dist/client/mcp/mcpRegistryClient.js +488 -0
  172. package/dist/client/mcp/mcpServerBase.js +373 -0
  173. package/dist/client/mcp/multiServerManager.js +579 -0
  174. package/dist/client/mcp/registry.js +158 -0
  175. package/dist/client/mcp/routing/index.js +10 -0
  176. package/dist/client/mcp/routing/toolRouter.js +416 -0
  177. package/dist/client/mcp/serverCapabilities.js +502 -0
  178. package/dist/client/mcp/servers/agent/directToolsServer.js +150 -0
  179. package/dist/client/mcp/toolAnnotations.js +239 -0
  180. package/dist/client/mcp/toolConverter.js +258 -0
  181. package/dist/client/mcp/toolDiscoveryService.js +798 -0
  182. package/dist/client/mcp/toolIntegration.js +334 -0
  183. package/dist/client/mcp/toolRegistry.js +719 -0
  184. package/dist/client/memory/hippocampusInitializer.js +19 -0
  185. package/dist/client/memory/memoryRetrievalTools.js +166 -0
  186. package/dist/client/middleware/builtin/analytics.js +132 -0
  187. package/dist/client/middleware/builtin/autoEvaluation.js +203 -0
  188. package/dist/client/middleware/builtin/guardrails.js +109 -0
  189. package/dist/client/middleware/builtin/lifecycle.js +168 -0
  190. package/dist/client/middleware/factory.js +327 -0
  191. package/dist/client/middleware/registry.js +295 -0
  192. package/dist/client/middleware/utils/guardrailsUtils.js +396 -0
  193. package/dist/client/models/anthropicModels.js +527 -0
  194. package/dist/client/neurolink.js +8015 -0
  195. package/dist/client/observability/exporterRegistry.js +413 -0
  196. package/dist/client/observability/exporters/arizeExporter.js +138 -0
  197. package/dist/client/observability/exporters/baseExporter.js +190 -0
  198. package/dist/client/observability/exporters/braintrustExporter.js +154 -0
  199. package/dist/client/observability/exporters/datadogExporter.js +196 -0
  200. package/dist/client/observability/exporters/laminarExporter.js +302 -0
  201. package/dist/client/observability/exporters/langfuseExporter.js +209 -0
  202. package/dist/client/observability/exporters/langsmithExporter.js +143 -0
  203. package/dist/client/observability/exporters/otelExporter.js +164 -0
  204. package/dist/client/observability/exporters/posthogExporter.js +287 -0
  205. package/dist/client/observability/exporters/sentryExporter.js +165 -0
  206. package/dist/client/observability/index.js +31 -0
  207. package/dist/client/observability/metricsAggregator.js +556 -0
  208. package/dist/client/observability/otelBridge.js +131 -0
  209. package/dist/client/observability/retryPolicy.js +383 -0
  210. package/dist/client/observability/sampling/samplers.js +216 -0
  211. package/dist/client/observability/spanProcessor.js +303 -0
  212. package/dist/client/observability/tokenTracker.js +413 -0
  213. package/dist/client/observability/types/exporterTypes.js +5 -0
  214. package/dist/client/observability/types/index.js +4 -0
  215. package/dist/client/observability/types/spanTypes.js +92 -0
  216. package/dist/client/observability/utils/safeMetadata.js +25 -0
  217. package/dist/client/observability/utils/spanSerializer.js +292 -0
  218. package/dist/client/processors/archive/ArchiveProcessor.js +1308 -0
  219. package/dist/client/processors/base/BaseFileProcessor.js +614 -0
  220. package/dist/client/processors/base/types.js +82 -0
  221. package/dist/client/processors/config/fileTypes.js +520 -0
  222. package/dist/client/processors/config/index.js +92 -0
  223. package/dist/client/processors/config/languageMap.js +410 -0
  224. package/dist/client/processors/config/mimeTypes.js +363 -0
  225. package/dist/client/processors/config/sizeLimits.js +258 -0
  226. package/dist/client/processors/document/ExcelProcessor.js +590 -0
  227. package/dist/client/processors/document/OpenDocumentProcessor.js +212 -0
  228. package/dist/client/processors/document/PptxProcessor.js +157 -0
  229. package/dist/client/processors/document/RtfProcessor.js +361 -0
  230. package/dist/client/processors/document/WordProcessor.js +353 -0
  231. package/dist/client/processors/errors/FileErrorCode.js +255 -0
  232. package/dist/client/processors/errors/errorHelpers.js +386 -0
  233. package/dist/client/processors/errors/errorSerializer.js +507 -0
  234. package/dist/client/processors/errors/index.js +49 -0
  235. package/dist/client/processors/markup/SvgProcessor.js +240 -0
  236. package/dist/client/processors/media/AudioProcessor.js +707 -0
  237. package/dist/client/processors/media/VideoProcessor.js +1045 -0
  238. package/dist/client/providers/amazonBedrock.js +1512 -0
  239. package/dist/client/providers/amazonSagemaker.js +162 -0
  240. package/dist/client/providers/anthropic.js +831 -0
  241. package/dist/client/providers/azureOpenai.js +143 -0
  242. package/dist/client/providers/googleAiStudio.js +1200 -0
  243. package/dist/client/providers/googleNativeGemini3.js +543 -0
  244. package/dist/client/providers/googleVertex.js +2936 -0
  245. package/dist/client/providers/huggingFace.js +315 -0
  246. package/dist/client/providers/litellm.js +488 -0
  247. package/dist/client/providers/mistral.js +157 -0
  248. package/dist/client/providers/ollama.js +1579 -0
  249. package/dist/client/providers/openAI.js +627 -0
  250. package/dist/client/providers/openRouter.js +543 -0
  251. package/dist/client/providers/openaiCompatible.js +290 -0
  252. package/dist/client/providers/providerTypeUtils.js +46 -0
  253. package/dist/client/providers/sagemaker/adaptive-semaphore.js +215 -0
  254. package/dist/client/providers/sagemaker/client.js +472 -0
  255. package/dist/client/providers/sagemaker/config.js +317 -0
  256. package/dist/client/providers/sagemaker/detection.js +606 -0
  257. package/dist/client/providers/sagemaker/error-constants.js +227 -0
  258. package/dist/client/providers/sagemaker/errors.js +299 -0
  259. package/dist/client/providers/sagemaker/language-model.js +775 -0
  260. package/dist/client/providers/sagemaker/parsers.js +634 -0
  261. package/dist/client/providers/sagemaker/streaming.js +331 -0
  262. package/dist/client/providers/sagemaker/structured-parser.js +625 -0
  263. package/dist/client/proxy/accountQuota.js +162 -0
  264. package/dist/client/proxy/claudeFormat.js +595 -0
  265. package/dist/client/proxy/modelRouter.js +29 -0
  266. package/dist/client/proxy/oauthFetch.js +367 -0
  267. package/dist/client/proxy/proxyFetch.js +586 -0
  268. package/dist/client/proxy/requestLogger.js +207 -0
  269. package/dist/client/proxy/tokenRefresh.js +124 -0
  270. package/dist/client/proxy/usageStats.js +74 -0
  271. package/dist/client/proxy/utils/noProxyUtils.js +149 -0
  272. package/dist/client/rag/ChunkerFactory.js +320 -0
  273. package/dist/client/rag/ChunkerRegistry.js +421 -0
  274. package/dist/client/rag/chunkers/BaseChunker.js +143 -0
  275. package/dist/client/rag/chunkers/CharacterChunker.js +28 -0
  276. package/dist/client/rag/chunkers/HTMLChunker.js +38 -0
  277. package/dist/client/rag/chunkers/JSONChunker.js +68 -0
  278. package/dist/client/rag/chunkers/LaTeXChunker.js +63 -0
  279. package/dist/client/rag/chunkers/MarkdownChunker.js +306 -0
  280. package/dist/client/rag/chunkers/RecursiveChunker.js +139 -0
  281. package/dist/client/rag/chunkers/SemanticMarkdownChunker.js +138 -0
  282. package/dist/client/rag/chunkers/SentenceChunker.js +66 -0
  283. package/dist/client/rag/chunkers/TokenChunker.js +61 -0
  284. package/dist/client/rag/chunkers/index.js +15 -0
  285. package/dist/client/rag/chunking/characterChunker.js +142 -0
  286. package/dist/client/rag/chunking/chunkerRegistry.js +194 -0
  287. package/dist/client/rag/chunking/htmlChunker.js +247 -0
  288. package/dist/client/rag/chunking/index.js +17 -0
  289. package/dist/client/rag/chunking/jsonChunker.js +281 -0
  290. package/dist/client/rag/chunking/latexChunker.js +251 -0
  291. package/dist/client/rag/chunking/markdownChunker.js +373 -0
  292. package/dist/client/rag/chunking/recursiveChunker.js +148 -0
  293. package/dist/client/rag/chunking/semanticChunker.js +306 -0
  294. package/dist/client/rag/chunking/sentenceChunker.js +230 -0
  295. package/dist/client/rag/chunking/tokenChunker.js +183 -0
  296. package/dist/client/rag/document/MDocument.js +392 -0
  297. package/dist/client/rag/document/index.js +5 -0
  298. package/dist/client/rag/document/loaders.js +500 -0
  299. package/dist/client/rag/errors/RAGError.js +274 -0
  300. package/dist/client/rag/errors/index.js +6 -0
  301. package/dist/client/rag/graphRag/graphRAG.js +401 -0
  302. package/dist/client/rag/graphRag/index.js +4 -0
  303. package/dist/client/rag/index.js +141 -0
  304. package/dist/client/rag/metadata/MetadataExtractorFactory.js +418 -0
  305. package/dist/client/rag/metadata/MetadataExtractorRegistry.js +362 -0
  306. package/dist/client/rag/metadata/index.js +9 -0
  307. package/dist/client/rag/metadata/metadataExtractor.js +280 -0
  308. package/dist/client/rag/pipeline/RAGPipeline.js +436 -0
  309. package/dist/client/rag/pipeline/contextAssembly.js +341 -0
  310. package/dist/client/rag/pipeline/index.js +5 -0
  311. package/dist/client/rag/ragIntegration.js +321 -0
  312. package/dist/client/rag/reranker/RerankerFactory.js +430 -0
  313. package/dist/client/rag/reranker/RerankerRegistry.js +402 -0
  314. package/dist/client/rag/reranker/index.js +9 -0
  315. package/dist/client/rag/reranker/reranker.js +277 -0
  316. package/dist/client/rag/resilience/CircuitBreaker.js +431 -0
  317. package/dist/client/rag/resilience/RetryHandler.js +304 -0
  318. package/dist/client/rag/resilience/index.js +7 -0
  319. package/dist/client/rag/retrieval/hybridSearch.js +335 -0
  320. package/dist/client/rag/retrieval/index.js +5 -0
  321. package/dist/client/rag/retrieval/vectorQueryTool.js +307 -0
  322. package/dist/client/rag/types.js +8 -0
  323. package/dist/client/reactHooks.d.ts +239 -0
  324. package/dist/client/reactHooks.tsx +1483 -0
  325. package/dist/client/sdk/toolRegistration.js +377 -0
  326. package/dist/client/server/abstract/baseServerAdapter.js +575 -0
  327. package/dist/client/server/adapters/expressAdapter.js +486 -0
  328. package/dist/client/server/adapters/fastifyAdapter.js +472 -0
  329. package/dist/client/server/adapters/honoAdapter.js +632 -0
  330. package/dist/client/server/adapters/koaAdapter.js +510 -0
  331. package/dist/client/server/errors.js +486 -0
  332. package/dist/client/server/factory/serverAdapterFactory.js +160 -0
  333. package/dist/client/server/index.js +108 -0
  334. package/dist/client/server/middleware/abortSignal.js +111 -0
  335. package/dist/client/server/middleware/auth.js +388 -0
  336. package/dist/client/server/middleware/cache.js +359 -0
  337. package/dist/client/server/middleware/common.js +281 -0
  338. package/dist/client/server/middleware/deprecation.js +190 -0
  339. package/dist/client/server/middleware/mcpBodyAttachment.js +63 -0
  340. package/dist/client/server/middleware/rateLimit.js +227 -0
  341. package/dist/client/server/middleware/validation.js +388 -0
  342. package/dist/client/server/openapi/generator.js +398 -0
  343. package/dist/client/server/openapi/index.js +36 -0
  344. package/dist/client/server/openapi/schemas.js +695 -0
  345. package/dist/client/server/openapi/templates.js +374 -0
  346. package/dist/client/server/routes/agentRoutes.js +171 -0
  347. package/dist/client/server/routes/claudeProxyRoutes.js +1600 -0
  348. package/dist/client/server/routes/healthRoutes.js +187 -0
  349. package/dist/client/server/routes/index.js +57 -0
  350. package/dist/client/server/routes/mcpRoutes.js +342 -0
  351. package/dist/client/server/routes/memoryRoutes.js +350 -0
  352. package/dist/client/server/routes/openApiRoutes.js +126 -0
  353. package/dist/client/server/routes/toolRoutes.js +199 -0
  354. package/dist/client/server/streaming/dataStream.js +486 -0
  355. package/dist/client/server/streaming/index.js +11 -0
  356. package/dist/client/server/types.js +67 -0
  357. package/dist/client/server/utils/redaction.js +334 -0
  358. package/dist/client/server/utils/validation.js +243 -0
  359. package/dist/client/server/websocket/WebSocketHandler.js +383 -0
  360. package/dist/client/server/websocket/index.js +4 -0
  361. package/dist/client/services/server/ai/observability/instrumentation.js +808 -0
  362. package/dist/client/sseClient.d.ts +156 -0
  363. package/dist/client/sseClient.js +545 -0
  364. package/dist/client/streamingClient.d.ts +327 -0
  365. package/dist/client/streamingClient.js +917 -0
  366. package/dist/client/telemetry/attributes.js +100 -0
  367. package/dist/client/telemetry/index.js +26 -0
  368. package/dist/client/telemetry/telemetryService.js +308 -0
  369. package/dist/client/telemetry/tracers.js +17 -0
  370. package/dist/client/telemetry/withSpan.js +34 -0
  371. package/dist/client/types/actionTypes.js +6 -0
  372. package/dist/client/types/analytics.js +5 -0
  373. package/dist/client/types/authTypes.js +8 -0
  374. package/dist/client/types/circuitBreakerErrors.js +34 -0
  375. package/dist/client/types/cli.js +21 -0
  376. package/dist/client/types/clientTypes.js +10 -0
  377. package/dist/client/types/common.js +51 -0
  378. package/dist/client/types/configTypes.js +49 -0
  379. package/dist/client/types/content.js +19 -0
  380. package/dist/client/types/contextTypes.js +400 -0
  381. package/dist/client/types/conversation.js +47 -0
  382. package/dist/client/types/conversationMemoryInterface.js +6 -0
  383. package/dist/client/types/domainTypes.js +5 -0
  384. package/dist/client/types/errors.js +167 -0
  385. package/dist/client/types/evaluation.js +5 -0
  386. package/dist/client/types/evaluationProviders.js +5 -0
  387. package/dist/client/types/evaluationTypes.js +1 -0
  388. package/dist/client/types/externalMcp.js +6 -0
  389. package/dist/client/types/fileReferenceTypes.js +8 -0
  390. package/dist/client/types/fileTypes.js +4 -0
  391. package/dist/client/types/generateTypes.js +1 -0
  392. package/dist/client/types/guardrails.js +1 -0
  393. package/dist/client/types/hitlTypes.js +8 -0
  394. package/dist/client/types/index.js +57 -0
  395. package/dist/client/types/mcpTypes.js +5 -0
  396. package/dist/client/types/middlewareTypes.js +1 -0
  397. package/dist/client/types/modelTypes.js +30 -0
  398. package/dist/client/types/multimodal.js +135 -0
  399. package/dist/client/types/observability.js +6 -0
  400. package/dist/client/types/pptTypes.js +82 -0
  401. package/dist/client/types/providers.js +111 -0
  402. package/dist/client/types/proxyTypes.js +16 -0
  403. package/dist/client/types/ragTypes.js +7 -0
  404. package/dist/client/types/sdkTypes.js +8 -0
  405. package/dist/client/types/serviceTypes.js +5 -0
  406. package/dist/client/types/streamTypes.js +1 -0
  407. package/dist/client/types/subscriptionTypes.js +9 -0
  408. package/dist/client/types/taskClassificationTypes.js +5 -0
  409. package/dist/client/types/tools.js +24 -0
  410. package/dist/client/types/ttsTypes.js +57 -0
  411. package/dist/client/types/typeAliases.js +48 -0
  412. package/dist/client/types/utilities.js +4 -0
  413. package/dist/client/types/workflowTypes.js +30 -0
  414. package/dist/client/utils/async/withTimeout.js +98 -0
  415. package/dist/client/utils/asyncMutex.js +60 -0
  416. package/dist/client/utils/conversationMemory.js +431 -0
  417. package/dist/client/utils/csvProcessor.js +846 -0
  418. package/dist/client/utils/errorHandling.js +936 -0
  419. package/dist/client/utils/evaluationUtils.js +131 -0
  420. package/dist/client/utils/factoryProcessing.js +589 -0
  421. package/dist/client/utils/fileDetector.js +2161 -0
  422. package/dist/client/utils/imageCache.js +376 -0
  423. package/dist/client/utils/imageProcessor.js +704 -0
  424. package/dist/client/utils/logger.js +491 -0
  425. package/dist/client/utils/mcpDefaults.js +134 -0
  426. package/dist/client/utils/messageBuilder.js +1653 -0
  427. package/dist/client/utils/modelAliasResolver.js +54 -0
  428. package/dist/client/utils/modelDetection.js +80 -0
  429. package/dist/client/utils/modelRouter.js +292 -0
  430. package/dist/client/utils/multimodalOptionsBuilder.js +65 -0
  431. package/dist/client/utils/observabilityHelpers.js +47 -0
  432. package/dist/client/utils/parameterValidation.js +966 -0
  433. package/dist/client/utils/pdfProcessor.js +410 -0
  434. package/dist/client/utils/performance.js +222 -0
  435. package/dist/client/utils/pricing.js +340 -0
  436. package/dist/client/utils/promptRedaction.js +62 -0
  437. package/dist/client/utils/providerConfig.js +1009 -0
  438. package/dist/client/utils/providerHealth.js +1237 -0
  439. package/dist/client/utils/providerRetry.js +112 -0
  440. package/dist/client/utils/providerUtils.js +434 -0
  441. package/dist/client/utils/rateLimiter.js +200 -0
  442. package/dist/client/utils/redis.js +368 -0
  443. package/dist/client/utils/retryHandler.js +269 -0
  444. package/dist/client/utils/retryability.js +22 -0
  445. package/dist/client/utils/sanitizers/svg.js +481 -0
  446. package/dist/client/utils/schemaConversion.js +255 -0
  447. package/dist/client/utils/taskClassificationUtils.js +149 -0
  448. package/dist/client/utils/taskClassifier.js +94 -0
  449. package/dist/client/utils/thinkingConfig.js +104 -0
  450. package/dist/client/utils/timeout.js +359 -0
  451. package/dist/client/utils/tokenEstimation.js +142 -0
  452. package/dist/client/utils/tokenLimits.js +125 -0
  453. package/dist/client/utils/tokenUtils.js +239 -0
  454. package/dist/client/utils/toolUtils.js +75 -0
  455. package/dist/client/utils/transformationUtils.js +554 -0
  456. package/dist/client/utils/ttsProcessor.js +286 -0
  457. package/dist/client/utils/typeUtils.js +97 -0
  458. package/dist/client/utils/videoAnalysisProcessor.js +67 -0
  459. package/dist/client/workflow/config.js +398 -0
  460. package/dist/client/workflow/core/ensembleExecutor.js +407 -0
  461. package/dist/client/workflow/core/judgeScorer.js +544 -0
  462. package/dist/client/workflow/core/responseConditioner.js +225 -0
  463. package/dist/client/workflow/core/types/conditionerTypes.js +7 -0
  464. package/dist/client/workflow/core/types/ensembleTypes.js +7 -0
  465. package/dist/client/workflow/core/types/index.js +7 -0
  466. package/dist/client/workflow/core/types/judgeTypes.js +7 -0
  467. package/dist/client/workflow/core/types/layerTypes.js +7 -0
  468. package/dist/client/workflow/core/types/registryTypes.js +7 -0
  469. package/dist/client/workflow/core/workflowRegistry.js +304 -0
  470. package/dist/client/workflow/core/workflowRunner.js +586 -0
  471. package/dist/client/workflow/index.js +50 -0
  472. package/dist/client/workflow/types.js +9 -0
  473. package/dist/client/workflow/utils/types/index.js +7 -0
  474. package/dist/client/workflow/utils/workflowMetrics.js +311 -0
  475. package/dist/client/workflow/utils/workflowValidation.js +420 -0
  476. package/dist/client/workflow/workflows/adaptiveWorkflow.js +366 -0
  477. package/dist/client/workflow/workflows/consensusWorkflow.js +192 -0
  478. package/dist/client/workflow/workflows/fallbackWorkflow.js +225 -0
  479. package/dist/client/workflow/workflows/multiJudgeWorkflow.js +351 -0
  480. package/dist/client/wsClient.d.ts +130 -0
  481. package/dist/client/wsClient.js +369 -0
  482. package/dist/config/configManager.js +2 -2
  483. package/dist/constants/contextWindows.js +15 -13
  484. package/dist/constants/enums.d.ts +10 -16
  485. package/dist/constants/enums.js +12 -18
  486. package/dist/constants/index.d.ts +0 -10
  487. package/dist/constants/index.js +1 -1
  488. package/dist/constants/tokens.d.ts +29 -16
  489. package/dist/constants/tokens.js +23 -16
  490. package/dist/core/baseProvider.d.ts +5 -5
  491. package/dist/core/baseProvider.js +6 -6
  492. package/dist/core/constants.js +6 -1
  493. package/dist/core/dynamicModels.js +10 -6
  494. package/dist/core/evaluationProviders.js +1 -1
  495. package/dist/core/infrastructure/baseError.d.ts +1 -1
  496. package/dist/core/infrastructure/baseFactory.d.ts +1 -6
  497. package/dist/core/infrastructure/baseRegistry.d.ts +6 -5
  498. package/dist/core/infrastructure/index.d.ts +6 -4
  499. package/dist/core/infrastructure/index.js +2 -2
  500. package/dist/core/modelConfiguration.js +3 -1
  501. package/dist/core/modules/GenerationHandler.d.ts +3 -3
  502. package/dist/core/modules/GenerationHandler.js +49 -41
  503. package/dist/core/modules/MessageBuilder.d.ts +5 -5
  504. package/dist/core/modules/MessageBuilder.js +4 -6
  505. package/dist/core/modules/StreamHandler.js +26 -12
  506. package/dist/core/modules/TelemetryHandler.d.ts +4 -6
  507. package/dist/core/modules/TelemetryHandler.js +7 -6
  508. package/dist/core/modules/ToolsManager.d.ts +2 -12
  509. package/dist/core/modules/ToolsManager.js +20 -4
  510. package/dist/core/modules/Utilities.js +3 -1
  511. package/dist/core/redisConversationMemoryManager.js +3 -3
  512. package/dist/core/streamAnalytics.js +23 -9
  513. package/dist/evaluation/contextBuilder.d.ts +2 -2
  514. package/dist/evaluation/contextBuilder.js +2 -2
  515. package/dist/evaluation/index.d.ts +2 -2
  516. package/dist/evaluation/retryManager.js +1 -1
  517. package/dist/factories/providerFactory.js +2 -2
  518. package/dist/features/ppt/constants.js +1 -1
  519. package/dist/features/ppt/presentationOrchestrator.js +7 -3
  520. package/dist/features/ppt/slideGenerator.d.ts +2 -1
  521. package/dist/features/ppt/slideGenerator.js +6 -1
  522. package/dist/files/fileTools.d.ts +16 -247
  523. package/dist/files/fileTools.js +16 -15
  524. package/dist/index.d.ts +5 -3
  525. package/dist/index.js +20 -3
  526. package/dist/lib/adapters/providerImageAdapter.js +13 -22
  527. package/dist/lib/adapters/video/videoAnalyzer.d.ts +4 -4
  528. package/dist/lib/adapters/video/videoAnalyzer.js +3 -3
  529. package/dist/lib/agent/directTools.d.ts +20 -289
  530. package/dist/lib/agent/directTools.js +11 -10
  531. package/dist/lib/auth/accountPool.d.ts +68 -0
  532. package/dist/lib/auth/accountPool.js +179 -0
  533. package/dist/lib/auth/anthropicOAuth.d.ts +15 -5
  534. package/dist/lib/auth/anthropicOAuth.js +117 -57
  535. package/dist/lib/auth/index.d.ts +7 -5
  536. package/dist/lib/auth/index.js +6 -2
  537. package/dist/lib/auth/tokenStore.d.ts +71 -27
  538. package/dist/lib/auth/tokenStore.js +342 -64
  539. package/dist/lib/client/aiSdkAdapter.d.ts +196 -0
  540. package/dist/lib/client/aiSdkAdapter.js +488 -0
  541. package/dist/lib/client/auth.d.ts +248 -0
  542. package/dist/lib/client/auth.js +474 -0
  543. package/dist/lib/client/errors.d.ts +299 -0
  544. package/dist/lib/client/errors.js +553 -0
  545. package/dist/lib/client/httpClient.d.ts +297 -0
  546. package/dist/lib/client/httpClient.js +838 -0
  547. package/dist/lib/client/index.d.ts +111 -0
  548. package/dist/lib/client/index.js +173 -0
  549. package/dist/lib/client/interceptors.d.ts +283 -0
  550. package/dist/lib/client/interceptors.js +602 -0
  551. package/dist/lib/client/reactHooks.d.ts +239 -0
  552. package/dist/lib/client/reactHooks.js +1160 -0
  553. package/dist/lib/client/sseClient.d.ts +156 -0
  554. package/dist/lib/client/sseClient.js +546 -0
  555. package/dist/lib/client/streamingClient.d.ts +327 -0
  556. package/dist/lib/client/streamingClient.js +918 -0
  557. package/dist/lib/client/wsClient.d.ts +130 -0
  558. package/dist/lib/client/wsClient.js +370 -0
  559. package/dist/lib/config/configManager.js +2 -2
  560. package/dist/lib/constants/contextWindows.js +15 -13
  561. package/dist/lib/constants/enums.d.ts +10 -16
  562. package/dist/lib/constants/enums.js +12 -18
  563. package/dist/lib/constants/index.d.ts +0 -10
  564. package/dist/lib/constants/index.js +1 -1
  565. package/dist/lib/constants/tokens.d.ts +29 -16
  566. package/dist/lib/constants/tokens.js +23 -16
  567. package/dist/lib/core/baseProvider.d.ts +5 -5
  568. package/dist/lib/core/baseProvider.js +6 -6
  569. package/dist/lib/core/constants.js +6 -1
  570. package/dist/lib/core/dynamicModels.js +10 -6
  571. package/dist/lib/core/evaluationProviders.js +1 -1
  572. package/dist/lib/core/infrastructure/baseError.d.ts +1 -1
  573. package/dist/lib/core/infrastructure/baseFactory.d.ts +1 -6
  574. package/dist/lib/core/infrastructure/baseRegistry.d.ts +6 -5
  575. package/dist/lib/core/infrastructure/index.d.ts +6 -4
  576. package/dist/lib/core/infrastructure/index.js +2 -2
  577. package/dist/lib/core/modelConfiguration.js +3 -1
  578. package/dist/lib/core/modules/GenerationHandler.d.ts +3 -3
  579. package/dist/lib/core/modules/GenerationHandler.js +49 -41
  580. package/dist/lib/core/modules/MessageBuilder.d.ts +5 -5
  581. package/dist/lib/core/modules/MessageBuilder.js +4 -6
  582. package/dist/lib/core/modules/StreamHandler.js +26 -12
  583. package/dist/lib/core/modules/TelemetryHandler.d.ts +4 -6
  584. package/dist/lib/core/modules/TelemetryHandler.js +7 -6
  585. package/dist/lib/core/modules/ToolsManager.d.ts +2 -12
  586. package/dist/lib/core/modules/ToolsManager.js +20 -4
  587. package/dist/lib/core/modules/Utilities.js +3 -1
  588. package/dist/lib/core/redisConversationMemoryManager.js +3 -3
  589. package/dist/lib/core/streamAnalytics.js +23 -9
  590. package/dist/lib/evaluation/contextBuilder.d.ts +2 -2
  591. package/dist/lib/evaluation/contextBuilder.js +2 -2
  592. package/dist/lib/evaluation/index.d.ts +2 -2
  593. package/dist/lib/evaluation/retryManager.js +1 -1
  594. package/dist/lib/factories/providerFactory.js +2 -2
  595. package/dist/lib/features/ppt/constants.js +1 -1
  596. package/dist/lib/features/ppt/presentationOrchestrator.js +7 -3
  597. package/dist/lib/features/ppt/slideGenerator.d.ts +2 -1
  598. package/dist/lib/features/ppt/slideGenerator.js +6 -1
  599. package/dist/lib/files/fileTools.d.ts +16 -247
  600. package/dist/lib/files/fileTools.js +16 -15
  601. package/dist/lib/index.d.ts +5 -3
  602. package/dist/lib/index.js +20 -3
  603. package/dist/lib/mcp/batching/requestBatcher.js +1 -1
  604. package/dist/lib/mcp/externalServerManager.js +5 -2
  605. package/dist/lib/mcp/factory.js +1 -1
  606. package/dist/lib/mcp/index.d.ts +1 -1
  607. package/dist/lib/mcp/index.js +1 -1
  608. package/dist/lib/mcp/mcpCircuitBreaker.d.ts +1 -0
  609. package/dist/lib/mcp/mcpCircuitBreaker.js +30 -4
  610. package/dist/lib/mcp/mcpClientFactory.js +33 -4
  611. package/dist/lib/mcp/toolDiscoveryService.js +52 -5
  612. package/dist/lib/mcp/toolRegistry.js +7 -1
  613. package/dist/lib/memory/memoryRetrievalTools.d.ts +5 -89
  614. package/dist/lib/memory/memoryRetrievalTools.js +1 -1
  615. package/dist/lib/middleware/builtin/analytics.js +3 -0
  616. package/dist/lib/middleware/builtin/autoEvaluation.js +46 -24
  617. package/dist/lib/middleware/builtin/guardrails.js +4 -0
  618. package/dist/lib/middleware/builtin/lifecycle.js +10 -6
  619. package/dist/lib/middleware/factory.d.ts +3 -3
  620. package/dist/lib/middleware/factory.js +3 -2
  621. package/dist/lib/middleware/index.d.ts +1 -1
  622. package/dist/lib/middleware/registry.d.ts +2 -2
  623. package/dist/lib/middleware/registry.js +1 -0
  624. package/dist/lib/middleware/utils/guardrailsUtils.d.ts +5 -6
  625. package/dist/lib/middleware/utils/guardrailsUtils.js +15 -6
  626. package/dist/lib/neurolink.d.ts +9 -20
  627. package/dist/lib/neurolink.js +278 -186
  628. package/dist/lib/observability/retryPolicy.d.ts +2 -13
  629. package/dist/lib/observability/sampling/samplers.d.ts +2 -11
  630. package/dist/lib/observability/spanProcessor.d.ts +2 -14
  631. package/dist/lib/processors/base/BaseFileProcessor.js +1 -1
  632. package/dist/lib/processors/document/OpenDocumentProcessor.js +5 -3
  633. package/dist/lib/processors/media/VideoProcessor.js +157 -101
  634. package/dist/lib/providers/amazonBedrock.js +12 -5
  635. package/dist/lib/providers/amazonSagemaker.d.ts +5 -5
  636. package/dist/lib/providers/amazonSagemaker.js +6 -2
  637. package/dist/lib/providers/anthropic.d.ts +3 -3
  638. package/dist/lib/providers/anthropic.js +23 -192
  639. package/dist/lib/providers/anthropicBaseProvider.d.ts +4 -4
  640. package/dist/lib/providers/anthropicBaseProvider.js +24 -13
  641. package/dist/lib/providers/azureOpenai.d.ts +2 -2
  642. package/dist/lib/providers/azureOpenai.js +6 -6
  643. package/dist/lib/providers/googleAiStudio.d.ts +2 -2
  644. package/dist/lib/providers/googleAiStudio.js +15 -7
  645. package/dist/lib/providers/googleNativeGemini3.d.ts +3 -54
  646. package/dist/lib/providers/googleNativeGemini3.js +14 -10
  647. package/dist/lib/providers/googleVertex.d.ts +6 -6
  648. package/dist/lib/providers/googleVertex.js +32 -26
  649. package/dist/lib/providers/huggingFace.d.ts +4 -4
  650. package/dist/lib/providers/huggingFace.js +15 -5
  651. package/dist/lib/providers/litellm.d.ts +4 -4
  652. package/dist/lib/providers/litellm.js +54 -42
  653. package/dist/lib/providers/mistral.d.ts +2 -2
  654. package/dist/lib/providers/mistral.js +5 -4
  655. package/dist/lib/providers/ollama.d.ts +7 -4
  656. package/dist/lib/providers/ollama.js +30 -8
  657. package/dist/lib/providers/openAI.d.ts +2 -2
  658. package/dist/lib/providers/openAI.js +46 -21
  659. package/dist/lib/providers/openRouter.d.ts +4 -4
  660. package/dist/lib/providers/openRouter.js +63 -35
  661. package/dist/lib/providers/openaiCompatible.d.ts +2 -2
  662. package/dist/lib/providers/openaiCompatible.js +18 -9
  663. package/dist/lib/providers/providerTypeUtils.d.ts +28 -0
  664. package/dist/lib/providers/providerTypeUtils.js +47 -0
  665. package/dist/lib/providers/sagemaker/config.js +5 -5
  666. package/dist/lib/providers/sagemaker/language-model.d.ts +23 -13
  667. package/dist/lib/providers/sagemaker/language-model.js +20 -8
  668. package/dist/lib/proxy/accountQuota.d.ts +33 -0
  669. package/dist/lib/proxy/accountQuota.js +163 -0
  670. package/dist/lib/proxy/claudeFormat.d.ts +143 -0
  671. package/dist/lib/proxy/claudeFormat.js +596 -0
  672. package/dist/lib/proxy/cloaking/index.d.ts +44 -0
  673. package/dist/lib/proxy/cloaking/index.js +87 -0
  674. package/dist/lib/proxy/cloaking/plugins/headerScrubber.d.ts +9 -0
  675. package/dist/lib/proxy/cloaking/plugins/headerScrubber.js +87 -0
  676. package/dist/lib/proxy/cloaking/plugins/sessionIdentity.d.ts +15 -0
  677. package/dist/lib/proxy/cloaking/plugins/sessionIdentity.js +66 -0
  678. package/dist/lib/proxy/cloaking/plugins/systemPromptInjector.d.ts +11 -0
  679. package/dist/lib/proxy/cloaking/plugins/systemPromptInjector.js +84 -0
  680. package/dist/lib/proxy/cloaking/plugins/tlsFingerprint.d.ts +14 -0
  681. package/dist/lib/proxy/cloaking/plugins/tlsFingerprint.js +39 -0
  682. package/dist/lib/proxy/cloaking/plugins/wordObfuscator.d.ts +9 -0
  683. package/dist/lib/proxy/cloaking/plugins/wordObfuscator.js +122 -0
  684. package/dist/lib/proxy/cloaking/types.d.ts +1 -0
  685. package/dist/lib/proxy/cloaking/types.js +2 -0
  686. package/dist/lib/proxy/modelRouter.d.ts +10 -0
  687. package/dist/lib/proxy/modelRouter.js +30 -0
  688. package/dist/lib/proxy/oauthFetch.d.ts +36 -0
  689. package/dist/lib/proxy/oauthFetch.js +368 -0
  690. package/dist/lib/proxy/proxyConfig.d.ts +42 -0
  691. package/dist/lib/proxy/proxyConfig.js +500 -0
  692. package/dist/lib/proxy/proxyFetch.js +2 -1
  693. package/dist/lib/proxy/requestLogger.d.ts +50 -0
  694. package/dist/lib/proxy/requestLogger.js +208 -0
  695. package/dist/lib/proxy/tokenRefresh.d.ts +4 -0
  696. package/dist/lib/proxy/tokenRefresh.js +125 -0
  697. package/dist/lib/proxy/usageStats.d.ts +13 -0
  698. package/dist/lib/proxy/usageStats.js +75 -0
  699. package/dist/lib/rag/document/loaders.js +1 -1
  700. package/dist/lib/rag/pipeline/contextAssembly.d.ts +4 -7
  701. package/dist/lib/rag/ragIntegration.d.ts +2 -14
  702. package/dist/lib/rag/ragIntegration.js +1 -1
  703. package/dist/lib/rag/resilience/CircuitBreaker.d.ts +5 -44
  704. package/dist/lib/rag/resilience/RetryHandler.js +1 -1
  705. package/dist/lib/rag/retrieval/vectorQueryTool.d.ts +1 -9
  706. package/dist/lib/rag/retrieval/vectorQueryTool.js +1 -1
  707. package/dist/lib/sdk/toolRegistration.js +12 -1
  708. package/dist/lib/server/abstract/baseServerAdapter.js +2 -2
  709. package/dist/lib/server/adapters/honoAdapter.d.ts +6 -0
  710. package/dist/lib/server/adapters/honoAdapter.js +76 -10
  711. package/dist/lib/server/middleware/cache.js +3 -0
  712. package/dist/lib/server/routes/claudeProxyRoutes.d.ts +44 -0
  713. package/dist/lib/server/routes/claudeProxyRoutes.js +1601 -0
  714. package/dist/lib/server/routes/healthRoutes.js +18 -1
  715. package/dist/lib/server/routes/index.d.ts +7 -0
  716. package/dist/lib/server/routes/index.js +8 -0
  717. package/dist/lib/server/streaming/dataStream.d.ts +1 -5
  718. package/dist/lib/server/streaming/dataStream.js +3 -0
  719. package/dist/lib/server/utils/validation.d.ts +24 -124
  720. package/dist/lib/server/utils/validation.js +2 -2
  721. package/dist/lib/services/server/ai/observability/instrumentation.js +4 -0
  722. package/dist/lib/telemetry/attributes.d.ts +38 -0
  723. package/dist/lib/telemetry/attributes.js +40 -0
  724. package/dist/lib/telemetry/tracers.d.ts +1 -0
  725. package/dist/lib/telemetry/tracers.js +1 -0
  726. package/dist/lib/types/authTypes.d.ts +56 -0
  727. package/dist/lib/types/authTypes.js +9 -0
  728. package/dist/lib/types/circuitBreakerErrors.d.ts +30 -0
  729. package/dist/lib/types/circuitBreakerErrors.js +35 -0
  730. package/dist/lib/types/cli.d.ts +258 -0
  731. package/dist/lib/types/clientTypes.d.ts +1050 -0
  732. package/dist/lib/types/clientTypes.js +11 -0
  733. package/dist/lib/types/common.d.ts +123 -0
  734. package/dist/lib/types/configTypes.d.ts +49 -0
  735. package/dist/lib/types/configTypes.js +4 -0
  736. package/dist/lib/types/conversation.d.ts +0 -5
  737. package/dist/lib/types/evaluationTypes.d.ts +2 -2
  738. package/dist/lib/types/fileTypes.d.ts +47 -0
  739. package/dist/lib/types/generateTypes.d.ts +7 -3
  740. package/dist/lib/types/guardrails.d.ts +2 -2
  741. package/dist/lib/types/index.d.ts +4 -1
  742. package/dist/lib/types/index.js +5 -0
  743. package/dist/lib/types/middlewareTypes.d.ts +3 -3
  744. package/dist/lib/types/modelTypes.d.ts +7 -97
  745. package/dist/lib/types/modelTypes.js +3 -3
  746. package/dist/lib/types/observability.d.ts +37 -0
  747. package/dist/lib/types/providers.d.ts +107 -0
  748. package/dist/lib/types/proxyTypes.d.ts +536 -0
  749. package/dist/lib/types/proxyTypes.js +17 -0
  750. package/dist/lib/types/ragTypes.d.ts +49 -1
  751. package/dist/lib/types/streamTypes.d.ts +37 -13
  752. package/dist/lib/types/subscriptionTypes.d.ts +77 -0
  753. package/dist/lib/types/subscriptionTypes.js +2 -0
  754. package/dist/lib/types/tools.d.ts +45 -1
  755. package/dist/lib/types/typeAliases.d.ts +8 -0
  756. package/dist/lib/types/typeAliases.js +1 -0
  757. package/dist/lib/utils/async/retry.d.ts +4 -33
  758. package/dist/lib/utils/asyncMutex.d.ts +14 -0
  759. package/dist/lib/utils/asyncMutex.js +61 -0
  760. package/dist/lib/utils/errorHandling.d.ts +2 -1
  761. package/dist/lib/utils/errorHandling.js +14 -6
  762. package/dist/lib/utils/fileDetector.d.ts +13 -1
  763. package/dist/lib/utils/fileDetector.js +114 -32
  764. package/dist/lib/utils/imageProcessor.js +7 -7
  765. package/dist/lib/utils/json/safeParse.d.ts +1 -8
  766. package/dist/lib/utils/mcpDefaults.d.ts +1 -1
  767. package/dist/lib/utils/mcpDefaults.js +11 -2
  768. package/dist/lib/utils/messageBuilder.d.ts +5 -5
  769. package/dist/lib/utils/messageBuilder.js +106 -80
  770. package/dist/lib/utils/modelChoices.d.ts +1 -8
  771. package/dist/lib/utils/pdfProcessor.d.ts +1 -25
  772. package/dist/lib/utils/pdfProcessor.js +5 -4
  773. package/dist/lib/utils/pricing.js +28 -5
  774. package/dist/lib/utils/providerHealth.d.ts +1 -1
  775. package/dist/lib/utils/rateLimiter.d.ts +1 -15
  776. package/dist/lib/utils/redis.d.ts +1 -1
  777. package/dist/lib/utils/redis.js +3 -3
  778. package/dist/lib/utils/sanitizers/filename.d.ts +2 -22
  779. package/dist/lib/utils/sanitizers/index.d.ts +4 -2
  780. package/dist/lib/utils/sanitizers/svg.d.ts +1 -11
  781. package/dist/lib/utils/schemaConversion.js +4 -1
  782. package/dist/lib/utils/thinkingConfig.d.ts +1 -33
  783. package/dist/lib/utils/tokenUtils.d.ts +1 -39
  784. package/dist/lib/utils/videoAnalysisProcessor.d.ts +5 -5
  785. package/dist/lib/utils/videoAnalysisProcessor.js +2 -2
  786. package/dist/lib/workflow/config.d.ts +89 -1257
  787. package/dist/lib/workflow/utils/workflowValidation.js +1 -1
  788. package/dist/mcp/batching/requestBatcher.js +1 -1
  789. package/dist/mcp/externalServerManager.js +5 -2
  790. package/dist/mcp/factory.js +1 -1
  791. package/dist/mcp/index.d.ts +1 -1
  792. package/dist/mcp/index.js +1 -1
  793. package/dist/mcp/mcpCircuitBreaker.d.ts +1 -0
  794. package/dist/mcp/mcpCircuitBreaker.js +30 -4
  795. package/dist/mcp/mcpClientFactory.js +33 -4
  796. package/dist/mcp/toolDiscoveryService.js +52 -5
  797. package/dist/mcp/toolRegistry.js +7 -1
  798. package/dist/memory/memoryRetrievalTools.d.ts +5 -89
  799. package/dist/memory/memoryRetrievalTools.js +1 -1
  800. package/dist/middleware/builtin/analytics.js +3 -0
  801. package/dist/middleware/builtin/autoEvaluation.js +46 -24
  802. package/dist/middleware/builtin/guardrails.js +4 -0
  803. package/dist/middleware/builtin/lifecycle.js +10 -6
  804. package/dist/middleware/factory.d.ts +3 -3
  805. package/dist/middleware/factory.js +3 -2
  806. package/dist/middleware/index.d.ts +1 -1
  807. package/dist/middleware/registry.d.ts +2 -2
  808. package/dist/middleware/registry.js +1 -0
  809. package/dist/middleware/utils/guardrailsUtils.d.ts +5 -6
  810. package/dist/middleware/utils/guardrailsUtils.js +15 -6
  811. package/dist/neurolink.d.ts +9 -20
  812. package/dist/neurolink.js +278 -186
  813. package/dist/observability/retryPolicy.d.ts +2 -13
  814. package/dist/observability/sampling/samplers.d.ts +2 -11
  815. package/dist/observability/spanProcessor.d.ts +2 -14
  816. package/dist/processors/base/BaseFileProcessor.js +1 -1
  817. package/dist/processors/document/OpenDocumentProcessor.js +5 -3
  818. package/dist/processors/media/VideoProcessor.js +157 -101
  819. package/dist/providers/amazonBedrock.js +12 -5
  820. package/dist/providers/amazonSagemaker.d.ts +5 -5
  821. package/dist/providers/amazonSagemaker.js +6 -2
  822. package/dist/providers/anthropic.d.ts +3 -3
  823. package/dist/providers/anthropic.js +23 -192
  824. package/dist/providers/anthropicBaseProvider.d.ts +4 -4
  825. package/dist/providers/anthropicBaseProvider.js +24 -13
  826. package/dist/providers/azureOpenai.d.ts +2 -2
  827. package/dist/providers/azureOpenai.js +6 -6
  828. package/dist/providers/googleAiStudio.d.ts +2 -2
  829. package/dist/providers/googleAiStudio.js +15 -7
  830. package/dist/providers/googleNativeGemini3.d.ts +3 -54
  831. package/dist/providers/googleNativeGemini3.js +14 -10
  832. package/dist/providers/googleVertex.d.ts +6 -6
  833. package/dist/providers/googleVertex.js +32 -26
  834. package/dist/providers/huggingFace.d.ts +4 -4
  835. package/dist/providers/huggingFace.js +15 -5
  836. package/dist/providers/litellm.d.ts +4 -4
  837. package/dist/providers/litellm.js +54 -42
  838. package/dist/providers/mistral.d.ts +2 -2
  839. package/dist/providers/mistral.js +5 -4
  840. package/dist/providers/ollama.d.ts +7 -4
  841. package/dist/providers/ollama.js +30 -8
  842. package/dist/providers/openAI.d.ts +2 -2
  843. package/dist/providers/openAI.js +46 -21
  844. package/dist/providers/openRouter.d.ts +4 -4
  845. package/dist/providers/openRouter.js +63 -35
  846. package/dist/providers/openaiCompatible.d.ts +2 -2
  847. package/dist/providers/openaiCompatible.js +18 -9
  848. package/dist/providers/providerTypeUtils.d.ts +28 -0
  849. package/dist/providers/providerTypeUtils.js +46 -0
  850. package/dist/providers/sagemaker/config.js +5 -5
  851. package/dist/providers/sagemaker/language-model.d.ts +23 -13
  852. package/dist/providers/sagemaker/language-model.js +20 -8
  853. package/dist/proxy/accountQuota.d.ts +33 -0
  854. package/dist/proxy/accountQuota.js +162 -0
  855. package/dist/proxy/claudeFormat.d.ts +143 -0
  856. package/dist/proxy/claudeFormat.js +595 -0
  857. package/dist/proxy/cloaking/index.d.ts +44 -0
  858. package/dist/proxy/cloaking/index.js +86 -0
  859. package/dist/proxy/cloaking/plugins/headerScrubber.d.ts +9 -0
  860. package/dist/proxy/cloaking/plugins/headerScrubber.js +86 -0
  861. package/dist/proxy/cloaking/plugins/sessionIdentity.d.ts +15 -0
  862. package/dist/proxy/cloaking/plugins/sessionIdentity.js +65 -0
  863. package/dist/proxy/cloaking/plugins/systemPromptInjector.d.ts +11 -0
  864. package/dist/proxy/cloaking/plugins/systemPromptInjector.js +83 -0
  865. package/dist/proxy/cloaking/plugins/tlsFingerprint.d.ts +14 -0
  866. package/dist/proxy/cloaking/plugins/tlsFingerprint.js +38 -0
  867. package/dist/proxy/cloaking/plugins/wordObfuscator.d.ts +9 -0
  868. package/dist/proxy/cloaking/plugins/wordObfuscator.js +121 -0
  869. package/dist/proxy/cloaking/types.d.ts +1 -0
  870. package/dist/proxy/cloaking/types.js +1 -0
  871. package/dist/proxy/modelRouter.d.ts +10 -0
  872. package/dist/proxy/modelRouter.js +29 -0
  873. package/dist/proxy/oauthFetch.d.ts +36 -0
  874. package/dist/proxy/oauthFetch.js +367 -0
  875. package/dist/proxy/proxyConfig.d.ts +42 -0
  876. package/dist/proxy/proxyConfig.js +499 -0
  877. package/dist/proxy/proxyFetch.js +2 -1
  878. package/dist/proxy/requestLogger.d.ts +50 -0
  879. package/dist/proxy/requestLogger.js +207 -0
  880. package/dist/proxy/tokenRefresh.d.ts +4 -0
  881. package/dist/proxy/tokenRefresh.js +124 -0
  882. package/dist/proxy/usageStats.d.ts +13 -0
  883. package/dist/proxy/usageStats.js +74 -0
  884. package/dist/rag/document/loaders.js +1 -1
  885. package/dist/rag/pipeline/contextAssembly.d.ts +4 -7
  886. package/dist/rag/ragIntegration.d.ts +2 -14
  887. package/dist/rag/ragIntegration.js +1 -1
  888. package/dist/rag/resilience/CircuitBreaker.d.ts +5 -44
  889. package/dist/rag/resilience/RetryHandler.js +1 -1
  890. package/dist/rag/retrieval/vectorQueryTool.d.ts +1 -9
  891. package/dist/rag/retrieval/vectorQueryTool.js +1 -1
  892. package/dist/sdk/toolRegistration.js +12 -1
  893. package/dist/server/abstract/baseServerAdapter.js +2 -2
  894. package/dist/server/adapters/honoAdapter.d.ts +6 -0
  895. package/dist/server/adapters/honoAdapter.js +76 -10
  896. package/dist/server/middleware/cache.js +3 -0
  897. package/dist/server/routes/claudeProxyRoutes.d.ts +44 -0
  898. package/dist/server/routes/claudeProxyRoutes.js +1600 -0
  899. package/dist/server/routes/healthRoutes.js +18 -1
  900. package/dist/server/routes/index.d.ts +7 -0
  901. package/dist/server/routes/index.js +8 -0
  902. package/dist/server/streaming/dataStream.d.ts +1 -5
  903. package/dist/server/streaming/dataStream.js +3 -0
  904. package/dist/server/utils/validation.d.ts +24 -124
  905. package/dist/server/utils/validation.js +2 -2
  906. package/dist/services/server/ai/observability/instrumentation.js +4 -0
  907. package/dist/telemetry/attributes.d.ts +38 -0
  908. package/dist/telemetry/attributes.js +40 -0
  909. package/dist/telemetry/tracers.d.ts +1 -0
  910. package/dist/telemetry/tracers.js +1 -0
  911. package/dist/types/authTypes.d.ts +56 -0
  912. package/dist/types/authTypes.js +8 -0
  913. package/dist/types/circuitBreakerErrors.d.ts +30 -0
  914. package/dist/types/circuitBreakerErrors.js +34 -0
  915. package/dist/types/cli.d.ts +258 -0
  916. package/dist/types/clientTypes.d.ts +1050 -0
  917. package/dist/types/clientTypes.js +10 -0
  918. package/dist/types/common.d.ts +123 -0
  919. package/dist/types/configTypes.d.ts +49 -0
  920. package/dist/types/configTypes.js +4 -0
  921. package/dist/types/conversation.d.ts +0 -5
  922. package/dist/types/evaluationTypes.d.ts +2 -2
  923. package/dist/types/fileTypes.d.ts +47 -0
  924. package/dist/types/generateTypes.d.ts +7 -3
  925. package/dist/types/guardrails.d.ts +2 -2
  926. package/dist/types/index.d.ts +4 -1
  927. package/dist/types/index.js +5 -0
  928. package/dist/types/middlewareTypes.d.ts +3 -3
  929. package/dist/types/modelTypes.d.ts +7 -97
  930. package/dist/types/modelTypes.js +3 -3
  931. package/dist/types/observability.d.ts +37 -0
  932. package/dist/types/providers.d.ts +107 -0
  933. package/dist/types/proxyTypes.d.ts +536 -0
  934. package/dist/types/proxyTypes.js +16 -0
  935. package/dist/types/ragTypes.d.ts +49 -1
  936. package/dist/types/streamTypes.d.ts +37 -13
  937. package/dist/types/subscriptionTypes.d.ts +77 -0
  938. package/dist/types/subscriptionTypes.js +2 -0
  939. package/dist/types/tools.d.ts +45 -1
  940. package/dist/types/typeAliases.d.ts +8 -0
  941. package/dist/types/typeAliases.js +1 -0
  942. package/dist/utils/async/retry.d.ts +4 -33
  943. package/dist/utils/asyncMutex.d.ts +14 -0
  944. package/dist/utils/asyncMutex.js +60 -0
  945. package/dist/utils/errorHandling.d.ts +2 -1
  946. package/dist/utils/errorHandling.js +14 -6
  947. package/dist/utils/fileDetector.d.ts +13 -1
  948. package/dist/utils/fileDetector.js +114 -32
  949. package/dist/utils/imageProcessor.js +7 -7
  950. package/dist/utils/json/safeParse.d.ts +1 -8
  951. package/dist/utils/mcpDefaults.d.ts +1 -1
  952. package/dist/utils/mcpDefaults.js +11 -2
  953. package/dist/utils/messageBuilder.d.ts +5 -5
  954. package/dist/utils/messageBuilder.js +106 -80
  955. package/dist/utils/modelChoices.d.ts +1 -8
  956. package/dist/utils/pdfProcessor.d.ts +1 -25
  957. package/dist/utils/pdfProcessor.js +5 -4
  958. package/dist/utils/pricing.js +28 -5
  959. package/dist/utils/rateLimiter.d.ts +1 -15
  960. package/dist/utils/redis.d.ts +1 -1
  961. package/dist/utils/redis.js +3 -3
  962. package/dist/utils/sanitizers/filename.d.ts +2 -22
  963. package/dist/utils/sanitizers/index.d.ts +4 -2
  964. package/dist/utils/sanitizers/svg.d.ts +1 -11
  965. package/dist/utils/schemaConversion.js +4 -1
  966. package/dist/utils/thinkingConfig.d.ts +1 -33
  967. package/dist/utils/tokenUtils.d.ts +1 -39
  968. package/dist/utils/videoAnalysisProcessor.d.ts +5 -5
  969. package/dist/utils/videoAnalysisProcessor.js +2 -2
  970. package/dist/workflow/config.d.ts +89 -1257
  971. package/dist/workflow/utils/workflowValidation.js +1 -1
  972. package/docs-site/mcp-server/index.js +2 -3
  973. package/package.json +138 -105
  974. package/dist/lib/memory/mem0Initializer.d.ts +0 -46
  975. package/dist/lib/memory/mem0Initializer.js +0 -85
  976. package/dist/memory/mem0Initializer.d.ts +0 -46
  977. 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 if OAuth
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
- logger.error(chalk.red("The API key could not be validated. Please check and try again."));
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
- logger.error(chalk.red(error instanceof Error ? error.message : "Validation error"));
494
- return;
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
- // Detect subscription tier if possible
821
- const subscriptionTier = await detectSubscriptionTier(tokens.accessToken);
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 from token (if API supports it)
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 detectSubscriptionTier(accessToken) {
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
- if (data.subscription) {
903
- return data.subscription;
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 undefined;
1459
+ return {};
911
1460
  }
912
1461
  /**
913
1462
  * Open URL in the default browser (cross-platform)