@vybestack/llxprt-code 0.1.19-beta → 0.1.19-gamma
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.
- package/README.md +49 -2
- package/dist/package.json +3 -3
- package/dist/src/auth/anthropic-oauth-provider.d.ts +33 -0
- package/dist/src/auth/anthropic-oauth-provider.js +129 -0
- package/dist/src/auth/anthropic-oauth-provider.js.map +1 -0
- package/dist/src/auth/gemini-oauth-provider.d.ts +15 -0
- package/dist/src/auth/gemini-oauth-provider.js +33 -0
- package/dist/src/auth/gemini-oauth-provider.js.map +1 -0
- package/dist/src/auth/oauth-manager.d.ts +109 -0
- package/dist/src/auth/oauth-manager.js +334 -0
- package/dist/src/auth/oauth-manager.js.map +1 -0
- package/dist/src/auth/oauth-manager.spec.d.ts +6 -0
- package/dist/src/auth/oauth-manager.spec.js +523 -0
- package/dist/src/auth/oauth-manager.spec.js.map +1 -0
- package/dist/src/auth/qwen-oauth-provider.d.ts +14 -0
- package/dist/src/auth/qwen-oauth-provider.js +75 -0
- package/dist/src/auth/qwen-oauth-provider.js.map +1 -0
- package/dist/src/auth/types.d.ts +7 -0
- package/dist/src/auth/types.js +7 -0
- package/dist/src/auth/types.js.map +1 -0
- package/dist/src/config/auth.js +6 -0
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config.js +20 -6
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/keyBindings.d.ts +2 -0
- package/dist/src/config/keyBindings.js +7 -8
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/settings.d.ts +3 -62
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +587 -0
- package/dist/src/config/settingsSchema.js +565 -0
- package/dist/src/config/settingsSchema.js.map +1 -0
- package/dist/src/generated/git-commit.d.ts +1 -1
- package/dist/src/generated/git-commit.js +1 -1
- package/dist/src/providers/providerManagerInstance.d.ts +2 -0
- package/dist/src/providers/providerManagerInstance.js +45 -5
- package/dist/src/providers/providerManagerInstance.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.js +2 -0
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/ui/App.js +94 -13
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/commands/authCommand.d.ts +11 -1
- package/dist/src/ui/commands/authCommand.js +145 -48
- package/dist/src/ui/commands/authCommand.js.map +1 -1
- package/dist/src/ui/commands/diagnosticsCommand.js +94 -10
- package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -1
- package/dist/src/ui/commands/keyCommand.js +32 -2
- package/dist/src/ui/commands/keyCommand.js.map +1 -1
- package/dist/src/ui/commands/keyfileCommand.js +15 -12
- package/dist/src/ui/commands/keyfileCommand.js.map +1 -1
- package/dist/src/ui/commands/modelCommand.js +21 -3
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/providerCommand.js +52 -14
- package/dist/src/ui/commands/providerCommand.js.map +1 -1
- package/dist/src/ui/commands/setCommand.js +17 -1
- package/dist/src/ui/commands/setCommand.js.map +1 -1
- package/dist/src/ui/commands/settingsCommand.d.ts +7 -0
- package/dist/src/ui/commands/settingsCommand.js +16 -0
- package/dist/src/ui/commands/settingsCommand.js.map +1 -0
- package/dist/src/ui/commands/toolformatCommand.js +79 -23
- package/dist/src/ui/commands/toolformatCommand.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +1 -1
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/AuthDialog.js +15 -54
- package/dist/src/ui/components/AuthDialog.js.map +1 -1
- package/dist/src/ui/components/Footer.d.ts +1 -0
- package/dist/src/ui/components/Footer.js +2 -2
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.d.ts +1 -0
- package/dist/src/ui/components/InputPrompt.js +59 -7
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/OAuthCodeDialog.d.ts +13 -0
- package/dist/src/ui/components/OAuthCodeDialog.js +54 -0
- package/dist/src/ui/components/OAuthCodeDialog.js.map +1 -0
- package/dist/src/ui/components/SettingsDialog.d.ts +14 -0
- package/dist/src/ui/components/SettingsDialog.js +247 -0
- package/dist/src/ui/components/SettingsDialog.js.map +1 -0
- package/dist/src/ui/components/ThemeDialog.js +4 -15
- package/dist/src/ui/components/ThemeDialog.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +5 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAuthCommand.js +48 -2
- package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.d.ts +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +21 -7
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useSettingsCommand.d.ts +10 -0
- package/dist/src/ui/hooks/useSettingsCommand.js +21 -0
- package/dist/src/ui/hooks/useSettingsCommand.js.map +1 -0
- package/dist/src/ui/reducers/appReducer.d.ts +3 -2
- package/dist/src/ui/reducers/appReducer.js +1 -0
- package/dist/src/ui/reducers/appReducer.js.map +1 -1
- package/dist/src/utils/dialogScopeUtils.d.ts +31 -0
- package/dist/src/utils/dialogScopeUtils.js +48 -0
- package/dist/src/utils/dialogScopeUtils.js.map +1 -0
- package/dist/src/utils/settingsUtils.d.ts +126 -0
- package/dist/src/utils/settingsUtils.js +327 -0
- package/dist/src/utils/settingsUtils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
@@ -0,0 +1,334 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import { SettingScope } from '../config/settings.js';
|
7
|
+
/**
|
8
|
+
* OAuth Manager coordinates multiple OAuth providers
|
9
|
+
* Provides unified interface for authentication across providers
|
10
|
+
*/
|
11
|
+
export class OAuthManager {
|
12
|
+
providers;
|
13
|
+
tokenStore;
|
14
|
+
settings;
|
15
|
+
constructor(tokenStore, settings) {
|
16
|
+
this.providers = new Map();
|
17
|
+
this.tokenStore = tokenStore;
|
18
|
+
this.settings = settings;
|
19
|
+
}
|
20
|
+
/**
|
21
|
+
* Register an OAuth provider with the manager
|
22
|
+
* @param provider - The OAuth provider to register
|
23
|
+
*/
|
24
|
+
registerProvider(provider) {
|
25
|
+
if (!provider) {
|
26
|
+
throw new Error('Provider cannot be null or undefined');
|
27
|
+
}
|
28
|
+
if (!provider.name || typeof provider.name !== 'string') {
|
29
|
+
throw new Error('Provider must have a valid name');
|
30
|
+
}
|
31
|
+
// Validate provider has required methods
|
32
|
+
if (typeof provider.initiateAuth !== 'function') {
|
33
|
+
throw new Error('Provider must implement initiateAuth method');
|
34
|
+
}
|
35
|
+
if (typeof provider.getToken !== 'function') {
|
36
|
+
throw new Error('Provider must implement getToken method');
|
37
|
+
}
|
38
|
+
if (typeof provider.refreshIfNeeded !== 'function') {
|
39
|
+
throw new Error('Provider must implement refreshIfNeeded method');
|
40
|
+
}
|
41
|
+
this.providers.set(provider.name, provider);
|
42
|
+
}
|
43
|
+
/**
|
44
|
+
* Get a registered OAuth provider
|
45
|
+
* @param name - Provider name
|
46
|
+
* @returns OAuth provider or undefined if not registered
|
47
|
+
*/
|
48
|
+
getProvider(name) {
|
49
|
+
return this.providers.get(name);
|
50
|
+
}
|
51
|
+
/**
|
52
|
+
* Authenticate with a specific provider
|
53
|
+
* @param providerName - Name of the provider to authenticate with
|
54
|
+
*/
|
55
|
+
async authenticate(providerName) {
|
56
|
+
if (!providerName || typeof providerName !== 'string') {
|
57
|
+
throw new Error('Provider name must be a non-empty string');
|
58
|
+
}
|
59
|
+
const provider = this.providers.get(providerName);
|
60
|
+
if (!provider) {
|
61
|
+
throw new Error(`Unknown provider: ${providerName}`);
|
62
|
+
}
|
63
|
+
try {
|
64
|
+
// 1. Initiate authentication with the provider
|
65
|
+
await provider.initiateAuth();
|
66
|
+
// 2. Get token from provider after successful auth
|
67
|
+
const providerToken = await provider.getToken();
|
68
|
+
if (!providerToken) {
|
69
|
+
throw new Error('Authentication completed but no token was returned');
|
70
|
+
}
|
71
|
+
// 3. Store token using tokenStore
|
72
|
+
await this.tokenStore.saveToken(providerName, providerToken);
|
73
|
+
}
|
74
|
+
catch (error) {
|
75
|
+
// Propagate provider authentication errors
|
76
|
+
if (error instanceof Error) {
|
77
|
+
throw error;
|
78
|
+
}
|
79
|
+
throw new Error(`Authentication failed for provider ${providerName}: ${String(error)}`);
|
80
|
+
}
|
81
|
+
}
|
82
|
+
/**
|
83
|
+
* Get authentication status for all registered providers
|
84
|
+
* @returns Array of authentication status for each provider
|
85
|
+
*/
|
86
|
+
async getAuthStatus() {
|
87
|
+
const statuses = [];
|
88
|
+
// Get all registered providers and check their status
|
89
|
+
for (const [providerName, _provider] of this.providers) {
|
90
|
+
try {
|
91
|
+
const token = await this.tokenStore.getToken(providerName);
|
92
|
+
const oauthEnabled = this.isOAuthEnabled(providerName);
|
93
|
+
if (token) {
|
94
|
+
// Provider is authenticated, calculate time until expiry
|
95
|
+
const now = Date.now();
|
96
|
+
const expiresIn = Math.max(0, Math.floor((token.expiry - now) / 1000)); // seconds
|
97
|
+
statuses.push({
|
98
|
+
provider: providerName,
|
99
|
+
authenticated: true,
|
100
|
+
authType: 'oauth',
|
101
|
+
expiresIn,
|
102
|
+
oauthEnabled,
|
103
|
+
});
|
104
|
+
}
|
105
|
+
else {
|
106
|
+
// Provider is not authenticated
|
107
|
+
statuses.push({
|
108
|
+
provider: providerName,
|
109
|
+
authenticated: false,
|
110
|
+
authType: 'none',
|
111
|
+
oauthEnabled,
|
112
|
+
});
|
113
|
+
}
|
114
|
+
}
|
115
|
+
catch (_error) {
|
116
|
+
// If we can't get token status, consider it unauthenticated
|
117
|
+
const oauthEnabled = this.isOAuthEnabled(providerName);
|
118
|
+
statuses.push({
|
119
|
+
provider: providerName,
|
120
|
+
authenticated: false,
|
121
|
+
authType: 'none',
|
122
|
+
oauthEnabled,
|
123
|
+
});
|
124
|
+
}
|
125
|
+
}
|
126
|
+
return statuses;
|
127
|
+
}
|
128
|
+
/**
|
129
|
+
* Check if authenticated with a specific provider (required by precedence resolver)
|
130
|
+
* @param providerName - Name of the provider
|
131
|
+
* @returns True if authenticated, false otherwise
|
132
|
+
*/
|
133
|
+
async isAuthenticated(providerName) {
|
134
|
+
// Special handling for Gemini - check if OAuth is enabled and working
|
135
|
+
if (providerName === 'gemini' && this.isOAuthEnabled('gemini')) {
|
136
|
+
// For Gemini, if OAuth is enabled, we assume it's authenticated
|
137
|
+
// since the actual auth is handled by LOGIN_WITH_GOOGLE
|
138
|
+
return true;
|
139
|
+
}
|
140
|
+
const token = await this.getOAuthToken(providerName);
|
141
|
+
return token !== null;
|
142
|
+
}
|
143
|
+
/**
|
144
|
+
* Get OAuth token for a specific provider
|
145
|
+
* Compatible with precedence resolver - returns access token string
|
146
|
+
* @param providerName - Name of the provider
|
147
|
+
* @returns Access token string if available, null otherwise
|
148
|
+
*/
|
149
|
+
async getToken(providerName) {
|
150
|
+
// Check if OAuth is enabled for this provider
|
151
|
+
if (!this.isOAuthEnabled(providerName)) {
|
152
|
+
return null;
|
153
|
+
}
|
154
|
+
const token = await this.getOAuthToken(providerName);
|
155
|
+
// Special handling for different providers
|
156
|
+
if (providerName === 'gemini') {
|
157
|
+
if (token) {
|
158
|
+
return token.access_token;
|
159
|
+
}
|
160
|
+
// Return a special token that signals to use LOGIN_WITH_GOOGLE
|
161
|
+
return 'USE_LOGIN_WITH_GOOGLE';
|
162
|
+
}
|
163
|
+
// For Qwen, return the OAuth token to be used as API key
|
164
|
+
if (providerName === 'qwen' && token) {
|
165
|
+
return token.access_token;
|
166
|
+
}
|
167
|
+
if (token) {
|
168
|
+
return token.access_token;
|
169
|
+
}
|
170
|
+
// For other providers, trigger OAuth flow
|
171
|
+
try {
|
172
|
+
await this.authenticate(providerName);
|
173
|
+
const newToken = await this.getOAuthToken(providerName);
|
174
|
+
// Return the access token without any prefix - OAuth Bearer tokens should be used as-is
|
175
|
+
return newToken ? newToken.access_token : null;
|
176
|
+
}
|
177
|
+
catch (error) {
|
178
|
+
// Re-throw the error so it's not silently swallowed
|
179
|
+
console.error(`OAuth authentication failed for ${providerName}:`, error);
|
180
|
+
throw error;
|
181
|
+
}
|
182
|
+
}
|
183
|
+
/**
|
184
|
+
* Get OAuth token object for a specific provider
|
185
|
+
* @param providerName - Name of the provider
|
186
|
+
* @returns OAuth token if available, null otherwise
|
187
|
+
*/
|
188
|
+
async getOAuthToken(providerName) {
|
189
|
+
if (!providerName || typeof providerName !== 'string') {
|
190
|
+
throw new Error('Provider name must be a non-empty string');
|
191
|
+
}
|
192
|
+
const provider = this.providers.get(providerName);
|
193
|
+
if (!provider) {
|
194
|
+
throw new Error(`Unknown provider: ${providerName}`);
|
195
|
+
}
|
196
|
+
try {
|
197
|
+
// 1. Try to get token from store
|
198
|
+
const token = await this.tokenStore.getToken(providerName);
|
199
|
+
if (!token) {
|
200
|
+
return null;
|
201
|
+
}
|
202
|
+
// 2. Check if token expires within 30 seconds (30000ms)
|
203
|
+
const now = Date.now();
|
204
|
+
const thirtySecondsFromNow = now + 30000;
|
205
|
+
if (token.expiry <= thirtySecondsFromNow) {
|
206
|
+
// 3. Token is expired or about to expire, try refresh
|
207
|
+
try {
|
208
|
+
const refreshedToken = await provider.refreshIfNeeded();
|
209
|
+
if (refreshedToken) {
|
210
|
+
// 4. Update stored token if refreshed
|
211
|
+
await this.tokenStore.saveToken(providerName, refreshedToken);
|
212
|
+
return refreshedToken;
|
213
|
+
}
|
214
|
+
else {
|
215
|
+
// Refresh failed, return null
|
216
|
+
return null;
|
217
|
+
}
|
218
|
+
}
|
219
|
+
catch (_error) {
|
220
|
+
// Token refresh failure: Return null, no logging
|
221
|
+
return null;
|
222
|
+
}
|
223
|
+
}
|
224
|
+
// 5. Return valid token
|
225
|
+
return token;
|
226
|
+
}
|
227
|
+
catch (error) {
|
228
|
+
// For unknown provider or other critical errors, throw
|
229
|
+
if (error instanceof Error &&
|
230
|
+
error.message.includes('Unknown provider')) {
|
231
|
+
throw error;
|
232
|
+
}
|
233
|
+
// For other errors, return null
|
234
|
+
return null;
|
235
|
+
}
|
236
|
+
}
|
237
|
+
/**
|
238
|
+
* Get list of all registered provider names
|
239
|
+
* @returns Array of provider names
|
240
|
+
*/
|
241
|
+
getSupportedProviders() {
|
242
|
+
return Array.from(this.providers.keys()).sort();
|
243
|
+
}
|
244
|
+
/**
|
245
|
+
* Toggle OAuth enablement for a provider
|
246
|
+
* @param providerName - Name of the provider
|
247
|
+
* @returns New enablement state (true if enabled, false if disabled)
|
248
|
+
*/
|
249
|
+
async toggleOAuthEnabled(providerName) {
|
250
|
+
if (!providerName || typeof providerName !== 'string') {
|
251
|
+
throw new Error('Provider name must be a non-empty string');
|
252
|
+
}
|
253
|
+
const provider = this.providers.get(providerName);
|
254
|
+
if (!provider) {
|
255
|
+
throw new Error(`Unknown provider: ${providerName}`);
|
256
|
+
}
|
257
|
+
if (!this.settings) {
|
258
|
+
throw new Error('Settings are required to toggle OAuth enablement');
|
259
|
+
}
|
260
|
+
const currentlyEnabled = this.isOAuthEnabled(providerName);
|
261
|
+
const newState = !currentlyEnabled;
|
262
|
+
// Get current OAuth enabled providers or initialize empty object
|
263
|
+
const oauthEnabledProviders = this.settings.merged.oauthEnabledProviders || {};
|
264
|
+
oauthEnabledProviders[providerName] = newState;
|
265
|
+
// Save the updated configuration
|
266
|
+
this.settings.setValue(SettingScope.User, 'oauthEnabledProviders', oauthEnabledProviders);
|
267
|
+
return newState;
|
268
|
+
}
|
269
|
+
/**
|
270
|
+
* Check if OAuth is enabled for a provider
|
271
|
+
* @param providerName - Name of the provider
|
272
|
+
* @returns True if OAuth is enabled, false otherwise
|
273
|
+
*/
|
274
|
+
isOAuthEnabled(providerName) {
|
275
|
+
if (!this.settings) {
|
276
|
+
// Default to false if no settings available
|
277
|
+
return false;
|
278
|
+
}
|
279
|
+
const oauthEnabledProviders = this.settings.merged.oauthEnabledProviders || {};
|
280
|
+
return oauthEnabledProviders[providerName] ?? false;
|
281
|
+
}
|
282
|
+
/**
|
283
|
+
* Check for higher priority authentication methods
|
284
|
+
* @param providerName - Name of the provider to check
|
285
|
+
* @returns String describing higher priority auth method, null if none
|
286
|
+
*/
|
287
|
+
async getHigherPriorityAuth(providerName) {
|
288
|
+
if (!this.settings) {
|
289
|
+
return null;
|
290
|
+
}
|
291
|
+
const merged = this.settings.merged;
|
292
|
+
// Check for API keys (highest priority)
|
293
|
+
if (merged.providerApiKeys && merged.providerApiKeys[providerName]) {
|
294
|
+
return 'API Key';
|
295
|
+
}
|
296
|
+
// Check for keyfiles (second highest priority)
|
297
|
+
if (merged.providerKeyfiles && merged.providerKeyfiles[providerName]) {
|
298
|
+
return 'Keyfile';
|
299
|
+
}
|
300
|
+
// Check for environment variables
|
301
|
+
const envKeyName = `${providerName.toUpperCase()}_API_KEY`;
|
302
|
+
if (process.env[envKeyName]) {
|
303
|
+
return 'Environment Variable';
|
304
|
+
}
|
305
|
+
// For OpenAI-based providers, check if baseURL is compatible
|
306
|
+
if (providerName === 'qwen') {
|
307
|
+
const baseUrls = merged.providerBaseUrls || {};
|
308
|
+
const openaiBaseUrl = baseUrls['openai'];
|
309
|
+
if (openaiBaseUrl && !this.isQwenCompatibleUrl(openaiBaseUrl)) {
|
310
|
+
return 'OpenAI BaseURL Mismatch';
|
311
|
+
}
|
312
|
+
}
|
313
|
+
return null;
|
314
|
+
}
|
315
|
+
/**
|
316
|
+
* Check if a URL is compatible with Qwen OAuth
|
317
|
+
* @param url - The base URL to check
|
318
|
+
* @returns True if compatible, false otherwise
|
319
|
+
*/
|
320
|
+
isQwenCompatibleUrl(url) {
|
321
|
+
if (!url)
|
322
|
+
return true; // Default OpenAI endpoint is compatible
|
323
|
+
// Qwen-compatible URLs
|
324
|
+
const qwenDomains = ['dashscope.aliyuncs.com', 'qwen.com', 'api.qwen.com'];
|
325
|
+
try {
|
326
|
+
const urlObj = new URL(url);
|
327
|
+
return qwenDomains.some((domain) => urlObj.hostname.includes(domain));
|
328
|
+
}
|
329
|
+
catch {
|
330
|
+
return false; // Invalid URL format
|
331
|
+
}
|
332
|
+
}
|
333
|
+
}
|
334
|
+
//# sourceMappingURL=oauth-manager.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"oauth-manager.js","sourceRoot":"","sources":["../../../src/auth/oauth-manager.ts"],"names":[],"mappings":"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"}
|