modestbench 0.0.3 → 0.1.0

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 (223) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/bootstrap.cjs +0 -2
  3. package/dist/bootstrap.cjs.map +1 -1
  4. package/dist/bootstrap.d.cts.map +1 -1
  5. package/dist/bootstrap.d.ts.map +1 -1
  6. package/dist/bootstrap.js +0 -2
  7. package/dist/bootstrap.js.map +1 -1
  8. package/dist/cli/commands/history.cjs +2 -1
  9. package/dist/cli/commands/history.cjs.map +1 -1
  10. package/dist/cli/commands/history.d.cts.map +1 -1
  11. package/dist/cli/commands/history.d.ts.map +1 -1
  12. package/dist/cli/commands/history.js +2 -1
  13. package/dist/cli/commands/history.js.map +1 -1
  14. package/dist/cli/commands/init.cjs +5 -4
  15. package/dist/cli/commands/init.cjs.map +1 -1
  16. package/dist/cli/commands/init.d.cts.map +1 -1
  17. package/dist/cli/commands/init.d.ts.map +1 -1
  18. package/dist/cli/commands/init.js +5 -4
  19. package/dist/cli/commands/init.js.map +1 -1
  20. package/dist/cli/commands/run.cjs +14 -4
  21. package/dist/cli/commands/run.cjs.map +1 -1
  22. package/dist/cli/commands/run.d.cts.map +1 -1
  23. package/dist/cli/commands/run.d.ts.map +1 -1
  24. package/dist/cli/commands/run.js +14 -4
  25. package/dist/cli/commands/run.js.map +1 -1
  26. package/dist/cli/index.cjs +29 -12
  27. package/dist/cli/index.cjs.map +1 -1
  28. package/dist/cli/index.d.cts +1 -2
  29. package/dist/cli/index.d.cts.map +1 -1
  30. package/dist/cli/index.d.ts +1 -2
  31. package/dist/cli/index.d.ts.map +1 -1
  32. package/dist/cli/index.js +24 -7
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/config/manager.cjs +8 -2
  35. package/dist/config/manager.cjs.map +1 -1
  36. package/dist/config/manager.d.cts.map +1 -1
  37. package/dist/config/manager.d.ts.map +1 -1
  38. package/dist/config/manager.js +8 -2
  39. package/dist/config/manager.js.map +1 -1
  40. package/dist/constants.cjs +53 -1
  41. package/dist/constants.cjs.map +1 -1
  42. package/dist/constants.d.cts +36 -0
  43. package/dist/constants.d.cts.map +1 -1
  44. package/dist/constants.d.ts +36 -0
  45. package/dist/constants.d.ts.map +1 -1
  46. package/dist/constants.js +52 -0
  47. package/dist/constants.js.map +1 -1
  48. package/dist/core/engine.cjs +15 -42
  49. package/dist/core/engine.cjs.map +1 -1
  50. package/dist/core/engine.d.cts +1 -3
  51. package/dist/core/engine.d.cts.map +1 -1
  52. package/dist/core/engine.d.ts +1 -3
  53. package/dist/core/engine.d.ts.map +1 -1
  54. package/dist/core/engine.js +15 -42
  55. package/dist/core/engine.js.map +1 -1
  56. package/dist/core/engines/accurate-engine.cjs +2 -1
  57. package/dist/core/engines/accurate-engine.cjs.map +1 -1
  58. package/dist/core/engines/accurate-engine.d.cts.map +1 -1
  59. package/dist/core/engines/accurate-engine.d.ts.map +1 -1
  60. package/dist/core/engines/accurate-engine.js +2 -1
  61. package/dist/core/engines/accurate-engine.js.map +1 -1
  62. package/dist/core/engines/tinybench-engine.cjs +6 -5
  63. package/dist/core/engines/tinybench-engine.cjs.map +1 -1
  64. package/dist/core/engines/tinybench-engine.d.cts.map +1 -1
  65. package/dist/core/engines/tinybench-engine.d.ts.map +1 -1
  66. package/dist/core/engines/tinybench-engine.js +6 -5
  67. package/dist/core/engines/tinybench-engine.js.map +1 -1
  68. package/dist/core/loader.cjs +16 -5
  69. package/dist/core/loader.cjs.map +1 -1
  70. package/dist/core/loader.d.cts.map +1 -1
  71. package/dist/core/loader.d.ts.map +1 -1
  72. package/dist/core/loader.js +16 -5
  73. package/dist/core/loader.js.map +1 -1
  74. package/dist/errors/base.cjs +130 -0
  75. package/dist/errors/base.cjs.map +1 -0
  76. package/dist/errors/base.d.cts +97 -0
  77. package/dist/errors/base.d.cts.map +1 -0
  78. package/dist/errors/base.d.ts +97 -0
  79. package/dist/errors/base.d.ts.map +1 -0
  80. package/dist/errors/base.js +124 -0
  81. package/dist/errors/base.js.map +1 -0
  82. package/dist/errors/cli.cjs +58 -0
  83. package/dist/errors/cli.cjs.map +1 -0
  84. package/dist/errors/cli.d.cts +44 -0
  85. package/dist/errors/cli.d.cts.map +1 -0
  86. package/dist/errors/cli.d.ts +44 -0
  87. package/dist/errors/cli.d.ts.map +1 -0
  88. package/dist/errors/cli.js +52 -0
  89. package/dist/errors/cli.js.map +1 -0
  90. package/dist/errors/configuration.cjs +48 -0
  91. package/dist/errors/configuration.cjs.map +1 -0
  92. package/dist/errors/configuration.d.cts +41 -0
  93. package/dist/errors/configuration.d.cts.map +1 -0
  94. package/dist/errors/configuration.d.ts +41 -0
  95. package/dist/errors/configuration.d.ts.map +1 -0
  96. package/dist/errors/configuration.js +41 -0
  97. package/dist/errors/configuration.js.map +1 -0
  98. package/dist/errors/execution.cjs +65 -0
  99. package/dist/errors/execution.cjs.map +1 -0
  100. package/dist/errors/execution.d.cts +56 -0
  101. package/dist/errors/execution.d.cts.map +1 -0
  102. package/dist/errors/execution.d.ts +56 -0
  103. package/dist/errors/execution.d.ts.map +1 -0
  104. package/dist/errors/execution.js +56 -0
  105. package/dist/errors/execution.js.map +1 -0
  106. package/dist/errors/file.cjs +56 -0
  107. package/dist/errors/file.cjs.map +1 -0
  108. package/dist/errors/file.d.cts +48 -0
  109. package/dist/errors/file.d.cts.map +1 -0
  110. package/dist/errors/file.d.ts +48 -0
  111. package/dist/errors/file.d.ts.map +1 -0
  112. package/dist/errors/file.js +48 -0
  113. package/dist/errors/file.js.map +1 -0
  114. package/dist/errors/index.cjs +59 -0
  115. package/dist/errors/index.cjs.map +1 -0
  116. package/dist/errors/index.d.cts +16 -0
  117. package/dist/errors/index.d.cts.map +1 -0
  118. package/dist/errors/index.d.ts +16 -0
  119. package/dist/errors/index.d.ts.map +1 -0
  120. package/dist/errors/index.js +24 -0
  121. package/dist/errors/index.js.map +1 -0
  122. package/dist/errors/reporter.cjs +38 -0
  123. package/dist/errors/reporter.cjs.map +1 -0
  124. package/dist/errors/reporter.d.cts +32 -0
  125. package/dist/errors/reporter.d.cts.map +1 -0
  126. package/dist/errors/reporter.d.ts +32 -0
  127. package/dist/errors/reporter.d.ts.map +1 -0
  128. package/dist/errors/reporter.js +32 -0
  129. package/dist/errors/reporter.js.map +1 -0
  130. package/dist/errors/storage.cjs +55 -0
  131. package/dist/errors/storage.cjs.map +1 -0
  132. package/dist/errors/storage.d.cts +47 -0
  133. package/dist/errors/storage.d.cts.map +1 -0
  134. package/dist/errors/storage.d.ts +47 -0
  135. package/dist/errors/storage.d.ts.map +1 -0
  136. package/dist/errors/storage.js +47 -0
  137. package/dist/errors/storage.js.map +1 -0
  138. package/dist/errors/validation.cjs +38 -0
  139. package/dist/errors/validation.cjs.map +1 -0
  140. package/dist/errors/validation.d.cts +32 -0
  141. package/dist/errors/validation.d.cts.map +1 -0
  142. package/dist/errors/validation.d.ts +32 -0
  143. package/dist/errors/validation.d.ts.map +1 -0
  144. package/dist/errors/validation.js +32 -0
  145. package/dist/errors/validation.js.map +1 -0
  146. package/dist/index.cjs +3 -4
  147. package/dist/index.cjs.map +1 -1
  148. package/dist/index.d.cts +1 -1
  149. package/dist/index.d.cts.map +1 -1
  150. package/dist/index.d.ts +1 -1
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/index.js +2 -2
  153. package/dist/index.js.map +1 -1
  154. package/dist/reporters/csv.cjs +3 -2
  155. package/dist/reporters/csv.cjs.map +1 -1
  156. package/dist/reporters/csv.d.cts.map +1 -1
  157. package/dist/reporters/csv.d.ts.map +1 -1
  158. package/dist/reporters/csv.js +3 -2
  159. package/dist/reporters/csv.js.map +1 -1
  160. package/dist/reporters/human.cjs +1 -1
  161. package/dist/reporters/human.js +1 -1
  162. package/dist/reporters/json.cjs +3 -2
  163. package/dist/reporters/json.cjs.map +1 -1
  164. package/dist/reporters/json.d.cts.map +1 -1
  165. package/dist/reporters/json.d.ts.map +1 -1
  166. package/dist/reporters/json.js +3 -2
  167. package/dist/reporters/json.js.map +1 -1
  168. package/dist/reporters/registry.cjs +3 -2
  169. package/dist/reporters/registry.cjs.map +1 -1
  170. package/dist/reporters/registry.d.cts.map +1 -1
  171. package/dist/reporters/registry.d.ts.map +1 -1
  172. package/dist/reporters/registry.js +3 -2
  173. package/dist/reporters/registry.js.map +1 -1
  174. package/dist/reporters/simple.cjs +1 -1
  175. package/dist/reporters/simple.js +1 -1
  176. package/dist/storage/history.cjs +32 -11
  177. package/dist/storage/history.cjs.map +1 -1
  178. package/dist/storage/history.d.cts.map +1 -1
  179. package/dist/storage/history.d.ts.map +1 -1
  180. package/dist/storage/history.js +32 -11
  181. package/dist/storage/history.js.map +1 -1
  182. package/dist/types/interfaces.d.cts +1 -34
  183. package/dist/types/interfaces.d.cts.map +1 -1
  184. package/dist/types/interfaces.d.ts +1 -34
  185. package/dist/types/interfaces.d.ts.map +1 -1
  186. package/package.json +7 -6
  187. package/src/bootstrap.ts +0 -2
  188. package/src/cli/commands/history.ts +3 -1
  189. package/src/cli/commands/init.ts +14 -4
  190. package/src/cli/commands/run.ts +20 -4
  191. package/src/cli/index.ts +32 -13
  192. package/src/config/manager.ts +12 -2
  193. package/src/constants.ts +60 -0
  194. package/src/core/engine.ts +31 -47
  195. package/src/core/engines/accurate-engine.ts +4 -1
  196. package/src/core/engines/tinybench-engine.ts +12 -5
  197. package/src/core/loader.ts +27 -5
  198. package/src/errors/base.ts +152 -0
  199. package/src/errors/cli.ts +59 -0
  200. package/src/errors/configuration.ts +45 -0
  201. package/src/errors/execution.ts +62 -0
  202. package/src/errors/file.ts +53 -0
  203. package/src/errors/index.ts +71 -0
  204. package/src/errors/reporter.ts +35 -0
  205. package/src/errors/storage.ts +52 -0
  206. package/src/errors/validation.ts +35 -0
  207. package/src/index.ts +3 -3
  208. package/src/reporters/csv.ts +4 -2
  209. package/src/reporters/human.ts +1 -1
  210. package/src/reporters/json.ts +4 -2
  211. package/src/reporters/registry.ts +9 -2
  212. package/src/reporters/simple.ts +1 -1
  213. package/src/storage/history.ts +58 -11
  214. package/src/types/interfaces.ts +0 -43
  215. package/dist/core/error-manager.cjs +0 -303
  216. package/dist/core/error-manager.cjs.map +0 -1
  217. package/dist/core/error-manager.d.cts +0 -77
  218. package/dist/core/error-manager.d.cts.map +0 -1
  219. package/dist/core/error-manager.d.ts +0 -77
  220. package/dist/core/error-manager.d.ts.map +0 -1
  221. package/dist/core/error-manager.js +0 -299
  222. package/dist/core/error-manager.js.map +0 -1
  223. package/src/core/error-manager.ts +0 -372
@@ -1,299 +0,0 @@
1
- /**
2
- * ModestBench Error Manager
3
- *
4
- * Handles execution errors with context tracking, categorization, and provides
5
- * structured error information for graceful degradation.
6
- */
7
- /**
8
- * Error code mappings for different error types and contexts
9
- */
10
- const ERROR_CODES = {
11
- // Benchmark file errors
12
- BENCH_001: 'Benchmark file syntax error',
13
- BENCH_002: 'Invalid benchmark structure',
14
- BENCH_003: 'Missing dependency',
15
- BENCH_004: 'Timeout exceeded',
16
- BENCH_005: 'Memory limit exceeded',
17
- // Configuration errors
18
- CONFIG_001: 'Invalid configuration file',
19
- CONFIG_002: 'Missing required option',
20
- // Execution errors
21
- EXEC_001: 'Task execution failed',
22
- EXEC_002: 'Setup function failed',
23
- EXEC_003: 'Teardown function failed',
24
- EXEC_004: 'Memory leak detected',
25
- // File system errors
26
- FILE_001: 'File not found',
27
- FILE_002: 'Permission denied',
28
- FILE_003: 'Invalid file format',
29
- // History storage errors
30
- HIST_001: 'History data corruption',
31
- HIST_002: 'Disk space insufficient',
32
- HIST_003: 'Index corruption',
33
- // System errors
34
- SYS_001: 'Out of memory',
35
- SYS_002: 'Process crashed',
36
- SYS_003: 'System resource unavailable',
37
- // Unknown errors
38
- UNKNOWN: 'Unknown error',
39
- // Validation errors
40
- VALID_001: 'Schema validation failed',
41
- VALID_002: 'Type validation failed',
42
- VALID_003: 'Range validation failed',
43
- };
44
- /**
45
- * Recoverable error types that shouldn't stop entire execution
46
- */
47
- const RECOVERABLE_ERRORS = new Set([
48
- 'BENCH_003', // Missing dependency (can skip specific benchmark)
49
- 'EXEC_001', // Task execution failed (can continue with other tasks)
50
- 'FILE_001', // File not found (can continue with other files)
51
- 'VALID_002', // Type validation failed (can skip invalid items)
52
- 'VALID_003', // Range validation failed (can skip invalid items)
53
- ]);
54
- /**
55
- * Default error manager implementation
56
- */
57
- export class ModestBenchErrorManager {
58
- errors = [];
59
- handlers = [];
60
- maxRecentErrors = 50;
61
- /**
62
- * Clear error history
63
- */
64
- clearStats() {
65
- this.errors = [];
66
- }
67
- /**
68
- * Format error for display
69
- */
70
- formatError(error) {
71
- const { code, context, message } = error;
72
- let formatted = `[${code}] ${message}`;
73
- // Add context information
74
- const contextParts = [];
75
- if (context.file) {
76
- contextParts.push(`file: ${context.file}`);
77
- }
78
- if (context.suite) {
79
- contextParts.push(`suite: ${context.suite}`);
80
- }
81
- if (context.task) {
82
- contextParts.push(`task: ${context.task}`);
83
- }
84
- if (contextParts.length > 0) {
85
- formatted += ` (${contextParts.join(', ')})`;
86
- }
87
- formatted += ` at ${context.timestamp.toISOString()}`;
88
- return formatted;
89
- }
90
- /**
91
- * Get error code for a given error
92
- */
93
- getErrorCode(error, context) {
94
- // Check for specific error patterns
95
- const message = error.message.toLowerCase();
96
- const name = error.name.toLowerCase();
97
- // File system errors
98
- if (message.includes('enoent') || message.includes('no such file')) {
99
- return 'FILE_001';
100
- }
101
- if (message.includes('eacces') || message.includes('permission denied')) {
102
- return 'FILE_002';
103
- }
104
- // Memory errors
105
- if (message.includes('out of memory') || name.includes('rangeerror')) {
106
- return 'SYS_001';
107
- }
108
- // Timeout errors
109
- if (message.includes('timeout') || name.includes('timeout')) {
110
- return 'BENCH_004';
111
- }
112
- // Syntax errors in benchmark files
113
- if (name.includes('syntaxerror') && context.phase === 'loading') {
114
- return 'BENCH_001';
115
- }
116
- // Validation errors
117
- if (context.phase === 'validation') {
118
- if (message.includes('schema') || message.includes('structure')) {
119
- return 'VALID_001';
120
- }
121
- if (message.includes('type')) {
122
- return 'VALID_002';
123
- }
124
- if (message.includes('range') || message.includes('limit')) {
125
- return 'VALID_003';
126
- }
127
- }
128
- // Configuration errors
129
- if (context.phase === 'discovery' && message.includes('config')) {
130
- return 'CONFIG_001';
131
- }
132
- // Execution phase errors
133
- if (context.phase === 'execution') {
134
- if (context.task) {
135
- return 'EXEC_001';
136
- }
137
- }
138
- if (context.phase === 'setup') {
139
- return 'EXEC_002';
140
- }
141
- if (context.phase === 'teardown') {
142
- return 'EXEC_003';
143
- }
144
- // Storage errors
145
- if (message.includes('disk') && message.includes('space')) {
146
- return 'HIST_002';
147
- }
148
- if (message.includes('corrupt') || message.includes('invalid json')) {
149
- return 'HIST_001';
150
- }
151
- // Default to unknown
152
- return 'UNKNOWN';
153
- }
154
- /**
155
- * Get error count by phase
156
- */
157
- getErrorCountByPhase(phase) {
158
- return this.errors.filter((error) => error.context.phase === phase).length;
159
- }
160
- /**
161
- * Get human-readable description for error code
162
- */
163
- getErrorDescription(code) {
164
- return ERROR_CODES[code] || 'Unknown error';
165
- }
166
- /**
167
- * Get all error handlers (for testing)
168
- */
169
- getHandlers() {
170
- return [...this.handlers];
171
- }
172
- /**
173
- * Get recent errors for a specific phase
174
- */
175
- getRecentErrorsForPhase(phase, limit = 10) {
176
- return this.errors
177
- .filter((error) => error.context.phase === phase)
178
- .slice(-limit);
179
- }
180
- /**
181
- * Get error statistics
182
- */
183
- getStats() {
184
- const byPhase = {
185
- cleanup: 0,
186
- discovery: 0,
187
- execution: 0,
188
- loading: 0,
189
- reporting: 0,
190
- setup: 0,
191
- teardown: 0,
192
- validation: 0,
193
- };
194
- const byType = {};
195
- let firstError;
196
- let lastError;
197
- for (const error of this.errors) {
198
- // Count by phase
199
- byPhase[error.context.phase]++;
200
- // Count by type (error code)
201
- const type = error.code;
202
- byType[type] = (byType[type] || 0) + 1;
203
- // Track timestamps
204
- const timestamp = error.processedAt;
205
- if (!firstError || timestamp < firstError) {
206
- firstError = timestamp;
207
- }
208
- if (!lastError || timestamp > lastError) {
209
- lastError = timestamp;
210
- }
211
- }
212
- const result = {
213
- byPhase,
214
- byType,
215
- ...(firstError && { firstError }),
216
- ...(lastError && { lastError }),
217
- recent: this.errors.slice(-this.maxRecentErrors),
218
- total: this.errors.length,
219
- };
220
- return result;
221
- }
222
- /**
223
- * Handle an execution error
224
- */
225
- handleError(error, context) {
226
- const code = this.getErrorCode(error, context);
227
- const recoverable = this.isRecoverableByCode(code);
228
- const executionError = {
229
- code,
230
- context,
231
- message: this.createMessage(error, context, code),
232
- originalError: error,
233
- processedAt: new Date(),
234
- recoverable,
235
- ...(error.stack && { stack: error.stack }),
236
- };
237
- // Store error for statistics
238
- this.errors.push(executionError);
239
- // Keep only recent errors to prevent memory leaks
240
- if (this.errors.length > this.maxRecentErrors * 2) {
241
- this.errors = this.errors.slice(-this.maxRecentErrors);
242
- }
243
- // Notify handlers
244
- for (const handler of this.handlers) {
245
- try {
246
- handler(executionError);
247
- }
248
- catch (handlerError) {
249
- // Don't let handler errors break error handling
250
- console.error('Error in error handler:', handlerError);
251
- }
252
- }
253
- return executionError;
254
- }
255
- /**
256
- * Check if an error is recoverable
257
- */
258
- isRecoverable(error) {
259
- return error.recoverable;
260
- }
261
- /**
262
- * Register error handler callback
263
- */
264
- onError(handler) {
265
- this.handlers.push(handler);
266
- }
267
- /**
268
- * Remove error handler
269
- */
270
- removeHandler(handler) {
271
- const index = this.handlers.indexOf(handler);
272
- if (index >= 0) {
273
- this.handlers.splice(index, 1);
274
- return true;
275
- }
276
- return false;
277
- }
278
- /**
279
- * Create human-readable error message
280
- */
281
- createMessage(error, context, code) {
282
- const baseMessage = this.getErrorDescription(code);
283
- const originalMessage = error.message;
284
- // If the original message is more descriptive, use it
285
- if (originalMessage &&
286
- originalMessage !== baseMessage &&
287
- !originalMessage.includes('[object')) {
288
- return `${baseMessage}: ${originalMessage}`;
289
- }
290
- return baseMessage;
291
- }
292
- /**
293
- * Check if error is recoverable by code
294
- */
295
- isRecoverableByCode(code) {
296
- return RECOVERABLE_ERRORS.has(code);
297
- }
298
- }
299
- //# sourceMappingURL=error-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-manager.js","sourceRoot":"","sources":["../../src/core/error-manager.ts"],"names":[],"mappings":"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"}
@@ -1,372 +0,0 @@
1
- /**
2
- * ModestBench Error Manager
3
- *
4
- * Handles execution errors with context tracking, categorization, and provides
5
- * structured error information for graceful degradation.
6
- */
7
-
8
- import type {
9
- ErrorContext,
10
- ErrorManager,
11
- ErrorStats,
12
- ExecutionError,
13
- ExecutionPhase,
14
- } from '../types/index.js';
15
-
16
- /**
17
- * Error handler callback type
18
- */
19
- type ErrorHandler = (error: ExecutionError) => void;
20
-
21
- /**
22
- * Error code mappings for different error types and contexts
23
- */
24
- const ERROR_CODES = {
25
- // Benchmark file errors
26
- BENCH_001: 'Benchmark file syntax error',
27
- BENCH_002: 'Invalid benchmark structure',
28
- BENCH_003: 'Missing dependency',
29
- BENCH_004: 'Timeout exceeded',
30
- BENCH_005: 'Memory limit exceeded',
31
-
32
- // Configuration errors
33
- CONFIG_001: 'Invalid configuration file',
34
- CONFIG_002: 'Missing required option',
35
-
36
- // Execution errors
37
- EXEC_001: 'Task execution failed',
38
- EXEC_002: 'Setup function failed',
39
- EXEC_003: 'Teardown function failed',
40
-
41
- EXEC_004: 'Memory leak detected',
42
- // File system errors
43
- FILE_001: 'File not found',
44
- FILE_002: 'Permission denied',
45
-
46
- FILE_003: 'Invalid file format',
47
- // History storage errors
48
- HIST_001: 'History data corruption',
49
- HIST_002: 'Disk space insufficient',
50
- HIST_003: 'Index corruption',
51
-
52
- // System errors
53
- SYS_001: 'Out of memory',
54
- SYS_002: 'Process crashed',
55
- SYS_003: 'System resource unavailable',
56
-
57
- // Unknown errors
58
- UNKNOWN: 'Unknown error',
59
- // Validation errors
60
- VALID_001: 'Schema validation failed',
61
- VALID_002: 'Type validation failed',
62
-
63
- VALID_003: 'Range validation failed',
64
- } as const;
65
-
66
- /**
67
- * Recoverable error types that shouldn't stop entire execution
68
- */
69
- const RECOVERABLE_ERRORS = new Set([
70
- 'BENCH_003', // Missing dependency (can skip specific benchmark)
71
- 'EXEC_001', // Task execution failed (can continue with other tasks)
72
- 'FILE_001', // File not found (can continue with other files)
73
- 'VALID_002', // Type validation failed (can skip invalid items)
74
- 'VALID_003', // Range validation failed (can skip invalid items)
75
- ]);
76
-
77
- /**
78
- * Default error manager implementation
79
- */
80
- export class ModestBenchErrorManager implements ErrorManager {
81
- private errors: ExecutionError[] = [];
82
-
83
- private handlers: ErrorHandler[] = [];
84
-
85
- private readonly maxRecentErrors = 50;
86
-
87
- /**
88
- * Clear error history
89
- */
90
- clearStats(): void {
91
- this.errors = [];
92
- }
93
-
94
- /**
95
- * Format error for display
96
- */
97
- formatError(error: ExecutionError): string {
98
- const { code, context, message } = error;
99
-
100
- let formatted = `[${code}] ${message}`;
101
-
102
- // Add context information
103
- const contextParts: string[] = [];
104
- if (context.file) {
105
- contextParts.push(`file: ${context.file}`);
106
- }
107
- if (context.suite) {
108
- contextParts.push(`suite: ${context.suite}`);
109
- }
110
- if (context.task) {
111
- contextParts.push(`task: ${context.task}`);
112
- }
113
-
114
- if (contextParts.length > 0) {
115
- formatted += ` (${contextParts.join(', ')})`;
116
- }
117
-
118
- formatted += ` at ${context.timestamp.toISOString()}`;
119
-
120
- return formatted;
121
- }
122
-
123
- /**
124
- * Get error code for a given error
125
- */
126
- getErrorCode(error: Error, context: ErrorContext): string {
127
- // Check for specific error patterns
128
- const message = error.message.toLowerCase();
129
- const name = error.name.toLowerCase();
130
-
131
- // File system errors
132
- if (message.includes('enoent') || message.includes('no such file')) {
133
- return 'FILE_001';
134
- }
135
- if (message.includes('eacces') || message.includes('permission denied')) {
136
- return 'FILE_002';
137
- }
138
-
139
- // Memory errors
140
- if (message.includes('out of memory') || name.includes('rangeerror')) {
141
- return 'SYS_001';
142
- }
143
-
144
- // Timeout errors
145
- if (message.includes('timeout') || name.includes('timeout')) {
146
- return 'BENCH_004';
147
- }
148
-
149
- // Syntax errors in benchmark files
150
- if (name.includes('syntaxerror') && context.phase === 'loading') {
151
- return 'BENCH_001';
152
- }
153
-
154
- // Validation errors
155
- if (context.phase === 'validation') {
156
- if (message.includes('schema') || message.includes('structure')) {
157
- return 'VALID_001';
158
- }
159
- if (message.includes('type')) {
160
- return 'VALID_002';
161
- }
162
- if (message.includes('range') || message.includes('limit')) {
163
- return 'VALID_003';
164
- }
165
- }
166
-
167
- // Configuration errors
168
- if (context.phase === 'discovery' && message.includes('config')) {
169
- return 'CONFIG_001';
170
- }
171
-
172
- // Execution phase errors
173
- if (context.phase === 'execution') {
174
- if (context.task) {
175
- return 'EXEC_001';
176
- }
177
- }
178
-
179
- if (context.phase === 'setup') {
180
- return 'EXEC_002';
181
- }
182
-
183
- if (context.phase === 'teardown') {
184
- return 'EXEC_003';
185
- }
186
-
187
- // Storage errors
188
- if (message.includes('disk') && message.includes('space')) {
189
- return 'HIST_002';
190
- }
191
-
192
- if (message.includes('corrupt') || message.includes('invalid json')) {
193
- return 'HIST_001';
194
- }
195
-
196
- // Default to unknown
197
- return 'UNKNOWN';
198
- }
199
-
200
- /**
201
- * Get error count by phase
202
- */
203
- getErrorCountByPhase(phase: ExecutionPhase): number {
204
- return this.errors.filter((error) => error.context.phase === phase).length;
205
- }
206
-
207
- /**
208
- * Get human-readable description for error code
209
- */
210
- getErrorDescription(code: string): string {
211
- return ERROR_CODES[code as keyof typeof ERROR_CODES] || 'Unknown error';
212
- }
213
-
214
- /**
215
- * Get all error handlers (for testing)
216
- */
217
- getHandlers(): readonly ErrorHandler[] {
218
- return [...this.handlers];
219
- }
220
-
221
- /**
222
- * Get recent errors for a specific phase
223
- */
224
- getRecentErrorsForPhase(phase: ExecutionPhase, limit = 10): ExecutionError[] {
225
- return this.errors
226
- .filter((error) => error.context.phase === phase)
227
- .slice(-limit);
228
- }
229
-
230
- /**
231
- * Get error statistics
232
- */
233
- getStats(): ErrorStats {
234
- const byPhase: Record<ExecutionPhase, number> = {
235
- cleanup: 0,
236
- discovery: 0,
237
- execution: 0,
238
- loading: 0,
239
- reporting: 0,
240
- setup: 0,
241
- teardown: 0,
242
- validation: 0,
243
- };
244
-
245
- const byType: Record<string, number> = {};
246
- let firstError: Date | undefined;
247
- let lastError: Date | undefined;
248
-
249
- for (const error of this.errors) {
250
- // Count by phase
251
- byPhase[error.context.phase]++;
252
-
253
- // Count by type (error code)
254
- const type = error.code;
255
- byType[type] = (byType[type] || 0) + 1;
256
-
257
- // Track timestamps
258
- const timestamp = error.processedAt;
259
- if (!firstError || timestamp < firstError) {
260
- firstError = timestamp;
261
- }
262
- if (!lastError || timestamp > lastError) {
263
- lastError = timestamp;
264
- }
265
- }
266
-
267
- const result: ErrorStats = {
268
- byPhase,
269
- byType,
270
- ...(firstError && { firstError }),
271
- ...(lastError && { lastError }),
272
- recent: this.errors.slice(-this.maxRecentErrors),
273
- total: this.errors.length,
274
- };
275
-
276
- return result;
277
- }
278
-
279
- /**
280
- * Handle an execution error
281
- */
282
- handleError(error: Error, context: ErrorContext): ExecutionError {
283
- const code = this.getErrorCode(error, context);
284
- const recoverable = this.isRecoverableByCode(code);
285
-
286
- const executionError: ExecutionError = {
287
- code,
288
- context,
289
- message: this.createMessage(error, context, code),
290
- originalError: error,
291
- processedAt: new Date(),
292
- recoverable,
293
- ...(error.stack && { stack: error.stack }),
294
- };
295
-
296
- // Store error for statistics
297
- this.errors.push(executionError);
298
-
299
- // Keep only recent errors to prevent memory leaks
300
- if (this.errors.length > this.maxRecentErrors * 2) {
301
- this.errors = this.errors.slice(-this.maxRecentErrors);
302
- }
303
-
304
- // Notify handlers
305
- for (const handler of this.handlers) {
306
- try {
307
- handler(executionError);
308
- } catch (handlerError) {
309
- // Don't let handler errors break error handling
310
- console.error('Error in error handler:', handlerError);
311
- }
312
- }
313
-
314
- return executionError;
315
- }
316
-
317
- /**
318
- * Check if an error is recoverable
319
- */
320
- isRecoverable(error: ExecutionError): boolean {
321
- return error.recoverable;
322
- }
323
-
324
- /**
325
- * Register error handler callback
326
- */
327
- onError(handler: ErrorHandler): void {
328
- this.handlers.push(handler);
329
- }
330
-
331
- /**
332
- * Remove error handler
333
- */
334
- removeHandler(handler: ErrorHandler): boolean {
335
- const index = this.handlers.indexOf(handler);
336
- if (index >= 0) {
337
- this.handlers.splice(index, 1);
338
- return true;
339
- }
340
- return false;
341
- }
342
-
343
- /**
344
- * Create human-readable error message
345
- */
346
- private createMessage(
347
- error: Error,
348
- context: ErrorContext,
349
- code: string,
350
- ): string {
351
- const baseMessage = this.getErrorDescription(code);
352
- const originalMessage = error.message;
353
-
354
- // If the original message is more descriptive, use it
355
- if (
356
- originalMessage &&
357
- originalMessage !== baseMessage &&
358
- !originalMessage.includes('[object')
359
- ) {
360
- return `${baseMessage}: ${originalMessage}`;
361
- }
362
-
363
- return baseMessage;
364
- }
365
-
366
- /**
367
- * Check if error is recoverable by code
368
- */
369
- private isRecoverableByCode(code: string): boolean {
370
- return RECOVERABLE_ERRORS.has(code);
371
- }
372
- }