@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,183 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { getErrorMessage } from '../utils/errors.js';
7
+ /**
8
+ * Utility class for common OAuth operations.
9
+ */
10
+ export class OAuthUtils {
11
+ /**
12
+ * Construct well-known OAuth endpoint URLs.
13
+ */
14
+ static buildWellKnownUrls(baseUrl) {
15
+ const serverUrl = new URL(baseUrl);
16
+ const base = `${serverUrl.protocol}//${serverUrl.host}`;
17
+ return {
18
+ protectedResource: new URL('/.well-known/oauth-protected-resource', base).toString(),
19
+ authorizationServer: new URL('/.well-known/oauth-authorization-server', base).toString(),
20
+ };
21
+ }
22
+ /**
23
+ * Fetch OAuth protected resource metadata.
24
+ *
25
+ * @param resourceMetadataUrl The protected resource metadata URL
26
+ * @returns The protected resource metadata or null if not available
27
+ */
28
+ static async fetchProtectedResourceMetadata(resourceMetadataUrl) {
29
+ try {
30
+ const response = await fetch(resourceMetadataUrl);
31
+ if (!response.ok) {
32
+ return null;
33
+ }
34
+ return (await response.json());
35
+ }
36
+ catch (error) {
37
+ console.debug(`Failed to fetch protected resource metadata from ${resourceMetadataUrl}: ${getErrorMessage(error)}`);
38
+ return null;
39
+ }
40
+ }
41
+ /**
42
+ * Fetch OAuth authorization server metadata.
43
+ *
44
+ * @param authServerMetadataUrl The authorization server metadata URL
45
+ * @returns The authorization server metadata or null if not available
46
+ */
47
+ static async fetchAuthorizationServerMetadata(authServerMetadataUrl) {
48
+ try {
49
+ const response = await fetch(authServerMetadataUrl);
50
+ if (!response.ok) {
51
+ return null;
52
+ }
53
+ return (await response.json());
54
+ }
55
+ catch (error) {
56
+ console.debug(`Failed to fetch authorization server metadata from ${authServerMetadataUrl}: ${getErrorMessage(error)}`);
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Convert authorization server metadata to OAuth configuration.
62
+ *
63
+ * @param metadata The authorization server metadata
64
+ * @returns The OAuth configuration
65
+ */
66
+ static metadataToOAuthConfig(metadata) {
67
+ return {
68
+ authorizationUrl: metadata.authorization_endpoint,
69
+ tokenUrl: metadata.token_endpoint,
70
+ scopes: metadata.scopes_supported || [],
71
+ };
72
+ }
73
+ /**
74
+ * Discover OAuth configuration using the standard well-known endpoints.
75
+ *
76
+ * @param serverUrl The base URL of the server
77
+ * @returns The discovered OAuth configuration or null if not available
78
+ */
79
+ static async discoverOAuthConfig(serverUrl) {
80
+ try {
81
+ const wellKnownUrls = this.buildWellKnownUrls(serverUrl);
82
+ // First, try to get the protected resource metadata
83
+ const resourceMetadata = await this.fetchProtectedResourceMetadata(wellKnownUrls.protectedResource);
84
+ if (resourceMetadata?.authorization_servers?.length) {
85
+ // Use the first authorization server
86
+ const authServerUrl = resourceMetadata.authorization_servers[0];
87
+ const authServerMetadataUrl = new URL('/.well-known/oauth-authorization-server', authServerUrl).toString();
88
+ const authServerMetadata = await this.fetchAuthorizationServerMetadata(authServerMetadataUrl);
89
+ if (authServerMetadata) {
90
+ const config = this.metadataToOAuthConfig(authServerMetadata);
91
+ if (authServerMetadata.registration_endpoint) {
92
+ console.log('Dynamic client registration is supported at:', authServerMetadata.registration_endpoint);
93
+ }
94
+ return config;
95
+ }
96
+ }
97
+ // Fallback: try /.well-known/oauth-authorization-server at the base URL
98
+ console.debug(`Trying OAuth discovery fallback at ${wellKnownUrls.authorizationServer}`);
99
+ const authServerMetadata = await this.fetchAuthorizationServerMetadata(wellKnownUrls.authorizationServer);
100
+ if (authServerMetadata) {
101
+ const config = this.metadataToOAuthConfig(authServerMetadata);
102
+ if (authServerMetadata.registration_endpoint) {
103
+ console.log('Dynamic client registration is supported at:', authServerMetadata.registration_endpoint);
104
+ }
105
+ return config;
106
+ }
107
+ return null;
108
+ }
109
+ catch (error) {
110
+ console.debug(`Failed to discover OAuth configuration: ${getErrorMessage(error)}`);
111
+ return null;
112
+ }
113
+ }
114
+ /**
115
+ * Parse WWW-Authenticate header to extract OAuth information.
116
+ *
117
+ * @param header The WWW-Authenticate header value
118
+ * @returns The resource metadata URI if found
119
+ */
120
+ static parseWWWAuthenticateHeader(header) {
121
+ // Parse Bearer realm and resource_metadata_uri
122
+ const match = header.match(/resource_metadata_uri="([^"]+)"/);
123
+ if (match) {
124
+ return match[1];
125
+ }
126
+ return null;
127
+ }
128
+ /**
129
+ * Discover OAuth configuration from WWW-Authenticate header.
130
+ *
131
+ * @param wwwAuthenticate The WWW-Authenticate header value
132
+ * @returns The discovered OAuth configuration or null if not available
133
+ */
134
+ static async discoverOAuthFromWWWAuthenticate(wwwAuthenticate) {
135
+ const resourceMetadataUri = this.parseWWWAuthenticateHeader(wwwAuthenticate);
136
+ if (!resourceMetadataUri) {
137
+ return null;
138
+ }
139
+ console.log(`Found resource metadata URI from www-authenticate header: ${resourceMetadataUri}`);
140
+ const resourceMetadata = await this.fetchProtectedResourceMetadata(resourceMetadataUri);
141
+ if (!resourceMetadata?.authorization_servers?.length) {
142
+ return null;
143
+ }
144
+ const authServerUrl = resourceMetadata.authorization_servers[0];
145
+ const authServerMetadataUrl = new URL('/.well-known/oauth-authorization-server', authServerUrl).toString();
146
+ const authServerMetadata = await this.fetchAuthorizationServerMetadata(authServerMetadataUrl);
147
+ if (authServerMetadata) {
148
+ console.log('OAuth configuration discovered successfully from www-authenticate header');
149
+ return this.metadataToOAuthConfig(authServerMetadata);
150
+ }
151
+ return null;
152
+ }
153
+ /**
154
+ * Extract base URL from an MCP server URL.
155
+ *
156
+ * @param mcpServerUrl The MCP server URL
157
+ * @returns The base URL
158
+ */
159
+ static extractBaseUrl(mcpServerUrl) {
160
+ const serverUrl = new URL(mcpServerUrl);
161
+ return `${serverUrl.protocol}//${serverUrl.host}`;
162
+ }
163
+ /**
164
+ * Check if a URL is an SSE endpoint.
165
+ *
166
+ * @param url The URL to check
167
+ * @returns True if the URL appears to be an SSE endpoint
168
+ */
169
+ static isSSEEndpoint(url) {
170
+ return url.includes('/sse') || !url.includes('/mcp');
171
+ }
172
+ /**
173
+ * Build a resource parameter for OAuth requests.
174
+ *
175
+ * @param endpointUrl The endpoint URL
176
+ * @returns The resource parameter value
177
+ */
178
+ static buildResourceParameter(endpointUrl) {
179
+ const url = new URL(endpointUrl);
180
+ return `${url.protocol}//${url.host}`;
181
+ }
182
+ }
183
+ //# sourceMappingURL=oauth-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-utils.js","sourceRoot":"","sources":["../../../src/mcp/oauth-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { OAuthUtils, } from './oauth-utils.js';
8
+ // Mock fetch globally
9
+ const mockFetch = vi.fn();
10
+ global.fetch = mockFetch;
11
+ describe('OAuthUtils', () => {
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ vi.spyOn(console, 'debug').mockImplementation(() => { });
15
+ vi.spyOn(console, 'error').mockImplementation(() => { });
16
+ vi.spyOn(console, 'log').mockImplementation(() => { });
17
+ });
18
+ afterEach(() => {
19
+ vi.restoreAllMocks();
20
+ });
21
+ describe('buildWellKnownUrls', () => {
22
+ it('should build correct well-known URLs', () => {
23
+ const urls = OAuthUtils.buildWellKnownUrls('https://example.com/path');
24
+ expect(urls.protectedResource).toBe('https://example.com/.well-known/oauth-protected-resource');
25
+ expect(urls.authorizationServer).toBe('https://example.com/.well-known/oauth-authorization-server');
26
+ });
27
+ });
28
+ describe('fetchProtectedResourceMetadata', () => {
29
+ const mockResourceMetadata = {
30
+ resource: 'https://api.example.com',
31
+ authorization_servers: ['https://auth.example.com'],
32
+ bearer_methods_supported: ['header'],
33
+ };
34
+ it('should fetch protected resource metadata successfully', async () => {
35
+ mockFetch.mockResolvedValueOnce({
36
+ ok: true,
37
+ json: () => Promise.resolve(mockResourceMetadata),
38
+ });
39
+ const result = await OAuthUtils.fetchProtectedResourceMetadata('https://example.com/.well-known/oauth-protected-resource');
40
+ expect(result).toEqual(mockResourceMetadata);
41
+ });
42
+ it('should return null when fetch fails', async () => {
43
+ mockFetch.mockResolvedValueOnce({
44
+ ok: false,
45
+ });
46
+ const result = await OAuthUtils.fetchProtectedResourceMetadata('https://example.com/.well-known/oauth-protected-resource');
47
+ expect(result).toBeNull();
48
+ });
49
+ });
50
+ describe('fetchAuthorizationServerMetadata', () => {
51
+ const mockAuthServerMetadata = {
52
+ issuer: 'https://auth.example.com',
53
+ authorization_endpoint: 'https://auth.example.com/authorize',
54
+ token_endpoint: 'https://auth.example.com/token',
55
+ scopes_supported: ['read', 'write'],
56
+ };
57
+ it('should fetch authorization server metadata successfully', async () => {
58
+ mockFetch.mockResolvedValueOnce({
59
+ ok: true,
60
+ json: () => Promise.resolve(mockAuthServerMetadata),
61
+ });
62
+ const result = await OAuthUtils.fetchAuthorizationServerMetadata('https://auth.example.com/.well-known/oauth-authorization-server');
63
+ expect(result).toEqual(mockAuthServerMetadata);
64
+ });
65
+ it('should return null when fetch fails', async () => {
66
+ mockFetch.mockResolvedValueOnce({
67
+ ok: false,
68
+ });
69
+ const result = await OAuthUtils.fetchAuthorizationServerMetadata('https://auth.example.com/.well-known/oauth-authorization-server');
70
+ expect(result).toBeNull();
71
+ });
72
+ });
73
+ describe('metadataToOAuthConfig', () => {
74
+ it('should convert metadata to OAuth config', () => {
75
+ const metadata = {
76
+ issuer: 'https://auth.example.com',
77
+ authorization_endpoint: 'https://auth.example.com/authorize',
78
+ token_endpoint: 'https://auth.example.com/token',
79
+ scopes_supported: ['read', 'write'],
80
+ };
81
+ const config = OAuthUtils.metadataToOAuthConfig(metadata);
82
+ expect(config).toEqual({
83
+ authorizationUrl: 'https://auth.example.com/authorize',
84
+ tokenUrl: 'https://auth.example.com/token',
85
+ scopes: ['read', 'write'],
86
+ });
87
+ });
88
+ it('should handle empty scopes', () => {
89
+ const metadata = {
90
+ issuer: 'https://auth.example.com',
91
+ authorization_endpoint: 'https://auth.example.com/authorize',
92
+ token_endpoint: 'https://auth.example.com/token',
93
+ };
94
+ const config = OAuthUtils.metadataToOAuthConfig(metadata);
95
+ expect(config.scopes).toEqual([]);
96
+ });
97
+ });
98
+ describe('parseWWWAuthenticateHeader', () => {
99
+ it('should parse resource metadata URI from WWW-Authenticate header', () => {
100
+ const header = 'Bearer realm="example", resource_metadata_uri="https://example.com/.well-known/oauth-protected-resource"';
101
+ const result = OAuthUtils.parseWWWAuthenticateHeader(header);
102
+ expect(result).toBe('https://example.com/.well-known/oauth-protected-resource');
103
+ });
104
+ it('should return null when no resource metadata URI is found', () => {
105
+ const header = 'Bearer realm="example"';
106
+ const result = OAuthUtils.parseWWWAuthenticateHeader(header);
107
+ expect(result).toBeNull();
108
+ });
109
+ });
110
+ describe('extractBaseUrl', () => {
111
+ it('should extract base URL from MCP server URL', () => {
112
+ const result = OAuthUtils.extractBaseUrl('https://example.com/mcp/v1');
113
+ expect(result).toBe('https://example.com');
114
+ });
115
+ it('should handle URLs with ports', () => {
116
+ const result = OAuthUtils.extractBaseUrl('https://example.com:8080/mcp/v1');
117
+ expect(result).toBe('https://example.com:8080');
118
+ });
119
+ });
120
+ describe('isSSEEndpoint', () => {
121
+ it('should return true for SSE endpoints', () => {
122
+ expect(OAuthUtils.isSSEEndpoint('https://example.com/sse')).toBe(true);
123
+ expect(OAuthUtils.isSSEEndpoint('https://example.com/api/v1/sse')).toBe(true);
124
+ });
125
+ it('should return true for non-MCP endpoints', () => {
126
+ expect(OAuthUtils.isSSEEndpoint('https://example.com/api')).toBe(true);
127
+ });
128
+ it('should return false for MCP endpoints', () => {
129
+ expect(OAuthUtils.isSSEEndpoint('https://example.com/mcp')).toBe(false);
130
+ expect(OAuthUtils.isSSEEndpoint('https://example.com/api/mcp/v1')).toBe(false);
131
+ });
132
+ });
133
+ describe('buildResourceParameter', () => {
134
+ it('should build resource parameter from endpoint URL', () => {
135
+ const result = OAuthUtils.buildResourceParameter('https://example.com/oauth/token');
136
+ expect(result).toBe('https://example.com');
137
+ });
138
+ it('should handle URLs with ports', () => {
139
+ const result = OAuthUtils.buildResourceParameter('https://example.com:8080/oauth/token');
140
+ expect(result).toBe('https://example.com:8080');
141
+ });
142
+ });
143
+ });
144
+ //# sourceMappingURL=oauth-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-utils.test.js","sourceRoot":"","sources":["../../../src/mcp/oauth-utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Copyright 2025 Vybestack LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export interface TextToolCall {
17
+ name: string;
18
+ arguments: Record<string, unknown>;
19
+ }
20
+ export interface ITextToolCallParser {
21
+ parse(content: string): {
22
+ cleanedContent: string;
23
+ toolCalls: TextToolCall[];
24
+ };
25
+ }
26
+ export declare class GemmaToolCallParser implements ITextToolCallParser {
27
+ private readonly patterns;
28
+ parse(content: string): {
29
+ cleanedContent: string;
30
+ toolCalls: TextToolCall[];
31
+ };
32
+ private parseKeyValuePairs;
33
+ private parseXMLParameters;
34
+ private parseValue;
35
+ }
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Copyright 2025 Vybestack LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export class GemmaToolCallParser {
17
+ // Support multiple tool call formats
18
+ patterns = [
19
+ // Format 1: [TOOL_REQUEST] toolName {args} [TOOL_REQUEST_END]
20
+ /\[TOOL_REQUEST\]\s*(\w+)\s+({.*?})\s*\[TOOL_REQUEST_END\]/gs,
21
+ // Format 2: ✦ tool_call: toolName for key value pairs (more specific to avoid false positives)
22
+ /✦\s*tool_call:\s*(\w+)\s+for\s+(.+?)(?=\n|✦|$)/gs,
23
+ // Format 3: JSON object with name/arguments followed by [END_TOOL_REQUEST]
24
+ /(\d+\s+)?{"name":\s*"(\w+)",\s*"arguments":\s*({.*?})}\s*(?:\n\s*\d+\s+)?\[END_TOOL_REQUEST\]/gs,
25
+ // Format 4: Hermes format with <tool_call> tags
26
+ /<tool_call>\s*({.*?"name":\s*"(\w+)".*?})\s*<\/tool_call>/gs,
27
+ // Format 5: XML with <invoke> tags (Claude-style)
28
+ /<invoke\s+name="(\w+)">(.*?)<\/invoke>/gs,
29
+ // Format 6: Generic XML tool format
30
+ /<tool>\s*<name>(\w+)<\/name>\s*<arguments>(.*?)<\/arguments>\s*<\/tool>/gs,
31
+ ];
32
+ parse(content) {
33
+ const toolCalls = [];
34
+ let cleanedContent = content;
35
+ const matches = [];
36
+ // Quick check: if content doesn't contain any tool call markers, return early
37
+ if (!content.includes('[TOOL_REQUEST') &&
38
+ !content.includes('tool_call:') &&
39
+ !content.includes('[END_TOOL_REQUEST]') &&
40
+ !content.includes('{"name":') &&
41
+ !content.includes('<tool_call>') &&
42
+ !content.includes('<invoke') &&
43
+ !content.includes('<tool>')) {
44
+ return { cleanedContent: content, toolCalls: [] };
45
+ }
46
+ // Try each pattern
47
+ for (const pattern of this.patterns) {
48
+ let match;
49
+ while ((match = pattern.exec(content)) !== null) {
50
+ if (pattern === this.patterns[1]) {
51
+ // Format 2: Parse key-value pairs from "for key value key2 value2" format
52
+ const [fullMatch, toolName, argsStr] = match;
53
+ const args = this.parseKeyValuePairs(argsStr);
54
+ matches.push({ fullMatch, toolName, args });
55
+ }
56
+ else if (pattern === this.patterns[2]) {
57
+ // Format 3: JSON object format {"name": "tool", "arguments": {...}}
58
+ const [fullMatch, , toolName, jsonArgs] = match;
59
+ matches.push({ fullMatch, toolName, args: jsonArgs });
60
+ }
61
+ else if (pattern === this.patterns[3]) {
62
+ // Format 4: Hermes format <tool_call>{"arguments": {...}, "name": "tool"}</tool_call>
63
+ const [fullMatch, hermesJson, toolName] = match;
64
+ try {
65
+ const parsed = JSON.parse(hermesJson);
66
+ matches.push({
67
+ fullMatch,
68
+ toolName,
69
+ args: JSON.stringify(parsed.arguments || {}),
70
+ });
71
+ }
72
+ catch (error) {
73
+ console.error(`[GemmaToolCallParser] Failed to parse Hermes format: ${error}`);
74
+ // Still need to track the match to remove it from content
75
+ matches.push({ fullMatch, toolName: '', args: '' });
76
+ }
77
+ }
78
+ else if (pattern === this.patterns[4]) {
79
+ // Format 5: XML with <invoke> tags (Claude-style)
80
+ const [fullMatch, toolName, xmlContent] = match;
81
+ matches.push({ fullMatch, toolName, args: xmlContent });
82
+ }
83
+ else if (pattern === this.patterns[5]) {
84
+ // Format 6: Generic XML tool format
85
+ const [fullMatch, toolName, xmlArgs] = match;
86
+ matches.push({ fullMatch, toolName, args: xmlArgs });
87
+ }
88
+ else {
89
+ // Format 1: tool name followed by JSON arguments
90
+ const [fullMatch, toolName, jsonArgs] = match;
91
+ matches.push({ fullMatch, toolName, args: jsonArgs });
92
+ }
93
+ }
94
+ // Reset the regex state for next use
95
+ pattern.lastIndex = 0;
96
+ }
97
+ // Process each match
98
+ for (const { fullMatch, toolName, args } of matches) {
99
+ // Remove the tool call pattern from the content regardless of parsing success so markers are always stripped
100
+ cleanedContent = cleanedContent.replace(fullMatch, '');
101
+ // Skip if toolName is empty (failed parsing)
102
+ if (!toolName) {
103
+ continue;
104
+ }
105
+ try {
106
+ let parsedArgs;
107
+ if (typeof args === 'string') {
108
+ // Check if it's XML content (Claude-style or generic)
109
+ if (args.includes('<parameter') ||
110
+ (args.includes('<') && args.includes('>'))) {
111
+ parsedArgs = this.parseXMLParameters(args);
112
+ }
113
+ else {
114
+ // Handle JSON string arguments
115
+ parsedArgs = JSON.parse(args);
116
+ }
117
+ }
118
+ else {
119
+ // Already parsed (from key-value format)
120
+ parsedArgs = args;
121
+ }
122
+ toolCalls.push({
123
+ name: toolName,
124
+ arguments: parsedArgs,
125
+ });
126
+ }
127
+ catch (error) {
128
+ if (typeof args === 'string') {
129
+ // Try to extract a simpler JSON pattern if the full match fails
130
+ const simpleJsonMatch = args.match(/^{[^{]*}$/);
131
+ if (simpleJsonMatch) {
132
+ try {
133
+ const parsedArgs = JSON.parse(simpleJsonMatch[0]);
134
+ toolCalls.push({
135
+ name: toolName,
136
+ arguments: parsedArgs,
137
+ });
138
+ cleanedContent = cleanedContent.replace(fullMatch, '');
139
+ }
140
+ catch (_secondError) {
141
+ console.error(`[GemmaToolCallParser] Failed to parse tool arguments for ${toolName}:`, error);
142
+ console.error(`[GemmaToolCallParser] Raw arguments: ${args}`);
143
+ // Keep the original text if we can't parse it
144
+ }
145
+ }
146
+ else {
147
+ console.error(`[GemmaToolCallParser] Failed to parse tool arguments for ${toolName}:`, error);
148
+ console.error(`[GemmaToolCallParser] Raw arguments: ${args}`);
149
+ }
150
+ }
151
+ }
152
+ }
153
+ // Clean up any extra whitespace and stray markers that were not matched (best effort)
154
+ cleanedContent = cleanedContent
155
+ .replace(/\[TOOL_REQUEST(?:_END)?]/g, '')
156
+ .replace(/<\|im_start\|>assistant/g, '')
157
+ .replace(/<\|im_end\|>/g, '')
158
+ .replace(/<tool_call>[\s\S]*?<\/tool_call>/g, '') // Remove any remaining tool_call tags
159
+ .replace(/<function_calls>[\s\S]*?<\/function_calls>/g, '') // Remove function_calls wrapper
160
+ .replace(/<invoke[\s\S]*?<\/invoke>/g, '') // Remove any remaining invoke tags
161
+ .replace(/<tool>[\s\S]*?<\/tool>/g, '') // Remove any remaining tool tags
162
+ // .replace(/<think>[\s\S]*?<\/think>/g, '') // Keep think tags visible by default
163
+ .replace(/<tool_call>\s*\{[^}]*$/gm, '') // Remove incomplete tool calls
164
+ .replace(/\{"name"\s*:\s*"[^"]*"\s*,?\s*"arguments"\s*:\s*\{[^}]*$/gm, '') // Remove incomplete JSON tool calls
165
+ .replace(/✦\s*<think>/g, '') // Remove ✦ symbol followed by think tag
166
+ .replace(/\s+/g, ' ')
167
+ .trim();
168
+ return {
169
+ cleanedContent,
170
+ toolCalls,
171
+ };
172
+ }
173
+ parseKeyValuePairs(str) {
174
+ const args = {};
175
+ // Parse "key value key2 value2" format
176
+ // Example: "path /Users/acoliver/projects/gemini-code/gemini-cli/docs"
177
+ const parts = str.trim().split(/\s+/);
178
+ for (let i = 0; i < parts.length; i += 2) {
179
+ if (i + 1 < parts.length) {
180
+ const key = parts[i];
181
+ let value = parts[i + 1];
182
+ // Handle quoted strings that might contain spaces
183
+ if (value.startsWith('"') || value.startsWith("'")) {
184
+ const quote = value[0];
185
+ let endIndex = i + 1;
186
+ // Find the closing quote
187
+ while (endIndex < parts.length && !parts[endIndex].endsWith(quote)) {
188
+ endIndex++;
189
+ }
190
+ if (endIndex < parts.length) {
191
+ value = parts.slice(i + 1, endIndex + 1).join(' ');
192
+ value = value.slice(1, -1); // Remove quotes
193
+ i = endIndex - 1; // Adjust loop counter
194
+ }
195
+ }
196
+ // Try to parse as number or boolean
197
+ if (!isNaN(Number(value))) {
198
+ args[key] = Number(value);
199
+ }
200
+ else if (value === 'true' || value === 'false') {
201
+ args[key] = value === 'true';
202
+ }
203
+ else {
204
+ args[key] = value;
205
+ }
206
+ }
207
+ }
208
+ return args;
209
+ }
210
+ parseXMLParameters(xmlContent) {
211
+ const args = {};
212
+ // Parse Claude-style <parameter name="key">value</parameter>
213
+ const parameterPattern = /<parameter\s+name="([^"]+)">([^<]*)<\/parameter>/g;
214
+ let match;
215
+ while ((match = parameterPattern.exec(xmlContent)) !== null) {
216
+ const [, key, value] = match;
217
+ args[key] = this.parseValue(value.trim());
218
+ }
219
+ // If no parameter tags found, try generic XML <key>value</key>
220
+ if (Object.keys(args).length === 0) {
221
+ // Match any XML tag pair
222
+ const genericPattern = /<(\w+)>([^<]*)<\/\1>/g;
223
+ while ((match = genericPattern.exec(xmlContent)) !== null) {
224
+ const [, key, value] = match;
225
+ args[key] = this.parseValue(value.trim());
226
+ }
227
+ }
228
+ return args;
229
+ }
230
+ parseValue(value) {
231
+ // Try to parse as number
232
+ if (!isNaN(Number(value)) && value !== '') {
233
+ return Number(value);
234
+ }
235
+ // Try to parse as boolean
236
+ if (value === 'true' || value === 'false') {
237
+ return value === 'true';
238
+ }
239
+ // Handle HTML entities
240
+ return value
241
+ .replace(/&lt;/g, '<')
242
+ .replace(/&gt;/g, '>')
243
+ .replace(/&amp;/g, '&')
244
+ .replace(/&quot;/g, '"')
245
+ .replace(/&#39;/g, "'");
246
+ }
247
+ }
248
+ //# sourceMappingURL=TextToolCallParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextToolCallParser.js","sourceRoot":"","sources":["../../../src/parsers/TextToolCallParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};