@herdctl/discord 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/auto-mode-handler.test.d.ts +2 -0
- package/dist/__tests__/auto-mode-handler.test.d.ts.map +1 -0
- package/dist/__tests__/auto-mode-handler.test.js +362 -0
- package/dist/__tests__/auto-mode-handler.test.js.map +1 -0
- package/dist/__tests__/discord-connector.test.d.ts +2 -0
- package/dist/__tests__/discord-connector.test.d.ts.map +1 -0
- package/dist/__tests__/discord-connector.test.js +958 -0
- package/dist/__tests__/discord-connector.test.js.map +1 -0
- package/dist/__tests__/error-handler.test.d.ts +2 -0
- package/dist/__tests__/error-handler.test.d.ts.map +1 -0
- package/dist/__tests__/error-handler.test.js +509 -0
- package/dist/__tests__/error-handler.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +152 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +282 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/mention-handler.test.d.ts +2 -0
- package/dist/__tests__/mention-handler.test.d.ts.map +1 -0
- package/dist/__tests__/mention-handler.test.js +547 -0
- package/dist/__tests__/mention-handler.test.js.map +1 -0
- package/dist/auto-mode-handler.d.ts +145 -0
- package/dist/auto-mode-handler.d.ts.map +1 -0
- package/dist/auto-mode-handler.js +211 -0
- package/dist/auto-mode-handler.js.map +1 -0
- package/dist/commands/__tests__/command-manager.test.d.ts +2 -0
- package/dist/commands/__tests__/command-manager.test.d.ts.map +1 -0
- package/dist/commands/__tests__/command-manager.test.js +307 -0
- package/dist/commands/__tests__/command-manager.test.js.map +1 -0
- package/dist/commands/__tests__/help.test.d.ts +2 -0
- package/dist/commands/__tests__/help.test.d.ts.map +1 -0
- package/dist/commands/__tests__/help.test.js +105 -0
- package/dist/commands/__tests__/help.test.js.map +1 -0
- package/dist/commands/__tests__/reset.test.d.ts +2 -0
- package/dist/commands/__tests__/reset.test.d.ts.map +1 -0
- package/dist/commands/__tests__/reset.test.js +140 -0
- package/dist/commands/__tests__/reset.test.js.map +1 -0
- package/dist/commands/__tests__/status.test.d.ts +2 -0
- package/dist/commands/__tests__/status.test.d.ts.map +1 -0
- package/dist/commands/__tests__/status.test.js +205 -0
- package/dist/commands/__tests__/status.test.js.map +1 -0
- package/dist/commands/command-manager.d.ts +66 -0
- package/dist/commands/command-manager.d.ts.map +1 -0
- package/dist/commands/command-manager.js +191 -0
- package/dist/commands/command-manager.js.map +1 -0
- package/dist/commands/help.d.ts +8 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +27 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/index.d.ts +12 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +13 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/reset.d.ts +9 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +28 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +102 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/types.d.ts +87 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +8 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/discord-connector.d.ts +154 -0
- package/dist/discord-connector.d.ts.map +1 -0
- package/dist/discord-connector.js +638 -0
- package/dist/discord-connector.js.map +1 -0
- package/dist/error-handler.d.ts +237 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +433 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/errors.d.ts +61 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +77 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +119 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +198 -0
- package/dist/logger.js.map +1 -0
- package/dist/mention-handler.d.ts +176 -0
- package/dist/mention-handler.d.ts.map +1 -0
- package/dist/mention-handler.js +236 -0
- package/dist/mention-handler.js.map +1 -0
- package/dist/session-manager/__tests__/errors.test.d.ts +2 -0
- package/dist/session-manager/__tests__/errors.test.d.ts.map +1 -0
- package/dist/session-manager/__tests__/errors.test.js +124 -0
- package/dist/session-manager/__tests__/errors.test.js.map +1 -0
- package/dist/session-manager/__tests__/session-manager.test.d.ts +2 -0
- package/dist/session-manager/__tests__/session-manager.test.d.ts.map +1 -0
- package/dist/session-manager/__tests__/session-manager.test.js +517 -0
- package/dist/session-manager/__tests__/session-manager.test.js.map +1 -0
- package/dist/session-manager/__tests__/types.test.d.ts +2 -0
- package/dist/session-manager/__tests__/types.test.d.ts.map +1 -0
- package/dist/session-manager/__tests__/types.test.js +169 -0
- package/dist/session-manager/__tests__/types.test.js.map +1 -0
- package/dist/session-manager/errors.d.ts +58 -0
- package/dist/session-manager/errors.d.ts.map +1 -0
- package/dist/session-manager/errors.js +70 -0
- package/dist/session-manager/errors.js.map +1 -0
- package/dist/session-manager/index.d.ts +11 -0
- package/dist/session-manager/index.d.ts.map +1 -0
- package/dist/session-manager/index.js +12 -0
- package/dist/session-manager/index.js.map +1 -0
- package/dist/session-manager/session-manager.d.ts +107 -0
- package/dist/session-manager/session-manager.d.ts.map +1 -0
- package/dist/session-manager/session-manager.js +347 -0
- package/dist/session-manager/session-manager.js.map +1 -0
- package/dist/session-manager/types.d.ts +167 -0
- package/dist/session-manager/types.d.ts.map +1 -0
- package/dist/session-manager/types.js +57 -0
- package/dist/session-manager/types.js.map +1 -0
- package/dist/types.d.ts +323 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/__tests__/formatting.test.d.ts +2 -0
- package/dist/utils/__tests__/formatting.test.d.ts.map +1 -0
- package/dist/utils/__tests__/formatting.test.js +571 -0
- package/dist/utils/__tests__/formatting.test.js.map +1 -0
- package/dist/utils/formatting.d.ts +211 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +305 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error handler utilities for Discord connector
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - User-friendly error messages for Discord users
|
|
6
|
+
* - Detailed logging for debugging
|
|
7
|
+
* - Retry logic for transient failures
|
|
8
|
+
* - Error classification and handling
|
|
9
|
+
*/
|
|
10
|
+
import type { DiscordConnectorLogger } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Standard user-friendly error messages for Discord responses
|
|
13
|
+
*/
|
|
14
|
+
export declare const USER_ERROR_MESSAGES: {
|
|
15
|
+
/** Generic processing error */
|
|
16
|
+
readonly PROCESSING_ERROR: "Sorry, I encountered an error processing your request. Please try again.";
|
|
17
|
+
/** Connection/network error */
|
|
18
|
+
readonly CONNECTION_ERROR: "I'm having trouble connecting right now. Please try again in a moment.";
|
|
19
|
+
/** Rate limit error */
|
|
20
|
+
readonly RATE_LIMITED: "I'm receiving too many requests right now. Please wait a moment and try again.";
|
|
21
|
+
/** Command execution error */
|
|
22
|
+
readonly COMMAND_ERROR: "Sorry, I couldn't complete that command. Please try again.";
|
|
23
|
+
/** Session error */
|
|
24
|
+
readonly SESSION_ERROR: "I'm having trouble with your conversation session. Please try again.";
|
|
25
|
+
/** Timeout error */
|
|
26
|
+
readonly TIMEOUT_ERROR: "The request took too long to complete. Please try again.";
|
|
27
|
+
/** Permission error */
|
|
28
|
+
readonly PERMISSION_ERROR: "I don't have permission to do that in this channel.";
|
|
29
|
+
};
|
|
30
|
+
export type UserErrorMessageKey = keyof typeof USER_ERROR_MESSAGES;
|
|
31
|
+
/**
|
|
32
|
+
* Categories of errors for handling purposes
|
|
33
|
+
*/
|
|
34
|
+
export declare enum ErrorCategory {
|
|
35
|
+
/** Transient errors that may succeed on retry */
|
|
36
|
+
TRANSIENT = "transient",
|
|
37
|
+
/** Permanent errors that won't succeed on retry */
|
|
38
|
+
PERMANENT = "permanent",
|
|
39
|
+
/** Rate limit errors that need backoff */
|
|
40
|
+
RATE_LIMIT = "rate_limit",
|
|
41
|
+
/** Configuration/setup errors */
|
|
42
|
+
CONFIGURATION = "configuration",
|
|
43
|
+
/** Unknown/unexpected errors */
|
|
44
|
+
UNKNOWN = "unknown"
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Classified error with category and user-friendly message
|
|
48
|
+
*/
|
|
49
|
+
export interface ClassifiedError {
|
|
50
|
+
/** Original error */
|
|
51
|
+
error: Error;
|
|
52
|
+
/** Error category for handling */
|
|
53
|
+
category: ErrorCategory;
|
|
54
|
+
/** User-friendly message to display */
|
|
55
|
+
userMessage: string;
|
|
56
|
+
/** Whether this error should be retried */
|
|
57
|
+
shouldRetry: boolean;
|
|
58
|
+
/** Suggested retry delay in milliseconds (if shouldRetry is true) */
|
|
59
|
+
retryDelayMs?: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Classify an error for appropriate handling
|
|
63
|
+
*
|
|
64
|
+
* @param error - The error to classify
|
|
65
|
+
* @returns Classified error with category and handling info
|
|
66
|
+
*/
|
|
67
|
+
export declare function classifyError(error: unknown): ClassifiedError;
|
|
68
|
+
/**
|
|
69
|
+
* Options for retry operations
|
|
70
|
+
*/
|
|
71
|
+
export interface RetryOptions {
|
|
72
|
+
/** Maximum number of retry attempts (default: 3) */
|
|
73
|
+
maxAttempts?: number;
|
|
74
|
+
/** Base delay between retries in ms (default: 1000) */
|
|
75
|
+
baseDelayMs?: number;
|
|
76
|
+
/** Maximum delay between retries in ms (default: 30000) */
|
|
77
|
+
maxDelayMs?: number;
|
|
78
|
+
/** Exponential backoff multiplier (default: 2) */
|
|
79
|
+
backoffMultiplier?: number;
|
|
80
|
+
/** Logger for retry attempts */
|
|
81
|
+
logger?: DiscordConnectorLogger;
|
|
82
|
+
/** Operation name for logging */
|
|
83
|
+
operationName?: string;
|
|
84
|
+
/** Predicate to determine if error should be retried */
|
|
85
|
+
shouldRetry?: (error: unknown, attempt: number) => boolean;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Result of a retry operation
|
|
89
|
+
*/
|
|
90
|
+
export interface RetryResult<T> {
|
|
91
|
+
/** Whether the operation succeeded */
|
|
92
|
+
success: boolean;
|
|
93
|
+
/** The result value (if success is true) */
|
|
94
|
+
value?: T;
|
|
95
|
+
/** The last error encountered (if success is false) */
|
|
96
|
+
error?: Error;
|
|
97
|
+
/** Number of attempts made */
|
|
98
|
+
attempts: number;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Execute an async operation with retry logic
|
|
102
|
+
*
|
|
103
|
+
* Uses exponential backoff for transient failures.
|
|
104
|
+
* Only retries errors that are classified as retryable.
|
|
105
|
+
*
|
|
106
|
+
* @param operation - Async function to execute
|
|
107
|
+
* @param options - Retry configuration
|
|
108
|
+
* @returns Result with success status, value, or error
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* const result = await withRetry(
|
|
113
|
+
* async () => {
|
|
114
|
+
* const response = await fetch(url);
|
|
115
|
+
* if (!response.ok) throw new Error('Request failed');
|
|
116
|
+
* return response.json();
|
|
117
|
+
* },
|
|
118
|
+
* {
|
|
119
|
+
* maxAttempts: 3,
|
|
120
|
+
* operationName: 'fetchData',
|
|
121
|
+
* logger: myLogger,
|
|
122
|
+
* }
|
|
123
|
+
* );
|
|
124
|
+
*
|
|
125
|
+
* if (result.success) {
|
|
126
|
+
* console.log('Data:', result.value);
|
|
127
|
+
* } else {
|
|
128
|
+
* console.error('Failed after', result.attempts, 'attempts:', result.error);
|
|
129
|
+
* }
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export declare function withRetry<T>(operation: () => Promise<T>, options?: RetryOptions): Promise<RetryResult<T>>;
|
|
133
|
+
/**
|
|
134
|
+
* Options for the ErrorHandler
|
|
135
|
+
*/
|
|
136
|
+
export interface ErrorHandlerOptions {
|
|
137
|
+
/** Logger for error logging */
|
|
138
|
+
logger: DiscordConnectorLogger;
|
|
139
|
+
/** Agent name for context in logs */
|
|
140
|
+
agentName: string;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Error handler that provides user-friendly messages and detailed logging
|
|
144
|
+
*
|
|
145
|
+
* Handles:
|
|
146
|
+
* - Converting errors to user-friendly messages
|
|
147
|
+
* - Logging detailed error information for debugging
|
|
148
|
+
* - Tracking error statistics
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* const errorHandler = new ErrorHandler({
|
|
153
|
+
* logger: myLogger,
|
|
154
|
+
* agentName: 'my-agent',
|
|
155
|
+
* });
|
|
156
|
+
*
|
|
157
|
+
* try {
|
|
158
|
+
* await someOperation();
|
|
159
|
+
* } catch (error) {
|
|
160
|
+
* const userMessage = errorHandler.handleError(error, 'processing message');
|
|
161
|
+
* await message.reply(userMessage);
|
|
162
|
+
* }
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
export declare class ErrorHandler {
|
|
166
|
+
private readonly logger;
|
|
167
|
+
private readonly agentName;
|
|
168
|
+
private errorCounts;
|
|
169
|
+
constructor(options: ErrorHandlerOptions);
|
|
170
|
+
/**
|
|
171
|
+
* Handle an error and return a user-friendly message
|
|
172
|
+
*
|
|
173
|
+
* Logs detailed error information and returns a safe message for users.
|
|
174
|
+
*
|
|
175
|
+
* @param error - The error to handle
|
|
176
|
+
* @param context - Description of what operation was being performed
|
|
177
|
+
* @returns User-friendly error message
|
|
178
|
+
*/
|
|
179
|
+
handleError(error: unknown, context: string): string;
|
|
180
|
+
/**
|
|
181
|
+
* Handle an error with custom user message
|
|
182
|
+
*
|
|
183
|
+
* @param error - The error to handle
|
|
184
|
+
* @param context - Description of what operation was being performed
|
|
185
|
+
* @param userMessage - Custom message to return to user
|
|
186
|
+
* @returns The provided user message
|
|
187
|
+
*/
|
|
188
|
+
handleErrorWithMessage(error: unknown, context: string, userMessage: string): string;
|
|
189
|
+
/**
|
|
190
|
+
* Get error statistics
|
|
191
|
+
*
|
|
192
|
+
* @returns Map of error categories to counts
|
|
193
|
+
*/
|
|
194
|
+
getErrorStats(): ReadonlyMap<ErrorCategory, number>;
|
|
195
|
+
/**
|
|
196
|
+
* Reset error statistics
|
|
197
|
+
*/
|
|
198
|
+
resetStats(): void;
|
|
199
|
+
/**
|
|
200
|
+
* Check if an error is retryable
|
|
201
|
+
*
|
|
202
|
+
* @param error - The error to check
|
|
203
|
+
* @returns true if the error should be retried
|
|
204
|
+
*/
|
|
205
|
+
isRetryable(error: unknown): boolean;
|
|
206
|
+
/**
|
|
207
|
+
* Get the appropriate user message for an error
|
|
208
|
+
*
|
|
209
|
+
* @param error - The error to get message for
|
|
210
|
+
* @returns User-friendly error message
|
|
211
|
+
*/
|
|
212
|
+
getUserMessage(error: unknown): string;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Execute an async function and handle errors safely
|
|
216
|
+
*
|
|
217
|
+
* Returns the result or undefined if an error occurs.
|
|
218
|
+
* Always logs errors for debugging.
|
|
219
|
+
*
|
|
220
|
+
* @param operation - Async function to execute
|
|
221
|
+
* @param errorHandler - Error handler for logging
|
|
222
|
+
* @param context - Description of the operation
|
|
223
|
+
* @returns Result or undefined on error
|
|
224
|
+
*/
|
|
225
|
+
export declare function safeExecute<T>(operation: () => Promise<T>, errorHandler: ErrorHandler, context: string): Promise<T | undefined>;
|
|
226
|
+
/**
|
|
227
|
+
* Execute an async function that returns a reply to the user
|
|
228
|
+
*
|
|
229
|
+
* On error, returns a user-friendly error message instead.
|
|
230
|
+
*
|
|
231
|
+
* @param operation - Async function to execute that returns a message
|
|
232
|
+
* @param errorHandler - Error handler for logging
|
|
233
|
+
* @param context - Description of the operation
|
|
234
|
+
* @returns Result message or error message
|
|
235
|
+
*/
|
|
236
|
+
export declare function safeExecuteWithReply(operation: () => Promise<string>, errorHandler: ErrorHandler, context: string): Promise<string>;
|
|
237
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error handler utilities for Discord connector
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - User-friendly error messages for Discord users
|
|
6
|
+
* - Detailed logging for debugging
|
|
7
|
+
* - Retry logic for transient failures
|
|
8
|
+
* - Error classification and handling
|
|
9
|
+
*/
|
|
10
|
+
import { DiscordErrorCode, isDiscordConnectorError, } from "./errors.js";
|
|
11
|
+
import { isSessionManagerError, } from "./session-manager/errors.js";
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// User-Friendly Error Messages
|
|
14
|
+
// =============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Standard user-friendly error messages for Discord responses
|
|
17
|
+
*/
|
|
18
|
+
export const USER_ERROR_MESSAGES = {
|
|
19
|
+
/** Generic processing error */
|
|
20
|
+
PROCESSING_ERROR: "Sorry, I encountered an error processing your request. Please try again.",
|
|
21
|
+
/** Connection/network error */
|
|
22
|
+
CONNECTION_ERROR: "I'm having trouble connecting right now. Please try again in a moment.",
|
|
23
|
+
/** Rate limit error */
|
|
24
|
+
RATE_LIMITED: "I'm receiving too many requests right now. Please wait a moment and try again.",
|
|
25
|
+
/** Command execution error */
|
|
26
|
+
COMMAND_ERROR: "Sorry, I couldn't complete that command. Please try again.",
|
|
27
|
+
/** Session error */
|
|
28
|
+
SESSION_ERROR: "I'm having trouble with your conversation session. Please try again.",
|
|
29
|
+
/** Timeout error */
|
|
30
|
+
TIMEOUT_ERROR: "The request took too long to complete. Please try again.",
|
|
31
|
+
/** Permission error */
|
|
32
|
+
PERMISSION_ERROR: "I don't have permission to do that in this channel.",
|
|
33
|
+
};
|
|
34
|
+
// =============================================================================
|
|
35
|
+
// Error Classification
|
|
36
|
+
// =============================================================================
|
|
37
|
+
/**
|
|
38
|
+
* Categories of errors for handling purposes
|
|
39
|
+
*/
|
|
40
|
+
export var ErrorCategory;
|
|
41
|
+
(function (ErrorCategory) {
|
|
42
|
+
/** Transient errors that may succeed on retry */
|
|
43
|
+
ErrorCategory["TRANSIENT"] = "transient";
|
|
44
|
+
/** Permanent errors that won't succeed on retry */
|
|
45
|
+
ErrorCategory["PERMANENT"] = "permanent";
|
|
46
|
+
/** Rate limit errors that need backoff */
|
|
47
|
+
ErrorCategory["RATE_LIMIT"] = "rate_limit";
|
|
48
|
+
/** Configuration/setup errors */
|
|
49
|
+
ErrorCategory["CONFIGURATION"] = "configuration";
|
|
50
|
+
/** Unknown/unexpected errors */
|
|
51
|
+
ErrorCategory["UNKNOWN"] = "unknown";
|
|
52
|
+
})(ErrorCategory || (ErrorCategory = {}));
|
|
53
|
+
/**
|
|
54
|
+
* Classify an error for appropriate handling
|
|
55
|
+
*
|
|
56
|
+
* @param error - The error to classify
|
|
57
|
+
* @returns Classified error with category and handling info
|
|
58
|
+
*/
|
|
59
|
+
export function classifyError(error) {
|
|
60
|
+
// Ensure we have an Error object
|
|
61
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
62
|
+
// Check for Discord connector errors
|
|
63
|
+
if (isDiscordConnectorError(error)) {
|
|
64
|
+
return classifyDiscordError(error);
|
|
65
|
+
}
|
|
66
|
+
// Check for session manager errors
|
|
67
|
+
if (isSessionManagerError(error)) {
|
|
68
|
+
return classifySessionError(error);
|
|
69
|
+
}
|
|
70
|
+
// Check for network/connection errors
|
|
71
|
+
if (isNetworkError(err)) {
|
|
72
|
+
return {
|
|
73
|
+
error: err,
|
|
74
|
+
category: ErrorCategory.TRANSIENT,
|
|
75
|
+
userMessage: USER_ERROR_MESSAGES.CONNECTION_ERROR,
|
|
76
|
+
shouldRetry: true,
|
|
77
|
+
retryDelayMs: 1000,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Check for timeout errors
|
|
81
|
+
if (isTimeoutError(err)) {
|
|
82
|
+
return {
|
|
83
|
+
error: err,
|
|
84
|
+
category: ErrorCategory.TRANSIENT,
|
|
85
|
+
userMessage: USER_ERROR_MESSAGES.TIMEOUT_ERROR,
|
|
86
|
+
shouldRetry: true,
|
|
87
|
+
retryDelayMs: 2000,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Default: unknown error
|
|
91
|
+
return {
|
|
92
|
+
error: err,
|
|
93
|
+
category: ErrorCategory.UNKNOWN,
|
|
94
|
+
userMessage: USER_ERROR_MESSAGES.PROCESSING_ERROR,
|
|
95
|
+
shouldRetry: false,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Classify a Discord connector error
|
|
100
|
+
*/
|
|
101
|
+
function classifyDiscordError(error) {
|
|
102
|
+
switch (error.code) {
|
|
103
|
+
case DiscordErrorCode.RATE_LIMITED:
|
|
104
|
+
return {
|
|
105
|
+
error,
|
|
106
|
+
category: ErrorCategory.RATE_LIMIT,
|
|
107
|
+
userMessage: USER_ERROR_MESSAGES.RATE_LIMITED,
|
|
108
|
+
shouldRetry: true,
|
|
109
|
+
retryDelayMs: 5000, // Default, actual delay comes from Discord
|
|
110
|
+
};
|
|
111
|
+
case DiscordErrorCode.CONNECTION_FAILED:
|
|
112
|
+
case DiscordErrorCode.GATEWAY_ERROR:
|
|
113
|
+
return {
|
|
114
|
+
error,
|
|
115
|
+
category: ErrorCategory.TRANSIENT,
|
|
116
|
+
userMessage: USER_ERROR_MESSAGES.CONNECTION_ERROR,
|
|
117
|
+
shouldRetry: true,
|
|
118
|
+
retryDelayMs: 2000,
|
|
119
|
+
};
|
|
120
|
+
case DiscordErrorCode.INVALID_TOKEN:
|
|
121
|
+
case DiscordErrorCode.MISSING_TOKEN:
|
|
122
|
+
return {
|
|
123
|
+
error,
|
|
124
|
+
category: ErrorCategory.CONFIGURATION,
|
|
125
|
+
userMessage: USER_ERROR_MESSAGES.PROCESSING_ERROR,
|
|
126
|
+
shouldRetry: false,
|
|
127
|
+
};
|
|
128
|
+
case DiscordErrorCode.ALREADY_CONNECTED:
|
|
129
|
+
case DiscordErrorCode.NOT_CONNECTED:
|
|
130
|
+
return {
|
|
131
|
+
error,
|
|
132
|
+
category: ErrorCategory.PERMANENT,
|
|
133
|
+
userMessage: USER_ERROR_MESSAGES.PROCESSING_ERROR,
|
|
134
|
+
shouldRetry: false,
|
|
135
|
+
};
|
|
136
|
+
default:
|
|
137
|
+
return {
|
|
138
|
+
error,
|
|
139
|
+
category: ErrorCategory.UNKNOWN,
|
|
140
|
+
userMessage: USER_ERROR_MESSAGES.PROCESSING_ERROR,
|
|
141
|
+
shouldRetry: false,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Classify a session manager error
|
|
147
|
+
*/
|
|
148
|
+
function classifySessionError(error) {
|
|
149
|
+
// Session errors are generally transient (file system issues)
|
|
150
|
+
return {
|
|
151
|
+
error,
|
|
152
|
+
category: ErrorCategory.TRANSIENT,
|
|
153
|
+
userMessage: USER_ERROR_MESSAGES.SESSION_ERROR,
|
|
154
|
+
shouldRetry: true,
|
|
155
|
+
retryDelayMs: 1000,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Check if an error is a network-related error
|
|
160
|
+
*/
|
|
161
|
+
function isNetworkError(error) {
|
|
162
|
+
const networkErrorPatterns = [
|
|
163
|
+
"ECONNRESET",
|
|
164
|
+
"ECONNREFUSED",
|
|
165
|
+
"ETIMEDOUT",
|
|
166
|
+
"ENOTFOUND",
|
|
167
|
+
"EAI_AGAIN",
|
|
168
|
+
"ENETUNREACH",
|
|
169
|
+
"EHOSTUNREACH",
|
|
170
|
+
"socket hang up",
|
|
171
|
+
"network",
|
|
172
|
+
"connect ECONNREFUSED",
|
|
173
|
+
"getaddrinfo",
|
|
174
|
+
"fetch failed",
|
|
175
|
+
];
|
|
176
|
+
const message = error.message.toLowerCase();
|
|
177
|
+
const name = error.name.toLowerCase();
|
|
178
|
+
return networkErrorPatterns.some((pattern) => message.includes(pattern.toLowerCase()) ||
|
|
179
|
+
name.includes(pattern.toLowerCase()));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Check if an error is a timeout error
|
|
183
|
+
*/
|
|
184
|
+
function isTimeoutError(error) {
|
|
185
|
+
const timeoutPatterns = ["timeout", "timed out", "ETIMEDOUT", "AbortError"];
|
|
186
|
+
const message = error.message.toLowerCase();
|
|
187
|
+
const name = error.name.toLowerCase();
|
|
188
|
+
return timeoutPatterns.some((pattern) => message.includes(pattern.toLowerCase()) ||
|
|
189
|
+
name.includes(pattern.toLowerCase()));
|
|
190
|
+
}
|
|
191
|
+
const DEFAULT_RETRY_OPTIONS = {
|
|
192
|
+
maxAttempts: 3,
|
|
193
|
+
baseDelayMs: 1000,
|
|
194
|
+
maxDelayMs: 30000,
|
|
195
|
+
backoffMultiplier: 2,
|
|
196
|
+
operationName: "operation",
|
|
197
|
+
};
|
|
198
|
+
/**
|
|
199
|
+
* Execute an async operation with retry logic
|
|
200
|
+
*
|
|
201
|
+
* Uses exponential backoff for transient failures.
|
|
202
|
+
* Only retries errors that are classified as retryable.
|
|
203
|
+
*
|
|
204
|
+
* @param operation - Async function to execute
|
|
205
|
+
* @param options - Retry configuration
|
|
206
|
+
* @returns Result with success status, value, or error
|
|
207
|
+
*
|
|
208
|
+
* @example
|
|
209
|
+
* ```typescript
|
|
210
|
+
* const result = await withRetry(
|
|
211
|
+
* async () => {
|
|
212
|
+
* const response = await fetch(url);
|
|
213
|
+
* if (!response.ok) throw new Error('Request failed');
|
|
214
|
+
* return response.json();
|
|
215
|
+
* },
|
|
216
|
+
* {
|
|
217
|
+
* maxAttempts: 3,
|
|
218
|
+
* operationName: 'fetchData',
|
|
219
|
+
* logger: myLogger,
|
|
220
|
+
* }
|
|
221
|
+
* );
|
|
222
|
+
*
|
|
223
|
+
* if (result.success) {
|
|
224
|
+
* console.log('Data:', result.value);
|
|
225
|
+
* } else {
|
|
226
|
+
* console.error('Failed after', result.attempts, 'attempts:', result.error);
|
|
227
|
+
* }
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
export async function withRetry(operation, options = {}) {
|
|
231
|
+
const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };
|
|
232
|
+
const { maxAttempts, baseDelayMs, maxDelayMs, backoffMultiplier, operationName, logger } = opts;
|
|
233
|
+
let lastError;
|
|
234
|
+
let attempt = 0;
|
|
235
|
+
while (attempt < maxAttempts) {
|
|
236
|
+
attempt++;
|
|
237
|
+
try {
|
|
238
|
+
const value = await operation();
|
|
239
|
+
return { success: true, value, attempts: attempt };
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
243
|
+
// Classify the error to determine if we should retry
|
|
244
|
+
const classified = classifyError(error);
|
|
245
|
+
// Check custom shouldRetry predicate if provided
|
|
246
|
+
const shouldRetryError = options.shouldRetry
|
|
247
|
+
? options.shouldRetry(error, attempt)
|
|
248
|
+
: classified.shouldRetry;
|
|
249
|
+
if (!shouldRetryError || attempt >= maxAttempts) {
|
|
250
|
+
// Don't retry: either permanent error or out of attempts
|
|
251
|
+
logger?.debug(`${operationName} failed permanently after ${attempt} attempt(s)`, {
|
|
252
|
+
error: lastError.message,
|
|
253
|
+
category: classified.category,
|
|
254
|
+
});
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
// Calculate delay with exponential backoff
|
|
258
|
+
const delay = Math.min(classified.retryDelayMs ?? baseDelayMs * Math.pow(backoffMultiplier, attempt - 1), maxDelayMs);
|
|
259
|
+
logger?.info(`${operationName} failed, retrying in ${delay}ms...`, {
|
|
260
|
+
attempt,
|
|
261
|
+
maxAttempts,
|
|
262
|
+
error: lastError.message,
|
|
263
|
+
category: classified.category,
|
|
264
|
+
});
|
|
265
|
+
// Wait before retrying
|
|
266
|
+
await sleep(delay);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
success: false,
|
|
271
|
+
error: lastError,
|
|
272
|
+
attempts: attempt,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Sleep for a specified duration
|
|
277
|
+
*/
|
|
278
|
+
function sleep(ms) {
|
|
279
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Error handler that provides user-friendly messages and detailed logging
|
|
283
|
+
*
|
|
284
|
+
* Handles:
|
|
285
|
+
* - Converting errors to user-friendly messages
|
|
286
|
+
* - Logging detailed error information for debugging
|
|
287
|
+
* - Tracking error statistics
|
|
288
|
+
*
|
|
289
|
+
* @example
|
|
290
|
+
* ```typescript
|
|
291
|
+
* const errorHandler = new ErrorHandler({
|
|
292
|
+
* logger: myLogger,
|
|
293
|
+
* agentName: 'my-agent',
|
|
294
|
+
* });
|
|
295
|
+
*
|
|
296
|
+
* try {
|
|
297
|
+
* await someOperation();
|
|
298
|
+
* } catch (error) {
|
|
299
|
+
* const userMessage = errorHandler.handleError(error, 'processing message');
|
|
300
|
+
* await message.reply(userMessage);
|
|
301
|
+
* }
|
|
302
|
+
* ```
|
|
303
|
+
*/
|
|
304
|
+
export class ErrorHandler {
|
|
305
|
+
logger;
|
|
306
|
+
agentName;
|
|
307
|
+
errorCounts = new Map();
|
|
308
|
+
constructor(options) {
|
|
309
|
+
this.logger = options.logger;
|
|
310
|
+
this.agentName = options.agentName;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Handle an error and return a user-friendly message
|
|
314
|
+
*
|
|
315
|
+
* Logs detailed error information and returns a safe message for users.
|
|
316
|
+
*
|
|
317
|
+
* @param error - The error to handle
|
|
318
|
+
* @param context - Description of what operation was being performed
|
|
319
|
+
* @returns User-friendly error message
|
|
320
|
+
*/
|
|
321
|
+
handleError(error, context) {
|
|
322
|
+
const classified = classifyError(error);
|
|
323
|
+
// Increment error count for this category
|
|
324
|
+
const currentCount = this.errorCounts.get(classified.category) ?? 0;
|
|
325
|
+
this.errorCounts.set(classified.category, currentCount + 1);
|
|
326
|
+
// Log detailed error for debugging
|
|
327
|
+
this.logger.error(`Error during ${context}`, {
|
|
328
|
+
agentName: this.agentName,
|
|
329
|
+
context,
|
|
330
|
+
category: classified.category,
|
|
331
|
+
shouldRetry: classified.shouldRetry,
|
|
332
|
+
errorMessage: classified.error.message,
|
|
333
|
+
errorName: classified.error.name,
|
|
334
|
+
stack: classified.error.stack,
|
|
335
|
+
});
|
|
336
|
+
return classified.userMessage;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Handle an error with custom user message
|
|
340
|
+
*
|
|
341
|
+
* @param error - The error to handle
|
|
342
|
+
* @param context - Description of what operation was being performed
|
|
343
|
+
* @param userMessage - Custom message to return to user
|
|
344
|
+
* @returns The provided user message
|
|
345
|
+
*/
|
|
346
|
+
handleErrorWithMessage(error, context, userMessage) {
|
|
347
|
+
const classified = classifyError(error);
|
|
348
|
+
// Log detailed error for debugging
|
|
349
|
+
this.logger.error(`Error during ${context}`, {
|
|
350
|
+
agentName: this.agentName,
|
|
351
|
+
context,
|
|
352
|
+
category: classified.category,
|
|
353
|
+
errorMessage: classified.error.message,
|
|
354
|
+
errorName: classified.error.name,
|
|
355
|
+
stack: classified.error.stack,
|
|
356
|
+
});
|
|
357
|
+
return userMessage;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Get error statistics
|
|
361
|
+
*
|
|
362
|
+
* @returns Map of error categories to counts
|
|
363
|
+
*/
|
|
364
|
+
getErrorStats() {
|
|
365
|
+
return this.errorCounts;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Reset error statistics
|
|
369
|
+
*/
|
|
370
|
+
resetStats() {
|
|
371
|
+
this.errorCounts.clear();
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Check if an error is retryable
|
|
375
|
+
*
|
|
376
|
+
* @param error - The error to check
|
|
377
|
+
* @returns true if the error should be retried
|
|
378
|
+
*/
|
|
379
|
+
isRetryable(error) {
|
|
380
|
+
return classifyError(error).shouldRetry;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Get the appropriate user message for an error
|
|
384
|
+
*
|
|
385
|
+
* @param error - The error to get message for
|
|
386
|
+
* @returns User-friendly error message
|
|
387
|
+
*/
|
|
388
|
+
getUserMessage(error) {
|
|
389
|
+
return classifyError(error).userMessage;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// =============================================================================
|
|
393
|
+
// Safe Execution Helpers
|
|
394
|
+
// =============================================================================
|
|
395
|
+
/**
|
|
396
|
+
* Execute an async function and handle errors safely
|
|
397
|
+
*
|
|
398
|
+
* Returns the result or undefined if an error occurs.
|
|
399
|
+
* Always logs errors for debugging.
|
|
400
|
+
*
|
|
401
|
+
* @param operation - Async function to execute
|
|
402
|
+
* @param errorHandler - Error handler for logging
|
|
403
|
+
* @param context - Description of the operation
|
|
404
|
+
* @returns Result or undefined on error
|
|
405
|
+
*/
|
|
406
|
+
export async function safeExecute(operation, errorHandler, context) {
|
|
407
|
+
try {
|
|
408
|
+
return await operation();
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
errorHandler.handleError(error, context);
|
|
412
|
+
return undefined;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Execute an async function that returns a reply to the user
|
|
417
|
+
*
|
|
418
|
+
* On error, returns a user-friendly error message instead.
|
|
419
|
+
*
|
|
420
|
+
* @param operation - Async function to execute that returns a message
|
|
421
|
+
* @param errorHandler - Error handler for logging
|
|
422
|
+
* @param context - Description of the operation
|
|
423
|
+
* @returns Result message or error message
|
|
424
|
+
*/
|
|
425
|
+
export async function safeExecuteWithReply(operation, errorHandler, context) {
|
|
426
|
+
try {
|
|
427
|
+
return await operation();
|
|
428
|
+
}
|
|
429
|
+
catch (error) {
|
|
430
|
+
return errorHandler.handleError(error, context);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"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"}
|