@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,113 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { ConversationCache } from './ConversationCache.js';
3
+ import { ContentGeneratorRole } from '../ContentGeneratorRole.js';
4
+ describe('ConversationCache', () => {
5
+ let cache;
6
+ beforeEach(() => {
7
+ cache = new ConversationCache(3, 2); // Small cache for testing
8
+ vi.useFakeTimers();
9
+ });
10
+ afterEach(() => {
11
+ vi.restoreAllMocks();
12
+ });
13
+ const createMessage = (content) => ({
14
+ role: ContentGeneratorRole.ASSISTANT,
15
+ content,
16
+ });
17
+ it('should store and retrieve messages', () => {
18
+ const messages = [createMessage('Hello'), createMessage('World')];
19
+ cache.set('conv1', 'parent1', messages);
20
+ const retrieved = cache.get('conv1', 'parent1');
21
+ expect(retrieved).toEqual(messages);
22
+ });
23
+ it('should return null for non-existent conversations', () => {
24
+ const retrieved = cache.get('nonexistent', 'parent');
25
+ expect(retrieved).toBeNull();
26
+ });
27
+ it('should respect TTL and expire old entries', () => {
28
+ const messages = [createMessage('Test message')];
29
+ cache.set('conv1', 'parent1', messages);
30
+ expect(cache.get('conv1', 'parent1')).toEqual(messages);
31
+ // Fast forward past TTL (2 hours + 1 minute)
32
+ vi.advanceTimersByTime(2 * 60 * 60 * 1000 + 60 * 1000);
33
+ expect(cache.get('conv1', 'parent1')).toBeNull();
34
+ expect(cache.has('conv1', 'parent1')).toBe(false);
35
+ });
36
+ it('should evict oldest entries when max size is reached', () => {
37
+ const messages1 = [createMessage('Message 1')];
38
+ const messages2 = [createMessage('Message 2')];
39
+ const messages3 = [createMessage('Message 3')];
40
+ const messages4 = [createMessage('Message 4')];
41
+ cache.set('conv1', 'parent1', messages1);
42
+ cache.set('conv2', 'parent2', messages2);
43
+ cache.set('conv3', 'parent3', messages3);
44
+ // Cache is now full (max size = 3)
45
+ expect(cache.size()).toBe(3);
46
+ // Adding a fourth item should evict the oldest (conv1)
47
+ cache.set('conv4', 'parent4', messages4);
48
+ expect(cache.size()).toBe(3);
49
+ expect(cache.get('conv1', 'parent1')).toBeNull();
50
+ expect(cache.get('conv2', 'parent2')).toEqual(messages2);
51
+ expect(cache.get('conv3', 'parent3')).toEqual(messages3);
52
+ expect(cache.get('conv4', 'parent4')).toEqual(messages4);
53
+ });
54
+ it('should update access order on get', () => {
55
+ const messages1 = [createMessage('Message 1')];
56
+ const messages2 = [createMessage('Message 2')];
57
+ const messages3 = [createMessage('Message 3')];
58
+ const messages4 = [createMessage('Message 4')];
59
+ cache.set('conv1', 'parent1', messages1);
60
+ cache.set('conv2', 'parent2', messages2);
61
+ cache.set('conv3', 'parent3', messages3);
62
+ // Access conv1 to move it to the end
63
+ cache.get('conv1', 'parent1');
64
+ // Now adding conv4 should evict conv2 (oldest unaccessed)
65
+ cache.set('conv4', 'parent4', messages4);
66
+ expect(cache.get('conv1', 'parent1')).toEqual(messages1);
67
+ expect(cache.get('conv2', 'parent2')).toBeNull();
68
+ expect(cache.get('conv3', 'parent3')).toEqual(messages3);
69
+ expect(cache.get('conv4', 'parent4')).toEqual(messages4);
70
+ });
71
+ it('should handle has() method correctly', () => {
72
+ const messages = [createMessage('Test')];
73
+ cache.set('conv1', 'parent1', messages);
74
+ expect(cache.has('conv1', 'parent1')).toBe(true);
75
+ expect(cache.has('conv2', 'parent2')).toBe(false);
76
+ // Test expiration
77
+ vi.advanceTimersByTime(3 * 60 * 60 * 1000); // 3 hours
78
+ expect(cache.has('conv1', 'parent1')).toBe(false);
79
+ });
80
+ it('should clear all entries', () => {
81
+ cache.set('conv1', 'parent1', [createMessage('Message 1')]);
82
+ cache.set('conv2', 'parent2', [createMessage('Message 2')]);
83
+ expect(cache.size()).toBe(2);
84
+ cache.clear();
85
+ expect(cache.size()).toBe(0);
86
+ expect(cache.get('conv1', 'parent1')).toBeNull();
87
+ expect(cache.get('conv2', 'parent2')).toBeNull();
88
+ });
89
+ it('should handle updating existing entries', () => {
90
+ const messages1 = [createMessage('Original')];
91
+ const messages2 = [createMessage('Updated')];
92
+ cache.set('conv1', 'parent1', messages1);
93
+ expect(cache.get('conv1', 'parent1')).toEqual(messages1);
94
+ // Update with new messages
95
+ cache.set('conv1', 'parent1', messages2);
96
+ expect(cache.get('conv1', 'parent1')).toEqual(messages2);
97
+ // Should still have only one entry
98
+ expect(cache.size()).toBe(1);
99
+ });
100
+ it('should use different keys for different conversation/parent combinations', () => {
101
+ const messages1 = [createMessage('Conv1 Parent1')];
102
+ const messages2 = [createMessage('Conv1 Parent2')];
103
+ const messages3 = [createMessage('Conv2 Parent1')];
104
+ cache.set('conv1', 'parent1', messages1);
105
+ cache.set('conv1', 'parent2', messages2);
106
+ cache.set('conv2', 'parent1', messages3);
107
+ expect(cache.get('conv1', 'parent1')).toEqual(messages1);
108
+ expect(cache.get('conv1', 'parent2')).toEqual(messages2);
109
+ expect(cache.get('conv2', 'parent1')).toEqual(messages3);
110
+ expect(cache.size()).toBe(3);
111
+ });
112
+ });
113
+ //# sourceMappingURL=ConversationCache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationCache.test.js","sourceRoot":"","sources":["../../../../src/providers/openai/ConversationCache.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { IMessage } from '../IMessage.js';
2
+ import { ITool } from '../ITool.js';
3
+ export interface IChatGenerateParams {
4
+ messages: IMessage[];
5
+ tools?: ITool[];
6
+ stream?: boolean;
7
+ conversationId?: string;
8
+ parentId?: string;
9
+ tool_choice?: string | object;
10
+ stateful?: boolean;
11
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IChatGenerateParams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IChatGenerateParams.js","sourceRoot":"","sources":["../../../../src/providers/openai/IChatGenerateParams.ts"],"names":[],"mappings":""}
@@ -0,0 +1,189 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { OpenAIProvider } from './OpenAIProvider.js';
3
+ import { ContentGeneratorRole } from '../ContentGeneratorRole.js';
4
+ // Mock fetch globally
5
+ global.fetch = vi.fn();
6
+ describe.skip('OpenAIProvider.callResponsesEndpoint (stateless)', () => {
7
+ let provider;
8
+ beforeEach(() => {
9
+ vi.clearAllMocks();
10
+ provider = new OpenAIProvider('test-key');
11
+ provider.setModel('gpt-4o'); // Use a model that supports responses API
12
+ });
13
+ function createSSEResponse(chunks) {
14
+ const encoder = new TextEncoder();
15
+ const stream = new ReadableStream({
16
+ start(controller) {
17
+ chunks.forEach((chunk) => {
18
+ controller.enqueue(encoder.encode(chunk));
19
+ });
20
+ controller.close();
21
+ },
22
+ });
23
+ return new Response(stream, {
24
+ status: 200,
25
+ headers: { 'content-type': 'text/event-stream' },
26
+ });
27
+ }
28
+ it('should make successful stateless streaming call', async () => {
29
+ const chunks = [
30
+ 'data: {"type":"response.output_text.delta","delta":"Hello"}\n\n',
31
+ 'data: {"type":"response.completed","response":{"usage":{"input_tokens":10,"output_tokens":1,"total_tokens":11}}}\n\n',
32
+ 'data: [DONE]\n\n',
33
+ ];
34
+ vi.mocked(global.fetch).mockResolvedValueOnce(createSSEResponse(chunks));
35
+ const messages = [
36
+ {
37
+ role: ContentGeneratorRole.USER,
38
+ content: 'Hello',
39
+ },
40
+ ];
41
+ const generator = await provider.callResponsesEndpoint(messages, [], {
42
+ stream: true,
43
+ stateful: false,
44
+ });
45
+ const results = [];
46
+ for await (const message of generator) {
47
+ results.push(message);
48
+ }
49
+ expect(results.length).toBeGreaterThan(0);
50
+ expect(results.some((m) => m.content === 'Hello')).toBe(true);
51
+ });
52
+ it('should make successful non-streaming stateless call', async () => {
53
+ const responseData = {
54
+ id: 'resp-123',
55
+ model: 'gpt-4o',
56
+ object: 'chat.completion',
57
+ choices: [
58
+ {
59
+ message: {
60
+ role: ContentGeneratorRole.ASSISTANT,
61
+ content: 'Non-streaming response',
62
+ },
63
+ finish_reason: 'stop',
64
+ },
65
+ ],
66
+ };
67
+ vi.mocked(global.fetch).mockResolvedValueOnce(new Response(JSON.stringify(responseData), {
68
+ status: 200,
69
+ headers: { 'content-type': 'application/json' },
70
+ }));
71
+ const messages = [
72
+ {
73
+ role: ContentGeneratorRole.USER,
74
+ content: 'Hello',
75
+ },
76
+ ];
77
+ const generator = await provider.callResponsesEndpoint(messages, [], {
78
+ stream: false,
79
+ stateful: false,
80
+ });
81
+ const results = [];
82
+ for await (const message of generator) {
83
+ results.push(message);
84
+ }
85
+ expect(results).toHaveLength(1);
86
+ expect(results[0].content).toBe('Non-streaming response');
87
+ });
88
+ it('should handle tool calls in stateless mode', async () => {
89
+ const chunks = [
90
+ 'data: {"type":"response.output_item.added","item":{"id":"item1","type":"function_call","name":"test_tool","call_id":"call_123"}}\n\n',
91
+ 'data: {"type":"response.function_call_arguments.delta","item_id":"item1","delta":"{\\"value\\": \\"test\\"}"}\n\n',
92
+ 'data: {"type":"response.output_item.done","item":{"id":"item1","type":"function_call","arguments":"{\\"value\\": \\"test\\"}"}}\n\n',
93
+ 'data: [DONE]\n\n',
94
+ ];
95
+ vi.mocked(global.fetch).mockResolvedValueOnce(createSSEResponse(chunks));
96
+ const messages = [
97
+ {
98
+ role: ContentGeneratorRole.USER,
99
+ content: 'Hello',
100
+ },
101
+ ];
102
+ const tools = [
103
+ {
104
+ type: 'function',
105
+ function: {
106
+ name: 'test_tool',
107
+ description: 'A test tool',
108
+ parameters: {
109
+ type: 'object',
110
+ properties: {},
111
+ },
112
+ },
113
+ },
114
+ ];
115
+ const generator = await provider.callResponsesEndpoint(messages, tools, {
116
+ stream: true,
117
+ tool_choice: 'auto',
118
+ stateful: false,
119
+ });
120
+ const results = [];
121
+ for await (const message of generator) {
122
+ results.push(message);
123
+ }
124
+ const toolCallMessage = results.find((m) => m.tool_calls);
125
+ expect(toolCallMessage).toBeDefined();
126
+ expect(toolCallMessage?.tool_calls?.[0].function.name).toBe('test_tool');
127
+ });
128
+ it.skip('should handle conversationId in stateless mode', async () => {
129
+ // SKIPPING: Test uses OpenAI chat completion format instead of Responses API format
130
+ const chunks = [
131
+ 'data: {"id":"resp-123","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Response with conversationId"}}]}\n\n',
132
+ 'data: {"id":"resp-123","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}\n\n',
133
+ 'data: [DONE]\n\n',
134
+ ];
135
+ vi.mocked(global.fetch).mockResolvedValueOnce(createSSEResponse(chunks));
136
+ const messages = [
137
+ {
138
+ role: ContentGeneratorRole.USER,
139
+ content: 'Hello',
140
+ },
141
+ ];
142
+ const generator = await provider.callResponsesEndpoint(messages, [], {
143
+ stream: true,
144
+ conversationId: 'test-conversation',
145
+ stateful: false,
146
+ });
147
+ const results = [];
148
+ for await (const message of generator) {
149
+ results.push(message);
150
+ }
151
+ expect(results.length).toBeGreaterThan(0);
152
+ expect(results.some((m) => m.content?.includes('Response with conversationId'))).toBe(true);
153
+ // Verify the request included conversationId (as conversation_id in snake_case)
154
+ expect(global.fetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
155
+ body: expect.stringContaining('"conversation_id":"test-conversation"'),
156
+ }));
157
+ });
158
+ it.skip('should handle parentId in stateless mode', async () => {
159
+ // SKIPPING: Test uses OpenAI chat completion format instead of Responses API format
160
+ const chunks = [
161
+ 'data: {"id":"resp-123","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Response with parentId"}}]}\n\n',
162
+ 'data: {"id":"resp-123","model":"gpt-4o","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}\n\n',
163
+ 'data: [DONE]\n\n',
164
+ ];
165
+ vi.mocked(global.fetch).mockResolvedValueOnce(createSSEResponse(chunks));
166
+ const messages = [
167
+ {
168
+ role: ContentGeneratorRole.USER,
169
+ content: 'Hello',
170
+ },
171
+ ];
172
+ const generator = await provider.callResponsesEndpoint(messages, [], {
173
+ stream: true,
174
+ parentId: 'test-parent',
175
+ stateful: false,
176
+ });
177
+ const results = [];
178
+ for await (const message of generator) {
179
+ results.push(message);
180
+ }
181
+ expect(results.length).toBeGreaterThan(0);
182
+ expect(results.some((m) => m.content?.includes('Response with parentId'))).toBe(true);
183
+ // Verify the request included parentId (as parent_id in snake_case)
184
+ expect(global.fetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
185
+ body: expect.stringContaining('"parent_id":"test-parent"'),
186
+ }));
187
+ });
188
+ });
189
+ //# sourceMappingURL=OpenAIProvider.callResponses.stateless.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAIProvider.callResponses.stateless.test.js","sourceRoot":"","sources":["../../../../src/providers/openai/OpenAIProvider.callResponses.stateless.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,sBAAsB;AACtB,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAEvB,QAAQ,CAAC,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;IACrE,IAAI,QAAwB,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,QAAQ,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1C,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,0CAA0C;IACzE,CAAC,CAAC,CAAC;IAEH,SAAS,iBAAiB,CAAC,MAAgB;QACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;YAChC,KAAK,CAAC,UAAU;gBACd,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACvB,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;gBACH,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE;YAC1B,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,MAAM,GAAG;YACb,iEAAiE;YACjE,sHAAsH;YACtH,kBAAkB;SACnB,CAAC;QAEF,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzE,MAAM,QAAQ,GAAe;YAC3B;gBACE,IAAI,EAAE,oBAAoB,CAAC,IAAI;gBAC/B,OAAO,EAAE,OAAO;aACjB;SACF,CAAC;QAEF,MAAM,SAAS,GAAG,MAChB,QAOD,CAAC,qBAAqB,CAAC,QAAQ,EAAE,EAAE,EAAE;YACpC,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,YAAY,GAAG;YACnB,EAAE,EAAE,UAAU;YACd,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,iBAAiB;YACzB,OAAO,EAAE;gBACP;oBACE,OAAO,EAAE;wBACP,IAAI,EAAE,oBAAoB,CAAC,SAAS;wBACpC,OAAO,EAAE,wBAAwB;qBAClC;oBACD,aAAa,EAAE,MAAM;iBACtB;aACF;SACF,CAAC;QAEF,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAC3C,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;YACzC,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CACH,CAAC;QAEF,MAAM,QAAQ,GAAe;YAC3B;gBACE,IAAI,EAAE,oBAAoB,CAAC,IAAI;gBAC/B,OAAO,EAAE,OAAO;aACjB;SACF,CAAC;QAEF,MAAM,SAAS,GAAG,MAChB,QAOD,CAAC,qBAAqB,CAAC,QAAQ,EAAE,EAAE,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG;YACb,sIAAsI;YACtI,mHAAmH;YACnH,qIAAqI;YACrI,kBAAkB;SACnB,CAAC;QAEF,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzE,MAAM,QAAQ,GAAe;YAC3B;gBACE,IAAI,EAAE,oBAAoB,CAAC,IAAI;gBAC/B,OAAO,EAAE,OAAO;aACjB;SACF,CAAC;QAEF,MAAM,KAAK,GAAG;YACZ;gBACE,IAAI,EAAE,UAAmB;gBACzB,QAAQ,EAAE;oBACR,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,aAAa;oBAC1B,UAAU,EAAE;wBACV,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,EAAE;qBACf;iBACF;aACF;SACF,CAAC;QAEF,MAAM,SAAS,GAAG,MAChB,QAOD,CAAC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE;YACvC,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,MAAM;YACnB,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QACnE,oFAAoF;QACpF,MAAM,MAAM,GAAG;YACb,0JAA0J;YAC1J,yIAAyI;YACzI,kBAAkB;SACnB,CAAC;QAEF,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzE,MAAM,QAAQ,GAAe;YAC3B;gBACE,IAAI,EAAE,oBAAoB,CAAC,IAAI;gBAC/B,OAAO,EAAE,OAAO;aACjB;SACF,CAAC;QAEF,MAAM,SAAS,GAAG,MAChB,QAOD,CAAC,qBAAqB,CAAC,QAAQ,EAAE,EAAE,EAAE;YACpC,MAAM,EAAE,IAAI;YACZ,cAAc,EAAE,mBAAmB;YACnC,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,gFAAgF;QAChF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACvC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,MAAM,CAAC,gBAAgB,CAAC;YACtB,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,uCAAuC,CAAC;SACvE,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QAC7D,oFAAoF;QACpF,MAAM,MAAM,GAAG;YACb,oJAAoJ;YACpJ,yIAAyI;YACzI,kBAAkB;SACnB,CAAC;QAEF,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzE,MAAM,QAAQ,GAAe;YAC3B;gBACE,IAAI,EAAE,oBAAoB,CAAC,IAAI;gBAC/B,OAAO,EAAE,OAAO;aACjB;SACF,CAAC;QAEF,MAAM,SAAS,GAAG,MAChB,QAOD,CAAC,qBAAqB,CAAC,QAAQ,EAAE,EAAE,EAAE;YACpC,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CACnE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,oEAAoE;QACpE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACvC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,MAAM,CAAC,gBAAgB,CAAC;YACtB,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,2BAA2B,CAAC;SAC3D,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,80 @@
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 { IProvider } from '../IProvider.js';
17
+ import { IModel } from '../IModel.js';
18
+ import { ITool } from '../ITool.js';
19
+ import { IMessage } from '../IMessage.js';
20
+ import { ToolFormat } from '../../tools/IToolFormatter.js';
21
+ import { IProviderConfig } from '../types/IProviderConfig.js';
22
+ import { ConversationCache } from './ConversationCache.js';
23
+ export declare class OpenAIProvider implements IProvider {
24
+ name: string;
25
+ private openai;
26
+ private currentModel;
27
+ private apiKey;
28
+ private baseURL?;
29
+ private config?;
30
+ private toolFormatter;
31
+ private toolFormatOverride?;
32
+ private conversationCache;
33
+ constructor(apiKey: string, baseURL?: string, config?: IProviderConfig);
34
+ private requiresTextToolCallParsing;
35
+ getToolFormat(): ToolFormat;
36
+ private shouldUseResponses;
37
+ private callResponsesEndpoint;
38
+ private handleResponsesApiResponse;
39
+ getModels(): Promise<IModel[]>;
40
+ generateChatCompletion(messages: IMessage[], tools?: ITool[], _toolFormat?: string): AsyncIterableIterator<IMessage>;
41
+ setModel(modelId: string): void;
42
+ getCurrentModel(): string;
43
+ setApiKey(apiKey: string): void;
44
+ setBaseUrl(baseUrl?: string): void;
45
+ setConfig(config: IProviderConfig): void;
46
+ setToolFormatOverride(format: ToolFormat | null): void;
47
+ /**
48
+ * Estimates the remote context usage for the current conversation
49
+ * @param conversationId The conversation ID
50
+ * @param parentId The parent message ID
51
+ * @param promptMessages The messages being sent in the current prompt
52
+ * @returns Context usage information including remote tokens
53
+ */
54
+ estimateContextUsage(conversationId: string | undefined, parentId: string | undefined, promptMessages: IMessage[]): {
55
+ totalTokens: number;
56
+ remoteTokens: number;
57
+ promptTokens: number;
58
+ maxTokens: number;
59
+ contextUsedPercent: number;
60
+ tokensRemaining: number;
61
+ };
62
+ /**
63
+ * Get the conversation cache instance
64
+ * @returns The conversation cache
65
+ */
66
+ getConversationCache(): ConversationCache;
67
+ /**
68
+ * OpenAI always requires payment (API key)
69
+ */
70
+ isPaidMode(): boolean;
71
+ clearState(): void;
72
+ /**
73
+ * Get the list of server tools supported by this provider
74
+ */
75
+ getServerTools(): string[];
76
+ /**
77
+ * Invoke a server tool (native provider tool)
78
+ */
79
+ invokeServerTool(_toolName: string, _params: unknown, _config?: unknown): Promise<unknown>;
80
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,125 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeAll } from 'vitest';
7
+ import { OpenAIProvider } from './OpenAIProvider.js';
8
+ import { ContentGeneratorRole } from '../ContentGeneratorRole.js';
9
+ import fs from 'fs';
10
+ import path from 'path';
11
+ import os from 'os';
12
+ // Helper to load API key from file
13
+ function loadApiKey(filename) {
14
+ const keyPath = path.join(os.homedir(), filename);
15
+ try {
16
+ if (fs.existsSync(keyPath)) {
17
+ return fs.readFileSync(keyPath, 'utf8').trim();
18
+ }
19
+ }
20
+ catch (error) {
21
+ console.error(`Failed to read ${filename}:`, error);
22
+ }
23
+ return undefined;
24
+ }
25
+ const OPENAI_API_KEY = loadApiKey('.openai_key');
26
+ const skipTests = !OPENAI_API_KEY;
27
+ describe.skipIf(skipTests)('OpenAIProvider Integration Tests', () => {
28
+ let provider;
29
+ beforeAll(() => {
30
+ if (!OPENAI_API_KEY) {
31
+ console.log('Skipping OpenAI integration tests: ~/.openai_key not found');
32
+ return;
33
+ }
34
+ provider = new OpenAIProvider(OPENAI_API_KEY);
35
+ });
36
+ it('should fetch real models from OpenAI API', async () => {
37
+ const models = await provider.getModels();
38
+ // Verify we got models back
39
+ expect(models).toBeDefined();
40
+ expect(Array.isArray(models)).toBe(true);
41
+ expect(models.length).toBeGreaterThan(0);
42
+ // Verify model structure
43
+ const firstModel = models[0];
44
+ expect(firstModel).toHaveProperty('id');
45
+ expect(firstModel).toHaveProperty('name');
46
+ expect(firstModel).toHaveProperty('provider', 'openai');
47
+ expect(firstModel).toHaveProperty('supportedToolFormats');
48
+ expect(firstModel.supportedToolFormats).toEqual(['openai']);
49
+ // Check for some expected models
50
+ const modelIds = models.map((m) => m.id);
51
+ expect(modelIds).toContain('gpt-3.5-turbo');
52
+ console.log(`Found ${models.length} OpenAI models:`, modelIds);
53
+ });
54
+ it('should generate real chat completion', async () => {
55
+ const messages = [
56
+ {
57
+ role: ContentGeneratorRole.USER,
58
+ content: 'Say "Hello from integration test" and nothing else.',
59
+ },
60
+ ];
61
+ const responses = [];
62
+ const generator = provider.generateChatCompletion(messages);
63
+ for await (const message of generator) {
64
+ console.log('Received message:', JSON.stringify(message));
65
+ responses.push(message);
66
+ }
67
+ // Should have received at least one response
68
+ expect(responses.length).toBeGreaterThan(0);
69
+ // Combine all content from messages
70
+ const fullContent = responses.map((m) => m.content).join('');
71
+ expect(fullContent).toBeTruthy();
72
+ expect(fullContent).toContain('Hello from integration test');
73
+ // Check that we have assistant messages
74
+ const assistantMessages = responses.filter((m) => m.role === 'assistant');
75
+ expect(assistantMessages.length).toBeGreaterThan(0);
76
+ // Note: The exact content may vary based on the model's response
77
+ console.log('Received full response:', fullContent);
78
+ });
79
+ it('should handle tool calls', async () => {
80
+ const messages = [
81
+ {
82
+ role: ContentGeneratorRole.USER,
83
+ content: 'What is the weather in San Francisco? Use the get_weather tool.',
84
+ },
85
+ ];
86
+ const tools = [
87
+ {
88
+ type: 'function',
89
+ function: {
90
+ name: 'get_weather',
91
+ description: 'Get the weather for a location',
92
+ parameters: {
93
+ type: 'object',
94
+ properties: {
95
+ location: { type: 'string', description: 'The city name' },
96
+ unit: { type: 'string', enum: ['celsius', 'fahrenheit'] },
97
+ },
98
+ required: ['location'],
99
+ },
100
+ },
101
+ },
102
+ ];
103
+ const responses = [];
104
+ const generator = provider.generateChatCompletion(messages, tools);
105
+ for await (const message of generator) {
106
+ console.log('Tool message:', JSON.stringify(message));
107
+ responses.push(message);
108
+ }
109
+ // Find message with tool calls
110
+ const toolCallMessage = responses.find((m) => m.tool_calls && m.tool_calls.length > 0);
111
+ expect(toolCallMessage).toBeDefined();
112
+ expect(toolCallMessage?.tool_calls).toBeDefined();
113
+ expect(Array.isArray(toolCallMessage?.tool_calls)).toBe(true);
114
+ if (toolCallMessage?.tool_calls && toolCallMessage.tool_calls.length > 0) {
115
+ const toolCall = toolCallMessage.tool_calls[0];
116
+ expect(toolCall.function.name).toBe('get_weather');
117
+ expect(toolCall.function.arguments).toBeTruthy();
118
+ // Parse and verify arguments
119
+ const args = JSON.parse(toolCall.function.arguments);
120
+ expect(args.location.toLowerCase()).toContain('san francisco');
121
+ console.log('Tool call received:', toolCall);
122
+ }
123
+ });
124
+ });
125
+ //# sourceMappingURL=OpenAIProvider.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAIProvider.integration.test.js","sourceRoot":"","sources":["../../../../src/providers/openai/OpenAIProvider.integration.test.ts"],"names":[],"mappings":"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"}