@vybestack/llxprt-code 0.1.23-nightly.250824.52dcfe37 → 0.1.23-nightly.250826.6cba9007
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/dist/package.json +4 -3
- package/dist/src/auth/anthropic-oauth-provider.d.ts +50 -3
- package/dist/src/auth/anthropic-oauth-provider.js +287 -63
- package/dist/src/auth/anthropic-oauth-provider.js.map +1 -1
- package/dist/src/auth/gemini-oauth-provider.d.ts +34 -3
- package/dist/src/auth/gemini-oauth-provider.js +308 -14
- package/dist/src/auth/gemini-oauth-provider.js.map +1 -1
- package/dist/src/auth/migration.d.ts +26 -0
- package/dist/src/auth/migration.js +54 -0
- package/dist/src/auth/migration.js.map +1 -0
- package/dist/src/auth/oauth-manager.d.ts +24 -0
- package/dist/src/auth/oauth-manager.js +179 -14
- package/dist/src/auth/oauth-manager.js.map +1 -1
- package/dist/src/auth/oauth-manager.spec.js +10 -8
- package/dist/src/auth/oauth-manager.spec.js.map +1 -1
- package/dist/src/auth/qwen-oauth-provider.d.ts +59 -3
- package/dist/src/auth/qwen-oauth-provider.js +263 -41
- package/dist/src/auth/qwen-oauth-provider.js.map +1 -1
- package/dist/src/config/config.js +4 -1
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +1 -1
- package/dist/src/generated/git-commit.js +1 -1
- package/dist/src/providers/providerConfigUtils.js +2 -4
- package/dist/src/providers/providerConfigUtils.js.map +1 -1
- package/dist/src/providers/providerManagerInstance.js +18 -48
- package/dist/src/providers/providerManagerInstance.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.js +4 -0
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/ui/commands/authCommand.d.ts +9 -0
- package/dist/src/ui/commands/authCommand.js +92 -3
- package/dist/src/ui/commands/authCommand.js.map +1 -1
- package/dist/src/ui/commands/keyCommand.js +16 -54
- package/dist/src/ui/commands/keyCommand.js.map +1 -1
- package/dist/src/ui/commands/keyCommand.test.js +3 -3
- package/dist/src/ui/commands/keyCommand.test.js.map +1 -1
- package/dist/src/ui/commands/keyfileCommand.js +37 -39
- package/dist/src/ui/commands/keyfileCommand.js.map +1 -1
- package/dist/src/ui/commands/logoutCommand.d.ts +7 -0
- package/dist/src/ui/commands/logoutCommand.js +70 -0
- package/dist/src/ui/commands/logoutCommand.js.map +1 -0
- package/dist/src/ui/commands/profileCommand.js +3 -15
- package/dist/src/ui/commands/profileCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.test.js +5 -5
- package/dist/src/ui/commands/profileCommand.test.js.map +1 -1
- package/dist/src/ui/commands/statusCommand.d.ts +7 -0
- package/dist/src/ui/commands/statusCommand.js +71 -0
- package/dist/src/ui/commands/statusCommand.js.map +1 -0
- package/dist/src/ui/contexts/TodoContext.js +2 -2
- package/dist/src/ui/contexts/TodoContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
@@ -5,8 +5,6 @@
|
|
5
5
|
*/
|
6
6
|
import { ProviderManager, OpenAIProvider, AnthropicProvider, GeminiProvider, sanitizeForByteString, needsSanitization, } from '@vybestack/llxprt-code-core';
|
7
7
|
import { NodeFileSystem } from './IFileSystem.js';
|
8
|
-
import { homedir } from 'os';
|
9
|
-
import { join } from 'path';
|
10
8
|
import { LoadedSettings, USER_SETTINGS_PATH, } from '../config/settings.js';
|
11
9
|
import stripJsonComments from 'strip-json-comments';
|
12
10
|
import { OAuthManager } from '../auth/oauth-manager.js';
|
@@ -71,14 +69,16 @@ export function getProviderManager(config, allowBrowserEnvironment = false, sett
|
|
71
69
|
[])
|
72
70
|
: undefined;
|
73
71
|
}
|
74
|
-
//
|
72
|
+
// @plan:PLAN-20250823-AUTHFIXES.P15
|
73
|
+
// @requirement:REQ-004
|
74
|
+
// Create OAuth manager for providers with TokenStore integration
|
75
75
|
const tokenStore = new MultiProviderTokenStore();
|
76
76
|
const oauthManager = new OAuthManager(tokenStore, loadedSettings);
|
77
77
|
oauthManagerInstance = oauthManager;
|
78
|
-
// Register OAuth providers
|
79
|
-
oauthManager.registerProvider(new GeminiOAuthProvider());
|
80
|
-
oauthManager.registerProvider(new QwenOAuthProvider());
|
81
|
-
oauthManager.registerProvider(new AnthropicOAuthProvider());
|
78
|
+
// Register OAuth providers with TokenStore for persistence
|
79
|
+
oauthManager.registerProvider(new GeminiOAuthProvider(tokenStore));
|
80
|
+
oauthManager.registerProvider(new QwenOAuthProvider(tokenStore));
|
81
|
+
oauthManager.registerProvider(new AnthropicOAuthProvider(tokenStore));
|
82
82
|
// Set config BEFORE registering providers so logging wrapper works
|
83
83
|
if (config) {
|
84
84
|
providerManagerInstance.setConfig(config);
|
@@ -89,37 +89,13 @@ export function getProviderManager(config, allowBrowserEnvironment = false, sett
|
|
89
89
|
geminiProvider.setConfig(config);
|
90
90
|
}
|
91
91
|
providerManagerInstance.registerProvider(geminiProvider);
|
92
|
-
//
|
93
|
-
try {
|
94
|
-
const keyfilePath = join(homedir(), '.google_key');
|
95
|
-
if (fs.existsSync(keyfilePath)) {
|
96
|
-
const geminiApiKey = fs.readFileSync(keyfilePath, 'utf-8').trim();
|
97
|
-
if (geminiApiKey) {
|
98
|
-
geminiProvider.setApiKey(sanitizeApiKey(geminiApiKey));
|
99
|
-
}
|
100
|
-
}
|
101
|
-
}
|
102
|
-
catch (_error) {
|
103
|
-
// No Google keyfile available, that's OK - will use OAuth if available
|
104
|
-
}
|
92
|
+
// Gemini auth configuration removed - use explicit --key/--keyfile, /key//keyfile commands, profiles, env vars, or OAuth only
|
105
93
|
// Always register OpenAI provider
|
106
|
-
// Priority: Environment variable
|
94
|
+
// Priority: Environment variable only - no automatic keyfile loading
|
107
95
|
let openaiApiKey;
|
108
96
|
if (process.env.OPENAI_API_KEY) {
|
109
97
|
openaiApiKey = sanitizeApiKey(process.env.OPENAI_API_KEY);
|
110
98
|
}
|
111
|
-
if (!openaiApiKey) {
|
112
|
-
try {
|
113
|
-
const apiKeyPath = join(homedir(), '.openai_key');
|
114
|
-
if (fs.existsSync(apiKeyPath)) {
|
115
|
-
const rawKey = fs.readFileSync(apiKeyPath, 'utf-8').trim();
|
116
|
-
openaiApiKey = sanitizeApiKey(rawKey);
|
117
|
-
}
|
118
|
-
}
|
119
|
-
catch (_error) {
|
120
|
-
// No OpenAI keyfile available, that's OK
|
121
|
-
}
|
122
|
-
}
|
123
99
|
const openaiBaseUrl = process.env.OPENAI_BASE_URL;
|
124
100
|
if (process.env.DEBUG || process.env.VERBOSE) {
|
125
101
|
console.log('[ProviderManager] Initializing OpenAI provider with:', {
|
@@ -144,9 +120,15 @@ export function getProviderManager(config, allowBrowserEnvironment = false, sett
|
|
144
120
|
providerManagerInstance.registerProvider(openaiProvider);
|
145
121
|
// Register qwen as an alias to OpenAI provider with OAuth
|
146
122
|
// When user selects "--provider qwen", we create a separate OpenAI instance for Qwen
|
123
|
+
// Create a special config for qwen that ensures proper OAuth identification
|
124
|
+
const qwenProviderConfig = {
|
125
|
+
...openaiProviderConfig,
|
126
|
+
// Override any OAuth-related settings that might affect provider identification
|
127
|
+
forceQwenOAuth: true,
|
128
|
+
};
|
147
129
|
const qwenProvider = new OpenAIProvider(undefined, // No API key - force OAuth
|
148
|
-
|
149
|
-
|
130
|
+
'https://portal.qwen.ai/v1', // Set Qwen base URL to trigger OAuth enablement
|
131
|
+
qwenProviderConfig, oauthManager);
|
150
132
|
// Override the name to 'qwen' so it can be selected
|
151
133
|
Object.defineProperty(qwenProvider, 'name', {
|
152
134
|
value: 'qwen',
|
@@ -156,23 +138,11 @@ export function getProviderManager(config, allowBrowserEnvironment = false, sett
|
|
156
138
|
});
|
157
139
|
providerManagerInstance.registerProvider(qwenProvider);
|
158
140
|
// Always register Anthropic provider
|
159
|
-
// Priority: Environment variable
|
141
|
+
// Priority: Environment variable only - no automatic keyfile loading
|
160
142
|
let anthropicApiKey;
|
161
143
|
if (process.env.ANTHROPIC_API_KEY) {
|
162
144
|
anthropicApiKey = sanitizeApiKey(process.env.ANTHROPIC_API_KEY);
|
163
145
|
}
|
164
|
-
if (!anthropicApiKey) {
|
165
|
-
try {
|
166
|
-
const apiKeyPath = join(homedir(), '.anthropic_key');
|
167
|
-
if (fs.existsSync(apiKeyPath)) {
|
168
|
-
const rawKey = fs.readFileSync(apiKeyPath, 'utf-8').trim();
|
169
|
-
anthropicApiKey = sanitizeApiKey(rawKey);
|
170
|
-
}
|
171
|
-
}
|
172
|
-
catch (_error) {
|
173
|
-
// No Anthropic keyfile available, that's OK
|
174
|
-
}
|
175
|
-
}
|
176
146
|
const anthropicBaseUrl = process.env.ANTHROPIC_BASE_URL;
|
177
147
|
// Create provider config from user settings
|
178
148
|
const anthropicProviderConfig = {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"providerManagerInstance.js","sourceRoot":"","sources":["../../../src/providers/providerManagerInstance.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAe,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,
|
1
|
+
{"version":3,"file":"providerManagerInstance.js","sourceRoot":"","sources":["../../../src/providers/providerManagerInstance.ts"],"names":[],"mappings":"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"}
|
@@ -40,6 +40,8 @@ import { profileCommand } from '../ui/commands/profileCommand.js';
|
|
40
40
|
import { diagnosticsCommand } from '../ui/commands/diagnosticsCommand.js';
|
41
41
|
import { terminalSetupCommand } from '../ui/commands/terminalSetupCommand.js';
|
42
42
|
import { debugCommand } from '../ui/commands/debugCommands.js';
|
43
|
+
import { logoutCommand } from '../ui/commands/logoutCommand.js';
|
44
|
+
import { statusCommand } from '../ui/commands/statusCommand.js';
|
43
45
|
/**
|
44
46
|
* Loads the core, hard-coded slash commands that are an integral part
|
45
47
|
* of the Gemini CLI application.
|
@@ -95,6 +97,8 @@ export class BuiltinCommandLoader {
|
|
95
97
|
setupGithubCommand,
|
96
98
|
terminalSetupCommand,
|
97
99
|
debugCommand,
|
100
|
+
logoutCommand,
|
101
|
+
statusCommand,
|
98
102
|
];
|
99
103
|
return allDefinitions.filter((cmd) => cmd !== null);
|
100
104
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"BuiltinCommandLoader.js","sourceRoot":"","sources":["../../../src/services/BuiltinCommandLoader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;
|
1
|
+
{"version":3,"file":"BuiltinCommandLoader.js","sourceRoot":"","sources":["../../../src/services/BuiltinCommandLoader.ts"],"names":[],"mappings":"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"}
|
@@ -12,6 +12,15 @@ export declare class AuthCommandExecutor {
|
|
12
12
|
private showOAuthMenu;
|
13
13
|
private showProviderStatus;
|
14
14
|
private setProviderOAuth;
|
15
|
+
/**
|
16
|
+
* @plan PLAN-20250823-AUTHFIXES.P14
|
17
|
+
* @requirement REQ-002.3
|
18
|
+
* @pseudocode lines 26-63
|
19
|
+
* Logout from a specific provider
|
20
|
+
* @param provider - Name of the provider to logout from
|
21
|
+
* @returns MessageActionReturn with logout result
|
22
|
+
*/
|
23
|
+
private logoutProvider;
|
15
24
|
getAuthStatus(): Promise<string[]>;
|
16
25
|
}
|
17
26
|
export declare const authCommand: SlashCommand;
|
@@ -31,11 +31,15 @@ export class AuthCommandExecutor {
|
|
31
31
|
if (action === 'enable' || action === 'disable') {
|
32
32
|
return this.setProviderOAuth(provider, action === 'enable');
|
33
33
|
}
|
34
|
-
//
|
34
|
+
// Lines 15-17: Handle logout action (NEW) @pseudocode lines 15-17
|
35
|
+
if (action === 'logout' || action === 'signout') {
|
36
|
+
return this.logoutProvider(provider);
|
37
|
+
}
|
38
|
+
// Lines 19-24: Invalid action @pseudocode lines 19-24
|
35
39
|
return {
|
36
40
|
type: 'message',
|
37
41
|
messageType: 'error',
|
38
|
-
content: `Invalid action: ${action}. Use
|
42
|
+
content: `Invalid action: ${action}. Use enable, disable, or logout`,
|
39
43
|
};
|
40
44
|
}
|
41
45
|
async showOAuthMenu() {
|
@@ -61,7 +65,29 @@ export class AuthCommandExecutor {
|
|
61
65
|
const isAuthenticated = await this.oauthManager.isAuthenticated(provider);
|
62
66
|
let status = `OAuth for ${provider}: ${isEnabled ? 'ENABLED' : 'DISABLED'}`;
|
63
67
|
if (isEnabled && isAuthenticated) {
|
64
|
-
|
68
|
+
// Lines 70-85: Show token expiry information @pseudocode lines 70-85
|
69
|
+
const token = await this.oauthManager.getOAuthToken(provider);
|
70
|
+
if (token && token.expiry) {
|
71
|
+
// Lines 72-76: Calculate time until expiry
|
72
|
+
const expiryDate = new Date(token.expiry * 1000);
|
73
|
+
const timeUntilExpiry = Math.max(0, token.expiry - Date.now() / 1000);
|
74
|
+
const hours = Math.floor(timeUntilExpiry / 3600);
|
75
|
+
const minutes = Math.floor((timeUntilExpiry % 3600) / 60);
|
76
|
+
// Lines 78-85: Return detailed status with logout instruction
|
77
|
+
status =
|
78
|
+
`${provider} OAuth: Enabled and authenticated\n` +
|
79
|
+
`Token expires: ${expiryDate.toISOString()}\n` +
|
80
|
+
`Time remaining: ${hours}h ${minutes}m\n` +
|
81
|
+
`Use /auth ${provider} logout to sign out`;
|
82
|
+
return {
|
83
|
+
type: 'message',
|
84
|
+
messageType: 'info',
|
85
|
+
content: status,
|
86
|
+
};
|
87
|
+
}
|
88
|
+
else {
|
89
|
+
status += ' (authenticated)';
|
90
|
+
}
|
65
91
|
}
|
66
92
|
else if (isEnabled && !isAuthenticated) {
|
67
93
|
status += ' (not authenticated)';
|
@@ -134,6 +160,69 @@ export class AuthCommandExecutor {
|
|
134
160
|
};
|
135
161
|
}
|
136
162
|
}
|
163
|
+
/**
|
164
|
+
* @plan PLAN-20250823-AUTHFIXES.P14
|
165
|
+
* @requirement REQ-002.3
|
166
|
+
* @pseudocode lines 26-63
|
167
|
+
* Logout from a specific provider
|
168
|
+
* @param provider - Name of the provider to logout from
|
169
|
+
* @returns MessageActionReturn with logout result
|
170
|
+
*/
|
171
|
+
async logoutProvider(provider) {
|
172
|
+
try {
|
173
|
+
// Lines 28-35: Check if provider is supported
|
174
|
+
const supportedProviders = this.oauthManager.getSupportedProviders();
|
175
|
+
if (!supportedProviders.includes(provider)) {
|
176
|
+
return {
|
177
|
+
type: 'message',
|
178
|
+
messageType: 'error',
|
179
|
+
content: `Unknown provider: ${provider}. Supported providers: ${supportedProviders.join(', ')}`,
|
180
|
+
};
|
181
|
+
}
|
182
|
+
// Lines 38-49: Check if user is authenticated and perform logout
|
183
|
+
const isAuthenticated = await this.oauthManager.isAuthenticated(provider);
|
184
|
+
if (!isAuthenticated) {
|
185
|
+
// Still attempt logout in case there's an expired/invalid token to clean up
|
186
|
+
try {
|
187
|
+
await this.oauthManager.logout(provider);
|
188
|
+
}
|
189
|
+
catch (error) {
|
190
|
+
// OAuth manager failures should be treated as errors
|
191
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
192
|
+
return {
|
193
|
+
type: 'message',
|
194
|
+
messageType: 'error',
|
195
|
+
content: `Failed to logout from ${provider}: ${errorMessage}`,
|
196
|
+
};
|
197
|
+
}
|
198
|
+
// If logout succeeded for unauthenticated user, they had stale tokens
|
199
|
+
return {
|
200
|
+
type: 'message',
|
201
|
+
messageType: 'info',
|
202
|
+
content: `Successfully logged out of ${provider}`,
|
203
|
+
};
|
204
|
+
}
|
205
|
+
else {
|
206
|
+
// User is authenticated, perform logout
|
207
|
+
await this.oauthManager.logout(provider);
|
208
|
+
}
|
209
|
+
// Lines 51-55: Return success message
|
210
|
+
return {
|
211
|
+
type: 'message',
|
212
|
+
messageType: 'info',
|
213
|
+
content: `Successfully logged out of ${provider}`,
|
214
|
+
};
|
215
|
+
}
|
216
|
+
catch (error) {
|
217
|
+
// Lines 56-62: Handle errors
|
218
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
219
|
+
return {
|
220
|
+
type: 'message',
|
221
|
+
messageType: 'error',
|
222
|
+
content: `Failed to logout from ${provider}: ${errorMessage}`,
|
223
|
+
};
|
224
|
+
}
|
225
|
+
}
|
137
226
|
async getAuthStatus() {
|
138
227
|
try {
|
139
228
|
const statuses = await this.oauthManager.getAuthStatus();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"authCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/authCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,GAMZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EACL,eAAe,EACf,kBAAkB,GACnB,MAAM,4CAA4C,CAAC;AAEpD,MAAM,OAAO,mBAAmB;IACV;IAApB,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAElD,KAAK,CAAC,OAAO,CACX,OAAuB,EACvB,IAAa;QAEb,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAExB,4CAA4C;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;QAC9B,CAAC;QAED,uDAAuD;QACvD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,gCAAgC;QAChC,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC;QAC9D,CAAC;QAED,
|
1
|
+
{"version":3,"file":"authCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/authCommand.ts"],"names":[],"mappings":"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"}
|
@@ -18,8 +18,7 @@ export const keyCommand = {
|
|
18
18
|
content: 'No configuration available',
|
19
19
|
};
|
20
20
|
}
|
21
|
-
|
22
|
-
const useSettingsService = settingsService !== null;
|
21
|
+
// Settings service not needed for command-level auth
|
23
22
|
const providerManager = config.getProviderManager();
|
24
23
|
if (!providerManager) {
|
25
24
|
return {
|
@@ -33,65 +32,28 @@ export const keyCommand = {
|
|
33
32
|
const apiKey = args?.trim();
|
34
33
|
// If no key provided or 'none', remove the key
|
35
34
|
if (!apiKey || apiKey.toLowerCase() === 'none') {
|
36
|
-
// Clear the
|
35
|
+
// Clear authentication using the provider's method (which now stores in SettingsService)
|
37
36
|
if (activeProvider.setApiKey) {
|
38
37
|
activeProvider.setApiKey('');
|
39
|
-
if (useSettingsService && settingsService) {
|
40
|
-
// Use SettingsService to update provider settings
|
41
|
-
try {
|
42
|
-
await settingsService.updateSettings(providerName, {
|
43
|
-
apiKey: undefined,
|
44
|
-
});
|
45
|
-
}
|
46
|
-
catch (error) {
|
47
|
-
console.error('SettingsService error, using fallback:', error);
|
48
|
-
config.setEphemeralSetting('auth-key', undefined);
|
49
|
-
}
|
50
|
-
}
|
51
|
-
else {
|
52
|
-
// Fallback to direct ephemeral setting
|
53
|
-
config.setEphemeralSetting('auth-key', undefined);
|
54
|
-
}
|
55
|
-
// If this is the Gemini provider, we might need to switch auth mode
|
56
|
-
const requiresAuthRefresh = providerName === 'gemini';
|
57
|
-
if (requiresAuthRefresh) {
|
58
|
-
await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
|
59
|
-
}
|
60
|
-
const isPaidMode = activeProvider.isPaidMode?.() ?? true;
|
61
|
-
const paymentMessage = !isPaidMode && providerName === 'gemini'
|
62
|
-
? '\n✅ You are now in FREE MODE - using OAuth authentication'
|
63
|
-
: '';
|
64
|
-
return {
|
65
|
-
type: 'message',
|
66
|
-
messageType: 'info',
|
67
|
-
content: `API key removed for provider '${providerName}'${paymentMessage}`,
|
68
|
-
};
|
69
38
|
}
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
content: `Provider '${providerName}' does not support API key updates`,
|
75
|
-
};
|
39
|
+
// If this is the Gemini provider, we might need to switch auth mode
|
40
|
+
const requiresAuthRefresh = providerName === 'gemini';
|
41
|
+
if (requiresAuthRefresh) {
|
42
|
+
await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
|
76
43
|
}
|
44
|
+
const isPaidMode = activeProvider.isPaidMode?.() ?? true;
|
45
|
+
const paymentMessage = !isPaidMode && providerName === 'gemini'
|
46
|
+
? '\n✅ You are now in FREE MODE - using OAuth authentication'
|
47
|
+
: '';
|
48
|
+
return {
|
49
|
+
type: 'message',
|
50
|
+
messageType: 'info',
|
51
|
+
content: `API key removed for provider '${providerName}'${paymentMessage}`,
|
52
|
+
};
|
77
53
|
}
|
78
|
-
// Set the API key
|
54
|
+
// Set the API key using the provider's method (which now stores in SettingsService)
|
79
55
|
if (activeProvider.setApiKey) {
|
80
56
|
activeProvider.setApiKey(apiKey);
|
81
|
-
if (useSettingsService && settingsService) {
|
82
|
-
// Use SettingsService to update provider settings
|
83
|
-
try {
|
84
|
-
await settingsService.updateSettings(providerName, { apiKey });
|
85
|
-
}
|
86
|
-
catch (error) {
|
87
|
-
console.error('SettingsService error, using fallback:', error);
|
88
|
-
config.setEphemeralSetting('auth-key', apiKey);
|
89
|
-
}
|
90
|
-
}
|
91
|
-
else {
|
92
|
-
// Fallback to direct ephemeral setting
|
93
|
-
config.setEphemeralSetting('auth-key', apiKey);
|
94
|
-
}
|
95
57
|
// If this is the Gemini provider, we need to refresh auth to use API key mode
|
96
58
|
const requiresAuthRefresh = providerName === 'gemini';
|
97
59
|
if (requiresAuthRefresh) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"keyCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAiB;IACtC,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,gDAAgD;IAC7D,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,IAAY,EACkB,EAAE;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,4BAA4B;aACtC,CAAC;QACJ,CAAC;QAED,
|
1
|
+
{"version":3,"file":"keyCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.ts"],"names":[],"mappings":"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"}
|
@@ -44,7 +44,7 @@ describe('keyCommand', () => {
|
|
44
44
|
const testApiKey = 'test-api-key-12345';
|
45
45
|
const result = await keyCommand.action(mockContext, testApiKey);
|
46
46
|
expect(mockActiveProvider.setApiKey).toHaveBeenCalledWith(testApiKey);
|
47
|
-
|
47
|
+
// setEphemeralSetting is no longer called - auth is stored via SettingsService through activeProvider.setApiKey()
|
48
48
|
expect(result).toEqual({
|
49
49
|
type: 'message',
|
50
50
|
messageType: 'info',
|
@@ -57,7 +57,7 @@ describe('keyCommand', () => {
|
|
57
57
|
}
|
58
58
|
const result = await keyCommand.action(mockContext, '');
|
59
59
|
expect(mockActiveProvider.setApiKey).toHaveBeenCalledWith('');
|
60
|
-
|
60
|
+
// setEphemeralSetting is no longer called - auth is stored via SettingsService through activeProvider.setApiKey()
|
61
61
|
expect(result).toEqual({
|
62
62
|
type: 'message',
|
63
63
|
messageType: 'info',
|
@@ -70,7 +70,7 @@ describe('keyCommand', () => {
|
|
70
70
|
}
|
71
71
|
const result = await keyCommand.action(mockContext, 'none');
|
72
72
|
expect(mockActiveProvider.setApiKey).toHaveBeenCalledWith('');
|
73
|
-
|
73
|
+
// setEphemeralSetting is no longer called - auth is stored via SettingsService through activeProvider.setApiKey()
|
74
74
|
expect(result).toEqual({
|
75
75
|
type: 'message',
|
76
76
|
messageType: 'info',
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"keyCommand.test.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAElF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,WAA2B,CAAC;IAChC,IAAI,kBAIH,CAAC;IACF,IAAI,mBAGH,CAAC;IACF,IAAI,UAKH,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QAEnB,8BAA8B;QAC9B,kBAAkB,GAAG;YACnB,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;YAClB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;SAC1C,CAAC;QAEF,+BAA+B;QAC/B,mBAAmB,GAAG;YACpB,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC;YAC9D,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,eAAe,CAAC;SAChE,CAAC;QAEF,2CAA2C;QAC3C,UAAU,GAAG;YACX,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,mBAAmB,CAAC;YAChE,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;YAC5B,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;YACpB,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,uCAAuC;SAC3F,CAAC;QAEF,WAAW,GAAG,wBAAwB,CAAC;YACrC,QAAQ,EAAE;gBACR,MAAM,EAAE,UAAU;aACnB;SACgD,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAEhE,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACtE,
|
1
|
+
{"version":3,"file":"keyCommand.test.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.test.ts"],"names":[],"mappings":"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"}
|
@@ -62,14 +62,21 @@ export const keyfileCommand = {
|
|
62
62
|
// Handle removal
|
63
63
|
if (filePath === 'none') {
|
64
64
|
const removedPath = context.services.settings.getProviderKeyfile(providerName);
|
65
|
-
// Clear the
|
66
|
-
if (activeProvider
|
65
|
+
// Clear authentication using the provider's method (which now stores in SettingsService)
|
66
|
+
if ('clearAuth' in activeProvider &&
|
67
|
+
typeof activeProvider.clearAuth === 'function') {
|
68
|
+
activeProvider.clearAuth();
|
69
|
+
}
|
70
|
+
else if (activeProvider.setApiKey) {
|
71
|
+
// Fallback to clearing just the API key if clearAuth is not available
|
67
72
|
activeProvider.setApiKey('');
|
68
73
|
}
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
74
|
+
else {
|
75
|
+
return {
|
76
|
+
type: 'message',
|
77
|
+
messageType: 'error',
|
78
|
+
content: `Provider '${providerName}' does not support keyfile commands`,
|
79
|
+
};
|
73
80
|
}
|
74
81
|
// Remove from saved settings
|
75
82
|
if (removedPath) {
|
@@ -86,7 +93,7 @@ export const keyfileCommand = {
|
|
86
93
|
const resolvedPath = filePath.replace(/^~/, homedir());
|
87
94
|
// Check if file exists
|
88
95
|
await fs.access(resolvedPath);
|
89
|
-
//
|
96
|
+
// Verify the file is not empty
|
90
97
|
const apiKey = (await fs.readFile(resolvedPath, 'utf-8')).trim();
|
91
98
|
if (!apiKey) {
|
92
99
|
return {
|
@@ -95,46 +102,37 @@ export const keyfileCommand = {
|
|
95
102
|
content: 'The specified file is empty',
|
96
103
|
};
|
97
104
|
}
|
98
|
-
//
|
105
|
+
// Get the active provider
|
99
106
|
const activeProvider = providerManager.getActiveProvider();
|
100
107
|
const providerName = activeProvider.name;
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
context.services.config.setEphemeralSetting('auth-key', undefined);
|
108
|
-
}
|
109
|
-
// Check if we're now in paid mode
|
110
|
-
const isPaidMode = activeProvider.isPaidMode?.() ?? true;
|
111
|
-
const paymentWarning = isPaidMode
|
112
|
-
? '\nWARNING: You are now in PAID MODE - API usage will be charged to your account'
|
113
|
-
: '';
|
114
|
-
// Trigger payment mode check if available
|
115
|
-
const extendedContext = context;
|
116
|
-
if (extendedContext.checkPaymentModeChange) {
|
117
|
-
setTimeout(extendedContext.checkPaymentModeChange, 100);
|
118
|
-
}
|
119
|
-
return {
|
120
|
-
type: 'message',
|
121
|
-
messageType: 'info',
|
122
|
-
content: `API key loaded from ${resolvedPath} for provider '${providerName}'${paymentWarning}`,
|
123
|
-
};
|
108
|
+
// Store the keyfile PATH in SettingsService (ephemeral settings)
|
109
|
+
// The AuthPrecedenceResolver will read from here when needed
|
110
|
+
if (context.services.config) {
|
111
|
+
context.services.config.setEphemeralSetting('auth-keyfile', filePath);
|
112
|
+
// Remove any stored auth-key since we're using keyfile
|
113
|
+
context.services.config.setEphemeralSetting('auth-key', undefined);
|
124
114
|
}
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
115
|
+
// Check if we're now in paid mode
|
116
|
+
const isPaidMode = activeProvider.isPaidMode?.() ?? true;
|
117
|
+
const paymentWarning = isPaidMode
|
118
|
+
? '\nWARNING: You are now in PAID MODE - API usage will be charged to your account'
|
119
|
+
: '';
|
120
|
+
// Trigger payment mode check if available
|
121
|
+
const extendedContext = context;
|
122
|
+
if (extendedContext.checkPaymentModeChange) {
|
123
|
+
setTimeout(extendedContext.checkPaymentModeChange, 100);
|
131
124
|
}
|
125
|
+
return {
|
126
|
+
type: 'message',
|
127
|
+
messageType: 'info',
|
128
|
+
content: `API key loaded from ${resolvedPath} for provider '${providerName}'${paymentWarning}`,
|
129
|
+
};
|
132
130
|
}
|
133
131
|
catch (error) {
|
134
132
|
return {
|
135
133
|
type: 'message',
|
136
134
|
messageType: 'error',
|
137
|
-
content: `Failed to
|
135
|
+
content: `Failed to manage keyfile: ${error instanceof Error ? error.message : String(error)}`,
|
138
136
|
};
|
139
137
|
}
|
140
138
|
}
|
@@ -142,7 +140,7 @@ export const keyfileCommand = {
|
|
142
140
|
return {
|
143
141
|
type: 'message',
|
144
142
|
messageType: 'error',
|
145
|
-
content: `Failed to
|
143
|
+
content: `Failed to access provider: ${error instanceof Error ? error.message : String(error)}`,
|
146
144
|
};
|
147
145
|
}
|
148
146
|
},
|