@cogitator-ai/workflows 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.
- package/LICENSE +21 -0
- package/README.md +97 -0
- package/dist/builder.d.ts +39 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +224 -0
- package/dist/builder.js.map +1 -0
- package/dist/checkpoint.d.ts +33 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +108 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/executor.d.ts +24 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +207 -0
- package/dist/executor.js.map +1 -0
- package/dist/human/approval-store.d.ts +95 -0
- package/dist/human/approval-store.d.ts.map +1 -0
- package/dist/human/approval-store.js +377 -0
- package/dist/human/approval-store.js.map +1 -0
- package/dist/human/human-node.d.ts +104 -0
- package/dist/human/human-node.d.ts.map +1 -0
- package/dist/human/human-node.js +342 -0
- package/dist/human/human-node.js.map +1 -0
- package/dist/human/index.d.ts +17 -0
- package/dist/human/index.d.ts.map +1 -0
- package/dist/human/index.js +17 -0
- package/dist/human/index.js.map +1 -0
- package/dist/human/notifiers.d.ts +85 -0
- package/dist/human/notifiers.d.ts.map +1 -0
- package/dist/human/notifiers.js +289 -0
- package/dist/human/notifiers.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/manager/index.d.ts +19 -0
- package/dist/manager/index.d.ts.map +1 -0
- package/dist/manager/index.js +17 -0
- package/dist/manager/index.js.map +1 -0
- package/dist/manager/run-store.d.ts +78 -0
- package/dist/manager/run-store.d.ts.map +1 -0
- package/dist/manager/run-store.js +390 -0
- package/dist/manager/run-store.js.map +1 -0
- package/dist/manager/scheduler.d.ts +159 -0
- package/dist/manager/scheduler.d.ts.map +1 -0
- package/dist/manager/scheduler.js +355 -0
- package/dist/manager/scheduler.js.map +1 -0
- package/dist/manager/workflow-manager.d.ts +114 -0
- package/dist/manager/workflow-manager.d.ts.map +1 -0
- package/dist/manager/workflow-manager.js +460 -0
- package/dist/manager/workflow-manager.js.map +1 -0
- package/dist/nodes/agent.d.ts +24 -0
- package/dist/nodes/agent.d.ts.map +1 -0
- package/dist/nodes/agent.js +37 -0
- package/dist/nodes/agent.js.map +1 -0
- package/dist/nodes/base.d.ts +12 -0
- package/dist/nodes/base.d.ts.map +1 -0
- package/dist/nodes/base.js +5 -0
- package/dist/nodes/base.js.map +1 -0
- package/dist/nodes/function.d.ts +27 -0
- package/dist/nodes/function.d.ts.map +1 -0
- package/dist/nodes/function.js +29 -0
- package/dist/nodes/function.js.map +1 -0
- package/dist/nodes/index.d.ts +8 -0
- package/dist/nodes/index.d.ts.map +1 -0
- package/dist/nodes/index.js +8 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/nodes/tool.d.ts +19 -0
- package/dist/nodes/tool.d.ts.map +1 -0
- package/dist/nodes/tool.js +26 -0
- package/dist/nodes/tool.js.map +1 -0
- package/dist/observability/exporters.d.ts +93 -0
- package/dist/observability/exporters.d.ts.map +1 -0
- package/dist/observability/exporters.js +330 -0
- package/dist/observability/exporters.js.map +1 -0
- package/dist/observability/index.d.ts +17 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +17 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics.d.ts +114 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +435 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/span-attributes.d.ts +95 -0
- package/dist/observability/span-attributes.d.ts.map +1 -0
- package/dist/observability/span-attributes.js +142 -0
- package/dist/observability/span-attributes.js.map +1 -0
- package/dist/observability/tracer.d.ts +110 -0
- package/dist/observability/tracer.d.ts.map +1 -0
- package/dist/observability/tracer.js +409 -0
- package/dist/observability/tracer.js.map +1 -0
- package/dist/patterns/index.d.ts +15 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +15 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/map-reduce.d.ts +223 -0
- package/dist/patterns/map-reduce.d.ts.map +1 -0
- package/dist/patterns/map-reduce.js +378 -0
- package/dist/patterns/map-reduce.js.map +1 -0
- package/dist/saga/circuit-breaker.d.ts +153 -0
- package/dist/saga/circuit-breaker.d.ts.map +1 -0
- package/dist/saga/circuit-breaker.js +306 -0
- package/dist/saga/circuit-breaker.js.map +1 -0
- package/dist/saga/compensation.d.ts +134 -0
- package/dist/saga/compensation.d.ts.map +1 -0
- package/dist/saga/compensation.js +240 -0
- package/dist/saga/compensation.js.map +1 -0
- package/dist/saga/dead-letter.d.ts +113 -0
- package/dist/saga/dead-letter.d.ts.map +1 -0
- package/dist/saga/dead-letter.js +307 -0
- package/dist/saga/dead-letter.js.map +1 -0
- package/dist/saga/idempotency.d.ts +95 -0
- package/dist/saga/idempotency.d.ts.map +1 -0
- package/dist/saga/idempotency.js +266 -0
- package/dist/saga/idempotency.js.map +1 -0
- package/dist/saga/index.d.ts +16 -0
- package/dist/saga/index.d.ts.map +1 -0
- package/dist/saga/index.js +16 -0
- package/dist/saga/index.js.map +1 -0
- package/dist/saga/retry.d.ts +59 -0
- package/dist/saga/retry.d.ts.map +1 -0
- package/dist/saga/retry.js +222 -0
- package/dist/saga/retry.js.map +1 -0
- package/dist/scheduler.d.ts +37 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +151 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/subworkflows/index.d.ts +16 -0
- package/dist/subworkflows/index.d.ts.map +1 -0
- package/dist/subworkflows/index.js +16 -0
- package/dist/subworkflows/index.js.map +1 -0
- package/dist/subworkflows/parallel-subworkflows.d.ts +139 -0
- package/dist/subworkflows/parallel-subworkflows.d.ts.map +1 -0
- package/dist/subworkflows/parallel-subworkflows.js +270 -0
- package/dist/subworkflows/parallel-subworkflows.js.map +1 -0
- package/dist/subworkflows/subworkflow-node.d.ts +136 -0
- package/dist/subworkflows/subworkflow-node.d.ts.map +1 -0
- package/dist/subworkflows/subworkflow-node.js +164 -0
- package/dist/subworkflows/subworkflow-node.js.map +1 -0
- package/dist/timers/cron-parser.d.ts +110 -0
- package/dist/timers/cron-parser.d.ts.map +1 -0
- package/dist/timers/cron-parser.js +412 -0
- package/dist/timers/cron-parser.js.map +1 -0
- package/dist/timers/index.d.ts +18 -0
- package/dist/timers/index.d.ts.map +1 -0
- package/dist/timers/index.js +18 -0
- package/dist/timers/index.js.map +1 -0
- package/dist/timers/timer-manager.d.ts +219 -0
- package/dist/timers/timer-manager.d.ts.map +1 -0
- package/dist/timers/timer-manager.js +351 -0
- package/dist/timers/timer-manager.js.map +1 -0
- package/dist/timers/timer-node.d.ts +144 -0
- package/dist/timers/timer-node.d.ts.map +1 -0
- package/dist/timers/timer-node.js +246 -0
- package/dist/timers/timer-node.js.map +1 -0
- package/dist/timers/timer-store.d.ts +90 -0
- package/dist/timers/timer-store.d.ts.map +1 -0
- package/dist/timers/timer-store.js +357 -0
- package/dist/timers/timer-store.js.map +1 -0
- package/dist/triggers/cron-trigger.d.ts +102 -0
- package/dist/triggers/cron-trigger.d.ts.map +1 -0
- package/dist/triggers/cron-trigger.js +309 -0
- package/dist/triggers/cron-trigger.js.map +1 -0
- package/dist/triggers/index.d.ts +14 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +10 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/rate-limiter.d.ts +130 -0
- package/dist/triggers/rate-limiter.d.ts.map +1 -0
- package/dist/triggers/rate-limiter.js +294 -0
- package/dist/triggers/rate-limiter.js.map +1 -0
- package/dist/triggers/trigger-manager.d.ts +166 -0
- package/dist/triggers/trigger-manager.d.ts.map +1 -0
- package/dist/triggers/trigger-manager.js +436 -0
- package/dist/triggers/trigger-manager.js.map +1 -0
- package/dist/triggers/webhook-trigger.d.ts +150 -0
- package/dist/triggers/webhook-trigger.d.ts.map +1 -0
- package/dist/triggers/webhook-trigger.js +452 -0
- package/dist/triggers/webhook-trigger.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-reduce.js","sourceRoot":"","sources":["../../src/patterns/map-reduce.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker pattern implementation
|
|
3
|
+
*
|
|
4
|
+
* States:
|
|
5
|
+
* - CLOSED: Normal operation, requests flow through
|
|
6
|
+
* - OPEN: Failures exceeded threshold, requests fail fast
|
|
7
|
+
* - HALF_OPEN: Testing if service recovered, limited requests allowed
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Per-node circuit breakers
|
|
11
|
+
* - Configurable failure threshold
|
|
12
|
+
* - Automatic recovery testing
|
|
13
|
+
* - Success threshold for full recovery
|
|
14
|
+
* - Event hooks for monitoring
|
|
15
|
+
*/
|
|
16
|
+
import type { CircuitBreakerConfig, CircuitBreakerState } from '@cogitator-ai/types';
|
|
17
|
+
/**
|
|
18
|
+
* Circuit breaker state data
|
|
19
|
+
*/
|
|
20
|
+
interface CircuitBreakerData {
|
|
21
|
+
state: CircuitBreakerState;
|
|
22
|
+
failures: number;
|
|
23
|
+
successes: number;
|
|
24
|
+
lastFailure?: number;
|
|
25
|
+
lastStateChange: number;
|
|
26
|
+
halfOpenAttempts: number;
|
|
27
|
+
totalFailures: number;
|
|
28
|
+
totalSuccesses: number;
|
|
29
|
+
consecutiveSuccesses: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Circuit breaker event types
|
|
33
|
+
*/
|
|
34
|
+
export type CircuitBreakerEvent = {
|
|
35
|
+
type: 'state_change';
|
|
36
|
+
from: CircuitBreakerState;
|
|
37
|
+
to: CircuitBreakerState;
|
|
38
|
+
nodeId: string;
|
|
39
|
+
} | {
|
|
40
|
+
type: 'success';
|
|
41
|
+
nodeId: string;
|
|
42
|
+
duration: number;
|
|
43
|
+
} | {
|
|
44
|
+
type: 'failure';
|
|
45
|
+
nodeId: string;
|
|
46
|
+
error: Error;
|
|
47
|
+
} | {
|
|
48
|
+
type: 'rejected';
|
|
49
|
+
nodeId: string;
|
|
50
|
+
reason: string;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Circuit breaker event handler
|
|
54
|
+
*/
|
|
55
|
+
export type CircuitBreakerEventHandler = (event: CircuitBreakerEvent) => void;
|
|
56
|
+
export declare class CircuitBreaker {
|
|
57
|
+
private config;
|
|
58
|
+
private breakers;
|
|
59
|
+
private eventHandlers;
|
|
60
|
+
constructor(config?: Partial<CircuitBreakerConfig>);
|
|
61
|
+
/**
|
|
62
|
+
* Get or create circuit breaker data for a node
|
|
63
|
+
*/
|
|
64
|
+
private getBreaker;
|
|
65
|
+
/**
|
|
66
|
+
* Change circuit state
|
|
67
|
+
*/
|
|
68
|
+
private changeState;
|
|
69
|
+
/**
|
|
70
|
+
* Check if request should be allowed
|
|
71
|
+
*/
|
|
72
|
+
canExecute(nodeId: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Execute a function with circuit breaker protection
|
|
75
|
+
*/
|
|
76
|
+
execute<T>(nodeId: string, fn: () => Promise<T>): Promise<T>;
|
|
77
|
+
/**
|
|
78
|
+
* Record a successful execution
|
|
79
|
+
*/
|
|
80
|
+
recordSuccess(nodeId: string, duration?: number): void;
|
|
81
|
+
/**
|
|
82
|
+
* Record a failed execution
|
|
83
|
+
*/
|
|
84
|
+
recordFailure(nodeId: string, error: Error): void;
|
|
85
|
+
/**
|
|
86
|
+
* Get current state for a node
|
|
87
|
+
*/
|
|
88
|
+
getState(nodeId: string): CircuitBreakerState;
|
|
89
|
+
/**
|
|
90
|
+
* Get detailed stats for a node
|
|
91
|
+
*/
|
|
92
|
+
getStats(nodeId: string): CircuitBreakerStats;
|
|
93
|
+
/**
|
|
94
|
+
* Get all node stats
|
|
95
|
+
*/
|
|
96
|
+
getAllStats(): Map<string, CircuitBreakerStats>;
|
|
97
|
+
/**
|
|
98
|
+
* Force circuit state (for testing/admin)
|
|
99
|
+
*/
|
|
100
|
+
forceState(nodeId: string, state: CircuitBreakerState): void;
|
|
101
|
+
/**
|
|
102
|
+
* Reset a circuit breaker
|
|
103
|
+
*/
|
|
104
|
+
reset(nodeId: string): void;
|
|
105
|
+
/**
|
|
106
|
+
* Reset all circuit breakers
|
|
107
|
+
*/
|
|
108
|
+
resetAll(): void;
|
|
109
|
+
/**
|
|
110
|
+
* Add event handler
|
|
111
|
+
*/
|
|
112
|
+
onEvent(handler: CircuitBreakerEventHandler): () => void;
|
|
113
|
+
/**
|
|
114
|
+
* Emit event to all handlers
|
|
115
|
+
*/
|
|
116
|
+
private emit;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Circuit breaker stats
|
|
120
|
+
*/
|
|
121
|
+
export interface CircuitBreakerStats {
|
|
122
|
+
nodeId: string;
|
|
123
|
+
state: CircuitBreakerState;
|
|
124
|
+
failures: number;
|
|
125
|
+
successes: number;
|
|
126
|
+
totalFailures: number;
|
|
127
|
+
totalSuccesses: number;
|
|
128
|
+
consecutiveSuccesses: number;
|
|
129
|
+
lastFailure?: number;
|
|
130
|
+
lastStateChange: number;
|
|
131
|
+
timeInState: number;
|
|
132
|
+
timeUntilReset?: number;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Error thrown when circuit breaker is open
|
|
136
|
+
*/
|
|
137
|
+
export declare class CircuitBreakerOpenError extends Error {
|
|
138
|
+
readonly nodeId: string;
|
|
139
|
+
readonly state: CircuitBreakerState;
|
|
140
|
+
readonly failures: number;
|
|
141
|
+
readonly lastFailure?: number;
|
|
142
|
+
constructor(nodeId: string, breaker: CircuitBreakerData);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Create a circuit breaker instance
|
|
146
|
+
*/
|
|
147
|
+
export declare function createCircuitBreaker(config?: Partial<CircuitBreakerConfig>): CircuitBreaker;
|
|
148
|
+
/**
|
|
149
|
+
* Decorator for circuit breaker protected methods
|
|
150
|
+
*/
|
|
151
|
+
export declare function WithCircuitBreaker(breaker: CircuitBreaker, nodeId: string): (_target: unknown, _propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
152
|
+
export {};
|
|
153
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/saga/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker pattern implementation
|
|
3
|
+
*
|
|
4
|
+
* States:
|
|
5
|
+
* - CLOSED: Normal operation, requests flow through
|
|
6
|
+
* - OPEN: Failures exceeded threshold, requests fail fast
|
|
7
|
+
* - HALF_OPEN: Testing if service recovered, limited requests allowed
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Per-node circuit breakers
|
|
11
|
+
* - Configurable failure threshold
|
|
12
|
+
* - Automatic recovery testing
|
|
13
|
+
* - Success threshold for full recovery
|
|
14
|
+
* - Event hooks for monitoring
|
|
15
|
+
*/
|
|
16
|
+
const DEFAULT_THRESHOLD = 5;
|
|
17
|
+
const DEFAULT_RESET_TIMEOUT = 30000;
|
|
18
|
+
const DEFAULT_SUCCESS_THRESHOLD = 2;
|
|
19
|
+
const DEFAULT_HALF_OPEN_MAX = 3;
|
|
20
|
+
export class CircuitBreaker {
|
|
21
|
+
config;
|
|
22
|
+
breakers = new Map();
|
|
23
|
+
eventHandlers = [];
|
|
24
|
+
constructor(config = {}) {
|
|
25
|
+
this.config = {
|
|
26
|
+
enabled: config.enabled ?? true,
|
|
27
|
+
threshold: config.threshold ?? DEFAULT_THRESHOLD,
|
|
28
|
+
resetTimeout: config.resetTimeout ?? DEFAULT_RESET_TIMEOUT,
|
|
29
|
+
successThreshold: config.successThreshold ?? DEFAULT_SUCCESS_THRESHOLD,
|
|
30
|
+
halfOpenMax: config.halfOpenMax ?? DEFAULT_HALF_OPEN_MAX,
|
|
31
|
+
onStateChange: config.onStateChange,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get or create circuit breaker data for a node
|
|
36
|
+
*/
|
|
37
|
+
getBreaker(nodeId) {
|
|
38
|
+
if (!this.breakers.has(nodeId)) {
|
|
39
|
+
this.breakers.set(nodeId, {
|
|
40
|
+
state: 'closed',
|
|
41
|
+
failures: 0,
|
|
42
|
+
successes: 0,
|
|
43
|
+
lastStateChange: Date.now(),
|
|
44
|
+
halfOpenAttempts: 0,
|
|
45
|
+
totalFailures: 0,
|
|
46
|
+
totalSuccesses: 0,
|
|
47
|
+
consecutiveSuccesses: 0,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return this.breakers.get(nodeId);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Change circuit state
|
|
54
|
+
*/
|
|
55
|
+
changeState(nodeId, breaker, newState) {
|
|
56
|
+
if (breaker.state === newState)
|
|
57
|
+
return;
|
|
58
|
+
const oldState = breaker.state;
|
|
59
|
+
breaker.state = newState;
|
|
60
|
+
breaker.lastStateChange = Date.now();
|
|
61
|
+
if (newState === 'half-open') {
|
|
62
|
+
breaker.halfOpenAttempts = 0;
|
|
63
|
+
breaker.consecutiveSuccesses = 0;
|
|
64
|
+
}
|
|
65
|
+
else if (newState === 'closed') {
|
|
66
|
+
breaker.failures = 0;
|
|
67
|
+
breaker.successes = 0;
|
|
68
|
+
}
|
|
69
|
+
const event = {
|
|
70
|
+
type: 'state_change',
|
|
71
|
+
from: oldState,
|
|
72
|
+
to: newState,
|
|
73
|
+
nodeId,
|
|
74
|
+
};
|
|
75
|
+
this.emit(event);
|
|
76
|
+
this.config.onStateChange?.(oldState, newState, nodeId);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if request should be allowed
|
|
80
|
+
*/
|
|
81
|
+
canExecute(nodeId) {
|
|
82
|
+
if (!this.config.enabled)
|
|
83
|
+
return true;
|
|
84
|
+
const breaker = this.getBreaker(nodeId);
|
|
85
|
+
const now = Date.now();
|
|
86
|
+
switch (breaker.state) {
|
|
87
|
+
case 'closed':
|
|
88
|
+
return true;
|
|
89
|
+
case 'open': {
|
|
90
|
+
const elapsed = now - breaker.lastStateChange;
|
|
91
|
+
if (elapsed >= this.config.resetTimeout) {
|
|
92
|
+
this.changeState(nodeId, breaker, 'half-open');
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
case 'half-open':
|
|
98
|
+
return breaker.halfOpenAttempts < this.config.halfOpenMax;
|
|
99
|
+
default:
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Execute a function with circuit breaker protection
|
|
105
|
+
*/
|
|
106
|
+
async execute(nodeId, fn) {
|
|
107
|
+
if (!this.canExecute(nodeId)) {
|
|
108
|
+
const event = {
|
|
109
|
+
type: 'rejected',
|
|
110
|
+
nodeId,
|
|
111
|
+
reason: 'Circuit breaker is open',
|
|
112
|
+
};
|
|
113
|
+
this.emit(event);
|
|
114
|
+
throw new CircuitBreakerOpenError(nodeId, this.getBreaker(nodeId));
|
|
115
|
+
}
|
|
116
|
+
const breaker = this.getBreaker(nodeId);
|
|
117
|
+
const startTime = Date.now();
|
|
118
|
+
if (breaker.state === 'half-open') {
|
|
119
|
+
breaker.halfOpenAttempts++;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const result = await fn();
|
|
123
|
+
this.recordSuccess(nodeId, Date.now() - startTime);
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
this.recordFailure(nodeId, error);
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Record a successful execution
|
|
133
|
+
*/
|
|
134
|
+
recordSuccess(nodeId, duration = 0) {
|
|
135
|
+
const breaker = this.getBreaker(nodeId);
|
|
136
|
+
breaker.successes++;
|
|
137
|
+
breaker.totalSuccesses++;
|
|
138
|
+
breaker.consecutiveSuccesses++;
|
|
139
|
+
const event = {
|
|
140
|
+
type: 'success',
|
|
141
|
+
nodeId,
|
|
142
|
+
duration,
|
|
143
|
+
};
|
|
144
|
+
this.emit(event);
|
|
145
|
+
switch (breaker.state) {
|
|
146
|
+
case 'half-open':
|
|
147
|
+
if (breaker.consecutiveSuccesses >= this.config.successThreshold) {
|
|
148
|
+
this.changeState(nodeId, breaker, 'closed');
|
|
149
|
+
}
|
|
150
|
+
break;
|
|
151
|
+
case 'closed':
|
|
152
|
+
breaker.failures = 0;
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Record a failed execution
|
|
158
|
+
*/
|
|
159
|
+
recordFailure(nodeId, error) {
|
|
160
|
+
const breaker = this.getBreaker(nodeId);
|
|
161
|
+
breaker.failures++;
|
|
162
|
+
breaker.totalFailures++;
|
|
163
|
+
breaker.lastFailure = Date.now();
|
|
164
|
+
breaker.consecutiveSuccesses = 0;
|
|
165
|
+
const event = {
|
|
166
|
+
type: 'failure',
|
|
167
|
+
nodeId,
|
|
168
|
+
error,
|
|
169
|
+
};
|
|
170
|
+
this.emit(event);
|
|
171
|
+
switch (breaker.state) {
|
|
172
|
+
case 'closed':
|
|
173
|
+
if (breaker.failures >= this.config.threshold) {
|
|
174
|
+
this.changeState(nodeId, breaker, 'open');
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
case 'half-open':
|
|
178
|
+
this.changeState(nodeId, breaker, 'open');
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get current state for a node
|
|
184
|
+
*/
|
|
185
|
+
getState(nodeId) {
|
|
186
|
+
return this.getBreaker(nodeId).state;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get detailed stats for a node
|
|
190
|
+
*/
|
|
191
|
+
getStats(nodeId) {
|
|
192
|
+
const breaker = this.getBreaker(nodeId);
|
|
193
|
+
const now = Date.now();
|
|
194
|
+
return {
|
|
195
|
+
nodeId,
|
|
196
|
+
state: breaker.state,
|
|
197
|
+
failures: breaker.failures,
|
|
198
|
+
successes: breaker.successes,
|
|
199
|
+
totalFailures: breaker.totalFailures,
|
|
200
|
+
totalSuccesses: breaker.totalSuccesses,
|
|
201
|
+
consecutiveSuccesses: breaker.consecutiveSuccesses,
|
|
202
|
+
lastFailure: breaker.lastFailure,
|
|
203
|
+
lastStateChange: breaker.lastStateChange,
|
|
204
|
+
timeInState: now - breaker.lastStateChange,
|
|
205
|
+
timeUntilReset: breaker.state === 'open'
|
|
206
|
+
? Math.max(0, this.config.resetTimeout - (now - breaker.lastStateChange))
|
|
207
|
+
: undefined,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get all node stats
|
|
212
|
+
*/
|
|
213
|
+
getAllStats() {
|
|
214
|
+
const stats = new Map();
|
|
215
|
+
for (const nodeId of this.breakers.keys()) {
|
|
216
|
+
stats.set(nodeId, this.getStats(nodeId));
|
|
217
|
+
}
|
|
218
|
+
return stats;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Force circuit state (for testing/admin)
|
|
222
|
+
*/
|
|
223
|
+
forceState(nodeId, state) {
|
|
224
|
+
const breaker = this.getBreaker(nodeId);
|
|
225
|
+
this.changeState(nodeId, breaker, state);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Reset a circuit breaker
|
|
229
|
+
*/
|
|
230
|
+
reset(nodeId) {
|
|
231
|
+
const breaker = this.getBreaker(nodeId);
|
|
232
|
+
breaker.failures = 0;
|
|
233
|
+
breaker.successes = 0;
|
|
234
|
+
breaker.consecutiveSuccesses = 0;
|
|
235
|
+
breaker.halfOpenAttempts = 0;
|
|
236
|
+
this.changeState(nodeId, breaker, 'closed');
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Reset all circuit breakers
|
|
240
|
+
*/
|
|
241
|
+
resetAll() {
|
|
242
|
+
for (const nodeId of this.breakers.keys()) {
|
|
243
|
+
this.reset(nodeId);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Add event handler
|
|
248
|
+
*/
|
|
249
|
+
onEvent(handler) {
|
|
250
|
+
this.eventHandlers.push(handler);
|
|
251
|
+
return () => {
|
|
252
|
+
const idx = this.eventHandlers.indexOf(handler);
|
|
253
|
+
if (idx !== -1) {
|
|
254
|
+
this.eventHandlers.splice(idx, 1);
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Emit event to all handlers
|
|
260
|
+
*/
|
|
261
|
+
emit(event) {
|
|
262
|
+
for (const handler of this.eventHandlers) {
|
|
263
|
+
try {
|
|
264
|
+
handler(event);
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Error thrown when circuit breaker is open
|
|
273
|
+
*/
|
|
274
|
+
export class CircuitBreakerOpenError extends Error {
|
|
275
|
+
nodeId;
|
|
276
|
+
state;
|
|
277
|
+
failures;
|
|
278
|
+
lastFailure;
|
|
279
|
+
constructor(nodeId, breaker) {
|
|
280
|
+
super(`Circuit breaker is open for node '${nodeId}'`);
|
|
281
|
+
this.name = 'CircuitBreakerOpenError';
|
|
282
|
+
this.nodeId = nodeId;
|
|
283
|
+
this.state = breaker.state;
|
|
284
|
+
this.failures = breaker.failures;
|
|
285
|
+
this.lastFailure = breaker.lastFailure;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Create a circuit breaker instance
|
|
290
|
+
*/
|
|
291
|
+
export function createCircuitBreaker(config) {
|
|
292
|
+
return new CircuitBreaker(config);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Decorator for circuit breaker protected methods
|
|
296
|
+
*/
|
|
297
|
+
export function WithCircuitBreaker(breaker, nodeId) {
|
|
298
|
+
return function (_target, _propertyKey, descriptor) {
|
|
299
|
+
const originalMethod = descriptor.value;
|
|
300
|
+
descriptor.value = async function (...args) {
|
|
301
|
+
return breaker.execute(nodeId, () => originalMethod.apply(this, args));
|
|
302
|
+
};
|
|
303
|
+
return descriptor;
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/saga/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compensation Manager for Saga pattern
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Automatic compensation on failure
|
|
6
|
+
* - Reverse-order execution
|
|
7
|
+
* - Partial compensation (only completed steps)
|
|
8
|
+
* - Compensation condition checking
|
|
9
|
+
* - Compensation result tracking
|
|
10
|
+
*/
|
|
11
|
+
import type { CompensationConfig, CompensationOrder, WorkflowState } from '@cogitator-ai/types';
|
|
12
|
+
/**
|
|
13
|
+
* Compensation step definition
|
|
14
|
+
*/
|
|
15
|
+
export interface CompensationStep<S = WorkflowState> {
|
|
16
|
+
nodeId: string;
|
|
17
|
+
compensationFn: (state: S, originalResult: unknown) => Promise<void>;
|
|
18
|
+
condition?: (state: S, error: Error) => boolean;
|
|
19
|
+
order?: CompensationOrder;
|
|
20
|
+
timeout?: number;
|
|
21
|
+
retries?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compensation execution result
|
|
25
|
+
*/
|
|
26
|
+
export interface CompensationResult {
|
|
27
|
+
nodeId: string;
|
|
28
|
+
success: boolean;
|
|
29
|
+
error?: Error;
|
|
30
|
+
duration: number;
|
|
31
|
+
skipped: boolean;
|
|
32
|
+
skipReason?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Full compensation execution report
|
|
36
|
+
*/
|
|
37
|
+
export interface CompensationReport {
|
|
38
|
+
triggeredBy: {
|
|
39
|
+
nodeId: string;
|
|
40
|
+
error: Error;
|
|
41
|
+
};
|
|
42
|
+
compensated: CompensationResult[];
|
|
43
|
+
totalDuration: number;
|
|
44
|
+
allSuccessful: boolean;
|
|
45
|
+
partialFailures: string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Compensation Manager class
|
|
49
|
+
*/
|
|
50
|
+
export declare class CompensationManager<S = WorkflowState> {
|
|
51
|
+
private steps;
|
|
52
|
+
private completedNodes;
|
|
53
|
+
private executionOrder;
|
|
54
|
+
/**
|
|
55
|
+
* Register a compensation step for a node
|
|
56
|
+
*/
|
|
57
|
+
registerCompensation(nodeId: string, compensationFn: (state: S, originalResult: unknown) => Promise<void>, options?: Partial<Omit<CompensationStep<S>, 'nodeId' | 'compensationFn'>>): void;
|
|
58
|
+
/**
|
|
59
|
+
* Register compensation from config
|
|
60
|
+
*/
|
|
61
|
+
registerFromConfig(nodeId: string, config: CompensationConfig<S>): void;
|
|
62
|
+
/**
|
|
63
|
+
* Mark a node as completed with its result
|
|
64
|
+
*/
|
|
65
|
+
markCompleted(nodeId: string, result: unknown): void;
|
|
66
|
+
/**
|
|
67
|
+
* Clear a node's completion status (for retries)
|
|
68
|
+
*/
|
|
69
|
+
clearCompleted(nodeId: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* Check if a node has a compensation step
|
|
72
|
+
*/
|
|
73
|
+
hasCompensation(nodeId: string): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Get nodes that need compensation (completed nodes with compensation steps)
|
|
76
|
+
*/
|
|
77
|
+
getCompensableNodes(): string[];
|
|
78
|
+
/**
|
|
79
|
+
* Execute compensation for all completed nodes
|
|
80
|
+
*/
|
|
81
|
+
compensate(state: S, failedNodeId: string, error: Error): Promise<CompensationReport>;
|
|
82
|
+
/**
|
|
83
|
+
* Sort nodes by their compensation order
|
|
84
|
+
*/
|
|
85
|
+
private sortByCompensationOrder;
|
|
86
|
+
/**
|
|
87
|
+
* Execute with timeout
|
|
88
|
+
*/
|
|
89
|
+
private withTimeout;
|
|
90
|
+
/**
|
|
91
|
+
* Reset manager state
|
|
92
|
+
*/
|
|
93
|
+
reset(): void;
|
|
94
|
+
/**
|
|
95
|
+
* Get current state summary
|
|
96
|
+
*/
|
|
97
|
+
getSummary(): CompensationManagerSummary;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Compensation manager summary
|
|
101
|
+
*/
|
|
102
|
+
export interface CompensationManagerSummary {
|
|
103
|
+
registeredSteps: number;
|
|
104
|
+
completedNodes: number;
|
|
105
|
+
compensableNodes: number;
|
|
106
|
+
executionOrder: string[];
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create a compensation manager
|
|
110
|
+
*/
|
|
111
|
+
export declare function createCompensationManager<S = WorkflowState>(): CompensationManager<S>;
|
|
112
|
+
/**
|
|
113
|
+
* Compensation builder for fluent API
|
|
114
|
+
*/
|
|
115
|
+
export declare class CompensationBuilder<S = WorkflowState> {
|
|
116
|
+
private steps;
|
|
117
|
+
/**
|
|
118
|
+
* Add a compensation step
|
|
119
|
+
*/
|
|
120
|
+
addStep(nodeId: string, fn: (state: S, result: unknown) => Promise<void>, options?: Partial<Omit<CompensationStep<S>, 'nodeId' | 'compensationFn'>>): this;
|
|
121
|
+
/**
|
|
122
|
+
* Add conditional compensation
|
|
123
|
+
*/
|
|
124
|
+
addConditionalStep(nodeId: string, fn: (state: S, result: unknown) => Promise<void>, condition: (state: S, error: Error) => boolean, options?: Partial<Omit<CompensationStep<S>, 'nodeId' | 'compensationFn' | 'condition'>>): this;
|
|
125
|
+
/**
|
|
126
|
+
* Build the compensation manager
|
|
127
|
+
*/
|
|
128
|
+
build(): CompensationManager<S>;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a compensation builder
|
|
132
|
+
*/
|
|
133
|
+
export declare function compensationBuilder<S = WorkflowState>(): CompensationBuilder<S>;
|
|
134
|
+
//# sourceMappingURL=compensation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compensation.d.ts","sourceRoot":"","sources":["../../src/saga/compensation.ts"],"names":[],"mappings":"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"}
|