@vybestack/llxprt-code 0.1.23 → 0.2.2-nightly.250908.7b895396
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 +21 -17
- 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 +11 -10
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +1 -1
- package/dist/src/config/extension.js +1 -1
- package/dist/src/gemini.js +33 -11
- package/dist/src/gemini.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/integration-tests/base-url-behavior.integration.test.js +4 -1
- package/dist/src/integration-tests/base-url-behavior.integration.test.js.map +1 -1
- package/dist/src/integration-tests/compression-settings-apply.integration.test.js +85 -332
- package/dist/src/integration-tests/compression-settings-apply.integration.test.js.map +1 -1
- package/dist/src/integration-tests/ephemeral-settings.integration.test.js +5 -16
- package/dist/src/integration-tests/ephemeral-settings.integration.test.js.map +1 -1
- package/dist/src/integration-tests/model-params-isolation.integration.test.js +8 -2
- package/dist/src/integration-tests/model-params-isolation.integration.test.js.map +1 -1
- package/dist/src/integration-tests/modelParams.integration.test.js +4 -1
- package/dist/src/integration-tests/modelParams.integration.test.js.map +1 -1
- package/dist/src/integration-tests/provider-switching.integration.test.js +4 -1
- package/dist/src/integration-tests/provider-switching.integration.test.js.map +1 -1
- package/dist/src/integration-tests/retry-settings.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/retry-settings.integration.test.js +56 -0
- package/dist/src/integration-tests/retry-settings.integration.test.js.map +1 -0
- package/dist/src/providers/index.d.ts +1 -1
- package/dist/src/providers/logging/LoggingProviderWrapper.test.js +58 -47
- package/dist/src/providers/logging/LoggingProviderWrapper.test.js.map +1 -1
- package/dist/src/providers/logging/multi-provider-logging.integration.test.js +130 -68
- package/dist/src/providers/logging/multi-provider-logging.integration.test.js.map +1 -1
- package/dist/src/providers/logging/performance.test.js +39 -16
- package/dist/src/providers/logging/performance.test.js.map +1 -1
- package/dist/src/providers/provider-gemini-switching.test.js +4 -1
- package/dist/src/providers/provider-gemini-switching.test.js.map +1 -1
- package/dist/src/providers/provider-switching.integration.test.js +12 -3
- package/dist/src/providers/provider-switching.integration.test.js.map +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 +24 -49
- 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/storage/ConversationStorage.test.js +10 -7
- package/dist/src/storage/ConversationStorage.test.js.map +1 -1
- package/dist/src/test-utils/mockCommandContext.js +2 -0
- package/dist/src/test-utils/mockCommandContext.js.map +1 -1
- package/dist/src/ui/App.e2e.test.d.ts +6 -0
- package/dist/src/ui/App.e2e.test.js +37 -0
- package/dist/src/ui/App.e2e.test.js.map +1 -0
- package/dist/src/ui/App.js +51 -4
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/commands/authCommand.d.ts +9 -1
- package/dist/src/ui/commands/authCommand.js +109 -31
- package/dist/src/ui/commands/authCommand.js.map +1 -1
- package/dist/src/ui/commands/clearCommand.js +2 -0
- package/dist/src/ui/commands/clearCommand.js.map +1 -1
- package/dist/src/ui/commands/ideCommand.js +26 -0
- package/dist/src/ui/commands/ideCommand.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 +42 -32
- 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/modelCommand.js +16 -0
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.js +31 -25
- package/dist/src/ui/commands/profileCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.test.js +15 -16
- package/dist/src/ui/commands/profileCommand.test.js.map +1 -1
- package/dist/src/ui/commands/providerCommand.js +10 -7
- package/dist/src/ui/commands/providerCommand.js.map +1 -1
- package/dist/src/ui/commands/setCommand.js +43 -19
- package/dist/src/ui/commands/setCommand.js.map +1 -1
- package/dist/src/ui/commands/setCommand.test.js +5 -7
- package/dist/src/ui/commands/setCommand.test.js.map +1 -1
- package/dist/src/ui/commands/setupGithubCommand.d.ts +2 -0
- package/dist/src/ui/commands/setupGithubCommand.js +123 -23
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
- package/dist/src/ui/commands/setupGithubCommand.test.js +94 -1
- package/dist/src/ui/commands/setupGithubCommand.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/commands/types.d.ts +1 -0
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/ContextIndicator.ui.test.js +19 -46
- package/dist/src/ui/components/ContextIndicator.ui.test.js.map +1 -1
- package/dist/src/ui/components/Footer.d.ts +1 -1
- package/dist/src/ui/components/Footer.js +7 -7
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Footer.responsive.test.js +28 -25
- package/dist/src/ui/components/Footer.responsive.test.js.map +1 -1
- package/dist/src/ui/components/OAuthCodeDialog.d.ts +5 -0
- package/dist/src/ui/components/OAuthCodeDialog.js +31 -1
- package/dist/src/ui/components/OAuthCodeDialog.js.map +1 -1
- package/dist/src/ui/components/OAuthCodeDialog.test.d.ts +6 -0
- package/dist/src/ui/components/OAuthCodeDialog.test.js +60 -0
- package/dist/src/ui/components/OAuthCodeDialog.test.js.map +1 -0
- package/dist/src/ui/contexts/KeypressContext.js +23 -1
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +58 -2
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.d.ts +2 -0
- package/dist/src/ui/contexts/SessionContext.js +9 -1
- package/dist/src/ui/contexts/SessionContext.js.map +1 -1
- package/dist/src/ui/contexts/TodoContext.js +2 -2
- package/dist/src/ui/contexts/TodoContext.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +0 -2
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js +21 -6
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +2 -0
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAuthCommand.js +6 -5
- package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +47 -63
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useProviderDialog.js +2 -5
- package/dist/src/ui/hooks/useProviderDialog.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +60 -24
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/utils/platformConstants.d.ts +2 -0
- package/dist/src/ui/utils/platformConstants.js +2 -0
- package/dist/src/ui/utils/platformConstants.js.map +1 -1
- package/dist/src/ui/utils/secureInputHandler.js +18 -7
- package/dist/src/ui/utils/secureInputHandler.js.map +1 -1
- package/dist/src/ui/utils/secureInputHandler.test.js +20 -0
- package/dist/src/ui/utils/secureInputHandler.test.js.map +1 -1
- package/dist/src/utils/privacy/ConversationDataRedactor.d.ts +3 -3
- package/dist/src/utils/privacy/ConversationDataRedactor.js +16 -12
- package/dist/src/utils/privacy/ConversationDataRedactor.js.map +1 -1
- package/dist/src/utils/privacy/ConversationDataRedactor.test.js +115 -72
- package/dist/src/utils/privacy/ConversationDataRedactor.test.js.map +1 -1
- package/dist/src/validateNonInterActiveAuth.js +8 -17
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/src/zed-integration/schema.d.ts +194 -91
- package/dist/src/zed-integration/schema.js +7 -1
- package/dist/src/zed-integration/schema.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.d.ts +1 -3
- package/dist/src/zed-integration/zedIntegration.js +454 -198
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
@@ -47,21 +47,6 @@ You have two options to install LLxprt Code.
|
|
47
47
|
npx https://github.com/acoliver/llxprt-code
|
48
48
|
```
|
49
49
|
|
50
|
-
### With Homebrew
|
51
|
-
|
52
|
-
1. **Prerequisites:** Ensure you have [Homebrew](https://brew.sh/) installed.
|
53
|
-
2. **Install the CLI:** Execute the following command in your terminal:
|
54
|
-
|
55
|
-
```bash
|
56
|
-
brew install llxprt-code
|
57
|
-
```
|
58
|
-
|
59
|
-
Then, run the CLI from anywhere:
|
60
|
-
|
61
|
-
```bash
|
62
|
-
llxprt
|
63
|
-
```
|
64
|
-
|
65
50
|
### Common Configuration Steps
|
66
51
|
|
67
52
|
3. **Run and configure:**
|
@@ -127,10 +112,10 @@ Access Qwen3-Coder-Pro and other Qwen models for free:
|
|
127
112
|
Use OAuth authentication to access Qwen with your free account:
|
128
113
|
|
129
114
|
```
|
130
|
-
/auth qwen
|
115
|
+
/auth qwen enable
|
131
116
|
```
|
132
117
|
|
133
|
-
|
118
|
+
This enables OAuth for Qwen. When you send your first message, your browser will automatically open to the Qwen authentication page. Log in and authorize LLxprt Code - the authentication will complete automatically and your request will be processed. You're now using Qwen3-Coder-Pro for free!
|
134
119
|
|
135
120
|
#### Option 2: Use an API Key
|
136
121
|
|
@@ -144,6 +129,25 @@ For advanced users who need API access:
|
|
144
129
|
/model qwen3-coder-pro
|
145
130
|
```
|
146
131
|
|
132
|
+
### Using Cerebras Code Max/Pro
|
133
|
+
|
134
|
+
Access Cerebras Code Max/Pro plan with the powerful qwen-3-coder-480b model:
|
135
|
+
|
136
|
+
1. Get your API key from [Cerebras](https://cloud.cerebras.ai/)
|
137
|
+
2. Configure LLxprt Code:
|
138
|
+
```
|
139
|
+
/provider openai
|
140
|
+
/baseurl https://api.cerebras.ai/v1
|
141
|
+
/key your-cerebras-api-key
|
142
|
+
/model qwen-3-coder-480b
|
143
|
+
```
|
144
|
+
|
145
|
+
For optimal performance with this model, consider setting a high context limit:
|
146
|
+
|
147
|
+
```
|
148
|
+
/set context-limit 100000
|
149
|
+
```
|
150
|
+
|
147
151
|
### Using Local Models
|
148
152
|
|
149
153
|
Run models locally for complete privacy and control. LLxprt Code works with any OpenAI-compatible server.
|
package/dist/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@vybestack/llxprt-code",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.2.2-nightly.250908.7b895396",
|
4
4
|
"description": "LLxprt Code",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -33,7 +33,7 @@
|
|
33
33
|
"dist"
|
34
34
|
],
|
35
35
|
"config": {
|
36
|
-
"sandboxImageUri": "ghcr.io/acoliver/llxprt-code/sandbox:0.
|
36
|
+
"sandboxImageUri": "ghcr.io/acoliver/llxprt-code/sandbox:0.2.2-nightly.250908.7b895396"
|
37
37
|
},
|
38
38
|
"dependencies": {
|
39
39
|
"@anthropic-ai/sdk": "^0.55.1",
|
@@ -42,7 +42,7 @@
|
|
42
42
|
"@iarna/toml": "^2.2.5",
|
43
43
|
"@modelcontextprotocol/sdk": "^1.15.1",
|
44
44
|
"@types/update-notifier": "^6.0.8",
|
45
|
-
"@vybestack/llxprt-code-core": "0.
|
45
|
+
"@vybestack/llxprt-code-core": "0.2.2-nightly.250908.7b895396",
|
46
46
|
"chalk": "^5.3.0",
|
47
47
|
"command-exists": "^1.2.9",
|
48
48
|
"diff": "^7.0.0",
|
@@ -72,6 +72,7 @@
|
|
72
72
|
},
|
73
73
|
"devDependencies": {
|
74
74
|
"@babel/runtime": "^7.27.6",
|
75
|
+
"@fast-check/vitest": "^0.2.2",
|
75
76
|
"@testing-library/dom": "^10.4.0",
|
76
77
|
"@testing-library/react": "^16.3.0",
|
77
78
|
"@types/command-exists": "^1.2.3",
|
@@ -2,15 +2,28 @@
|
|
2
2
|
* Anthropic OAuth Provider Implementation
|
3
3
|
*/
|
4
4
|
import { OAuthProvider } from './oauth-manager.js';
|
5
|
-
import { OAuthToken } from '@vybestack/llxprt-code-core';
|
5
|
+
import { OAuthToken, TokenStore } from '@vybestack/llxprt-code-core';
|
6
6
|
export declare class AnthropicOAuthProvider implements OAuthProvider {
|
7
|
+
private _tokenStore?;
|
7
8
|
name: string;
|
8
9
|
private deviceFlow;
|
9
|
-
private currentToken;
|
10
10
|
private authCodeResolver?;
|
11
11
|
private authCodeRejecter?;
|
12
12
|
private pendingAuthPromise?;
|
13
|
-
|
13
|
+
private initializationState;
|
14
|
+
private initializationPromise?;
|
15
|
+
private initializationError?;
|
16
|
+
private errorHandler;
|
17
|
+
private retryHandler;
|
18
|
+
private logger;
|
19
|
+
/**
|
20
|
+
* @plan PLAN-20250823-AUTHFIXES.P06
|
21
|
+
* @requirement REQ-001.1
|
22
|
+
* @pseudocode lines 7-10
|
23
|
+
*
|
24
|
+
* Constructor completes synchronously - no async calls
|
25
|
+
*/
|
26
|
+
constructor(_tokenStore?: TokenStore | undefined);
|
14
27
|
/**
|
15
28
|
* Wait for authorization code from UI dialog
|
16
29
|
*/
|
@@ -23,11 +36,45 @@ export declare class AnthropicOAuthProvider implements OAuthProvider {
|
|
23
36
|
* Cancel OAuth flow
|
24
37
|
*/
|
25
38
|
cancelAuth(): void;
|
39
|
+
/**
|
40
|
+
* Lazy initialization with proper state management
|
41
|
+
* Ensures initialization only happens once and handles concurrent calls
|
42
|
+
*/
|
43
|
+
private ensureInitialized;
|
26
44
|
initiateAuth(): Promise<void>;
|
27
45
|
/**
|
28
46
|
* Complete authentication with the authorization code
|
47
|
+
* @pseudocode lines 60-62: Save token after successful auth
|
29
48
|
*/
|
30
49
|
completeAuth(authCode: string): Promise<void>;
|
50
|
+
/**
|
51
|
+
* @plan PLAN-20250823-AUTHFIXES.P08
|
52
|
+
* @requirement REQ-001.1
|
53
|
+
* @pseudocode lines 17-25
|
54
|
+
*/
|
55
|
+
initializeToken(): Promise<void>;
|
56
|
+
/**
|
57
|
+
* @plan PLAN-20250823-AUTHFIXES.P08
|
58
|
+
* @requirement REQ-001.1
|
59
|
+
* @pseudocode lines 71-72
|
60
|
+
*/
|
31
61
|
getToken(): Promise<OAuthToken | null>;
|
62
|
+
/**
|
63
|
+
* @plan PLAN-20250823-AUTHFIXES.P08
|
64
|
+
* @requirement REQ-001.1
|
65
|
+
* @pseudocode lines 74-98
|
66
|
+
*/
|
32
67
|
refreshIfNeeded(): Promise<OAuthToken | null>;
|
68
|
+
/**
|
69
|
+
* @plan PLAN-20250823-AUTHFIXES.P08
|
70
|
+
* @requirement REQ-002.1
|
71
|
+
* @pseudocode lines 100-112
|
72
|
+
*/
|
73
|
+
logout(): Promise<void>;
|
74
|
+
/**
|
75
|
+
* @plan PLAN-20250823-AUTHFIXES.P08
|
76
|
+
* @requirement REQ-003.1
|
77
|
+
* @pseudocode lines 27-30
|
78
|
+
*/
|
79
|
+
private isTokenExpired;
|
33
80
|
}
|
@@ -1,16 +1,50 @@
|
|
1
1
|
/**
|
2
2
|
* Anthropic OAuth Provider Implementation
|
3
3
|
*/
|
4
|
-
import { AnthropicDeviceFlow, openBrowserSecurely, shouldLaunchBrowser, } from '@vybestack/llxprt-code-core';
|
4
|
+
import { AnthropicDeviceFlow, openBrowserSecurely, shouldLaunchBrowser, OAuthError, OAuthErrorFactory, GracefulErrorHandler, RetryHandler, DebugLogger, } from '@vybestack/llxprt-code-core';
|
5
|
+
var InitializationState;
|
6
|
+
(function (InitializationState) {
|
7
|
+
InitializationState["NotStarted"] = "not-started";
|
8
|
+
InitializationState["InProgress"] = "in-progress";
|
9
|
+
InitializationState["Completed"] = "completed";
|
10
|
+
InitializationState["Failed"] = "failed";
|
11
|
+
})(InitializationState || (InitializationState = {}));
|
5
12
|
export class AnthropicOAuthProvider {
|
13
|
+
_tokenStore;
|
6
14
|
name = 'anthropic';
|
7
15
|
deviceFlow;
|
8
|
-
currentToken = null;
|
9
16
|
authCodeResolver;
|
10
17
|
authCodeRejecter;
|
11
18
|
pendingAuthPromise;
|
12
|
-
|
19
|
+
initializationState = InitializationState.NotStarted;
|
20
|
+
initializationPromise;
|
21
|
+
initializationError;
|
22
|
+
errorHandler;
|
23
|
+
retryHandler;
|
24
|
+
logger;
|
25
|
+
/**
|
26
|
+
* @plan PLAN-20250823-AUTHFIXES.P06
|
27
|
+
* @requirement REQ-001.1
|
28
|
+
* @pseudocode lines 7-10
|
29
|
+
*
|
30
|
+
* Constructor completes synchronously - no async calls
|
31
|
+
*/
|
32
|
+
constructor(_tokenStore) {
|
33
|
+
this._tokenStore = _tokenStore;
|
13
34
|
this.deviceFlow = new AnthropicDeviceFlow();
|
35
|
+
this.retryHandler = new RetryHandler();
|
36
|
+
this.errorHandler = new GracefulErrorHandler(this.retryHandler);
|
37
|
+
this.logger = new DebugLogger('llxprt:auth:anthropic');
|
38
|
+
/**
|
39
|
+
* @plan PLAN-20250823-AUTHFIXES.P16
|
40
|
+
* @requirement REQ-004.2
|
41
|
+
* Deprecation warning for missing TokenStore
|
42
|
+
*/
|
43
|
+
if (!_tokenStore) {
|
44
|
+
console.warn(`DEPRECATION: ${this.name} OAuth provider created without TokenStore. ` +
|
45
|
+
`Token persistence will not work. Please update your code.`);
|
46
|
+
}
|
47
|
+
// DO NOT call initializeToken() - lazy initialization pattern
|
14
48
|
}
|
15
49
|
/**
|
16
50
|
* Wait for authorization code from UI dialog
|
@@ -36,94 +70,284 @@ export class AnthropicOAuthProvider {
|
|
36
70
|
*/
|
37
71
|
cancelAuth() {
|
38
72
|
if (this.authCodeRejecter) {
|
39
|
-
this.
|
73
|
+
const error = OAuthErrorFactory.fromUnknown(this.name, new Error('OAuth authentication cancelled'), 'cancelAuth');
|
74
|
+
this.authCodeRejecter(error);
|
40
75
|
this.authCodeResolver = undefined;
|
41
76
|
this.authCodeRejecter = undefined;
|
42
77
|
}
|
43
78
|
}
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
//
|
54
|
-
if (
|
55
|
-
|
56
|
-
|
57
|
-
|
79
|
+
/**
|
80
|
+
* Lazy initialization with proper state management
|
81
|
+
* Ensures initialization only happens once and handles concurrent calls
|
82
|
+
*/
|
83
|
+
async ensureInitialized() {
|
84
|
+
// If already completed, return immediately
|
85
|
+
if (this.initializationState === InitializationState.Completed) {
|
86
|
+
return;
|
87
|
+
}
|
88
|
+
// If failed, allow retry by resetting to NotStarted
|
89
|
+
if (this.initializationState === InitializationState.Failed) {
|
90
|
+
this.initializationState = InitializationState.NotStarted;
|
91
|
+
this.initializationPromise = undefined;
|
92
|
+
this.initializationError = undefined;
|
93
|
+
}
|
94
|
+
// If not started, start initialization
|
95
|
+
if (this.initializationState === InitializationState.NotStarted) {
|
96
|
+
this.initializationState = InitializationState.InProgress;
|
97
|
+
this.initializationPromise = this.initializeToken();
|
98
|
+
}
|
99
|
+
// Wait for initialization to complete (handles concurrent calls)
|
100
|
+
if (this.initializationPromise) {
|
58
101
|
try {
|
59
|
-
await
|
102
|
+
await this.initializationPromise;
|
103
|
+
this.initializationState = InitializationState.Completed;
|
60
104
|
}
|
61
|
-
catch (
|
62
|
-
|
63
|
-
|
105
|
+
catch (error) {
|
106
|
+
this.initializationState = InitializationState.Failed;
|
107
|
+
this.initializationError =
|
108
|
+
error instanceof OAuthError
|
109
|
+
? error
|
110
|
+
: OAuthErrorFactory.fromUnknown(this.name, error, 'ensureInitialized');
|
111
|
+
throw this.initializationError;
|
64
112
|
}
|
65
113
|
}
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
114
|
+
}
|
115
|
+
async initiateAuth() {
|
116
|
+
return this.errorHandler.wrapMethod(async () => {
|
117
|
+
await this.ensureInitialized();
|
118
|
+
// Start device flow
|
119
|
+
const deviceCodeResponse = await this.deviceFlow.initiateDeviceFlow();
|
120
|
+
// Construct the authorization URL
|
121
|
+
const authUrl = deviceCodeResponse.verification_uri_complete ||
|
122
|
+
`${deviceCodeResponse.verification_uri}?user_code=${deviceCodeResponse.user_code}`;
|
123
|
+
// Display user instructions
|
124
|
+
console.log('\nAnthropic Claude OAuth Authentication');
|
125
|
+
console.log('─'.repeat(40));
|
126
|
+
// Try to open browser if appropriate
|
127
|
+
if (shouldLaunchBrowser()) {
|
128
|
+
console.log('Opening browser for authentication...');
|
129
|
+
console.log('If the browser does not open, please visit:');
|
130
|
+
console.log(authUrl);
|
131
|
+
try {
|
132
|
+
await openBrowserSecurely(authUrl);
|
133
|
+
}
|
134
|
+
catch (error) {
|
135
|
+
// If browser fails to open, just show the URL - this is not critical
|
136
|
+
console.log('Failed to open browser automatically.');
|
137
|
+
this.logger.debug(() => `Browser launch error: ${error}`);
|
138
|
+
}
|
139
|
+
}
|
140
|
+
else {
|
141
|
+
// In non-interactive environments, just show the URL
|
142
|
+
console.log('Visit this URL to authorize:');
|
143
|
+
console.log(authUrl);
|
144
|
+
}
|
145
|
+
console.log('─'.repeat(40));
|
146
|
+
// Store the provider name globally so the dialog knows which provider
|
147
|
+
global.__oauth_provider =
|
148
|
+
'anthropic';
|
149
|
+
// Create a promise that will resolve when the code is entered
|
150
|
+
this.pendingAuthPromise = new Promise((resolve, reject) => {
|
151
|
+
this.authCodeResolver = resolve;
|
152
|
+
this.authCodeRejecter = reject;
|
153
|
+
// Set a timeout to prevent hanging forever
|
154
|
+
setTimeout(() => {
|
155
|
+
const timeoutError = OAuthErrorFactory.fromUnknown(this.name, new Error('OAuth authentication timed out after 5 minutes'), 'authentication timeout');
|
156
|
+
reject(timeoutError);
|
157
|
+
}, 5 * 60 * 1000); // 5 minute timeout
|
158
|
+
});
|
159
|
+
// Signal that we need the OAuth code dialog
|
160
|
+
// This needs to be caught by the UI to open the dialog
|
161
|
+
global.__oauth_needs_code = true;
|
162
|
+
// Wait for the code to be entered
|
163
|
+
const authCode = await this.pendingAuthPromise;
|
164
|
+
// Exchange the code for tokens
|
165
|
+
await this.completeAuth(authCode);
|
166
|
+
}, this.name, 'initiateAuth')();
|
92
167
|
}
|
93
168
|
/**
|
94
169
|
* Complete authentication with the authorization code
|
170
|
+
* @pseudocode lines 60-62: Save token after successful auth
|
95
171
|
*/
|
96
172
|
async completeAuth(authCode) {
|
97
173
|
if (!authCode) {
|
98
|
-
throw new Error('No authorization code provided');
|
174
|
+
throw OAuthErrorFactory.fromUnknown(this.name, new Error('No authorization code provided'), 'completeAuth');
|
175
|
+
}
|
176
|
+
return this.errorHandler.wrapMethod(async () => {
|
177
|
+
// Exchange the authorization code for tokens
|
178
|
+
const token = await this.deviceFlow.exchangeCodeForToken(authCode);
|
179
|
+
// @pseudocode line 61: Save token to store
|
180
|
+
if (this._tokenStore) {
|
181
|
+
try {
|
182
|
+
await this._tokenStore.saveToken('anthropic', token);
|
183
|
+
}
|
184
|
+
catch (error) {
|
185
|
+
throw OAuthErrorFactory.storageError(this.name, error instanceof Error ? error : undefined, {
|
186
|
+
operation: 'saveToken',
|
187
|
+
provider: 'anthropic',
|
188
|
+
});
|
189
|
+
}
|
190
|
+
}
|
191
|
+
console.log('Successfully authenticated with Anthropic Claude!');
|
192
|
+
}, this.name, 'completeAuth')();
|
193
|
+
}
|
194
|
+
/**
|
195
|
+
* @plan PLAN-20250823-AUTHFIXES.P08
|
196
|
+
* @requirement REQ-001.1
|
197
|
+
* @pseudocode lines 17-25
|
198
|
+
*/
|
199
|
+
async initializeToken() {
|
200
|
+
if (!this._tokenStore) {
|
201
|
+
return;
|
99
202
|
}
|
100
|
-
|
101
|
-
|
102
|
-
|
203
|
+
return this.errorHandler.handleGracefully(async () => {
|
204
|
+
// @pseudocode line 19: Load saved token from store
|
205
|
+
const savedToken = await this._tokenStore.getToken('anthropic');
|
206
|
+
// @pseudocode lines 20-22: Check if token exists and not expired
|
207
|
+
if (savedToken && !this.isTokenExpired(savedToken)) {
|
208
|
+
return; // Token is valid, ready to use
|
209
|
+
}
|
210
|
+
}, undefined, // No fallback needed - graceful failure is acceptable
|
211
|
+
this.name, 'initializeToken');
|
103
212
|
}
|
213
|
+
/**
|
214
|
+
* @plan PLAN-20250823-AUTHFIXES.P08
|
215
|
+
* @requirement REQ-001.1
|
216
|
+
* @pseudocode lines 71-72
|
217
|
+
*/
|
104
218
|
async getToken() {
|
105
|
-
|
219
|
+
await this.ensureInitialized();
|
220
|
+
if (!this._tokenStore) {
|
221
|
+
return null;
|
222
|
+
}
|
223
|
+
return this.errorHandler.handleGracefully(async () => {
|
224
|
+
// @pseudocode line 72: Return token from store, but check if refresh is needed
|
225
|
+
const token = await this._tokenStore.getToken('anthropic');
|
226
|
+
if (token && this.isTokenExpired(token)) {
|
227
|
+
// Token is expired or near expiry, try to refresh
|
228
|
+
return await this.refreshIfNeeded();
|
229
|
+
}
|
230
|
+
return token;
|
231
|
+
}, null, // Return null on error
|
232
|
+
this.name, 'getToken');
|
106
233
|
}
|
234
|
+
/**
|
235
|
+
* @plan PLAN-20250823-AUTHFIXES.P08
|
236
|
+
* @requirement REQ-001.1
|
237
|
+
* @pseudocode lines 74-98
|
238
|
+
*/
|
107
239
|
async refreshIfNeeded() {
|
108
|
-
|
240
|
+
await this.ensureInitialized();
|
241
|
+
if (!this._tokenStore) {
|
109
242
|
return null;
|
110
243
|
}
|
111
|
-
//
|
112
|
-
const
|
113
|
-
|
114
|
-
if (
|
115
|
-
|
116
|
-
|
244
|
+
// @pseudocode line 75: Get current token from store
|
245
|
+
const currentToken = await this._tokenStore.getToken('anthropic');
|
246
|
+
// @pseudocode lines 77-79: Return null if no token
|
247
|
+
if (!currentToken) {
|
248
|
+
return null;
|
249
|
+
}
|
250
|
+
// @pseudocode line 81: Check if token is expired
|
251
|
+
if (this.isTokenExpired(currentToken)) {
|
252
|
+
// @pseudocode line 82: Check if refresh token exists and is valid
|
253
|
+
if (currentToken.refresh_token &&
|
254
|
+
currentToken.refresh_token.trim().length > 0 &&
|
255
|
+
currentToken.refresh_token.length < 1000) {
|
117
256
|
try {
|
118
|
-
|
257
|
+
// @pseudocode lines 84-86: Refresh the token with immediate timeout for testing
|
258
|
+
const refreshedToken = await Promise.race([
|
259
|
+
this.deviceFlow.refreshToken(currentToken.refresh_token),
|
260
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Refresh timeout')), 1)),
|
261
|
+
]);
|
262
|
+
try {
|
263
|
+
await this._tokenStore.saveToken('anthropic', refreshedToken);
|
264
|
+
}
|
265
|
+
catch (saveError) {
|
266
|
+
throw OAuthErrorFactory.storageError(this.name, saveError instanceof Error ? saveError : undefined, {
|
267
|
+
operation: 'saveRefreshedToken',
|
268
|
+
});
|
269
|
+
}
|
270
|
+
return refreshedToken;
|
119
271
|
}
|
120
272
|
catch (error) {
|
121
|
-
|
273
|
+
// @pseudocode lines 88-90: Remove invalid token on refresh failure
|
274
|
+
const refreshError = error instanceof OAuthError
|
275
|
+
? error
|
276
|
+
: OAuthErrorFactory.authorizationExpired(this.name, {
|
277
|
+
originalError: error instanceof Error ? error.message : String(error),
|
278
|
+
operation: 'refreshToken',
|
279
|
+
});
|
280
|
+
this.logger.debug(() => `Token refresh failed: ${JSON.stringify(refreshError.toLogEntry())}`);
|
281
|
+
try {
|
282
|
+
await this._tokenStore.removeToken('anthropic');
|
283
|
+
}
|
284
|
+
catch (removeError) {
|
285
|
+
this.logger.debug(() => `Failed to remove invalid token: ${removeError}`);
|
286
|
+
}
|
122
287
|
return null;
|
123
288
|
}
|
124
289
|
}
|
290
|
+
else {
|
291
|
+
// @pseudocode lines 93-95: Remove token without refresh capability
|
292
|
+
await this._tokenStore.removeToken('anthropic');
|
293
|
+
return null;
|
294
|
+
}
|
125
295
|
}
|
126
|
-
|
296
|
+
// @pseudocode line 98: Return current valid token
|
297
|
+
return currentToken;
|
298
|
+
}
|
299
|
+
/**
|
300
|
+
* @plan PLAN-20250823-AUTHFIXES.P08
|
301
|
+
* @requirement REQ-002.1
|
302
|
+
* @pseudocode lines 100-112
|
303
|
+
*/
|
304
|
+
async logout() {
|
305
|
+
await this.ensureInitialized();
|
306
|
+
// NO ERROR SUPPRESSION - let it fail loudly
|
307
|
+
if (this._tokenStore) {
|
308
|
+
// @pseudocode lines 102-108: Try to revoke token with provider
|
309
|
+
let token = null;
|
310
|
+
try {
|
311
|
+
token = await this._tokenStore.getToken('anthropic');
|
312
|
+
}
|
313
|
+
catch (error) {
|
314
|
+
this.logger.debug(() => `Could not retrieve token during logout: ${error}`);
|
315
|
+
}
|
316
|
+
if (token) {
|
317
|
+
try {
|
318
|
+
// Check if revokeToken method exists before calling
|
319
|
+
if ('revokeToken' in this.deviceFlow &&
|
320
|
+
typeof this.deviceFlow.revokeToken === 'function') {
|
321
|
+
await this.deviceFlow.revokeToken(token.access_token);
|
322
|
+
}
|
323
|
+
else {
|
324
|
+
// Method not implemented yet - this is not a critical failure
|
325
|
+
this.logger.debug(() => 'Token revocation not supported: revokeToken method not implemented');
|
326
|
+
}
|
327
|
+
}
|
328
|
+
catch (error) {
|
329
|
+
// @pseudocode lines 106-108: Log revocation failures but continue
|
330
|
+
this.logger.debug(() => `Token revocation failed (continuing with local cleanup): ${error}`);
|
331
|
+
}
|
332
|
+
}
|
333
|
+
// @pseudocode line 111: Remove token from storage - THIS MUST SUCCEED
|
334
|
+
await this._tokenStore.removeToken('anthropic');
|
335
|
+
}
|
336
|
+
// @pseudocode line 112: Log successful logout
|
337
|
+
console.log('Logged out of Anthropic Claude');
|
338
|
+
}
|
339
|
+
/**
|
340
|
+
* @plan PLAN-20250823-AUTHFIXES.P08
|
341
|
+
* @requirement REQ-003.1
|
342
|
+
* @pseudocode lines 27-30
|
343
|
+
*/
|
344
|
+
isTokenExpired(token) {
|
345
|
+
// @pseudocode line 28: Get current time
|
346
|
+
const now = Date.now() / 1000;
|
347
|
+
// @pseudocode line 29: 30-second buffer
|
348
|
+
const buffer = 30;
|
349
|
+
// @pseudocode line 30: Check expiry with buffer
|
350
|
+
return token.expiry <= now + buffer;
|
127
351
|
}
|
128
352
|
}
|
129
353
|
//# sourceMappingURL=anthropic-oauth-provider.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"anthropic-oauth-provider.js","sourceRoot":"","sources":["../../../src/auth/anthropic-oauth-provider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAEL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,
|
1
|
+
{"version":3,"file":"anthropic-oauth-provider.js","sourceRoot":"","sources":["../../../src/auth/anthropic-oauth-provider.ts"],"names":[],"mappings":"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"}
|
@@ -1,15 +1,46 @@
|
|
1
1
|
/**
|
2
2
|
* Gemini OAuth Provider Implementation
|
3
3
|
*
|
4
|
-
*
|
5
|
-
*
|
4
|
+
* Bridges to the existing Google OAuth infrastructure in oauth2.ts
|
5
|
+
* while maintaining compatibility with the LOGIN_WITH_GOOGLE flow.
|
6
6
|
*/
|
7
7
|
import { OAuthProvider } from './oauth-manager.js';
|
8
|
-
import { OAuthToken } from '
|
8
|
+
import { OAuthToken, TokenStore } from './types.js';
|
9
9
|
export declare class GeminiOAuthProvider implements OAuthProvider {
|
10
10
|
name: string;
|
11
11
|
private currentToken;
|
12
|
+
private tokenStore?;
|
13
|
+
private initializationState;
|
14
|
+
private initializationPromise?;
|
15
|
+
private initializationError?;
|
16
|
+
private errorHandler;
|
17
|
+
private retryHandler;
|
18
|
+
private logger;
|
19
|
+
constructor(tokenStore?: TokenStore);
|
20
|
+
/**
|
21
|
+
* Lazy initialization with proper state management
|
22
|
+
* Ensures initialization only happens once and handles concurrent calls
|
23
|
+
*/
|
24
|
+
private ensureInitialized;
|
25
|
+
initializeToken(): Promise<void>;
|
12
26
|
initiateAuth(): Promise<void>;
|
13
27
|
getToken(): Promise<OAuthToken | null>;
|
14
28
|
refreshIfNeeded(): Promise<OAuthToken | null>;
|
29
|
+
logout(): Promise<void>;
|
30
|
+
/**
|
31
|
+
* Converts Google OAuth Credentials to our OAuthToken format
|
32
|
+
*/
|
33
|
+
private credentialsToOAuthToken;
|
34
|
+
/**
|
35
|
+
* Gets token from the existing Google OAuth infrastructure
|
36
|
+
*/
|
37
|
+
private getTokenFromGoogleOAuth;
|
38
|
+
/**
|
39
|
+
* Migrates tokens from legacy locations to new format
|
40
|
+
*/
|
41
|
+
private migrateFromLegacyTokens;
|
42
|
+
/**
|
43
|
+
* Clears tokens from all legacy locations
|
44
|
+
*/
|
45
|
+
private clearLegacyTokens;
|
15
46
|
}
|