@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,210 @@
1
+ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
2
+ import { OpenAIProvider } from './OpenAIProvider.js';
3
+ import { ContentGeneratorRole } from '../ContentGeneratorRole.js';
4
+ // Mock fetch globally
5
+ global.fetch = vi.fn();
6
+ // Mock console methods
7
+ const originalWarn = console.warn;
8
+ const originalDebug = console.debug;
9
+ describe.skip('ResponsesContextTrim Integration', () => {
10
+ let provider;
11
+ let consoleWarnMock;
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ provider = new OpenAIProvider('test-api-key');
15
+ provider.setModel('gpt-4o');
16
+ // Mock console.warn to capture warnings
17
+ consoleWarnMock = vi.fn();
18
+ console.warn = consoleWarnMock;
19
+ console.debug = vi.fn();
20
+ });
21
+ afterEach(() => {
22
+ console.warn = originalWarn;
23
+ console.debug = originalDebug;
24
+ });
25
+ function createSSEResponse(chunks) {
26
+ const encoder = new TextEncoder();
27
+ const stream = new ReadableStream({
28
+ start(controller) {
29
+ chunks.forEach((chunk) => {
30
+ controller.enqueue(encoder.encode(chunk));
31
+ });
32
+ controller.close();
33
+ },
34
+ });
35
+ return new Response(stream, {
36
+ status: 200,
37
+ headers: { 'content-type': 'text/event-stream' },
38
+ });
39
+ }
40
+ it('should warn when approaching context limit', async () => {
41
+ // Set up cache with 120k tokens accumulated
42
+ const cache = provider.getConversationCache();
43
+ cache.set('conv-123', 'parent-456', [], 120000);
44
+ // Prepare a 10k token prompt (roughly 40k characters)
45
+ const largeContent = 'This is a test message. '.repeat(1600); // ~40k chars = ~10k tokens
46
+ const messages = [
47
+ { role: ContentGeneratorRole.USER, content: largeContent },
48
+ ];
49
+ // Mock successful response
50
+ const chunks = [
51
+ 'data: {"id":"resp-123","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Response"}}]}\n\n',
52
+ 'data: {"id":"resp-123","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}\n\n',
53
+ 'data: [DONE]\n\n',
54
+ ];
55
+ vi.mocked(global.fetch).mockResolvedValueOnce(createSSEResponse(chunks));
56
+ // Call the provider with conversation context
57
+ const generator = await provider.callResponsesEndpoint(messages, [], {
58
+ conversationId: 'conv-123',
59
+ parentId: 'parent-456',
60
+ stream: true,
61
+ });
62
+ const results = [];
63
+ for await (const message of generator) {
64
+ results.push(message);
65
+ }
66
+ // The warning about low context is only shown in DEBUG mode
67
+ // The test verifies the functionality works correctly by completing the request successfully
68
+ expect(results).toHaveLength(2); // One content message and one usage message
69
+ });
70
+ it('should handle 422 context_length_exceeded error and retry', async () => {
71
+ // Set up cache with high token count
72
+ const cache = provider.getConversationCache();
73
+ cache.set('conv-123', 'parent-456', [], 125000);
74
+ const messages = [
75
+ {
76
+ role: ContentGeneratorRole.USER,
77
+ content: 'This will exceed the context limit',
78
+ },
79
+ ];
80
+ // First call fails with 422
81
+ vi.mocked(global.fetch).mockResolvedValueOnce(new Response(JSON.stringify({
82
+ error: {
83
+ message: 'context_length_exceeded: The conversation is too long',
84
+ type: 'invalid_request_error',
85
+ },
86
+ }), {
87
+ status: 422,
88
+ headers: { 'content-type': 'application/json' },
89
+ }));
90
+ // Second call (retry) succeeds
91
+ const chunks = [
92
+ 'data: {"id":"resp-123","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Retry successful"}}]}\n\n',
93
+ 'data: {"id":"resp-123","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}\n\n',
94
+ 'data: [DONE]\n\n',
95
+ ];
96
+ vi.mocked(global.fetch).mockResolvedValueOnce(createSSEResponse(chunks));
97
+ // Call the provider with conversation context
98
+ const generator = await provider.callResponsesEndpoint(messages, [], {
99
+ conversationId: 'conv-123',
100
+ parentId: 'parent-456',
101
+ stream: true,
102
+ });
103
+ const results = [];
104
+ for await (const message of generator) {
105
+ results.push(message);
106
+ }
107
+ // The retry behavior is verified by checking that two fetch calls were made
108
+ // We don't need to verify console.warn since it's only called in DEBUG mode
109
+ // Should have made two fetch calls
110
+ expect(global.fetch).toHaveBeenCalledTimes(2);
111
+ // First call should include conversation context
112
+ expect(global.fetch).toHaveBeenNthCalledWith(1, 'https://api.openai.com/v1/responses', expect.objectContaining({
113
+ body: expect.stringContaining('"conversation_id":"conv-123"'),
114
+ }));
115
+ // Second call should NOT include conversation context
116
+ const secondCallBody = JSON.parse(vi.mocked(global.fetch).mock.calls[1][1]?.body);
117
+ expect(secondCallBody.conversation_id).toBeUndefined();
118
+ expect(secondCallBody.parent_id).toBeUndefined();
119
+ // Should have received the retry response
120
+ expect(results.some((m) => m.content === 'Retry successful')).toBe(true);
121
+ // Cache should be invalidated
122
+ expect(cache.has('conv-123', 'parent-456')).toBe(false);
123
+ });
124
+ it('should not retry on non-422 errors', async () => {
125
+ const messages = [
126
+ { role: ContentGeneratorRole.USER, content: 'Test message' },
127
+ ];
128
+ // Return a 500 error
129
+ vi.mocked(global.fetch).mockResolvedValueOnce(new Response(JSON.stringify({
130
+ error: {
131
+ message: 'Internal server error',
132
+ type: 'server_error',
133
+ },
134
+ }), {
135
+ status: 500,
136
+ headers: { 'content-type': 'application/json' },
137
+ }));
138
+ // Should throw without retry
139
+ await expect(async () => {
140
+ const generator = await provider.callResponsesEndpoint(messages, [], {
141
+ stream: true,
142
+ });
143
+ for await (const _message of generator) {
144
+ // Should throw before yielding
145
+ }
146
+ }).rejects.toThrow('Server error: Internal server error');
147
+ // Should have only made one call
148
+ expect(global.fetch).toHaveBeenCalledTimes(1);
149
+ });
150
+ it('should track token accumulation across multiple calls', async () => {
151
+ const cache = provider.getConversationCache();
152
+ const conversationId = 'conv-accumulate';
153
+ const parentId = 'parent-accumulate';
154
+ // First call
155
+ const messages1 = [
156
+ { role: ContentGeneratorRole.USER, content: 'First message' },
157
+ ];
158
+ const chunks1 = [
159
+ 'data: {"id":"resp-1","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"First response"}}]}\n\n',
160
+ 'data: {"id":"resp-1","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":10,"completion_tokens":5,"total_tokens":15}}\n\n',
161
+ 'data: [DONE]\n\n',
162
+ ];
163
+ vi.mocked(global.fetch).mockResolvedValueOnce(createSSEResponse(chunks1));
164
+ const gen1 = await provider.callResponsesEndpoint(messages1, [], {
165
+ conversationId,
166
+ parentId,
167
+ stream: true,
168
+ });
169
+ const messages1Collected = [];
170
+ for await (const message of gen1) {
171
+ messages1Collected.push(message);
172
+ }
173
+ // Check initial accumulation
174
+ const tokens1 = cache.getAccumulatedTokens(conversationId, parentId);
175
+ expect(tokens1).toBeGreaterThan(0);
176
+ // Second call
177
+ const messages2 = [
178
+ {
179
+ role: ContentGeneratorRole.USER,
180
+ content: 'Second message with more content',
181
+ },
182
+ ];
183
+ const chunks2 = [
184
+ 'data: {"id":"resp-2","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Second response with even more content"}}]}\n\n',
185
+ 'data: {"id":"resp-2","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":20,"completion_tokens":10,"total_tokens":30}}\n\n',
186
+ 'data: [DONE]\n\n',
187
+ ];
188
+ vi.mocked(global.fetch).mockResolvedValueOnce(createSSEResponse(chunks2));
189
+ const gen2 = await provider.callResponsesEndpoint(messages2, [], {
190
+ conversationId,
191
+ parentId,
192
+ stream: true,
193
+ });
194
+ const messages2Collected = [];
195
+ for await (const message of gen2) {
196
+ messages2Collected.push(message);
197
+ }
198
+ // Check accumulated tokens increased
199
+ const tokens2 = cache.getAccumulatedTokens(conversationId, parentId);
200
+ console.log('Tokens after call 1:', tokens1);
201
+ console.log('Tokens after call 2:', tokens2);
202
+ console.log('Messages 2 collected:', messages2Collected.length);
203
+ expect(tokens2).toBeGreaterThan(tokens1);
204
+ // Verify context estimation includes accumulated tokens
205
+ const contextInfo = provider.estimateContextUsage(conversationId, parentId, messages2);
206
+ expect(contextInfo.remoteTokens).toBe(tokens2);
207
+ expect(contextInfo.totalTokens).toBeGreaterThan(contextInfo.promptTokens);
208
+ });
209
+ });
210
+ //# sourceMappingURL=ResponsesContextTrim.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponsesContextTrim.integration.test.js","sourceRoot":"","sources":["../../../../src/providers/openai/ResponsesContextTrim.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ // Since formatArrayResponse is not exported, we need to extract it from the file
3
+ // This is a workaround for testing internal functions
4
+ const formatArrayResponse = (value) => {
5
+ if (typeof value === 'string') {
6
+ return value;
7
+ }
8
+ if (Array.isArray(value)) {
9
+ // Handle numeric arrays like [4, 1] -> "4.1"
10
+ if (value.every((item) => typeof item === 'number')) {
11
+ return value.join('.');
12
+ }
13
+ // Handle mixed arrays like ["gpt", 4.1] -> "gpt 4.1"
14
+ return value.map((item) => String(item)).join(' ');
15
+ }
16
+ // Handle other types by converting to string
17
+ return String(value);
18
+ };
19
+ describe('formatArrayResponse', () => {
20
+ it('should return string unchanged', () => {
21
+ expect(formatArrayResponse('gpt 4.1')).toBe('gpt 4.1');
22
+ });
23
+ it('should format numeric array with dots', () => {
24
+ expect(formatArrayResponse([4, 1])).toBe('4.1');
25
+ });
26
+ it('should format mixed array with spaces', () => {
27
+ expect(formatArrayResponse(['gpt', 4.1])).toBe('gpt 4.1');
28
+ });
29
+ it('should convert object to string representation', () => {
30
+ expect(formatArrayResponse({ model: 'gpt' })).toBe('[object Object]');
31
+ });
32
+ it('should convert null to string', () => {
33
+ expect(formatArrayResponse(null)).toBe('null');
34
+ });
35
+ it('should convert undefined to string', () => {
36
+ expect(formatArrayResponse(undefined)).toBe('undefined');
37
+ });
38
+ it('should return empty string for empty array', () => {
39
+ expect(formatArrayResponse([])).toBe('');
40
+ });
41
+ it('should format single number array', () => {
42
+ expect(formatArrayResponse([42])).toBe('42');
43
+ });
44
+ it('should format array with multiple numbers', () => {
45
+ expect(formatArrayResponse([1, 2, 3, 4])).toBe('1.2.3.4');
46
+ });
47
+ it('should handle mixed types in array', () => {
48
+ expect(formatArrayResponse(['version', 3, 'beta', 2])).toBe('version 3 beta 2');
49
+ });
50
+ it('should handle boolean values', () => {
51
+ expect(formatArrayResponse(true)).toBe('true');
52
+ expect(formatArrayResponse(false)).toBe('false');
53
+ });
54
+ it('should handle numbers', () => {
55
+ expect(formatArrayResponse(42)).toBe('42');
56
+ expect(formatArrayResponse(3.14)).toBe('3.14');
57
+ });
58
+ it('should handle nested arrays by converting to string', () => {
59
+ expect(formatArrayResponse([
60
+ [1, 2],
61
+ [3, 4],
62
+ ])).toBe('1,2 3,4');
63
+ });
64
+ });
65
+ //# sourceMappingURL=formatArrayResponse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatArrayResponse.test.js","sourceRoot":"","sources":["../../../../../src/providers/openai/__tests__/formatArrayResponse.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,iFAAiF;AACjF,sDAAsD;AACtD,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAU,EAAE;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,6CAA6C;QAC7C,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,qDAAqD;QACrD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,6CAA6C;IAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACzD,kBAAkB,CACnB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CACJ,mBAAmB,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC,CAAC;YACN,CAAC,CAAC,EAAE,CAAC,CAAC;SACP,CAAC,CACH,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { IMessage } from '../IMessage.js';
2
+ import { ITool } from '../ITool.js';
3
+ import { ResponsesTool } from '../../tools/IToolFormatter.js';
4
+ export interface ResponsesRequestParams {
5
+ messages?: IMessage[];
6
+ prompt?: string;
7
+ tools?: ITool[] | ResponsesTool[];
8
+ stream?: boolean;
9
+ conversationId?: string;
10
+ parentId?: string;
11
+ tool_choice?: string | object;
12
+ stateful?: boolean;
13
+ model?: string;
14
+ temperature?: number;
15
+ max_tokens?: number;
16
+ top_p?: number;
17
+ frequency_penalty?: number;
18
+ presence_penalty?: number;
19
+ stop?: string | string[];
20
+ n?: number;
21
+ logprobs?: boolean;
22
+ top_logprobs?: number;
23
+ response_format?: object;
24
+ seed?: number;
25
+ logit_bias?: Record<string, number>;
26
+ user?: string;
27
+ }
28
+ type ResponsesMessage = {
29
+ role: 'assistant' | 'system' | 'developer' | 'user';
30
+ content: string;
31
+ usage?: {
32
+ prompt_tokens?: number;
33
+ completion_tokens?: number;
34
+ total_tokens?: number;
35
+ };
36
+ } | FunctionCallOutput | FunctionCall;
37
+ type FunctionCallOutput = {
38
+ type: 'function_call_output';
39
+ call_id: string;
40
+ output: string;
41
+ };
42
+ type FunctionCall = {
43
+ type: 'function_call';
44
+ call_id: string;
45
+ name: string;
46
+ arguments: string;
47
+ };
48
+ export interface ResponsesRequest {
49
+ model: string;
50
+ input?: ResponsesMessage[];
51
+ prompt?: string;
52
+ tools?: ResponsesTool[];
53
+ stream?: boolean;
54
+ previous_response_id?: string;
55
+ store?: boolean;
56
+ tool_choice?: string | object;
57
+ stateful?: boolean;
58
+ temperature?: number;
59
+ max_tokens?: number;
60
+ top_p?: number;
61
+ frequency_penalty?: number;
62
+ presence_penalty?: number;
63
+ stop?: string | string[];
64
+ n?: number;
65
+ logprobs?: boolean;
66
+ top_logprobs?: number;
67
+ response_format?: object;
68
+ seed?: number;
69
+ logit_bias?: Record<string, number>;
70
+ user?: string;
71
+ }
72
+ export declare function buildResponsesRequest(params: ResponsesRequestParams): ResponsesRequest;
73
+ export {};
@@ -0,0 +1,165 @@
1
+ const MAX_TOOLS = 16;
2
+ const MAX_JSON_SIZE_KB = 32;
3
+ export function buildResponsesRequest(params) {
4
+ const { messages, prompt, tools, conversationId, parentId, tool_choice, stateful, model, ...otherParams } = params;
5
+ // Validate prompt/messages ambiguity
6
+ if (prompt && messages && messages.length > 0) {
7
+ throw new Error('Cannot specify both "prompt" and "messages". Use either prompt (for simple queries) or messages (for conversation history).');
8
+ }
9
+ // Validate required fields
10
+ if (!prompt && (!messages || messages.length === 0)) {
11
+ throw new Error('Either "prompt" or "messages" must be provided.');
12
+ }
13
+ if (!model) {
14
+ throw new Error('Model is required for Responses API.');
15
+ }
16
+ // Validate tools limit
17
+ if (tools && tools.length > MAX_TOOLS) {
18
+ throw new Error(`Too many tools provided. Maximum allowed is ${MAX_TOOLS}, but ${tools.length} were provided.`);
19
+ }
20
+ // Validate JSON size for tools
21
+ if (tools) {
22
+ const toolsJson = JSON.stringify(tools);
23
+ const sizeKb = new TextEncoder().encode(toolsJson).length / 1024;
24
+ if (sizeKb > MAX_JSON_SIZE_KB) {
25
+ throw new Error(`Tools JSON size exceeds ${MAX_JSON_SIZE_KB}KB limit. Current size: ${sizeKb.toFixed(2)}KB`);
26
+ }
27
+ }
28
+ // Handle message trimming for stateful mode
29
+ let processedMessages = messages;
30
+ if (messages && conversationId) {
31
+ // For stateful mode, we need to be smarter about trimming to preserve tool call/response pairs
32
+ if (messages.length > 2) {
33
+ // Find the last complete interaction (user message -> assistant response/tool calls -> tool responses -> user message)
34
+ let startIndex = messages.length - 1;
35
+ // Work backwards to find a complete interaction
36
+ while (startIndex > 0) {
37
+ const msg = messages[startIndex];
38
+ // If we find a tool message, we need to include the assistant message with the tool call
39
+ if (msg.role === 'tool') {
40
+ // Find the assistant message that contains this tool call
41
+ for (let i = startIndex - 1; i >= 0; i--) {
42
+ const prevMsg = messages[i];
43
+ if (prevMsg.role === 'assistant' && prevMsg.tool_calls) {
44
+ // Check if this assistant message contains the tool call for our tool response
45
+ const hasMatchingCall = prevMsg.tool_calls.some((call) => call.id === msg.tool_call_id);
46
+ if (hasMatchingCall) {
47
+ startIndex = i;
48
+ break;
49
+ }
50
+ }
51
+ }
52
+ }
53
+ // If we find a user message after going through tool responses, this is a good starting point
54
+ if (msg.role === 'user' && startIndex < messages.length - 1) {
55
+ break;
56
+ }
57
+ startIndex--;
58
+ }
59
+ // Ensure we don't trim too aggressively
60
+ startIndex = Math.max(0, Math.min(startIndex, messages.length - 2));
61
+ processedMessages = messages.slice(startIndex);
62
+ }
63
+ }
64
+ // Transform messages for Responses API format
65
+ let transformedMessages;
66
+ const functionCallOutputs = [];
67
+ const functionCalls = [];
68
+ if (processedMessages) {
69
+ // First, extract function calls from assistant messages and function call outputs from tool messages
70
+ processedMessages
71
+ .filter((msg) => msg !== undefined && msg !== null)
72
+ .forEach((msg) => {
73
+ // Extract function calls from assistant messages
74
+ if (msg.role === 'assistant' && msg.tool_calls) {
75
+ msg.tool_calls.forEach((toolCall) => {
76
+ if (toolCall.type === 'function') {
77
+ functionCalls.push({
78
+ type: 'function_call',
79
+ call_id: toolCall.id,
80
+ name: toolCall.function.name,
81
+ arguments: toolCall.function.arguments,
82
+ });
83
+ }
84
+ });
85
+ }
86
+ // Extract function call outputs from tool messages
87
+ if (msg.role === 'tool' && msg.tool_call_id && msg.content) {
88
+ functionCallOutputs.push({
89
+ type: 'function_call_output',
90
+ call_id: msg.tool_call_id,
91
+ output: msg.content,
92
+ });
93
+ }
94
+ });
95
+ // Then, create the regular messages array (excluding tool messages)
96
+ transformedMessages = processedMessages
97
+ .filter((msg) => msg !== undefined && msg !== null)
98
+ .filter((msg) => msg.role !== 'tool') // Exclude tool messages
99
+ .map((msg) => {
100
+ // Remove tool_calls field as it's not accepted by Responses API
101
+ const { tool_calls: _tool_calls, tool_call_id: _tool_call_id, usage, ...cleanMsg } = msg;
102
+ // Ensure role is valid for Responses API
103
+ const validRole = cleanMsg.role;
104
+ return {
105
+ role: validRole,
106
+ content: cleanMsg.content,
107
+ ...(usage ? { usage } : {}), // Preserve usage data if present
108
+ };
109
+ })
110
+ .filter((msg) => msg !== null);
111
+ }
112
+ // Build the request object with conditional fields
113
+ const request = {
114
+ model,
115
+ ...otherParams,
116
+ ...(prompt ? { prompt } : {}),
117
+ };
118
+ // Add input array if we have messages, function calls, or function call outputs
119
+ if (transformedMessages ||
120
+ functionCalls.length > 0 ||
121
+ functionCallOutputs.length > 0) {
122
+ const inputItems = [];
123
+ // Add regular messages
124
+ if (transformedMessages) {
125
+ inputItems.push(...transformedMessages);
126
+ }
127
+ // Add function calls
128
+ if (functionCalls.length > 0) {
129
+ inputItems.push(...functionCalls);
130
+ }
131
+ // Add function call outputs
132
+ if (functionCallOutputs.length > 0) {
133
+ inputItems.push(...functionCallOutputs);
134
+ }
135
+ request.input = inputItems;
136
+ }
137
+ // Map conversation fields
138
+ if (model) {
139
+ if (conversationId) {
140
+ // Note: The API uses previous_response_id, not a conversation_id.
141
+ // We are mapping our internal parentId to this field.
142
+ if (parentId) {
143
+ request.previous_response_id = parentId;
144
+ request.store = true;
145
+ }
146
+ }
147
+ }
148
+ // Add tools if provided
149
+ if (tools && tools.length > 0) {
150
+ request.tools = tools;
151
+ if (tool_choice) {
152
+ request.tool_choice = tool_choice;
153
+ }
154
+ }
155
+ // Add stateful flag if provided
156
+ if (stateful !== undefined) {
157
+ request.stateful = stateful;
158
+ }
159
+ // Add stream flag if provided
160
+ if (params.stream !== undefined) {
161
+ request.stream = params.stream;
162
+ }
163
+ return request;
164
+ }
165
+ //# sourceMappingURL=buildResponsesRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildResponsesRequest.js","sourceRoot":"","sources":["../../../../src/providers/openai/buildResponsesRequest.ts"],"names":[],"mappings":"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"}