@vybestack/llxprt-code-auth 0.10.0-nightly.260613.1adad3b34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/.last_build +0 -0
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.js +11 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/src/auth-precedence-resolver.d.ts +147 -0
  6. package/dist/src/auth-precedence-resolver.js +542 -0
  7. package/dist/src/auth-precedence-resolver.js.map +1 -0
  8. package/dist/src/flows/anthropic-device-flow.d.ts +57 -0
  9. package/dist/src/flows/anthropic-device-flow.js +231 -0
  10. package/dist/src/flows/anthropic-device-flow.js.map +1 -0
  11. package/dist/src/flows/codex-device-flow.d.ts +114 -0
  12. package/dist/src/flows/codex-device-flow.js +437 -0
  13. package/dist/src/flows/codex-device-flow.js.map +1 -0
  14. package/dist/src/flows/qwen-device-flow.d.ts +45 -0
  15. package/dist/src/flows/qwen-device-flow.js +183 -0
  16. package/dist/src/flows/qwen-device-flow.js.map +1 -0
  17. package/dist/src/index.d.ts +34 -0
  18. package/dist/src/index.js +26 -0
  19. package/dist/src/index.js.map +1 -0
  20. package/dist/src/interfaces/debug-logger.d.ts +31 -0
  21. package/dist/src/interfaces/debug-logger.js +6 -0
  22. package/dist/src/interfaces/debug-logger.js.map +1 -0
  23. package/dist/src/interfaces/index.d.ts +18 -0
  24. package/dist/src/interfaces/index.js +10 -0
  25. package/dist/src/interfaces/index.js.map +1 -0
  26. package/dist/src/interfaces/provider-key-storage.d.ts +26 -0
  27. package/dist/src/interfaces/provider-key-storage.js +6 -0
  28. package/dist/src/interfaces/provider-key-storage.js.map +1 -0
  29. package/dist/src/interfaces/runtime-context.d.ts +37 -0
  30. package/dist/src/interfaces/runtime-context.js +6 -0
  31. package/dist/src/interfaces/runtime-context.js.map +1 -0
  32. package/dist/src/interfaces/secure-store.d.ts +47 -0
  33. package/dist/src/interfaces/secure-store.js +6 -0
  34. package/dist/src/interfaces/secure-store.js.map +1 -0
  35. package/dist/src/interfaces/settings-service.d.ts +25 -0
  36. package/dist/src/interfaces/settings-service.js +6 -0
  37. package/dist/src/interfaces/settings-service.js.map +1 -0
  38. package/dist/src/keyring-token-store.d.ts +96 -0
  39. package/dist/src/keyring-token-store.js +391 -0
  40. package/dist/src/keyring-token-store.js.map +1 -0
  41. package/dist/src/oauth-errors.d.ts +173 -0
  42. package/dist/src/oauth-errors.js +465 -0
  43. package/dist/src/oauth-errors.js.map +1 -0
  44. package/dist/src/precedence.d.ts +115 -0
  45. package/dist/src/precedence.js +278 -0
  46. package/dist/src/precedence.js.map +1 -0
  47. package/dist/src/proxy/framing.d.ts +35 -0
  48. package/dist/src/proxy/framing.js +86 -0
  49. package/dist/src/proxy/framing.js.map +1 -0
  50. package/dist/src/proxy/proxy-provider-key-storage.d.ts +23 -0
  51. package/dist/src/proxy/proxy-provider-key-storage.js +41 -0
  52. package/dist/src/proxy/proxy-provider-key-storage.js.map +1 -0
  53. package/dist/src/proxy/proxy-socket-client.d.ts +43 -0
  54. package/dist/src/proxy/proxy-socket-client.js +219 -0
  55. package/dist/src/proxy/proxy-socket-client.js.map +1 -0
  56. package/dist/src/proxy/proxy-token-store.d.ts +39 -0
  57. package/dist/src/proxy/proxy-token-store.js +87 -0
  58. package/dist/src/proxy/proxy-token-store.js.map +1 -0
  59. package/dist/src/token-merge.d.ts +16 -0
  60. package/dist/src/token-merge.js +13 -0
  61. package/dist/src/token-merge.js.map +1 -0
  62. package/dist/src/token-sanitization.d.ts +16 -0
  63. package/dist/src/token-sanitization.js +10 -0
  64. package/dist/src/token-sanitization.js.map +1 -0
  65. package/dist/src/token-store.d.ts +93 -0
  66. package/dist/src/token-store.js +7 -0
  67. package/dist/src/token-store.js.map +1 -0
  68. package/dist/src/types.d.ts +204 -0
  69. package/dist/src/types.js +86 -0
  70. package/dist/src/types.js.map +1 -0
  71. package/package.json +42 -0
@@ -0,0 +1,465 @@
1
+ /* eslint-disable no-console */
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Vybestack LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ /* eslint-disable complexity -- Phase 5: legacy core boundary retained while larger decomposition continues. */
8
+ /**
9
+ * OAuth Error Handling System
10
+ *
11
+ * Provides comprehensive error classification, user-friendly messaging,
12
+ * and recovery mechanisms for OAuth providers.
13
+ */
14
+ /**
15
+ * OAuth error categories for classification and handling
16
+ */
17
+ export var OAuthErrorCategory;
18
+ (function (OAuthErrorCategory) {
19
+ /** User must take action (re-authenticate, grant permissions) */
20
+ OAuthErrorCategory["USER_ACTION_REQUIRED"] = "user_action_required";
21
+ /** Network or temporary service issues that can be retried */
22
+ OAuthErrorCategory["TRANSIENT"] = "transient";
23
+ /** System issues (file permissions, storage problems) */
24
+ OAuthErrorCategory["SYSTEM"] = "system";
25
+ /** Critical security or data corruption issues */
26
+ OAuthErrorCategory["CRITICAL"] = "critical";
27
+ /** Configuration or setup problems */
28
+ OAuthErrorCategory["CONFIGURATION"] = "configuration";
29
+ })(OAuthErrorCategory || (OAuthErrorCategory = {}));
30
+ /**
31
+ * Specific OAuth error types with detailed classification
32
+ */
33
+ export var OAuthErrorType;
34
+ (function (OAuthErrorType) {
35
+ // User-actionable errors
36
+ OAuthErrorType["AUTHENTICATION_REQUIRED"] = "authentication_required";
37
+ OAuthErrorType["AUTHORIZATION_EXPIRED"] = "authorization_expired";
38
+ OAuthErrorType["INSUFFICIENT_PERMISSIONS"] = "insufficient_permissions";
39
+ OAuthErrorType["USER_CANCELLED"] = "user_cancelled";
40
+ OAuthErrorType["INVALID_CREDENTIALS"] = "invalid_credentials";
41
+ // Transient errors
42
+ OAuthErrorType["NETWORK_ERROR"] = "network_error";
43
+ OAuthErrorType["SERVICE_UNAVAILABLE"] = "service_unavailable";
44
+ OAuthErrorType["RATE_LIMITED"] = "rate_limited";
45
+ OAuthErrorType["TIMEOUT"] = "timeout";
46
+ // System errors
47
+ OAuthErrorType["STORAGE_ERROR"] = "storage_error";
48
+ OAuthErrorType["FILE_PERMISSIONS"] = "file_permissions";
49
+ OAuthErrorType["CORRUPTED_DATA"] = "corrupted_data";
50
+ // Critical errors
51
+ OAuthErrorType["SECURITY_VIOLATION"] = "security_violation";
52
+ OAuthErrorType["MALFORMED_TOKEN"] = "malformed_token";
53
+ // Configuration errors
54
+ OAuthErrorType["INVALID_CLIENT_ID"] = "invalid_client_id";
55
+ OAuthErrorType["INVALID_ENDPOINT"] = "invalid_endpoint";
56
+ OAuthErrorType["MISSING_CONFIGURATION"] = "missing_configuration";
57
+ // Generic fallback
58
+ OAuthErrorType["UNKNOWN"] = "unknown";
59
+ })(OAuthErrorType || (OAuthErrorType = {}));
60
+ /**
61
+ * Default retry configuration for transient errors
62
+ */
63
+ export const DEFAULT_RETRY_CONFIG = {
64
+ maxAttempts: 3,
65
+ baseDelayMs: 1000,
66
+ backoffMultiplier: 2,
67
+ maxDelayMs: 30000,
68
+ jitter: true,
69
+ };
70
+ /**
71
+ * Comprehensive OAuth error with classification and user guidance
72
+ */
73
+ export class OAuthError extends Error {
74
+ category;
75
+ type;
76
+ provider;
77
+ userMessage;
78
+ actionRequired;
79
+ isRetryable;
80
+ retryAfterMs;
81
+ technicalDetails;
82
+ originalError;
83
+ constructor(type, provider, message, options = {}) {
84
+ super(message);
85
+ this.name = 'OAuthError';
86
+ this.type = type;
87
+ this.provider = provider;
88
+ this.category = this.categorizeError(type);
89
+ this.isRetryable = this.determineRetryability(type);
90
+ this.userMessage =
91
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: empty string userMessage should fall back to generated
92
+ options.userMessage || this.generateUserMessage(type, provider);
93
+ this.actionRequired =
94
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: empty string actionRequired should fall back to generated
95
+ options.actionRequired || this.generateActionRequired(type, provider);
96
+ this.retryAfterMs = options.retryAfterMs ?? null;
97
+ this.technicalDetails = options.technicalDetails ?? {};
98
+ this.originalError = options.originalError ?? null;
99
+ }
100
+ /**
101
+ * Categorizes error type into handling categories
102
+ */
103
+ categorizeError(type) {
104
+ switch (type) {
105
+ case OAuthErrorType.AUTHENTICATION_REQUIRED:
106
+ case OAuthErrorType.AUTHORIZATION_EXPIRED:
107
+ case OAuthErrorType.INSUFFICIENT_PERMISSIONS:
108
+ case OAuthErrorType.USER_CANCELLED:
109
+ case OAuthErrorType.INVALID_CREDENTIALS:
110
+ return OAuthErrorCategory.USER_ACTION_REQUIRED;
111
+ case OAuthErrorType.NETWORK_ERROR:
112
+ case OAuthErrorType.SERVICE_UNAVAILABLE:
113
+ case OAuthErrorType.RATE_LIMITED:
114
+ case OAuthErrorType.TIMEOUT:
115
+ return OAuthErrorCategory.TRANSIENT;
116
+ case OAuthErrorType.STORAGE_ERROR:
117
+ case OAuthErrorType.FILE_PERMISSIONS:
118
+ case OAuthErrorType.CORRUPTED_DATA:
119
+ return OAuthErrorCategory.SYSTEM;
120
+ case OAuthErrorType.SECURITY_VIOLATION:
121
+ case OAuthErrorType.MALFORMED_TOKEN:
122
+ return OAuthErrorCategory.CRITICAL;
123
+ case OAuthErrorType.INVALID_CLIENT_ID:
124
+ case OAuthErrorType.INVALID_ENDPOINT:
125
+ case OAuthErrorType.MISSING_CONFIGURATION:
126
+ return OAuthErrorCategory.CONFIGURATION;
127
+ default:
128
+ return OAuthErrorCategory.SYSTEM;
129
+ }
130
+ }
131
+ /**
132
+ * Determines if error type is retryable
133
+ */
134
+ determineRetryability(type) {
135
+ switch (type) {
136
+ case OAuthErrorType.NETWORK_ERROR:
137
+ case OAuthErrorType.SERVICE_UNAVAILABLE:
138
+ case OAuthErrorType.TIMEOUT:
139
+ return true;
140
+ case OAuthErrorType.RATE_LIMITED:
141
+ return true; // But with specific delay
142
+ default:
143
+ return false;
144
+ }
145
+ }
146
+ /**
147
+ * Generates user-friendly error message
148
+ */
149
+ generateUserMessage(type, provider) {
150
+ const providerName = provider.charAt(0).toUpperCase() + provider.slice(1);
151
+ switch (type) {
152
+ case OAuthErrorType.AUTHENTICATION_REQUIRED:
153
+ return `You need to sign in to ${providerName} to continue.`;
154
+ case OAuthErrorType.AUTHORIZATION_EXPIRED:
155
+ return `Your ${providerName} session has expired. Please sign in again.`;
156
+ case OAuthErrorType.INSUFFICIENT_PERMISSIONS:
157
+ return `${providerName} access was denied. Please grant the required permissions.`;
158
+ case OAuthErrorType.USER_CANCELLED:
159
+ return `${providerName} authentication was cancelled.`;
160
+ case OAuthErrorType.INVALID_CREDENTIALS:
161
+ return `The ${providerName} credentials are invalid. Please sign in again.`;
162
+ case OAuthErrorType.NETWORK_ERROR:
163
+ return `Unable to connect to ${providerName}. Please check your internet connection.`;
164
+ case OAuthErrorType.SERVICE_UNAVAILABLE:
165
+ return `${providerName} is currently unavailable. Please try again later.`;
166
+ case OAuthErrorType.RATE_LIMITED:
167
+ return `Too many requests to ${providerName}. Please wait a moment and try again.`;
168
+ case OAuthErrorType.TIMEOUT:
169
+ return `Connection to ${providerName} timed out. Please try again.`;
170
+ case OAuthErrorType.STORAGE_ERROR:
171
+ return `Unable to save ${providerName} authentication data. Please check file permissions.`;
172
+ case OAuthErrorType.FILE_PERMISSIONS:
173
+ return `Permission denied when accessing ${providerName} authentication files.`;
174
+ case OAuthErrorType.CORRUPTED_DATA:
175
+ return `${providerName} authentication data is corrupted. Please sign in again.`;
176
+ case OAuthErrorType.SECURITY_VIOLATION:
177
+ return `${providerName} authentication failed due to a security issue.`;
178
+ case OAuthErrorType.MALFORMED_TOKEN:
179
+ return `${providerName} returned invalid authentication data. Please try again.`;
180
+ case OAuthErrorType.INVALID_CLIENT_ID:
181
+ return `${providerName} configuration error: invalid client ID.`;
182
+ case OAuthErrorType.INVALID_ENDPOINT:
183
+ return `${providerName} configuration error: invalid server endpoint.`;
184
+ case OAuthErrorType.MISSING_CONFIGURATION:
185
+ return `${providerName} is not properly configured.`;
186
+ default:
187
+ return `An unexpected error occurred with ${providerName} authentication.`;
188
+ }
189
+ }
190
+ /**
191
+ * Generates actionable guidance for users
192
+ */
193
+ generateActionRequired(type, provider) {
194
+ switch (type) {
195
+ case OAuthErrorType.AUTHENTICATION_REQUIRED:
196
+ case OAuthErrorType.AUTHORIZATION_EXPIRED:
197
+ case OAuthErrorType.INVALID_CREDENTIALS:
198
+ return `Run 'llxprt auth login ${provider}' to sign in again.`;
199
+ case OAuthErrorType.INSUFFICIENT_PERMISSIONS:
200
+ return `Grant the required permissions during ${provider} authentication.`;
201
+ case OAuthErrorType.USER_CANCELLED:
202
+ return `Complete the ${provider} authentication process to continue.`;
203
+ case OAuthErrorType.NETWORK_ERROR:
204
+ return 'Check your internet connection and try again.';
205
+ case OAuthErrorType.SERVICE_UNAVAILABLE:
206
+ case OAuthErrorType.RATE_LIMITED:
207
+ case OAuthErrorType.TIMEOUT:
208
+ return 'Wait a few minutes and try again.';
209
+ case OAuthErrorType.STORAGE_ERROR:
210
+ case OAuthErrorType.FILE_PERMISSIONS:
211
+ return 'Check that you have write permissions to ~/.llxprt directory.';
212
+ case OAuthErrorType.CORRUPTED_DATA:
213
+ return `Run 'llxprt auth logout ${provider}' then sign in again.`;
214
+ case OAuthErrorType.SECURITY_VIOLATION:
215
+ return 'Contact support if this problem persists.';
216
+ case OAuthErrorType.MALFORMED_TOKEN:
217
+ return `Sign out and back in to ${provider}.`;
218
+ case OAuthErrorType.INVALID_CLIENT_ID:
219
+ case OAuthErrorType.INVALID_ENDPOINT:
220
+ case OAuthErrorType.MISSING_CONFIGURATION:
221
+ return 'Check your application configuration.';
222
+ default:
223
+ return null;
224
+ }
225
+ }
226
+ /**
227
+ * Creates a sanitized version of the error for logging
228
+ */
229
+ toLogEntry() {
230
+ return {
231
+ type: this.type,
232
+ category: this.category,
233
+ provider: this.provider,
234
+ isRetryable: this.isRetryable,
235
+ retryAfterMs: this.retryAfterMs,
236
+ message: this.message,
237
+ userMessage: this.userMessage,
238
+ actionRequired: this.actionRequired,
239
+ technicalDetails: this.technicalDetails,
240
+ stack: this.stack,
241
+ originalError: this.originalError
242
+ ? {
243
+ name: this.originalError.name,
244
+ message: this.originalError.message,
245
+ stack: this.originalError.stack,
246
+ }
247
+ : null,
248
+ };
249
+ }
250
+ }
251
+ /**
252
+ * Error factory for common OAuth error scenarios
253
+ */
254
+ export class OAuthErrorFactory {
255
+ /**
256
+ * Creates an authentication required error
257
+ */
258
+ static authenticationRequired(provider, details) {
259
+ return new OAuthError(OAuthErrorType.AUTHENTICATION_REQUIRED, provider, `Authentication required for ${provider}`, { technicalDetails: details });
260
+ }
261
+ /**
262
+ * Creates an expired authorization error
263
+ */
264
+ static authorizationExpired(provider, details) {
265
+ return new OAuthError(OAuthErrorType.AUTHORIZATION_EXPIRED, provider, `Authorization expired for ${provider}`, { technicalDetails: details });
266
+ }
267
+ /**
268
+ * Creates a network error with retry capability
269
+ */
270
+ static networkError(provider, originalError, details) {
271
+ return new OAuthError(OAuthErrorType.NETWORK_ERROR, provider, `Network error connecting to ${provider}`, {
272
+ originalError,
273
+ technicalDetails: details,
274
+ retryAfterMs: 1000, // Retry after 1 second
275
+ });
276
+ }
277
+ /**
278
+ * Creates a rate limited error with specific retry delay
279
+ */
280
+ static rateLimited(provider, retryAfterSeconds = 60, details) {
281
+ return new OAuthError(OAuthErrorType.RATE_LIMITED, provider, `Rate limited by ${provider}`, {
282
+ technicalDetails: details,
283
+ retryAfterMs: retryAfterSeconds * 1000,
284
+ });
285
+ }
286
+ /**
287
+ * Creates a storage error
288
+ */
289
+ static storageError(provider, originalError, details) {
290
+ return new OAuthError(OAuthErrorType.STORAGE_ERROR, provider, `Storage error for ${provider}`, { originalError, technicalDetails: details });
291
+ }
292
+ /**
293
+ * Creates a corrupted data error
294
+ */
295
+ static corruptedData(provider, details) {
296
+ return new OAuthError(OAuthErrorType.CORRUPTED_DATA, provider, `Corrupted data for ${provider}`, { technicalDetails: details });
297
+ }
298
+ /**
299
+ * Creates an error from an unknown error, attempting classification
300
+ */
301
+ static fromUnknown(provider, error, context) {
302
+ let originalError = null;
303
+ let message = 'Unknown error';
304
+ let type = OAuthErrorType.UNKNOWN;
305
+ if (error instanceof Error) {
306
+ originalError = error;
307
+ message = error.message;
308
+ // Attempt to classify based on error message or type
309
+ const errorWithCode = error;
310
+ if (error.message.toLowerCase().includes('network') ||
311
+ error.message.toLowerCase().includes('connection') ||
312
+ errorWithCode.code === 'ENOTFOUND' ||
313
+ errorWithCode.code === 'ECONNREFUSED') {
314
+ type = OAuthErrorType.NETWORK_ERROR;
315
+ }
316
+ else if (error.message.toLowerCase().includes('timeout')) {
317
+ type = OAuthErrorType.TIMEOUT;
318
+ }
319
+ else if (error.message.toLowerCase().includes('permission') ||
320
+ errorWithCode.code === 'EACCES' ||
321
+ errorWithCode.code === 'EPERM') {
322
+ type = OAuthErrorType.FILE_PERMISSIONS;
323
+ }
324
+ else if (error.message.toLowerCase().includes('unauthorized') ||
325
+ error.message.toLowerCase().includes('invalid_grant') ||
326
+ error.message.toLowerCase().includes('expired')) {
327
+ type = OAuthErrorType.AUTHORIZATION_EXPIRED;
328
+ }
329
+ else if (error.message.toLowerCase().includes('rate') ||
330
+ error.message.toLowerCase().includes('too many')) {
331
+ type = OAuthErrorType.RATE_LIMITED;
332
+ }
333
+ }
334
+ else if (typeof error === 'string') {
335
+ message = error;
336
+ }
337
+ else {
338
+ message = String(error);
339
+ }
340
+ return new OAuthError(type, provider, context ? `${context}: ${message}` : message, {
341
+ originalError: originalError ?? undefined,
342
+ technicalDetails: { context, originalErrorType: typeof error },
343
+ });
344
+ }
345
+ }
346
+ /**
347
+ * Retry handler with exponential backoff and jitter
348
+ */
349
+ export class RetryHandler {
350
+ config;
351
+ constructor(config = DEFAULT_RETRY_CONFIG) {
352
+ this.config = config;
353
+ }
354
+ /**
355
+ * Executes operation with retry logic for transient errors
356
+ */
357
+ async executeWithRetry(operation, provider, context) {
358
+ let lastError = null;
359
+ for (let attempt = 1; attempt <= this.config.maxAttempts; attempt++) {
360
+ try {
361
+ return await operation();
362
+ }
363
+ catch (error) {
364
+ // Convert to OAuthError if not already
365
+ const oauthError = error instanceof OAuthError
366
+ ? error
367
+ : OAuthErrorFactory.fromUnknown(provider, error, context);
368
+ lastError = oauthError;
369
+ // Don't retry non-transient errors
370
+ if (!oauthError.isRetryable) {
371
+ throw oauthError;
372
+ }
373
+ // Don't retry on the last attempt
374
+ if (attempt >= this.config.maxAttempts) {
375
+ break;
376
+ }
377
+ // Calculate delay with exponential backoff and jitter
378
+ let delay = oauthError.retryAfterMs ??
379
+ Math.min(this.config.baseDelayMs *
380
+ Math.pow(this.config.backoffMultiplier, attempt - 1), this.config.maxDelayMs);
381
+ if (this.config.jitter) {
382
+ delay = delay * (0.5 + Math.random() * 0.5); // 50-100% of calculated delay
383
+ }
384
+ console.debug(`${provider} operation failed (attempt ${attempt}/${this.config.maxAttempts}), retrying in ${delay}ms...`);
385
+ await this.sleep(delay);
386
+ }
387
+ }
388
+ // All retries exhausted
389
+ throw (lastError ??
390
+ OAuthErrorFactory.fromUnknown(provider, new Error('Max retries exceeded'), context));
391
+ }
392
+ /**
393
+ * Sleep utility
394
+ */
395
+ sleep(ms) {
396
+ return new Promise((resolve) => setTimeout(resolve, ms));
397
+ }
398
+ }
399
+ /**
400
+ * Graceful error handler for OAuth operations
401
+ */
402
+ export class GracefulErrorHandler {
403
+ retryHandler;
404
+ constructor(retryHandler = new RetryHandler()) {
405
+ this.retryHandler = retryHandler;
406
+ }
407
+ /**
408
+ * Handles errors gracefully, providing fallback behavior when possible
409
+ */
410
+ async handleGracefully(operation, fallback, provider, context) {
411
+ try {
412
+ return await this.retryHandler.executeWithRetry(operation, provider, context);
413
+ }
414
+ catch (error) {
415
+ const oauthError = error instanceof OAuthError
416
+ ? error
417
+ : OAuthErrorFactory.fromUnknown(provider, error, context);
418
+ // Log the error for debugging
419
+ console.debug('OAuth operation failed gracefully:', oauthError.toLogEntry());
420
+ // Critical errors should not be handled gracefully
421
+ if (oauthError.category === OAuthErrorCategory.CRITICAL) {
422
+ throw oauthError;
423
+ }
424
+ // Return fallback for non-critical errors
425
+ if (typeof fallback === 'function') {
426
+ return fallback();
427
+ }
428
+ return fallback;
429
+ }
430
+ }
431
+ /**
432
+ * Wraps a method to handle errors gracefully with logging
433
+ */
434
+ wrapMethod(method, provider, methodName, fallback) {
435
+ return async (...args) => {
436
+ try {
437
+ return await this.retryHandler.executeWithRetry(() => method(...args), provider, methodName);
438
+ }
439
+ catch (error) {
440
+ const oauthError = error instanceof OAuthError
441
+ ? error
442
+ : OAuthErrorFactory.fromUnknown(provider, error, methodName);
443
+ // Always show user-friendly error message for user-actionable errors
444
+ if (oauthError.category === OAuthErrorCategory.USER_ACTION_REQUIRED) {
445
+ console.error(oauthError.userMessage);
446
+ if (oauthError.actionRequired) {
447
+ console.error(`Action required: ${oauthError.actionRequired}`);
448
+ }
449
+ }
450
+ // Log technical details for debugging
451
+ console.debug(`${provider}.${methodName} failed:`, oauthError.toLogEntry());
452
+ // Use fallback if provided and error is not critical
453
+ if (fallback !== undefined &&
454
+ oauthError.category !== OAuthErrorCategory.CRITICAL) {
455
+ if (typeof fallback === 'function') {
456
+ return fallback(...args);
457
+ }
458
+ return fallback;
459
+ }
460
+ throw oauthError;
461
+ }
462
+ };
463
+ }
464
+ }
465
+ //# sourceMappingURL=oauth-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-errors.js","sourceRoot":"","sources":["../../src/oauth-errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Authentication precedence utility for providers
8
+ *
9
+ * Implements the authentication precedence chain:
10
+ * 1. Provider-specific auth-key/keyfile (from getProviderSettings)
11
+ * 2. Constructor API key
12
+ * 3. Global auth-key/keyfile (from settings when activeProvider matches)
13
+ * 4. Environment variables
14
+ * 5. OAuth (if enabled)
15
+ *
16
+ * @plan PLAN-20260608-ISSUE1586.P09
17
+ * @requirement REQ-AUTH-001.1, REQ-API-001.4
18
+ */
19
+ import type { ISettingsService } from './interfaces/settings-service.js';
20
+ import type { IProviderRuntimeContext } from './interfaces/runtime-context.js';
21
+ import type { IDebugLogger } from './interfaces/debug-logger.js';
22
+ export interface AuthPrecedenceConfig {
23
+ apiKey?: string;
24
+ envKeyNames?: string[];
25
+ isOAuthEnabled?: boolean;
26
+ supportsOAuth?: boolean;
27
+ oauthProvider?: string;
28
+ providerId?: string;
29
+ }
30
+ import { type OAuthToken } from './types.js';
31
+ export interface OAuthTokenRequestMetadata {
32
+ runtimeAuthScopeId?: string;
33
+ providerId?: string;
34
+ profileId?: string;
35
+ cliScope?: Record<string, unknown>;
36
+ runtimeMetadata?: Record<string, unknown>;
37
+ }
38
+ export interface OAuthManager {
39
+ getToken(provider: string, metadata?: OAuthTokenRequestMetadata): Promise<string | null>;
40
+ isAuthenticated(provider: string): Promise<boolean>;
41
+ getOAuthToken?(provider: string, metadata?: OAuthTokenRequestMetadata): Promise<OAuthToken | null>;
42
+ /**
43
+ * Force refresh a token when it is known to be revoked.
44
+ * @fix issue1861 - Token revocation handling
45
+ */
46
+ forceRefreshToken?(provider: string, failedAccessToken: string): Promise<OAuthToken | null>;
47
+ }
48
+ /**
49
+ * @plan PLAN-20251018-STATELESSPROVIDER2.P18
50
+ * @requirement REQ-SP2-004
51
+ * Runtime-scoped credential bookkeeping keyed by runtime, provider, and profile identifiers.
52
+ */
53
+ export interface RuntimeScopedAuthEntry {
54
+ key: string;
55
+ providerId: string;
56
+ profileId: string;
57
+ runtimeAuthScopeId: string;
58
+ token: string;
59
+ createdAt: number;
60
+ updatedAt: number;
61
+ expiresAt?: number;
62
+ stale: boolean;
63
+ cancellationHook?: () => void | Promise<void>;
64
+ }
65
+ export interface RuntimeAuthScopeCacheEntrySummary {
66
+ key: string;
67
+ providerId: string;
68
+ profileId: string;
69
+ runtimeAuthScopeId: string;
70
+ preview: string;
71
+ createdAt: number;
72
+ expiresAt?: number;
73
+ stale: boolean;
74
+ reason?: string;
75
+ }
76
+ interface RuntimeAuthScopeMetadataRecord {
77
+ runtimeAuthScopeId: string;
78
+ cacheEntries: RuntimeAuthScopeCacheEntrySummary[];
79
+ cancellationHooks: Array<() => void | Promise<void>>;
80
+ revokedTokens: RuntimeAuthScopeCacheEntrySummary[];
81
+ metrics: {
82
+ hits: number;
83
+ misses: number;
84
+ lastUpdated: number;
85
+ };
86
+ }
87
+ export interface RuntimeScopedState {
88
+ runtimeAuthScopeId: string;
89
+ entries: Map<string, RuntimeScopedAuthEntry>;
90
+ metadata: RuntimeAuthScopeMetadataRecord;
91
+ settingsService?: ISettingsService;
92
+ settingsSubscriptions: Array<() => void>;
93
+ }
94
+ export declare const runtimeScopedStates: Map<string, RuntimeScopedState>;
95
+ export declare function resolveProfileId(settingsService: ISettingsService): string | null;
96
+ export declare function buildCacheKey(runtimeId: string, providerId: string, profileId: string): string;
97
+ export declare function ensureRuntimeState(context: IProviderRuntimeContext, logger?: IDebugLogger): RuntimeScopedState;
98
+ export declare function recordCacheHit(state: RuntimeScopedState): void;
99
+ export declare function recordCacheMiss(state: RuntimeScopedState): void;
100
+ export declare function getValidCachedEntry(state: RuntimeScopedState, providerId: string, profileId: string): RuntimeScopedAuthEntry | null;
101
+ export declare function registerSettingsSubscriptions(state: RuntimeScopedState, settingsService: ISettingsService, providerId: string, logger?: IDebugLogger): void;
102
+ export declare function invalidateMatchingEntries(state: RuntimeScopedState, predicate: (entry: RuntimeScopedAuthEntry) => boolean, reason: string): RuntimeAuthScopeCacheEntrySummary[];
103
+ export declare function storeRuntimeScopedToken(state: RuntimeScopedState, providerId: string, profileId: string, token: string, oauthToken?: OAuthToken | null): void;
104
+ export declare function invalidateEntry(state: RuntimeScopedState, cacheKey: string, reason: string): RuntimeAuthScopeCacheEntrySummary;
105
+ export interface RuntimeAuthScopeFlushResult {
106
+ runtimeId: string;
107
+ revokedTokens: RuntimeAuthScopeCacheEntrySummary[];
108
+ }
109
+ /**
110
+ * Flush scoped credentials for a runtime and return revocation metadata.
111
+ * @plan PLAN-20251018-STATELESSPROVIDER2.P18, PLAN-20260608-ISSUE1586.P09
112
+ * @requirement REQ-SP2-004, REQ-API-001.4
113
+ */
114
+ export declare function flushRuntimeAuthScope(runtimeId: string): RuntimeAuthScopeFlushResult;
115
+ export { AuthPrecedenceResolver } from './auth-precedence-resolver.js';