@vybestack/llxprt-code-core 0.1.19-beta → 0.1.19

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 (540) hide show
  1. package/README.md +49 -2
  2. package/dist/index.d.ts +6 -0
  3. package/dist/index.js +6 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/auth/anthropic-device-flow.d.ts +53 -0
  6. package/dist/src/auth/anthropic-device-flow.js +208 -0
  7. package/dist/src/auth/anthropic-device-flow.js.map +1 -0
  8. package/dist/src/auth/precedence.d.ts +55 -0
  9. package/dist/src/auth/precedence.js +211 -0
  10. package/dist/src/auth/precedence.js.map +1 -0
  11. package/dist/src/auth/qwen-device-flow.d.ts +45 -0
  12. package/dist/src/auth/qwen-device-flow.js +179 -0
  13. package/dist/src/auth/qwen-device-flow.js.map +1 -0
  14. package/dist/src/auth/token-store.d.ts +66 -0
  15. package/dist/src/auth/token-store.js +151 -0
  16. package/dist/src/auth/token-store.js.map +1 -0
  17. package/dist/src/auth/types.d.ts +130 -0
  18. package/dist/src/auth/types.js +60 -0
  19. package/dist/src/auth/types.js.map +1 -0
  20. package/dist/src/code_assist/converter.d.ts +2 -2
  21. package/dist/src/code_assist/converter.js +1 -1
  22. package/dist/src/code_assist/converter.js.map +1 -1
  23. package/dist/src/config/config.d.ts +7 -1
  24. package/dist/src/config/config.js +46 -5
  25. package/dist/src/config/config.js.map +1 -1
  26. package/dist/src/config/endpoints.d.ts +60 -0
  27. package/dist/src/config/endpoints.js +126 -0
  28. package/dist/src/config/endpoints.js.map +1 -0
  29. package/dist/src/config/profileManager.d.ts +14 -4
  30. package/dist/src/config/profileManager.js +90 -11
  31. package/dist/src/config/profileManager.js.map +1 -1
  32. package/dist/src/core/client.d.ts +5 -2
  33. package/dist/src/core/client.js +164 -44
  34. package/dist/src/core/client.js.map +1 -1
  35. package/dist/src/core/contentGenerator.d.ts +4 -1
  36. package/dist/src/core/contentGenerator.js +3 -0
  37. package/dist/src/core/contentGenerator.js.map +1 -1
  38. package/dist/src/core/loggingContentGenerator.d.ts +5 -0
  39. package/dist/src/core/loggingContentGenerator.js +9 -1
  40. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  41. package/dist/src/core/subagent.js +12 -10
  42. package/dist/src/core/subagent.js.map +1 -1
  43. package/dist/src/ide/detect-ide.d.ts +10 -2
  44. package/dist/src/ide/detect-ide.js +48 -5
  45. package/dist/src/ide/detect-ide.js.map +1 -1
  46. package/dist/src/ide/ide-client.js +22 -15
  47. package/dist/src/ide/ide-client.js.map +1 -1
  48. package/dist/src/index.d.ts +10 -1
  49. package/dist/src/index.js +10 -1
  50. package/dist/src/index.js.map +1 -1
  51. package/dist/src/prompt-config/defaults/core-defaults.d.ts +1 -1
  52. package/dist/src/prompt-config/defaults/core-defaults.js +21 -326
  53. package/dist/src/prompt-config/defaults/core-defaults.js.map +1 -1
  54. package/dist/src/prompt-config/defaults/core.md +1 -1
  55. package/dist/src/prompt-config/defaults/provider-defaults.d.ts +1 -1
  56. package/dist/src/prompt-config/defaults/provider-defaults.js +16 -19
  57. package/dist/src/prompt-config/defaults/provider-defaults.js.map +1 -1
  58. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +273 -10
  59. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/gemini-2-5-flash/core.md +278 -0
  60. package/dist/src/prompt-config/defaults/tool-defaults.d.ts +1 -1
  61. package/dist/src/prompt-config/defaults/tool-defaults.js +27 -75
  62. package/dist/src/prompt-config/defaults/tool-defaults.js.map +1 -1
  63. package/dist/src/prompt-config/defaults/tools/read-file.md +1 -1
  64. package/dist/src/providers/BaseProvider.d.ts +149 -0
  65. package/dist/src/providers/BaseProvider.js +315 -0
  66. package/dist/src/providers/BaseProvider.js.map +1 -0
  67. package/dist/src/providers/IProvider.d.ts +1 -0
  68. package/dist/src/providers/LoggingProviderWrapper.d.ts +1 -0
  69. package/dist/src/providers/LoggingProviderWrapper.js +3 -0
  70. package/dist/src/providers/LoggingProviderWrapper.js.map +1 -1
  71. package/dist/src/providers/ProviderManager.d.ts +0 -1
  72. package/dist/src/providers/ProviderManager.js +23 -14
  73. package/dist/src/providers/ProviderManager.js.map +1 -1
  74. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +20 -6
  75. package/dist/src/providers/anthropic/AnthropicProvider.js +173 -27
  76. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
  77. package/dist/src/providers/gemini/GeminiProvider.d.ts +20 -7
  78. package/dist/src/providers/gemini/GeminiProvider.js +182 -147
  79. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  80. package/dist/src/providers/openai/OpenAIProvider.d.ts +53 -6
  81. package/dist/src/providers/openai/OpenAIProvider.js +373 -40
  82. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  83. package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +1 -1
  84. package/dist/src/providers/openai/RESPONSES_API_MODELS.js +1 -0
  85. package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +1 -1
  86. package/dist/src/providers/openai/syntheticToolResponses.d.ts +52 -0
  87. package/dist/src/providers/openai/syntheticToolResponses.js +129 -0
  88. package/dist/src/providers/openai/syntheticToolResponses.js.map +1 -0
  89. package/dist/src/services/loopDetectionService.js +4 -5
  90. package/dist/src/services/loopDetectionService.js.map +1 -1
  91. package/dist/src/settings/SettingsService.d.ts +32 -0
  92. package/dist/src/settings/SettingsService.js +204 -0
  93. package/dist/src/settings/SettingsService.js.map +1 -0
  94. package/dist/src/settings/settingsServiceInstance.d.ts +12 -0
  95. package/dist/src/settings/settingsServiceInstance.js +24 -0
  96. package/dist/src/settings/settingsServiceInstance.js.map +1 -0
  97. package/dist/src/settings/types.d.ts +141 -0
  98. package/dist/src/settings/types.js +5 -0
  99. package/dist/src/settings/types.js.map +1 -0
  100. package/dist/src/tools/edit.js +6 -7
  101. package/dist/src/tools/edit.js.map +1 -1
  102. package/dist/src/tools/glob.js +7 -8
  103. package/dist/src/tools/glob.js.map +1 -1
  104. package/dist/src/tools/grep.js +6 -7
  105. package/dist/src/tools/grep.js.map +1 -1
  106. package/dist/src/tools/ls.js +9 -10
  107. package/dist/src/tools/ls.js.map +1 -1
  108. package/dist/src/tools/mcp-tool.d.ts +3 -8
  109. package/dist/src/tools/mcp-tool.js +5 -18
  110. package/dist/src/tools/mcp-tool.js.map +1 -1
  111. package/dist/src/tools/memoryTool.js +4 -5
  112. package/dist/src/tools/memoryTool.js.map +1 -1
  113. package/dist/src/tools/read-file.js +5 -6
  114. package/dist/src/tools/read-file.js.map +1 -1
  115. package/dist/src/tools/read-many-files.js +17 -18
  116. package/dist/src/tools/read-many-files.js.map +1 -1
  117. package/dist/src/tools/shell.js +8 -9
  118. package/dist/src/tools/shell.js.map +1 -1
  119. package/dist/src/tools/tool-registry.d.ts +1 -15
  120. package/dist/src/tools/tool-registry.js +4 -72
  121. package/dist/src/tools/tool-registry.js.map +1 -1
  122. package/dist/src/tools/tools.d.ts +6 -6
  123. package/dist/src/tools/tools.js +2 -2
  124. package/dist/src/tools/tools.js.map +1 -1
  125. package/dist/src/tools/web-fetch.js +3 -4
  126. package/dist/src/tools/web-fetch.js.map +1 -1
  127. package/dist/src/tools/web-search.js +3 -4
  128. package/dist/src/tools/web-search.js.map +1 -1
  129. package/dist/src/tools/write-file.js +4 -5
  130. package/dist/src/tools/write-file.js.map +1 -1
  131. package/dist/src/utils/editCorrector.js +8 -9
  132. package/dist/src/utils/editCorrector.js.map +1 -1
  133. package/dist/src/utils/nextSpeakerChecker.js +3 -4
  134. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  135. package/dist/src/utils/schemaValidator.d.ts +1 -9
  136. package/dist/src/utils/schemaValidator.js +1 -109
  137. package/dist/src/utils/schemaValidator.js.map +1 -1
  138. package/package.json +4 -2
  139. package/dist/src/code_assist/converter.test.d.ts +0 -6
  140. package/dist/src/code_assist/converter.test.js +0 -279
  141. package/dist/src/code_assist/converter.test.js.map +0 -1
  142. package/dist/src/code_assist/oauth2.test.d.ts +0 -6
  143. package/dist/src/code_assist/oauth2.test.js +0 -370
  144. package/dist/src/code_assist/oauth2.test.js.map +0 -1
  145. package/dist/src/code_assist/server.test.d.ts +0 -6
  146. package/dist/src/code_assist/server.test.js +0 -134
  147. package/dist/src/code_assist/server.test.js.map +0 -1
  148. package/dist/src/code_assist/setup.test.d.ts +0 -6
  149. package/dist/src/code_assist/setup.test.js +0 -65
  150. package/dist/src/code_assist/setup.test.js.map +0 -1
  151. package/dist/src/config/config.alwaysAllow.test.d.ts +0 -6
  152. package/dist/src/config/config.alwaysAllow.test.js +0 -84
  153. package/dist/src/config/config.alwaysAllow.test.js.map +0 -1
  154. package/dist/src/config/config.ephemeral.test.d.ts +0 -6
  155. package/dist/src/config/config.ephemeral.test.js +0 -152
  156. package/dist/src/config/config.ephemeral.test.js.map +0 -1
  157. package/dist/src/config/config.test.d.ts +0 -6
  158. package/dist/src/config/config.test.js +0 -369
  159. package/dist/src/config/config.test.js.map +0 -1
  160. package/dist/src/config/flashFallback.test.d.ts +0 -6
  161. package/dist/src/config/flashFallback.test.js +0 -91
  162. package/dist/src/config/flashFallback.test.js.map +0 -1
  163. package/dist/src/core/client.test.d.ts +0 -6
  164. package/dist/src/core/client.test.js +0 -1322
  165. package/dist/src/core/client.test.js.map +0 -1
  166. package/dist/src/core/contentGenerator.test.d.ts +0 -6
  167. package/dist/src/core/contentGenerator.test.js +0 -103
  168. package/dist/src/core/contentGenerator.test.js.map +0 -1
  169. package/dist/src/core/coreToolScheduler.test.d.ts +0 -6
  170. package/dist/src/core/coreToolScheduler.test.js +0 -637
  171. package/dist/src/core/coreToolScheduler.test.js.map +0 -1
  172. package/dist/src/core/geminiChat.test.d.ts +0 -6
  173. package/dist/src/core/geminiChat.test.js +0 -425
  174. package/dist/src/core/geminiChat.test.js.map +0 -1
  175. package/dist/src/core/googleGenAIWrapper.test.d.ts +0 -6
  176. package/dist/src/core/googleGenAIWrapper.test.js +0 -104
  177. package/dist/src/core/googleGenAIWrapper.test.js.map +0 -1
  178. package/dist/src/core/logger.test.d.ts +0 -6
  179. package/dist/src/core/logger.test.js +0 -467
  180. package/dist/src/core/logger.test.js.map +0 -1
  181. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +0 -6
  182. package/dist/src/core/nonInteractiveToolExecutor.test.js +0 -165
  183. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +0 -1
  184. package/dist/src/core/prompts-async.test.d.ts +0 -6
  185. package/dist/src/core/prompts-async.test.js +0 -115
  186. package/dist/src/core/prompts-async.test.js.map +0 -1
  187. package/dist/src/core/prompts.test.d.ts +0 -6
  188. package/dist/src/core/prompts.test.js +0 -68
  189. package/dist/src/core/prompts.test.js.map +0 -1
  190. package/dist/src/core/subagent.test.d.ts +0 -6
  191. package/dist/src/core/subagent.test.js +0 -519
  192. package/dist/src/core/subagent.test.js.map +0 -1
  193. package/dist/src/core/tokenLimits.test.d.ts +0 -6
  194. package/dist/src/core/tokenLimits.test.js +0 -66
  195. package/dist/src/core/tokenLimits.test.js.map +0 -1
  196. package/dist/src/core/turn.test.d.ts +0 -6
  197. package/dist/src/core/turn.test.js +0 -366
  198. package/dist/src/core/turn.test.js.map +0 -1
  199. package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +0 -6
  200. package/dist/src/hooks/tool-render-suppression-hook.test.js +0 -59
  201. package/dist/src/hooks/tool-render-suppression-hook.test.js.map +0 -1
  202. package/dist/src/ide/ide-installer.test.d.ts +0 -6
  203. package/dist/src/ide/ide-installer.test.js +0 -55
  204. package/dist/src/ide/ide-installer.test.js.map +0 -1
  205. package/dist/src/ide/ideContext.test.d.ts +0 -6
  206. package/dist/src/ide/ideContext.test.js +0 -265
  207. package/dist/src/ide/ideContext.test.js.map +0 -1
  208. package/dist/src/index.test.d.ts +0 -6
  209. package/dist/src/index.test.js +0 -12
  210. package/dist/src/index.test.js.map +0 -1
  211. package/dist/src/integration-tests/todo-system.test.d.ts +0 -6
  212. package/dist/src/integration-tests/todo-system.test.js +0 -46
  213. package/dist/src/integration-tests/todo-system.test.js.map +0 -1
  214. package/dist/src/mcp/google-auth-provider.test.d.ts +0 -6
  215. package/dist/src/mcp/google-auth-provider.test.js +0 -54
  216. package/dist/src/mcp/google-auth-provider.test.js.map +0 -1
  217. package/dist/src/mcp/oauth-provider.test.d.ts +0 -6
  218. package/dist/src/mcp/oauth-provider.test.js +0 -602
  219. package/dist/src/mcp/oauth-provider.test.js.map +0 -1
  220. package/dist/src/mcp/oauth-token-storage.test.d.ts +0 -6
  221. package/dist/src/mcp/oauth-token-storage.test.js +0 -205
  222. package/dist/src/mcp/oauth-token-storage.test.js.map +0 -1
  223. package/dist/src/mcp/oauth-utils.test.d.ts +0 -6
  224. package/dist/src/mcp/oauth-utils.test.js +0 -144
  225. package/dist/src/mcp/oauth-utils.test.js.map +0 -1
  226. package/dist/src/parsers/TextToolCallParser.multibyte.test.d.ts +0 -1
  227. package/dist/src/parsers/TextToolCallParser.multibyte.test.js +0 -42
  228. package/dist/src/parsers/TextToolCallParser.multibyte.test.js.map +0 -1
  229. package/dist/src/parsers/TextToolCallParser.test.d.ts +0 -1
  230. package/dist/src/parsers/TextToolCallParser.test.js +0 -225
  231. package/dist/src/parsers/TextToolCallParser.test.js.map +0 -1
  232. package/dist/src/prompt-config/TemplateEngine.test.d.ts +0 -1
  233. package/dist/src/prompt-config/TemplateEngine.test.js +0 -494
  234. package/dist/src/prompt-config/TemplateEngine.test.js.map +0 -1
  235. package/dist/src/prompt-config/prompt-cache.test.d.ts +0 -6
  236. package/dist/src/prompt-config/prompt-cache.test.js +0 -437
  237. package/dist/src/prompt-config/prompt-cache.test.js.map +0 -1
  238. package/dist/src/prompt-config/prompt-installer.test.d.ts +0 -7
  239. package/dist/src/prompt-config/prompt-installer.test.js +0 -503
  240. package/dist/src/prompt-config/prompt-installer.test.js.map +0 -1
  241. package/dist/src/prompt-config/prompt-loader.test.d.ts +0 -5
  242. package/dist/src/prompt-config/prompt-loader.test.js +0 -413
  243. package/dist/src/prompt-config/prompt-loader.test.js.map +0 -1
  244. package/dist/src/prompt-config/prompt-resolver.test.d.ts +0 -1
  245. package/dist/src/prompt-config/prompt-resolver.test.js +0 -529
  246. package/dist/src/prompt-config/prompt-resolver.test.js.map +0 -1
  247. package/dist/src/prompt-config/prompt-service.test.d.ts +0 -1
  248. package/dist/src/prompt-config/prompt-service.test.js +0 -811
  249. package/dist/src/prompt-config/prompt-service.test.js.map +0 -1
  250. package/dist/src/providers/ProviderManager.gemini-switch.test.d.ts +0 -6
  251. package/dist/src/providers/ProviderManager.gemini-switch.test.js +0 -57
  252. package/dist/src/providers/ProviderManager.gemini-switch.test.js.map +0 -1
  253. package/dist/src/providers/ProviderManager.test.d.ts +0 -6
  254. package/dist/src/providers/ProviderManager.test.js +0 -284
  255. package/dist/src/providers/ProviderManager.test.js.map +0 -1
  256. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.d.ts +0 -6
  257. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +0 -273
  258. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +0 -1
  259. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.d.ts +0 -1
  260. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js +0 -48
  261. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js.map +0 -1
  262. package/dist/src/providers/anthropic/AnthropicProvider.test.d.ts +0 -1
  263. package/dist/src/providers/anthropic/AnthropicProvider.test.js +0 -487
  264. package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +0 -1
  265. package/dist/src/providers/gemini/GeminiProvider.integration.test.d.ts +0 -6
  266. package/dist/src/providers/gemini/GeminiProvider.integration.test.js +0 -126
  267. package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +0 -1
  268. package/dist/src/providers/gemini/GeminiProvider.test.d.ts +0 -6
  269. package/dist/src/providers/gemini/GeminiProvider.test.js +0 -136
  270. package/dist/src/providers/gemini/GeminiProvider.test.js.map +0 -1
  271. package/dist/src/providers/integration/multi-provider.integration.test.d.ts +0 -6
  272. package/dist/src/providers/integration/multi-provider.integration.test.js +0 -292
  273. package/dist/src/providers/integration/multi-provider.integration.test.js.map +0 -1
  274. package/dist/src/providers/openai/ConversationCache.accumTokens.test.d.ts +0 -1
  275. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js +0 -97
  276. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js.map +0 -1
  277. package/dist/src/providers/openai/ConversationCache.test.d.ts +0 -1
  278. package/dist/src/providers/openai/ConversationCache.test.js +0 -113
  279. package/dist/src/providers/openai/ConversationCache.test.js.map +0 -1
  280. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.d.ts +0 -1
  281. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js +0 -189
  282. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js.map +0 -1
  283. package/dist/src/providers/openai/OpenAIProvider.integration.test.d.ts +0 -6
  284. package/dist/src/providers/openai/OpenAIProvider.integration.test.js +0 -125
  285. package/dist/src/providers/openai/OpenAIProvider.integration.test.js.map +0 -1
  286. package/dist/src/providers/openai/OpenAIProvider.responses.test.d.ts +0 -1
  287. package/dist/src/providers/openai/OpenAIProvider.responses.test.js +0 -350
  288. package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +0 -1
  289. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.d.ts +0 -1
  290. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js +0 -213
  291. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js.map +0 -1
  292. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.d.ts +0 -1
  293. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +0 -59
  294. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +0 -1
  295. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.d.ts +0 -6
  296. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +0 -105
  297. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +0 -1
  298. package/dist/src/providers/openai/OpenAIProvider.switch.test.d.ts +0 -1
  299. package/dist/src/providers/openai/OpenAIProvider.switch.test.js +0 -256
  300. package/dist/src/providers/openai/OpenAIProvider.switch.test.js.map +0 -1
  301. package/dist/src/providers/openai/OpenAIProvider.test.d.ts +0 -16
  302. package/dist/src/providers/openai/OpenAIProvider.test.js +0 -620
  303. package/dist/src/providers/openai/OpenAIProvider.test.js.map +0 -1
  304. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.d.ts +0 -1
  305. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js +0 -210
  306. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js.map +0 -1
  307. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.d.ts +0 -1
  308. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js +0 -65
  309. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js.map +0 -1
  310. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.d.ts +0 -1
  311. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js +0 -129
  312. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js.map +0 -1
  313. package/dist/src/providers/openai/buildResponsesRequest.test.d.ts +0 -1
  314. package/dist/src/providers/openai/buildResponsesRequest.test.js +0 -406
  315. package/dist/src/providers/openai/buildResponsesRequest.test.js.map +0 -1
  316. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.d.ts +0 -1
  317. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js +0 -50
  318. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js.map +0 -1
  319. package/dist/src/providers/openai/estimateRemoteTokens.test.d.ts +0 -1
  320. package/dist/src/providers/openai/estimateRemoteTokens.test.js +0 -125
  321. package/dist/src/providers/openai/estimateRemoteTokens.test.js.map +0 -1
  322. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.d.ts +0 -1
  323. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js +0 -192
  324. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js.map +0 -1
  325. package/dist/src/providers/openai/parseResponsesStream.test.d.ts +0 -1
  326. package/dist/src/providers/openai/parseResponsesStream.test.js +0 -151
  327. package/dist/src/providers/openai/parseResponsesStream.test.js.map +0 -1
  328. package/dist/src/services/fileDiscoveryService.test.d.ts +0 -6
  329. package/dist/src/services/fileDiscoveryService.test.js +0 -143
  330. package/dist/src/services/fileDiscoveryService.test.js.map +0 -1
  331. package/dist/src/services/gitService.test.d.ts +0 -6
  332. package/dist/src/services/gitService.test.js +0 -209
  333. package/dist/src/services/gitService.test.js.map +0 -1
  334. package/dist/src/services/loopDetectionService.test.d.ts +0 -6
  335. package/dist/src/services/loopDetectionService.test.js +0 -484
  336. package/dist/src/services/loopDetectionService.test.js.map +0 -1
  337. package/dist/src/services/shellExecutionService.multibyte.test.d.ts +0 -6
  338. package/dist/src/services/shellExecutionService.multibyte.test.js +0 -72
  339. package/dist/src/services/shellExecutionService.multibyte.test.js.map +0 -1
  340. package/dist/src/services/shellExecutionService.test.d.ts +0 -6
  341. package/dist/src/services/shellExecutionService.test.js +0 -272
  342. package/dist/src/services/shellExecutionService.test.js.map +0 -1
  343. package/dist/src/services/shellExecutionService.windows.multibyte.test.d.ts +0 -6
  344. package/dist/src/services/shellExecutionService.windows.multibyte.test.js +0 -98
  345. package/dist/src/services/shellExecutionService.windows.multibyte.test.js.map +0 -1
  346. package/dist/src/services/shellExecutionService.windows.test.d.ts +0 -6
  347. package/dist/src/services/shellExecutionService.windows.test.js +0 -79
  348. package/dist/src/services/shellExecutionService.windows.test.js.map +0 -1
  349. package/dist/src/services/tool-call-tracker-service.test.d.ts +0 -6
  350. package/dist/src/services/tool-call-tracker-service.test.js +0 -99
  351. package/dist/src/services/tool-call-tracker-service.test.js.map +0 -1
  352. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +0 -6
  353. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +0 -187
  354. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +0 -1
  355. package/dist/src/telemetry/loggers.test.d.ts +0 -6
  356. package/dist/src/telemetry/loggers.test.js +0 -573
  357. package/dist/src/telemetry/loggers.test.js.map +0 -1
  358. package/dist/src/telemetry/metrics.test.d.ts +0 -6
  359. package/dist/src/telemetry/metrics.test.js +0 -212
  360. package/dist/src/telemetry/metrics.test.js.map +0 -1
  361. package/dist/src/telemetry/telemetry.test.d.ts +0 -6
  362. package/dist/src/telemetry/telemetry.test.js +0 -54
  363. package/dist/src/telemetry/telemetry.test.js.map +0 -1
  364. package/dist/src/telemetry/uiTelemetry.test.d.ts +0 -6
  365. package/dist/src/telemetry/uiTelemetry.test.js +0 -518
  366. package/dist/src/telemetry/uiTelemetry.test.js.map +0 -1
  367. package/dist/src/tools/ToolFormatter.test.d.ts +0 -16
  368. package/dist/src/tools/ToolFormatter.test.js +0 -349
  369. package/dist/src/tools/ToolFormatter.test.js.map +0 -1
  370. package/dist/src/tools/ToolFormatter.toResponsesTool.test.d.ts +0 -1
  371. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js +0 -241
  372. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js.map +0 -1
  373. package/dist/src/tools/diffOptions.test.d.ts +0 -6
  374. package/dist/src/tools/diffOptions.test.js +0 -119
  375. package/dist/src/tools/diffOptions.test.js.map +0 -1
  376. package/dist/src/tools/edit.test.d.ts +0 -6
  377. package/dist/src/tools/edit.test.js +0 -689
  378. package/dist/src/tools/edit.test.js.map +0 -1
  379. package/dist/src/tools/glob.test.d.ts +0 -6
  380. package/dist/src/tools/glob.test.js +0 -332
  381. package/dist/src/tools/glob.test.js.map +0 -1
  382. package/dist/src/tools/grep.test.d.ts +0 -6
  383. package/dist/src/tools/grep.test.js +0 -272
  384. package/dist/src/tools/grep.test.js.map +0 -1
  385. package/dist/src/tools/ls.test.d.ts +0 -6
  386. package/dist/src/tools/ls.test.js +0 -357
  387. package/dist/src/tools/ls.test.js.map +0 -1
  388. package/dist/src/tools/mcp-client.test.d.ts +0 -6
  389. package/dist/src/tools/mcp-client.test.js +0 -617
  390. package/dist/src/tools/mcp-client.test.js.map +0 -1
  391. package/dist/src/tools/mcp-tool.test.d.ts +0 -6
  392. package/dist/src/tools/mcp-tool.test.js +0 -501
  393. package/dist/src/tools/mcp-tool.test.js.map +0 -1
  394. package/dist/src/tools/memoryTool.test.d.ts +0 -6
  395. package/dist/src/tools/memoryTool.test.js +0 -266
  396. package/dist/src/tools/memoryTool.test.js.map +0 -1
  397. package/dist/src/tools/modifiable-tool.test.d.ts +0 -6
  398. package/dist/src/tools/modifiable-tool.test.js +0 -193
  399. package/dist/src/tools/modifiable-tool.test.js.map +0 -1
  400. package/dist/src/tools/read-file.test.d.ts +0 -6
  401. package/dist/src/tools/read-file.test.js +0 -319
  402. package/dist/src/tools/read-file.test.js.map +0 -1
  403. package/dist/src/tools/read-many-files.test.d.ts +0 -6
  404. package/dist/src/tools/read-many-files.test.js +0 -644
  405. package/dist/src/tools/read-many-files.test.js.map +0 -1
  406. package/dist/src/tools/shell.multibyte.test.d.ts +0 -6
  407. package/dist/src/tools/shell.multibyte.test.js +0 -75
  408. package/dist/src/tools/shell.multibyte.test.js.map +0 -1
  409. package/dist/src/tools/shell.test.d.ts +0 -6
  410. package/dist/src/tools/shell.test.js +0 -367
  411. package/dist/src/tools/shell.test.js.map +0 -1
  412. package/dist/src/tools/todo-pause.spec.d.ts +0 -6
  413. package/dist/src/tools/todo-pause.spec.js +0 -287
  414. package/dist/src/tools/todo-pause.spec.js.map +0 -1
  415. package/dist/src/tools/todo-read.test.d.ts +0 -6
  416. package/dist/src/tools/todo-read.test.js +0 -162
  417. package/dist/src/tools/todo-read.test.js.map +0 -1
  418. package/dist/src/tools/todo-schemas.test.d.ts +0 -6
  419. package/dist/src/tools/todo-schemas.test.js +0 -341
  420. package/dist/src/tools/todo-schemas.test.js.map +0 -1
  421. package/dist/src/tools/todo-store.test.d.ts +0 -6
  422. package/dist/src/tools/todo-store.test.js +0 -169
  423. package/dist/src/tools/todo-store.test.js.map +0 -1
  424. package/dist/src/tools/todo-write.test.d.ts +0 -6
  425. package/dist/src/tools/todo-write.test.js +0 -226
  426. package/dist/src/tools/todo-write.test.js.map +0 -1
  427. package/dist/src/tools/tool-registry.test.d.ts +0 -6
  428. package/dist/src/tools/tool-registry.test.js +0 -468
  429. package/dist/src/tools/tool-registry.test.js.map +0 -1
  430. package/dist/src/tools/tools.test.d.ts +0 -6
  431. package/dist/src/tools/tools.test.js +0 -117
  432. package/dist/src/tools/tools.test.js.map +0 -1
  433. package/dist/src/tools/web-fetch.integration.test.d.ts +0 -6
  434. package/dist/src/tools/web-fetch.integration.test.js +0 -532
  435. package/dist/src/tools/web-fetch.integration.test.js.map +0 -1
  436. package/dist/src/tools/web-search.test.d.ts +0 -6
  437. package/dist/src/tools/web-search.test.js +0 -230
  438. package/dist/src/tools/web-search.test.js.map +0 -1
  439. package/dist/src/tools/write-file.test.d.ts +0 -6
  440. package/dist/src/tools/write-file.test.js +0 -465
  441. package/dist/src/tools/write-file.test.js.map +0 -1
  442. package/dist/src/utils/bfsFileSearch.test.d.ts +0 -6
  443. package/dist/src/utils/bfsFileSearch.test.js +0 -191
  444. package/dist/src/utils/bfsFileSearch.test.js.map +0 -1
  445. package/dist/src/utils/editCorrector.test.d.ts +0 -6
  446. package/dist/src/utils/editCorrector.test.js +0 -564
  447. package/dist/src/utils/editCorrector.test.js.map +0 -1
  448. package/dist/src/utils/editor.test.d.ts +0 -6
  449. package/dist/src/utils/editor.test.js +0 -445
  450. package/dist/src/utils/editor.test.js.map +0 -1
  451. package/dist/src/utils/environmentContext.test.d.ts +0 -6
  452. package/dist/src/utils/environmentContext.test.js +0 -139
  453. package/dist/src/utils/environmentContext.test.js.map +0 -1
  454. package/dist/src/utils/errorReporting.test.d.ts +0 -6
  455. package/dist/src/utils/errorReporting.test.js +0 -130
  456. package/dist/src/utils/errorReporting.test.js.map +0 -1
  457. package/dist/src/utils/fileUtils.test.d.ts +0 -6
  458. package/dist/src/utils/fileUtils.test.js +0 -363
  459. package/dist/src/utils/fileUtils.test.js.map +0 -1
  460. package/dist/src/utils/filesearch/crawlCache.test.d.ts +0 -6
  461. package/dist/src/utils/filesearch/crawlCache.test.js +0 -103
  462. package/dist/src/utils/filesearch/crawlCache.test.js.map +0 -1
  463. package/dist/src/utils/filesearch/fileSearch.test.d.ts +0 -6
  464. package/dist/src/utils/filesearch/fileSearch.test.js +0 -654
  465. package/dist/src/utils/filesearch/fileSearch.test.js.map +0 -1
  466. package/dist/src/utils/filesearch/ignore.test.d.ts +0 -6
  467. package/dist/src/utils/filesearch/ignore.test.js +0 -57
  468. package/dist/src/utils/filesearch/ignore.test.js.map +0 -1
  469. package/dist/src/utils/filesearch/result-cache.test.d.ts +0 -6
  470. package/dist/src/utils/filesearch/result-cache.test.js +0 -47
  471. package/dist/src/utils/filesearch/result-cache.test.js.map +0 -1
  472. package/dist/src/utils/flashFallback.integration.test.d.ts +0 -6
  473. package/dist/src/utils/flashFallback.integration.test.js +0 -120
  474. package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
  475. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +0 -6
  476. package/dist/src/utils/generateContentResponseUtilities.test.js +0 -273
  477. package/dist/src/utils/generateContentResponseUtilities.test.js.map +0 -1
  478. package/dist/src/utils/getFolderStructure.test.d.ts +0 -6
  479. package/dist/src/utils/getFolderStructure.test.js +0 -282
  480. package/dist/src/utils/getFolderStructure.test.js.map +0 -1
  481. package/dist/src/utils/gitIgnoreParser.test.d.ts +0 -6
  482. package/dist/src/utils/gitIgnoreParser.test.js +0 -154
  483. package/dist/src/utils/gitIgnoreParser.test.js.map +0 -1
  484. package/dist/src/utils/memoryDiscovery.test.d.ts +0 -6
  485. package/dist/src/utils/memoryDiscovery.test.js +0 -181
  486. package/dist/src/utils/memoryDiscovery.test.js.map +0 -1
  487. package/dist/src/utils/memoryImportProcessor.test.d.ts +0 -6
  488. package/dist/src/utils/memoryImportProcessor.test.js +0 -715
  489. package/dist/src/utils/memoryImportProcessor.test.js.map +0 -1
  490. package/dist/src/utils/nextSpeakerChecker.test.d.ts +0 -6
  491. package/dist/src/utils/nextSpeakerChecker.test.js +0 -172
  492. package/dist/src/utils/nextSpeakerChecker.test.js.map +0 -1
  493. package/dist/src/utils/partUtils.test.d.ts +0 -6
  494. package/dist/src/utils/partUtils.test.js +0 -130
  495. package/dist/src/utils/partUtils.test.js.map +0 -1
  496. package/dist/src/utils/paths.test.d.ts +0 -6
  497. package/dist/src/utils/paths.test.js +0 -153
  498. package/dist/src/utils/paths.test.js.map +0 -1
  499. package/dist/src/utils/retry.test.d.ts +0 -6
  500. package/dist/src/utils/retry.test.js +0 -322
  501. package/dist/src/utils/retry.test.js.map +0 -1
  502. package/dist/src/utils/safeJsonStringify.test.d.ts +0 -6
  503. package/dist/src/utils/safeJsonStringify.test.js +0 -61
  504. package/dist/src/utils/safeJsonStringify.test.js.map +0 -1
  505. package/dist/src/utils/sanitization.test.d.ts +0 -6
  506. package/dist/src/utils/sanitization.test.js +0 -81
  507. package/dist/src/utils/sanitization.test.js.map +0 -1
  508. package/dist/src/utils/schemaValidator.test.d.ts +0 -6
  509. package/dist/src/utils/schemaValidator.test.js +0 -146
  510. package/dist/src/utils/schemaValidator.test.js.map +0 -1
  511. package/dist/src/utils/secure-browser-launcher.test.d.ts +0 -6
  512. package/dist/src/utils/secure-browser-launcher.test.js +0 -149
  513. package/dist/src/utils/secure-browser-launcher.test.js.map +0 -1
  514. package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +0 -6
  515. package/dist/src/utils/shell-utils.shellReplacement.test.js +0 -149
  516. package/dist/src/utils/shell-utils.shellReplacement.test.js.map +0 -1
  517. package/dist/src/utils/shell-utils.test.d.ts +0 -6
  518. package/dist/src/utils/shell-utils.test.js +0 -200
  519. package/dist/src/utils/shell-utils.test.js.map +0 -1
  520. package/dist/src/utils/summarizer.test.d.ts +0 -6
  521. package/dist/src/utils/summarizer.test.js +0 -131
  522. package/dist/src/utils/summarizer.test.js.map +0 -1
  523. package/dist/src/utils/systemEncoding.test.d.ts +0 -6
  524. package/dist/src/utils/systemEncoding.test.js +0 -368
  525. package/dist/src/utils/systemEncoding.test.js.map +0 -1
  526. package/dist/src/utils/toolOutputLimiter.test.d.ts +0 -6
  527. package/dist/src/utils/toolOutputLimiter.test.js +0 -164
  528. package/dist/src/utils/toolOutputLimiter.test.js.map +0 -1
  529. package/dist/src/utils/unicodeUtils.test.d.ts +0 -6
  530. package/dist/src/utils/unicodeUtils.test.js +0 -120
  531. package/dist/src/utils/unicodeUtils.test.js.map +0 -1
  532. package/dist/src/utils/user_account.test.d.ts +0 -6
  533. package/dist/src/utils/user_account.test.js +0 -153
  534. package/dist/src/utils/user_account.test.js.map +0 -1
  535. package/dist/src/utils/user_id.test.d.ts +0 -6
  536. package/dist/src/utils/user_id.test.js +0 -21
  537. package/dist/src/utils/user_id.test.js.map +0 -1
  538. package/dist/src/utils/workspaceContext.test.d.ts +0 -6
  539. package/dist/src/utils/workspaceContext.test.js +0 -209
  540. package/dist/src/utils/workspaceContext.test.js.map +0 -1
@@ -4,65 +4,115 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { AuthType, ContentGeneratorRole, AuthenticationRequiredError, getCoreSystemPromptAsync, createCodeAssistContentGenerator, } from '@vybestack/llxprt-code-core';
7
- export class GeminiProvider {
8
- name = 'gemini';
9
- apiKey;
7
+ import { BaseProvider } from '../BaseProvider.js';
8
+ import { getSettingsService } from '../../settings/settingsServiceInstance.js';
9
+ export class GeminiProvider extends BaseProvider {
10
10
  authMode = 'none';
11
- config;
11
+ geminiConfig;
12
12
  currentModel = 'gemini-2.5-pro';
13
13
  modelExplicitlySet = false;
14
14
  authDetermined = false;
15
15
  baseURL;
16
16
  modelParams;
17
17
  toolSchemas;
18
- constructor(apiKey, baseURL, config) {
19
- // For consistency with other providers
20
- this.apiKey = apiKey;
21
- // baseURL is not used by Gemini but kept for consistent interface
22
- this.config = config;
18
+ geminiOAuthManager;
19
+ constructor(apiKey, baseURL, config, oauthManager) {
20
+ // Initialize base provider with auth configuration
21
+ // Check if OAuth is enabled for Gemini
22
+ let oauthEnabled = false;
23
+ if (oauthManager) {
24
+ // Cast to specific interface with isOAuthEnabled method
25
+ const manager = oauthManager;
26
+ if (manager.isOAuthEnabled &&
27
+ typeof manager.isOAuthEnabled === 'function') {
28
+ oauthEnabled = manager.isOAuthEnabled('gemini');
29
+ }
30
+ }
31
+ const baseConfig = {
32
+ name: 'gemini',
33
+ apiKey,
34
+ baseURL,
35
+ cliKey: apiKey, // CLI --key argument
36
+ envKeyNames: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'],
37
+ isOAuthEnabled: oauthEnabled, // Check if OAuth is enabled
38
+ oauthProvider: 'gemini',
39
+ oauthManager, // Keep the manager for checking enablement
40
+ };
41
+ super(baseConfig);
42
+ // Store Gemini-specific configuration
43
+ this.geminiConfig = config;
44
+ this.baseURL = baseURL;
45
+ this.geminiOAuthManager = oauthManager;
23
46
  // Do not determine auth mode on instantiation.
24
47
  // This will be done lazily when a chat completion is requested.
25
48
  }
49
+ /**
50
+ * Updates OAuth configuration based on current OAuth manager state
51
+ */
52
+ updateOAuthState() {
53
+ if (this.geminiOAuthManager) {
54
+ const manager = this.geminiOAuthManager;
55
+ if (manager.isOAuthEnabled &&
56
+ typeof manager.isOAuthEnabled === 'function') {
57
+ const isEnabled = manager.isOAuthEnabled('gemini');
58
+ // Update the OAuth configuration if state has changed
59
+ this.updateOAuthConfig(isEnabled, 'gemini', this.geminiOAuthManager);
60
+ }
61
+ }
62
+ }
26
63
  /**
27
64
  * Determines the best available authentication method based on environment variables
28
- * and existing configuration. Follows the hierarchy: Vertex AI Gemini API key → OAuth
65
+ * and existing configuration. Now uses lazy evaluation with proper precedence chain.
29
66
  */
30
- determineBestAuth() {
31
- // Skip if already determined
32
- if (this.authDetermined) {
33
- return;
34
- }
35
- // Mark as determined early to prevent concurrent determinations
36
- this.authDetermined = true;
37
- // Check if user explicitly selected USE_NONE via the content generator config
38
- const authType = this.config?.getContentGeneratorConfig()?.authType;
39
- if (authType === AuthType.USE_NONE) {
40
- this.authMode = 'none';
41
- return;
42
- }
43
- // If authType is USE_PROVIDER and no credentials exist, fall back to OAuth
44
- if (authType === AuthType.USE_PROVIDER) {
45
- if (!this.hasVertexAICredentials() && !this.hasGeminiAPIKey()) {
67
+ async determineBestAuth() {
68
+ // Re-check OAuth enablement state before determining auth
69
+ this.updateOAuthState();
70
+ // Use the base provider's auth precedence resolution
71
+ try {
72
+ const token = await this.getAuthToken();
73
+ // Check for special OAuth signal
74
+ if (token === 'USE_LOGIN_WITH_GOOGLE') {
46
75
  this.authMode = 'oauth';
47
- return;
76
+ this.authDetermined = true;
77
+ return token; // Return the magic token
48
78
  }
79
+ // Determine auth mode based on resolved authentication method
80
+ const authMethodName = await this.getAuthMethodName();
81
+ if (authMethodName?.startsWith('oauth-')) {
82
+ this.authMode = 'oauth';
83
+ }
84
+ else if (this.hasVertexAICredentials()) {
85
+ this.authMode = 'vertex-ai';
86
+ this.setupVertexAIAuth();
87
+ }
88
+ else if (this.hasGeminiAPIKey() || authMethodName?.includes('key')) {
89
+ this.authMode = 'gemini-api-key';
90
+ }
91
+ else {
92
+ this.authMode = 'none';
93
+ }
94
+ this.authDetermined = true;
95
+ return token;
49
96
  }
50
- // Check for Vertex AI credentials first
51
- if (this.hasVertexAICredentials()) {
52
- this.authMode = 'vertex-ai';
53
- this.setupVertexAIAuth();
54
- }
55
- // Check for Gemini API key second
56
- else if (this.hasGeminiAPIKey()) {
57
- this.authMode = 'gemini-api-key';
58
- // API key is already in environment, no additional setup needed
59
- }
60
- // Fall back to OAuth (will prompt user if needed)
61
- else {
62
- this.authMode = 'oauth';
63
- // OAuth will be handled by the existing auth system
97
+ catch (error) {
98
+ // Handle case where no auth is available
99
+ const authType = this.geminiConfig?.getContentGeneratorConfig()?.authType;
100
+ if (authType === AuthType.USE_NONE) {
101
+ this.authMode = 'none';
102
+ this.authDetermined = true;
103
+ throw new AuthenticationRequiredError('Authentication is set to USE_NONE but no credentials are available', this.authMode, ['GEMINI_API_KEY', 'GOOGLE_API_KEY']);
104
+ }
105
+ throw error;
64
106
  }
65
107
  }
108
+ /**
109
+ * Implementation of BaseProvider abstract method
110
+ * Determines if this provider supports OAuth authentication
111
+ */
112
+ supportsOAuth() {
113
+ // Gemini always supports Google OAuth
114
+ return true;
115
+ }
66
116
  /**
67
117
  * Checks if Vertex AI credentials are available
68
118
  */
@@ -75,7 +125,7 @@ export class GeminiProvider {
75
125
  * Checks if Gemini API key is available
76
126
  */
77
127
  hasGeminiAPIKey() {
78
- return !!this.apiKey || !!process.env.GEMINI_API_KEY;
128
+ return !!process.env.GEMINI_API_KEY;
79
129
  }
80
130
  /**
81
131
  * Sets up environment variables for Vertex AI authentication
@@ -88,17 +138,18 @@ export class GeminiProvider {
88
138
  * Sets the config instance for reading OAuth credentials
89
139
  */
90
140
  setConfig(config) {
91
- this.config = config;
141
+ this.geminiConfig = config;
92
142
  // Sync with config model if user hasn't explicitly set a model
93
143
  // This ensures consistency between config and provider state
94
144
  const configModel = config.getModel();
95
145
  if (!this.modelExplicitlySet && configModel) {
96
146
  this.currentModel = configModel;
97
147
  }
148
+ // Update OAuth configuration based on config
149
+ const authType = config.getContentGeneratorConfig()?.authType;
150
+ this.updateOAuthConfig(authType === AuthType.LOGIN_WITH_GOOGLE, 'gemini', this.geminiOAuthManager);
98
151
  // Clear auth cache when config changes to allow re-determination
99
152
  this.authDetermined = false;
100
- // Re-determine auth after config is set
101
- this.determineBestAuth();
102
153
  }
103
154
  async getModels() {
104
155
  // For OAuth mode, return fixed list of models
@@ -126,7 +177,7 @@ export class GeminiProvider {
126
177
  }
127
178
  // For API key modes (gemini-api-key or vertex-ai), try to fetch real models
128
179
  if (this.authMode === 'gemini-api-key' || this.authMode === 'vertex-ai') {
129
- const apiKey = this.apiKey || process.env.GEMINI_API_KEY;
180
+ const apiKey = (await this.getAuthToken()) || process.env.GEMINI_API_KEY;
130
181
  if (apiKey) {
131
182
  try {
132
183
  const url = this.baseURL
@@ -206,39 +257,20 @@ export class GeminiProvider {
206
257
  console.log('DEBUG: GeminiProvider.generateChatCompletion called with messages:', JSON.stringify(messages, null, 2));
207
258
  }
208
259
  }
209
- // Check if we need to re-determine auth
210
- const oauthValid = await this.isOAuthValid();
211
- if (!oauthValid) {
212
- this.authDetermined = false;
213
- }
214
260
  // Lazily determine the best auth method now that it's needed.
215
- this.determineBestAuth();
216
- // Early authentication validation - check if we have the required credentials
217
- // for the determined auth mode BEFORE processing messages
218
- switch (this.authMode) {
219
- case 'gemini-api-key':
220
- if (!this.apiKey && !process.env.GEMINI_API_KEY) {
221
- throw new AuthenticationRequiredError('Gemini API key required but not found. Please set GEMINI_API_KEY environment variable or use /auth to login with Google OAuth.', this.authMode, ['GEMINI_API_KEY']);
222
- }
223
- break;
224
- case 'vertex-ai':
225
- if (!process.env.GOOGLE_API_KEY) {
226
- throw new AuthenticationRequiredError('Google API key required for Vertex AI. Please set GOOGLE_API_KEY environment variable or use /auth to login with Google OAuth.', this.authMode, ['GOOGLE_API_KEY', 'GOOGLE_CLOUD_PROJECT', 'GOOGLE_CLOUD_LOCATION']);
227
- }
228
- break;
229
- case 'oauth':
230
- // OAuth auth will be validated when creating the content generator
231
- break;
232
- case 'none':
233
- // In 'none' mode, check if ANY credentials are available
234
- if (!this.hasGeminiAPIKey() && !this.hasVertexAICredentials()) {
235
- throw new AuthenticationRequiredError('No authentication credentials found. Please use /auth to login with Google OAuth, set GEMINI_API_KEY, or configure Vertex AI credentials.', this.authMode, ['GEMINI_API_KEY', 'GOOGLE_API_KEY']);
236
- }
237
- break;
238
- default:
239
- // For any other auth mode, proceed without validation
240
- break;
261
+ // This implements lazy OAuth triggering - OAuth is only triggered when making API calls
262
+ let authToken;
263
+ try {
264
+ authToken = await this.determineBestAuth();
265
+ }
266
+ catch (error) {
267
+ if (error instanceof AuthenticationRequiredError) {
268
+ throw error;
269
+ }
270
+ throw new AuthenticationRequiredError('Failed to resolve authentication for Gemini provider', this.authMode, ['GEMINI_API_KEY', 'GOOGLE_API_KEY']);
241
271
  }
272
+ // Authentication has already been resolved by determineBestAuth()
273
+ // No need for additional validation since the auth token is already obtained
242
274
  // Import the necessary modules dynamically to avoid circular dependencies
243
275
  const { GoogleGenAI } = await import('@google/genai');
244
276
  // Create the appropriate client based on auth mode
@@ -250,11 +282,8 @@ export class GeminiProvider {
250
282
  };
251
283
  switch (this.authMode) {
252
284
  case 'gemini-api-key':
253
- if (!this.apiKey && !process.env.GEMINI_API_KEY) {
254
- throw new Error('Gemini API key required but not found');
255
- }
256
285
  genAI = new GoogleGenAI({
257
- apiKey: this.apiKey || process.env.GEMINI_API_KEY,
286
+ apiKey: authToken,
258
287
  httpOptions: this.baseURL
259
288
  ? {
260
289
  ...httpOptions,
@@ -264,11 +293,8 @@ export class GeminiProvider {
264
293
  });
265
294
  break;
266
295
  case 'vertex-ai':
267
- if (!process.env.GOOGLE_API_KEY) {
268
- throw new Error('Google API key required for Vertex AI');
269
- }
270
296
  genAI = new GoogleGenAI({
271
- apiKey: process.env.GOOGLE_API_KEY,
297
+ apiKey: authToken,
272
298
  vertexai: true,
273
299
  httpOptions: this.baseURL
274
300
  ? {
@@ -279,17 +305,21 @@ export class GeminiProvider {
279
305
  });
280
306
  break;
281
307
  case 'oauth': {
308
+ // For OAuth, create a minimal config-like object if we don't have one
309
+ const configForOAuth = this.geminiConfig || {
310
+ getProxy: () => undefined, // OAuth only needs this from config
311
+ };
282
312
  // For OAuth, we need to use the code assist server
283
- const contentGenerator = await createCodeAssistContentGenerator(httpOptions, AuthType.LOGIN_WITH_GOOGLE, this.config, this.baseURL);
313
+ const contentGenerator = await createCodeAssistContentGenerator(httpOptions, AuthType.LOGIN_WITH_GOOGLE, configForOAuth, this.baseURL);
284
314
  // Convert messages to Gemini request format
285
315
  // Use config model in OAuth mode to ensure synchronization
286
316
  const oauthModel = this.modelExplicitlySet
287
317
  ? this.currentModel
288
- : this.config?.getModel() || this.currentModel;
318
+ : this.geminiConfig?.getModel() || this.currentModel;
289
319
  // Generate systemInstruction using getCoreSystemPrompt
290
320
  // Get user memory from config if available
291
- const userMemory = this.config?.getUserMemory
292
- ? this.config.getUserMemory()
321
+ const userMemory = this.geminiConfig?.getUserMemory
322
+ ? this.geminiConfig.getUserMemory()
293
323
  : '';
294
324
  const systemInstruction = await getCoreSystemPromptAsync(userMemory, oauthModel);
295
325
  // Store tools if provided
@@ -314,7 +344,7 @@ export class GeminiProvider {
314
344
  },
315
345
  };
316
346
  // Use the content generator stream
317
- const streamResult = await contentGenerator.generateContentStream(request, this.config?.getSessionId() || 'default');
347
+ const streamResult = await contentGenerator.generateContentStream(request, this.geminiConfig?.getSessionId() || 'default');
318
348
  // Convert the stream to our format
319
349
  for await (const response of streamResult) {
320
350
  // Extract text from the response
@@ -351,34 +381,17 @@ export class GeminiProvider {
351
381
  return;
352
382
  }
353
383
  case 'none':
354
- // For 'none' mode, check what credentials are available
355
- if (this.hasGeminiAPIKey()) {
356
- genAI = new GoogleGenAI({
357
- apiKey: this.apiKey || process.env.GEMINI_API_KEY,
358
- httpOptions: this.baseURL
359
- ? {
360
- ...httpOptions,
361
- baseUrl: this.baseURL,
362
- }
363
- : httpOptions,
364
- });
365
- }
366
- else if (this.hasVertexAICredentials()) {
367
- this.setupVertexAIAuth();
368
- genAI = new GoogleGenAI({
369
- apiKey: process.env.GOOGLE_API_KEY,
370
- vertexai: true,
371
- httpOptions: this.baseURL
372
- ? {
373
- ...httpOptions,
374
- baseUrl: this.baseURL,
375
- }
376
- : httpOptions,
377
- });
378
- }
379
- else {
380
- throw new Error('No authentication credentials found. Please use /auth to login with Google OAuth, set GEMINI_API_KEY, or configure Vertex AI credentials.');
381
- }
384
+ // For 'none' mode, use the resolved auth token
385
+ genAI = new GoogleGenAI({
386
+ apiKey: authToken,
387
+ vertexai: this.hasVertexAICredentials(),
388
+ httpOptions: this.baseURL
389
+ ? {
390
+ ...httpOptions,
391
+ baseUrl: this.baseURL,
392
+ }
393
+ : httpOptions,
394
+ });
382
395
  break;
383
396
  default:
384
397
  throw new Error(`Unsupported auth mode: ${this.authMode}`);
@@ -399,15 +412,15 @@ export class GeminiProvider {
399
412
  // Use explicit model if set, otherwise fall back to config model
400
413
  const modelToUse = this.modelExplicitlySet
401
414
  ? this.currentModel
402
- : this.config?.getModel() || this.currentModel;
415
+ : this.geminiConfig?.getModel() || this.currentModel;
403
416
  // For Flash models, always include tools if available
404
417
  if (modelToUse.includes('flash') && !geminiTools && this.toolSchemas) {
405
418
  geminiTools = this.toolSchemas;
406
419
  }
407
420
  // Generate systemInstruction using getCoreSystemPrompt
408
421
  // Get user memory from config if available
409
- const userMemory = this.config?.getUserMemory
410
- ? this.config.getUserMemory()
422
+ const userMemory = this.geminiConfig?.getUserMemory
423
+ ? this.geminiConfig.getUserMemory()
411
424
  : '';
412
425
  const systemInstruction = await getCoreSystemPromptAsync(userMemory, modelToUse);
413
426
  const request = {
@@ -696,13 +709,12 @@ export class GeminiProvider {
696
709
  return result;
697
710
  }
698
711
  setApiKey(apiKey) {
699
- this.apiKey = apiKey;
712
+ // Call base provider implementation
713
+ super.setApiKey?.(apiKey);
700
714
  // Set the API key as an environment variable so it can be used by the core library
701
715
  process.env.GEMINI_API_KEY = apiKey;
702
716
  // Clear auth cache when API key changes
703
717
  this.authDetermined = false;
704
- // Re-determine auth after API key is set
705
- this.determineBestAuth();
706
718
  }
707
719
  setBaseUrl(baseUrl) {
708
720
  // If no baseUrl is provided or it's an empty string, clear to undefined
@@ -733,18 +745,49 @@ export class GeminiProvider {
733
745
  * Gets the current model ID
734
746
  */
735
747
  getCurrentModel() {
736
- return this.currentModel;
748
+ // Try to get from SettingsService first (source of truth)
749
+ try {
750
+ const settingsService = getSettingsService();
751
+ const providerSettings = settingsService.getProviderSettings(this.name);
752
+ if (providerSettings.model) {
753
+ return providerSettings.model;
754
+ }
755
+ }
756
+ catch (error) {
757
+ if (process.env.DEBUG) {
758
+ console.warn('Failed to get model from SettingsService:', error);
759
+ }
760
+ }
761
+ // Fall back to cached value or default
762
+ return this.currentModel || this.getDefaultModel();
763
+ }
764
+ /**
765
+ * Gets the default model for Gemini
766
+ */
767
+ getDefaultModel() {
768
+ return 'gemini-2.5-pro';
737
769
  }
738
770
  /**
739
771
  * Sets the current model ID
740
772
  */
741
773
  setModel(modelId) {
774
+ // Update SettingsService as the source of truth
775
+ try {
776
+ const settingsService = getSettingsService();
777
+ settingsService.setProviderSetting(this.name, 'model', modelId);
778
+ }
779
+ catch (error) {
780
+ if (process.env.DEBUG) {
781
+ console.warn('Failed to persist model to SettingsService:', error);
782
+ }
783
+ }
784
+ // Keep local cache for performance
742
785
  this.currentModel = modelId;
743
786
  this.modelExplicitlySet = true;
744
787
  // Always update config if available, not just in OAuth mode
745
788
  // This ensures the model is properly synchronized
746
- if (this.config) {
747
- this.config.setModel(modelId);
789
+ if (this.geminiConfig) {
790
+ this.geminiConfig.setModel(modelId);
748
791
  }
749
792
  }
750
793
  /**
@@ -811,13 +854,12 @@ export class GeminiProvider {
811
854
  },
812
855
  };
813
856
  let genAI;
857
+ // Get authentication token lazily
858
+ const authToken = await this.determineBestAuth();
814
859
  switch (this.authMode) {
815
860
  case 'gemini-api-key': {
816
- if (!this.apiKey && !process.env.GEMINI_API_KEY) {
817
- throw new Error('Gemini API key required for web search');
818
- }
819
861
  genAI = new GoogleGenAI({
820
- apiKey: this.apiKey || process.env.GEMINI_API_KEY,
862
+ apiKey: authToken,
821
863
  httpOptions: this.baseURL
822
864
  ? {
823
865
  ...httpOptions,
@@ -843,11 +885,8 @@ export class GeminiProvider {
843
885
  return apiKeyResult;
844
886
  }
845
887
  case 'vertex-ai': {
846
- if (!process.env.GOOGLE_API_KEY) {
847
- throw new Error('Google API key required for web search');
848
- }
849
888
  genAI = new GoogleGenAI({
850
- apiKey: process.env.GOOGLE_API_KEY,
889
+ apiKey: authToken,
851
890
  vertexai: true,
852
891
  httpOptions: this.baseURL
853
892
  ? {
@@ -875,7 +914,7 @@ export class GeminiProvider {
875
914
  }
876
915
  case 'oauth': {
877
916
  // For OAuth, use the code assist content generator
878
- const oauthContentGenerator = await createCodeAssistContentGenerator(httpOptions, AuthType.LOGIN_WITH_GOOGLE, this.config);
917
+ const oauthContentGenerator = await createCodeAssistContentGenerator(httpOptions, AuthType.LOGIN_WITH_GOOGLE, this.geminiConfig);
879
918
  // For web search, always use gemini-2.5-flash regardless of the active model
880
919
  const oauthRequest = {
881
920
  model: 'gemini-2.5-flash',
@@ -889,7 +928,7 @@ export class GeminiProvider {
889
928
  tools: [{ googleSearch: {} }],
890
929
  },
891
930
  };
892
- const result = await oauthContentGenerator.generateContent(oauthRequest, this.config?.getSessionId() || 'default');
931
+ const result = await oauthContentGenerator.generateContent(oauthRequest, this.geminiConfig?.getSessionId() || 'default');
893
932
  return result;
894
933
  }
895
934
  default:
@@ -908,13 +947,12 @@ export class GeminiProvider {
908
947
  },
909
948
  };
910
949
  let genAI;
950
+ // Get authentication token lazily
951
+ const authToken = await this.determineBestAuth();
911
952
  switch (this.authMode) {
912
953
  case 'gemini-api-key': {
913
- if (!this.apiKey && !process.env.GEMINI_API_KEY) {
914
- throw new Error('Gemini API key required for web fetch');
915
- }
916
954
  genAI = new GoogleGenAI({
917
- apiKey: this.apiKey || process.env.GEMINI_API_KEY,
955
+ apiKey: authToken,
918
956
  httpOptions: this.baseURL
919
957
  ? {
920
958
  ...httpOptions,
@@ -940,11 +978,8 @@ export class GeminiProvider {
940
978
  return apiKeyResult;
941
979
  }
942
980
  case 'vertex-ai': {
943
- if (!process.env.GOOGLE_API_KEY) {
944
- throw new Error('Google API key required for web fetch');
945
- }
946
981
  genAI = new GoogleGenAI({
947
- apiKey: process.env.GOOGLE_API_KEY,
982
+ apiKey: authToken,
948
983
  vertexai: true,
949
984
  httpOptions: this.baseURL
950
985
  ? {
@@ -972,7 +1007,7 @@ export class GeminiProvider {
972
1007
  }
973
1008
  case 'oauth': {
974
1009
  // For OAuth, use the code assist content generator
975
- const oauthContentGenerator = await createCodeAssistContentGenerator(httpOptions, AuthType.LOGIN_WITH_GOOGLE, this.config);
1010
+ const oauthContentGenerator = await createCodeAssistContentGenerator(httpOptions, AuthType.LOGIN_WITH_GOOGLE, this.geminiConfig);
976
1011
  // For web fetch, always use gemini-2.5-flash regardless of the active model
977
1012
  const oauthRequest = {
978
1013
  model: 'gemini-2.5-flash',
@@ -986,7 +1021,7 @@ export class GeminiProvider {
986
1021
  tools: [{ urlContext: {} }],
987
1022
  },
988
1023
  };
989
- const result = await oauthContentGenerator.generateContent(oauthRequest, this.config?.getSessionId() || 'default');
1024
+ const result = await oauthContentGenerator.generateContent(oauthRequest, this.geminiConfig?.getSessionId() || 'default');
990
1025
  return result;
991
1026
  }
992
1027
  default: