@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.
Files changed (137) hide show
  1. package/dist/__tests__/auto-mode-handler.test.d.ts +2 -0
  2. package/dist/__tests__/auto-mode-handler.test.d.ts.map +1 -0
  3. package/dist/__tests__/auto-mode-handler.test.js +362 -0
  4. package/dist/__tests__/auto-mode-handler.test.js.map +1 -0
  5. package/dist/__tests__/discord-connector.test.d.ts +2 -0
  6. package/dist/__tests__/discord-connector.test.d.ts.map +1 -0
  7. package/dist/__tests__/discord-connector.test.js +958 -0
  8. package/dist/__tests__/discord-connector.test.js.map +1 -0
  9. package/dist/__tests__/error-handler.test.d.ts +2 -0
  10. package/dist/__tests__/error-handler.test.d.ts.map +1 -0
  11. package/dist/__tests__/error-handler.test.js +509 -0
  12. package/dist/__tests__/error-handler.test.js.map +1 -0
  13. package/dist/__tests__/errors.test.d.ts +2 -0
  14. package/dist/__tests__/errors.test.d.ts.map +1 -0
  15. package/dist/__tests__/errors.test.js +152 -0
  16. package/dist/__tests__/errors.test.js.map +1 -0
  17. package/dist/__tests__/logger.test.d.ts +2 -0
  18. package/dist/__tests__/logger.test.d.ts.map +1 -0
  19. package/dist/__tests__/logger.test.js +282 -0
  20. package/dist/__tests__/logger.test.js.map +1 -0
  21. package/dist/__tests__/mention-handler.test.d.ts +2 -0
  22. package/dist/__tests__/mention-handler.test.d.ts.map +1 -0
  23. package/dist/__tests__/mention-handler.test.js +547 -0
  24. package/dist/__tests__/mention-handler.test.js.map +1 -0
  25. package/dist/auto-mode-handler.d.ts +145 -0
  26. package/dist/auto-mode-handler.d.ts.map +1 -0
  27. package/dist/auto-mode-handler.js +211 -0
  28. package/dist/auto-mode-handler.js.map +1 -0
  29. package/dist/commands/__tests__/command-manager.test.d.ts +2 -0
  30. package/dist/commands/__tests__/command-manager.test.d.ts.map +1 -0
  31. package/dist/commands/__tests__/command-manager.test.js +307 -0
  32. package/dist/commands/__tests__/command-manager.test.js.map +1 -0
  33. package/dist/commands/__tests__/help.test.d.ts +2 -0
  34. package/dist/commands/__tests__/help.test.d.ts.map +1 -0
  35. package/dist/commands/__tests__/help.test.js +105 -0
  36. package/dist/commands/__tests__/help.test.js.map +1 -0
  37. package/dist/commands/__tests__/reset.test.d.ts +2 -0
  38. package/dist/commands/__tests__/reset.test.d.ts.map +1 -0
  39. package/dist/commands/__tests__/reset.test.js +140 -0
  40. package/dist/commands/__tests__/reset.test.js.map +1 -0
  41. package/dist/commands/__tests__/status.test.d.ts +2 -0
  42. package/dist/commands/__tests__/status.test.d.ts.map +1 -0
  43. package/dist/commands/__tests__/status.test.js +205 -0
  44. package/dist/commands/__tests__/status.test.js.map +1 -0
  45. package/dist/commands/command-manager.d.ts +66 -0
  46. package/dist/commands/command-manager.d.ts.map +1 -0
  47. package/dist/commands/command-manager.js +191 -0
  48. package/dist/commands/command-manager.js.map +1 -0
  49. package/dist/commands/help.d.ts +8 -0
  50. package/dist/commands/help.d.ts.map +1 -0
  51. package/dist/commands/help.js +27 -0
  52. package/dist/commands/help.js.map +1 -0
  53. package/dist/commands/index.d.ts +12 -0
  54. package/dist/commands/index.d.ts.map +1 -0
  55. package/dist/commands/index.js +13 -0
  56. package/dist/commands/index.js.map +1 -0
  57. package/dist/commands/reset.d.ts +9 -0
  58. package/dist/commands/reset.d.ts.map +1 -0
  59. package/dist/commands/reset.js +28 -0
  60. package/dist/commands/reset.js.map +1 -0
  61. package/dist/commands/status.d.ts +9 -0
  62. package/dist/commands/status.d.ts.map +1 -0
  63. package/dist/commands/status.js +102 -0
  64. package/dist/commands/status.js.map +1 -0
  65. package/dist/commands/types.d.ts +87 -0
  66. package/dist/commands/types.d.ts.map +1 -0
  67. package/dist/commands/types.js +8 -0
  68. package/dist/commands/types.js.map +1 -0
  69. package/dist/discord-connector.d.ts +154 -0
  70. package/dist/discord-connector.d.ts.map +1 -0
  71. package/dist/discord-connector.js +638 -0
  72. package/dist/discord-connector.js.map +1 -0
  73. package/dist/error-handler.d.ts +237 -0
  74. package/dist/error-handler.d.ts.map +1 -0
  75. package/dist/error-handler.js +433 -0
  76. package/dist/error-handler.js.map +1 -0
  77. package/dist/errors.d.ts +61 -0
  78. package/dist/errors.d.ts.map +1 -0
  79. package/dist/errors.js +77 -0
  80. package/dist/errors.js.map +1 -0
  81. package/dist/index.d.ts +34 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +36 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/logger.d.ts +119 -0
  86. package/dist/logger.d.ts.map +1 -0
  87. package/dist/logger.js +198 -0
  88. package/dist/logger.js.map +1 -0
  89. package/dist/mention-handler.d.ts +176 -0
  90. package/dist/mention-handler.d.ts.map +1 -0
  91. package/dist/mention-handler.js +236 -0
  92. package/dist/mention-handler.js.map +1 -0
  93. package/dist/session-manager/__tests__/errors.test.d.ts +2 -0
  94. package/dist/session-manager/__tests__/errors.test.d.ts.map +1 -0
  95. package/dist/session-manager/__tests__/errors.test.js +124 -0
  96. package/dist/session-manager/__tests__/errors.test.js.map +1 -0
  97. package/dist/session-manager/__tests__/session-manager.test.d.ts +2 -0
  98. package/dist/session-manager/__tests__/session-manager.test.d.ts.map +1 -0
  99. package/dist/session-manager/__tests__/session-manager.test.js +517 -0
  100. package/dist/session-manager/__tests__/session-manager.test.js.map +1 -0
  101. package/dist/session-manager/__tests__/types.test.d.ts +2 -0
  102. package/dist/session-manager/__tests__/types.test.d.ts.map +1 -0
  103. package/dist/session-manager/__tests__/types.test.js +169 -0
  104. package/dist/session-manager/__tests__/types.test.js.map +1 -0
  105. package/dist/session-manager/errors.d.ts +58 -0
  106. package/dist/session-manager/errors.d.ts.map +1 -0
  107. package/dist/session-manager/errors.js +70 -0
  108. package/dist/session-manager/errors.js.map +1 -0
  109. package/dist/session-manager/index.d.ts +11 -0
  110. package/dist/session-manager/index.d.ts.map +1 -0
  111. package/dist/session-manager/index.js +12 -0
  112. package/dist/session-manager/index.js.map +1 -0
  113. package/dist/session-manager/session-manager.d.ts +107 -0
  114. package/dist/session-manager/session-manager.d.ts.map +1 -0
  115. package/dist/session-manager/session-manager.js +347 -0
  116. package/dist/session-manager/session-manager.js.map +1 -0
  117. package/dist/session-manager/types.d.ts +167 -0
  118. package/dist/session-manager/types.d.ts.map +1 -0
  119. package/dist/session-manager/types.js +57 -0
  120. package/dist/session-manager/types.js.map +1 -0
  121. package/dist/types.d.ts +323 -0
  122. package/dist/types.d.ts.map +1 -0
  123. package/dist/types.js +8 -0
  124. package/dist/types.js.map +1 -0
  125. package/dist/utils/__tests__/formatting.test.d.ts +2 -0
  126. package/dist/utils/__tests__/formatting.test.d.ts.map +1 -0
  127. package/dist/utils/__tests__/formatting.test.js +571 -0
  128. package/dist/utils/__tests__/formatting.test.js.map +1 -0
  129. package/dist/utils/formatting.d.ts +211 -0
  130. package/dist/utils/formatting.d.ts.map +1 -0
  131. package/dist/utils/formatting.js +305 -0
  132. package/dist/utils/formatting.js.map +1 -0
  133. package/dist/utils/index.d.ts +5 -0
  134. package/dist/utils/index.d.ts.map +1 -0
  135. package/dist/utils/index.js +9 -0
  136. package/dist/utils/index.js.map +1 -0
  137. 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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"}