@juspay/neurolink 9.5.3 → 9.7.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 (423) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +29 -25
  3. package/dist/adapters/video/vertexVideoHandler.js +3 -3
  4. package/dist/agent/directTools.d.ts +5 -5
  5. package/dist/cli/commands/config.d.ts +9 -9
  6. package/dist/cli/commands/serve.d.ts +37 -0
  7. package/dist/cli/commands/serve.js +302 -229
  8. package/dist/cli/commands/setup-anthropic.d.ts +2 -2
  9. package/dist/cli/commands/setup-azure.d.ts +2 -2
  10. package/dist/cli/commands/setup-bedrock.d.ts +2 -2
  11. package/dist/cli/commands/setup-gcp.d.ts +2 -2
  12. package/dist/cli/commands/setup-google-ai.d.ts +2 -2
  13. package/dist/cli/commands/setup-huggingface.d.ts +2 -2
  14. package/dist/cli/commands/setup-mistral.d.ts +2 -2
  15. package/dist/cli/commands/setup-openai.d.ts +2 -2
  16. package/dist/cli/commands/setup.d.ts +2 -2
  17. package/dist/cli/factories/commandFactory.js +16 -2
  18. package/dist/cli/loop/optionsSchema.d.ts +2 -2
  19. package/dist/cli/loop/optionsSchema.js +4 -0
  20. package/dist/cli/loop/session.d.ts +4 -0
  21. package/dist/cli/loop/session.js +49 -4
  22. package/dist/cli/utils/interactiveSetup.d.ts +4 -4
  23. package/dist/config/conversationMemory.d.ts +2 -0
  24. package/dist/config/conversationMemory.js +5 -5
  25. package/dist/constants/contextWindows.d.ts +46 -0
  26. package/dist/constants/contextWindows.js +156 -0
  27. package/dist/context/budgetChecker.d.ts +18 -0
  28. package/dist/context/budgetChecker.js +71 -0
  29. package/dist/context/contextCompactor.d.ts +22 -0
  30. package/dist/context/contextCompactor.js +106 -0
  31. package/dist/context/effectiveHistory.d.ts +52 -0
  32. package/dist/context/effectiveHistory.js +105 -0
  33. package/dist/context/errorDetection.d.ts +14 -0
  34. package/dist/context/errorDetection.js +124 -0
  35. package/dist/context/fileSummarizationService.d.ts +54 -0
  36. package/dist/context/fileSummarizationService.js +255 -0
  37. package/dist/context/fileSummarizer.d.ts +56 -0
  38. package/dist/context/fileSummarizer.js +145 -0
  39. package/dist/context/fileTokenBudget.d.ts +53 -0
  40. package/dist/context/fileTokenBudget.js +127 -0
  41. package/dist/context/prompts/summarizationPrompt.d.ts +17 -0
  42. package/dist/context/prompts/summarizationPrompt.js +110 -0
  43. package/dist/context/stages/fileReadDeduplicator.d.ts +10 -0
  44. package/dist/context/stages/fileReadDeduplicator.js +66 -0
  45. package/dist/context/stages/slidingWindowTruncator.d.ts +11 -0
  46. package/dist/context/stages/slidingWindowTruncator.js +42 -0
  47. package/dist/context/stages/structuredSummarizer.d.ts +10 -0
  48. package/dist/context/stages/structuredSummarizer.js +49 -0
  49. package/dist/context/stages/toolOutputPruner.d.ts +10 -0
  50. package/dist/context/stages/toolOutputPruner.js +52 -0
  51. package/dist/context/summarizationEngine.d.ts +45 -0
  52. package/dist/context/summarizationEngine.js +110 -0
  53. package/dist/context/toolOutputLimits.d.ts +17 -0
  54. package/dist/context/toolOutputLimits.js +84 -0
  55. package/dist/context/toolPairRepair.d.ts +16 -0
  56. package/dist/context/toolPairRepair.js +66 -0
  57. package/dist/core/analytics.js +11 -4
  58. package/dist/core/baseProvider.d.ts +6 -0
  59. package/dist/core/baseProvider.js +83 -14
  60. package/dist/core/conversationMemoryManager.d.ts +14 -11
  61. package/dist/core/conversationMemoryManager.js +36 -68
  62. package/dist/core/dynamicModels.js +3 -2
  63. package/dist/core/modules/GenerationHandler.js +2 -0
  64. package/dist/core/modules/MessageBuilder.d.ts +1 -1
  65. package/dist/core/modules/MessageBuilder.js +2 -0
  66. package/dist/core/modules/TelemetryHandler.d.ts +2 -3
  67. package/dist/core/modules/TelemetryHandler.js +3 -3
  68. package/dist/core/modules/ToolsManager.d.ts +2 -2
  69. package/dist/core/redisConversationMemoryManager.d.ts +19 -14
  70. package/dist/core/redisConversationMemoryManager.js +94 -86
  71. package/dist/factories/providerFactory.d.ts +2 -2
  72. package/dist/files/fileReferenceRegistry.d.ts +276 -0
  73. package/dist/files/fileReferenceRegistry.js +1543 -0
  74. package/dist/files/fileTools.d.ts +423 -0
  75. package/dist/files/fileTools.js +449 -0
  76. package/dist/files/index.d.ts +14 -0
  77. package/dist/files/index.js +13 -0
  78. package/dist/files/streamingReader.d.ts +93 -0
  79. package/dist/files/streamingReader.js +321 -0
  80. package/dist/files/types.d.ts +23 -0
  81. package/dist/files/types.js +23 -0
  82. package/dist/image-gen/imageGenTools.d.ts +2 -2
  83. package/dist/image-gen/types.d.ts +12 -12
  84. package/dist/index.d.ts +4 -0
  85. package/dist/index.js +5 -0
  86. package/dist/lib/adapters/video/vertexVideoHandler.js +3 -3
  87. package/dist/lib/agent/directTools.d.ts +7 -7
  88. package/dist/lib/config/conversationMemory.d.ts +2 -0
  89. package/dist/lib/config/conversationMemory.js +5 -5
  90. package/dist/lib/constants/contextWindows.d.ts +46 -0
  91. package/dist/lib/constants/contextWindows.js +157 -0
  92. package/dist/lib/context/budgetChecker.d.ts +18 -0
  93. package/dist/lib/context/budgetChecker.js +72 -0
  94. package/dist/lib/context/contextCompactor.d.ts +22 -0
  95. package/dist/lib/context/contextCompactor.js +107 -0
  96. package/dist/lib/context/effectiveHistory.d.ts +52 -0
  97. package/dist/lib/context/effectiveHistory.js +106 -0
  98. package/dist/lib/context/errorDetection.d.ts +14 -0
  99. package/dist/lib/context/errorDetection.js +125 -0
  100. package/dist/lib/context/fileSummarizationService.d.ts +54 -0
  101. package/dist/lib/context/fileSummarizationService.js +256 -0
  102. package/dist/lib/context/fileSummarizer.d.ts +56 -0
  103. package/dist/lib/context/fileSummarizer.js +146 -0
  104. package/dist/lib/context/fileTokenBudget.d.ts +53 -0
  105. package/dist/lib/context/fileTokenBudget.js +128 -0
  106. package/dist/lib/context/prompts/summarizationPrompt.d.ts +17 -0
  107. package/dist/lib/context/prompts/summarizationPrompt.js +111 -0
  108. package/dist/lib/context/stages/fileReadDeduplicator.d.ts +10 -0
  109. package/dist/lib/context/stages/fileReadDeduplicator.js +67 -0
  110. package/dist/lib/context/stages/slidingWindowTruncator.d.ts +11 -0
  111. package/dist/lib/context/stages/slidingWindowTruncator.js +43 -0
  112. package/dist/lib/context/stages/structuredSummarizer.d.ts +10 -0
  113. package/dist/lib/context/stages/structuredSummarizer.js +50 -0
  114. package/dist/lib/context/stages/toolOutputPruner.d.ts +10 -0
  115. package/dist/lib/context/stages/toolOutputPruner.js +53 -0
  116. package/dist/lib/context/summarizationEngine.d.ts +45 -0
  117. package/dist/lib/context/summarizationEngine.js +111 -0
  118. package/dist/lib/context/toolOutputLimits.d.ts +17 -0
  119. package/dist/lib/context/toolOutputLimits.js +85 -0
  120. package/dist/lib/context/toolPairRepair.d.ts +16 -0
  121. package/dist/lib/context/toolPairRepair.js +67 -0
  122. package/dist/lib/core/analytics.js +11 -4
  123. package/dist/lib/core/baseProvider.d.ts +6 -0
  124. package/dist/lib/core/baseProvider.js +83 -14
  125. package/dist/lib/core/conversationMemoryManager.d.ts +14 -11
  126. package/dist/lib/core/conversationMemoryManager.js +36 -68
  127. package/dist/lib/core/dynamicModels.js +3 -2
  128. package/dist/lib/core/modules/GenerationHandler.js +2 -0
  129. package/dist/lib/core/modules/MessageBuilder.d.ts +1 -1
  130. package/dist/lib/core/modules/MessageBuilder.js +2 -0
  131. package/dist/lib/core/modules/TelemetryHandler.d.ts +2 -3
  132. package/dist/lib/core/modules/TelemetryHandler.js +3 -3
  133. package/dist/lib/core/modules/ToolsManager.d.ts +2 -2
  134. package/dist/lib/core/redisConversationMemoryManager.d.ts +19 -14
  135. package/dist/lib/core/redisConversationMemoryManager.js +94 -86
  136. package/dist/lib/factories/providerFactory.d.ts +2 -2
  137. package/dist/lib/files/fileReferenceRegistry.d.ts +276 -0
  138. package/dist/lib/files/fileReferenceRegistry.js +1544 -0
  139. package/dist/lib/files/fileTools.d.ts +423 -0
  140. package/dist/lib/files/fileTools.js +450 -0
  141. package/dist/lib/files/index.d.ts +14 -0
  142. package/dist/lib/files/index.js +14 -0
  143. package/dist/lib/files/streamingReader.d.ts +93 -0
  144. package/dist/lib/files/streamingReader.js +322 -0
  145. package/dist/lib/files/types.d.ts +23 -0
  146. package/dist/lib/files/types.js +24 -0
  147. package/dist/lib/image-gen/imageGenTools.d.ts +2 -2
  148. package/dist/lib/image-gen/types.d.ts +12 -12
  149. package/dist/lib/index.d.ts +4 -0
  150. package/dist/lib/index.js +5 -0
  151. package/dist/lib/mcp/httpRetryHandler.js +6 -2
  152. package/dist/lib/memory/mem0Initializer.d.ts +2 -2
  153. package/dist/lib/neurolink.d.ts +66 -2
  154. package/dist/lib/neurolink.js +777 -315
  155. package/dist/lib/processors/archive/ArchiveProcessor.d.ts +327 -0
  156. package/dist/lib/processors/archive/ArchiveProcessor.js +1309 -0
  157. package/dist/lib/processors/archive/index.d.ts +33 -0
  158. package/dist/lib/processors/archive/index.js +43 -0
  159. package/dist/lib/processors/base/BaseFileProcessor.js +2 -1
  160. package/dist/lib/processors/base/types.d.ts +70 -64
  161. package/dist/lib/processors/base/types.js +6 -0
  162. package/dist/lib/processors/cli/fileProcessorCli.d.ts +8 -8
  163. package/dist/lib/processors/cli/fileProcessorCli.js +5 -5
  164. package/dist/lib/processors/config/mimeTypes.js +25 -0
  165. package/dist/lib/processors/config/sizeLimits.d.ts +52 -40
  166. package/dist/lib/processors/config/sizeLimits.js +56 -44
  167. package/dist/lib/processors/document/ExcelProcessor.d.ts +14 -0
  168. package/dist/lib/processors/document/ExcelProcessor.js +72 -1
  169. package/dist/lib/processors/document/PptxProcessor.d.ts +63 -0
  170. package/dist/lib/processors/document/PptxProcessor.js +158 -0
  171. package/dist/lib/processors/document/index.d.ts +1 -0
  172. package/dist/lib/processors/document/index.js +6 -0
  173. package/dist/lib/processors/errors/FileErrorCode.d.ts +2 -2
  174. package/dist/lib/processors/errors/errorHelpers.d.ts +2 -2
  175. package/dist/lib/processors/errors/errorHelpers.js +12 -4
  176. package/dist/lib/processors/errors/errorSerializer.d.ts +4 -4
  177. package/dist/lib/processors/index.d.ts +8 -2
  178. package/dist/lib/processors/index.js +5 -2
  179. package/dist/lib/processors/integration/FileProcessorIntegration.d.ts +8 -8
  180. package/dist/lib/processors/integration/FileProcessorIntegration.js +7 -7
  181. package/dist/lib/processors/media/AudioProcessor.d.ts +328 -0
  182. package/dist/lib/processors/media/AudioProcessor.js +708 -0
  183. package/dist/lib/processors/media/VideoProcessor.d.ts +350 -0
  184. package/dist/lib/processors/media/VideoProcessor.js +992 -0
  185. package/dist/lib/processors/media/index.d.ts +27 -0
  186. package/dist/lib/processors/media/index.js +37 -0
  187. package/dist/lib/processors/registry/ProcessorRegistry.d.ts +19 -5
  188. package/dist/lib/processors/registry/ProcessorRegistry.js +103 -8
  189. package/dist/lib/processors/registry/index.d.ts +1 -1
  190. package/dist/lib/processors/registry/index.js +1 -1
  191. package/dist/lib/processors/registry/types.d.ts +2 -2
  192. package/dist/lib/providers/amazonBedrock.js +2 -1
  193. package/dist/lib/providers/anthropic.js +2 -2
  194. package/dist/lib/providers/anthropicBaseProvider.js +10 -4
  195. package/dist/lib/providers/azureOpenai.js +14 -25
  196. package/dist/lib/providers/googleAiStudio.js +136 -457
  197. package/dist/lib/providers/googleNativeGemini3.d.ts +119 -0
  198. package/dist/lib/providers/googleNativeGemini3.js +264 -0
  199. package/dist/lib/providers/googleVertex.d.ts +15 -1
  200. package/dist/lib/providers/googleVertex.js +341 -775
  201. package/dist/lib/providers/huggingFace.js +20 -5
  202. package/dist/lib/providers/litellm.js +6 -4
  203. package/dist/lib/providers/mistral.js +3 -2
  204. package/dist/lib/providers/openAI.js +2 -2
  205. package/dist/lib/providers/openRouter.js +8 -7
  206. package/dist/lib/providers/openaiCompatible.js +10 -4
  207. package/dist/lib/providers/sagemaker/detection.d.ts +6 -6
  208. package/dist/lib/providers/sagemaker/diagnostics.d.ts +4 -4
  209. package/dist/lib/providers/sagemaker/parsers.d.ts +4 -4
  210. package/dist/lib/rag/chunkers/RecursiveChunker.js +2 -2
  211. package/dist/lib/rag/document/loaders.d.ts +6 -71
  212. package/dist/lib/rag/document/loaders.js +5 -5
  213. package/dist/lib/rag/graphRag/graphRAG.js +26 -9
  214. package/dist/lib/rag/metadata/MetadataExtractorFactory.d.ts +5 -55
  215. package/dist/lib/rag/metadata/metadataExtractor.js +6 -3
  216. package/dist/lib/rag/pipeline/RAGPipeline.d.ts +8 -126
  217. package/dist/lib/rag/pipeline/RAGPipeline.js +11 -11
  218. package/dist/lib/rag/pipeline/contextAssembly.d.ts +3 -42
  219. package/dist/lib/rag/pipeline/contextAssembly.js +6 -3
  220. package/dist/lib/rag/reranker/RerankerFactory.d.ts +5 -60
  221. package/dist/lib/rag/resilience/CircuitBreaker.d.ts +3 -33
  222. package/dist/lib/rag/resilience/RetryHandler.d.ts +2 -21
  223. package/dist/lib/rag/resilience/RetryHandler.js +6 -2
  224. package/dist/lib/rag/retrieval/hybridSearch.d.ts +3 -41
  225. package/dist/lib/rag/retrieval/vectorQueryTool.d.ts +2 -13
  226. package/dist/lib/rag/retrieval/vectorQueryTool.js +4 -3
  227. package/dist/lib/rag/types.d.ts +3 -3
  228. package/dist/lib/sdk/toolRegistration.d.ts +2 -2
  229. package/dist/lib/server/middleware/cache.d.ts +2 -2
  230. package/dist/lib/server/middleware/rateLimit.d.ts +2 -2
  231. package/dist/lib/server/routes/mcpRoutes.js +277 -249
  232. package/dist/lib/server/routes/memoryRoutes.js +287 -281
  233. package/dist/lib/server/utils/validation.d.ts +10 -10
  234. package/dist/lib/services/server/ai/observability/instrumentation.d.ts +24 -2
  235. package/dist/lib/services/server/ai/observability/instrumentation.js +12 -1
  236. package/dist/lib/session/globalSessionState.d.ts +2 -2
  237. package/dist/lib/telemetry/telemetryService.d.ts +2 -2
  238. package/dist/lib/types/common.d.ts +39 -0
  239. package/dist/lib/types/contextTypes.d.ts +255 -0
  240. package/dist/lib/types/contextTypes.js +0 -2
  241. package/dist/lib/types/conversation.d.ts +62 -0
  242. package/dist/lib/types/conversationMemoryInterface.d.ts +27 -0
  243. package/dist/lib/types/conversationMemoryInterface.js +7 -0
  244. package/dist/lib/types/fileReferenceTypes.d.ts +222 -0
  245. package/dist/lib/types/fileReferenceTypes.js +9 -0
  246. package/dist/lib/types/fileTypes.d.ts +26 -3
  247. package/dist/lib/types/generateTypes.d.ts +50 -1
  248. package/dist/lib/types/index.d.ts +4 -5
  249. package/dist/lib/types/index.js +8 -10
  250. package/dist/lib/types/modelTypes.d.ts +2 -2
  251. package/dist/lib/types/processorTypes.d.ts +597 -0
  252. package/dist/lib/types/processorTypes.js +91 -0
  253. package/dist/lib/types/ragTypes.d.ts +489 -0
  254. package/dist/lib/types/ragTypes.js +8 -0
  255. package/dist/lib/types/sdkTypes.d.ts +17 -18
  256. package/dist/lib/types/streamTypes.d.ts +24 -1
  257. package/dist/lib/utils/async/retry.d.ts +2 -2
  258. package/dist/lib/utils/async/withTimeout.js +3 -1
  259. package/dist/lib/utils/conversationMemory.d.ts +12 -6
  260. package/dist/lib/utils/conversationMemory.js +91 -36
  261. package/dist/lib/utils/errorHandling.d.ts +5 -0
  262. package/dist/lib/utils/errorHandling.js +19 -0
  263. package/dist/lib/utils/fileDetector.d.ts +62 -0
  264. package/dist/lib/utils/fileDetector.js +1014 -14
  265. package/dist/lib/utils/json/safeParse.d.ts +2 -2
  266. package/dist/lib/utils/messageBuilder.js +806 -153
  267. package/dist/lib/utils/modelChoices.d.ts +2 -2
  268. package/dist/lib/utils/multimodalOptionsBuilder.d.ts +2 -1
  269. package/dist/lib/utils/multimodalOptionsBuilder.js +1 -0
  270. package/dist/lib/utils/pricing.d.ts +12 -0
  271. package/dist/lib/utils/pricing.js +134 -0
  272. package/dist/lib/utils/rateLimiter.d.ts +2 -2
  273. package/dist/lib/utils/redis.d.ts +17 -0
  274. package/dist/lib/utils/redis.js +105 -0
  275. package/dist/lib/utils/sanitizers/filename.d.ts +4 -4
  276. package/dist/lib/utils/sanitizers/svg.d.ts +2 -2
  277. package/dist/lib/utils/thinkingConfig.d.ts +6 -6
  278. package/dist/lib/utils/timeout.d.ts +10 -0
  279. package/dist/lib/utils/timeout.js +15 -0
  280. package/dist/lib/utils/tokenEstimation.d.ts +68 -0
  281. package/dist/lib/utils/tokenEstimation.js +113 -0
  282. package/dist/lib/utils/tokenUtils.d.ts +4 -4
  283. package/dist/lib/utils/ttsProcessor.d.ts +2 -2
  284. package/dist/lib/workflow/config.d.ts +150 -150
  285. package/dist/mcp/httpRetryHandler.js +6 -2
  286. package/dist/memory/mem0Initializer.d.ts +2 -2
  287. package/dist/neurolink.d.ts +66 -2
  288. package/dist/neurolink.js +777 -315
  289. package/dist/processors/archive/ArchiveProcessor.d.ts +327 -0
  290. package/dist/processors/archive/ArchiveProcessor.js +1308 -0
  291. package/dist/processors/archive/index.d.ts +33 -0
  292. package/dist/processors/archive/index.js +42 -0
  293. package/dist/processors/base/BaseFileProcessor.js +2 -1
  294. package/dist/processors/base/types.d.ts +70 -64
  295. package/dist/processors/base/types.js +6 -0
  296. package/dist/processors/cli/fileProcessorCli.d.ts +8 -8
  297. package/dist/processors/cli/fileProcessorCli.js +5 -5
  298. package/dist/processors/config/mimeTypes.js +25 -0
  299. package/dist/processors/config/sizeLimits.d.ts +52 -40
  300. package/dist/processors/config/sizeLimits.js +56 -44
  301. package/dist/processors/document/ExcelProcessor.d.ts +14 -0
  302. package/dist/processors/document/ExcelProcessor.js +72 -1
  303. package/dist/processors/document/PptxProcessor.d.ts +63 -0
  304. package/dist/processors/document/PptxProcessor.js +157 -0
  305. package/dist/processors/document/index.d.ts +1 -0
  306. package/dist/processors/document/index.js +6 -0
  307. package/dist/processors/errors/FileErrorCode.d.ts +2 -2
  308. package/dist/processors/errors/errorHelpers.d.ts +2 -2
  309. package/dist/processors/errors/errorHelpers.js +12 -4
  310. package/dist/processors/errors/errorSerializer.d.ts +4 -4
  311. package/dist/processors/index.d.ts +8 -2
  312. package/dist/processors/index.js +5 -2
  313. package/dist/processors/integration/FileProcessorIntegration.d.ts +8 -8
  314. package/dist/processors/integration/FileProcessorIntegration.js +7 -7
  315. package/dist/processors/media/AudioProcessor.d.ts +328 -0
  316. package/dist/processors/media/AudioProcessor.js +707 -0
  317. package/dist/processors/media/VideoProcessor.d.ts +350 -0
  318. package/dist/processors/media/VideoProcessor.js +991 -0
  319. package/dist/processors/media/ffprobe-static.d.ts +4 -0
  320. package/dist/processors/media/index.d.ts +27 -0
  321. package/dist/processors/media/index.js +36 -0
  322. package/dist/processors/registry/ProcessorRegistry.d.ts +19 -5
  323. package/dist/processors/registry/ProcessorRegistry.js +103 -8
  324. package/dist/processors/registry/index.d.ts +1 -1
  325. package/dist/processors/registry/index.js +1 -1
  326. package/dist/processors/registry/types.d.ts +2 -2
  327. package/dist/providers/amazonBedrock.js +2 -1
  328. package/dist/providers/anthropic.js +2 -2
  329. package/dist/providers/anthropicBaseProvider.js +10 -4
  330. package/dist/providers/azureOpenai.js +14 -25
  331. package/dist/providers/googleAiStudio.js +136 -457
  332. package/dist/providers/googleNativeGemini3.d.ts +119 -0
  333. package/dist/providers/googleNativeGemini3.js +263 -0
  334. package/dist/providers/googleVertex.d.ts +15 -1
  335. package/dist/providers/googleVertex.js +341 -775
  336. package/dist/providers/huggingFace.js +20 -5
  337. package/dist/providers/litellm.js +6 -4
  338. package/dist/providers/mistral.js +3 -2
  339. package/dist/providers/openAI.js +2 -2
  340. package/dist/providers/openRouter.js +8 -7
  341. package/dist/providers/openaiCompatible.js +10 -4
  342. package/dist/providers/sagemaker/detection.d.ts +6 -6
  343. package/dist/providers/sagemaker/diagnostics.d.ts +4 -4
  344. package/dist/providers/sagemaker/parsers.d.ts +4 -4
  345. package/dist/rag/chunkers/RecursiveChunker.js +2 -2
  346. package/dist/rag/document/loaders.d.ts +6 -71
  347. package/dist/rag/document/loaders.js +5 -5
  348. package/dist/rag/graphRag/graphRAG.js +26 -9
  349. package/dist/rag/metadata/MetadataExtractorFactory.d.ts +5 -55
  350. package/dist/rag/metadata/metadataExtractor.js +6 -3
  351. package/dist/rag/pipeline/RAGPipeline.d.ts +8 -126
  352. package/dist/rag/pipeline/RAGPipeline.js +11 -11
  353. package/dist/rag/pipeline/contextAssembly.d.ts +3 -42
  354. package/dist/rag/pipeline/contextAssembly.js +6 -3
  355. package/dist/rag/reranker/RerankerFactory.d.ts +5 -60
  356. package/dist/rag/resilience/CircuitBreaker.d.ts +3 -33
  357. package/dist/rag/resilience/RetryHandler.d.ts +2 -21
  358. package/dist/rag/resilience/RetryHandler.js +6 -2
  359. package/dist/rag/retrieval/hybridSearch.d.ts +3 -41
  360. package/dist/rag/retrieval/vectorQueryTool.d.ts +2 -13
  361. package/dist/rag/retrieval/vectorQueryTool.js +4 -3
  362. package/dist/rag/types.d.ts +3 -3
  363. package/dist/sdk/toolRegistration.d.ts +2 -2
  364. package/dist/server/middleware/cache.d.ts +2 -2
  365. package/dist/server/middleware/rateLimit.d.ts +2 -2
  366. package/dist/server/routes/mcpRoutes.js +277 -249
  367. package/dist/server/routes/memoryRoutes.js +287 -281
  368. package/dist/server/utils/validation.d.ts +4 -4
  369. package/dist/services/server/ai/observability/instrumentation.d.ts +24 -2
  370. package/dist/services/server/ai/observability/instrumentation.js +12 -1
  371. package/dist/session/globalSessionState.d.ts +2 -2
  372. package/dist/telemetry/telemetryService.d.ts +2 -2
  373. package/dist/types/common.d.ts +39 -0
  374. package/dist/types/contextTypes.d.ts +255 -0
  375. package/dist/types/contextTypes.js +0 -2
  376. package/dist/types/conversation.d.ts +62 -0
  377. package/dist/types/conversationMemoryInterface.d.ts +27 -0
  378. package/dist/types/conversationMemoryInterface.js +6 -0
  379. package/dist/types/fileReferenceTypes.d.ts +222 -0
  380. package/dist/types/fileReferenceTypes.js +8 -0
  381. package/dist/types/fileTypes.d.ts +26 -3
  382. package/dist/types/generateTypes.d.ts +50 -1
  383. package/dist/types/index.d.ts +4 -5
  384. package/dist/types/index.js +8 -10
  385. package/dist/types/processorTypes.d.ts +597 -0
  386. package/dist/types/processorTypes.js +90 -0
  387. package/dist/types/ragTypes.d.ts +489 -0
  388. package/dist/types/ragTypes.js +7 -0
  389. package/dist/types/sdkTypes.d.ts +17 -18
  390. package/dist/types/streamTypes.d.ts +24 -1
  391. package/dist/utils/async/retry.d.ts +2 -2
  392. package/dist/utils/async/withTimeout.js +3 -1
  393. package/dist/utils/conversationMemory.d.ts +12 -6
  394. package/dist/utils/conversationMemory.js +91 -36
  395. package/dist/utils/errorHandling.d.ts +5 -0
  396. package/dist/utils/errorHandling.js +19 -0
  397. package/dist/utils/fileDetector.d.ts +62 -0
  398. package/dist/utils/fileDetector.js +1014 -14
  399. package/dist/utils/json/safeParse.d.ts +2 -2
  400. package/dist/utils/messageBuilder.js +806 -153
  401. package/dist/utils/modelChoices.d.ts +2 -2
  402. package/dist/utils/multimodalOptionsBuilder.d.ts +2 -1
  403. package/dist/utils/multimodalOptionsBuilder.js +1 -0
  404. package/dist/utils/pricing.d.ts +12 -0
  405. package/dist/utils/pricing.js +133 -0
  406. package/dist/utils/rateLimiter.d.ts +2 -2
  407. package/dist/utils/redis.d.ts +17 -0
  408. package/dist/utils/redis.js +105 -0
  409. package/dist/utils/sanitizers/filename.d.ts +4 -4
  410. package/dist/utils/sanitizers/svg.d.ts +2 -2
  411. package/dist/utils/thinkingConfig.d.ts +6 -6
  412. package/dist/utils/timeout.d.ts +10 -0
  413. package/dist/utils/timeout.js +15 -0
  414. package/dist/utils/tokenEstimation.d.ts +68 -0
  415. package/dist/utils/tokenEstimation.js +112 -0
  416. package/dist/utils/tokenUtils.d.ts +4 -4
  417. package/dist/utils/ttsProcessor.d.ts +2 -2
  418. package/dist/workflow/config.d.ts +104 -104
  419. package/package.json +18 -6
  420. package/dist/lib/utils/conversationMemoryUtils.d.ts +0 -25
  421. package/dist/lib/utils/conversationMemoryUtils.js +0 -138
  422. package/dist/utils/conversationMemoryUtils.d.ts +0 -25
  423. package/dist/utils/conversationMemoryUtils.js +0 -137
@@ -6,11 +6,11 @@ import { AIProviderName } from "../constants/enums.js";
6
6
  /**
7
7
  * Model choice for CLI prompts (inquirer format)
8
8
  */
9
- export interface ModelChoice {
9
+ export type ModelChoice = {
10
10
  name: string;
11
11
  value: string;
12
12
  description?: string;
13
- }
13
+ };
14
14
  /**
15
15
  * Default models per provider (first choice/recommended)
16
16
  */
@@ -46,7 +46,7 @@ export declare function buildMultimodalOptions(options: StreamOptions, providerN
46
46
  text: string;
47
47
  images: (string | Buffer<ArrayBufferLike> | import("../index.js").ImageWithAltText)[] | undefined;
48
48
  content: import("../index.js").Content[] | undefined;
49
- files: (string | Buffer<ArrayBufferLike>)[] | undefined;
49
+ files: (string | Buffer<ArrayBufferLike> | import("../index.js").FileWithMetadata)[] | undefined;
50
50
  csvFiles: (string | Buffer<ArrayBufferLike>)[] | undefined;
51
51
  pdfFiles: (string | Buffer<ArrayBufferLike>)[] | undefined;
52
52
  };
@@ -64,4 +64,5 @@ export declare function buildMultimodalOptions(options: StreamOptions, providerN
64
64
  enableAnalytics: boolean | undefined;
65
65
  enableEvaluation: boolean | undefined;
66
66
  context: import("../index.js").UnknownRecord | undefined;
67
+ fileRegistry: unknown;
67
68
  };
@@ -60,5 +60,6 @@ export function buildMultimodalOptions(options, providerName, modelName) {
60
60
  enableAnalytics: options.enableAnalytics,
61
61
  enableEvaluation: options.enableEvaluation,
62
62
  context: options.context,
63
+ fileRegistry: options.fileRegistry,
63
64
  };
64
65
  }
@@ -0,0 +1,12 @@
1
+ import type { TokenUsage } from "../types/analytics.js";
2
+ /**
3
+ * Calculate the dollar cost of a generate/stream call based on token usage.
4
+ * Returns 0 if the provider/model combination is not in the pricing table.
5
+ */
6
+ export declare function calculateCost(provider: string, model: string, usage: TokenUsage): number;
7
+ /**
8
+ * Check if pricing is available for a provider/model combination.
9
+ * Checks the rate table directly instead of computing a cost,
10
+ * so even very cheap models (e.g. gemini-1.5-flash) are detected correctly.
11
+ */
12
+ export declare function hasPricing(provider: string, model: string): boolean;
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Per-token pricing data (USD per token). Updated Feb 2026.
3
+ * Sources:
4
+ * - Anthropic: https://www.anthropic.com/pricing
5
+ * - OpenAI: https://openai.com/api/pricing
6
+ * - Google: https://ai.google.dev/pricing
7
+ *
8
+ * Note: Not all supported providers have pricing data. Missing providers
9
+ * (Bedrock, Azure, Mistral, etc.) will return 0 from calculateCost().
10
+ */
11
+ const PRICING = {
12
+ // Anthropic (direct API)
13
+ anthropic: {
14
+ "claude-sonnet-4-5-20250929": {
15
+ input: 3.0 / 1_000_000,
16
+ output: 15.0 / 1_000_000,
17
+ cacheRead: 0.3 / 1_000_000,
18
+ cacheCreation: 3.75 / 1_000_000,
19
+ },
20
+ "claude-opus-4-6": {
21
+ input: 15.0 / 1_000_000,
22
+ output: 75.0 / 1_000_000,
23
+ cacheRead: 1.5 / 1_000_000,
24
+ cacheCreation: 18.75 / 1_000_000,
25
+ },
26
+ "claude-haiku-4-5-20251001": {
27
+ input: 0.8 / 1_000_000,
28
+ output: 4.0 / 1_000_000,
29
+ cacheRead: 0.08 / 1_000_000,
30
+ cacheCreation: 1.0 / 1_000_000,
31
+ },
32
+ },
33
+ // Google Vertex AI (same models, same pricing)
34
+ vertex: {
35
+ "claude-sonnet-4-5@20250929": {
36
+ input: 3.0 / 1_000_000,
37
+ output: 15.0 / 1_000_000,
38
+ cacheRead: 0.3 / 1_000_000,
39
+ cacheCreation: 3.75 / 1_000_000,
40
+ },
41
+ "claude-opus-4-6": {
42
+ input: 15.0 / 1_000_000,
43
+ output: 75.0 / 1_000_000,
44
+ cacheRead: 1.5 / 1_000_000,
45
+ cacheCreation: 18.75 / 1_000_000,
46
+ },
47
+ "claude-haiku-4-5@20251001": {
48
+ input: 0.8 / 1_000_000,
49
+ output: 4.0 / 1_000_000,
50
+ cacheRead: 0.08 / 1_000_000,
51
+ cacheCreation: 1.0 / 1_000_000,
52
+ },
53
+ },
54
+ // OpenAI
55
+ openai: {
56
+ "gpt-4o": { input: 2.5 / 1_000_000, output: 10.0 / 1_000_000 },
57
+ "gpt-4o-mini": { input: 0.15 / 1_000_000, output: 0.6 / 1_000_000 },
58
+ "gpt-4-turbo": { input: 10.0 / 1_000_000, output: 30.0 / 1_000_000 },
59
+ o1: { input: 15.0 / 1_000_000, output: 60.0 / 1_000_000 },
60
+ "o1-mini": { input: 1.1 / 1_000_000, output: 4.4 / 1_000_000 },
61
+ },
62
+ // Google (Gemini)
63
+ google: {
64
+ "gemini-2.0-flash": { input: 0.1 / 1_000_000, output: 0.4 / 1_000_000 },
65
+ "gemini-2.0-pro": { input: 1.25 / 1_000_000, output: 10.0 / 1_000_000 },
66
+ "gemini-1.5-pro": { input: 1.25 / 1_000_000, output: 5.0 / 1_000_000 },
67
+ "gemini-1.5-flash": { input: 0.075 / 1_000_000, output: 0.3 / 1_000_000 },
68
+ },
69
+ };
70
+ /**
71
+ * Map of normalized provider aliases to canonical PRICING keys.
72
+ * After stripping non-alpha characters, e.g. "google-ai" becomes "googleai".
73
+ */
74
+ const PROVIDER_ALIASES = {
75
+ googleai: "google",
76
+ googleaistudio: "google",
77
+ anthropic: "anthropic",
78
+ openai: "openai",
79
+ vertex: "vertex",
80
+ google: "google",
81
+ };
82
+ /**
83
+ * Look up per-token rates for a provider/model combination.
84
+ * Normalises the provider name via aliases, then tries an exact model match
85
+ * followed by a longest-prefix match so that e.g. "gpt-4o-2024-08-06"
86
+ * resolves to the "gpt-4o" entry without a false hit on "gpt-4".
87
+ *
88
+ * @returns The rate entry, or undefined when the combination is unknown.
89
+ */
90
+ function findRates(provider, model) {
91
+ const stripped = provider.toLowerCase().replace(/[^a-z]/g, "");
92
+ const normalizedProvider = PROVIDER_ALIASES[stripped] ?? stripped;
93
+ const providerPricing = PRICING[normalizedProvider] || PRICING[provider];
94
+ if (!providerPricing) {
95
+ return undefined;
96
+ }
97
+ // Exact match
98
+ if (providerPricing[model]) {
99
+ return providerPricing[model];
100
+ }
101
+ // Longest-prefix match
102
+ const sortedKeys = Object.keys(providerPricing).sort((a, b) => b.length - a.length);
103
+ const key = sortedKeys.find((k) => model.startsWith(k));
104
+ return key ? providerPricing[key] : undefined;
105
+ }
106
+ /**
107
+ * Calculate the dollar cost of a generate/stream call based on token usage.
108
+ * Returns 0 if the provider/model combination is not in the pricing table.
109
+ */
110
+ export function calculateCost(provider, model, usage) {
111
+ const rates = findRates(provider, model);
112
+ if (!rates) {
113
+ return 0;
114
+ }
115
+ let cost = 0;
116
+ cost += (usage.input || 0) * rates.input;
117
+ cost += (usage.output || 0) * rates.output;
118
+ if (usage.cacheReadTokens && rates.cacheRead) {
119
+ cost += usage.cacheReadTokens * rates.cacheRead;
120
+ }
121
+ if (usage.cacheCreationTokens && rates.cacheCreation) {
122
+ cost += usage.cacheCreationTokens * rates.cacheCreation;
123
+ }
124
+ return Math.round(cost * 1_000_000) / 1_000_000; // Round to 6 decimal places
125
+ }
126
+ /**
127
+ * Check if pricing is available for a provider/model combination.
128
+ * Checks the rate table directly instead of computing a cost,
129
+ * so even very cheap models (e.g. gemini-1.5-flash) are detected correctly.
130
+ */
131
+ export function hasPricing(provider, model) {
132
+ return findRates(provider, model) !== undefined;
133
+ }
@@ -9,7 +9,7 @@
9
9
  /**
10
10
  * Configuration options for the rate limiter
11
11
  */
12
- export interface RateLimiterConfig {
12
+ export type RateLimiterConfig = {
13
13
  /** Maximum tokens (downloads) allowed per interval */
14
14
  maxTokens: number;
15
15
  /** Refill interval in milliseconds */
@@ -20,7 +20,7 @@ export interface RateLimiterConfig {
20
20
  maxQueueSize: number;
21
21
  /** Timeout for queued requests in milliseconds */
22
22
  queueTimeoutMs: number;
23
- }
23
+ };
24
24
  /**
25
25
  * Token Bucket Rate Limiter
26
26
  *
@@ -5,6 +5,23 @@
5
5
  import { createClient } from "redis";
6
6
  import type { RedisStorageConfig, RedisConversationObject } from "../types/conversation.js";
7
7
  type RedisClient = ReturnType<typeof createClient>;
8
+ /**
9
+ * Get a pooled Redis connection. Multiple callers with the same host:port:db
10
+ * share a single connection, reducing connection count.
11
+ */
12
+ export declare function getPooledRedisClient(config: Required<RedisStorageConfig>): Promise<RedisClient>;
13
+ /**
14
+ * Release a pooled Redis connection. Only closes when refCount reaches 0.
15
+ */
16
+ export declare function releasePooledRedisClient(config: Required<RedisStorageConfig>): Promise<void>;
17
+ /**
18
+ * Get stats about the connection pool
19
+ */
20
+ export declare function getPoolStats(): Array<{
21
+ key: string;
22
+ refCount: number;
23
+ isOpen: boolean;
24
+ }>;
8
25
  /**
9
26
  * Creates a Redis client with the provided configuration
10
27
  */
@@ -4,6 +4,111 @@
4
4
  */
5
5
  import { createClient } from "redis";
6
6
  import { logger } from "./logger.js";
7
+ // Connection pool - keyed by host:port:db
8
+ const connectionPool = new Map();
9
+ const pendingConnections = new Map();
10
+ /**
11
+ * Get a pooled Redis connection. Multiple callers with the same host:port:db
12
+ * share a single connection, reducing connection count.
13
+ */
14
+ export async function getPooledRedisClient(config) {
15
+ const key = `${config.host}:${config.port}:${config.db}:${config.password ? "auth" : "noauth"}`;
16
+ const existing = connectionPool.get(key);
17
+ if (existing && existing.client.isOpen) {
18
+ existing.refCount++;
19
+ logger.debug("[Redis] Reusing pooled connection", {
20
+ key,
21
+ refCount: existing.refCount,
22
+ });
23
+ return existing.client;
24
+ }
25
+ // Check pending BEFORE cleaning up stale entries to prevent TOCTOU race:
26
+ // Two callers seeing a stale entry could both skip this check and both
27
+ // attempt to create new connections if we cleaned up first.
28
+ const pending = pendingConnections.get(key);
29
+ if (pending) {
30
+ const client = await pending;
31
+ const entry = connectionPool.get(key);
32
+ if (entry) {
33
+ if (!entry.client.isOpen) {
34
+ // Client was closed while awaiting; clean up and create fresh
35
+ connectionPool.delete(key);
36
+ const freshClient = await createRedisClient(config);
37
+ connectionPool.set(key, { client: freshClient, refCount: 1 });
38
+ return freshClient;
39
+ }
40
+ entry.refCount++;
41
+ }
42
+ else if (client.isOpen) {
43
+ // Entry was released while we awaited; re-register
44
+ connectionPool.set(key, { client, refCount: 1 });
45
+ }
46
+ else {
47
+ // Client was closed while we awaited; create fresh connection
48
+ const freshClient = await createRedisClient(config);
49
+ connectionPool.set(key, { client: freshClient, refCount: 1 });
50
+ return freshClient;
51
+ }
52
+ return client;
53
+ }
54
+ // Clean up stale entry if exists (connection closed)
55
+ if (existing) {
56
+ connectionPool.delete(key);
57
+ }
58
+ // Create the promise and register it in pendingConnections atomically
59
+ // (synchronous) before any await, so concurrent callers will find it.
60
+ const connectPromise = createRedisClient(config);
61
+ pendingConnections.set(key, connectPromise);
62
+ try {
63
+ const client = await connectPromise;
64
+ connectionPool.set(key, { client, refCount: 1 });
65
+ logger.info("[Redis] Created pooled connection", { key, refCount: 1 });
66
+ return client;
67
+ }
68
+ finally {
69
+ pendingConnections.delete(key);
70
+ }
71
+ }
72
+ /**
73
+ * Release a pooled Redis connection. Only closes when refCount reaches 0.
74
+ */
75
+ export async function releasePooledRedisClient(config) {
76
+ const key = `${config.host}:${config.port}:${config.db}:${config.password ? "auth" : "noauth"}`;
77
+ const entry = connectionPool.get(key);
78
+ if (!entry) {
79
+ return;
80
+ }
81
+ entry.refCount--;
82
+ logger.debug("[Redis] Released pooled connection", {
83
+ key,
84
+ refCount: entry.refCount,
85
+ });
86
+ if (entry.refCount <= 0) {
87
+ try {
88
+ if (entry.client.isOpen) {
89
+ await entry.client.quit();
90
+ }
91
+ }
92
+ catch (e) {
93
+ logger.warn("[Redis] Error closing pooled connection", {
94
+ key,
95
+ error: String(e),
96
+ });
97
+ }
98
+ connectionPool.delete(key);
99
+ logger.info("[Redis] Closed pooled connection", { key });
100
+ }
101
+ }
102
+ /**
103
+ * Get stats about the connection pool
104
+ */
105
+ export function getPoolStats() {
106
+ return Array.from(connectionPool.entries()).map(([key, entry]) => ({
107
+ key,
108
+ refCount: entry.refCount,
109
+ isOpen: entry.client.isOpen,
110
+ }));
111
+ }
7
112
  /**
8
113
  * Creates a Redis client with the provided configuration
9
114
  */
@@ -12,7 +12,7 @@
12
12
  /**
13
13
  * Options for filename sanitization.
14
14
  */
15
- export interface SanitizeFileNameOptions {
15
+ export type SanitizeFileNameOptions = {
16
16
  /** Maximum length for the filename (default: 255) */
17
17
  maxLength?: number;
18
18
  /** Replacement character for invalid chars (default: '_') */
@@ -21,16 +21,16 @@ export interface SanitizeFileNameOptions {
21
21
  blockDangerousExtensions?: boolean;
22
22
  /** Whether to allow hidden files starting with dot (default: false) */
23
23
  allowHiddenFiles?: boolean;
24
- }
24
+ };
25
25
  /**
26
26
  * Options for display name sanitization.
27
27
  */
28
- export interface SanitizeDisplayNameOptions {
28
+ export type SanitizeDisplayNameOptions = {
29
29
  /** Maximum length for the name (default: 100) */
30
30
  maxLength?: number;
31
31
  /** Whether to allow unicode characters (default: true) */
32
32
  allowUnicode?: boolean;
33
- }
33
+ };
34
34
  /**
35
35
  * Sanitize a filename for safe filesystem storage.
36
36
  * Removes characters that are invalid on various operating systems.
@@ -19,14 +19,14 @@
19
19
  /**
20
20
  * Result of SVG sanitization including metadata about removed content
21
21
  */
22
- export interface SvgSanitizationResult {
22
+ export type SvgSanitizationResult = {
23
23
  /** Sanitized SVG content */
24
24
  content: string;
25
25
  /** Items that were removed during sanitization */
26
26
  removedItems: string[];
27
27
  /** Whether any content was modified */
28
28
  wasModified: boolean;
29
- }
29
+ };
30
30
  /**
31
31
  * Sanitize SVG content by removing dangerous elements and attributes.
32
32
  * Uses OWASP-compliant allowlist approach with regex-based parsing.
@@ -11,32 +11,32 @@ export type ThinkingLevel = "minimal" | "low" | "medium" | "high";
11
11
  /**
12
12
  * ThinkingConfig interface matching the SDK's expected structure
13
13
  */
14
- export interface ThinkingConfig {
14
+ export type ThinkingConfig = {
15
15
  enabled?: boolean;
16
16
  type?: "enabled" | "disabled";
17
17
  /** Token budget for thinking (Anthropic models: 5000-100000) */
18
18
  budgetTokens?: number;
19
19
  /** Thinking level for Gemini 3 models */
20
20
  thinkingLevel?: ThinkingLevel;
21
- }
21
+ };
22
22
  /**
23
23
  * Options for creating a thinkingConfig from CLI-style options
24
24
  */
25
- export interface CreateThinkingConfigOptions {
25
+ export type CreateThinkingConfigOptions = {
26
26
  /** Enable thinking mode */
27
27
  thinking?: boolean;
28
28
  /** Token budget for thinking (defaults to 10000) */
29
29
  thinkingBudget?: number;
30
30
  /** Thinking level for Gemini 3 models */
31
31
  thinkingLevel?: ThinkingLevel;
32
- }
32
+ };
33
33
  /**
34
34
  * Native SDK thinkingConfig structure for Gemini native SDK.
35
35
  */
36
- export interface NativeThinkingConfig {
36
+ export type NativeThinkingConfig = {
37
37
  includeThoughts: boolean;
38
38
  thinkingLevel: ThinkingLevel;
39
- }
39
+ };
40
40
  /**
41
41
  * Default token budget for thinking operations
42
42
  */
@@ -117,6 +117,16 @@ export declare function createTimeoutController(timeout: number | string | undef
117
117
  cleanup: () => void;
118
118
  timeoutMs: number;
119
119
  } | null;
120
+ /**
121
+ * Compose an external abort signal with a timeout controller's signal.
122
+ * Returns a single AbortSignal that fires when either signal aborts.
123
+ * If only one signal is present, returns it directly without wrapping.
124
+ *
125
+ * @param externalSignal - User-provided AbortSignal (e.g., from options.abortSignal)
126
+ * @param timeoutSignal - Timeout controller's signal
127
+ * @returns Combined AbortSignal, or undefined if neither is present
128
+ */
129
+ export declare function composeAbortSignals(externalSignal?: AbortSignal, timeoutSignal?: AbortSignal): AbortSignal | undefined;
120
130
  /**
121
131
  * Merge abort signals (for combining user abort with timeout)
122
132
  * @param signals - Array of abort signals to merge
@@ -320,6 +320,21 @@ export function createTimeoutController(timeout, provider, operation) {
320
320
  };
321
321
  return { controller, cleanup, timeoutMs };
322
322
  }
323
+ /**
324
+ * Compose an external abort signal with a timeout controller's signal.
325
+ * Returns a single AbortSignal that fires when either signal aborts.
326
+ * If only one signal is present, returns it directly without wrapping.
327
+ *
328
+ * @param externalSignal - User-provided AbortSignal (e.g., from options.abortSignal)
329
+ * @param timeoutSignal - Timeout controller's signal
330
+ * @returns Combined AbortSignal, or undefined if neither is present
331
+ */
332
+ export function composeAbortSignals(externalSignal, timeoutSignal) {
333
+ if (externalSignal && timeoutSignal) {
334
+ return AbortSignal.any([externalSignal, timeoutSignal]);
335
+ }
336
+ return externalSignal ?? timeoutSignal;
337
+ }
323
338
  /**
324
339
  * Merge abort signals (for combining user abort with timeout)
325
340
  * @param signals - Array of abort signals to merge
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Token Estimation Utilities
3
+ *
4
+ * Provides character-based token estimation with per-provider adjustment
5
+ * multipliers. Uses the same approach as Continue (gpt-tokenizer baseline
6
+ * + provider multipliers) but without requiring a tokenizer dependency.
7
+ *
8
+ * Multiplier sources: Continue project's getAdjustedTokenCount.ts
9
+ * - Anthropic: 1.23x (Anthropic tokenizer produces ~23% more tokens)
10
+ * - Google (AI Studio / Vertex): 1.18x
11
+ * - Mistral/Codestral: 1.26x
12
+ * - OpenAI/GPT: 1.0x (baseline)
13
+ */
14
+ import type { ChatMessage } from "../types/conversation.js";
15
+ /** Characters per token for English text */
16
+ export declare const CHARS_PER_TOKEN = 4;
17
+ /** Characters per token for code */
18
+ export declare const CODE_CHARS_PER_TOKEN = 3;
19
+ /** Safety margin to avoid underestimation */
20
+ export declare const TOKEN_SAFETY_MARGIN = 1.15;
21
+ /** Message framing overhead in tokens (role + delimiters) */
22
+ export declare const TOKENS_PER_MESSAGE = 4;
23
+ /** Conversation-level overhead in tokens */
24
+ export declare const TOKENS_PER_CONVERSATION = 24;
25
+ /** Image token estimate (flat) */
26
+ export declare const IMAGE_TOKEN_ESTIMATE = 1024;
27
+ /**
28
+ * Get the token multiplier for a given provider.
29
+ */
30
+ export declare function getProviderMultiplier(provider?: string): number;
31
+ /**
32
+ * Estimate token count for a string.
33
+ *
34
+ * @param text - Input text
35
+ * @param provider - Optional provider for multiplier adjustment
36
+ * @param isCode - Whether the text is code (uses CODE_CHARS_PER_TOKEN)
37
+ * @returns Estimated token count
38
+ */
39
+ export declare function estimateTokens(text: string, provider?: string, isCode?: boolean): number;
40
+ /**
41
+ * Estimate token count for a single ChatMessage.
42
+ * Includes message framing overhead.
43
+ */
44
+ export declare function estimateMessageTokens(message: ChatMessage | {
45
+ role: string;
46
+ content: string;
47
+ }, provider?: string): number;
48
+ /**
49
+ * Estimate total token count for an array of messages.
50
+ * Includes conversation-level overhead.
51
+ */
52
+ export declare function estimateMessagesTokens(messages: Array<ChatMessage | {
53
+ role: string;
54
+ content: string;
55
+ }>, provider?: string): number;
56
+ /**
57
+ * Truncate text to fit within a token budget.
58
+ * Tries to cut at sentence or word boundaries.
59
+ *
60
+ * @param text - Input text
61
+ * @param maxTokens - Maximum tokens allowed
62
+ * @param provider - Optional provider for multiplier
63
+ * @returns Truncated text with "..." suffix if truncated
64
+ */
65
+ export declare function truncateToTokenBudget(text: string, maxTokens: number, provider?: string): {
66
+ text: string;
67
+ truncated: boolean;
68
+ };
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Token Estimation Utilities
3
+ *
4
+ * Provides character-based token estimation with per-provider adjustment
5
+ * multipliers. Uses the same approach as Continue (gpt-tokenizer baseline
6
+ * + provider multipliers) but without requiring a tokenizer dependency.
7
+ *
8
+ * Multiplier sources: Continue project's getAdjustedTokenCount.ts
9
+ * - Anthropic: 1.23x (Anthropic tokenizer produces ~23% more tokens)
10
+ * - Google (AI Studio / Vertex): 1.18x
11
+ * - Mistral/Codestral: 1.26x
12
+ * - OpenAI/GPT: 1.0x (baseline)
13
+ */
14
+ /** Characters per token for English text */
15
+ export const CHARS_PER_TOKEN = 4;
16
+ /** Characters per token for code */
17
+ export const CODE_CHARS_PER_TOKEN = 3;
18
+ /** Safety margin to avoid underestimation */
19
+ export const TOKEN_SAFETY_MARGIN = 1.15;
20
+ /** Message framing overhead in tokens (role + delimiters) */
21
+ export const TOKENS_PER_MESSAGE = 4;
22
+ /** Conversation-level overhead in tokens */
23
+ export const TOKENS_PER_CONVERSATION = 24;
24
+ /** Image token estimate (flat) */
25
+ export const IMAGE_TOKEN_ESTIMATE = 1_024;
26
+ /**
27
+ * Per-provider token multipliers.
28
+ * Applied on top of the base GPT-style character estimate.
29
+ */
30
+ const PROVIDER_MULTIPLIERS = {
31
+ anthropic: 1.23,
32
+ "google-ai": 1.18,
33
+ vertex: 1.18,
34
+ mistral: 1.26,
35
+ openai: 1.0,
36
+ azure: 1.0,
37
+ bedrock: 1.23, // Bedrock is mostly Anthropic models
38
+ ollama: 1.0,
39
+ litellm: 1.0,
40
+ huggingface: 1.0,
41
+ sagemaker: 1.0,
42
+ };
43
+ /**
44
+ * Get the token multiplier for a given provider.
45
+ */
46
+ export function getProviderMultiplier(provider) {
47
+ if (!provider) {
48
+ return 1.0;
49
+ }
50
+ return PROVIDER_MULTIPLIERS[provider] ?? 1.0;
51
+ }
52
+ /**
53
+ * Estimate token count for a string.
54
+ *
55
+ * @param text - Input text
56
+ * @param provider - Optional provider for multiplier adjustment
57
+ * @param isCode - Whether the text is code (uses CODE_CHARS_PER_TOKEN)
58
+ * @returns Estimated token count
59
+ */
60
+ export function estimateTokens(text, provider, isCode) {
61
+ if (!text || text.length === 0) {
62
+ return 0;
63
+ }
64
+ const charsPerToken = isCode ? CODE_CHARS_PER_TOKEN : CHARS_PER_TOKEN;
65
+ const baseTokens = Math.ceil(text.length / charsPerToken);
66
+ const multiplier = getProviderMultiplier(provider);
67
+ return Math.ceil(baseTokens * multiplier * TOKEN_SAFETY_MARGIN);
68
+ }
69
+ /**
70
+ * Estimate token count for a single ChatMessage.
71
+ * Includes message framing overhead.
72
+ */
73
+ export function estimateMessageTokens(message, provider) {
74
+ const contentTokens = estimateTokens(message.content || "", provider);
75
+ return contentTokens + TOKENS_PER_MESSAGE;
76
+ }
77
+ /**
78
+ * Estimate total token count for an array of messages.
79
+ * Includes conversation-level overhead.
80
+ */
81
+ export function estimateMessagesTokens(messages, provider) {
82
+ if (!messages || messages.length === 0) {
83
+ return 0;
84
+ }
85
+ const messageTokens = messages.reduce((sum, msg) => sum + estimateMessageTokens(msg, provider), 0);
86
+ return messageTokens + TOKENS_PER_CONVERSATION;
87
+ }
88
+ /**
89
+ * Truncate text to fit within a token budget.
90
+ * Tries to cut at sentence or word boundaries.
91
+ *
92
+ * @param text - Input text
93
+ * @param maxTokens - Maximum tokens allowed
94
+ * @param provider - Optional provider for multiplier
95
+ * @returns Truncated text with "..." suffix if truncated
96
+ */
97
+ export function truncateToTokenBudget(text, maxTokens, provider) {
98
+ if (estimateTokens(text, provider) <= maxTokens) {
99
+ return { text, truncated: false };
100
+ }
101
+ const multiplier = getProviderMultiplier(provider);
102
+ const safetyFactor = multiplier * TOKEN_SAFETY_MARGIN;
103
+ const maxChars = Math.floor((maxTokens / safetyFactor) * CHARS_PER_TOKEN);
104
+ if (maxChars <= 0) {
105
+ return { text: "", truncated: true };
106
+ }
107
+ // Try to cut at sentence boundary
108
+ const candidate = text.slice(0, maxChars);
109
+ const lastSentence = Math.max(candidate.lastIndexOf(". "), candidate.lastIndexOf("! "), candidate.lastIndexOf("? "), candidate.lastIndexOf("\n"));
110
+ const cutPoint = lastSentence > maxChars * 0.5 ? lastSentence + 1 : maxChars;
111
+ return { text: text.slice(0, cutPoint) + "...", truncated: true };
112
+ }
@@ -12,7 +12,7 @@ import type { TokenUsage } from "../types/analytics.js";
12
12
  * Raw usage object that may come from various AI providers
13
13
  * Supports multiple naming conventions and nested structures
14
14
  */
15
- export interface RawUsageObject {
15
+ export type RawUsageObject = {
16
16
  input?: number;
17
17
  output?: number;
18
18
  total?: number;
@@ -30,11 +30,11 @@ export interface RawUsageObject {
30
30
  reasoning_tokens?: number;
31
31
  thinkingTokens?: number;
32
32
  usage?: RawUsageObject;
33
- }
33
+ };
34
34
  /**
35
35
  * Options for token extraction behavior
36
36
  */
37
- export interface TokenExtractionOptions {
37
+ export type TokenExtractionOptions = {
38
38
  /**
39
39
  * Whether to calculate cache savings percentage
40
40
  * @default true
@@ -46,7 +46,7 @@ export interface TokenExtractionOptions {
46
46
  * - "undefined": Return undefined for missing optional fields (default)
47
47
  */
48
48
  missingOptionalBehavior?: "zero" | "undefined";
49
- }
49
+ };
50
50
  /**
51
51
  * Extract input token count from various provider formats
52
52
  * Priority: input > inputTokens > promptTokens