@vybestack/llxprt-code 0.1.12 → 0.1.13-nightly.250727.2261021c

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 (246) hide show
  1. package/dist/index.js +0 -0
  2. package/dist/package.json +5 -5
  3. package/dist/src/acp/acp.d.ts +208 -0
  4. package/dist/src/acp/acp.js +193 -0
  5. package/dist/src/acp/acp.js.map +1 -0
  6. package/dist/src/acp/acpPeer.d.ts +8 -0
  7. package/dist/src/acp/acpPeer.js +537 -0
  8. package/dist/src/acp/acpPeer.js.map +1 -0
  9. package/dist/src/config/config.d.ts +2 -0
  10. package/dist/src/config/config.js +73 -19
  11. package/dist/src/config/config.js.map +1 -1
  12. package/dist/src/config/extension.d.ts +2 -2
  13. package/dist/src/config/extension.js +21 -16
  14. package/dist/src/config/extension.js.map +1 -1
  15. package/dist/src/config/settings.d.ts +7 -0
  16. package/dist/src/config/settings.js +15 -0
  17. package/dist/src/config/settings.js.map +1 -1
  18. package/dist/src/gemini.js +33 -34
  19. package/dist/src/gemini.js.map +1 -1
  20. package/dist/src/generated/git-commit.d.ts +1 -1
  21. package/dist/src/generated/git-commit.js +1 -1
  22. package/dist/src/nonInteractiveCli.js +36 -3
  23. package/dist/src/nonInteractiveCli.js.map +1 -1
  24. package/dist/src/providers/index.d.ts +1 -7
  25. package/dist/src/providers/index.js +2 -10
  26. package/dist/src/providers/index.js.map +1 -1
  27. package/dist/src/providers/providerConfigUtils.d.ts +1 -2
  28. package/dist/src/providers/providerConfigUtils.js +1 -1
  29. package/dist/src/providers/providerConfigUtils.js.map +1 -1
  30. package/dist/src/providers/providerManagerInstance.d.ts +2 -2
  31. package/dist/src/providers/providerManagerInstance.js +21 -19
  32. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  33. package/dist/src/providers/types.d.ts +1 -9
  34. package/dist/src/providers/types.js +2 -10
  35. package/dist/src/providers/types.js.map +1 -1
  36. package/dist/src/services/CommandService.d.ts +3 -1
  37. package/dist/src/services/CommandService.js +50 -11
  38. package/dist/src/services/CommandService.js.map +1 -1
  39. package/dist/src/ui/App.js +24 -25
  40. package/dist/src/ui/App.js.map +1 -1
  41. package/dist/src/ui/commands/aboutCommand.js +21 -0
  42. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  43. package/dist/src/ui/commands/baseurlCommand.d.ts +7 -0
  44. package/dist/src/ui/commands/baseurlCommand.js +22 -0
  45. package/dist/src/ui/commands/baseurlCommand.js.map +1 -0
  46. package/dist/src/ui/commands/bugCommand.d.ts +7 -0
  47. package/dist/src/ui/commands/bugCommand.js +61 -0
  48. package/dist/src/ui/commands/bugCommand.js.map +1 -0
  49. package/dist/src/ui/commands/chatCommand.d.ts +7 -0
  50. package/dist/src/ui/commands/chatCommand.js +170 -0
  51. package/dist/src/ui/commands/chatCommand.js.map +1 -0
  52. package/dist/src/ui/commands/clearCommand.js +12 -2
  53. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  54. package/dist/src/ui/commands/compressCommand.d.ts +7 -0
  55. package/dist/src/ui/commands/compressCommand.js +62 -0
  56. package/dist/src/ui/commands/compressCommand.js.map +1 -0
  57. package/dist/src/ui/commands/docsCommand.d.ts +7 -0
  58. package/dist/src/ui/commands/docsCommand.js +29 -0
  59. package/dist/src/ui/commands/docsCommand.js.map +1 -0
  60. package/dist/src/ui/commands/editorCommand.d.ts +7 -0
  61. package/dist/src/ui/commands/editorCommand.js +14 -0
  62. package/dist/src/ui/commands/editorCommand.js.map +1 -0
  63. package/dist/src/ui/commands/extensionsCommand.d.ts +7 -0
  64. package/dist/src/ui/commands/extensionsCommand.js +29 -0
  65. package/dist/src/ui/commands/extensionsCommand.js.map +1 -0
  66. package/dist/src/ui/commands/ideCommand.d.ts +8 -0
  67. package/dist/src/ui/commands/ideCommand.js +123 -0
  68. package/dist/src/ui/commands/ideCommand.js.map +1 -0
  69. package/dist/src/{providers/ProviderAwareContentGenerator.d.ts → ui/commands/keyCommand.d.ts} +2 -1
  70. package/dist/src/ui/commands/keyCommand.js +29 -0
  71. package/dist/src/ui/commands/keyCommand.js.map +1 -0
  72. package/dist/src/ui/commands/keyfileCommand.d.ts +7 -0
  73. package/dist/src/ui/commands/keyfileCommand.js +104 -0
  74. package/dist/src/ui/commands/keyfileCommand.js.map +1 -0
  75. package/dist/src/ui/commands/mcpCommand.d.ts +7 -0
  76. package/dist/src/ui/commands/mcpCommand.js +204 -0
  77. package/dist/src/ui/commands/mcpCommand.js.map +1 -0
  78. package/dist/src/ui/commands/modelCommand.d.ts +7 -0
  79. package/dist/src/ui/commands/modelCommand.js +60 -0
  80. package/dist/src/ui/commands/modelCommand.js.map +1 -0
  81. package/dist/src/ui/commands/providerCommand.d.ts +7 -0
  82. package/dist/src/ui/commands/providerCommand.js +86 -0
  83. package/dist/src/ui/commands/providerCommand.js.map +1 -0
  84. package/dist/src/ui/commands/quitCommand.d.ts +7 -0
  85. package/dist/src/ui/commands/quitCommand.js +32 -0
  86. package/dist/src/ui/commands/quitCommand.js.map +1 -0
  87. package/dist/src/ui/commands/restoreCommand.d.ts +8 -0
  88. package/dist/src/ui/commands/restoreCommand.js +126 -0
  89. package/dist/src/ui/commands/restoreCommand.js.map +1 -0
  90. package/dist/src/ui/commands/statsCommand.d.ts +7 -0
  91. package/dist/src/ui/commands/statsCommand.js +50 -0
  92. package/dist/src/ui/commands/statsCommand.js.map +1 -0
  93. package/dist/src/ui/commands/toolsCommand.d.ts +7 -0
  94. package/dist/src/ui/commands/toolsCommand.js +54 -0
  95. package/dist/src/ui/commands/toolsCommand.js.map +1 -0
  96. package/dist/src/ui/commands/types.d.ts +34 -2
  97. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +6 -1
  98. package/dist/src/ui/components/ContextSummaryDisplay.js +46 -19
  99. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  100. package/dist/src/ui/components/Footer.d.ts +0 -1
  101. package/dist/src/ui/components/Footer.js +3 -21
  102. package/dist/src/ui/components/Footer.js.map +1 -1
  103. package/dist/src/ui/components/InputPrompt.js +110 -61
  104. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  105. package/dist/src/ui/components/ProviderModelDialog.d.ts +1 -1
  106. package/dist/src/ui/components/ThemeDialog.js +25 -24
  107. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  108. package/dist/src/ui/components/messages/ToolGroupMessage.js +3 -1
  109. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  110. package/dist/src/ui/components/shared/MaxSizedBox.js +69 -2
  111. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  112. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +3 -1
  113. package/dist/src/ui/components/shared/RadioButtonSelect.js +60 -10
  114. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  115. package/dist/src/ui/components/shared/text-buffer.js +1 -1
  116. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  117. package/dist/src/ui/constants.d.ts +1 -0
  118. package/dist/src/ui/constants.js +1 -0
  119. package/dist/src/ui/constants.js.map +1 -1
  120. package/dist/src/ui/containers/SessionController.js +1 -1
  121. package/dist/src/ui/containers/SessionController.js.map +1 -1
  122. package/dist/src/ui/contexts/OpenAIProviderContext.d.ts +1 -2
  123. package/dist/src/ui/contexts/OpenAIProviderContext.js.map +1 -1
  124. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -1
  125. package/dist/src/ui/hooks/shellCommandProcessor.js +35 -11
  126. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  127. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -9
  128. package/dist/src/ui/hooks/slashCommandProcessor.js +83 -622
  129. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  130. package/dist/src/ui/hooks/useAuthCommand.js +16 -2
  131. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  132. package/dist/src/ui/hooks/useCompletion.d.ts +1 -0
  133. package/dist/src/ui/hooks/useCompletion.js +21 -2
  134. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  135. package/dist/src/ui/hooks/useFocus.d.ts +6 -0
  136. package/dist/src/ui/hooks/useFocus.js +41 -0
  137. package/dist/src/ui/hooks/useFocus.js.map +1 -0
  138. package/dist/src/ui/hooks/useGeminiStream.js +34 -2
  139. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  140. package/dist/src/ui/hooks/useOpenAIProviderInfo.d.ts +3 -2
  141. package/dist/src/ui/hooks/useOpenAIProviderInfo.js +5 -4
  142. package/dist/src/ui/hooks/useOpenAIProviderInfo.js.map +1 -1
  143. package/dist/src/ui/hooks/usePrivacySettings.js +5 -5
  144. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  145. package/dist/src/ui/hooks/useProviderDialog.d.ts +5 -2
  146. package/dist/src/ui/hooks/useProviderDialog.js +55 -3
  147. package/dist/src/ui/hooks/useProviderDialog.js.map +1 -1
  148. package/dist/src/ui/hooks/useProviderModelDialog.d.ts +1 -1
  149. package/dist/src/ui/themes/ansi-light.js +1 -1
  150. package/dist/src/ui/themes/ansi-light.js.map +1 -1
  151. package/dist/src/ui/themes/googlecode.js +1 -1
  152. package/dist/src/ui/themes/googlecode.js.map +1 -1
  153. package/dist/src/ui/themes/xcode.js +1 -1
  154. package/dist/src/ui/themes/xcode.js.map +1 -1
  155. package/dist/src/ui/types.d.ts +10 -0
  156. package/dist/src/ui/types.js.map +1 -1
  157. package/dist/src/ui/utils/updateCheck.js +10 -6
  158. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  159. package/dist/src/utils/userStartupWarnings.js +1 -16
  160. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  161. package/dist/tsconfig.tsbuildinfo +1 -1
  162. package/package.json +5 -5
  163. package/dist/src/providers/IMessage.d.ts +0 -38
  164. package/dist/src/providers/IMessage.js +0 -17
  165. package/dist/src/providers/IMessage.js.map +0 -1
  166. package/dist/src/providers/IModel.d.ts +0 -23
  167. package/dist/src/providers/IModel.js +0 -17
  168. package/dist/src/providers/IModel.js.map +0 -1
  169. package/dist/src/providers/IProvider.d.ts +0 -32
  170. package/dist/src/providers/IProvider.js +0 -17
  171. package/dist/src/providers/IProvider.js.map +0 -1
  172. package/dist/src/providers/ITool.d.ts +0 -23
  173. package/dist/src/providers/ITool.js +0 -17
  174. package/dist/src/providers/ITool.js.map +0 -1
  175. package/dist/src/providers/ProviderAwareContentGenerator.js +0 -9
  176. package/dist/src/providers/ProviderAwareContentGenerator.js.map +0 -1
  177. package/dist/src/providers/ProviderManager.d.ts +0 -19
  178. package/dist/src/providers/ProviderManager.js +0 -63
  179. package/dist/src/providers/ProviderManager.js.map +0 -1
  180. package/dist/src/providers/ProviderManagerAdapter.d.ts +0 -17
  181. package/dist/src/providers/ProviderManagerAdapter.js +0 -113
  182. package/dist/src/providers/ProviderManagerAdapter.js.map +0 -1
  183. package/dist/src/providers/README-qwen3.md +0 -60
  184. package/dist/src/providers/adapters/IStreamAdapter.d.ts +0 -18
  185. package/dist/src/providers/adapters/IStreamAdapter.js +0 -7
  186. package/dist/src/providers/adapters/IStreamAdapter.js.map +0 -1
  187. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +0 -46
  188. package/dist/src/providers/anthropic/AnthropicProvider.js +0 -478
  189. package/dist/src/providers/anthropic/AnthropicProvider.js.map +0 -1
  190. package/dist/src/providers/contentGeneratorProvider.d.ts +0 -13
  191. package/dist/src/providers/contentGeneratorProvider.js +0 -17
  192. package/dist/src/providers/contentGeneratorProvider.js.map +0 -1
  193. package/dist/src/providers/gemini/GeminiProvider.d.ts +0 -72
  194. package/dist/src/providers/gemini/GeminiProvider.js +0 -454
  195. package/dist/src/providers/gemini/GeminiProvider.js.map +0 -1
  196. package/dist/src/providers/integration/TEST_INSTRUCTIONS.md +0 -197
  197. package/dist/src/providers/openai/ConversationCache.d.ts +0 -20
  198. package/dist/src/providers/openai/ConversationCache.js +0 -109
  199. package/dist/src/providers/openai/ConversationCache.js.map +0 -1
  200. package/dist/src/providers/openai/IChatGenerateParams.d.ts +0 -11
  201. package/dist/src/providers/openai/IChatGenerateParams.js +0 -2
  202. package/dist/src/providers/openai/IChatGenerateParams.js.map +0 -1
  203. package/dist/src/providers/openai/OpenAIProvider.d.ts +0 -71
  204. package/dist/src/providers/openai/OpenAIProvider.js +0 -486
  205. package/dist/src/providers/openai/OpenAIProvider.js.map +0 -1
  206. package/dist/src/providers/openai/Qwen3FireworksProvider.d.ts +0 -39
  207. package/dist/src/providers/openai/Qwen3FireworksProvider.js +0 -209
  208. package/dist/src/providers/openai/Qwen3FireworksProvider.js.map +0 -1
  209. package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +0 -2
  210. package/dist/src/providers/openai/RESPONSES_API_MODELS.js +0 -14
  211. package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +0 -1
  212. package/dist/src/providers/openai/buildResponsesRequest.d.ts +0 -67
  213. package/dist/src/providers/openai/buildResponsesRequest.js +0 -144
  214. package/dist/src/providers/openai/buildResponsesRequest.js.map +0 -1
  215. package/dist/src/providers/openai/docs/accessing-provider-info.md +0 -172
  216. package/dist/src/providers/openai/docs/params-mapping.md +0 -91
  217. package/dist/src/providers/openai/docs/qwen3-fireworks.md +0 -47
  218. package/dist/src/providers/openai/docs/responses-api-tool-calls.md +0 -96
  219. package/dist/src/providers/openai/estimateRemoteTokens.d.ts +0 -26
  220. package/dist/src/providers/openai/estimateRemoteTokens.js +0 -75
  221. package/dist/src/providers/openai/estimateRemoteTokens.js.map +0 -1
  222. package/dist/src/providers/openai/getOpenAIProviderInfo.d.ts +0 -46
  223. package/dist/src/providers/openai/getOpenAIProviderInfo.js +0 -74
  224. package/dist/src/providers/openai/getOpenAIProviderInfo.js.map +0 -1
  225. package/dist/src/providers/openai/parseResponsesStream.d.ts +0 -3
  226. package/dist/src/providers/openai/parseResponsesStream.js +0 -444
  227. package/dist/src/providers/openai/parseResponsesStream.js.map +0 -1
  228. package/dist/src/providers/parsers/TextToolCallParser.d.ts +0 -35
  229. package/dist/src/providers/parsers/TextToolCallParser.js +0 -248
  230. package/dist/src/providers/parsers/TextToolCallParser.js.map +0 -1
  231. package/dist/src/providers/tokenizers/AnthropicTokenizer.d.ts +0 -19
  232. package/dist/src/providers/tokenizers/AnthropicTokenizer.js +0 -37
  233. package/dist/src/providers/tokenizers/AnthropicTokenizer.js.map +0 -1
  234. package/dist/src/providers/tokenizers/ITokenizer.d.ts +0 -18
  235. package/dist/src/providers/tokenizers/ITokenizer.js +0 -17
  236. package/dist/src/providers/tokenizers/ITokenizer.js.map +0 -1
  237. package/dist/src/providers/tokenizers/OpenAITokenizer.d.ts +0 -24
  238. package/dist/src/providers/tokenizers/OpenAITokenizer.js +0 -56
  239. package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +0 -1
  240. package/dist/src/tools/IToolFormatter.d.ts +0 -40
  241. package/dist/src/tools/IToolFormatter.js +0 -17
  242. package/dist/src/tools/IToolFormatter.js.map +0 -1
  243. package/dist/src/tools/ToolFormatter.d.ts +0 -45
  244. package/dist/src/tools/ToolFormatter.js +0 -216
  245. package/dist/src/tools/ToolFormatter.js.map +0 -1
  246. package/dist/vybestack-llxprt-code-0.1.12.tgz +0 -0
@@ -1,454 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Vybestack LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { AuthType } from '@vybestack/llxprt-code-core';
7
- import { ContentGeneratorRole } from '../types.js';
8
- export class GeminiProvider {
9
- name = 'gemini';
10
- isDefault = true;
11
- apiKey;
12
- authMode = 'none';
13
- config;
14
- currentModel = 'gemini-2.5-pro';
15
- constructor() {
16
- // Do not determine auth mode on instantiation.
17
- // This will be done lazily when a chat completion is requested.
18
- }
19
- /**
20
- * Determines the best available authentication method based on environment variables
21
- * and existing configuration. Follows the hierarchy: Vertex AI → Gemini API key → OAuth
22
- */
23
- determineBestAuth() {
24
- // Check if user explicitly selected USE_NONE via the content generator config
25
- const authType = this.config?.getContentGeneratorConfig()?.authType;
26
- if (authType === AuthType.USE_NONE) {
27
- this.authMode = 'none';
28
- return;
29
- }
30
- // Check for Vertex AI credentials first
31
- if (this.hasVertexAICredentials()) {
32
- this.authMode = 'vertex-ai';
33
- this.setupVertexAIAuth();
34
- }
35
- // Check for Gemini API key second
36
- else if (this.hasGeminiAPIKey()) {
37
- this.authMode = 'gemini-api-key';
38
- // API key is already in environment, no additional setup needed
39
- }
40
- // Fall back to OAuth (will prompt user if needed)
41
- else {
42
- this.authMode = 'oauth';
43
- // OAuth will be handled by the existing auth system
44
- }
45
- }
46
- /**
47
- * Checks if Vertex AI credentials are available
48
- */
49
- hasVertexAICredentials() {
50
- const hasProjectAndLocation = !!process.env.GOOGLE_CLOUD_PROJECT && !!process.env.GOOGLE_CLOUD_LOCATION;
51
- const hasGoogleApiKey = !!process.env.GOOGLE_API_KEY;
52
- return hasProjectAndLocation || hasGoogleApiKey;
53
- }
54
- /**
55
- * Checks if Gemini API key is available
56
- */
57
- hasGeminiAPIKey() {
58
- return !!this.apiKey || !!process.env.GEMINI_API_KEY;
59
- }
60
- /**
61
- * Sets up environment variables for Vertex AI authentication
62
- */
63
- setupVertexAIAuth() {
64
- process.env.GOOGLE_GENAI_USE_VERTEXAI = 'true';
65
- // Other Vertex AI env vars are already set, no need to duplicate
66
- }
67
- /**
68
- * Sets the config instance for reading OAuth credentials
69
- */
70
- setConfig(config) {
71
- this.config = config;
72
- // Re-determine auth after config is set
73
- this.determineBestAuth();
74
- }
75
- async getModels() {
76
- // For OAuth mode, return fixed list of models
77
- if (this.authMode === 'oauth') {
78
- return [
79
- {
80
- id: 'gemini-2.5-pro',
81
- name: 'Gemini 2.5 Pro',
82
- provider: this.name,
83
- supportedToolFormats: [],
84
- },
85
- {
86
- id: 'gemini-2.5-flash',
87
- name: 'Gemini 2.5 Flash',
88
- provider: this.name,
89
- supportedToolFormats: [],
90
- },
91
- ];
92
- }
93
- // For API key modes (gemini-api-key or vertex-ai), try to fetch real models
94
- if (this.authMode === 'gemini-api-key' || this.authMode === 'vertex-ai') {
95
- const apiKey = this.apiKey || process.env.GEMINI_API_KEY;
96
- if (apiKey) {
97
- try {
98
- const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`, {
99
- method: 'GET',
100
- headers: {
101
- 'Content-Type': 'application/json',
102
- },
103
- });
104
- if (response.ok) {
105
- const data = (await response.json());
106
- if (data.models && data.models.length > 0) {
107
- return data.models.map((model) => ({
108
- id: model.name.replace('models/', ''), // Remove 'models/' prefix
109
- name: model.displayName || model.name,
110
- provider: this.name,
111
- supportedToolFormats: [],
112
- }));
113
- }
114
- }
115
- }
116
- catch (_error) {
117
- // Fall through to default models
118
- }
119
- }
120
- }
121
- // Return default models as fallback
122
- return [
123
- {
124
- id: 'gemini-2.5-pro',
125
- name: 'Gemini 2.5 Pro',
126
- provider: this.name,
127
- supportedToolFormats: [],
128
- },
129
- {
130
- id: 'gemini-2.5-flash',
131
- name: 'Gemini 2.5 Flash',
132
- provider: this.name,
133
- supportedToolFormats: [],
134
- },
135
- ];
136
- }
137
- async *generateChatCompletion(messages, tools, _toolFormat) {
138
- // Lazily determine the best auth method now that it's needed.
139
- this.determineBestAuth();
140
- // Import the necessary modules dynamically to avoid circular dependencies
141
- const { GoogleGenAI } = await import('@google/genai');
142
- // Create the appropriate client based on auth mode
143
- let genAI;
144
- const httpOptions = {
145
- headers: {
146
- 'User-Agent': `GeminiCLI/${process.env.CLI_VERSION || process.version} (${process.platform}; ${process.arch})`,
147
- },
148
- };
149
- switch (this.authMode) {
150
- case 'gemini-api-key':
151
- if (!this.apiKey && !process.env.GEMINI_API_KEY) {
152
- throw new Error('Gemini API key required but not found');
153
- }
154
- genAI = new GoogleGenAI({
155
- apiKey: this.apiKey || process.env.GEMINI_API_KEY,
156
- httpOptions,
157
- });
158
- break;
159
- case 'vertex-ai':
160
- if (!process.env.GOOGLE_API_KEY) {
161
- throw new Error('Google API key required for Vertex AI');
162
- }
163
- genAI = new GoogleGenAI({
164
- apiKey: process.env.GOOGLE_API_KEY,
165
- vertexai: true,
166
- httpOptions,
167
- });
168
- break;
169
- case 'oauth': {
170
- // For OAuth, we need to use the code assist server
171
- const { createCodeAssistContentGenerator } = await import('@vybestack/llxprt-code-core');
172
- const contentGenerator = await createCodeAssistContentGenerator(httpOptions, AuthType.LOGIN_WITH_GOOGLE, this.config);
173
- // Convert messages to Gemini request format
174
- const request = {
175
- model: this.currentModel,
176
- contents: this.convertMessagesToGeminiFormat(messages),
177
- config: {
178
- tools: tools ? this.convertToolsToGeminiFormat(tools) : undefined,
179
- },
180
- };
181
- // Use the content generator stream
182
- const streamResult = await contentGenerator.generateContentStream(request);
183
- // Convert the stream to our format
184
- for await (const response of streamResult) {
185
- // Extract text from the response
186
- const text = response.candidates?.[0]?.content?.parts
187
- ?.filter((part) => 'text' in part)
188
- ?.map((part) => part.text)
189
- ?.join('') || '';
190
- // Extract function calls from the response
191
- const functionCalls = response.candidates?.[0]?.content?.parts
192
- ?.filter((part) => 'functionCall' in part)
193
- ?.map((part) => part.functionCall) || [];
194
- // Build response message
195
- const message = {
196
- role: ContentGeneratorRole.ASSISTANT,
197
- content: text,
198
- };
199
- // Add function calls if any
200
- if (functionCalls && functionCalls.length > 0) {
201
- message.tool_calls = functionCalls.map((call) => ({
202
- id: call.id ||
203
- `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
204
- type: 'function',
205
- function: {
206
- name: call.name || 'unknown_function',
207
- arguments: JSON.stringify(call.args || {}),
208
- },
209
- }));
210
- }
211
- // Only yield if there's content or tool calls
212
- if (text || (functionCalls && functionCalls.length > 0)) {
213
- yield message;
214
- }
215
- }
216
- return;
217
- }
218
- case 'none':
219
- // For 'none' mode, check what credentials are available
220
- if (this.hasGeminiAPIKey()) {
221
- genAI = new GoogleGenAI({
222
- apiKey: this.apiKey || process.env.GEMINI_API_KEY,
223
- httpOptions,
224
- });
225
- }
226
- else if (this.hasVertexAICredentials()) {
227
- this.setupVertexAIAuth();
228
- genAI = new GoogleGenAI({
229
- apiKey: process.env.GOOGLE_API_KEY,
230
- vertexai: true,
231
- httpOptions,
232
- });
233
- }
234
- else {
235
- throw new Error('No authentication credentials found. Please use /auth to login with Google OAuth, set GEMINI_API_KEY, or configure Vertex AI credentials.');
236
- }
237
- break;
238
- default:
239
- throw new Error(`Unsupported auth mode: ${this.authMode}`);
240
- }
241
- // Get the models interface (which is a ContentGenerator)
242
- const contentGenerator = genAI.models;
243
- // Convert IMessage[] to Gemini format
244
- const contents = this.convertMessagesToGeminiFormat(messages);
245
- // Convert ITool[] to Gemini tool format
246
- const geminiTools = tools
247
- ? this.convertToolsToGeminiFormat(tools)
248
- : undefined;
249
- // Create the request - ContentGenerator expects model in the request
250
- const request = {
251
- model: this.currentModel,
252
- contents,
253
- config: {
254
- tools: geminiTools,
255
- },
256
- };
257
- // Generate content stream using the ContentGenerator interface
258
- const stream = await contentGenerator.generateContentStream(request);
259
- // Stream the response
260
- for await (const response of stream) {
261
- // Extract text from the response
262
- const text = response.candidates?.[0]?.content?.parts
263
- ?.filter((part) => 'text' in part)
264
- ?.map((part) => part.text)
265
- ?.join('') || '';
266
- // Extract function calls from the response
267
- const functionCalls = response.candidates?.[0]?.content?.parts
268
- ?.filter((part) => 'functionCall' in part)
269
- ?.map((part) => part.functionCall) || [];
270
- // Build response message
271
- const message = {
272
- role: ContentGeneratorRole.ASSISTANT,
273
- content: text || '',
274
- };
275
- // Add function calls if any
276
- if (functionCalls && functionCalls.length > 0) {
277
- message.tool_calls = functionCalls.map((call) => ({
278
- id: call.id ||
279
- `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
280
- type: 'function',
281
- function: {
282
- name: call.name || 'unknown_function',
283
- arguments: JSON.stringify(call.args || {}),
284
- },
285
- }));
286
- }
287
- // Only yield if there's content or tool calls
288
- if (text || (functionCalls && functionCalls.length > 0)) {
289
- yield message;
290
- }
291
- }
292
- }
293
- convertMessagesToGeminiFormat(messages) {
294
- const contents = [];
295
- let currentToolResponses = [];
296
- for (let i = 0; i < messages.length; i++) {
297
- const msg = messages[i];
298
- // Handle tool responses - group consecutive ones together
299
- if (msg.role === ContentGeneratorRole.TOOL && msg.tool_call_id) {
300
- currentToolResponses.push({
301
- functionResponse: {
302
- id: msg.tool_call_id,
303
- name: msg.tool_name || 'unknown_function',
304
- response: {
305
- output: msg.content,
306
- },
307
- },
308
- });
309
- // Check if next message is also a tool response
310
- const isLastMessage = i === messages.length - 1;
311
- const nextIsNotTool = isLastMessage || messages[i + 1].role !== ContentGeneratorRole.TOOL;
312
- if (nextIsNotTool && currentToolResponses.length > 0) {
313
- // Flush accumulated tool responses as a single Content
314
- contents.push({
315
- role: 'user',
316
- parts: currentToolResponses,
317
- });
318
- currentToolResponses = [];
319
- }
320
- continue;
321
- }
322
- // For non-tool messages, convert normally
323
- const parts = [];
324
- // Check for parts first (for messages with PDF/image parts but no text content)
325
- if (msg.parts && msg.parts.length > 0) {
326
- parts.push(...msg.parts);
327
- }
328
- else if (msg.content) {
329
- // Handle PartListUnion: string | Part | Part[]
330
- // In practice, content can be PartListUnion even though IMessage types it as string
331
- const content = msg.content;
332
- if (typeof content === 'string') {
333
- // Try to parse string in case it's a stringified Part or Part[]
334
- if ((content.startsWith('{') && content.endsWith('}')) ||
335
- (content.startsWith('[') && content.endsWith(']'))) {
336
- try {
337
- const parsed = JSON.parse(content);
338
- if (Array.isArray(parsed)) {
339
- parts.push(...parsed);
340
- }
341
- else {
342
- parts.push(parsed);
343
- }
344
- }
345
- catch (_e) {
346
- // Not valid JSON, treat as text
347
- parts.push({ text: content });
348
- }
349
- }
350
- else {
351
- parts.push({ text: content });
352
- }
353
- }
354
- else if (Array.isArray(content)) {
355
- // Content is Part[]
356
- parts.push(...content);
357
- }
358
- else {
359
- // Content is a single Part
360
- parts.push(content);
361
- }
362
- }
363
- // Handle tool calls
364
- if (msg.tool_calls && msg.tool_calls.length > 0) {
365
- for (const toolCall of msg.tool_calls) {
366
- parts.push({
367
- functionCall: {
368
- id: toolCall.id,
369
- name: toolCall.function.name,
370
- args: JSON.parse(toolCall.function.arguments),
371
- },
372
- });
373
- }
374
- }
375
- // Map roles
376
- let role = 'user';
377
- if (msg.role === ContentGeneratorRole.ASSISTANT) {
378
- role = 'model';
379
- }
380
- else if (msg.role === ContentGeneratorRole.USER) {
381
- role = 'user';
382
- }
383
- else if (msg.role === 'system') {
384
- // Gemini doesn't have system role in contents, handle separately
385
- role = 'user';
386
- }
387
- if (parts.length > 0) {
388
- contents.push({
389
- role,
390
- parts,
391
- });
392
- }
393
- }
394
- return contents;
395
- }
396
- convertToolsToGeminiFormat(tools) {
397
- return [
398
- {
399
- functionDeclarations: tools.map((tool) => ({
400
- name: tool.function.name,
401
- description: tool.function.description,
402
- parameters: tool.function.parameters,
403
- })),
404
- },
405
- ];
406
- }
407
- setApiKey(apiKey) {
408
- this.apiKey = apiKey;
409
- // Set the API key as an environment variable so it can be used by the core library
410
- process.env.GEMINI_API_KEY = apiKey;
411
- // Re-determine auth after API key is set
412
- this.determineBestAuth();
413
- }
414
- /**
415
- * Gets the current authentication mode
416
- */
417
- getAuthMode() {
418
- return this.authMode;
419
- }
420
- /**
421
- * Gets the appropriate AuthType for the core library
422
- */
423
- getCoreAuthType() {
424
- switch (this.authMode) {
425
- case 'oauth':
426
- return AuthType.LOGIN_WITH_GOOGLE;
427
- case 'gemini-api-key':
428
- return AuthType.USE_GEMINI;
429
- case 'vertex-ai':
430
- return AuthType.USE_VERTEX_AI;
431
- default:
432
- return AuthType.LOGIN_WITH_GOOGLE; // Default to OAuth
433
- }
434
- }
435
- /**
436
- * Gets the current model ID
437
- */
438
- getCurrentModel() {
439
- return this.currentModel;
440
- }
441
- /**
442
- * Sets the current model ID
443
- */
444
- setModel(modelId) {
445
- this.currentModel = modelId;
446
- }
447
- /**
448
- * Checks if the current auth mode requires payment
449
- */
450
- isPaidMode() {
451
- return this.authMode === 'gemini-api-key' || this.authMode === 'vertex-ai';
452
- }
453
- }
454
- //# sourceMappingURL=GeminiProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GeminiProvider.js","sourceRoot":"","sources":["../../../../src/providers/gemini/GeminiProvider.ts"],"names":[],"mappings":"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"}
@@ -1,197 +0,0 @@
1
- # Multi-Provider Integration Test Instructions
2
-
3
- ## Prerequisites
4
-
5
- 1. Create `~/.openai_key` file with your OpenAI API key:
6
-
7
- ```bash
8
- echo "sk-your-api-key-here" > ~/.openai_key
9
- chmod 600 ~/.openai_key
10
- ```
11
-
12
- 2. Build the project:
13
- ```bash
14
- npm run build
15
- ```
16
-
17
- ## Running Automated Integration Tests
18
-
19
- ```bash
20
- # Run all multi-provider integration tests
21
- npm test -- src/providers/integration/multi-provider.integration.test.ts
22
-
23
- # Run with verbose output
24
- npm test -- src/providers/integration/multi-provider.integration.test.ts --reporter=verbose
25
- ```
26
-
27
- ### Expected Test Output
28
-
29
- When successful, you should see output like:
30
-
31
- ```
32
- ✅ Found 48 OpenAI models
33
- Sample models: gpt-3.5-turbo, gpt-3.5-turbo-0125, gpt-3.5-turbo-1106...
34
-
35
- ✅ GPT-3.5-turbo response: "Hello from OpenAI integration test"
36
-
37
- ✅ Streaming test received 7 chunks
38
- Response: "1
39
- 2
40
- 3
41
- 4
42
- 5"
43
-
44
- ✅ GPT-4 response: "4"
45
-
46
- ✅ Tool call received: get_weather
47
- Arguments: {"location":"San Francisco"}
48
-
49
- ✅ Content generator response: "Hello! How can I help you today?"
50
-
51
- ✅ Correctly caught error for invalid model: The model 'invalid-model-xyz' does not exist
52
- ```
53
-
54
- ## Manual Interactive Testing
55
-
56
- Run the manual test script:
57
-
58
- ```bash
59
- node packages/cli/test-multi-provider.js
60
- ```
61
-
62
- ### Test Scenarios
63
-
64
- 1. **List providers**
65
-
66
- ```
67
- /provider
68
- ```
69
-
70
- Expected: Shows `gemini (active)` and `openai`
71
-
72
- 2. **Switch to OpenAI**
73
-
74
- ```
75
- /provider openai
76
- ```
77
-
78
- Expected: "✅ Switched to openai provider"
79
-
80
- 3. **List available models**
81
-
82
- ```
83
- /models
84
- ```
85
-
86
- Expected: List of OpenAI models (gpt-3.5-turbo, gpt-4, etc.)
87
-
88
- 4. **Send a chat message**
89
-
90
- ```
91
- /chat Hello, how are you?
92
- ```
93
-
94
- Expected: Response from OpenAI
95
-
96
- 5. **Test streaming**
97
-
98
- ```
99
- /stream Tell me a short joke
100
- ```
101
-
102
- Expected: Response streams character by character
103
-
104
- 6. **Switch models**
105
-
106
- ```
107
- /model gpt-4
108
- /chat What model are you?
109
- ```
110
-
111
- Expected: Confirms using GPT-4
112
-
113
- 7. **Switch back to Gemini**
114
-
115
- ```
116
- /provider gemini
117
- ```
118
-
119
- Expected: "✅ Switched to Gemini (default provider)"
120
-
121
- 8. **Error handling**
122
- ```
123
- /provider invalid
124
- /model invalid-model
125
- ```
126
- Expected: Appropriate error messages
127
-
128
- ## Example Session
129
-
130
- ```
131
- 🚀 Multi-Provider Manual Test Script
132
- =====================================
133
-
134
- 📦 Registering OpenAI provider...
135
- ✅ OpenAI provider registered
136
-
137
- Available commands:
138
- /provider - List available providers
139
- /provider <name> - Switch to provider (e.g., /provider openai)
140
- /provider gemini - Switch back to Gemini (default)
141
- /model - Show current model
142
- /model <name> - Switch model (e.g., /model gpt-4)
143
- /models - List available models
144
- /chat <message> - Send a chat message
145
- /stream <message> - Send a message and show streaming
146
- /help - Show this help
147
- /exit - Exit the program
148
-
149
- Ready for testing! Type a command:
150
-
151
- > /provider
152
- Available providers:
153
- gemini (active)
154
- openai
155
-
156
- > /provider openai
157
- ✅ Switched to openai provider
158
-
159
- > /model
160
- Current model: gpt-3.5-turbo
161
-
162
- > /chat Hello!
163
- Sending message...
164
-
165
- Response:
166
- Hello! How can I assist you today?
167
-
168
- > /stream Count to 3
169
- Streaming response...
170
-
171
- 1... 2... 3!
172
-
173
- > /provider gemini
174
- ✅ Switched to Gemini (default provider)
175
-
176
- > /exit
177
- Goodbye! 👋
178
- ```
179
-
180
- ## Troubleshooting
181
-
182
- 1. **"No OpenAI API key found"**
183
- - Make sure `~/.openai_key` exists and contains valid API key
184
- - Check file permissions: `ls -la ~/.openai_key`
185
-
186
- 2. **"Connection error" in tests**
187
- - Check internet connection
188
- - Verify API key is valid
189
- - OpenAI API might be down
190
-
191
- 3. **"Model does not exist"**
192
- - Some models require specific API access
193
- - Try with `gpt-3.5-turbo` which is widely available
194
-
195
- 4. **Rate limiting**
196
- - If you get rate limit errors, wait a bit between requests
197
- - Consider using a different API key for testing
@@ -1,20 +0,0 @@
1
- import { IMessage } from '../IMessage.js';
2
- export declare class ConversationCache {
3
- private cache;
4
- private accessOrder;
5
- private readonly maxSize;
6
- private readonly ttlMs;
7
- constructor(maxSize?: number, ttlHours?: number);
8
- private generateKey;
9
- private evictIfNeeded;
10
- private updateAccessOrder;
11
- private isExpired;
12
- set(conversationId: string, parentId: string, messages: IMessage[], promptTokensAccum?: number): void;
13
- get(conversationId: string, parentId: string): IMessage[] | null;
14
- has(conversationId: string, parentId: string): boolean;
15
- clear(): void;
16
- size(): number;
17
- getAccumulatedTokens(conversationId: string, parentId: string): number;
18
- updateTokenCount(conversationId: string, parentId: string, additionalTokens: number): void;
19
- invalidate(conversationId: string, parentId: string): void;
20
- }