@vybestack/llxprt-code-core 0.1.23 → 0.2.2-nightly.250908.fb8099b7
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/src/adapters/IStreamAdapter.d.ts +3 -3
- package/dist/src/auth/oauth-errors.d.ts +173 -0
- package/dist/src/auth/oauth-errors.js +461 -0
- package/dist/src/auth/oauth-errors.js.map +1 -0
- package/dist/src/auth/precedence.d.ts +1 -5
- package/dist/src/auth/precedence.js +28 -48
- package/dist/src/auth/precedence.js.map +1 -1
- package/dist/src/auth/token-store.js +2 -2
- package/dist/src/auth/token-store.js.map +1 -1
- package/dist/src/auth/types.d.ts +4 -4
- package/dist/src/code_assist/codeAssist.js +19 -6
- package/dist/src/code_assist/codeAssist.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +7 -0
- package/dist/src/code_assist/oauth2.js +82 -32
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/server.js +15 -4
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.js +9 -0
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/config/index.d.ts +7 -0
- package/dist/src/config/index.js +8 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/core/client.d.ts +15 -20
- package/dist/src/core/client.js +98 -124
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/compression-config.d.ts +10 -0
- package/dist/src/core/compression-config.js +17 -0
- package/dist/src/core/compression-config.js.map +1 -0
- package/dist/src/core/coreToolScheduler.js +50 -15
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +68 -9
- package/dist/src/core/geminiChat.js +940 -405
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +70 -19
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/prompts.js +35 -25
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/turn.d.ts +1 -0
- package/dist/src/core/turn.js +8 -6
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +1 -1
- package/dist/src/ide/ide-client.js +12 -6
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.js +5 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/prompt-config/TemplateEngine.js +17 -0
- package/dist/src/prompt-config/TemplateEngine.js.map +1 -1
- package/dist/src/prompt-config/defaults/core-defaults.js +39 -32
- package/dist/src/prompt-config/defaults/core-defaults.js.map +1 -1
- package/dist/src/prompt-config/defaults/core.md +2 -0
- package/dist/src/prompt-config/defaults/provider-defaults.js +34 -27
- package/dist/src/prompt-config/defaults/provider-defaults.js.map +1 -1
- package/dist/src/prompt-config/defaults/providers/gemini/core.md +270 -0
- package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +12 -0
- package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/gemini-2-5-flash/core.md +12 -0
- package/dist/src/prompt-config/types.d.ts +2 -0
- package/dist/src/providers/BaseProvider.d.ts +39 -13
- package/dist/src/providers/BaseProvider.js +102 -28
- package/dist/src/providers/BaseProvider.js.map +1 -1
- package/dist/src/providers/IProvider.d.ts +17 -3
- package/dist/src/providers/LoggingProviderWrapper.d.ts +10 -3
- package/dist/src/providers/LoggingProviderWrapper.js +33 -27
- package/dist/src/providers/LoggingProviderWrapper.js.map +1 -1
- package/dist/src/providers/ProviderContentGenerator.d.ts +2 -2
- package/dist/src/providers/ProviderContentGenerator.js +9 -6
- package/dist/src/providers/ProviderContentGenerator.js.map +1 -1
- package/dist/src/providers/ProviderManager.d.ts +4 -0
- package/dist/src/providers/ProviderManager.js +6 -0
- package/dist/src/providers/ProviderManager.js.map +1 -1
- package/dist/src/providers/anthropic/AnthropicProvider.d.ts +34 -21
- package/dist/src/providers/anthropic/AnthropicProvider.js +505 -492
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.d.ts +23 -9
- package/dist/src/providers/gemini/GeminiProvider.js +344 -515
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
- package/dist/src/providers/openai/ConversationCache.d.ts +3 -3
- package/dist/src/providers/openai/IChatGenerateParams.d.ts +9 -4
- package/dist/src/providers/openai/OpenAIProvider.d.ts +46 -96
- package/dist/src/providers/openai/OpenAIProvider.js +532 -1393
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
- package/dist/src/providers/openai/buildResponsesRequest.d.ts +3 -3
- package/dist/src/providers/openai/buildResponsesRequest.js +67 -37
- package/dist/src/providers/openai/buildResponsesRequest.js.map +1 -1
- package/dist/src/providers/openai/estimateRemoteTokens.d.ts +2 -2
- package/dist/src/providers/openai/estimateRemoteTokens.js +21 -8
- package/dist/src/providers/openai/estimateRemoteTokens.js.map +1 -1
- package/dist/src/providers/openai/parseResponsesStream.d.ts +6 -2
- package/dist/src/providers/openai/parseResponsesStream.js +99 -391
- package/dist/src/providers/openai/parseResponsesStream.js.map +1 -1
- package/dist/src/providers/openai/syntheticToolResponses.d.ts +5 -5
- package/dist/src/providers/openai/syntheticToolResponses.js +102 -91
- package/dist/src/providers/openai/syntheticToolResponses.js.map +1 -1
- package/dist/src/providers/openai-responses/OpenAIResponsesProvider.d.ts +89 -0
- package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js +451 -0
- package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js.map +1 -0
- package/dist/src/providers/openai-responses/index.d.ts +1 -0
- package/dist/src/providers/openai-responses/index.js +2 -0
- package/dist/src/providers/openai-responses/index.js.map +1 -0
- package/dist/src/providers/tokenizers/OpenAITokenizer.js +3 -3
- package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +1 -1
- package/dist/src/providers/types.d.ts +1 -1
- package/dist/src/services/ClipboardService.d.ts +19 -0
- package/dist/src/services/ClipboardService.js +66 -0
- package/dist/src/services/ClipboardService.js.map +1 -0
- package/dist/src/services/history/ContentConverters.d.ts +43 -0
- package/dist/src/services/history/ContentConverters.js +325 -0
- package/dist/src/services/history/ContentConverters.js.map +1 -0
- package/dist/src/{providers/IMessage.d.ts → services/history/HistoryEvents.d.ts} +16 -22
- package/dist/src/{providers/IMessage.js → services/history/HistoryEvents.js} +1 -1
- package/dist/src/services/history/HistoryEvents.js.map +1 -0
- package/dist/src/services/history/HistoryService.d.ts +220 -0
- package/dist/src/services/history/HistoryService.js +673 -0
- package/dist/src/services/history/HistoryService.js.map +1 -0
- package/dist/src/services/history/IContent.d.ts +183 -0
- package/dist/src/services/history/IContent.js +104 -0
- package/dist/src/services/history/IContent.js.map +1 -0
- package/dist/src/services/index.d.ts +1 -0
- package/dist/src/services/index.js +1 -0
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +16 -4
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/tools/IToolFormatter.d.ts +2 -2
- package/dist/src/tools/ToolFormatter.d.ts +42 -4
- package/dist/src/tools/ToolFormatter.js +159 -37
- package/dist/src/tools/ToolFormatter.js.map +1 -1
- package/dist/src/tools/doubleEscapeUtils.d.ts +57 -0
- package/dist/src/tools/doubleEscapeUtils.js +241 -0
- package/dist/src/tools/doubleEscapeUtils.js.map +1 -0
- package/dist/src/tools/read-file.d.ts +6 -1
- package/dist/src/tools/read-file.js +25 -11
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/todo-schemas.d.ts +4 -4
- package/dist/src/tools/tools.js +13 -0
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +6 -1
- package/dist/src/tools/write-file.js +48 -26
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/types/modelParams.d.ts +8 -0
- package/dist/src/utils/bfsFileSearch.js +2 -6
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/schemaValidator.js +16 -1
- package/dist/src/utils/schemaValidator.js.map +1 -1
- package/package.json +8 -7
- package/dist/src/providers/IMessage.js.map +0 -1
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.d.ts +0 -69
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +0 -577
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +0 -1
@@ -0,0 +1,461 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
/**
|
7
|
+
* OAuth Error Handling System
|
8
|
+
*
|
9
|
+
* Provides comprehensive error classification, user-friendly messaging,
|
10
|
+
* and recovery mechanisms for OAuth providers.
|
11
|
+
*/
|
12
|
+
/**
|
13
|
+
* OAuth error categories for classification and handling
|
14
|
+
*/
|
15
|
+
export var OAuthErrorCategory;
|
16
|
+
(function (OAuthErrorCategory) {
|
17
|
+
/** User must take action (re-authenticate, grant permissions) */
|
18
|
+
OAuthErrorCategory["USER_ACTION_REQUIRED"] = "user_action_required";
|
19
|
+
/** Network or temporary service issues that can be retried */
|
20
|
+
OAuthErrorCategory["TRANSIENT"] = "transient";
|
21
|
+
/** System issues (file permissions, storage problems) */
|
22
|
+
OAuthErrorCategory["SYSTEM"] = "system";
|
23
|
+
/** Critical security or data corruption issues */
|
24
|
+
OAuthErrorCategory["CRITICAL"] = "critical";
|
25
|
+
/** Configuration or setup problems */
|
26
|
+
OAuthErrorCategory["CONFIGURATION"] = "configuration";
|
27
|
+
})(OAuthErrorCategory || (OAuthErrorCategory = {}));
|
28
|
+
/**
|
29
|
+
* Specific OAuth error types with detailed classification
|
30
|
+
*/
|
31
|
+
export var OAuthErrorType;
|
32
|
+
(function (OAuthErrorType) {
|
33
|
+
// User-actionable errors
|
34
|
+
OAuthErrorType["AUTHENTICATION_REQUIRED"] = "authentication_required";
|
35
|
+
OAuthErrorType["AUTHORIZATION_EXPIRED"] = "authorization_expired";
|
36
|
+
OAuthErrorType["INSUFFICIENT_PERMISSIONS"] = "insufficient_permissions";
|
37
|
+
OAuthErrorType["USER_CANCELLED"] = "user_cancelled";
|
38
|
+
OAuthErrorType["INVALID_CREDENTIALS"] = "invalid_credentials";
|
39
|
+
// Transient errors
|
40
|
+
OAuthErrorType["NETWORK_ERROR"] = "network_error";
|
41
|
+
OAuthErrorType["SERVICE_UNAVAILABLE"] = "service_unavailable";
|
42
|
+
OAuthErrorType["RATE_LIMITED"] = "rate_limited";
|
43
|
+
OAuthErrorType["TIMEOUT"] = "timeout";
|
44
|
+
// System errors
|
45
|
+
OAuthErrorType["STORAGE_ERROR"] = "storage_error";
|
46
|
+
OAuthErrorType["FILE_PERMISSIONS"] = "file_permissions";
|
47
|
+
OAuthErrorType["CORRUPTED_DATA"] = "corrupted_data";
|
48
|
+
// Critical errors
|
49
|
+
OAuthErrorType["SECURITY_VIOLATION"] = "security_violation";
|
50
|
+
OAuthErrorType["MALFORMED_TOKEN"] = "malformed_token";
|
51
|
+
// Configuration errors
|
52
|
+
OAuthErrorType["INVALID_CLIENT_ID"] = "invalid_client_id";
|
53
|
+
OAuthErrorType["INVALID_ENDPOINT"] = "invalid_endpoint";
|
54
|
+
OAuthErrorType["MISSING_CONFIGURATION"] = "missing_configuration";
|
55
|
+
// Generic fallback
|
56
|
+
OAuthErrorType["UNKNOWN"] = "unknown";
|
57
|
+
})(OAuthErrorType || (OAuthErrorType = {}));
|
58
|
+
/**
|
59
|
+
* Default retry configuration for transient errors
|
60
|
+
*/
|
61
|
+
export const DEFAULT_RETRY_CONFIG = {
|
62
|
+
maxAttempts: 3,
|
63
|
+
baseDelayMs: 1000,
|
64
|
+
backoffMultiplier: 2,
|
65
|
+
maxDelayMs: 30000,
|
66
|
+
jitter: true,
|
67
|
+
};
|
68
|
+
/**
|
69
|
+
* Comprehensive OAuth error with classification and user guidance
|
70
|
+
*/
|
71
|
+
export class OAuthError extends Error {
|
72
|
+
category;
|
73
|
+
type;
|
74
|
+
provider;
|
75
|
+
userMessage;
|
76
|
+
actionRequired;
|
77
|
+
isRetryable;
|
78
|
+
retryAfterMs;
|
79
|
+
technicalDetails;
|
80
|
+
originalError;
|
81
|
+
constructor(type, provider, message, options = {}) {
|
82
|
+
super(message);
|
83
|
+
this.name = 'OAuthError';
|
84
|
+
this.type = type;
|
85
|
+
this.provider = provider;
|
86
|
+
this.category = this.categorizeError(type);
|
87
|
+
this.isRetryable = this.determineRetryability(type);
|
88
|
+
this.userMessage =
|
89
|
+
options.userMessage || this.generateUserMessage(type, provider);
|
90
|
+
this.actionRequired =
|
91
|
+
options.actionRequired || this.generateActionRequired(type, provider);
|
92
|
+
this.retryAfterMs = options.retryAfterMs || null;
|
93
|
+
this.technicalDetails = options.technicalDetails || {};
|
94
|
+
this.originalError = options.originalError || null;
|
95
|
+
}
|
96
|
+
/**
|
97
|
+
* Categorizes error type into handling categories
|
98
|
+
*/
|
99
|
+
categorizeError(type) {
|
100
|
+
switch (type) {
|
101
|
+
case OAuthErrorType.AUTHENTICATION_REQUIRED:
|
102
|
+
case OAuthErrorType.AUTHORIZATION_EXPIRED:
|
103
|
+
case OAuthErrorType.INSUFFICIENT_PERMISSIONS:
|
104
|
+
case OAuthErrorType.USER_CANCELLED:
|
105
|
+
case OAuthErrorType.INVALID_CREDENTIALS:
|
106
|
+
return OAuthErrorCategory.USER_ACTION_REQUIRED;
|
107
|
+
case OAuthErrorType.NETWORK_ERROR:
|
108
|
+
case OAuthErrorType.SERVICE_UNAVAILABLE:
|
109
|
+
case OAuthErrorType.RATE_LIMITED:
|
110
|
+
case OAuthErrorType.TIMEOUT:
|
111
|
+
return OAuthErrorCategory.TRANSIENT;
|
112
|
+
case OAuthErrorType.STORAGE_ERROR:
|
113
|
+
case OAuthErrorType.FILE_PERMISSIONS:
|
114
|
+
case OAuthErrorType.CORRUPTED_DATA:
|
115
|
+
return OAuthErrorCategory.SYSTEM;
|
116
|
+
case OAuthErrorType.SECURITY_VIOLATION:
|
117
|
+
case OAuthErrorType.MALFORMED_TOKEN:
|
118
|
+
return OAuthErrorCategory.CRITICAL;
|
119
|
+
case OAuthErrorType.INVALID_CLIENT_ID:
|
120
|
+
case OAuthErrorType.INVALID_ENDPOINT:
|
121
|
+
case OAuthErrorType.MISSING_CONFIGURATION:
|
122
|
+
return OAuthErrorCategory.CONFIGURATION;
|
123
|
+
default:
|
124
|
+
return OAuthErrorCategory.SYSTEM;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
/**
|
128
|
+
* Determines if error type is retryable
|
129
|
+
*/
|
130
|
+
determineRetryability(type) {
|
131
|
+
switch (type) {
|
132
|
+
case OAuthErrorType.NETWORK_ERROR:
|
133
|
+
case OAuthErrorType.SERVICE_UNAVAILABLE:
|
134
|
+
case OAuthErrorType.TIMEOUT:
|
135
|
+
return true;
|
136
|
+
case OAuthErrorType.RATE_LIMITED:
|
137
|
+
return true; // But with specific delay
|
138
|
+
default:
|
139
|
+
return false;
|
140
|
+
}
|
141
|
+
}
|
142
|
+
/**
|
143
|
+
* Generates user-friendly error message
|
144
|
+
*/
|
145
|
+
generateUserMessage(type, provider) {
|
146
|
+
const providerName = provider.charAt(0).toUpperCase() + provider.slice(1);
|
147
|
+
switch (type) {
|
148
|
+
case OAuthErrorType.AUTHENTICATION_REQUIRED:
|
149
|
+
return `You need to sign in to ${providerName} to continue.`;
|
150
|
+
case OAuthErrorType.AUTHORIZATION_EXPIRED:
|
151
|
+
return `Your ${providerName} session has expired. Please sign in again.`;
|
152
|
+
case OAuthErrorType.INSUFFICIENT_PERMISSIONS:
|
153
|
+
return `${providerName} access was denied. Please grant the required permissions.`;
|
154
|
+
case OAuthErrorType.USER_CANCELLED:
|
155
|
+
return `${providerName} authentication was cancelled.`;
|
156
|
+
case OAuthErrorType.INVALID_CREDENTIALS:
|
157
|
+
return `The ${providerName} credentials are invalid. Please sign in again.`;
|
158
|
+
case OAuthErrorType.NETWORK_ERROR:
|
159
|
+
return `Unable to connect to ${providerName}. Please check your internet connection.`;
|
160
|
+
case OAuthErrorType.SERVICE_UNAVAILABLE:
|
161
|
+
return `${providerName} is currently unavailable. Please try again later.`;
|
162
|
+
case OAuthErrorType.RATE_LIMITED:
|
163
|
+
return `Too many requests to ${providerName}. Please wait a moment and try again.`;
|
164
|
+
case OAuthErrorType.TIMEOUT:
|
165
|
+
return `Connection to ${providerName} timed out. Please try again.`;
|
166
|
+
case OAuthErrorType.STORAGE_ERROR:
|
167
|
+
return `Unable to save ${providerName} authentication data. Please check file permissions.`;
|
168
|
+
case OAuthErrorType.FILE_PERMISSIONS:
|
169
|
+
return `Permission denied when accessing ${providerName} authentication files.`;
|
170
|
+
case OAuthErrorType.CORRUPTED_DATA:
|
171
|
+
return `${providerName} authentication data is corrupted. Please sign in again.`;
|
172
|
+
case OAuthErrorType.SECURITY_VIOLATION:
|
173
|
+
return `${providerName} authentication failed due to a security issue.`;
|
174
|
+
case OAuthErrorType.MALFORMED_TOKEN:
|
175
|
+
return `${providerName} returned invalid authentication data. Please try again.`;
|
176
|
+
case OAuthErrorType.INVALID_CLIENT_ID:
|
177
|
+
return `${providerName} configuration error: invalid client ID.`;
|
178
|
+
case OAuthErrorType.INVALID_ENDPOINT:
|
179
|
+
return `${providerName} configuration error: invalid server endpoint.`;
|
180
|
+
case OAuthErrorType.MISSING_CONFIGURATION:
|
181
|
+
return `${providerName} is not properly configured.`;
|
182
|
+
default:
|
183
|
+
return `An unexpected error occurred with ${providerName} authentication.`;
|
184
|
+
}
|
185
|
+
}
|
186
|
+
/**
|
187
|
+
* Generates actionable guidance for users
|
188
|
+
*/
|
189
|
+
generateActionRequired(type, provider) {
|
190
|
+
switch (type) {
|
191
|
+
case OAuthErrorType.AUTHENTICATION_REQUIRED:
|
192
|
+
case OAuthErrorType.AUTHORIZATION_EXPIRED:
|
193
|
+
case OAuthErrorType.INVALID_CREDENTIALS:
|
194
|
+
return `Run 'llxprt auth login ${provider}' to sign in again.`;
|
195
|
+
case OAuthErrorType.INSUFFICIENT_PERMISSIONS:
|
196
|
+
return `Grant the required permissions during ${provider} authentication.`;
|
197
|
+
case OAuthErrorType.USER_CANCELLED:
|
198
|
+
return `Complete the ${provider} authentication process to continue.`;
|
199
|
+
case OAuthErrorType.NETWORK_ERROR:
|
200
|
+
return 'Check your internet connection and try again.';
|
201
|
+
case OAuthErrorType.SERVICE_UNAVAILABLE:
|
202
|
+
case OAuthErrorType.RATE_LIMITED:
|
203
|
+
case OAuthErrorType.TIMEOUT:
|
204
|
+
return 'Wait a few minutes and try again.';
|
205
|
+
case OAuthErrorType.STORAGE_ERROR:
|
206
|
+
case OAuthErrorType.FILE_PERMISSIONS:
|
207
|
+
return 'Check that you have write permissions to ~/.llxprt directory.';
|
208
|
+
case OAuthErrorType.CORRUPTED_DATA:
|
209
|
+
return `Run 'llxprt auth logout ${provider}' then sign in again.`;
|
210
|
+
case OAuthErrorType.SECURITY_VIOLATION:
|
211
|
+
return 'Contact support if this problem persists.';
|
212
|
+
case OAuthErrorType.MALFORMED_TOKEN:
|
213
|
+
return `Sign out and back in to ${provider}.`;
|
214
|
+
case OAuthErrorType.INVALID_CLIENT_ID:
|
215
|
+
case OAuthErrorType.INVALID_ENDPOINT:
|
216
|
+
case OAuthErrorType.MISSING_CONFIGURATION:
|
217
|
+
return 'Check your application configuration.';
|
218
|
+
default:
|
219
|
+
return null;
|
220
|
+
}
|
221
|
+
}
|
222
|
+
/**
|
223
|
+
* Creates a sanitized version of the error for logging
|
224
|
+
*/
|
225
|
+
toLogEntry() {
|
226
|
+
return {
|
227
|
+
type: this.type,
|
228
|
+
category: this.category,
|
229
|
+
provider: this.provider,
|
230
|
+
isRetryable: this.isRetryable,
|
231
|
+
retryAfterMs: this.retryAfterMs,
|
232
|
+
message: this.message,
|
233
|
+
userMessage: this.userMessage,
|
234
|
+
actionRequired: this.actionRequired,
|
235
|
+
technicalDetails: this.technicalDetails,
|
236
|
+
stack: this.stack,
|
237
|
+
originalError: this.originalError
|
238
|
+
? {
|
239
|
+
name: this.originalError.name,
|
240
|
+
message: this.originalError.message,
|
241
|
+
stack: this.originalError.stack,
|
242
|
+
}
|
243
|
+
: null,
|
244
|
+
};
|
245
|
+
}
|
246
|
+
}
|
247
|
+
/**
|
248
|
+
* Error factory for common OAuth error scenarios
|
249
|
+
*/
|
250
|
+
export class OAuthErrorFactory {
|
251
|
+
/**
|
252
|
+
* Creates an authentication required error
|
253
|
+
*/
|
254
|
+
static authenticationRequired(provider, details) {
|
255
|
+
return new OAuthError(OAuthErrorType.AUTHENTICATION_REQUIRED, provider, `Authentication required for ${provider}`, { technicalDetails: details });
|
256
|
+
}
|
257
|
+
/**
|
258
|
+
* Creates an expired authorization error
|
259
|
+
*/
|
260
|
+
static authorizationExpired(provider, details) {
|
261
|
+
return new OAuthError(OAuthErrorType.AUTHORIZATION_EXPIRED, provider, `Authorization expired for ${provider}`, { technicalDetails: details });
|
262
|
+
}
|
263
|
+
/**
|
264
|
+
* Creates a network error with retry capability
|
265
|
+
*/
|
266
|
+
static networkError(provider, originalError, details) {
|
267
|
+
return new OAuthError(OAuthErrorType.NETWORK_ERROR, provider, `Network error connecting to ${provider}`, {
|
268
|
+
originalError,
|
269
|
+
technicalDetails: details,
|
270
|
+
retryAfterMs: 1000, // Retry after 1 second
|
271
|
+
});
|
272
|
+
}
|
273
|
+
/**
|
274
|
+
* Creates a rate limited error with specific retry delay
|
275
|
+
*/
|
276
|
+
static rateLimited(provider, retryAfterSeconds = 60, details) {
|
277
|
+
return new OAuthError(OAuthErrorType.RATE_LIMITED, provider, `Rate limited by ${provider}`, {
|
278
|
+
technicalDetails: details,
|
279
|
+
retryAfterMs: retryAfterSeconds * 1000,
|
280
|
+
});
|
281
|
+
}
|
282
|
+
/**
|
283
|
+
* Creates a storage error
|
284
|
+
*/
|
285
|
+
static storageError(provider, originalError, details) {
|
286
|
+
return new OAuthError(OAuthErrorType.STORAGE_ERROR, provider, `Storage error for ${provider}`, { originalError, technicalDetails: details });
|
287
|
+
}
|
288
|
+
/**
|
289
|
+
* Creates a corrupted data error
|
290
|
+
*/
|
291
|
+
static corruptedData(provider, details) {
|
292
|
+
return new OAuthError(OAuthErrorType.CORRUPTED_DATA, provider, `Corrupted data for ${provider}`, { technicalDetails: details });
|
293
|
+
}
|
294
|
+
/**
|
295
|
+
* Creates an error from an unknown error, attempting classification
|
296
|
+
*/
|
297
|
+
static fromUnknown(provider, error, context) {
|
298
|
+
let originalError = null;
|
299
|
+
let message = 'Unknown error';
|
300
|
+
let type = OAuthErrorType.UNKNOWN;
|
301
|
+
if (error instanceof Error) {
|
302
|
+
originalError = error;
|
303
|
+
message = error.message;
|
304
|
+
// Attempt to classify based on error message or type
|
305
|
+
const errorWithCode = error;
|
306
|
+
if (error.message.toLowerCase().includes('network') ||
|
307
|
+
error.message.toLowerCase().includes('connection') ||
|
308
|
+
errorWithCode.code === 'ENOTFOUND' ||
|
309
|
+
errorWithCode.code === 'ECONNREFUSED') {
|
310
|
+
type = OAuthErrorType.NETWORK_ERROR;
|
311
|
+
}
|
312
|
+
else if (error.message.toLowerCase().includes('timeout')) {
|
313
|
+
type = OAuthErrorType.TIMEOUT;
|
314
|
+
}
|
315
|
+
else if (error.message.toLowerCase().includes('permission') ||
|
316
|
+
errorWithCode.code === 'EACCES' ||
|
317
|
+
errorWithCode.code === 'EPERM') {
|
318
|
+
type = OAuthErrorType.FILE_PERMISSIONS;
|
319
|
+
}
|
320
|
+
else if (error.message.toLowerCase().includes('unauthorized') ||
|
321
|
+
error.message.toLowerCase().includes('invalid_grant') ||
|
322
|
+
error.message.toLowerCase().includes('expired')) {
|
323
|
+
type = OAuthErrorType.AUTHORIZATION_EXPIRED;
|
324
|
+
}
|
325
|
+
else if (error.message.toLowerCase().includes('rate') ||
|
326
|
+
error.message.toLowerCase().includes('too many')) {
|
327
|
+
type = OAuthErrorType.RATE_LIMITED;
|
328
|
+
}
|
329
|
+
}
|
330
|
+
else if (typeof error === 'string') {
|
331
|
+
message = error;
|
332
|
+
}
|
333
|
+
else {
|
334
|
+
message = String(error);
|
335
|
+
}
|
336
|
+
return new OAuthError(type, provider, context ? `${context}: ${message}` : message, {
|
337
|
+
originalError: originalError || undefined,
|
338
|
+
technicalDetails: { context, originalErrorType: typeof error },
|
339
|
+
});
|
340
|
+
}
|
341
|
+
}
|
342
|
+
/**
|
343
|
+
* Retry handler with exponential backoff and jitter
|
344
|
+
*/
|
345
|
+
export class RetryHandler {
|
346
|
+
config;
|
347
|
+
constructor(config = DEFAULT_RETRY_CONFIG) {
|
348
|
+
this.config = config;
|
349
|
+
}
|
350
|
+
/**
|
351
|
+
* Executes operation with retry logic for transient errors
|
352
|
+
*/
|
353
|
+
async executeWithRetry(operation, provider, context) {
|
354
|
+
let lastError = null;
|
355
|
+
for (let attempt = 1; attempt <= this.config.maxAttempts; attempt++) {
|
356
|
+
try {
|
357
|
+
return await operation();
|
358
|
+
}
|
359
|
+
catch (error) {
|
360
|
+
// Convert to OAuthError if not already
|
361
|
+
const oauthError = error instanceof OAuthError
|
362
|
+
? error
|
363
|
+
: OAuthErrorFactory.fromUnknown(provider, error, context);
|
364
|
+
lastError = oauthError;
|
365
|
+
// Don't retry non-transient errors
|
366
|
+
if (!oauthError.isRetryable) {
|
367
|
+
throw oauthError;
|
368
|
+
}
|
369
|
+
// Don't retry on the last attempt
|
370
|
+
if (attempt >= this.config.maxAttempts) {
|
371
|
+
break;
|
372
|
+
}
|
373
|
+
// Calculate delay with exponential backoff and jitter
|
374
|
+
let delay = oauthError.retryAfterMs ||
|
375
|
+
Math.min(this.config.baseDelayMs *
|
376
|
+
Math.pow(this.config.backoffMultiplier, attempt - 1), this.config.maxDelayMs);
|
377
|
+
if (this.config.jitter) {
|
378
|
+
delay = delay * (0.5 + Math.random() * 0.5); // 50-100% of calculated delay
|
379
|
+
}
|
380
|
+
console.debug(`${provider} operation failed (attempt ${attempt}/${this.config.maxAttempts}), retrying in ${delay}ms...`);
|
381
|
+
await this.sleep(delay);
|
382
|
+
}
|
383
|
+
}
|
384
|
+
// All retries exhausted
|
385
|
+
throw (lastError ||
|
386
|
+
OAuthErrorFactory.fromUnknown(provider, new Error('Max retries exceeded'), context));
|
387
|
+
}
|
388
|
+
/**
|
389
|
+
* Sleep utility
|
390
|
+
*/
|
391
|
+
sleep(ms) {
|
392
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
393
|
+
}
|
394
|
+
}
|
395
|
+
/**
|
396
|
+
* Graceful error handler for OAuth operations
|
397
|
+
*/
|
398
|
+
export class GracefulErrorHandler {
|
399
|
+
retryHandler;
|
400
|
+
constructor(retryHandler = new RetryHandler()) {
|
401
|
+
this.retryHandler = retryHandler;
|
402
|
+
}
|
403
|
+
/**
|
404
|
+
* Handles errors gracefully, providing fallback behavior when possible
|
405
|
+
*/
|
406
|
+
async handleGracefully(operation, fallback, provider, context) {
|
407
|
+
try {
|
408
|
+
return await this.retryHandler.executeWithRetry(operation, provider, context);
|
409
|
+
}
|
410
|
+
catch (error) {
|
411
|
+
const oauthError = error instanceof OAuthError
|
412
|
+
? error
|
413
|
+
: OAuthErrorFactory.fromUnknown(provider, error, context);
|
414
|
+
// Log the error for debugging
|
415
|
+
console.debug('OAuth operation failed gracefully:', oauthError.toLogEntry());
|
416
|
+
// Critical errors should not be handled gracefully
|
417
|
+
if (oauthError.category === OAuthErrorCategory.CRITICAL) {
|
418
|
+
throw oauthError;
|
419
|
+
}
|
420
|
+
// Return fallback for non-critical errors
|
421
|
+
if (typeof fallback === 'function') {
|
422
|
+
return await fallback();
|
423
|
+
}
|
424
|
+
return fallback;
|
425
|
+
}
|
426
|
+
}
|
427
|
+
/**
|
428
|
+
* Wraps a method to handle errors gracefully with logging
|
429
|
+
*/
|
430
|
+
wrapMethod(method, provider, methodName, fallback) {
|
431
|
+
return async (...args) => {
|
432
|
+
try {
|
433
|
+
return await this.retryHandler.executeWithRetry(() => method(...args), provider, methodName);
|
434
|
+
}
|
435
|
+
catch (error) {
|
436
|
+
const oauthError = error instanceof OAuthError
|
437
|
+
? error
|
438
|
+
: OAuthErrorFactory.fromUnknown(provider, error, methodName);
|
439
|
+
// Always show user-friendly error message for user-actionable errors
|
440
|
+
if (oauthError.category === OAuthErrorCategory.USER_ACTION_REQUIRED) {
|
441
|
+
console.error(oauthError.userMessage);
|
442
|
+
if (oauthError.actionRequired) {
|
443
|
+
console.error(`Action required: ${oauthError.actionRequired}`);
|
444
|
+
}
|
445
|
+
}
|
446
|
+
// Log technical details for debugging
|
447
|
+
console.debug(`${provider}.${methodName} failed:`, oauthError.toLogEntry());
|
448
|
+
// Use fallback if provided and error is not critical
|
449
|
+
if (fallback !== undefined &&
|
450
|
+
oauthError.category !== OAuthErrorCategory.CRITICAL) {
|
451
|
+
if (typeof fallback === 'function') {
|
452
|
+
return await fallback(...args);
|
453
|
+
}
|
454
|
+
return fallback;
|
455
|
+
}
|
456
|
+
throw oauthError;
|
457
|
+
}
|
458
|
+
};
|
459
|
+
}
|
460
|
+
}
|
461
|
+
//# sourceMappingURL=oauth-errors.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"oauth-errors.js","sourceRoot":"","sources":["../../../src/auth/oauth-errors.ts"],"names":[],"mappings":"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"}
|
@@ -4,10 +4,6 @@
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
5
5
|
*/
|
6
6
|
export interface AuthPrecedenceConfig {
|
7
|
-
commandKey?: string;
|
8
|
-
commandKeyfile?: string;
|
9
|
-
cliKey?: string;
|
10
|
-
cliKeyfile?: string;
|
11
7
|
envKeyNames?: string[];
|
12
8
|
isOAuthEnabled?: boolean;
|
13
9
|
supportsOAuth?: boolean;
|
@@ -41,7 +37,7 @@ export declare class AuthPrecedenceResolver {
|
|
41
37
|
*/
|
42
38
|
getAuthMethodName(): Promise<string | null>;
|
43
39
|
/**
|
44
|
-
* Reads API key from a file path, handling
|
40
|
+
* Reads API key from a file path, handling tilde expansion, absolute and relative paths
|
45
41
|
*/
|
46
42
|
private readKeyFile;
|
47
43
|
/**
|
@@ -16,6 +16,8 @@
|
|
16
16
|
*/
|
17
17
|
import * as fs from 'node:fs/promises';
|
18
18
|
import * as path from 'node:path';
|
19
|
+
import * as os from 'node:os';
|
20
|
+
import { getSettingsService } from '../settings/settingsServiceInstance.js';
|
19
21
|
export class AuthPrecedenceResolver {
|
20
22
|
config;
|
21
23
|
oauthManager;
|
@@ -28,43 +30,28 @@ export class AuthPrecedenceResolver {
|
|
28
30
|
* Returns the first available authentication method or null if none found
|
29
31
|
*/
|
30
32
|
async resolveAuthentication() {
|
31
|
-
|
32
|
-
|
33
|
-
|
33
|
+
const settingsService = getSettingsService();
|
34
|
+
// 1. Check /key command key (highest priority) - stored in SettingsService
|
35
|
+
const authKey = settingsService.get('auth-key');
|
36
|
+
if (authKey && typeof authKey === 'string' && authKey.trim() !== '') {
|
37
|
+
return authKey;
|
34
38
|
}
|
35
|
-
// 2. Check /keyfile command keyfile
|
36
|
-
|
39
|
+
// 2. Check /keyfile command keyfile - stored in SettingsService
|
40
|
+
const authKeyfile = settingsService.get('auth-keyfile');
|
41
|
+
if (authKeyfile && typeof authKeyfile === 'string') {
|
37
42
|
try {
|
38
|
-
const keyFromFile = await this.readKeyFile(
|
43
|
+
const keyFromFile = await this.readKeyFile(authKeyfile);
|
39
44
|
if (keyFromFile) {
|
40
45
|
return keyFromFile;
|
41
46
|
}
|
42
47
|
}
|
43
48
|
catch (error) {
|
44
49
|
if (process.env.DEBUG) {
|
45
|
-
console.warn(`Failed to read
|
50
|
+
console.warn(`Failed to read keyfile from SettingsService ${authKeyfile}:`, error);
|
46
51
|
}
|
47
52
|
}
|
48
53
|
}
|
49
|
-
// 3. Check
|
50
|
-
if (this.config.cliKey && this.config.cliKey.trim() !== '') {
|
51
|
-
return this.config.cliKey;
|
52
|
-
}
|
53
|
-
// 4. Check --keyfile CLI argument
|
54
|
-
if (this.config.cliKeyfile) {
|
55
|
-
try {
|
56
|
-
const keyFromFile = await this.readKeyFile(this.config.cliKeyfile);
|
57
|
-
if (keyFromFile) {
|
58
|
-
return keyFromFile;
|
59
|
-
}
|
60
|
-
}
|
61
|
-
catch (error) {
|
62
|
-
if (process.env.DEBUG) {
|
63
|
-
console.warn(`Failed to read CLI keyfile ${this.config.cliKeyfile}:`, error);
|
64
|
-
}
|
65
|
-
}
|
66
|
-
}
|
67
|
-
// 5. Check environment variables
|
54
|
+
// 3. Check environment variables
|
68
55
|
if (this.config.envKeyNames && this.config.envKeyNames.length > 0) {
|
69
56
|
for (const envVarName of this.config.envKeyNames) {
|
70
57
|
const envValue = process.env[envVarName];
|
@@ -73,7 +60,7 @@ export class AuthPrecedenceResolver {
|
|
73
60
|
}
|
74
61
|
}
|
75
62
|
}
|
76
|
-
//
|
63
|
+
// 4. OAuth (if enabled and supported)
|
77
64
|
if (this.config.isOAuthEnabled &&
|
78
65
|
this.config.supportsOAuth &&
|
79
66
|
this.oauthManager &&
|
@@ -116,13 +103,16 @@ export class AuthPrecedenceResolver {
|
|
116
103
|
* Get authentication method name for debugging/logging
|
117
104
|
*/
|
118
105
|
async getAuthMethodName() {
|
106
|
+
const settingsService = getSettingsService();
|
119
107
|
// Check precedence levels and return method name
|
120
|
-
|
108
|
+
const authKey = settingsService.get('auth-key');
|
109
|
+
if (authKey && typeof authKey === 'string' && authKey.trim() !== '') {
|
121
110
|
return 'command-key';
|
122
111
|
}
|
123
|
-
|
112
|
+
const authKeyfile = settingsService.get('auth-keyfile');
|
113
|
+
if (authKeyfile && typeof authKeyfile === 'string') {
|
124
114
|
try {
|
125
|
-
const keyFromFile = await this.readKeyFile(
|
115
|
+
const keyFromFile = await this.readKeyFile(authKeyfile);
|
126
116
|
if (keyFromFile) {
|
127
117
|
return 'command-keyfile';
|
128
118
|
}
|
@@ -131,20 +121,6 @@ export class AuthPrecedenceResolver {
|
|
131
121
|
// Ignore errors for method detection
|
132
122
|
}
|
133
123
|
}
|
134
|
-
if (this.config.cliKey && this.config.cliKey.trim() !== '') {
|
135
|
-
return 'cli-key';
|
136
|
-
}
|
137
|
-
if (this.config.cliKeyfile) {
|
138
|
-
try {
|
139
|
-
const keyFromFile = await this.readKeyFile(this.config.cliKeyfile);
|
140
|
-
if (keyFromFile) {
|
141
|
-
return 'cli-keyfile';
|
142
|
-
}
|
143
|
-
}
|
144
|
-
catch {
|
145
|
-
// Ignore errors for method detection
|
146
|
-
}
|
147
|
-
}
|
148
124
|
if (this.config.envKeyNames && this.config.envKeyNames.length > 0) {
|
149
125
|
for (const envVarName of this.config.envKeyNames) {
|
150
126
|
const envValue = process.env[envVarName];
|
@@ -170,14 +146,18 @@ export class AuthPrecedenceResolver {
|
|
170
146
|
return null;
|
171
147
|
}
|
172
148
|
/**
|
173
|
-
* Reads API key from a file path, handling
|
149
|
+
* Reads API key from a file path, handling tilde expansion, absolute and relative paths
|
174
150
|
*/
|
175
151
|
async readKeyFile(filePath) {
|
176
152
|
try {
|
153
|
+
// Handle tilde expansion for home directory
|
154
|
+
const expandedPath = filePath.startsWith('~')
|
155
|
+
? path.join(os.homedir(), filePath.slice(1))
|
156
|
+
: filePath;
|
177
157
|
// Handle relative paths from current working directory
|
178
|
-
const resolvedPath = path.isAbsolute(
|
179
|
-
?
|
180
|
-
: path.resolve(process.cwd(),
|
158
|
+
const resolvedPath = path.isAbsolute(expandedPath)
|
159
|
+
? expandedPath
|
160
|
+
: path.resolve(process.cwd(), expandedPath);
|
181
161
|
const content = await fs.readFile(resolvedPath, 'utf-8');
|
182
162
|
const key = content.trim();
|
183
163
|
if (key === '') {
|