@vybestack/llxprt-code-core 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.
Files changed (153) hide show
  1. package/README.md +21 -17
  2. package/dist/src/adapters/IStreamAdapter.d.ts +3 -3
  3. package/dist/src/auth/oauth-errors.d.ts +173 -0
  4. package/dist/src/auth/oauth-errors.js +461 -0
  5. package/dist/src/auth/oauth-errors.js.map +1 -0
  6. package/dist/src/auth/precedence.d.ts +1 -5
  7. package/dist/src/auth/precedence.js +28 -48
  8. package/dist/src/auth/precedence.js.map +1 -1
  9. package/dist/src/auth/token-store.js +2 -2
  10. package/dist/src/auth/token-store.js.map +1 -1
  11. package/dist/src/auth/types.d.ts +4 -4
  12. package/dist/src/code_assist/codeAssist.js +19 -6
  13. package/dist/src/code_assist/codeAssist.js.map +1 -1
  14. package/dist/src/code_assist/oauth2.d.ts +7 -0
  15. package/dist/src/code_assist/oauth2.js +82 -32
  16. package/dist/src/code_assist/oauth2.js.map +1 -1
  17. package/dist/src/code_assist/server.js +15 -4
  18. package/dist/src/code_assist/server.js.map +1 -1
  19. package/dist/src/code_assist/setup.js +9 -0
  20. package/dist/src/code_assist/setup.js.map +1 -1
  21. package/dist/src/config/index.d.ts +7 -0
  22. package/dist/src/config/index.js +8 -0
  23. package/dist/src/config/index.js.map +1 -0
  24. package/dist/src/core/client.d.ts +15 -20
  25. package/dist/src/core/client.js +98 -124
  26. package/dist/src/core/client.js.map +1 -1
  27. package/dist/src/core/compression-config.d.ts +10 -0
  28. package/dist/src/core/compression-config.js +17 -0
  29. package/dist/src/core/compression-config.js.map +1 -0
  30. package/dist/src/core/coreToolScheduler.js +50 -15
  31. package/dist/src/core/coreToolScheduler.js.map +1 -1
  32. package/dist/src/core/geminiChat.d.ts +68 -9
  33. package/dist/src/core/geminiChat.js +940 -405
  34. package/dist/src/core/geminiChat.js.map +1 -1
  35. package/dist/src/core/nonInteractiveToolExecutor.js +70 -19
  36. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  37. package/dist/src/core/prompts.js +35 -25
  38. package/dist/src/core/prompts.js.map +1 -1
  39. package/dist/src/core/turn.d.ts +1 -0
  40. package/dist/src/core/turn.js +8 -6
  41. package/dist/src/core/turn.js.map +1 -1
  42. package/dist/src/ide/ide-client.d.ts +1 -1
  43. package/dist/src/ide/ide-client.js +12 -6
  44. package/dist/src/ide/ide-client.js.map +1 -1
  45. package/dist/src/index.d.ts +4 -2
  46. package/dist/src/index.js +5 -2
  47. package/dist/src/index.js.map +1 -1
  48. package/dist/src/prompt-config/TemplateEngine.js +17 -0
  49. package/dist/src/prompt-config/TemplateEngine.js.map +1 -1
  50. package/dist/src/prompt-config/defaults/core-defaults.js +39 -32
  51. package/dist/src/prompt-config/defaults/core-defaults.js.map +1 -1
  52. package/dist/src/prompt-config/defaults/core.md +2 -0
  53. package/dist/src/prompt-config/defaults/provider-defaults.js +34 -27
  54. package/dist/src/prompt-config/defaults/provider-defaults.js.map +1 -1
  55. package/dist/src/prompt-config/defaults/providers/gemini/core.md +270 -0
  56. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +12 -0
  57. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/gemini-2-5-flash/core.md +12 -0
  58. package/dist/src/prompt-config/types.d.ts +2 -0
  59. package/dist/src/providers/BaseProvider.d.ts +39 -13
  60. package/dist/src/providers/BaseProvider.js +102 -28
  61. package/dist/src/providers/BaseProvider.js.map +1 -1
  62. package/dist/src/providers/IProvider.d.ts +17 -3
  63. package/dist/src/providers/LoggingProviderWrapper.d.ts +10 -3
  64. package/dist/src/providers/LoggingProviderWrapper.js +33 -27
  65. package/dist/src/providers/LoggingProviderWrapper.js.map +1 -1
  66. package/dist/src/providers/ProviderContentGenerator.d.ts +2 -2
  67. package/dist/src/providers/ProviderContentGenerator.js +9 -6
  68. package/dist/src/providers/ProviderContentGenerator.js.map +1 -1
  69. package/dist/src/providers/ProviderManager.d.ts +4 -0
  70. package/dist/src/providers/ProviderManager.js +6 -0
  71. package/dist/src/providers/ProviderManager.js.map +1 -1
  72. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +34 -21
  73. package/dist/src/providers/anthropic/AnthropicProvider.js +505 -492
  74. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
  75. package/dist/src/providers/gemini/GeminiProvider.d.ts +23 -9
  76. package/dist/src/providers/gemini/GeminiProvider.js +344 -515
  77. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  78. package/dist/src/providers/openai/ConversationCache.d.ts +3 -3
  79. package/dist/src/providers/openai/IChatGenerateParams.d.ts +9 -4
  80. package/dist/src/providers/openai/OpenAIProvider.d.ts +46 -96
  81. package/dist/src/providers/openai/OpenAIProvider.js +580 -1392
  82. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  83. package/dist/src/providers/openai/buildResponsesRequest.d.ts +3 -3
  84. package/dist/src/providers/openai/buildResponsesRequest.js +67 -37
  85. package/dist/src/providers/openai/buildResponsesRequest.js.map +1 -1
  86. package/dist/src/providers/openai/estimateRemoteTokens.d.ts +2 -2
  87. package/dist/src/providers/openai/estimateRemoteTokens.js +21 -8
  88. package/dist/src/providers/openai/estimateRemoteTokens.js.map +1 -1
  89. package/dist/src/providers/openai/parseResponsesStream.d.ts +6 -2
  90. package/dist/src/providers/openai/parseResponsesStream.js +99 -391
  91. package/dist/src/providers/openai/parseResponsesStream.js.map +1 -1
  92. package/dist/src/providers/openai/syntheticToolResponses.d.ts +5 -5
  93. package/dist/src/providers/openai/syntheticToolResponses.js +102 -91
  94. package/dist/src/providers/openai/syntheticToolResponses.js.map +1 -1
  95. package/dist/src/providers/openai-responses/OpenAIResponsesProvider.d.ts +89 -0
  96. package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js +451 -0
  97. package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js.map +1 -0
  98. package/dist/src/providers/openai-responses/index.d.ts +1 -0
  99. package/dist/src/providers/openai-responses/index.js +2 -0
  100. package/dist/src/providers/openai-responses/index.js.map +1 -0
  101. package/dist/src/providers/tokenizers/OpenAITokenizer.js +3 -3
  102. package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +1 -1
  103. package/dist/src/providers/types.d.ts +1 -1
  104. package/dist/src/services/ClipboardService.d.ts +19 -0
  105. package/dist/src/services/ClipboardService.js +66 -0
  106. package/dist/src/services/ClipboardService.js.map +1 -0
  107. package/dist/src/services/history/ContentConverters.d.ts +43 -0
  108. package/dist/src/services/history/ContentConverters.js +325 -0
  109. package/dist/src/services/history/ContentConverters.js.map +1 -0
  110. package/dist/src/{providers/IMessage.d.ts → services/history/HistoryEvents.d.ts} +16 -22
  111. package/dist/src/{providers/IMessage.js → services/history/HistoryEvents.js} +1 -1
  112. package/dist/src/services/history/HistoryEvents.js.map +1 -0
  113. package/dist/src/services/history/HistoryService.d.ts +220 -0
  114. package/dist/src/services/history/HistoryService.js +673 -0
  115. package/dist/src/services/history/HistoryService.js.map +1 -0
  116. package/dist/src/services/history/IContent.d.ts +183 -0
  117. package/dist/src/services/history/IContent.js +104 -0
  118. package/dist/src/services/history/IContent.js.map +1 -0
  119. package/dist/src/services/index.d.ts +1 -0
  120. package/dist/src/services/index.js +1 -0
  121. package/dist/src/services/index.js.map +1 -1
  122. package/dist/src/settings/SettingsService.js.map +1 -1
  123. package/dist/src/telemetry/types.d.ts +16 -4
  124. package/dist/src/telemetry/types.js.map +1 -1
  125. package/dist/src/tools/IToolFormatter.d.ts +2 -2
  126. package/dist/src/tools/ToolFormatter.d.ts +42 -4
  127. package/dist/src/tools/ToolFormatter.js +151 -64
  128. package/dist/src/tools/ToolFormatter.js.map +1 -1
  129. package/dist/src/tools/doubleEscapeUtils.d.ts +57 -0
  130. package/dist/src/tools/doubleEscapeUtils.js +241 -0
  131. package/dist/src/tools/doubleEscapeUtils.js.map +1 -0
  132. package/dist/src/tools/read-file.d.ts +6 -1
  133. package/dist/src/tools/read-file.js +25 -11
  134. package/dist/src/tools/read-file.js.map +1 -1
  135. package/dist/src/tools/todo-schemas.d.ts +4 -4
  136. package/dist/src/tools/tool-registry.d.ts +8 -1
  137. package/dist/src/tools/tool-registry.js +79 -23
  138. package/dist/src/tools/tool-registry.js.map +1 -1
  139. package/dist/src/tools/tools.js +13 -0
  140. package/dist/src/tools/tools.js.map +1 -1
  141. package/dist/src/tools/write-file.d.ts +6 -1
  142. package/dist/src/tools/write-file.js +48 -26
  143. package/dist/src/tools/write-file.js.map +1 -1
  144. package/dist/src/types/modelParams.d.ts +12 -0
  145. package/dist/src/utils/bfsFileSearch.js +2 -6
  146. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  147. package/dist/src/utils/schemaValidator.js +16 -1
  148. package/dist/src/utils/schemaValidator.js.map +1 -1
  149. package/package.json +8 -7
  150. package/dist/src/providers/IMessage.js.map +0 -1
  151. package/dist/src/providers/adapters/GeminiCompatibleWrapper.d.ts +0 -69
  152. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +0 -577
  153. 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 both absolute and relative paths
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
- // 1. Check /key command key (highest priority)
32
- if (this.config.commandKey && this.config.commandKey.trim() !== '') {
33
- return this.config.commandKey;
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
- if (this.config.commandKeyfile) {
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(this.config.commandKeyfile);
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 command keyfile ${this.config.commandKeyfile}:`, error);
50
+ console.warn(`Failed to read keyfile from SettingsService ${authKeyfile}:`, error);
46
51
  }
47
52
  }
48
53
  }
49
- // 3. Check --key CLI argument
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
- // 6. OAuth (if enabled and supported)
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
- if (this.config.commandKey && this.config.commandKey.trim() !== '') {
108
+ const authKey = settingsService.get('auth-key');
109
+ if (authKey && typeof authKey === 'string' && authKey.trim() !== '') {
121
110
  return 'command-key';
122
111
  }
123
- if (this.config.commandKeyfile) {
112
+ const authKeyfile = settingsService.get('auth-keyfile');
113
+ if (authKeyfile && typeof authKeyfile === 'string') {
124
114
  try {
125
- const keyFromFile = await this.readKeyFile(this.config.commandKeyfile);
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 both absolute and relative paths
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(filePath)
179
- ? filePath
180
- : path.resolve(process.cwd(), filePath);
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 === '') {