@vybestack/llxprt-code-core 0.1.12 → 0.1.13-hotfix1

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 (327) hide show
  1. package/dist/src/adapters/IStreamAdapter.d.ts +18 -0
  2. package/dist/src/adapters/IStreamAdapter.js +7 -0
  3. package/dist/src/adapters/IStreamAdapter.js.map +1 -0
  4. package/dist/src/code_assist/oauth2.d.ts +1 -1
  5. package/dist/src/code_assist/oauth2.js +51 -29
  6. package/dist/src/code_assist/oauth2.js.map +1 -1
  7. package/dist/src/code_assist/oauth2.test.js +36 -7
  8. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  9. package/dist/src/code_assist/server.test.js +10 -2
  10. package/dist/src/code_assist/server.test.js.map +1 -1
  11. package/dist/src/config/config.d.ts +28 -5
  12. package/dist/src/config/config.js +29 -4
  13. package/dist/src/config/config.js.map +1 -1
  14. package/dist/src/config/config.test.js +2 -3
  15. package/dist/src/config/config.test.js.map +1 -1
  16. package/dist/src/core/client.d.ts +4 -2
  17. package/dist/src/core/client.js +68 -7
  18. package/dist/src/core/client.js.map +1 -1
  19. package/dist/src/core/client.test.js +8 -0
  20. package/dist/src/core/client.test.js.map +1 -1
  21. package/dist/src/core/contentGenerator.d.ts +3 -2
  22. package/dist/src/core/contentGenerator.js +6 -8
  23. package/dist/src/core/contentGenerator.js.map +1 -1
  24. package/dist/src/core/contentGenerator.test.js +12 -5
  25. package/dist/src/core/contentGenerator.test.js.map +1 -1
  26. package/dist/src/core/coreToolScheduler.test.js +4 -2
  27. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  28. package/dist/src/core/geminiChat.js +50 -3
  29. package/dist/src/core/geminiChat.js.map +1 -1
  30. package/dist/src/core/modelCheck.d.ts +1 -1
  31. package/dist/src/core/modelCheck.js +10 -3
  32. package/dist/src/core/modelCheck.js.map +1 -1
  33. package/dist/src/core/nonInteractiveToolExecutor.test.js +3 -0
  34. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  35. package/dist/src/core/prompts.d.ts +1 -1
  36. package/dist/src/core/prompts.js +14 -2
  37. package/dist/src/core/prompts.js.map +1 -1
  38. package/dist/src/core/turn.js +6 -0
  39. package/dist/src/core/turn.js.map +1 -1
  40. package/dist/src/index.d.ts +29 -1
  41. package/dist/src/index.js +33 -0
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/mcp/oauth-provider.d.ts +142 -0
  44. package/dist/src/mcp/oauth-provider.js +446 -0
  45. package/dist/src/mcp/oauth-provider.js.map +1 -0
  46. package/dist/src/mcp/oauth-provider.test.js +520 -0
  47. package/dist/src/mcp/oauth-provider.test.js.map +1 -0
  48. package/dist/src/mcp/oauth-token-storage.d.ts +81 -0
  49. package/dist/src/mcp/oauth-token-storage.js +149 -0
  50. package/dist/src/mcp/oauth-token-storage.js.map +1 -0
  51. package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
  52. package/dist/src/mcp/oauth-token-storage.test.js +205 -0
  53. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
  54. package/dist/src/mcp/oauth-utils.d.ts +109 -0
  55. package/dist/src/mcp/oauth-utils.js +183 -0
  56. package/dist/src/mcp/oauth-utils.js.map +1 -0
  57. package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
  58. package/dist/src/mcp/oauth-utils.test.js +144 -0
  59. package/dist/src/mcp/oauth-utils.test.js.map +1 -0
  60. package/dist/src/parsers/TextToolCallParser.d.ts +35 -0
  61. package/dist/src/parsers/TextToolCallParser.js +248 -0
  62. package/dist/src/parsers/TextToolCallParser.js.map +1 -0
  63. package/dist/src/parsers/TextToolCallParser.test.d.ts +1 -0
  64. package/dist/src/parsers/TextToolCallParser.test.js +225 -0
  65. package/dist/src/parsers/TextToolCallParser.test.js.map +1 -0
  66. package/dist/src/providers/ContentGeneratorRole.d.ts +14 -0
  67. package/dist/src/providers/ContentGeneratorRole.js +16 -0
  68. package/dist/src/providers/ContentGeneratorRole.js.map +1 -0
  69. package/dist/src/providers/IMessage.d.ts +38 -0
  70. package/dist/src/providers/IMessage.js +17 -0
  71. package/dist/src/providers/IMessage.js.map +1 -0
  72. package/dist/src/providers/IModel.d.ts +23 -0
  73. package/dist/src/providers/IModel.js +17 -0
  74. package/dist/src/providers/IModel.js.map +1 -0
  75. package/dist/src/providers/IProvider.d.ts +36 -0
  76. package/dist/src/providers/IProvider.js +17 -0
  77. package/dist/src/providers/IProvider.js.map +1 -0
  78. package/dist/src/providers/IProviderConfig.d.ts +31 -0
  79. package/dist/src/providers/IProviderConfig.js +7 -0
  80. package/dist/src/providers/IProviderConfig.js.map +1 -0
  81. package/dist/src/providers/IProviderManager.d.ts +53 -0
  82. package/dist/src/providers/IProviderManager.js +7 -0
  83. package/dist/src/providers/IProviderManager.js.map +1 -0
  84. package/dist/src/providers/ITool.d.ts +23 -0
  85. package/dist/src/providers/ITool.js +17 -0
  86. package/dist/src/providers/ITool.js.map +1 -0
  87. package/dist/src/providers/ProviderContentGenerator.d.ts +1 -1
  88. package/dist/src/providers/ProviderManager.d.ts +24 -0
  89. package/dist/src/providers/ProviderManager.gemini-switch.test.d.ts +6 -0
  90. package/dist/src/providers/ProviderManager.gemini-switch.test.js +57 -0
  91. package/dist/src/providers/ProviderManager.gemini-switch.test.js.map +1 -0
  92. package/dist/src/providers/ProviderManager.js +116 -0
  93. package/dist/src/providers/ProviderManager.js.map +1 -0
  94. package/dist/src/providers/ProviderManager.test.d.ts +6 -0
  95. package/dist/src/providers/ProviderManager.test.js +284 -0
  96. package/dist/src/providers/ProviderManager.test.js.map +1 -0
  97. package/dist/src/providers/adapters/GeminiCompatibleWrapper.d.ts +2 -1
  98. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +15 -2
  99. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +1 -1
  100. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +20 -0
  101. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +1 -1
  102. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +57 -0
  103. package/dist/src/providers/anthropic/AnthropicProvider.js +490 -0
  104. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -0
  105. package/dist/src/providers/anthropic/AnthropicProvider.test.d.ts +1 -0
  106. package/dist/src/providers/anthropic/AnthropicProvider.test.js +486 -0
  107. package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +1 -0
  108. package/dist/src/providers/errors.d.ts +13 -0
  109. package/dist/src/providers/errors.js +19 -0
  110. package/dist/src/providers/errors.js.map +1 -0
  111. package/dist/src/providers/gemini/GeminiProvider.d.ts +97 -0
  112. package/dist/src/providers/gemini/GeminiProvider.integration.test.d.ts +6 -0
  113. package/dist/src/providers/gemini/GeminiProvider.integration.test.js +90 -0
  114. package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +1 -0
  115. package/dist/src/providers/gemini/GeminiProvider.js +937 -0
  116. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -0
  117. package/dist/src/providers/gemini/GeminiProvider.test.d.ts +6 -0
  118. package/dist/src/providers/gemini/GeminiProvider.test.js +136 -0
  119. package/dist/src/providers/gemini/GeminiProvider.test.js.map +1 -0
  120. package/dist/src/providers/integration/TEST_INSTRUCTIONS.md +197 -0
  121. package/dist/src/providers/integration/multi-provider.integration.test.d.ts +6 -0
  122. package/dist/src/providers/integration/multi-provider.integration.test.js +292 -0
  123. package/dist/src/providers/integration/multi-provider.integration.test.js.map +1 -0
  124. package/dist/src/providers/openai/ConversationCache.accumTokens.test.d.ts +1 -0
  125. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js +97 -0
  126. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js.map +1 -0
  127. package/dist/src/providers/openai/ConversationCache.d.ts +20 -0
  128. package/dist/src/providers/openai/ConversationCache.js +109 -0
  129. package/dist/src/providers/openai/ConversationCache.js.map +1 -0
  130. package/dist/src/providers/openai/ConversationCache.test.d.ts +1 -0
  131. package/dist/src/providers/openai/ConversationCache.test.js +113 -0
  132. package/dist/src/providers/openai/ConversationCache.test.js.map +1 -0
  133. package/dist/src/providers/openai/IChatGenerateParams.d.ts +11 -0
  134. package/dist/src/providers/openai/IChatGenerateParams.js +2 -0
  135. package/dist/src/providers/openai/IChatGenerateParams.js.map +1 -0
  136. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.d.ts +1 -0
  137. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js +189 -0
  138. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js.map +1 -0
  139. package/dist/src/providers/openai/OpenAIProvider.d.ts +80 -0
  140. package/dist/src/providers/openai/OpenAIProvider.integration.test.d.ts +6 -0
  141. package/dist/src/providers/openai/OpenAIProvider.integration.test.js +125 -0
  142. package/dist/src/providers/openai/OpenAIProvider.integration.test.js.map +1 -0
  143. package/dist/src/providers/openai/OpenAIProvider.js +523 -0
  144. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -0
  145. package/dist/src/providers/openai/OpenAIProvider.responses.test.d.ts +1 -0
  146. package/dist/src/providers/openai/OpenAIProvider.responses.test.js +326 -0
  147. package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +1 -0
  148. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.d.ts +1 -0
  149. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js +213 -0
  150. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js.map +1 -0
  151. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.d.ts +1 -0
  152. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +58 -0
  153. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +1 -0
  154. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.d.ts +6 -0
  155. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +105 -0
  156. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +1 -0
  157. package/dist/src/providers/openai/OpenAIProvider.switch.test.d.ts +1 -0
  158. package/dist/src/providers/openai/OpenAIProvider.switch.test.js +256 -0
  159. package/dist/src/providers/openai/OpenAIProvider.switch.test.js.map +1 -0
  160. package/dist/src/providers/openai/OpenAIProvider.test.d.ts +16 -0
  161. package/dist/src/providers/openai/OpenAIProvider.test.js +214 -0
  162. package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -0
  163. package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +2 -0
  164. package/dist/src/providers/openai/RESPONSES_API_MODELS.js +14 -0
  165. package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +1 -0
  166. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.d.ts +1 -0
  167. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js +210 -0
  168. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js.map +1 -0
  169. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.d.ts +1 -0
  170. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js +65 -0
  171. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js.map +1 -0
  172. package/dist/src/providers/openai/buildResponsesRequest.d.ts +73 -0
  173. package/dist/src/providers/openai/buildResponsesRequest.js +165 -0
  174. package/dist/src/providers/openai/buildResponsesRequest.js.map +1 -0
  175. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.d.ts +1 -0
  176. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js +129 -0
  177. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js.map +1 -0
  178. package/dist/src/providers/openai/buildResponsesRequest.test.d.ts +1 -0
  179. package/dist/src/providers/openai/buildResponsesRequest.test.js +406 -0
  180. package/dist/src/providers/openai/buildResponsesRequest.test.js.map +1 -0
  181. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.d.ts +1 -0
  182. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js +50 -0
  183. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js.map +1 -0
  184. package/dist/src/providers/openai/docs/accessing-provider-info.md +172 -0
  185. package/dist/src/providers/openai/docs/params-mapping.md +91 -0
  186. package/dist/src/providers/openai/docs/responses-api-tool-calls.md +96 -0
  187. package/dist/src/providers/openai/estimateRemoteTokens.d.ts +26 -0
  188. package/dist/src/providers/openai/estimateRemoteTokens.js +75 -0
  189. package/dist/src/providers/openai/estimateRemoteTokens.js.map +1 -0
  190. package/dist/src/providers/openai/estimateRemoteTokens.test.d.ts +1 -0
  191. package/dist/src/providers/openai/estimateRemoteTokens.test.js +125 -0
  192. package/dist/src/providers/openai/estimateRemoteTokens.test.js.map +1 -0
  193. package/dist/src/providers/openai/getOpenAIProviderInfo.d.ts +46 -0
  194. package/dist/src/providers/openai/getOpenAIProviderInfo.js +75 -0
  195. package/dist/src/providers/openai/getOpenAIProviderInfo.js.map +1 -0
  196. package/dist/src/providers/openai/parseResponsesStream.d.ts +3 -0
  197. package/dist/src/providers/openai/parseResponsesStream.js +462 -0
  198. package/dist/src/providers/openai/parseResponsesStream.js.map +1 -0
  199. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.d.ts +1 -0
  200. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js +192 -0
  201. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js.map +1 -0
  202. package/dist/src/providers/openai/parseResponsesStream.test.d.ts +1 -0
  203. package/dist/src/providers/openai/parseResponsesStream.test.js +151 -0
  204. package/dist/src/providers/openai/parseResponsesStream.test.js.map +1 -0
  205. package/dist/src/providers/tokenizers/AnthropicTokenizer.d.ts +19 -0
  206. package/dist/src/providers/tokenizers/AnthropicTokenizer.js +37 -0
  207. package/dist/src/providers/tokenizers/AnthropicTokenizer.js.map +1 -0
  208. package/dist/src/providers/tokenizers/ITokenizer.d.ts +18 -0
  209. package/dist/src/providers/tokenizers/ITokenizer.js +17 -0
  210. package/dist/src/providers/tokenizers/ITokenizer.js.map +1 -0
  211. package/dist/src/providers/tokenizers/OpenAITokenizer.d.ts +24 -0
  212. package/dist/src/providers/tokenizers/OpenAITokenizer.js +56 -0
  213. package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +1 -0
  214. package/dist/src/providers/types/IProviderConfig.d.ts +102 -0
  215. package/dist/src/providers/types/IProviderConfig.js +17 -0
  216. package/dist/src/providers/types/IProviderConfig.js.map +1 -0
  217. package/dist/src/providers/types.d.ts +4 -69
  218. package/dist/src/services/ideContext.d.ts +2 -0
  219. package/dist/src/services/ideContext.js +8 -0
  220. package/dist/src/services/ideContext.js.map +1 -1
  221. package/dist/src/services/ideContext.test.js +10 -0
  222. package/dist/src/services/ideContext.test.js.map +1 -1
  223. package/dist/src/services/loopDetectionService.d.ts +17 -1
  224. package/dist/src/services/loopDetectionService.js +117 -2
  225. package/dist/src/services/loopDetectionService.js.map +1 -1
  226. package/dist/src/services/loopDetectionService.test.js +109 -2
  227. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  228. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -0
  229. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +40 -2
  230. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  231. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -0
  232. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +4 -0
  233. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  234. package/dist/src/telemetry/sdk.js +0 -2
  235. package/dist/src/telemetry/sdk.js.map +1 -1
  236. package/dist/src/telemetry/types.d.ts +2 -1
  237. package/dist/src/telemetry/types.js +1 -0
  238. package/dist/src/telemetry/types.js.map +1 -1
  239. package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
  240. package/dist/src/telemetry/uiTelemetry.js +7 -0
  241. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  242. package/dist/src/telemetry/uiTelemetry.test.js +92 -0
  243. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  244. package/dist/src/tools/IToolFormatter.d.ts +40 -0
  245. package/dist/src/tools/IToolFormatter.js +17 -0
  246. package/dist/src/tools/IToolFormatter.js.map +1 -0
  247. package/dist/src/tools/ToolFormatter.d.ts +45 -0
  248. package/dist/src/tools/ToolFormatter.js +216 -0
  249. package/dist/src/tools/ToolFormatter.js.map +1 -0
  250. package/dist/src/tools/ToolFormatter.test.d.ts +16 -0
  251. package/dist/src/tools/ToolFormatter.test.js +349 -0
  252. package/dist/src/tools/ToolFormatter.test.js.map +1 -0
  253. package/dist/src/tools/ToolFormatter.toResponsesTool.test.d.ts +1 -0
  254. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js +241 -0
  255. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js.map +1 -0
  256. package/dist/src/tools/edit.d.ts +7 -1
  257. package/dist/src/tools/edit.js +19 -7
  258. package/dist/src/tools/edit.js.map +1 -1
  259. package/dist/src/tools/glob.js +2 -2
  260. package/dist/src/tools/glob.js.map +1 -1
  261. package/dist/src/tools/grep.js +2 -2
  262. package/dist/src/tools/grep.js.map +1 -1
  263. package/dist/src/tools/ls.js +2 -2
  264. package/dist/src/tools/ls.js.map +1 -1
  265. package/dist/src/tools/mcp-client.d.ts +0 -2
  266. package/dist/src/tools/mcp-client.js +8 -20
  267. package/dist/src/tools/mcp-client.js.map +1 -1
  268. package/dist/src/tools/mcp-client.test.js +1 -72
  269. package/dist/src/tools/mcp-client.test.js.map +1 -1
  270. package/dist/src/tools/mcp-tool.d.ts +11 -5
  271. package/dist/src/tools/mcp-tool.js +33 -9
  272. package/dist/src/tools/mcp-tool.js.map +1 -1
  273. package/dist/src/tools/mcp-tool.test.js +40 -24
  274. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  275. package/dist/src/tools/memoryTool.js +2 -2
  276. package/dist/src/tools/memoryTool.js.map +1 -1
  277. package/dist/src/tools/read-file.d.ts +2 -1
  278. package/dist/src/tools/read-file.js +5 -2
  279. package/dist/src/tools/read-file.js.map +1 -1
  280. package/dist/src/tools/read-many-files.js +2 -2
  281. package/dist/src/tools/read-many-files.js.map +1 -1
  282. package/dist/src/tools/shell.js +2 -2
  283. package/dist/src/tools/shell.js.map +1 -1
  284. package/dist/src/tools/todo-read.js +2 -2
  285. package/dist/src/tools/todo-read.js.map +1 -1
  286. package/dist/src/tools/todo-write.js +2 -2
  287. package/dist/src/tools/todo-write.js.map +1 -1
  288. package/dist/src/tools/tool-registry.d.ts +0 -1
  289. package/dist/src/tools/tool-registry.js +11 -8
  290. package/dist/src/tools/tool-registry.js.map +1 -1
  291. package/dist/src/tools/tool-registry.test.js +36 -10
  292. package/dist/src/tools/tool-registry.test.js.map +1 -1
  293. package/dist/src/tools/tools.d.ts +37 -2
  294. package/dist/src/tools/tools.js +25 -2
  295. package/dist/src/tools/tools.js.map +1 -1
  296. package/dist/src/tools/web-fetch.integration.test.d.ts +6 -0
  297. package/dist/src/tools/web-fetch.integration.test.js +532 -0
  298. package/dist/src/tools/web-fetch.integration.test.js.map +1 -0
  299. package/dist/src/tools/web-fetch.js +57 -50
  300. package/dist/src/tools/web-fetch.js.map +1 -1
  301. package/dist/src/tools/web-search.js +34 -6
  302. package/dist/src/tools/web-search.js.map +1 -1
  303. package/dist/src/tools/web-search.test.d.ts +6 -0
  304. package/dist/src/tools/web-search.test.js +229 -0
  305. package/dist/src/tools/web-search.test.js.map +1 -0
  306. package/dist/src/tools/write-file.js +12 -5
  307. package/dist/src/tools/write-file.js.map +1 -1
  308. package/dist/src/utils/browser.d.ts +13 -0
  309. package/dist/src/utils/browser.js +49 -0
  310. package/dist/src/utils/browser.js.map +1 -0
  311. package/dist/src/utils/errors.js +4 -4
  312. package/dist/src/utils/errors.js.map +1 -1
  313. package/dist/src/utils/memoryDiscovery.js +5 -1
  314. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  315. package/dist/src/utils/quotaErrorDetection.js +0 -2
  316. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  317. package/dist/src/utils/retry.d.ts +6 -0
  318. package/dist/src/utils/retry.js +1 -1
  319. package/dist/src/utils/retry.js.map +1 -1
  320. package/dist/src/utils/user_account.js +6 -1
  321. package/dist/src/utils/user_account.js.map +1 -1
  322. package/dist/tsconfig.tsbuildinfo +1 -1
  323. package/package.json +6 -3
  324. package/dist/src/tools/web-fetch.test.js +0 -70
  325. package/dist/src/tools/web-fetch.test.js.map +0 -1
  326. package/dist/vybestack-llxprt-code-core-0.1.12.tgz +0 -0
  327. /package/dist/src/{tools/web-fetch.test.d.ts → mcp/oauth-provider.test.d.ts} +0 -0
@@ -0,0 +1,292 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach, beforeAll } from 'vitest';
7
+ import { OpenAIProvider, ProviderManager, ContentGeneratorRole, } from '../../index.js';
8
+ import { existsSync, readFileSync } from 'fs';
9
+ import { homedir } from 'os';
10
+ import { join } from 'path';
11
+ describe('Multi-Provider Integration Tests', () => {
12
+ let apiKey = null;
13
+ let baseURL = undefined;
14
+ let skipTests = false;
15
+ let manager;
16
+ beforeAll(() => {
17
+ // Try to load OpenAI API key from environment first
18
+ apiKey = process.env.OPENAI_API_KEY || null;
19
+ baseURL = process.env.OPENAI_BASE_URL || undefined;
20
+ // If not in environment, try to load from file
21
+ if (!apiKey) {
22
+ try {
23
+ const apiKeyPath = join(homedir(), '.openai_key');
24
+ if (existsSync(apiKeyPath)) {
25
+ apiKey = readFileSync(apiKeyPath, 'utf-8').trim();
26
+ }
27
+ }
28
+ catch (_error) {
29
+ // No API key available
30
+ }
31
+ }
32
+ if (!apiKey) {
33
+ console.log('\n⚠️ Skipping Multi-Provider Integration Tests: No OpenAI API key found');
34
+ console.log(' To run these tests, either:\n' +
35
+ ' - Set the OPENAI_API_KEY environment variable, or\n' +
36
+ ' - Create ~/.openai_key with your OpenAI API key\n');
37
+ skipTests = true;
38
+ }
39
+ // Skip tests when using OpenRouter for now
40
+ if (baseURL?.includes('openrouter')) {
41
+ console.log('\n⚠️ Skipping Multi-Provider Integration Tests: OpenRouter detected');
42
+ console.log(' These tests are currently not compatible with OpenRouter\n');
43
+ skipTests = true;
44
+ }
45
+ });
46
+ beforeEach(() => {
47
+ if (!skipTests) {
48
+ manager = new ProviderManager();
49
+ }
50
+ });
51
+ afterEach(() => {
52
+ // Clean up any state if needed
53
+ });
54
+ describe('Provider Management', () => {
55
+ it.skipIf(skipTests)('should initialize and register OpenAI provider', () => {
56
+ if (!manager)
57
+ return; // Guard for when test is skipped
58
+ // Initially no providers
59
+ expect(manager.listProviders()).toEqual([]);
60
+ expect(manager.hasActiveProvider()).toBe(false);
61
+ // Register OpenAI provider
62
+ const openaiProvider = new OpenAIProvider(apiKey, baseURL);
63
+ manager.registerProvider(openaiProvider);
64
+ // Verify registration
65
+ expect(manager.listProviders()).toEqual(['openai']);
66
+ expect(manager.hasActiveProvider()).toBe(false); // Not active yet
67
+ // Activate provider
68
+ manager.setActiveProvider('openai');
69
+ expect(manager.hasActiveProvider()).toBe(true);
70
+ expect(manager.getActiveProviderName()).toBe('openai');
71
+ });
72
+ it.skipIf(skipTests)('should switch between providers and Gemini', () => {
73
+ if (!manager)
74
+ return; // Guard for when test is skipped
75
+ // Register OpenAI
76
+ const openaiProvider = new OpenAIProvider(apiKey, baseURL);
77
+ manager.registerProvider(openaiProvider);
78
+ // Start with Gemini (no active provider)
79
+ expect(manager.hasActiveProvider()).toBe(false);
80
+ // Switch to OpenAI
81
+ manager.setActiveProvider('openai');
82
+ expect(manager.hasActiveProvider()).toBe(true);
83
+ expect(manager.getActiveProviderName()).toBe('openai');
84
+ // Switch back to Gemini
85
+ manager.clearActiveProvider();
86
+ expect(manager.hasActiveProvider()).toBe(false);
87
+ expect(manager.getActiveProviderName()).toBe('');
88
+ });
89
+ it.skipIf(skipTests)('should handle errors for invalid provider', () => {
90
+ if (!manager)
91
+ return; // Guard for when test is skipped
92
+ // Try to set non-existent provider
93
+ expect(() => manager.setActiveProvider('invalid-provider')).toThrow('Provider not found');
94
+ });
95
+ });
96
+ describe('Model Management', () => {
97
+ it.skipIf(skipTests)('should list available models from OpenAI', async () => {
98
+ if (!manager)
99
+ return; // Guard for when test is skipped
100
+ const openaiProvider = new OpenAIProvider(apiKey, baseURL);
101
+ manager.registerProvider(openaiProvider);
102
+ manager.setActiveProvider('openai');
103
+ const models = await manager.getAvailableModels();
104
+ // Should have multiple models
105
+ expect(models.length).toBeGreaterThan(0);
106
+ // Check for models based on whether we're using OpenRouter or not
107
+ const modelIds = models.map((m) => m.id);
108
+ if (baseURL?.includes('openrouter')) {
109
+ // OpenRouter uses prefixed model names
110
+ expect(modelIds.some((id) => id.includes('openai/') || id.includes('google/'))).toBe(true);
111
+ }
112
+ else {
113
+ // Direct OpenAI API
114
+ expect(modelIds).toContain('gpt-4.1');
115
+ }
116
+ console.log(`\n✅ Found ${models.length} models`);
117
+ console.log(` Sample models: ${modelIds.slice(0, 5).join(', ')}...`);
118
+ });
119
+ it.skipIf(skipTests)('should switch between models within provider', async () => {
120
+ const openaiProvider = new OpenAIProvider(apiKey, baseURL);
121
+ // Default model
122
+ expect(openaiProvider.getCurrentModel()).toBe('gpt-4.1');
123
+ // Switch to different models based on provider
124
+ if (baseURL?.includes('openrouter')) {
125
+ // OpenRouter models
126
+ openaiProvider.setModel('openai/gpt-4o');
127
+ expect(openaiProvider.getCurrentModel()).toBe('openai/gpt-4o');
128
+ openaiProvider.setModel('google/gemini-2.5-flash');
129
+ expect(openaiProvider.getCurrentModel()).toBe('google/gemini-2.5-flash');
130
+ }
131
+ else {
132
+ // Direct OpenAI models
133
+ openaiProvider.setModel('gpt-4');
134
+ expect(openaiProvider.getCurrentModel()).toBe('gpt-4');
135
+ openaiProvider.setModel('gpt-4.1');
136
+ expect(openaiProvider.getCurrentModel()).toBe('gpt-4.1');
137
+ }
138
+ });
139
+ });
140
+ describe('Chat Completion with Real API', () => {
141
+ it.skipIf(skipTests)('should generate chat completion with default model', async () => {
142
+ if (!manager)
143
+ return; // Guard for when test is skipped
144
+ const openaiProvider = new OpenAIProvider(apiKey, baseURL);
145
+ manager.registerProvider(openaiProvider);
146
+ manager.setActiveProvider('openai');
147
+ const messages = [
148
+ {
149
+ role: ContentGeneratorRole.USER,
150
+ content: 'Say "Hello from OpenAI integration test" and nothing else.',
151
+ },
152
+ ];
153
+ // Collect the streaming response
154
+ const chunks = [];
155
+ const stream = openaiProvider.generateChatCompletion(messages);
156
+ for await (const message of stream) {
157
+ if (message.content) {
158
+ chunks.push(message.content);
159
+ }
160
+ }
161
+ const fullResponse = chunks.join('');
162
+ const providerName = baseURL?.includes('openrouter')
163
+ ? 'OpenRouter'
164
+ : 'OpenAI';
165
+ console.log(`\n✅ ${providerName} response: "${fullResponse}"`);
166
+ expect(fullResponse.toLowerCase()).toContain('hello from openai integration test');
167
+ });
168
+ it.skipIf(skipTests)('should handle streaming correctly', async () => {
169
+ if (!apiKey || skipTests)
170
+ return; // Guard for when test is skipped
171
+ const openaiProvider = new OpenAIProvider(apiKey, baseURL);
172
+ const messages = [
173
+ {
174
+ role: ContentGeneratorRole.USER,
175
+ content: 'Count from 1 to 5, one number per line.',
176
+ },
177
+ ];
178
+ const chunks = [];
179
+ let chunkCount = 0;
180
+ const stream = openaiProvider.generateChatCompletion(messages);
181
+ for await (const message of stream) {
182
+ if (message.content) {
183
+ chunks.push(message.content);
184
+ chunkCount++;
185
+ }
186
+ }
187
+ const fullResponse = chunks.join('');
188
+ console.log(`\n✅ Streaming test received ${chunkCount} chunks`);
189
+ console.log(` Response: "${fullResponse.trim()}"`);
190
+ // Should receive multiple chunks (streaming)
191
+ expect(chunkCount).toBeGreaterThan(1);
192
+ // Should contain numbers 1-5
193
+ expect(fullResponse).toMatch(/1/);
194
+ expect(fullResponse).toMatch(/2/);
195
+ expect(fullResponse).toMatch(/3/);
196
+ expect(fullResponse).toMatch(/4/);
197
+ expect(fullResponse).toMatch(/5/);
198
+ });
199
+ it.skipIf(skipTests)('should work with GPT-4 model', async () => {
200
+ if (!apiKey || skipTests)
201
+ return; // Guard for when test is skipped
202
+ const openaiProvider = new OpenAIProvider(apiKey, baseURL);
203
+ // Use appropriate model based on provider
204
+ const model = baseURL?.includes('openrouter') ? 'openai/gpt-4o' : 'gpt-4';
205
+ openaiProvider.setModel(model);
206
+ const messages = [
207
+ {
208
+ role: ContentGeneratorRole.USER,
209
+ content: 'What is 2+2? Reply with just the number.',
210
+ },
211
+ ];
212
+ const chunks = [];
213
+ const stream = openaiProvider.generateChatCompletion(messages);
214
+ for await (const message of stream) {
215
+ if (message.content) {
216
+ chunks.push(message.content);
217
+ }
218
+ }
219
+ const fullResponse = chunks.join('').trim();
220
+ console.log(`\n✅ GPT-4 response: "${fullResponse}"`);
221
+ expect(fullResponse).toContain('4');
222
+ });
223
+ it.skipIf(skipTests)('should handle tool calls', async () => {
224
+ if (!apiKey || skipTests)
225
+ return; // Guard for when test is skipped
226
+ const openaiProvider = new OpenAIProvider(apiKey, baseURL);
227
+ const messages = [
228
+ {
229
+ role: ContentGeneratorRole.USER,
230
+ content: 'What is the weather in San Francisco? Use the get_weather function.',
231
+ },
232
+ ];
233
+ const tools = [
234
+ {
235
+ type: 'function',
236
+ function: {
237
+ name: 'get_weather',
238
+ description: 'Get the weather for a location',
239
+ parameters: {
240
+ type: 'object',
241
+ properties: {
242
+ location: { type: 'string', description: 'The city name' },
243
+ },
244
+ required: ['location'],
245
+ },
246
+ },
247
+ },
248
+ ];
249
+ let toolCallReceived = false;
250
+ const stream = openaiProvider.generateChatCompletion(messages, tools);
251
+ for await (const message of stream) {
252
+ if (message.tool_calls && message.tool_calls.length > 0) {
253
+ toolCallReceived = true;
254
+ const toolCall = message.tool_calls[0];
255
+ console.log(`\n✅ Tool call received: ${toolCall.function.name}`);
256
+ console.log(` Arguments: ${toolCall.function.arguments}`);
257
+ expect(toolCall.function.name).toBe('get_weather');
258
+ const args = JSON.parse(toolCall.function.arguments);
259
+ expect(args.location.toLowerCase()).toContain('san francisco');
260
+ }
261
+ }
262
+ expect(toolCallReceived).toBe(true);
263
+ });
264
+ });
265
+ describe('Error Handling', () => {
266
+ it.skipIf(skipTests)('should handle invalid model gracefully', async () => {
267
+ if (!apiKey || skipTests)
268
+ return; // Guard for when test is skipped
269
+ const openaiProvider = new OpenAIProvider(apiKey, baseURL);
270
+ openaiProvider.setModel('invalid-model-xyz');
271
+ const messages = [{ role: ContentGeneratorRole.USER, content: 'Hello' }];
272
+ try {
273
+ const stream = openaiProvider.generateChatCompletion(messages);
274
+ // Try to consume the stream
275
+ for await (const _message of stream) {
276
+ // Should throw before getting here
277
+ }
278
+ expect.fail('Should have thrown an error');
279
+ }
280
+ catch (error) {
281
+ const errorMessage = error instanceof Error ? error.message : String(error);
282
+ console.log(`\n✅ Correctly caught error for invalid model: ${errorMessage}`);
283
+ expect(errorMessage).toMatch(/model|invalid/i);
284
+ }
285
+ });
286
+ it('should handle missing API key', async () => {
287
+ const provider = new OpenAIProvider('');
288
+ await expect(provider.getModels()).rejects.toThrow('OpenAI API key is required to fetch models');
289
+ });
290
+ });
291
+ });
292
+ //# sourceMappingURL=multi-provider.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-provider.integration.test.js","sourceRoot":"","sources":["../../../../src/providers/integration/multi-provider.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { ConversationCache } from './ConversationCache.js';
3
+ import { ContentGeneratorRole } from '../ContentGeneratorRole.js';
4
+ describe('ConversationCache.accumTokens', () => {
5
+ let cache;
6
+ beforeEach(() => {
7
+ cache = new ConversationCache();
8
+ });
9
+ it('should initialize with zero accumulated tokens', () => {
10
+ const tokens = cache.getAccumulatedTokens('conv1', 'parent1');
11
+ expect(tokens).toBe(0);
12
+ });
13
+ it('should store and retrieve accumulated tokens', () => {
14
+ const messages = [
15
+ { role: ContentGeneratorRole.ASSISTANT, content: 'Hello world' },
16
+ ];
17
+ cache.set('conv1', 'parent1', messages, 1500);
18
+ const tokens = cache.getAccumulatedTokens('conv1', 'parent1');
19
+ expect(tokens).toBe(1500);
20
+ });
21
+ it('should update token count incrementally', () => {
22
+ const messages = [
23
+ { role: ContentGeneratorRole.ASSISTANT, content: 'First response' },
24
+ ];
25
+ // First interaction
26
+ cache.set('conv1', 'parent1', messages, 1000);
27
+ expect(cache.getAccumulatedTokens('conv1', 'parent1')).toBe(1000);
28
+ // Update token count
29
+ cache.updateTokenCount('conv1', 'parent1', 500);
30
+ expect(cache.getAccumulatedTokens('conv1', 'parent1')).toBe(1500);
31
+ // Another update
32
+ cache.updateTokenCount('conv1', 'parent1', 300);
33
+ expect(cache.getAccumulatedTokens('conv1', 'parent1')).toBe(1800);
34
+ });
35
+ it('should handle different conversation/parent combinations', () => {
36
+ const messages = [
37
+ { role: ContentGeneratorRole.ASSISTANT, content: 'Response' },
38
+ ];
39
+ cache.set('conv1', 'parent1', messages, 1000);
40
+ cache.set('conv1', 'parent2', messages, 2000);
41
+ cache.set('conv2', 'parent1', messages, 3000);
42
+ expect(cache.getAccumulatedTokens('conv1', 'parent1')).toBe(1000);
43
+ expect(cache.getAccumulatedTokens('conv1', 'parent2')).toBe(2000);
44
+ expect(cache.getAccumulatedTokens('conv2', 'parent1')).toBe(3000);
45
+ });
46
+ it('should return 0 for non-existent entries', () => {
47
+ expect(cache.getAccumulatedTokens('nonexistent', 'parent')).toBe(0);
48
+ });
49
+ it('should return 0 for expired entries', () => {
50
+ // Create cache with very short TTL (1ms)
51
+ const shortCache = new ConversationCache(100, 0.000000278); // 1ms in hours
52
+ const messages = [
53
+ { role: ContentGeneratorRole.ASSISTANT, content: 'Response' },
54
+ ];
55
+ shortCache.set('conv1', 'parent1', messages, 1000);
56
+ // Wait for expiry
57
+ setTimeout(() => {
58
+ expect(shortCache.getAccumulatedTokens('conv1', 'parent1')).toBe(0);
59
+ }, 5);
60
+ });
61
+ it('should invalidate entries and reset token count', () => {
62
+ const messages = [
63
+ { role: ContentGeneratorRole.ASSISTANT, content: 'Response' },
64
+ ];
65
+ cache.set('conv1', 'parent1', messages, 5000);
66
+ expect(cache.getAccumulatedTokens('conv1', 'parent1')).toBe(5000);
67
+ // Invalidate the entry
68
+ cache.invalidate('conv1', 'parent1');
69
+ // Should return 0 after invalidation
70
+ expect(cache.getAccumulatedTokens('conv1', 'parent1')).toBe(0);
71
+ expect(cache.has('conv1', 'parent1')).toBe(false);
72
+ });
73
+ it('should not update token count for non-existent entries', () => {
74
+ // Try to update a non-existent entry
75
+ cache.updateTokenCount('nonexistent', 'parent', 1000);
76
+ // Should still return 0
77
+ expect(cache.getAccumulatedTokens('nonexistent', 'parent')).toBe(0);
78
+ });
79
+ it('should maintain token count through cache eviction', () => {
80
+ // Create a small cache
81
+ const smallCache = new ConversationCache(2);
82
+ const messages = [
83
+ { role: ContentGeneratorRole.ASSISTANT, content: 'Response' },
84
+ ];
85
+ // Fill the cache
86
+ smallCache.set('conv1', 'parent1', messages, 1000);
87
+ smallCache.set('conv2', 'parent2', messages, 2000);
88
+ // This should evict the oldest entry (conv1/parent1)
89
+ smallCache.set('conv3', 'parent3', messages, 3000);
90
+ // Oldest entry should be evicted
91
+ expect(smallCache.getAccumulatedTokens('conv1', 'parent1')).toBe(0);
92
+ // Others should remain
93
+ expect(smallCache.getAccumulatedTokens('conv2', 'parent2')).toBe(2000);
94
+ expect(smallCache.getAccumulatedTokens('conv3', 'parent3')).toBe(3000);
95
+ });
96
+ });
97
+ //# sourceMappingURL=ConversationCache.accumTokens.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationCache.accumTokens.test.js","sourceRoot":"","sources":["../../../../src/providers/openai/ConversationCache.accumTokens.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { IMessage } from '../IMessage.js';
2
+ export declare class ConversationCache {
3
+ private cache;
4
+ private accessOrder;
5
+ private readonly maxSize;
6
+ private readonly ttlMs;
7
+ constructor(maxSize?: number, ttlHours?: number);
8
+ private generateKey;
9
+ private evictIfNeeded;
10
+ private updateAccessOrder;
11
+ private isExpired;
12
+ set(conversationId: string, parentId: string, messages: IMessage[], promptTokensAccum?: number): void;
13
+ get(conversationId: string, parentId: string): IMessage[] | null;
14
+ has(conversationId: string, parentId: string): boolean;
15
+ clear(): void;
16
+ size(): number;
17
+ getAccumulatedTokens(conversationId: string, parentId: string): number;
18
+ updateTokenCount(conversationId: string, parentId: string, additionalTokens: number): void;
19
+ invalidate(conversationId: string, parentId: string): void;
20
+ }
@@ -0,0 +1,109 @@
1
+ export class ConversationCache {
2
+ cache = new Map();
3
+ accessOrder = [];
4
+ maxSize;
5
+ ttlMs;
6
+ constructor(maxSize = 100, ttlHours = 2) {
7
+ this.maxSize = maxSize;
8
+ this.ttlMs = ttlHours * 60 * 60 * 1000;
9
+ }
10
+ generateKey(conversationId, parentId) {
11
+ return `${conversationId}:${parentId}`;
12
+ }
13
+ evictIfNeeded() {
14
+ while (this.accessOrder.length > this.maxSize) {
15
+ const oldestKey = this.accessOrder.shift();
16
+ if (oldestKey) {
17
+ this.cache.delete(oldestKey);
18
+ }
19
+ }
20
+ }
21
+ updateAccessOrder(key) {
22
+ const index = this.accessOrder.indexOf(key);
23
+ if (index > -1) {
24
+ this.accessOrder.splice(index, 1);
25
+ }
26
+ this.accessOrder.push(key);
27
+ }
28
+ isExpired(entry) {
29
+ return Date.now() - entry.timestamp > this.ttlMs;
30
+ }
31
+ set(conversationId, parentId, messages, promptTokensAccum = 0) {
32
+ const key = this.generateKey(conversationId, parentId);
33
+ const entry = {
34
+ conversationId,
35
+ parentId,
36
+ messages,
37
+ timestamp: Date.now(),
38
+ promptTokensAccum,
39
+ };
40
+ this.cache.set(key, entry);
41
+ this.updateAccessOrder(key);
42
+ this.evictIfNeeded();
43
+ }
44
+ get(conversationId, parentId) {
45
+ const key = this.generateKey(conversationId, parentId);
46
+ const entry = this.cache.get(key);
47
+ if (!entry) {
48
+ return null;
49
+ }
50
+ if (this.isExpired(entry)) {
51
+ this.cache.delete(key);
52
+ const index = this.accessOrder.indexOf(key);
53
+ if (index > -1) {
54
+ this.accessOrder.splice(index, 1);
55
+ }
56
+ return null;
57
+ }
58
+ this.updateAccessOrder(key);
59
+ return entry.messages;
60
+ }
61
+ has(conversationId, parentId) {
62
+ const key = this.generateKey(conversationId, parentId);
63
+ const entry = this.cache.get(key);
64
+ if (!entry) {
65
+ return false;
66
+ }
67
+ if (this.isExpired(entry)) {
68
+ this.cache.delete(key);
69
+ const index = this.accessOrder.indexOf(key);
70
+ if (index > -1) {
71
+ this.accessOrder.splice(index, 1);
72
+ }
73
+ return false;
74
+ }
75
+ return true;
76
+ }
77
+ clear() {
78
+ this.cache.clear();
79
+ this.accessOrder = [];
80
+ }
81
+ size() {
82
+ return this.cache.size;
83
+ }
84
+ getAccumulatedTokens(conversationId, parentId) {
85
+ const key = this.generateKey(conversationId, parentId);
86
+ const entry = this.cache.get(key);
87
+ if (!entry || this.isExpired(entry)) {
88
+ return 0;
89
+ }
90
+ return entry.promptTokensAccum;
91
+ }
92
+ updateTokenCount(conversationId, parentId, additionalTokens) {
93
+ const key = this.generateKey(conversationId, parentId);
94
+ const entry = this.cache.get(key);
95
+ if (entry && !this.isExpired(entry)) {
96
+ entry.promptTokensAccum += additionalTokens;
97
+ this.updateAccessOrder(key);
98
+ }
99
+ }
100
+ invalidate(conversationId, parentId) {
101
+ const key = this.generateKey(conversationId, parentId);
102
+ this.cache.delete(key);
103
+ const index = this.accessOrder.indexOf(key);
104
+ if (index > -1) {
105
+ this.accessOrder.splice(index, 1);
106
+ }
107
+ }
108
+ }
109
+ //# sourceMappingURL=ConversationCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationCache.js","sourceRoot":"","sources":["../../../../src/providers/openai/ConversationCache.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,iBAAiB;IACpB,KAAK,GAA4B,IAAI,GAAG,EAAE,CAAC;IAC3C,WAAW,GAAa,EAAE,CAAC;IAClB,OAAO,CAAS;IAChB,KAAK,CAAS;IAE/B,YAAY,UAAkB,GAAG,EAAE,WAAmB,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACzC,CAAC;IAEO,WAAW,CAAC,cAAsB,EAAE,QAAgB;QAC1D,OAAO,GAAG,cAAc,IAAI,QAAQ,EAAE,CAAC;IACzC,CAAC;IAEO,aAAa;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,GAAW;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAEO,SAAS,CAAC,KAAiB;QACjC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;IACnD,CAAC;IAED,GAAG,CACD,cAAsB,EACtB,QAAgB,EAChB,QAAoB,EACpB,oBAA4B,CAAC;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAEvD,MAAM,KAAK,GAAe;YACxB,cAAc;YACd,QAAQ;YACR,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,iBAAiB;SAClB,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,cAAsB,EAAE,QAAgB;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED,GAAG,CAAC,cAAsB,EAAE,QAAgB;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,oBAAoB,CAAC,cAAsB,EAAE,QAAgB;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,KAAK,CAAC,iBAAiB,CAAC;IACjC,CAAC;IAED,gBAAgB,CACd,cAAsB,EACtB,QAAgB,EAChB,gBAAwB;QAExB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,iBAAiB,IAAI,gBAAgB,CAAC;YAC5C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,UAAU,CAAC,cAAsB,EAAE,QAAgB;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF"}