@blackbox_ai/blackbox-cli 0.0.6 → 0.0.9

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 (45) hide show
  1. package/dist/package.json +4 -3
  2. package/dist/src/commands/configure/ConfigureUI.d.ts +11 -0
  3. package/dist/src/commands/configure/ConfigureUI.js +416 -0
  4. package/dist/src/commands/configure/ConfigureUI.js.map +1 -0
  5. package/dist/src/commands/configure/index.d.ts +7 -0
  6. package/dist/src/commands/configure/index.js +30 -0
  7. package/dist/src/commands/configure/index.js.map +1 -0
  8. package/dist/src/commands/configure.d.ts +7 -0
  9. package/dist/src/commands/configure.js +259 -0
  10. package/dist/src/commands/configure.js.map +1 -0
  11. package/dist/src/commands/configure.test.d.ts +6 -0
  12. package/dist/src/commands/configure.test.js +32 -0
  13. package/dist/src/commands/configure.test.js.map +1 -0
  14. package/dist/src/config/auth.d.ts +29 -0
  15. package/dist/src/config/auth.js +281 -1
  16. package/dist/src/config/auth.js.map +1 -1
  17. package/dist/src/config/config.js +5 -3
  18. package/dist/src/config/config.js.map +1 -1
  19. package/dist/src/config/modelFetcher.d.ts +21 -0
  20. package/dist/src/config/modelFetcher.js +251 -0
  21. package/dist/src/config/modelFetcher.js.map +1 -0
  22. package/dist/src/config/settings.js +37 -0
  23. package/dist/src/config/settings.js.map +1 -1
  24. package/dist/src/config/settingsSchema.d.ts +275 -0
  25. package/dist/src/config/settingsSchema.js +275 -0
  26. package/dist/src/config/settingsSchema.js.map +1 -1
  27. package/dist/src/gemini.js +4 -1
  28. package/dist/src/gemini.js.map +1 -1
  29. package/dist/src/generated/git-commit.d.ts +2 -2
  30. package/dist/src/generated/git-commit.js +2 -2
  31. package/dist/src/nonInteractiveCli.js +149 -5
  32. package/dist/src/nonInteractiveCli.js.map +1 -1
  33. package/dist/src/ui/App.js +1 -1
  34. package/dist/src/ui/App.js.map +1 -1
  35. package/dist/src/ui/components/AuthDialog.d.ts +3 -2
  36. package/dist/src/ui/components/AuthDialog.js +309 -61
  37. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  38. package/dist/src/ui/components/GenericProviderKeyPrompt.d.ts +22 -0
  39. package/dist/src/ui/components/GenericProviderKeyPrompt.js +86 -0
  40. package/dist/src/ui/components/GenericProviderKeyPrompt.js.map +1 -0
  41. package/dist/src/ui/hooks/useGeminiStream.js +2 -0
  42. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  43. package/dist/src/zed-integration/schema.d.ts +286 -286
  44. package/dist/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +4 -3
@@ -0,0 +1,259 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AuthType } from '@blackbox_ai/blackbox-cli-core';
7
+ import { loadSettings, SettingScope } from '../config/settings.js';
8
+ import { setBlackboxApiKey, setBlackboxApiBaseUrl, setBlackboxApiModel, setOpenAIApiKey, setOpenAIBaseUrl, setOpenAIModel, } from '../config/auth.js';
9
+ import * as readline from 'node:readline';
10
+ import { stdin as input, stdout as output } from 'node:process';
11
+ const PROVIDERS = [
12
+ {
13
+ name: 'blackbox',
14
+ displayName: 'BlackboxAI',
15
+ authType: AuthType.USE_BLACKBOX_API,
16
+ requiresApiKey: true,
17
+ defaultBaseUrl: 'https://api.blackbox.ai/v1',
18
+ defaultModel: 'blackbox-ai',
19
+ envKeyName: 'BLACKBOX_API_KEY',
20
+ envBaseUrlName: 'BLACKBOX_API_BASE_URL',
21
+ envModelName: 'BLACKBOX_API_MODEL',
22
+ },
23
+ {
24
+ name: 'openai',
25
+ displayName: 'OpenAI',
26
+ authType: AuthType.USE_OPENAI,
27
+ requiresApiKey: true,
28
+ defaultBaseUrl: 'https://api.openai.com/v1',
29
+ defaultModel: 'gpt-4',
30
+ envKeyName: 'OPENAI_API_KEY',
31
+ envBaseUrlName: 'OPENAI_BASE_URL',
32
+ envModelName: 'OPENAI_MODEL',
33
+ },
34
+ ];
35
+ function createReadlineInterface() {
36
+ return readline.createInterface({
37
+ input,
38
+ output,
39
+ terminal: true,
40
+ });
41
+ }
42
+ function question(rl, prompt) {
43
+ return new Promise((resolve) => {
44
+ rl.question(prompt, (answer) => {
45
+ resolve(answer.trim());
46
+ });
47
+ });
48
+ }
49
+ function questionPassword(rl, prompt) {
50
+ return new Promise((resolve) => {
51
+ // Disable echo for password input
52
+ const stdin = process.stdin;
53
+ const originalRawMode = stdin.isRaw;
54
+ if (stdin.setRawMode) {
55
+ stdin.setRawMode(true);
56
+ }
57
+ output.write(prompt);
58
+ let password = '';
59
+ const onData = (char) => {
60
+ const str = char.toString('utf8');
61
+ // Handle different key presses
62
+ if (str === '\n' || str === '\r' || str === '\r\n') {
63
+ // Enter key
64
+ output.write('\n');
65
+ stdin.removeListener('data', onData);
66
+ if (stdin.setRawMode) {
67
+ stdin.setRawMode(originalRawMode);
68
+ }
69
+ resolve(password);
70
+ }
71
+ else if (str === '\u0003') {
72
+ // Ctrl+C
73
+ output.write('\n');
74
+ stdin.removeListener('data', onData);
75
+ if (stdin.setRawMode) {
76
+ stdin.setRawMode(originalRawMode);
77
+ }
78
+ process.exit(0);
79
+ }
80
+ else if (str === '\u007f' || str === '\b') {
81
+ // Backspace
82
+ if (password.length > 0) {
83
+ password = password.slice(0, -1);
84
+ output.write('\b \b');
85
+ }
86
+ }
87
+ else if (str.charCodeAt(0) >= 32) {
88
+ // Printable character
89
+ password += str;
90
+ output.write('*');
91
+ }
92
+ };
93
+ stdin.on('data', onData);
94
+ });
95
+ }
96
+ async function selectProvider(rl) {
97
+ console.log('\n📦 Available Providers:\n');
98
+ PROVIDERS.forEach((provider, index) => {
99
+ console.log(` ${index + 1}. ${provider.displayName}`);
100
+ });
101
+ console.log();
102
+ while (true) {
103
+ const answer = await question(rl, 'Select a provider (enter number): ');
104
+ const index = parseInt(answer, 10) - 1;
105
+ if (index >= 0 && index < PROVIDERS.length) {
106
+ return PROVIDERS[index];
107
+ }
108
+ console.log('❌ Invalid selection. Please try again.\n');
109
+ }
110
+ }
111
+ async function configureProvider(provider, rl) {
112
+ console.log(`\n⚙️ Configuring ${provider.displayName}\n`);
113
+ // Check if API key exists in environment
114
+ const existingApiKey = provider.envKeyName
115
+ ? process.env[provider.envKeyName]
116
+ : undefined;
117
+ let apiKey = '';
118
+ if (existingApiKey) {
119
+ console.log(`✓ API key found in environment variable ${provider.envKeyName}`);
120
+ const useExisting = await question(rl, 'Use existing API key? (Y/n): ');
121
+ if (useExisting.toLowerCase() !== 'n') {
122
+ apiKey = existingApiKey;
123
+ }
124
+ }
125
+ if (!apiKey) {
126
+ apiKey = await questionPassword(rl, `Enter your ${provider.displayName} API key: `);
127
+ if (!apiKey) {
128
+ throw new Error('API key is required');
129
+ }
130
+ }
131
+ // Base URL configuration
132
+ const existingBaseUrl = provider.envBaseUrlName
133
+ ? process.env[provider.envBaseUrlName]
134
+ : undefined;
135
+ let baseUrl = existingBaseUrl || provider.defaultBaseUrl || '';
136
+ const customizeBaseUrl = await question(rl, `Use custom base URL? Current: ${baseUrl} (y/N): `);
137
+ if (customizeBaseUrl.toLowerCase() === 'y') {
138
+ const newBaseUrl = await question(rl, `Enter base URL (default: ${provider.defaultBaseUrl}): `);
139
+ if (newBaseUrl) {
140
+ baseUrl = newBaseUrl;
141
+ }
142
+ }
143
+ // Model configuration
144
+ const existingModel = provider.envModelName
145
+ ? process.env[provider.envModelName]
146
+ : undefined;
147
+ let model = existingModel || provider.defaultModel;
148
+ const customizeModel = await question(rl, `Use custom model? Current: ${model} (y/N): `);
149
+ if (customizeModel.toLowerCase() === 'y') {
150
+ const newModel = await question(rl, `Enter model name (default: ${provider.defaultModel}): `);
151
+ if (newModel) {
152
+ model = newModel;
153
+ }
154
+ }
155
+ return { apiKey, baseUrl, model };
156
+ }
157
+ async function testConfiguration(provider, config) {
158
+ console.log('\n🔍 Testing configuration...\n');
159
+ try {
160
+ // Set environment variables temporarily for testing
161
+ if (provider.envKeyName) {
162
+ process.env[provider.envKeyName] = config.apiKey;
163
+ }
164
+ if (provider.envBaseUrlName && config.baseUrl) {
165
+ process.env[provider.envBaseUrlName] = config.baseUrl;
166
+ }
167
+ if (provider.envModelName && config.model) {
168
+ process.env[provider.envModelName] = config.model;
169
+ }
170
+ // Apply the configuration based on provider
171
+ if (provider.authType === AuthType.USE_OPENAI) {
172
+ setOpenAIApiKey(config.apiKey);
173
+ setOpenAIBaseUrl(config.baseUrl);
174
+ setOpenAIModel(config.model);
175
+ }
176
+ else if (provider.authType === AuthType.USE_BLACKBOX_API) {
177
+ setBlackboxApiKey(config.apiKey);
178
+ setBlackboxApiBaseUrl(config.baseUrl);
179
+ setBlackboxApiModel(config.model);
180
+ }
181
+ console.log('✓ Configuration applied successfully');
182
+ console.log('\n⚠️ Note: Full API validation will occur when you start using Blackbox CLI');
183
+ return true;
184
+ }
185
+ catch (error) {
186
+ console.error('❌ Configuration test failed:', error);
187
+ return false;
188
+ }
189
+ }
190
+ async function saveConfiguration(provider, config) {
191
+ console.log('\n💾 Saving configuration...\n');
192
+ const settings = loadSettings(process.cwd());
193
+ // Save auth type
194
+ settings.setValue(SettingScope.User, 'security.auth.selectedType', provider.authType);
195
+ // Save model name
196
+ settings.setValue(SettingScope.User, 'model.name', config.model);
197
+ // Note: API keys are typically stored in environment variables or secure storage
198
+ // For now, we'll just set them in the current process environment
199
+ // Users should add them to their .env file or shell profile for persistence
200
+ console.log('✓ Configuration saved to user settings');
201
+ console.log('\n📝 Important: To persist your API key across sessions, add it to:');
202
+ console.log(` - Your shell profile (~/.bashrc, ~/.zshrc, etc.)`);
203
+ console.log(` - Or a .env file in your project directory`);
204
+ console.log(` - Or ~/.blackboxcli/.env`);
205
+ console.log();
206
+ console.log(` Example:`);
207
+ console.log(` export ${provider.envKeyName}="${config.apiKey.substring(0, 8)}..."`);
208
+ if (config.baseUrl !== provider.defaultBaseUrl) {
209
+ console.log(` export ${provider.envBaseUrlName}="${config.baseUrl}"`);
210
+ }
211
+ if (config.model !== provider.defaultModel) {
212
+ console.log(` export ${provider.envModelName}="${config.model}"`);
213
+ }
214
+ }
215
+ async function runConfigure() {
216
+ console.log('\n🚀 Welcome to Blackbox CLI Configuration\n');
217
+ console.log('This wizard will help you set up your AI provider and model.\n');
218
+ const rl = createReadlineInterface();
219
+ try {
220
+ // Step 1: Select provider
221
+ const provider = await selectProvider(rl);
222
+ // Step 2: Configure provider (API key, base URL, model)
223
+ const config = await configureProvider(provider, rl);
224
+ // Step 3: Test configuration
225
+ const testSuccess = await testConfiguration(provider, config);
226
+ if (!testSuccess) {
227
+ const continueAnyway = await question(rl, '\n⚠️ Configuration test had issues. Continue anyway? (y/N): ');
228
+ if (continueAnyway.toLowerCase() !== 'y') {
229
+ console.log('\n❌ Configuration cancelled.\n');
230
+ rl.close();
231
+ process.exit(1);
232
+ }
233
+ }
234
+ // Step 4: Save configuration
235
+ await saveConfiguration(provider, config);
236
+ console.log('\n✅ Configuration complete!\n');
237
+ console.log('You can now run `blackbox` to start using the CLI.\n');
238
+ console.log('💡 Tip: Run `blackbox configure` again anytime to update your settings.\n');
239
+ rl.close();
240
+ }
241
+ catch (error) {
242
+ console.error('\n❌ Configuration failed:', error);
243
+ rl.close();
244
+ process.exit(1);
245
+ }
246
+ }
247
+ export const configureCommand = {
248
+ command: 'configure',
249
+ describe: 'Configure Blackbox CLI provider and model settings',
250
+ builder: (yargs) => yargs
251
+ .usage('Usage: blackbox configure')
252
+ .example('blackbox configure', 'Start the configuration wizard')
253
+ .help(),
254
+ handler: async () => {
255
+ await runConfigure();
256
+ process.exit(0);
257
+ },
258
+ };
259
+ //# sourceMappingURL=configure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../src/commands/configure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { configureCommand } from './configure/index.js';
8
+ describe('configure command', () => {
9
+ beforeEach(() => {
10
+ // Mock process.exit to prevent test termination
11
+ vi.spyOn(process, 'exit').mockImplementation((() => { }));
12
+ });
13
+ afterEach(() => {
14
+ vi.restoreAllMocks();
15
+ });
16
+ it('should have correct command name', () => {
17
+ expect(configureCommand.command).toBe('configure');
18
+ });
19
+ it('should have a description', () => {
20
+ expect(configureCommand.describe).toBeDefined();
21
+ expect(typeof configureCommand.describe).toBe('string');
22
+ });
23
+ it('should have a builder function', () => {
24
+ expect(configureCommand.builder).toBeDefined();
25
+ expect(typeof configureCommand.builder).toBe('function');
26
+ });
27
+ it('should have a handler function', () => {
28
+ expect(configureCommand.handler).toBeDefined();
29
+ expect(typeof configureCommand.handler).toBe('function');
30
+ });
31
+ });
32
+ //# sourceMappingURL=configure.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.test.js","sourceRoot":"","sources":["../../../src/commands/configure.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,UAAU,CAAC,GAAG,EAAE;QACd,gDAAgD;QAChD,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,CAAU,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,CAAC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -3,6 +3,7 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
+ import { type LoadedSettings } from './settings.js';
6
7
  export declare const validateAuthMethod: (authMethod: string) => string | null;
7
8
  export declare const setOpenAIApiKey: (apiKey: string) => void;
8
9
  export declare const setOpenAIBaseUrl: (baseUrl: string) => void;
@@ -10,3 +11,31 @@ export declare const setOpenAIModel: (model: string) => void;
10
11
  export declare const setBlackboxApiKey: (apiKey: string) => void;
11
12
  export declare const setBlackboxApiBaseUrl: (baseUrl: string) => void;
12
13
  export declare const setBlackboxApiModel: (model: string) => void;
14
+ export declare const setOpenRouterApiKey: (apiKey: string) => void;
15
+ export declare const setOpenRouterBaseUrl: (baseUrl: string) => void;
16
+ export declare const setOpenRouterModel: (model: string) => void;
17
+ export declare const setCustomApiKey: (apiKey: string) => void;
18
+ export declare const setCustomBaseUrl: (baseUrl: string) => void;
19
+ export declare const setCustomModel: (model: string) => void;
20
+ export declare const setAnthropicApiKey: (apiKey: string) => void;
21
+ export declare const setAnthropicBaseUrl: (baseUrl: string) => void;
22
+ export declare const setAnthropicModel: (model: string) => void;
23
+ export declare const setGoogleApiKey: (apiKey: string) => void;
24
+ export declare const setGoogleBaseUrl: (baseUrl: string) => void;
25
+ export declare const setGoogleModel: (model: string) => void;
26
+ export declare const setXaiApiKey: (apiKey: string) => void;
27
+ export declare const setXaiBaseUrl: (baseUrl: string) => void;
28
+ export declare const setXaiModel: (model: string) => void;
29
+ /**
30
+ * Save provider credentials to settings file for persistence across sessions
31
+ */
32
+ export declare const saveProviderCredentials: (settings: LoadedSettings, provider: "openai" | "blackbox" | "openrouter" | "custom" | "anthropic" | "google" | "xai", credentials: {
33
+ apiKey?: string;
34
+ baseUrl?: string;
35
+ model?: string;
36
+ }) => void;
37
+ /**
38
+ * Load provider credentials from settings and set them as environment variables
39
+ * This ensures credentials persist across sessions
40
+ */
41
+ export declare const loadProviderCredentialsFromSettings: (settings: LoadedSettings) => void;
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { AuthType } from '@blackbox_ai/blackbox-cli-core';
7
- import { loadEnvironment } from './settings.js';
7
+ import { loadEnvironment, SettingScope } from './settings.js';
8
8
  export const validateAuthMethod = (authMethod) => {
9
9
  loadEnvironment();
10
10
  if (authMethod === AuthType.LOGIN_WITH_GOOGLE ||
@@ -66,4 +66,284 @@ export const setBlackboxApiBaseUrl = (baseUrl) => {
66
66
  export const setBlackboxApiModel = (model) => {
67
67
  process.env['BLACKBOX_API_MODEL'] = model;
68
68
  };
69
+ export const setOpenRouterApiKey = (apiKey) => {
70
+ process.env['OPENROUTER_API_KEY'] = apiKey;
71
+ };
72
+ export const setOpenRouterBaseUrl = (baseUrl) => {
73
+ process.env['OPENROUTER_BASE_URL'] = baseUrl;
74
+ };
75
+ export const setOpenRouterModel = (model) => {
76
+ process.env['OPENROUTER_MODEL'] = model;
77
+ };
78
+ export const setCustomApiKey = (apiKey) => {
79
+ process.env['CUSTOM_API_KEY'] = apiKey;
80
+ };
81
+ export const setCustomBaseUrl = (baseUrl) => {
82
+ process.env['CUSTOM_BASE_URL'] = baseUrl;
83
+ };
84
+ export const setCustomModel = (model) => {
85
+ process.env['CUSTOM_MODEL'] = model;
86
+ };
87
+ export const setAnthropicApiKey = (apiKey) => {
88
+ process.env['ANTHROPIC_API_KEY'] = apiKey;
89
+ };
90
+ export const setAnthropicBaseUrl = (baseUrl) => {
91
+ process.env['ANTHROPIC_BASE_URL'] = baseUrl;
92
+ };
93
+ export const setAnthropicModel = (model) => {
94
+ process.env['ANTHROPIC_MODEL'] = model;
95
+ };
96
+ export const setGoogleApiKey = (apiKey) => {
97
+ process.env['GOOGLE_API_KEY'] = apiKey;
98
+ };
99
+ export const setGoogleBaseUrl = (baseUrl) => {
100
+ process.env['GOOGLE_HOST'] = baseUrl;
101
+ };
102
+ export const setGoogleModel = (model) => {
103
+ process.env['GOOGLE_MODEL'] = model;
104
+ };
105
+ export const setXaiApiKey = (apiKey) => {
106
+ process.env['XAI_API_KEY'] = apiKey;
107
+ };
108
+ export const setXaiBaseUrl = (baseUrl) => {
109
+ process.env['XAI_HOST'] = baseUrl;
110
+ };
111
+ export const setXaiModel = (model) => {
112
+ process.env['XAI_MODEL'] = model;
113
+ };
114
+ /**
115
+ * Save provider credentials to settings file for persistence across sessions
116
+ */
117
+ export const saveProviderCredentials = (settings, provider, credentials) => {
118
+ const { apiKey, baseUrl, model } = credentials;
119
+ if (provider === 'openai') {
120
+ if (apiKey) {
121
+ settings.setValue(SettingScope.User, 'security.auth.openai.apiKey', apiKey);
122
+ }
123
+ if (baseUrl) {
124
+ settings.setValue(SettingScope.User, 'security.auth.openai.baseUrl', baseUrl);
125
+ }
126
+ if (model) {
127
+ settings.setValue(SettingScope.User, 'security.auth.openai.model', model);
128
+ }
129
+ }
130
+ else if (provider === 'blackbox') {
131
+ if (apiKey) {
132
+ settings.setValue(SettingScope.User, 'security.auth.blackbox.apiKey', apiKey);
133
+ }
134
+ if (baseUrl) {
135
+ settings.setValue(SettingScope.User, 'security.auth.blackbox.baseUrl', baseUrl);
136
+ }
137
+ if (model) {
138
+ settings.setValue(SettingScope.User, 'security.auth.blackbox.model', model);
139
+ }
140
+ }
141
+ else if (provider === 'openrouter') {
142
+ if (apiKey) {
143
+ settings.setValue(SettingScope.User, 'security.auth.openrouter.apiKey', apiKey);
144
+ }
145
+ if (baseUrl) {
146
+ settings.setValue(SettingScope.User, 'security.auth.openrouter.baseUrl', baseUrl);
147
+ }
148
+ if (model) {
149
+ settings.setValue(SettingScope.User, 'security.auth.openrouter.model', model);
150
+ }
151
+ }
152
+ else if (provider === 'custom') {
153
+ if (apiKey) {
154
+ settings.setValue(SettingScope.User, 'security.auth.custom.apiKey', apiKey);
155
+ }
156
+ if (baseUrl) {
157
+ settings.setValue(SettingScope.User, 'security.auth.custom.baseUrl', baseUrl);
158
+ }
159
+ if (model) {
160
+ settings.setValue(SettingScope.User, 'security.auth.custom.model', model);
161
+ }
162
+ }
163
+ else if (provider === 'anthropic') {
164
+ if (apiKey) {
165
+ settings.setValue(SettingScope.User, 'security.auth.anthropic.apiKey', apiKey);
166
+ }
167
+ if (baseUrl) {
168
+ settings.setValue(SettingScope.User, 'security.auth.anthropic.baseUrl', baseUrl);
169
+ }
170
+ if (model) {
171
+ settings.setValue(SettingScope.User, 'security.auth.anthropic.model', model);
172
+ }
173
+ }
174
+ else if (provider === 'google') {
175
+ if (apiKey) {
176
+ settings.setValue(SettingScope.User, 'security.auth.google.apiKey', apiKey);
177
+ }
178
+ if (baseUrl) {
179
+ settings.setValue(SettingScope.User, 'security.auth.google.baseUrl', baseUrl);
180
+ }
181
+ if (model) {
182
+ settings.setValue(SettingScope.User, 'security.auth.google.model', model);
183
+ }
184
+ }
185
+ else if (provider === 'xai') {
186
+ if (apiKey) {
187
+ settings.setValue(SettingScope.User, 'security.auth.xai.apiKey', apiKey);
188
+ }
189
+ if (baseUrl) {
190
+ settings.setValue(SettingScope.User, 'security.auth.xai.baseUrl', baseUrl);
191
+ }
192
+ if (model) {
193
+ settings.setValue(SettingScope.User, 'security.auth.xai.model', model);
194
+ }
195
+ }
196
+ };
197
+ /**
198
+ * Load provider credentials from settings and set them as environment variables
199
+ * This ensures credentials persist across sessions
200
+ */
201
+ export const loadProviderCredentialsFromSettings = (settings) => {
202
+ const merged = settings.merged;
203
+ const selectedProvider = merged.security?.auth?.selectedProvider;
204
+ // Determine which provider's credentials to load based on selectedProvider
205
+ // This allows us to distinguish between OpenAI and OpenRouter (both use USE_OPENAI auth type)
206
+ if (selectedProvider === 'openai') {
207
+ const openaiApiKey = merged.security?.auth?.openai?.apiKey;
208
+ const openaiBaseUrl = merged.security?.auth?.openai?.baseUrl;
209
+ const openaiModel = merged.security?.auth?.openai?.model;
210
+ if (openaiApiKey && !process.env['OPENAI_API_KEY']) {
211
+ process.env['OPENAI_API_KEY'] = openaiApiKey;
212
+ }
213
+ if (openaiBaseUrl && !process.env['OPENAI_BASE_URL']) {
214
+ process.env['OPENAI_BASE_URL'] = openaiBaseUrl;
215
+ }
216
+ if (openaiModel && !process.env['OPENAI_MODEL']) {
217
+ process.env['OPENAI_MODEL'] = openaiModel;
218
+ }
219
+ }
220
+ else if (selectedProvider === 'openrouter') {
221
+ const openrouterApiKey = merged.security?.auth?.openrouter?.apiKey;
222
+ const openrouterBaseUrl = merged.security?.auth?.openrouter?.baseUrl;
223
+ const openrouterModel = merged.security?.auth?.openrouter?.model;
224
+ if (openrouterApiKey && !process.env['OPENAI_API_KEY']) {
225
+ // OpenRouter uses OPENAI_API_KEY for compatibility
226
+ process.env['OPENAI_API_KEY'] = openrouterApiKey;
227
+ }
228
+ if (openrouterBaseUrl && !process.env['OPENAI_BASE_URL']) {
229
+ // OpenRouter uses OPENAI_BASE_URL for compatibility
230
+ process.env['OPENAI_BASE_URL'] = openrouterBaseUrl;
231
+ }
232
+ if (openrouterModel && !process.env['OPENAI_MODEL']) {
233
+ process.env['OPENAI_MODEL'] = openrouterModel;
234
+ }
235
+ }
236
+ else if (selectedProvider === 'blackbox') {
237
+ const blackboxApiKey = merged.security?.auth?.blackbox?.apiKey;
238
+ const blackboxBaseUrl = merged.security?.auth?.blackbox?.baseUrl;
239
+ const blackboxModel = merged.security?.auth?.blackbox?.model;
240
+ if (blackboxApiKey && !process.env['BLACKBOX_API_KEY']) {
241
+ process.env['BLACKBOX_API_KEY'] = blackboxApiKey;
242
+ }
243
+ if (blackboxBaseUrl && !process.env['BLACKBOX_API_BASE_URL']) {
244
+ process.env['BLACKBOX_API_BASE_URL'] = blackboxBaseUrl;
245
+ }
246
+ if (blackboxModel && !process.env['BLACKBOX_API_MODEL']) {
247
+ process.env['BLACKBOX_API_MODEL'] = blackboxModel;
248
+ }
249
+ }
250
+ else if (selectedProvider === 'custom') {
251
+ const customApiKey = merged.security?.auth?.custom?.apiKey;
252
+ const customBaseUrl = merged.security?.auth?.custom?.baseUrl;
253
+ const customModel = merged.security?.auth?.custom?.model;
254
+ if (customApiKey && !process.env['OPENAI_API_KEY']) {
255
+ // Custom provider uses OPENAI_API_KEY for compatibility with OpenAI-compatible APIs
256
+ process.env['OPENAI_API_KEY'] = customApiKey;
257
+ }
258
+ if (customBaseUrl && !process.env['OPENAI_BASE_URL']) {
259
+ // Custom provider uses OPENAI_BASE_URL for compatibility
260
+ process.env['OPENAI_BASE_URL'] = customBaseUrl;
261
+ }
262
+ if (customModel && !process.env['OPENAI_MODEL']) {
263
+ process.env['OPENAI_MODEL'] = customModel;
264
+ }
265
+ }
266
+ else if (selectedProvider === 'anthropic') {
267
+ const anthropicApiKey = merged.security?.auth?.anthropic?.apiKey;
268
+ const anthropicBaseUrl = merged.security?.auth?.anthropic?.baseUrl;
269
+ const anthropicModel = merged.security?.auth?.anthropic?.model;
270
+ if (anthropicApiKey && !process.env['OPENAI_API_KEY']) {
271
+ // Anthropic uses OPENAI_API_KEY for compatibility with OpenAI-compatible APIs
272
+ process.env['OPENAI_API_KEY'] = anthropicApiKey;
273
+ }
274
+ if (anthropicBaseUrl && !process.env['OPENAI_BASE_URL']) {
275
+ // Anthropic uses OPENAI_BASE_URL for compatibility
276
+ process.env['OPENAI_BASE_URL'] = anthropicBaseUrl;
277
+ }
278
+ if (anthropicModel && !process.env['OPENAI_MODEL']) {
279
+ process.env['OPENAI_MODEL'] = anthropicModel;
280
+ }
281
+ }
282
+ else if (selectedProvider === 'google') {
283
+ const googleApiKey = merged.security?.auth?.google?.apiKey;
284
+ const googleBaseUrl = merged.security?.auth?.google?.baseUrl;
285
+ const googleModel = merged.security?.auth?.google?.model;
286
+ if (googleApiKey && !process.env['OPENAI_API_KEY']) {
287
+ // Google uses OPENAI_API_KEY for compatibility with OpenAI-compatible APIs
288
+ process.env['OPENAI_API_KEY'] = googleApiKey;
289
+ }
290
+ if (googleBaseUrl && !process.env['OPENAI_BASE_URL']) {
291
+ // Google uses OPENAI_BASE_URL for compatibility
292
+ process.env['OPENAI_BASE_URL'] = googleBaseUrl;
293
+ }
294
+ if (googleModel && !process.env['OPENAI_MODEL']) {
295
+ process.env['OPENAI_MODEL'] = googleModel;
296
+ }
297
+ }
298
+ else if (selectedProvider === 'xai') {
299
+ const xaiApiKey = merged.security?.auth?.xai?.apiKey;
300
+ const xaiBaseUrl = merged.security?.auth?.xai?.baseUrl;
301
+ const xaiModel = merged.security?.auth?.xai?.model;
302
+ if (xaiApiKey && !process.env['OPENAI_API_KEY']) {
303
+ // xAI uses OPENAI_API_KEY for compatibility with OpenAI-compatible APIs
304
+ process.env['OPENAI_API_KEY'] = xaiApiKey;
305
+ }
306
+ if (xaiBaseUrl && !process.env['OPENAI_BASE_URL']) {
307
+ // xAI uses OPENAI_BASE_URL for compatibility
308
+ process.env['OPENAI_BASE_URL'] = xaiBaseUrl;
309
+ }
310
+ if (xaiModel && !process.env['OPENAI_MODEL']) {
311
+ process.env['OPENAI_MODEL'] = xaiModel;
312
+ }
313
+ }
314
+ else {
315
+ // Fallback: If selectedProvider is not set, try to load based on selectedType
316
+ // This provides backward compatibility with older configurations
317
+ const selectedType = merged.security?.auth?.selectedType;
318
+ if (selectedType === AuthType.USE_OPENAI) {
319
+ // Try OpenAI first, then OpenRouter
320
+ const openaiApiKey = merged.security?.auth?.openai?.apiKey;
321
+ const openaiBaseUrl = merged.security?.auth?.openai?.baseUrl;
322
+ const openaiModel = merged.security?.auth?.openai?.model;
323
+ if (openaiApiKey && !process.env['OPENAI_API_KEY']) {
324
+ process.env['OPENAI_API_KEY'] = openaiApiKey;
325
+ }
326
+ if (openaiBaseUrl && !process.env['OPENAI_BASE_URL']) {
327
+ process.env['OPENAI_BASE_URL'] = openaiBaseUrl;
328
+ }
329
+ if (openaiModel && !process.env['OPENAI_MODEL']) {
330
+ process.env['OPENAI_MODEL'] = openaiModel;
331
+ }
332
+ }
333
+ else if (selectedType === AuthType.USE_BLACKBOX_API) {
334
+ const blackboxApiKey = merged.security?.auth?.blackbox?.apiKey;
335
+ const blackboxBaseUrl = merged.security?.auth?.blackbox?.baseUrl;
336
+ const blackboxModel = merged.security?.auth?.blackbox?.model;
337
+ if (blackboxApiKey && !process.env['BLACKBOX_API_KEY']) {
338
+ process.env['BLACKBOX_API_KEY'] = blackboxApiKey;
339
+ }
340
+ if (blackboxBaseUrl && !process.env['BLACKBOX_API_BASE_URL']) {
341
+ process.env['BLACKBOX_API_BASE_URL'] = blackboxBaseUrl;
342
+ }
343
+ if (blackboxModel && !process.env['BLACKBOX_API_MODEL']) {
344
+ process.env['BLACKBOX_API_MODEL'] = blackboxModel;
345
+ }
346
+ }
347
+ }
348
+ };
69
349
  //# sourceMappingURL=auth.js.map