agentic-qe 2.0.0 → 2.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.
- package/.claude/agents/qx-partner.md +17 -4
- package/.claude/skills/accessibility-testing/SKILL.md +144 -692
- package/.claude/skills/agentic-quality-engineering/SKILL.md +176 -529
- package/.claude/skills/api-testing-patterns/SKILL.md +180 -560
- package/.claude/skills/brutal-honesty-review/SKILL.md +113 -603
- package/.claude/skills/bug-reporting-excellence/SKILL.md +116 -517
- package/.claude/skills/chaos-engineering-resilience/SKILL.md +127 -72
- package/.claude/skills/cicd-pipeline-qe-orchestrator/SKILL.md +209 -404
- package/.claude/skills/code-review-quality/SKILL.md +158 -608
- package/.claude/skills/compatibility-testing/SKILL.md +148 -38
- package/.claude/skills/compliance-testing/SKILL.md +132 -63
- package/.claude/skills/consultancy-practices/SKILL.md +114 -446
- package/.claude/skills/context-driven-testing/SKILL.md +117 -381
- package/.claude/skills/contract-testing/SKILL.md +176 -141
- package/.claude/skills/database-testing/SKILL.md +137 -130
- package/.claude/skills/exploratory-testing-advanced/SKILL.md +160 -629
- package/.claude/skills/holistic-testing-pact/SKILL.md +140 -188
- package/.claude/skills/localization-testing/SKILL.md +145 -33
- package/.claude/skills/mobile-testing/SKILL.md +132 -448
- package/.claude/skills/mutation-testing/SKILL.md +147 -41
- package/.claude/skills/performance-testing/SKILL.md +200 -546
- package/.claude/skills/quality-metrics/SKILL.md +164 -519
- package/.claude/skills/refactoring-patterns/SKILL.md +132 -699
- package/.claude/skills/regression-testing/SKILL.md +120 -926
- package/.claude/skills/risk-based-testing/SKILL.md +157 -660
- package/.claude/skills/security-testing/SKILL.md +199 -538
- package/.claude/skills/sherlock-review/SKILL.md +163 -699
- package/.claude/skills/shift-left-testing/SKILL.md +161 -465
- package/.claude/skills/shift-right-testing/SKILL.md +161 -519
- package/.claude/skills/six-thinking-hats/SKILL.md +175 -1110
- package/.claude/skills/skills-manifest.json +71 -20
- package/.claude/skills/tdd-london-chicago/SKILL.md +131 -448
- package/.claude/skills/technical-writing/SKILL.md +103 -154
- package/.claude/skills/test-automation-strategy/SKILL.md +166 -772
- package/.claude/skills/test-data-management/SKILL.md +126 -910
- package/.claude/skills/test-design-techniques/SKILL.md +179 -89
- package/.claude/skills/test-environment-management/SKILL.md +136 -91
- package/.claude/skills/test-reporting-analytics/SKILL.md +169 -92
- package/.claude/skills/testability-scoring/SKILL.md +172 -538
- package/.claude/skills/testability-scoring/scripts/generate-html-report.js +0 -0
- package/.claude/skills/visual-testing-advanced/SKILL.md +155 -78
- package/.claude/skills/xp-practices/SKILL.md +151 -587
- package/CHANGELOG.md +48 -0
- package/README.md +23 -16
- package/dist/agents/QXPartnerAgent.d.ts +8 -1
- package/dist/agents/QXPartnerAgent.d.ts.map +1 -1
- package/dist/agents/QXPartnerAgent.js +1174 -112
- package/dist/agents/QXPartnerAgent.js.map +1 -1
- package/dist/agents/lifecycle/AgentLifecycleManager.d.ts.map +1 -1
- package/dist/agents/lifecycle/AgentLifecycleManager.js +34 -31
- package/dist/agents/lifecycle/AgentLifecycleManager.js.map +1 -1
- package/dist/cli/commands/init-claude-md-template.d.ts.map +1 -1
- package/dist/cli/commands/init-claude-md-template.js +14 -0
- package/dist/cli/commands/init-claude-md-template.js.map +1 -1
- package/dist/core/SwarmCoordinator.d.ts +180 -0
- package/dist/core/SwarmCoordinator.d.ts.map +1 -0
- package/dist/core/SwarmCoordinator.js +473 -0
- package/dist/core/SwarmCoordinator.js.map +1 -0
- package/dist/core/metrics/MetricsAggregator.d.ts +228 -0
- package/dist/core/metrics/MetricsAggregator.d.ts.map +1 -0
- package/dist/core/metrics/MetricsAggregator.js +482 -0
- package/dist/core/metrics/MetricsAggregator.js.map +1 -0
- package/dist/core/metrics/index.d.ts +5 -0
- package/dist/core/metrics/index.d.ts.map +1 -0
- package/dist/core/metrics/index.js +11 -0
- package/dist/core/metrics/index.js.map +1 -0
- package/dist/core/optimization/SwarmOptimizer.d.ts +5 -0
- package/dist/core/optimization/SwarmOptimizer.d.ts.map +1 -1
- package/dist/core/optimization/SwarmOptimizer.js +17 -0
- package/dist/core/optimization/SwarmOptimizer.js.map +1 -1
- package/dist/core/orchestration/AdaptiveScheduler.d.ts +190 -0
- package/dist/core/orchestration/AdaptiveScheduler.d.ts.map +1 -0
- package/dist/core/orchestration/AdaptiveScheduler.js +460 -0
- package/dist/core/orchestration/AdaptiveScheduler.js.map +1 -0
- package/dist/core/orchestration/WorkflowOrchestrator.d.ts +13 -0
- package/dist/core/orchestration/WorkflowOrchestrator.d.ts.map +1 -1
- package/dist/core/orchestration/WorkflowOrchestrator.js +32 -0
- package/dist/core/orchestration/WorkflowOrchestrator.js.map +1 -1
- package/dist/core/recovery/CircuitBreaker.d.ts +176 -0
- package/dist/core/recovery/CircuitBreaker.d.ts.map +1 -0
- package/dist/core/recovery/CircuitBreaker.js +382 -0
- package/dist/core/recovery/CircuitBreaker.js.map +1 -0
- package/dist/core/recovery/RecoveryOrchestrator.d.ts +186 -0
- package/dist/core/recovery/RecoveryOrchestrator.d.ts.map +1 -0
- package/dist/core/recovery/RecoveryOrchestrator.js +476 -0
- package/dist/core/recovery/RecoveryOrchestrator.js.map +1 -0
- package/dist/core/recovery/RetryStrategy.d.ts +127 -0
- package/dist/core/recovery/RetryStrategy.d.ts.map +1 -0
- package/dist/core/recovery/RetryStrategy.js +314 -0
- package/dist/core/recovery/RetryStrategy.js.map +1 -0
- package/dist/core/recovery/index.d.ts +8 -0
- package/dist/core/recovery/index.d.ts.map +1 -0
- package/dist/core/recovery/index.js +27 -0
- package/dist/core/recovery/index.js.map +1 -0
- package/dist/core/skills/DependencyResolver.d.ts +99 -0
- package/dist/core/skills/DependencyResolver.d.ts.map +1 -0
- package/dist/core/skills/DependencyResolver.js +260 -0
- package/dist/core/skills/DependencyResolver.js.map +1 -0
- package/dist/core/skills/ManifestGenerator.d.ts +114 -0
- package/dist/core/skills/ManifestGenerator.d.ts.map +1 -0
- package/dist/core/skills/ManifestGenerator.js +449 -0
- package/dist/core/skills/ManifestGenerator.js.map +1 -0
- package/dist/core/skills/index.d.ts +9 -0
- package/dist/core/skills/index.d.ts.map +1 -0
- package/dist/core/skills/index.js +24 -0
- package/dist/core/skills/index.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -9
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +1 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/types/qx.d.ts +39 -7
- package/dist/types/qx.d.ts.map +1 -1
- package/dist/types/qx.js.map +1 -1
- package/dist/visualization/api/RestEndpoints.js +1 -1
- package/dist/visualization/api/RestEndpoints.js.map +1 -1
- package/package.json +13 -55
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CircuitBreaker.js","sourceRoot":"","sources":["../../../src/core/recovery/CircuitBreaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovery Orchestrator
|
|
3
|
+
* Coordinates error recovery across transport, memory, and orchestration systems
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import { CircuitState } from './CircuitBreaker.js';
|
|
7
|
+
import { RetryConfig } from './RetryStrategy.js';
|
|
8
|
+
/**
|
|
9
|
+
* Recovery strategy types
|
|
10
|
+
*/
|
|
11
|
+
export type RecoveryStrategyType = 'retry' | 'fallback' | 'circuit-break' | 'rollback' | 'graceful-degradation' | 'escalate';
|
|
12
|
+
/**
|
|
13
|
+
* Component types that can be recovered
|
|
14
|
+
*/
|
|
15
|
+
export type RecoverableComponent = 'transport' | 'memory' | 'orchestration' | 'agent' | 'workflow' | 'database';
|
|
16
|
+
/**
|
|
17
|
+
* Health status
|
|
18
|
+
*/
|
|
19
|
+
export type HealthStatus = 'healthy' | 'degraded' | 'unhealthy' | 'unknown';
|
|
20
|
+
/**
|
|
21
|
+
* Recovery action result
|
|
22
|
+
*/
|
|
23
|
+
export interface RecoveryActionResult {
|
|
24
|
+
success: boolean;
|
|
25
|
+
strategy: RecoveryStrategyType;
|
|
26
|
+
component: RecoverableComponent;
|
|
27
|
+
action: string;
|
|
28
|
+
duration: number;
|
|
29
|
+
error?: string;
|
|
30
|
+
metadata?: Record<string, any>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Component health info
|
|
34
|
+
*/
|
|
35
|
+
export interface ComponentHealth {
|
|
36
|
+
component: RecoverableComponent;
|
|
37
|
+
status: HealthStatus;
|
|
38
|
+
lastCheck: Date;
|
|
39
|
+
errorRate: number;
|
|
40
|
+
latencyP95: number;
|
|
41
|
+
circuitState?: CircuitState;
|
|
42
|
+
details?: Record<string, any>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Recovery policy configuration
|
|
46
|
+
*/
|
|
47
|
+
export interface RecoveryPolicy {
|
|
48
|
+
/** Maximum recovery attempts per minute */
|
|
49
|
+
maxRecoveryRate: number;
|
|
50
|
+
/** Time to wait between recovery attempts */
|
|
51
|
+
cooldownPeriod: number;
|
|
52
|
+
/** When to escalate to manual intervention */
|
|
53
|
+
escalationThreshold: number;
|
|
54
|
+
/** Strategies in order of preference */
|
|
55
|
+
strategyOrder: RecoveryStrategyType[];
|
|
56
|
+
/** Component-specific overrides */
|
|
57
|
+
componentOverrides?: Partial<Record<RecoverableComponent, Partial<RecoveryPolicy>>>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Recovery event
|
|
61
|
+
*/
|
|
62
|
+
export interface RecoveryEvent {
|
|
63
|
+
timestamp: Date;
|
|
64
|
+
component: RecoverableComponent;
|
|
65
|
+
strategy: RecoveryStrategyType;
|
|
66
|
+
success: boolean;
|
|
67
|
+
error?: string;
|
|
68
|
+
duration: number;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Fallback handler type
|
|
72
|
+
*/
|
|
73
|
+
export type FallbackHandler<T> = () => Promise<T>;
|
|
74
|
+
/**
|
|
75
|
+
* Health check function type
|
|
76
|
+
*/
|
|
77
|
+
export type HealthChecker = (component: RecoverableComponent) => Promise<ComponentHealth>;
|
|
78
|
+
/**
|
|
79
|
+
* Recovery Orchestrator Implementation
|
|
80
|
+
*/
|
|
81
|
+
export declare class RecoveryOrchestrator extends EventEmitter {
|
|
82
|
+
private circuitBreakerManager;
|
|
83
|
+
private retryStrategies;
|
|
84
|
+
private fallbackHandlers;
|
|
85
|
+
private healthCheckers;
|
|
86
|
+
private recoveryHistory;
|
|
87
|
+
private componentHealth;
|
|
88
|
+
private policy;
|
|
89
|
+
private recoveryInProgress;
|
|
90
|
+
private lastRecoveryAttempts;
|
|
91
|
+
constructor(policy?: Partial<RecoveryPolicy>);
|
|
92
|
+
/**
|
|
93
|
+
* Execute operation with full recovery support
|
|
94
|
+
*/
|
|
95
|
+
executeWithRecovery<T>(component: RecoverableComponent, operationId: string, operation: () => Promise<T>, options?: {
|
|
96
|
+
fallback?: FallbackHandler<T>;
|
|
97
|
+
retryConfig?: Partial<RetryConfig>;
|
|
98
|
+
bypassCircuitBreaker?: boolean;
|
|
99
|
+
}): Promise<T>;
|
|
100
|
+
/**
|
|
101
|
+
* Attempt automatic recovery for a component
|
|
102
|
+
*/
|
|
103
|
+
attemptRecovery(component: RecoverableComponent, error: Error): Promise<RecoveryActionResult>;
|
|
104
|
+
/**
|
|
105
|
+
* Register fallback handler
|
|
106
|
+
*/
|
|
107
|
+
registerFallback<T>(component: RecoverableComponent, operationId: string, handler: FallbackHandler<T>): void;
|
|
108
|
+
/**
|
|
109
|
+
* Register health checker
|
|
110
|
+
*/
|
|
111
|
+
registerHealthChecker(component: RecoverableComponent, checker: HealthChecker): void;
|
|
112
|
+
/**
|
|
113
|
+
* Check health of all components
|
|
114
|
+
*/
|
|
115
|
+
checkHealth(): Promise<Map<RecoverableComponent, ComponentHealth>>;
|
|
116
|
+
/**
|
|
117
|
+
* Get component health
|
|
118
|
+
*/
|
|
119
|
+
getComponentHealth(component: RecoverableComponent): ComponentHealth | undefined;
|
|
120
|
+
/**
|
|
121
|
+
* Get recovery history
|
|
122
|
+
*/
|
|
123
|
+
getRecoveryHistory(limit?: number): RecoveryEvent[];
|
|
124
|
+
/**
|
|
125
|
+
* Get recovery statistics
|
|
126
|
+
*/
|
|
127
|
+
getStats(): {
|
|
128
|
+
totalRecoveries: number;
|
|
129
|
+
successfulRecoveries: number;
|
|
130
|
+
failedRecoveries: number;
|
|
131
|
+
successRate: number;
|
|
132
|
+
byComponent: Record<string, {
|
|
133
|
+
total: number;
|
|
134
|
+
successful: number;
|
|
135
|
+
}>;
|
|
136
|
+
byStrategy: Record<string, {
|
|
137
|
+
total: number;
|
|
138
|
+
successful: number;
|
|
139
|
+
}>;
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* Reset circuit breakers for a component
|
|
143
|
+
*/
|
|
144
|
+
resetCircuitBreakers(component?: RecoverableComponent): void;
|
|
145
|
+
/**
|
|
146
|
+
* Initialize default retry strategies per component
|
|
147
|
+
*/
|
|
148
|
+
private initializeDefaultStrategies;
|
|
149
|
+
/**
|
|
150
|
+
* Get retry strategy for component
|
|
151
|
+
*/
|
|
152
|
+
private getRetryStrategy;
|
|
153
|
+
/**
|
|
154
|
+
* Get policy for component
|
|
155
|
+
*/
|
|
156
|
+
private getComponentPolicy;
|
|
157
|
+
/**
|
|
158
|
+
* Execute a specific recovery strategy
|
|
159
|
+
*/
|
|
160
|
+
private executeRecoveryStrategy;
|
|
161
|
+
/**
|
|
162
|
+
* Check if recovery can be attempted (rate limiting)
|
|
163
|
+
*/
|
|
164
|
+
private canAttemptRecovery;
|
|
165
|
+
/**
|
|
166
|
+
* Record recovery attempt for rate limiting
|
|
167
|
+
*/
|
|
168
|
+
private recordRecoveryAttempt;
|
|
169
|
+
/**
|
|
170
|
+
* Record recovery event
|
|
171
|
+
*/
|
|
172
|
+
private recordRecoveryEvent;
|
|
173
|
+
/**
|
|
174
|
+
* Cleanup resources
|
|
175
|
+
*/
|
|
176
|
+
destroy(): void;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get default recovery orchestrator
|
|
180
|
+
*/
|
|
181
|
+
export declare function getRecoveryOrchestrator(policy?: Partial<RecoveryPolicy>): RecoveryOrchestrator;
|
|
182
|
+
/**
|
|
183
|
+
* Reset default orchestrator (for testing)
|
|
184
|
+
*/
|
|
185
|
+
export declare function resetRecoveryOrchestrator(): void;
|
|
186
|
+
//# sourceMappingURL=RecoveryOrchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecoveryOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/core/recovery/RecoveryOrchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Recovery Orchestrator
|
|
4
|
+
* Coordinates error recovery across transport, memory, and orchestration systems
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RecoveryOrchestrator = void 0;
|
|
8
|
+
exports.getRecoveryOrchestrator = getRecoveryOrchestrator;
|
|
9
|
+
exports.resetRecoveryOrchestrator = resetRecoveryOrchestrator;
|
|
10
|
+
const events_1 = require("events");
|
|
11
|
+
const CircuitBreaker_js_1 = require("./CircuitBreaker.js");
|
|
12
|
+
const RetryStrategy_js_1 = require("./RetryStrategy.js");
|
|
13
|
+
/**
|
|
14
|
+
* Recovery Orchestrator Implementation
|
|
15
|
+
*/
|
|
16
|
+
class RecoveryOrchestrator extends events_1.EventEmitter {
|
|
17
|
+
constructor(policy) {
|
|
18
|
+
super();
|
|
19
|
+
this.retryStrategies = new Map();
|
|
20
|
+
this.fallbackHandlers = new Map();
|
|
21
|
+
this.healthCheckers = new Map();
|
|
22
|
+
this.recoveryHistory = [];
|
|
23
|
+
this.componentHealth = new Map();
|
|
24
|
+
this.recoveryInProgress = new Set();
|
|
25
|
+
this.lastRecoveryAttempts = new Map();
|
|
26
|
+
this.policy = {
|
|
27
|
+
maxRecoveryRate: 10,
|
|
28
|
+
cooldownPeriod: 5000,
|
|
29
|
+
escalationThreshold: 5,
|
|
30
|
+
strategyOrder: ['retry', 'fallback', 'circuit-break', 'graceful-degradation', 'rollback', 'escalate'],
|
|
31
|
+
...policy,
|
|
32
|
+
};
|
|
33
|
+
this.circuitBreakerManager = (0, CircuitBreaker_js_1.getCircuitBreakerManager)();
|
|
34
|
+
this.initializeDefaultStrategies();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Execute operation with full recovery support
|
|
38
|
+
*/
|
|
39
|
+
async executeWithRecovery(component, operationId, operation, options) {
|
|
40
|
+
const circuitName = `${component}:${operationId}`;
|
|
41
|
+
const breaker = this.circuitBreakerManager.getBreaker(circuitName);
|
|
42
|
+
// Check if circuit breaker allows execution
|
|
43
|
+
if (!options?.bypassCircuitBreaker && breaker.getState() === CircuitBreaker_js_1.CircuitState.OPEN) {
|
|
44
|
+
// Try fallback if available
|
|
45
|
+
const fallbackKey = `${component}:${operationId}`;
|
|
46
|
+
const fallback = options?.fallback || this.fallbackHandlers.get(fallbackKey);
|
|
47
|
+
if (fallback) {
|
|
48
|
+
this.emit('fallback-used', { component, operationId, reason: 'circuit-open' });
|
|
49
|
+
return fallback();
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`Circuit breaker is OPEN for ${circuitName} and no fallback available`);
|
|
52
|
+
}
|
|
53
|
+
// Execute with retry and circuit breaker
|
|
54
|
+
const retryStrategy = this.getRetryStrategy(component, options?.retryConfig);
|
|
55
|
+
try {
|
|
56
|
+
const result = await retryStrategy.execute(async () => {
|
|
57
|
+
return breaker.execute(operation);
|
|
58
|
+
});
|
|
59
|
+
if (result.success) {
|
|
60
|
+
return result.result;
|
|
61
|
+
}
|
|
62
|
+
// Retry exhausted, try fallback
|
|
63
|
+
const fallbackKey = `${component}:${operationId}`;
|
|
64
|
+
const fallback = options?.fallback || this.fallbackHandlers.get(fallbackKey);
|
|
65
|
+
if (fallback) {
|
|
66
|
+
this.emit('fallback-used', {
|
|
67
|
+
component,
|
|
68
|
+
operationId,
|
|
69
|
+
reason: 'retry-exhausted',
|
|
70
|
+
attempts: result.attempts
|
|
71
|
+
});
|
|
72
|
+
return fallback();
|
|
73
|
+
}
|
|
74
|
+
throw result.error || new Error('Operation failed after all retries');
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
// Record recovery event
|
|
78
|
+
this.recordRecoveryEvent({
|
|
79
|
+
timestamp: new Date(),
|
|
80
|
+
component,
|
|
81
|
+
strategy: 'retry',
|
|
82
|
+
success: false,
|
|
83
|
+
error: error instanceof Error ? error.message : String(error),
|
|
84
|
+
duration: 0,
|
|
85
|
+
});
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Attempt automatic recovery for a component
|
|
91
|
+
*/
|
|
92
|
+
async attemptRecovery(component, error) {
|
|
93
|
+
const recoveryKey = `${component}:recovery`;
|
|
94
|
+
// Check if recovery is already in progress
|
|
95
|
+
if (this.recoveryInProgress.has(recoveryKey)) {
|
|
96
|
+
return {
|
|
97
|
+
success: false,
|
|
98
|
+
strategy: 'retry',
|
|
99
|
+
component,
|
|
100
|
+
action: 'skipped',
|
|
101
|
+
duration: 0,
|
|
102
|
+
error: 'Recovery already in progress',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Check recovery rate limit
|
|
106
|
+
if (!this.canAttemptRecovery(component)) {
|
|
107
|
+
return {
|
|
108
|
+
success: false,
|
|
109
|
+
strategy: 'escalate',
|
|
110
|
+
component,
|
|
111
|
+
action: 'rate-limited',
|
|
112
|
+
duration: 0,
|
|
113
|
+
error: 'Recovery rate limit exceeded',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
this.recoveryInProgress.add(recoveryKey);
|
|
117
|
+
const startTime = Date.now();
|
|
118
|
+
try {
|
|
119
|
+
// Get policy for component
|
|
120
|
+
const policy = this.getComponentPolicy(component);
|
|
121
|
+
// Try strategies in order
|
|
122
|
+
for (const strategy of policy.strategyOrder) {
|
|
123
|
+
const result = await this.executeRecoveryStrategy(component, strategy, error);
|
|
124
|
+
if (result.success) {
|
|
125
|
+
this.recordRecoveryEvent({
|
|
126
|
+
timestamp: new Date(),
|
|
127
|
+
component,
|
|
128
|
+
strategy,
|
|
129
|
+
success: true,
|
|
130
|
+
duration: Date.now() - startTime,
|
|
131
|
+
});
|
|
132
|
+
this.emit('recovery-success', { component, strategy, duration: result.duration });
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// All strategies failed
|
|
137
|
+
const result = {
|
|
138
|
+
success: false,
|
|
139
|
+
strategy: 'escalate',
|
|
140
|
+
component,
|
|
141
|
+
action: 'all-strategies-failed',
|
|
142
|
+
duration: Date.now() - startTime,
|
|
143
|
+
error: 'All recovery strategies failed',
|
|
144
|
+
};
|
|
145
|
+
this.emit('recovery-failed', { component, error: error.message });
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
this.recoveryInProgress.delete(recoveryKey);
|
|
150
|
+
this.recordRecoveryAttempt(component);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Register fallback handler
|
|
155
|
+
*/
|
|
156
|
+
registerFallback(component, operationId, handler) {
|
|
157
|
+
this.fallbackHandlers.set(`${component}:${operationId}`, handler);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Register health checker
|
|
161
|
+
*/
|
|
162
|
+
registerHealthChecker(component, checker) {
|
|
163
|
+
this.healthCheckers.set(component, checker);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Check health of all components
|
|
167
|
+
*/
|
|
168
|
+
async checkHealth() {
|
|
169
|
+
const components = [
|
|
170
|
+
'transport', 'memory', 'orchestration', 'agent', 'workflow', 'database'
|
|
171
|
+
];
|
|
172
|
+
for (const component of components) {
|
|
173
|
+
const checker = this.healthCheckers.get(component);
|
|
174
|
+
if (checker) {
|
|
175
|
+
try {
|
|
176
|
+
const health = await checker(component);
|
|
177
|
+
this.componentHealth.set(component, health);
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
this.componentHealth.set(component, {
|
|
181
|
+
component,
|
|
182
|
+
status: 'unknown',
|
|
183
|
+
lastCheck: new Date(),
|
|
184
|
+
errorRate: 1,
|
|
185
|
+
latencyP95: 0,
|
|
186
|
+
details: { error: error instanceof Error ? error.message : String(error) },
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return new Map(this.componentHealth);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get component health
|
|
195
|
+
*/
|
|
196
|
+
getComponentHealth(component) {
|
|
197
|
+
return this.componentHealth.get(component);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get recovery history
|
|
201
|
+
*/
|
|
202
|
+
getRecoveryHistory(limit) {
|
|
203
|
+
const history = [...this.recoveryHistory].reverse();
|
|
204
|
+
return limit ? history.slice(0, limit) : history;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get recovery statistics
|
|
208
|
+
*/
|
|
209
|
+
getStats() {
|
|
210
|
+
const total = this.recoveryHistory.length;
|
|
211
|
+
const successful = this.recoveryHistory.filter(e => e.success).length;
|
|
212
|
+
const byComponent = {};
|
|
213
|
+
const byStrategy = {};
|
|
214
|
+
for (const event of this.recoveryHistory) {
|
|
215
|
+
// By component
|
|
216
|
+
if (!byComponent[event.component]) {
|
|
217
|
+
byComponent[event.component] = { total: 0, successful: 0 };
|
|
218
|
+
}
|
|
219
|
+
byComponent[event.component].total++;
|
|
220
|
+
if (event.success)
|
|
221
|
+
byComponent[event.component].successful++;
|
|
222
|
+
// By strategy
|
|
223
|
+
if (!byStrategy[event.strategy]) {
|
|
224
|
+
byStrategy[event.strategy] = { total: 0, successful: 0 };
|
|
225
|
+
}
|
|
226
|
+
byStrategy[event.strategy].total++;
|
|
227
|
+
if (event.success)
|
|
228
|
+
byStrategy[event.strategy].successful++;
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
totalRecoveries: total,
|
|
232
|
+
successfulRecoveries: successful,
|
|
233
|
+
failedRecoveries: total - successful,
|
|
234
|
+
successRate: total > 0 ? successful / total : 0,
|
|
235
|
+
byComponent,
|
|
236
|
+
byStrategy,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Reset circuit breakers for a component
|
|
241
|
+
*/
|
|
242
|
+
resetCircuitBreakers(component) {
|
|
243
|
+
if (component) {
|
|
244
|
+
const metrics = this.circuitBreakerManager.getAllMetrics();
|
|
245
|
+
for (const [name] of metrics) {
|
|
246
|
+
if (name.startsWith(component)) {
|
|
247
|
+
this.circuitBreakerManager.getBreaker(name).reset();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
this.circuitBreakerManager.resetAll();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Initialize default retry strategies per component
|
|
257
|
+
*/
|
|
258
|
+
initializeDefaultStrategies() {
|
|
259
|
+
this.retryStrategies.set('transport', new RetryStrategy_js_1.RetryStrategy({
|
|
260
|
+
maxAttempts: 4,
|
|
261
|
+
initialDelay: 1000,
|
|
262
|
+
backoffType: 'exponential',
|
|
263
|
+
retryableErrors: ['ECONNRESET', 'ETIMEDOUT', 'ECONNREFUSED'],
|
|
264
|
+
}));
|
|
265
|
+
this.retryStrategies.set('memory', new RetryStrategy_js_1.RetryStrategy({
|
|
266
|
+
maxAttempts: 3,
|
|
267
|
+
initialDelay: 500,
|
|
268
|
+
backoffType: 'exponential',
|
|
269
|
+
retryableErrors: ['SQLITE_BUSY', 'SQLITE_LOCKED'],
|
|
270
|
+
}));
|
|
271
|
+
this.retryStrategies.set('database', new RetryStrategy_js_1.RetryStrategy({
|
|
272
|
+
maxAttempts: 3,
|
|
273
|
+
initialDelay: 500,
|
|
274
|
+
backoffType: 'exponential',
|
|
275
|
+
retryableErrors: ['SQLITE_BUSY', 'connection', 'timeout'],
|
|
276
|
+
}));
|
|
277
|
+
this.retryStrategies.set('orchestration', new RetryStrategy_js_1.RetryStrategy({
|
|
278
|
+
maxAttempts: 2,
|
|
279
|
+
initialDelay: 2000,
|
|
280
|
+
backoffType: 'linear',
|
|
281
|
+
}));
|
|
282
|
+
this.retryStrategies.set('agent', new RetryStrategy_js_1.RetryStrategy({
|
|
283
|
+
maxAttempts: 2,
|
|
284
|
+
initialDelay: 1000,
|
|
285
|
+
backoffType: 'constant',
|
|
286
|
+
}));
|
|
287
|
+
this.retryStrategies.set('workflow', new RetryStrategy_js_1.RetryStrategy({
|
|
288
|
+
maxAttempts: 3,
|
|
289
|
+
initialDelay: 1000,
|
|
290
|
+
backoffType: 'exponential',
|
|
291
|
+
}));
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Get retry strategy for component
|
|
295
|
+
*/
|
|
296
|
+
getRetryStrategy(component, overrides) {
|
|
297
|
+
const baseStrategy = this.retryStrategies.get(component);
|
|
298
|
+
if (overrides && baseStrategy) {
|
|
299
|
+
return new RetryStrategy_js_1.RetryStrategy({
|
|
300
|
+
...baseStrategy.getConfig(),
|
|
301
|
+
...overrides,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
return baseStrategy || new RetryStrategy_js_1.RetryStrategy();
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get policy for component
|
|
308
|
+
*/
|
|
309
|
+
getComponentPolicy(component) {
|
|
310
|
+
const override = this.policy.componentOverrides?.[component];
|
|
311
|
+
if (override) {
|
|
312
|
+
return { ...this.policy, ...override };
|
|
313
|
+
}
|
|
314
|
+
return this.policy;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Execute a specific recovery strategy
|
|
318
|
+
*/
|
|
319
|
+
async executeRecoveryStrategy(component, strategy, error) {
|
|
320
|
+
const startTime = Date.now();
|
|
321
|
+
try {
|
|
322
|
+
switch (strategy) {
|
|
323
|
+
case 'retry':
|
|
324
|
+
// Already handled by executeWithRecovery
|
|
325
|
+
return {
|
|
326
|
+
success: false,
|
|
327
|
+
strategy,
|
|
328
|
+
component,
|
|
329
|
+
action: 'no-op',
|
|
330
|
+
duration: 0,
|
|
331
|
+
};
|
|
332
|
+
case 'fallback':
|
|
333
|
+
const fallback = this.fallbackHandlers.get(`${component}:default`);
|
|
334
|
+
if (fallback) {
|
|
335
|
+
await fallback();
|
|
336
|
+
return {
|
|
337
|
+
success: true,
|
|
338
|
+
strategy,
|
|
339
|
+
component,
|
|
340
|
+
action: 'fallback-executed',
|
|
341
|
+
duration: Date.now() - startTime,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
success: false,
|
|
346
|
+
strategy,
|
|
347
|
+
component,
|
|
348
|
+
action: 'no-fallback-available',
|
|
349
|
+
duration: 0,
|
|
350
|
+
};
|
|
351
|
+
case 'circuit-break':
|
|
352
|
+
// Reset circuit breakers for component
|
|
353
|
+
this.resetCircuitBreakers(component);
|
|
354
|
+
return {
|
|
355
|
+
success: true,
|
|
356
|
+
strategy,
|
|
357
|
+
component,
|
|
358
|
+
action: 'circuits-reset',
|
|
359
|
+
duration: Date.now() - startTime,
|
|
360
|
+
};
|
|
361
|
+
case 'graceful-degradation':
|
|
362
|
+
this.emit('degradation-mode', { component, reason: error.message });
|
|
363
|
+
return {
|
|
364
|
+
success: true,
|
|
365
|
+
strategy,
|
|
366
|
+
component,
|
|
367
|
+
action: 'degradation-activated',
|
|
368
|
+
duration: Date.now() - startTime,
|
|
369
|
+
};
|
|
370
|
+
case 'rollback':
|
|
371
|
+
this.emit('rollback-requested', { component, error: error.message });
|
|
372
|
+
return {
|
|
373
|
+
success: false, // Rollback is async, can't confirm success
|
|
374
|
+
strategy,
|
|
375
|
+
component,
|
|
376
|
+
action: 'rollback-requested',
|
|
377
|
+
duration: Date.now() - startTime,
|
|
378
|
+
};
|
|
379
|
+
case 'escalate':
|
|
380
|
+
this.emit('escalation', { component, error: error.message });
|
|
381
|
+
return {
|
|
382
|
+
success: false,
|
|
383
|
+
strategy,
|
|
384
|
+
component,
|
|
385
|
+
action: 'escalated',
|
|
386
|
+
duration: Date.now() - startTime,
|
|
387
|
+
metadata: { requiresManualIntervention: true },
|
|
388
|
+
};
|
|
389
|
+
default:
|
|
390
|
+
return {
|
|
391
|
+
success: false,
|
|
392
|
+
strategy,
|
|
393
|
+
component,
|
|
394
|
+
action: 'unknown-strategy',
|
|
395
|
+
duration: 0,
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
catch (strategyError) {
|
|
400
|
+
return {
|
|
401
|
+
success: false,
|
|
402
|
+
strategy,
|
|
403
|
+
component,
|
|
404
|
+
action: 'strategy-failed',
|
|
405
|
+
duration: Date.now() - startTime,
|
|
406
|
+
error: strategyError instanceof Error ? strategyError.message : String(strategyError),
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Check if recovery can be attempted (rate limiting)
|
|
412
|
+
*/
|
|
413
|
+
canAttemptRecovery(component) {
|
|
414
|
+
const key = `${component}:recovery`;
|
|
415
|
+
const attempts = this.lastRecoveryAttempts.get(key) || [];
|
|
416
|
+
const now = Date.now();
|
|
417
|
+
const oneMinuteAgo = now - 60000;
|
|
418
|
+
// Filter to last minute
|
|
419
|
+
const recentAttempts = attempts.filter(t => t > oneMinuteAgo);
|
|
420
|
+
this.lastRecoveryAttempts.set(key, recentAttempts);
|
|
421
|
+
return recentAttempts.length < this.policy.maxRecoveryRate;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Record recovery attempt for rate limiting
|
|
425
|
+
*/
|
|
426
|
+
recordRecoveryAttempt(component) {
|
|
427
|
+
const key = `${component}:recovery`;
|
|
428
|
+
const attempts = this.lastRecoveryAttempts.get(key) || [];
|
|
429
|
+
attempts.push(Date.now());
|
|
430
|
+
this.lastRecoveryAttempts.set(key, attempts);
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Record recovery event
|
|
434
|
+
*/
|
|
435
|
+
recordRecoveryEvent(event) {
|
|
436
|
+
this.recoveryHistory.push(event);
|
|
437
|
+
// Keep only last 1000 events
|
|
438
|
+
if (this.recoveryHistory.length > 1000) {
|
|
439
|
+
this.recoveryHistory = this.recoveryHistory.slice(-1000);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Cleanup resources
|
|
444
|
+
*/
|
|
445
|
+
destroy() {
|
|
446
|
+
this.removeAllListeners();
|
|
447
|
+
this.recoveryHistory = [];
|
|
448
|
+
this.componentHealth.clear();
|
|
449
|
+
this.fallbackHandlers.clear();
|
|
450
|
+
this.healthCheckers.clear();
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
exports.RecoveryOrchestrator = RecoveryOrchestrator;
|
|
454
|
+
/**
|
|
455
|
+
* Default recovery orchestrator instance
|
|
456
|
+
*/
|
|
457
|
+
let defaultOrchestrator = null;
|
|
458
|
+
/**
|
|
459
|
+
* Get default recovery orchestrator
|
|
460
|
+
*/
|
|
461
|
+
function getRecoveryOrchestrator(policy) {
|
|
462
|
+
if (!defaultOrchestrator) {
|
|
463
|
+
defaultOrchestrator = new RecoveryOrchestrator(policy);
|
|
464
|
+
}
|
|
465
|
+
return defaultOrchestrator;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Reset default orchestrator (for testing)
|
|
469
|
+
*/
|
|
470
|
+
function resetRecoveryOrchestrator() {
|
|
471
|
+
if (defaultOrchestrator) {
|
|
472
|
+
defaultOrchestrator.destroy();
|
|
473
|
+
defaultOrchestrator = null;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=RecoveryOrchestrator.js.map
|