digital-workers 2.1.1 → 2.1.3
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/.turbo/turbo-build.log +4 -5
- package/CHANGELOG.md +14 -0
- package/LICENSE +21 -0
- package/README.md +134 -180
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +1 -0
- package/dist/actions.js.map +1 -1
- package/dist/agent-comms.d.ts +438 -0
- package/dist/agent-comms.d.ts.map +1 -0
- package/dist/agent-comms.js +666 -0
- package/dist/agent-comms.js.map +1 -0
- package/dist/capability-tiers.d.ts +230 -0
- package/dist/capability-tiers.d.ts.map +1 -0
- package/dist/capability-tiers.js +388 -0
- package/dist/capability-tiers.js.map +1 -0
- package/dist/cascade-context.d.ts +523 -0
- package/dist/cascade-context.d.ts.map +1 -0
- package/dist/cascade-context.js +494 -0
- package/dist/cascade-context.js.map +1 -0
- package/dist/error-escalation.d.ts +416 -0
- package/dist/error-escalation.d.ts.map +1 -0
- package/dist/error-escalation.js +656 -0
- package/dist/error-escalation.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -1
- package/dist/load-balancing.d.ts +395 -0
- package/dist/load-balancing.d.ts.map +1 -0
- package/dist/load-balancing.js +905 -0
- package/dist/load-balancing.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/package.json +14 -13
- package/src/actions.ts +9 -8
- package/src/agent-comms.ts +1238 -0
- package/src/capability-tiers.ts +545 -0
- package/src/cascade-context.ts +648 -0
- package/src/error-escalation.ts +1135 -0
- package/src/index.ts +223 -0
- package/src/load-balancing.ts +1381 -0
- package/src/types.ts +8 -0
- package/test/agent-comms.test.ts +1397 -0
- package/test/capability-tiers.test.ts +631 -0
- package/test/cascade-context.test.ts +692 -0
- package/test/error-escalation.test.ts +1205 -0
- package/test/load-balancing-thread-safety.test.ts +464 -0
- package/test/load-balancing.test.ts +1145 -0
- package/test/types.test.ts +35 -0
|
@@ -0,0 +1,656 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Escalation
|
|
3
|
+
*
|
|
4
|
+
* Multi-level error escalation between agent tiers with classification,
|
|
5
|
+
* routing, and recovery patterns.
|
|
6
|
+
*
|
|
7
|
+
* ## Key Concepts
|
|
8
|
+
*
|
|
9
|
+
* 1. **Error Classification** - Categorize errors by severity and type
|
|
10
|
+
* 2. **Escalation Routing** - Determine next tier for escalation
|
|
11
|
+
* 3. **Recovery Patterns** - Retry, fallback, and degradation strategies
|
|
12
|
+
*
|
|
13
|
+
* ## Escalation Flow
|
|
14
|
+
*
|
|
15
|
+
* ```
|
|
16
|
+
* Error -> Classify -> Should Retry? -> Retry with Backoff
|
|
17
|
+
* -> Exhausted -> Should Escalate? -> Escalate to Next Tier
|
|
18
|
+
* -> At Terminal -> Fallback or Degrade
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @packageDocumentation
|
|
22
|
+
*/
|
|
23
|
+
import { getNextTier, TIER_ORDER } from './capability-tiers.js';
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Error Classification Implementation
|
|
26
|
+
// ============================================================================
|
|
27
|
+
let errorIdCounter = 0;
|
|
28
|
+
/**
|
|
29
|
+
* Generate a unique error ID
|
|
30
|
+
*/
|
|
31
|
+
function generateErrorId() {
|
|
32
|
+
return `err-${Date.now()}-${++errorIdCounter}`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get error severity based on error and options
|
|
36
|
+
*/
|
|
37
|
+
export function getErrorSeverity(error, options = {}) {
|
|
38
|
+
const { isRetryable = true, impact = 'single-task' } = options;
|
|
39
|
+
// Critical: system-wide impact and not retryable
|
|
40
|
+
if (impact === 'system' && !isRetryable) {
|
|
41
|
+
return 'critical';
|
|
42
|
+
}
|
|
43
|
+
// High: workflow impact and not retryable
|
|
44
|
+
if (impact === 'workflow' && !isRetryable) {
|
|
45
|
+
return 'high';
|
|
46
|
+
}
|
|
47
|
+
// Medium: workflow impact but retryable
|
|
48
|
+
if (impact === 'workflow' && isRetryable) {
|
|
49
|
+
return 'medium';
|
|
50
|
+
}
|
|
51
|
+
// Low: single-task impact
|
|
52
|
+
return 'low';
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get error category based on error type
|
|
56
|
+
*/
|
|
57
|
+
export function getErrorCategory(error) {
|
|
58
|
+
const name = error.name || '';
|
|
59
|
+
const message = error.message || '';
|
|
60
|
+
// Permanent errors - configuration, validation, etc.
|
|
61
|
+
if (name.includes('Configuration') ||
|
|
62
|
+
name.includes('Validation') ||
|
|
63
|
+
name.includes('Invalid') ||
|
|
64
|
+
message.includes('invalid')) {
|
|
65
|
+
return 'permanent';
|
|
66
|
+
}
|
|
67
|
+
// Escalatable errors - require higher tier
|
|
68
|
+
if (name.includes('Approval') ||
|
|
69
|
+
name.includes('Escalation') ||
|
|
70
|
+
message.includes('approval') ||
|
|
71
|
+
message.includes('human')) {
|
|
72
|
+
return 'escalatable';
|
|
73
|
+
}
|
|
74
|
+
// Default to transient (retryable)
|
|
75
|
+
return 'transient';
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create a classified error
|
|
79
|
+
*/
|
|
80
|
+
export function createClassifiedError(original, options) {
|
|
81
|
+
return {
|
|
82
|
+
id: generateErrorId(),
|
|
83
|
+
original,
|
|
84
|
+
severity: options.severity,
|
|
85
|
+
category: options.category,
|
|
86
|
+
tier: options.tier,
|
|
87
|
+
agentId: options.agentId,
|
|
88
|
+
taskId: options.taskId,
|
|
89
|
+
timestamp: new Date(),
|
|
90
|
+
stack: original.stack,
|
|
91
|
+
previousError: options.previousError,
|
|
92
|
+
context: options.context,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Classify an error automatically
|
|
97
|
+
*/
|
|
98
|
+
export function classifyError(error, options = {}) {
|
|
99
|
+
const severity = getErrorSeverity(error);
|
|
100
|
+
const category = getErrorCategory(error);
|
|
101
|
+
return createClassifiedError(error, {
|
|
102
|
+
severity,
|
|
103
|
+
category,
|
|
104
|
+
...options,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check if error is escalatable
|
|
109
|
+
*/
|
|
110
|
+
export function isEscalatable(error) {
|
|
111
|
+
// Critical errors are always escalatable
|
|
112
|
+
if (error.severity === 'critical') {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
// Escalatable category
|
|
116
|
+
if (error.category === 'escalatable') {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
// High severity transient errors
|
|
120
|
+
if (error.severity === 'high' && error.category === 'transient') {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Preserve context through escalation
|
|
127
|
+
*/
|
|
128
|
+
export function preserveContext(context, updates = {}) {
|
|
129
|
+
return {
|
|
130
|
+
...context,
|
|
131
|
+
...updates,
|
|
132
|
+
metadata: {
|
|
133
|
+
...context.metadata,
|
|
134
|
+
...updates.metadata,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Build error chain from escalation history
|
|
140
|
+
*/
|
|
141
|
+
export function buildErrorChain(error, options = {}) {
|
|
142
|
+
const { maxDepth = 50 } = options;
|
|
143
|
+
const chain = [];
|
|
144
|
+
let current = error;
|
|
145
|
+
let depth = 0;
|
|
146
|
+
while (current && depth < maxDepth) {
|
|
147
|
+
chain.unshift(current);
|
|
148
|
+
current = current.previousError;
|
|
149
|
+
depth++;
|
|
150
|
+
}
|
|
151
|
+
return chain;
|
|
152
|
+
}
|
|
153
|
+
// ============================================================================
|
|
154
|
+
// Escalation Routing Implementation
|
|
155
|
+
// ============================================================================
|
|
156
|
+
const SEVERITY_ORDER = {
|
|
157
|
+
low: 0,
|
|
158
|
+
medium: 1,
|
|
159
|
+
high: 2,
|
|
160
|
+
critical: 3,
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Create an escalation policy with defaults
|
|
164
|
+
*/
|
|
165
|
+
export function createEscalationPolicy(options) {
|
|
166
|
+
return {
|
|
167
|
+
maxEscalationDepth: options.maxEscalationDepth ?? 10,
|
|
168
|
+
allowSkipTiers: options.allowSkipTiers ?? false,
|
|
169
|
+
skipTierThreshold: options.skipTierThreshold,
|
|
170
|
+
rules: options.rules ?? [],
|
|
171
|
+
tierPolicies: options.tierPolicies,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get next escalation tier based on error and policy
|
|
176
|
+
*/
|
|
177
|
+
export function getNextEscalationTier(error, policy) {
|
|
178
|
+
const currentTier = error.tier ?? 'code';
|
|
179
|
+
// Check custom rules first
|
|
180
|
+
const applicableRules = policy.rules
|
|
181
|
+
.filter(rule => rule.fromTier === currentTier && rule.condition(error))
|
|
182
|
+
.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
183
|
+
if (applicableRules.length > 0) {
|
|
184
|
+
return applicableRules[0].toTier;
|
|
185
|
+
}
|
|
186
|
+
// Check if we should skip tiers
|
|
187
|
+
if (policy.allowSkipTiers &&
|
|
188
|
+
policy.skipTierThreshold &&
|
|
189
|
+
SEVERITY_ORDER[error.severity] >= SEVERITY_ORDER[policy.skipTierThreshold]) {
|
|
190
|
+
return 'human';
|
|
191
|
+
}
|
|
192
|
+
// Default: go to next tier
|
|
193
|
+
return getNextTier(currentTier);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Determine escalation path for an error
|
|
197
|
+
*/
|
|
198
|
+
export function determineEscalationPath(error, policy) {
|
|
199
|
+
const fromTier = error.tier ?? 'code';
|
|
200
|
+
const effectivePolicy = policy ?? createEscalationPolicy({});
|
|
201
|
+
const nextTier = getNextEscalationTier(error, effectivePolicy);
|
|
202
|
+
if (!nextTier || nextTier === fromTier) {
|
|
203
|
+
return {
|
|
204
|
+
fromTier,
|
|
205
|
+
toTier: fromTier,
|
|
206
|
+
reason: 'Cannot escalate further - at terminal tier',
|
|
207
|
+
isTerminal: true,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
fromTier,
|
|
212
|
+
toTier: nextTier,
|
|
213
|
+
reason: `Escalating due to ${error.severity} severity ${error.category} error`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Check if escalation should occur based on threshold
|
|
218
|
+
*/
|
|
219
|
+
export function shouldEscalate(threshold, errorHistory) {
|
|
220
|
+
const now = Date.now();
|
|
221
|
+
const { errorCount, timeWindow, severityMultiplier } = threshold;
|
|
222
|
+
// Filter by time window if specified
|
|
223
|
+
let relevantErrors = errorHistory;
|
|
224
|
+
if (timeWindow) {
|
|
225
|
+
relevantErrors = errorHistory.filter(entry => now - entry.timestamp <= timeWindow);
|
|
226
|
+
}
|
|
227
|
+
// Calculate weighted count if severity multiplier is specified
|
|
228
|
+
if (severityMultiplier) {
|
|
229
|
+
const weightedCount = relevantErrors.reduce((sum, entry) => {
|
|
230
|
+
const multiplier = entry.severity
|
|
231
|
+
? (severityMultiplier[entry.severity] ?? 1)
|
|
232
|
+
: 1;
|
|
233
|
+
return sum + multiplier;
|
|
234
|
+
}, 0);
|
|
235
|
+
return weightedCount >= errorCount;
|
|
236
|
+
}
|
|
237
|
+
return relevantErrors.length >= errorCount;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Detect circular escalation
|
|
241
|
+
*/
|
|
242
|
+
export function detectCircularEscalation(path, history) {
|
|
243
|
+
// If we're going back to a tier we've already visited, it's circular
|
|
244
|
+
if (history.includes(path.toTier)) {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
// Check for de-escalation (going to a lower tier)
|
|
248
|
+
if (TIER_ORDER[path.toTier] < TIER_ORDER[path.fromTier]) {
|
|
249
|
+
// If we've already been at a tier higher than where we're going, it's circular
|
|
250
|
+
const maxTierVisited = Math.max(...history.map(t => TIER_ORDER[t]));
|
|
251
|
+
if (TIER_ORDER[path.toTier] < maxTierVisited) {
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Validate an escalation path
|
|
259
|
+
*/
|
|
260
|
+
export function validateEscalationPath(path, history, policy) {
|
|
261
|
+
// Check max depth
|
|
262
|
+
if (history.length >= policy.maxEscalationDepth) {
|
|
263
|
+
return {
|
|
264
|
+
valid: false,
|
|
265
|
+
error: `Escalation depth exceeded: max is ${policy.maxEscalationDepth}`,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
// Check for circular escalation
|
|
269
|
+
if (detectCircularEscalation(path, history)) {
|
|
270
|
+
return {
|
|
271
|
+
valid: false,
|
|
272
|
+
error: 'Circular escalation detected',
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
return { valid: true };
|
|
276
|
+
}
|
|
277
|
+
// ============================================================================
|
|
278
|
+
// Recovery Patterns Implementation
|
|
279
|
+
// ============================================================================
|
|
280
|
+
/**
|
|
281
|
+
* Calculate backoff delay with optional jitter
|
|
282
|
+
*/
|
|
283
|
+
export function calculateBackoff(config, attemptNumber) {
|
|
284
|
+
const { baseDelayMs, maxDelayMs = Infinity, backoffMultiplier = 2, jitterPercent = 0, } = config;
|
|
285
|
+
// Calculate exponential delay
|
|
286
|
+
let delay = baseDelayMs * Math.pow(backoffMultiplier, attemptNumber);
|
|
287
|
+
// Cap at max delay
|
|
288
|
+
delay = Math.min(delay, maxDelayMs);
|
|
289
|
+
// Add jitter if configured
|
|
290
|
+
if (jitterPercent > 0) {
|
|
291
|
+
const jitterRange = delay * (jitterPercent / 100);
|
|
292
|
+
const jitter = (Math.random() * 2 - 1) * jitterRange;
|
|
293
|
+
delay = delay + jitter;
|
|
294
|
+
}
|
|
295
|
+
return Math.round(delay);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Create initial retry state
|
|
299
|
+
*/
|
|
300
|
+
export function createRetryState(config = {}) {
|
|
301
|
+
return {
|
|
302
|
+
attemptNumber: 0,
|
|
303
|
+
lastAttemptTime: null,
|
|
304
|
+
nextRetryTime: null,
|
|
305
|
+
exhausted: false,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Check if retry should occur
|
|
310
|
+
*/
|
|
311
|
+
export function shouldRetry(config, state, error) {
|
|
312
|
+
// Already exhausted
|
|
313
|
+
if (state.exhausted) {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
// Exceeded max retries
|
|
317
|
+
if (state.attemptNumber >= config.maxRetries) {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
// Check if error category is retryable
|
|
321
|
+
if (error && config.retryableCategories) {
|
|
322
|
+
if (!config.retryableCategories.includes(error.category)) {
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Select a fallback agent
|
|
330
|
+
*/
|
|
331
|
+
export function selectFallbackAgent(config, agents) {
|
|
332
|
+
// Filter excluded agents
|
|
333
|
+
let candidates = agents.filter(a => !config.excludeAgentIds?.includes(a.id));
|
|
334
|
+
if (candidates.length === 0) {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
switch (config.strategy) {
|
|
338
|
+
case 'capability-match':
|
|
339
|
+
if (config.requiredSkills && config.requiredSkills.length > 0) {
|
|
340
|
+
candidates = candidates.filter(a => {
|
|
341
|
+
const agentSkills = a.skills ?? [];
|
|
342
|
+
return config.requiredSkills.every(skill => agentSkills.includes(skill));
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
return candidates[0] ?? null;
|
|
346
|
+
case 'least-loaded':
|
|
347
|
+
candidates.sort((a, b) => {
|
|
348
|
+
const loadA = (a.currentLoad ?? 0) / (a.maxLoad ?? 1);
|
|
349
|
+
const loadB = (b.currentLoad ?? 0) / (b.maxLoad ?? 1);
|
|
350
|
+
return loadA - loadB;
|
|
351
|
+
});
|
|
352
|
+
return candidates[0] ?? null;
|
|
353
|
+
case 'same-tier':
|
|
354
|
+
if (config.currentTier) {
|
|
355
|
+
candidates = candidates.filter(a => a.tier === config.currentTier);
|
|
356
|
+
}
|
|
357
|
+
return candidates[0] ?? null;
|
|
358
|
+
case 'round-robin':
|
|
359
|
+
default:
|
|
360
|
+
return candidates[0] ?? null;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Get degradation level based on severity and options
|
|
365
|
+
*/
|
|
366
|
+
export function getDegradationLevel(severity, options = {}) {
|
|
367
|
+
// Check custom rules first
|
|
368
|
+
if (options.rules) {
|
|
369
|
+
for (const rule of options.rules) {
|
|
370
|
+
if (rule.condition(severity)) {
|
|
371
|
+
return rule.level;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
// Check error count threshold
|
|
376
|
+
if (options.errorCount !== undefined && options.threshold !== undefined) {
|
|
377
|
+
if (options.errorCount >= options.threshold) {
|
|
378
|
+
// Bump up degradation level
|
|
379
|
+
switch (severity) {
|
|
380
|
+
case 'low':
|
|
381
|
+
return 'partial';
|
|
382
|
+
case 'medium':
|
|
383
|
+
return 'significant';
|
|
384
|
+
case 'high':
|
|
385
|
+
case 'critical':
|
|
386
|
+
return 'full';
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// Default based on severity
|
|
391
|
+
switch (severity) {
|
|
392
|
+
case 'low':
|
|
393
|
+
return 'none';
|
|
394
|
+
case 'medium':
|
|
395
|
+
return 'partial';
|
|
396
|
+
case 'high':
|
|
397
|
+
return 'significant';
|
|
398
|
+
case 'critical':
|
|
399
|
+
return 'full';
|
|
400
|
+
default:
|
|
401
|
+
return 'none';
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Create initial recovery state
|
|
406
|
+
*/
|
|
407
|
+
export function createRecoveryState(options) {
|
|
408
|
+
return {
|
|
409
|
+
errorId: options.errorId,
|
|
410
|
+
tier: options.tier,
|
|
411
|
+
agentId: options.agentId,
|
|
412
|
+
retryState: createRetryState(),
|
|
413
|
+
escalated: false,
|
|
414
|
+
resolved: false,
|
|
415
|
+
escalationPath: [options.tier],
|
|
416
|
+
fallbackHistory: options.agentId ? [options.agentId] : [],
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Update recovery state
|
|
421
|
+
*/
|
|
422
|
+
export function updateRecoveryState(state, update) {
|
|
423
|
+
switch (update.type) {
|
|
424
|
+
case 'retry':
|
|
425
|
+
return {
|
|
426
|
+
...state,
|
|
427
|
+
retryState: {
|
|
428
|
+
...state.retryState,
|
|
429
|
+
attemptNumber: state.retryState.attemptNumber + 1,
|
|
430
|
+
lastAttemptTime: new Date(),
|
|
431
|
+
exhausted: update.exhausted ?? state.retryState.exhausted,
|
|
432
|
+
},
|
|
433
|
+
lastAction: 'retry',
|
|
434
|
+
};
|
|
435
|
+
case 'escalate':
|
|
436
|
+
const newTier = update.toTier ?? state.tier;
|
|
437
|
+
return {
|
|
438
|
+
...state,
|
|
439
|
+
tier: newTier,
|
|
440
|
+
escalated: true,
|
|
441
|
+
escalationPath: [...state.escalationPath, newTier],
|
|
442
|
+
lastAction: 'escalate',
|
|
443
|
+
isTerminal: update.isTerminal,
|
|
444
|
+
};
|
|
445
|
+
case 'fallback':
|
|
446
|
+
const oldAgentId = state.agentId;
|
|
447
|
+
return {
|
|
448
|
+
...state,
|
|
449
|
+
agentId: update.toAgentId,
|
|
450
|
+
fallbackHistory: oldAgentId
|
|
451
|
+
? [...state.fallbackHistory, oldAgentId]
|
|
452
|
+
: state.fallbackHistory,
|
|
453
|
+
lastAction: 'fallback',
|
|
454
|
+
};
|
|
455
|
+
case 'resolve':
|
|
456
|
+
return {
|
|
457
|
+
...state,
|
|
458
|
+
resolved: true,
|
|
459
|
+
resolution: update.resolution,
|
|
460
|
+
lastAction: 'resolve',
|
|
461
|
+
};
|
|
462
|
+
default:
|
|
463
|
+
return state;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Check if error is recoverable
|
|
468
|
+
*/
|
|
469
|
+
export function isRecoverable(state) {
|
|
470
|
+
// If resolved, not recoverable (already done)
|
|
471
|
+
if (state.resolved) {
|
|
472
|
+
return false;
|
|
473
|
+
}
|
|
474
|
+
// If retries not exhausted, recoverable
|
|
475
|
+
if (!state.retryState.exhausted) {
|
|
476
|
+
return true;
|
|
477
|
+
}
|
|
478
|
+
// If at terminal tier and retries exhausted, not recoverable
|
|
479
|
+
if (state.isTerminal && state.retryState.exhausted) {
|
|
480
|
+
return false;
|
|
481
|
+
}
|
|
482
|
+
// If not at human tier, can still escalate
|
|
483
|
+
if (state.tier !== 'human') {
|
|
484
|
+
return true;
|
|
485
|
+
}
|
|
486
|
+
// At human tier with exhausted retries - not recoverable
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
// ============================================================================
|
|
490
|
+
// Escalation Engine Implementation
|
|
491
|
+
// ============================================================================
|
|
492
|
+
/**
|
|
493
|
+
* Create an escalation engine
|
|
494
|
+
*/
|
|
495
|
+
export function createEscalationEngine(options = {}) {
|
|
496
|
+
const policy = options.policy ?? createEscalationPolicy({});
|
|
497
|
+
const retryConfig = options.retryConfig ?? {
|
|
498
|
+
maxRetries: 3,
|
|
499
|
+
baseDelayMs: 100,
|
|
500
|
+
maxDelayMs: 30000,
|
|
501
|
+
backoffMultiplier: 2,
|
|
502
|
+
};
|
|
503
|
+
// Metrics tracking
|
|
504
|
+
let metrics = {
|
|
505
|
+
totalErrors: 0,
|
|
506
|
+
bySeverity: { low: 0, medium: 0, high: 0, critical: 0 },
|
|
507
|
+
escalationsByTier: {},
|
|
508
|
+
retrySuccessRate: 0,
|
|
509
|
+
retriesTotal: 0,
|
|
510
|
+
retriesSuccessful: 0,
|
|
511
|
+
};
|
|
512
|
+
async function handleError(error, opts) {
|
|
513
|
+
// Classify the error
|
|
514
|
+
const severity = opts.severity ?? getErrorSeverity(error);
|
|
515
|
+
const category = getErrorCategory(error);
|
|
516
|
+
const classifiedError = createClassifiedError(error, {
|
|
517
|
+
severity,
|
|
518
|
+
category,
|
|
519
|
+
tier: opts.tier,
|
|
520
|
+
agentId: opts.agentId,
|
|
521
|
+
taskId: opts.taskId,
|
|
522
|
+
previousError: opts.previousError,
|
|
523
|
+
context: opts.context,
|
|
524
|
+
});
|
|
525
|
+
// Update metrics
|
|
526
|
+
metrics.totalErrors++;
|
|
527
|
+
metrics.bySeverity[severity]++;
|
|
528
|
+
// Get retry state
|
|
529
|
+
const retryState = opts.retryState ?? createRetryState();
|
|
530
|
+
// Get tier-specific config
|
|
531
|
+
const tierPolicy = policy.tierPolicies?.[opts.tier];
|
|
532
|
+
const effectiveRetryConfig = {
|
|
533
|
+
...retryConfig,
|
|
534
|
+
maxRetries: tierPolicy?.maxRetries ?? retryConfig.maxRetries,
|
|
535
|
+
};
|
|
536
|
+
// Determine action
|
|
537
|
+
let action;
|
|
538
|
+
let retryDelay;
|
|
539
|
+
let escalationPath;
|
|
540
|
+
let fallbackAgent;
|
|
541
|
+
let degradationLevel;
|
|
542
|
+
// Check for simulated retry results
|
|
543
|
+
if (opts.simulateRetrySuccess) {
|
|
544
|
+
metrics.retriesTotal++;
|
|
545
|
+
metrics.retriesSuccessful++;
|
|
546
|
+
metrics.retrySuccessRate = metrics.retriesSuccessful / metrics.retriesTotal;
|
|
547
|
+
}
|
|
548
|
+
else if (opts.simulateRetryFailure) {
|
|
549
|
+
metrics.retriesTotal++;
|
|
550
|
+
metrics.retrySuccessRate = metrics.retriesSuccessful / metrics.retriesTotal;
|
|
551
|
+
}
|
|
552
|
+
// Should we retry?
|
|
553
|
+
if (!retryState.exhausted && shouldRetry(effectiveRetryConfig, retryState, classifiedError)) {
|
|
554
|
+
action = 'retry';
|
|
555
|
+
retryDelay = calculateBackoff(effectiveRetryConfig, retryState.attemptNumber);
|
|
556
|
+
metrics.retriesTotal++;
|
|
557
|
+
}
|
|
558
|
+
// Should we escalate?
|
|
559
|
+
else if (opts.tier !== 'human') {
|
|
560
|
+
// Check escalation history depth
|
|
561
|
+
const history = opts.escalationHistory ?? [opts.tier];
|
|
562
|
+
const path = determineEscalationPath(classifiedError, policy);
|
|
563
|
+
const validation = validateEscalationPath(path, history, policy);
|
|
564
|
+
if (validation.valid && !path.isTerminal) {
|
|
565
|
+
action = 'escalate';
|
|
566
|
+
escalationPath = path;
|
|
567
|
+
metrics.escalationsByTier[opts.tier] = (metrics.escalationsByTier[opts.tier] ?? 0) + 1;
|
|
568
|
+
}
|
|
569
|
+
else if (opts.availableAgents && opts.availableAgents.length > 0) {
|
|
570
|
+
// Try fallback
|
|
571
|
+
action = 'fallback';
|
|
572
|
+
fallbackAgent = selectFallbackAgent({ strategy: 'capability-match', excludeAgentIds: [opts.agentId ?? ''] }, opts.availableAgents) ?? undefined;
|
|
573
|
+
}
|
|
574
|
+
else {
|
|
575
|
+
action = 'degrade';
|
|
576
|
+
degradationLevel = getDegradationLevel(severity);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
// At human tier - try fallback or degrade
|
|
580
|
+
else {
|
|
581
|
+
if (opts.availableAgents && opts.availableAgents.length > 0) {
|
|
582
|
+
action = 'fallback';
|
|
583
|
+
fallbackAgent = selectFallbackAgent({ strategy: 'same-tier', currentTier: 'human', excludeAgentIds: [opts.agentId ?? ''] }, opts.availableAgents) ?? undefined;
|
|
584
|
+
if (!fallbackAgent) {
|
|
585
|
+
action = 'terminal';
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
action = 'terminal';
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
return {
|
|
593
|
+
handled: true,
|
|
594
|
+
action,
|
|
595
|
+
classifiedError,
|
|
596
|
+
retryDelay,
|
|
597
|
+
escalationPath,
|
|
598
|
+
fallbackAgent,
|
|
599
|
+
degradationLevel,
|
|
600
|
+
preservedContext: opts.context,
|
|
601
|
+
errorChain: opts.previousError
|
|
602
|
+
? buildErrorChain(classifiedError)
|
|
603
|
+
: undefined,
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
function getMetrics() {
|
|
607
|
+
return { ...metrics };
|
|
608
|
+
}
|
|
609
|
+
function reset() {
|
|
610
|
+
metrics = {
|
|
611
|
+
totalErrors: 0,
|
|
612
|
+
bySeverity: { low: 0, medium: 0, high: 0, critical: 0 },
|
|
613
|
+
escalationsByTier: {},
|
|
614
|
+
retrySuccessRate: 0,
|
|
615
|
+
retriesTotal: 0,
|
|
616
|
+
retriesSuccessful: 0,
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
return {
|
|
620
|
+
handleError,
|
|
621
|
+
getMetrics,
|
|
622
|
+
reset,
|
|
623
|
+
};
|
|
624
|
+
}
|
|
625
|
+
// ============================================================================
|
|
626
|
+
// Default Export
|
|
627
|
+
// ============================================================================
|
|
628
|
+
export default {
|
|
629
|
+
// Error Classification
|
|
630
|
+
getErrorSeverity,
|
|
631
|
+
getErrorCategory,
|
|
632
|
+
createClassifiedError,
|
|
633
|
+
classifyError,
|
|
634
|
+
isEscalatable,
|
|
635
|
+
preserveContext,
|
|
636
|
+
buildErrorChain,
|
|
637
|
+
// Escalation Routing
|
|
638
|
+
createEscalationPolicy,
|
|
639
|
+
getNextEscalationTier,
|
|
640
|
+
determineEscalationPath,
|
|
641
|
+
shouldEscalate,
|
|
642
|
+
detectCircularEscalation,
|
|
643
|
+
validateEscalationPath,
|
|
644
|
+
// Recovery Patterns
|
|
645
|
+
calculateBackoff,
|
|
646
|
+
createRetryState,
|
|
647
|
+
shouldRetry,
|
|
648
|
+
selectFallbackAgent,
|
|
649
|
+
getDegradationLevel,
|
|
650
|
+
createRecoveryState,
|
|
651
|
+
updateRecoveryState,
|
|
652
|
+
isRecoverable,
|
|
653
|
+
// Escalation Engine
|
|
654
|
+
createEscalationEngine,
|
|
655
|
+
};
|
|
656
|
+
//# sourceMappingURL=error-escalation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-escalation.js","sourceRoot":"","sources":["../src/error-escalation.ts"],"names":[],"mappings":"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"}
|