@vybestack/llxprt-code-core 0.1.12 → 0.1.13

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 (329) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +256 -0
  3. package/dist/src/adapters/IStreamAdapter.d.ts +18 -0
  4. package/dist/src/adapters/IStreamAdapter.js +7 -0
  5. package/dist/src/adapters/IStreamAdapter.js.map +1 -0
  6. package/dist/src/code_assist/oauth2.d.ts +1 -1
  7. package/dist/src/code_assist/oauth2.js +51 -29
  8. package/dist/src/code_assist/oauth2.js.map +1 -1
  9. package/dist/src/code_assist/oauth2.test.js +36 -7
  10. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  11. package/dist/src/code_assist/server.test.js +10 -2
  12. package/dist/src/code_assist/server.test.js.map +1 -1
  13. package/dist/src/config/config.d.ts +28 -5
  14. package/dist/src/config/config.js +29 -4
  15. package/dist/src/config/config.js.map +1 -1
  16. package/dist/src/config/config.test.js +2 -3
  17. package/dist/src/config/config.test.js.map +1 -1
  18. package/dist/src/core/client.d.ts +4 -2
  19. package/dist/src/core/client.js +68 -7
  20. package/dist/src/core/client.js.map +1 -1
  21. package/dist/src/core/client.test.js +8 -0
  22. package/dist/src/core/client.test.js.map +1 -1
  23. package/dist/src/core/contentGenerator.d.ts +3 -2
  24. package/dist/src/core/contentGenerator.js +6 -8
  25. package/dist/src/core/contentGenerator.js.map +1 -1
  26. package/dist/src/core/contentGenerator.test.js +12 -5
  27. package/dist/src/core/contentGenerator.test.js.map +1 -1
  28. package/dist/src/core/coreToolScheduler.test.js +4 -2
  29. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  30. package/dist/src/core/geminiChat.js +50 -3
  31. package/dist/src/core/geminiChat.js.map +1 -1
  32. package/dist/src/core/modelCheck.d.ts +1 -1
  33. package/dist/src/core/modelCheck.js +10 -3
  34. package/dist/src/core/modelCheck.js.map +1 -1
  35. package/dist/src/core/nonInteractiveToolExecutor.test.js +3 -0
  36. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  37. package/dist/src/core/prompts.d.ts +1 -1
  38. package/dist/src/core/prompts.js +14 -2
  39. package/dist/src/core/prompts.js.map +1 -1
  40. package/dist/src/core/turn.js +6 -0
  41. package/dist/src/core/turn.js.map +1 -1
  42. package/dist/src/index.d.ts +29 -1
  43. package/dist/src/index.js +33 -0
  44. package/dist/src/index.js.map +1 -1
  45. package/dist/src/mcp/oauth-provider.d.ts +142 -0
  46. package/dist/src/mcp/oauth-provider.js +446 -0
  47. package/dist/src/mcp/oauth-provider.js.map +1 -0
  48. package/dist/src/mcp/oauth-provider.test.js +520 -0
  49. package/dist/src/mcp/oauth-provider.test.js.map +1 -0
  50. package/dist/src/mcp/oauth-token-storage.d.ts +81 -0
  51. package/dist/src/mcp/oauth-token-storage.js +149 -0
  52. package/dist/src/mcp/oauth-token-storage.js.map +1 -0
  53. package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
  54. package/dist/src/mcp/oauth-token-storage.test.js +205 -0
  55. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
  56. package/dist/src/mcp/oauth-utils.d.ts +109 -0
  57. package/dist/src/mcp/oauth-utils.js +183 -0
  58. package/dist/src/mcp/oauth-utils.js.map +1 -0
  59. package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
  60. package/dist/src/mcp/oauth-utils.test.js +144 -0
  61. package/dist/src/mcp/oauth-utils.test.js.map +1 -0
  62. package/dist/src/parsers/TextToolCallParser.d.ts +35 -0
  63. package/dist/src/parsers/TextToolCallParser.js +248 -0
  64. package/dist/src/parsers/TextToolCallParser.js.map +1 -0
  65. package/dist/src/parsers/TextToolCallParser.test.d.ts +1 -0
  66. package/dist/src/parsers/TextToolCallParser.test.js +225 -0
  67. package/dist/src/parsers/TextToolCallParser.test.js.map +1 -0
  68. package/dist/src/providers/ContentGeneratorRole.d.ts +14 -0
  69. package/dist/src/providers/ContentGeneratorRole.js +16 -0
  70. package/dist/src/providers/ContentGeneratorRole.js.map +1 -0
  71. package/dist/src/providers/IMessage.d.ts +38 -0
  72. package/dist/src/providers/IMessage.js +17 -0
  73. package/dist/src/providers/IMessage.js.map +1 -0
  74. package/dist/src/providers/IModel.d.ts +23 -0
  75. package/dist/src/providers/IModel.js +17 -0
  76. package/dist/src/providers/IModel.js.map +1 -0
  77. package/dist/src/providers/IProvider.d.ts +36 -0
  78. package/dist/src/providers/IProvider.js +17 -0
  79. package/dist/src/providers/IProvider.js.map +1 -0
  80. package/dist/src/providers/IProviderConfig.d.ts +31 -0
  81. package/dist/src/providers/IProviderConfig.js +7 -0
  82. package/dist/src/providers/IProviderConfig.js.map +1 -0
  83. package/dist/src/providers/IProviderManager.d.ts +53 -0
  84. package/dist/src/providers/IProviderManager.js +7 -0
  85. package/dist/src/providers/IProviderManager.js.map +1 -0
  86. package/dist/src/providers/ITool.d.ts +23 -0
  87. package/dist/src/providers/ITool.js +17 -0
  88. package/dist/src/providers/ITool.js.map +1 -0
  89. package/dist/src/providers/ProviderContentGenerator.d.ts +1 -1
  90. package/dist/src/providers/ProviderManager.d.ts +24 -0
  91. package/dist/src/providers/ProviderManager.gemini-switch.test.d.ts +6 -0
  92. package/dist/src/providers/ProviderManager.gemini-switch.test.js +57 -0
  93. package/dist/src/providers/ProviderManager.gemini-switch.test.js.map +1 -0
  94. package/dist/src/providers/ProviderManager.js +116 -0
  95. package/dist/src/providers/ProviderManager.js.map +1 -0
  96. package/dist/src/providers/ProviderManager.test.d.ts +6 -0
  97. package/dist/src/providers/ProviderManager.test.js +284 -0
  98. package/dist/src/providers/ProviderManager.test.js.map +1 -0
  99. package/dist/src/providers/adapters/GeminiCompatibleWrapper.d.ts +2 -1
  100. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +15 -2
  101. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +1 -1
  102. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +20 -0
  103. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +1 -1
  104. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +57 -0
  105. package/dist/src/providers/anthropic/AnthropicProvider.js +490 -0
  106. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -0
  107. package/dist/src/providers/anthropic/AnthropicProvider.test.d.ts +1 -0
  108. package/dist/src/providers/anthropic/AnthropicProvider.test.js +486 -0
  109. package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +1 -0
  110. package/dist/src/providers/errors.d.ts +13 -0
  111. package/dist/src/providers/errors.js +19 -0
  112. package/dist/src/providers/errors.js.map +1 -0
  113. package/dist/src/providers/gemini/GeminiProvider.d.ts +97 -0
  114. package/dist/src/providers/gemini/GeminiProvider.integration.test.d.ts +6 -0
  115. package/dist/src/providers/gemini/GeminiProvider.integration.test.js +90 -0
  116. package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +1 -0
  117. package/dist/src/providers/gemini/GeminiProvider.js +937 -0
  118. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -0
  119. package/dist/src/providers/gemini/GeminiProvider.test.d.ts +6 -0
  120. package/dist/src/providers/gemini/GeminiProvider.test.js +136 -0
  121. package/dist/src/providers/gemini/GeminiProvider.test.js.map +1 -0
  122. package/dist/src/providers/integration/TEST_INSTRUCTIONS.md +197 -0
  123. package/dist/src/providers/integration/multi-provider.integration.test.d.ts +6 -0
  124. package/dist/src/providers/integration/multi-provider.integration.test.js +292 -0
  125. package/dist/src/providers/integration/multi-provider.integration.test.js.map +1 -0
  126. package/dist/src/providers/openai/ConversationCache.accumTokens.test.d.ts +1 -0
  127. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js +97 -0
  128. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js.map +1 -0
  129. package/dist/src/providers/openai/ConversationCache.d.ts +20 -0
  130. package/dist/src/providers/openai/ConversationCache.js +109 -0
  131. package/dist/src/providers/openai/ConversationCache.js.map +1 -0
  132. package/dist/src/providers/openai/ConversationCache.test.d.ts +1 -0
  133. package/dist/src/providers/openai/ConversationCache.test.js +113 -0
  134. package/dist/src/providers/openai/ConversationCache.test.js.map +1 -0
  135. package/dist/src/providers/openai/IChatGenerateParams.d.ts +11 -0
  136. package/dist/src/providers/openai/IChatGenerateParams.js +2 -0
  137. package/dist/src/providers/openai/IChatGenerateParams.js.map +1 -0
  138. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.d.ts +1 -0
  139. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js +189 -0
  140. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js.map +1 -0
  141. package/dist/src/providers/openai/OpenAIProvider.d.ts +80 -0
  142. package/dist/src/providers/openai/OpenAIProvider.integration.test.d.ts +6 -0
  143. package/dist/src/providers/openai/OpenAIProvider.integration.test.js +125 -0
  144. package/dist/src/providers/openai/OpenAIProvider.integration.test.js.map +1 -0
  145. package/dist/src/providers/openai/OpenAIProvider.js +518 -0
  146. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -0
  147. package/dist/src/providers/openai/OpenAIProvider.responses.test.d.ts +1 -0
  148. package/dist/src/providers/openai/OpenAIProvider.responses.test.js +326 -0
  149. package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +1 -0
  150. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.d.ts +1 -0
  151. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js +213 -0
  152. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js.map +1 -0
  153. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.d.ts +1 -0
  154. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +58 -0
  155. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +1 -0
  156. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.d.ts +6 -0
  157. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +105 -0
  158. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +1 -0
  159. package/dist/src/providers/openai/OpenAIProvider.switch.test.d.ts +1 -0
  160. package/dist/src/providers/openai/OpenAIProvider.switch.test.js +256 -0
  161. package/dist/src/providers/openai/OpenAIProvider.switch.test.js.map +1 -0
  162. package/dist/src/providers/openai/OpenAIProvider.test.d.ts +16 -0
  163. package/dist/src/providers/openai/OpenAIProvider.test.js +214 -0
  164. package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -0
  165. package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +2 -0
  166. package/dist/src/providers/openai/RESPONSES_API_MODELS.js +14 -0
  167. package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +1 -0
  168. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.d.ts +1 -0
  169. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js +210 -0
  170. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js.map +1 -0
  171. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.d.ts +1 -0
  172. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js +65 -0
  173. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js.map +1 -0
  174. package/dist/src/providers/openai/buildResponsesRequest.d.ts +73 -0
  175. package/dist/src/providers/openai/buildResponsesRequest.js +165 -0
  176. package/dist/src/providers/openai/buildResponsesRequest.js.map +1 -0
  177. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.d.ts +1 -0
  178. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js +129 -0
  179. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js.map +1 -0
  180. package/dist/src/providers/openai/buildResponsesRequest.test.d.ts +1 -0
  181. package/dist/src/providers/openai/buildResponsesRequest.test.js +406 -0
  182. package/dist/src/providers/openai/buildResponsesRequest.test.js.map +1 -0
  183. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.d.ts +1 -0
  184. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js +50 -0
  185. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js.map +1 -0
  186. package/dist/src/providers/openai/docs/accessing-provider-info.md +172 -0
  187. package/dist/src/providers/openai/docs/params-mapping.md +91 -0
  188. package/dist/src/providers/openai/docs/responses-api-tool-calls.md +96 -0
  189. package/dist/src/providers/openai/estimateRemoteTokens.d.ts +26 -0
  190. package/dist/src/providers/openai/estimateRemoteTokens.js +75 -0
  191. package/dist/src/providers/openai/estimateRemoteTokens.js.map +1 -0
  192. package/dist/src/providers/openai/estimateRemoteTokens.test.d.ts +1 -0
  193. package/dist/src/providers/openai/estimateRemoteTokens.test.js +125 -0
  194. package/dist/src/providers/openai/estimateRemoteTokens.test.js.map +1 -0
  195. package/dist/src/providers/openai/getOpenAIProviderInfo.d.ts +46 -0
  196. package/dist/src/providers/openai/getOpenAIProviderInfo.js +75 -0
  197. package/dist/src/providers/openai/getOpenAIProviderInfo.js.map +1 -0
  198. package/dist/src/providers/openai/parseResponsesStream.d.ts +3 -0
  199. package/dist/src/providers/openai/parseResponsesStream.js +462 -0
  200. package/dist/src/providers/openai/parseResponsesStream.js.map +1 -0
  201. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.d.ts +1 -0
  202. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js +192 -0
  203. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js.map +1 -0
  204. package/dist/src/providers/openai/parseResponsesStream.test.d.ts +1 -0
  205. package/dist/src/providers/openai/parseResponsesStream.test.js +151 -0
  206. package/dist/src/providers/openai/parseResponsesStream.test.js.map +1 -0
  207. package/dist/src/providers/tokenizers/AnthropicTokenizer.d.ts +19 -0
  208. package/dist/src/providers/tokenizers/AnthropicTokenizer.js +37 -0
  209. package/dist/src/providers/tokenizers/AnthropicTokenizer.js.map +1 -0
  210. package/dist/src/providers/tokenizers/ITokenizer.d.ts +18 -0
  211. package/dist/src/providers/tokenizers/ITokenizer.js +17 -0
  212. package/dist/src/providers/tokenizers/ITokenizer.js.map +1 -0
  213. package/dist/src/providers/tokenizers/OpenAITokenizer.d.ts +24 -0
  214. package/dist/src/providers/tokenizers/OpenAITokenizer.js +56 -0
  215. package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +1 -0
  216. package/dist/src/providers/types/IProviderConfig.d.ts +102 -0
  217. package/dist/src/providers/types/IProviderConfig.js +17 -0
  218. package/dist/src/providers/types/IProviderConfig.js.map +1 -0
  219. package/dist/src/providers/types.d.ts +4 -69
  220. package/dist/src/services/ideContext.d.ts +2 -0
  221. package/dist/src/services/ideContext.js +8 -0
  222. package/dist/src/services/ideContext.js.map +1 -1
  223. package/dist/src/services/ideContext.test.js +10 -0
  224. package/dist/src/services/ideContext.test.js.map +1 -1
  225. package/dist/src/services/loopDetectionService.d.ts +17 -1
  226. package/dist/src/services/loopDetectionService.js +117 -2
  227. package/dist/src/services/loopDetectionService.js.map +1 -1
  228. package/dist/src/services/loopDetectionService.test.js +109 -2
  229. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  230. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -0
  231. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +40 -2
  232. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  233. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -0
  234. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +4 -0
  235. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  236. package/dist/src/telemetry/sdk.js +0 -2
  237. package/dist/src/telemetry/sdk.js.map +1 -1
  238. package/dist/src/telemetry/types.d.ts +2 -1
  239. package/dist/src/telemetry/types.js +1 -0
  240. package/dist/src/telemetry/types.js.map +1 -1
  241. package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
  242. package/dist/src/telemetry/uiTelemetry.js +7 -0
  243. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  244. package/dist/src/telemetry/uiTelemetry.test.js +92 -0
  245. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  246. package/dist/src/tools/IToolFormatter.d.ts +40 -0
  247. package/dist/src/tools/IToolFormatter.js +17 -0
  248. package/dist/src/tools/IToolFormatter.js.map +1 -0
  249. package/dist/src/tools/ToolFormatter.d.ts +45 -0
  250. package/dist/src/tools/ToolFormatter.js +216 -0
  251. package/dist/src/tools/ToolFormatter.js.map +1 -0
  252. package/dist/src/tools/ToolFormatter.test.d.ts +16 -0
  253. package/dist/src/tools/ToolFormatter.test.js +349 -0
  254. package/dist/src/tools/ToolFormatter.test.js.map +1 -0
  255. package/dist/src/tools/ToolFormatter.toResponsesTool.test.d.ts +1 -0
  256. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js +241 -0
  257. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js.map +1 -0
  258. package/dist/src/tools/edit.d.ts +7 -1
  259. package/dist/src/tools/edit.js +19 -7
  260. package/dist/src/tools/edit.js.map +1 -1
  261. package/dist/src/tools/glob.js +2 -2
  262. package/dist/src/tools/glob.js.map +1 -1
  263. package/dist/src/tools/grep.js +2 -2
  264. package/dist/src/tools/grep.js.map +1 -1
  265. package/dist/src/tools/ls.js +2 -2
  266. package/dist/src/tools/ls.js.map +1 -1
  267. package/dist/src/tools/mcp-client.d.ts +0 -2
  268. package/dist/src/tools/mcp-client.js +8 -20
  269. package/dist/src/tools/mcp-client.js.map +1 -1
  270. package/dist/src/tools/mcp-client.test.js +1 -72
  271. package/dist/src/tools/mcp-client.test.js.map +1 -1
  272. package/dist/src/tools/mcp-tool.d.ts +11 -5
  273. package/dist/src/tools/mcp-tool.js +33 -9
  274. package/dist/src/tools/mcp-tool.js.map +1 -1
  275. package/dist/src/tools/mcp-tool.test.js +40 -24
  276. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  277. package/dist/src/tools/memoryTool.js +2 -2
  278. package/dist/src/tools/memoryTool.js.map +1 -1
  279. package/dist/src/tools/read-file.d.ts +2 -1
  280. package/dist/src/tools/read-file.js +5 -2
  281. package/dist/src/tools/read-file.js.map +1 -1
  282. package/dist/src/tools/read-many-files.js +2 -2
  283. package/dist/src/tools/read-many-files.js.map +1 -1
  284. package/dist/src/tools/shell.js +2 -2
  285. package/dist/src/tools/shell.js.map +1 -1
  286. package/dist/src/tools/todo-read.js +2 -2
  287. package/dist/src/tools/todo-read.js.map +1 -1
  288. package/dist/src/tools/todo-write.js +2 -2
  289. package/dist/src/tools/todo-write.js.map +1 -1
  290. package/dist/src/tools/tool-registry.d.ts +0 -1
  291. package/dist/src/tools/tool-registry.js +11 -8
  292. package/dist/src/tools/tool-registry.js.map +1 -1
  293. package/dist/src/tools/tool-registry.test.js +36 -10
  294. package/dist/src/tools/tool-registry.test.js.map +1 -1
  295. package/dist/src/tools/tools.d.ts +37 -2
  296. package/dist/src/tools/tools.js +25 -2
  297. package/dist/src/tools/tools.js.map +1 -1
  298. package/dist/src/tools/web-fetch.integration.test.d.ts +6 -0
  299. package/dist/src/tools/web-fetch.integration.test.js +532 -0
  300. package/dist/src/tools/web-fetch.integration.test.js.map +1 -0
  301. package/dist/src/tools/web-fetch.js +57 -50
  302. package/dist/src/tools/web-fetch.js.map +1 -1
  303. package/dist/src/tools/web-search.js +34 -6
  304. package/dist/src/tools/web-search.js.map +1 -1
  305. package/dist/src/tools/web-search.test.d.ts +6 -0
  306. package/dist/src/tools/web-search.test.js +229 -0
  307. package/dist/src/tools/web-search.test.js.map +1 -0
  308. package/dist/src/tools/write-file.js +12 -5
  309. package/dist/src/tools/write-file.js.map +1 -1
  310. package/dist/src/utils/browser.d.ts +13 -0
  311. package/dist/src/utils/browser.js +49 -0
  312. package/dist/src/utils/browser.js.map +1 -0
  313. package/dist/src/utils/errors.js +4 -4
  314. package/dist/src/utils/errors.js.map +1 -1
  315. package/dist/src/utils/memoryDiscovery.js +5 -1
  316. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  317. package/dist/src/utils/quotaErrorDetection.js +0 -2
  318. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  319. package/dist/src/utils/retry.d.ts +6 -0
  320. package/dist/src/utils/retry.js +1 -1
  321. package/dist/src/utils/retry.js.map +1 -1
  322. package/dist/src/utils/user_account.js +6 -1
  323. package/dist/src/utils/user_account.js.map +1 -1
  324. package/dist/tsconfig.tsbuildinfo +1 -1
  325. package/package.json +6 -3
  326. package/dist/src/tools/web-fetch.test.js +0 -70
  327. package/dist/src/tools/web-fetch.test.js.map +0 -1
  328. package/dist/vybestack-llxprt-code-core-0.1.12.tgz +0 -0
  329. /package/dist/src/{tools/web-fetch.test.d.ts → mcp/oauth-provider.test.d.ts} +0 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Copyright 2025 Vybestack LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=IToolFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IToolFormatter.js","sourceRoot":"","sources":["../../../src/tools/IToolFormatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Copyright 2025 Vybestack LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { IToolFormatter, ToolFormat, OpenAITool, ResponsesTool } from './IToolFormatter.js';
17
+ import { ITool } from '../providers/ITool.js';
18
+ import { IMessage } from '../providers/IMessage.js';
19
+ export declare class ToolFormatter implements IToolFormatter {
20
+ /**
21
+ * Converts Gemini schema format (with uppercase Type enums) to standard JSON Schema format
22
+ */
23
+ private convertGeminiSchemaToStandard;
24
+ toProviderFormat(tools: ITool[], format: 'openai'): OpenAITool[];
25
+ toProviderFormat(tools: ITool[], format: ToolFormat): unknown;
26
+ fromProviderFormat(rawToolCall: unknown, format: ToolFormat): IMessage['tool_calls'];
27
+ /**
28
+ * Handles streaming tool call accumulation for OpenAI-compatible providers
29
+ * This accumulates partial tool calls from streaming responses
30
+ */
31
+ accumulateStreamingToolCall(deltaToolCall: {
32
+ index?: number;
33
+ id?: string;
34
+ type?: string;
35
+ function?: {
36
+ name?: string;
37
+ arguments?: string;
38
+ };
39
+ }, accumulatedToolCalls: NonNullable<IMessage['tool_calls']>, format: ToolFormat): void;
40
+ /**
41
+ * Formats tools specifically for the OpenAI Responses API
42
+ * The Responses API expects a flatter format than the regular OpenAI API
43
+ */
44
+ toResponsesTool(tools: ITool[]): ResponsesTool[];
45
+ }
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Copyright 2025 Vybestack LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export class ToolFormatter {
17
+ /**
18
+ * Converts Gemini schema format (with uppercase Type enums) to standard JSON Schema format
19
+ */
20
+ convertGeminiSchemaToStandard(schema) {
21
+ if (!schema || typeof schema !== 'object') {
22
+ return schema;
23
+ }
24
+ const newSchema = { ...schema };
25
+ // Handle properties
26
+ if (newSchema.properties && typeof newSchema.properties === 'object') {
27
+ const newProperties = {};
28
+ for (const [key, value] of Object.entries(newSchema.properties)) {
29
+ newProperties[key] = this.convertGeminiSchemaToStandard(value);
30
+ }
31
+ newSchema.properties = newProperties;
32
+ }
33
+ // Handle items
34
+ if (newSchema.items) {
35
+ if (Array.isArray(newSchema.items)) {
36
+ newSchema.items = newSchema.items.map((item) => this.convertGeminiSchemaToStandard(item));
37
+ }
38
+ else {
39
+ newSchema.items = this.convertGeminiSchemaToStandard(newSchema.items);
40
+ }
41
+ }
42
+ // Convert type from UPPERCASE enum to lowercase string
43
+ if (newSchema.type) {
44
+ newSchema.type = String(newSchema.type).toLowerCase();
45
+ }
46
+ return newSchema;
47
+ }
48
+ toProviderFormat(tools, format) {
49
+ switch (format) {
50
+ case 'openai':
51
+ case 'deepseek': // DeepSeek uses same format as OpenAI for now
52
+ case 'qwen': // Qwen uses same format as OpenAI for now
53
+ return tools.map((tool) => ({
54
+ type: 'function',
55
+ function: {
56
+ name: tool.function.name,
57
+ description: tool.function.description,
58
+ parameters: this.convertGeminiSchemaToStandard(tool.function.parameters),
59
+ },
60
+ }));
61
+ case 'anthropic':
62
+ return tools.map((tool) => ({
63
+ name: tool.function.name,
64
+ description: tool.function.description || '',
65
+ input_schema: {
66
+ type: 'object',
67
+ ...tool.function.parameters,
68
+ },
69
+ }));
70
+ case 'hermes':
71
+ // Hermes uses text-based format, tools are provided as system prompt
72
+ // Return a text description of tools for the system prompt
73
+ return tools.map((tool) => ({
74
+ name: tool.function.name,
75
+ description: tool.function.description || '',
76
+ parameters: tool.function.parameters,
77
+ }));
78
+ case 'xml':
79
+ // XML format also uses text-based format similar to Hermes
80
+ // Tools are typically described in the system prompt
81
+ return tools.map((tool) => ({
82
+ name: tool.function.name,
83
+ description: tool.function.description || '',
84
+ parameters: tool.function.parameters,
85
+ }));
86
+ default:
87
+ throw new Error(`Tool format '${format}' not yet implemented`);
88
+ }
89
+ }
90
+ fromProviderFormat(rawToolCall, format) {
91
+ switch (format) {
92
+ case 'openai':
93
+ case 'deepseek':
94
+ case 'qwen': {
95
+ const openAiToolCall = rawToolCall;
96
+ if (!openAiToolCall ||
97
+ !openAiToolCall.function ||
98
+ !openAiToolCall.function.name ||
99
+ !openAiToolCall.function.arguments) {
100
+ throw new Error(`Invalid ${format} tool call format`);
101
+ }
102
+ return [
103
+ {
104
+ id: openAiToolCall.id,
105
+ type: 'function',
106
+ function: {
107
+ name: openAiToolCall.function.name,
108
+ arguments: openAiToolCall.function.arguments,
109
+ },
110
+ },
111
+ ];
112
+ }
113
+ case 'anthropic': {
114
+ const anthropicToolCall = rawToolCall;
115
+ if (!anthropicToolCall ||
116
+ !anthropicToolCall.id ||
117
+ !anthropicToolCall.name) {
118
+ throw new Error(`Invalid ${format} tool call format`);
119
+ }
120
+ return [
121
+ {
122
+ id: anthropicToolCall.id,
123
+ type: 'function',
124
+ function: {
125
+ name: anthropicToolCall.name,
126
+ arguments: anthropicToolCall.input
127
+ ? JSON.stringify(anthropicToolCall.input)
128
+ : '',
129
+ },
130
+ },
131
+ ];
132
+ }
133
+ case 'hermes': {
134
+ // Hermes format comes from TextToolCallParser
135
+ const hermesToolCall = rawToolCall;
136
+ if (!hermesToolCall || !hermesToolCall.name) {
137
+ throw new Error(`Invalid ${format} tool call format`);
138
+ }
139
+ return [
140
+ {
141
+ id: `hermes_${Date.now()}_${Math.random().toString(36).substring(7)}`,
142
+ type: 'function',
143
+ function: {
144
+ name: hermesToolCall.name,
145
+ arguments: JSON.stringify(hermesToolCall.arguments || {}),
146
+ },
147
+ },
148
+ ];
149
+ }
150
+ case 'xml': {
151
+ // XML format also comes from TextToolCallParser
152
+ const xmlToolCall = rawToolCall;
153
+ if (!xmlToolCall || !xmlToolCall.name) {
154
+ throw new Error(`Invalid ${format} tool call format`);
155
+ }
156
+ return [
157
+ {
158
+ id: `xml_${Date.now()}_${Math.random().toString(36).substring(7)}`,
159
+ type: 'function',
160
+ function: {
161
+ name: xmlToolCall.name,
162
+ arguments: JSON.stringify(xmlToolCall.arguments || {}),
163
+ },
164
+ },
165
+ ];
166
+ }
167
+ default:
168
+ throw new Error(`Tool format '${format}' not yet implemented`);
169
+ }
170
+ }
171
+ /**
172
+ * Handles streaming tool call accumulation for OpenAI-compatible providers
173
+ * This accumulates partial tool calls from streaming responses
174
+ */
175
+ accumulateStreamingToolCall(deltaToolCall, accumulatedToolCalls, format) {
176
+ switch (format) {
177
+ case 'openai':
178
+ case 'deepseek':
179
+ case 'qwen':
180
+ // All use same accumulation logic for now
181
+ if (deltaToolCall.index !== undefined) {
182
+ if (!accumulatedToolCalls[deltaToolCall.index]) {
183
+ accumulatedToolCalls[deltaToolCall.index] = {
184
+ id: deltaToolCall.id || '',
185
+ type: 'function',
186
+ function: { name: '', arguments: '' },
187
+ };
188
+ }
189
+ const tc = accumulatedToolCalls[deltaToolCall.index];
190
+ if (deltaToolCall.id)
191
+ tc.id = deltaToolCall.id;
192
+ if (deltaToolCall.function?.name)
193
+ tc.function.name = deltaToolCall.function.name;
194
+ if (deltaToolCall.function?.arguments)
195
+ tc.function.arguments += deltaToolCall.function.arguments;
196
+ }
197
+ break;
198
+ default:
199
+ throw new Error(`Streaming accumulation for format '${format}' not yet implemented`);
200
+ }
201
+ }
202
+ /**
203
+ * Formats tools specifically for the OpenAI Responses API
204
+ * The Responses API expects a flatter format than the regular OpenAI API
205
+ */
206
+ toResponsesTool(tools) {
207
+ return tools.map((tool) => ({
208
+ type: 'function',
209
+ name: tool.function.name,
210
+ description: tool.function.description || null,
211
+ parameters: this.convertGeminiSchemaToStandard(tool.function.parameters) || null,
212
+ strict: null,
213
+ }));
214
+ }
215
+ }
216
+ //# sourceMappingURL=ToolFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolFormatter.js","sourceRoot":"","sources":["../../../src/tools/ToolFormatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Copyright 2025 Vybestack LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export {};
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Copyright 2025 Vybestack LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { describe, it, expect, beforeEach } from 'vitest';
17
+ import { ToolFormatter } from './ToolFormatter.js';
18
+ describe('ToolFormatter', () => {
19
+ let formatter;
20
+ beforeEach(() => {
21
+ formatter = new ToolFormatter();
22
+ });
23
+ it('should correctly format tools for OpenAI provider', () => {
24
+ const tools = [
25
+ {
26
+ type: 'function',
27
+ function: {
28
+ name: 'sum',
29
+ description: 'Add two numbers',
30
+ parameters: {
31
+ type: 'object',
32
+ properties: {
33
+ a: { type: 'number' },
34
+ b: { type: 'number' },
35
+ },
36
+ required: ['a', 'b'],
37
+ },
38
+ },
39
+ },
40
+ ];
41
+ const expected = [
42
+ {
43
+ type: 'function',
44
+ function: {
45
+ name: 'sum',
46
+ description: 'Add two numbers',
47
+ parameters: {
48
+ type: 'object',
49
+ properties: {
50
+ a: { type: 'number' },
51
+ b: { type: 'number' },
52
+ },
53
+ required: ['a', 'b'],
54
+ },
55
+ },
56
+ },
57
+ ];
58
+ expect(formatter.toProviderFormat(tools, 'openai')).toEqual(expected);
59
+ });
60
+ it('should throw an error for invalid OpenAI tool call format', () => {
61
+ const rawToolCall = {};
62
+ expect(() => formatter.fromProviderFormat(rawToolCall, 'openai')).toThrow('Invalid openai tool call format');
63
+ });
64
+ it('should correctly parse OpenAI tool calls from provider format', () => {
65
+ const rawToolCall = {
66
+ id: 'call_123',
67
+ function: {
68
+ name: 'sum',
69
+ arguments: '{"a": 5, "b": 3}',
70
+ },
71
+ };
72
+ const expected = [
73
+ {
74
+ id: 'call_123',
75
+ type: 'function',
76
+ function: {
77
+ name: 'sum',
78
+ arguments: '{"a": 5, "b": 3}',
79
+ },
80
+ },
81
+ ];
82
+ expect(formatter.fromProviderFormat(rawToolCall, 'openai')).toEqual(expected);
83
+ });
84
+ it('should correctly format tools for Anthropic provider', () => {
85
+ const tools = [
86
+ {
87
+ type: 'function',
88
+ function: {
89
+ name: 'search',
90
+ description: 'Search for information',
91
+ parameters: {
92
+ type: 'object',
93
+ properties: {
94
+ query: { type: 'string', description: 'Search query' },
95
+ limit: { type: 'number', description: 'Max results' },
96
+ },
97
+ required: ['query'],
98
+ },
99
+ },
100
+ },
101
+ ];
102
+ const expected = [
103
+ {
104
+ name: 'search',
105
+ description: 'Search for information',
106
+ input_schema: {
107
+ type: 'object',
108
+ properties: {
109
+ query: { type: 'string', description: 'Search query' },
110
+ limit: { type: 'number', description: 'Max results' },
111
+ },
112
+ required: ['query'],
113
+ },
114
+ },
115
+ ];
116
+ expect(formatter.toProviderFormat(tools, 'anthropic')).toEqual(expected);
117
+ });
118
+ it('should handle empty description for Anthropic provider', () => {
119
+ const tools = [
120
+ {
121
+ type: 'function',
122
+ function: {
123
+ name: 'calculate',
124
+ parameters: {
125
+ type: 'object',
126
+ properties: { x: { type: 'number' } },
127
+ },
128
+ },
129
+ },
130
+ ];
131
+ const result = formatter.toProviderFormat(tools, 'anthropic');
132
+ expect(result[0].description).toBe('');
133
+ });
134
+ it('should not throw for implemented formats in toProviderFormat', () => {
135
+ const tools = [
136
+ {
137
+ type: 'function',
138
+ function: {
139
+ name: 'test',
140
+ description: 'Test function',
141
+ parameters: {},
142
+ },
143
+ },
144
+ ];
145
+ // All these formats are now implemented and should not throw
146
+ expect(() => formatter.toProviderFormat(tools, 'openai')).not.toThrow();
147
+ expect(() => formatter.toProviderFormat(tools, 'anthropic')).not.toThrow();
148
+ expect(() => formatter.toProviderFormat(tools, 'hermes')).not.toThrow();
149
+ expect(() => formatter.toProviderFormat(tools, 'xml')).not.toThrow();
150
+ expect(() => formatter.toProviderFormat(tools, 'deepseek')).not.toThrow();
151
+ expect(() => formatter.toProviderFormat(tools, 'qwen')).not.toThrow();
152
+ });
153
+ it('should correctly format tools for Hermes provider', () => {
154
+ const tools = [
155
+ {
156
+ type: 'function',
157
+ function: {
158
+ name: 'get_stock_fundamentals',
159
+ description: 'Get fundamental data for a stock',
160
+ parameters: {
161
+ type: 'object',
162
+ properties: {
163
+ symbol: { type: 'string', description: 'Stock symbol' },
164
+ },
165
+ required: ['symbol'],
166
+ },
167
+ },
168
+ },
169
+ ];
170
+ const expected = [
171
+ {
172
+ name: 'get_stock_fundamentals',
173
+ description: 'Get fundamental data for a stock',
174
+ parameters: {
175
+ type: 'object',
176
+ properties: {
177
+ symbol: { type: 'string', description: 'Stock symbol' },
178
+ },
179
+ required: ['symbol'],
180
+ },
181
+ },
182
+ ];
183
+ expect(formatter.toProviderFormat(tools, 'hermes')).toEqual(expected);
184
+ });
185
+ it('should correctly parse Anthropic tool calls from provider format', () => {
186
+ const rawToolCall = {
187
+ id: 'toolu_01abc123',
188
+ type: 'tool_use',
189
+ name: 'search',
190
+ input: { query: 'test search', limit: 10 },
191
+ };
192
+ const expected = [
193
+ {
194
+ id: 'toolu_01abc123',
195
+ type: 'function',
196
+ function: {
197
+ name: 'search',
198
+ arguments: '{"query":"test search","limit":10}',
199
+ },
200
+ },
201
+ ];
202
+ expect(formatter.fromProviderFormat(rawToolCall, 'anthropic')).toEqual(expected);
203
+ });
204
+ it('should handle Anthropic tool calls without input', () => {
205
+ const rawToolCall = {
206
+ id: 'toolu_01xyz789',
207
+ name: 'get_time',
208
+ };
209
+ const expected = [
210
+ {
211
+ id: 'toolu_01xyz789',
212
+ type: 'function',
213
+ function: {
214
+ name: 'get_time',
215
+ arguments: '',
216
+ },
217
+ },
218
+ ];
219
+ expect(formatter.fromProviderFormat(rawToolCall, 'anthropic')).toEqual(expected);
220
+ });
221
+ it('should throw an error for invalid Anthropic tool call format', () => {
222
+ const invalidCalls = [
223
+ {},
224
+ { id: 'test' }, // missing name
225
+ { name: 'test' }, // missing id
226
+ null,
227
+ ];
228
+ invalidCalls.forEach((rawToolCall) => {
229
+ expect(() => formatter.fromProviderFormat(rawToolCall, 'anthropic')).toThrow('Invalid anthropic tool call format');
230
+ });
231
+ });
232
+ it('should correctly parse Hermes tool calls from provider format', () => {
233
+ const rawToolCall = {
234
+ name: 'get_stock_fundamentals',
235
+ arguments: { symbol: 'AAPL' },
236
+ };
237
+ const result = formatter.fromProviderFormat(rawToolCall, 'hermes');
238
+ expect(result).toHaveLength(1);
239
+ expect(result[0].type).toBe('function');
240
+ expect(result[0].function.name).toBe('get_stock_fundamentals');
241
+ expect(result[0].function.arguments).toBe('{"symbol":"AAPL"}');
242
+ expect(result[0].id).toMatch(/^hermes_/); // Should have generated ID
243
+ });
244
+ it('should handle Hermes tool calls without arguments', () => {
245
+ const rawToolCall = {
246
+ name: 'get_current_time',
247
+ arguments: {},
248
+ };
249
+ const result = formatter.fromProviderFormat(rawToolCall, 'hermes');
250
+ expect(result).toHaveLength(1);
251
+ expect(result[0].function.name).toBe('get_current_time');
252
+ expect(result[0].function.arguments).toBe('{}');
253
+ });
254
+ it('should throw error for invalid Hermes tool call format', () => {
255
+ const invalidCalls = [
256
+ {},
257
+ { arguments: {} }, // missing name
258
+ null,
259
+ ];
260
+ invalidCalls.forEach((rawToolCall) => {
261
+ expect(() => formatter.fromProviderFormat(rawToolCall, 'hermes')).toThrow('Invalid hermes tool call format');
262
+ });
263
+ });
264
+ it('should correctly format tools for XML provider', () => {
265
+ const tools = [
266
+ {
267
+ type: 'function',
268
+ function: {
269
+ name: 'weather_tool',
270
+ description: 'Get weather information',
271
+ parameters: {
272
+ type: 'object',
273
+ properties: {
274
+ location: { type: 'string', description: 'City name' },
275
+ units: { type: 'string', enum: ['celsius', 'fahrenheit'] },
276
+ },
277
+ required: ['location'],
278
+ },
279
+ },
280
+ },
281
+ ];
282
+ const expected = [
283
+ {
284
+ name: 'weather_tool',
285
+ description: 'Get weather information',
286
+ parameters: {
287
+ type: 'object',
288
+ properties: {
289
+ location: { type: 'string', description: 'City name' },
290
+ units: { type: 'string', enum: ['celsius', 'fahrenheit'] },
291
+ },
292
+ required: ['location'],
293
+ },
294
+ },
295
+ ];
296
+ expect(formatter.toProviderFormat(tools, 'xml')).toEqual(expected);
297
+ });
298
+ it('should correctly parse XML tool calls from provider format', () => {
299
+ const rawToolCall = {
300
+ name: 'weather_tool',
301
+ arguments: { location: 'Paris', units: 'celsius' },
302
+ };
303
+ const result = formatter.fromProviderFormat(rawToolCall, 'xml');
304
+ expect(result).toHaveLength(1);
305
+ expect(result[0].type).toBe('function');
306
+ expect(result[0].function.name).toBe('weather_tool');
307
+ expect(result[0].function.arguments).toBe('{"location":"Paris","units":"celsius"}');
308
+ expect(result[0].id).toMatch(/^xml_/); // Should have generated ID
309
+ });
310
+ it('should handle XML tool calls without arguments', () => {
311
+ const rawToolCall = {
312
+ name: 'get_time',
313
+ arguments: {},
314
+ };
315
+ const result = formatter.fromProviderFormat(rawToolCall, 'xml');
316
+ expect(result).toHaveLength(1);
317
+ expect(result[0].function.name).toBe('get_time');
318
+ expect(result[0].function.arguments).toBe('{}');
319
+ });
320
+ it('should throw error for invalid XML tool call format', () => {
321
+ const invalidCalls = [
322
+ {},
323
+ { arguments: {} }, // missing name
324
+ null,
325
+ ];
326
+ invalidCalls.forEach((rawToolCall) => {
327
+ expect(() => formatter.fromProviderFormat(rawToolCall, 'xml')).toThrow('Invalid xml tool call format');
328
+ });
329
+ });
330
+ it('should format tools correctly for DeepSeek and Qwen providers', () => {
331
+ const tools = [
332
+ {
333
+ type: 'function',
334
+ function: {
335
+ name: 'test_function',
336
+ description: 'A test function',
337
+ parameters: { type: 'object', properties: {} },
338
+ },
339
+ },
340
+ ];
341
+ // DeepSeek and Qwen use the same format as OpenAI
342
+ const deepseekResult = formatter.toProviderFormat(tools, 'deepseek');
343
+ const qwenResult = formatter.toProviderFormat(tools, 'qwen');
344
+ const openaiResult = formatter.toProviderFormat(tools, 'openai');
345
+ expect(deepseekResult).toEqual(openaiResult);
346
+ expect(qwenResult).toEqual(openaiResult);
347
+ });
348
+ });
349
+ //# sourceMappingURL=ToolFormatter.test.js.map