@litmers/cursorflow-orchestrator 0.1.20 → 0.1.28
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/CHANGELOG.md +20 -0
- package/commands/cursorflow-clean.md +19 -0
- package/commands/cursorflow-runs.md +59 -0
- package/commands/cursorflow-stop.md +55 -0
- package/dist/cli/clean.js +171 -0
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/logs.js +83 -42
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/monitor.d.ts +7 -0
- package/dist/cli/monitor.js +1007 -189
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/prepare.js +87 -3
- package/dist/cli/prepare.js.map +1 -1
- package/dist/cli/resume.js +188 -236
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +125 -3
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/runs.d.ts +5 -0
- package/dist/cli/runs.js +214 -0
- package/dist/cli/runs.js.map +1 -0
- package/dist/cli/setup-commands.js +0 -0
- package/dist/cli/signal.js +1 -1
- package/dist/cli/signal.js.map +1 -1
- package/dist/cli/stop.d.ts +5 -0
- package/dist/cli/stop.js +215 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/cli/tasks.d.ts +10 -0
- package/dist/cli/tasks.js +165 -0
- package/dist/cli/tasks.js.map +1 -0
- package/dist/core/auto-recovery.d.ts +212 -0
- package/dist/core/auto-recovery.js +737 -0
- package/dist/core/auto-recovery.js.map +1 -0
- package/dist/core/failure-policy.d.ts +156 -0
- package/dist/core/failure-policy.js +488 -0
- package/dist/core/failure-policy.js.map +1 -0
- package/dist/core/orchestrator.d.ts +15 -2
- package/dist/core/orchestrator.js +397 -15
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/reviewer.d.ts +2 -0
- package/dist/core/reviewer.js +2 -0
- package/dist/core/reviewer.js.map +1 -1
- package/dist/core/runner.d.ts +33 -10
- package/dist/core/runner.js +321 -146
- package/dist/core/runner.js.map +1 -1
- package/dist/services/logging/buffer.d.ts +67 -0
- package/dist/services/logging/buffer.js +309 -0
- package/dist/services/logging/buffer.js.map +1 -0
- package/dist/services/logging/console.d.ts +89 -0
- package/dist/services/logging/console.js +169 -0
- package/dist/services/logging/console.js.map +1 -0
- package/dist/services/logging/file-writer.d.ts +71 -0
- package/dist/services/logging/file-writer.js +516 -0
- package/dist/services/logging/file-writer.js.map +1 -0
- package/dist/services/logging/formatter.d.ts +39 -0
- package/dist/services/logging/formatter.js +227 -0
- package/dist/services/logging/formatter.js.map +1 -0
- package/dist/services/logging/index.d.ts +11 -0
- package/dist/services/logging/index.js +30 -0
- package/dist/services/logging/index.js.map +1 -0
- package/dist/services/logging/parser.d.ts +31 -0
- package/dist/services/logging/parser.js +222 -0
- package/dist/services/logging/parser.js.map +1 -0
- package/dist/services/process/index.d.ts +59 -0
- package/dist/services/process/index.js +257 -0
- package/dist/services/process/index.js.map +1 -0
- package/dist/types/agent.d.ts +20 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/config.d.ts +65 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/events.d.ts +125 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lane.d.ts +43 -0
- package/dist/types/lane.js +6 -0
- package/dist/types/lane.js.map +1 -0
- package/dist/types/logging.d.ts +71 -0
- package/dist/types/logging.js +16 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/review.d.ts +17 -0
- package/dist/types/review.js +6 -0
- package/dist/types/review.js.map +1 -0
- package/dist/types/run.d.ts +32 -0
- package/dist/types/run.js +6 -0
- package/dist/types/run.js.map +1 -0
- package/dist/types/task.d.ts +71 -0
- package/dist/types/task.js +6 -0
- package/dist/types/task.js.map +1 -0
- package/dist/ui/components.d.ts +134 -0
- package/dist/ui/components.js +389 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/log-viewer.d.ts +49 -0
- package/dist/ui/log-viewer.js +449 -0
- package/dist/ui/log-viewer.js.map +1 -0
- package/dist/utils/checkpoint.d.ts +87 -0
- package/dist/utils/checkpoint.js +317 -0
- package/dist/utils/checkpoint.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.js +11 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/cursor-agent.js.map +1 -1
- package/dist/utils/dependency.d.ts +74 -0
- package/dist/utils/dependency.js +420 -0
- package/dist/utils/dependency.js.map +1 -0
- package/dist/utils/doctor.js +10 -5
- package/dist/utils/doctor.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +10 -33
- package/dist/utils/enhanced-logger.js +94 -9
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/git.d.ts +121 -0
- package/dist/utils/git.js +322 -2
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/health.d.ts +91 -0
- package/dist/utils/health.js +556 -0
- package/dist/utils/health.js.map +1 -0
- package/dist/utils/lock.d.ts +95 -0
- package/dist/utils/lock.js +332 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/log-buffer.d.ts +17 -0
- package/dist/utils/log-buffer.js +14 -0
- package/dist/utils/log-buffer.js.map +1 -0
- package/dist/utils/log-constants.d.ts +23 -0
- package/dist/utils/log-constants.js +28 -0
- package/dist/utils/log-constants.js.map +1 -0
- package/dist/utils/log-formatter.d.ts +9 -0
- package/dist/utils/log-formatter.js +113 -70
- package/dist/utils/log-formatter.js.map +1 -1
- package/dist/utils/log-service.d.ts +19 -0
- package/dist/utils/log-service.js +47 -0
- package/dist/utils/log-service.js.map +1 -0
- package/dist/utils/logger.d.ts +46 -27
- package/dist/utils/logger.js +82 -60
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/process-manager.d.ts +21 -0
- package/dist/utils/process-manager.js +138 -0
- package/dist/utils/process-manager.js.map +1 -0
- package/dist/utils/retry.d.ts +121 -0
- package/dist/utils/retry.js +374 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/run-service.d.ts +88 -0
- package/dist/utils/run-service.js +412 -0
- package/dist/utils/run-service.js.map +1 -0
- package/dist/utils/state.d.ts +58 -2
- package/dist/utils/state.js +306 -3
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/task-service.d.ts +82 -0
- package/dist/utils/task-service.js +348 -0
- package/dist/utils/task-service.js.map +1 -0
- package/dist/utils/types.d.ts +2 -272
- package/dist/utils/types.js +16 -0
- package/dist/utils/types.js.map +1 -1
- package/package.json +38 -23
- package/scripts/ai-security-check.js +0 -1
- package/scripts/local-security-gate.sh +0 -0
- package/scripts/monitor-lanes.sh +94 -0
- package/scripts/patches/test-cursor-agent.js +0 -1
- package/scripts/release.sh +0 -0
- package/scripts/setup-security.sh +0 -0
- package/scripts/stream-logs.sh +72 -0
- package/scripts/verify-and-fix.sh +0 -0
- package/src/cli/clean.ts +180 -0
- package/src/cli/index.ts +7 -0
- package/src/cli/init.ts +1 -1
- package/src/cli/logs.ts +79 -42
- package/src/cli/monitor.ts +1815 -899
- package/src/cli/prepare.ts +97 -3
- package/src/cli/resume.ts +220 -277
- package/src/cli/run.ts +154 -3
- package/src/cli/runs.ts +212 -0
- package/src/cli/setup-commands.ts +0 -0
- package/src/cli/signal.ts +1 -1
- package/src/cli/stop.ts +209 -0
- package/src/cli/tasks.ts +154 -0
- package/src/core/auto-recovery.ts +909 -0
- package/src/core/failure-policy.ts +592 -0
- package/src/core/orchestrator.ts +1136 -675
- package/src/core/reviewer.ts +4 -0
- package/src/core/runner.ts +1443 -1217
- package/src/services/logging/buffer.ts +326 -0
- package/src/services/logging/console.ts +193 -0
- package/src/services/logging/file-writer.ts +526 -0
- package/src/services/logging/formatter.ts +268 -0
- package/src/services/logging/index.ts +16 -0
- package/src/services/logging/parser.ts +232 -0
- package/src/services/process/index.ts +261 -0
- package/src/types/agent.ts +24 -0
- package/src/types/config.ts +79 -0
- package/src/types/events.ts +156 -0
- package/src/types/index.ts +29 -0
- package/src/types/lane.ts +56 -0
- package/src/types/logging.ts +96 -0
- package/src/types/review.ts +20 -0
- package/src/types/run.ts +37 -0
- package/src/types/task.ts +79 -0
- package/src/ui/components.ts +430 -0
- package/src/ui/log-viewer.ts +485 -0
- package/src/utils/checkpoint.ts +374 -0
- package/src/utils/config.ts +11 -2
- package/src/utils/cursor-agent.ts +1 -1
- package/src/utils/dependency.ts +482 -0
- package/src/utils/doctor.ts +11 -5
- package/src/utils/enhanced-logger.ts +108 -49
- package/src/utils/git.ts +871 -499
- package/src/utils/health.ts +596 -0
- package/src/utils/lock.ts +346 -0
- package/src/utils/log-buffer.ts +28 -0
- package/src/utils/log-constants.ts +26 -0
- package/src/utils/log-formatter.ts +120 -37
- package/src/utils/log-service.ts +49 -0
- package/src/utils/logger.ts +100 -51
- package/src/utils/process-manager.ts +100 -0
- package/src/utils/retry.ts +413 -0
- package/src/utils/run-service.ts +433 -0
- package/src/utils/state.ts +369 -3
- package/src/utils/task-service.ts +370 -0
- package/src/utils/types.ts +2 -315
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Enhanced retry logic with exponential backoff and circuit breaker
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.CircuitBreaker = exports.CircuitState = exports.DEFAULT_CIRCUIT_BREAKER_CONFIG = exports.DEFAULT_RETRY_CONFIG = void 0;
|
|
40
|
+
exports.getCircuitBreaker = getCircuitBreaker;
|
|
41
|
+
exports.calculateDelay = calculateDelay;
|
|
42
|
+
exports.sleep = sleep;
|
|
43
|
+
exports.withTimeout = withTimeout;
|
|
44
|
+
exports.withEnhancedRetry = withEnhancedRetry;
|
|
45
|
+
exports.isTransientError = isTransientError;
|
|
46
|
+
exports.isPermanentError = isPermanentError;
|
|
47
|
+
exports.defaultShouldRetry = defaultShouldRetry;
|
|
48
|
+
const logger = __importStar(require("./logger"));
|
|
49
|
+
exports.DEFAULT_RETRY_CONFIG = {
|
|
50
|
+
maxRetries: 3,
|
|
51
|
+
baseDelayMs: 1000,
|
|
52
|
+
maxDelayMs: 30000,
|
|
53
|
+
backoffFactor: 2,
|
|
54
|
+
jitter: true,
|
|
55
|
+
attemptTimeoutMs: undefined,
|
|
56
|
+
};
|
|
57
|
+
exports.DEFAULT_CIRCUIT_BREAKER_CONFIG = {
|
|
58
|
+
failureThreshold: 5,
|
|
59
|
+
resetTimeoutMs: 60000,
|
|
60
|
+
successThreshold: 2,
|
|
61
|
+
};
|
|
62
|
+
var CircuitState;
|
|
63
|
+
(function (CircuitState) {
|
|
64
|
+
CircuitState["CLOSED"] = "CLOSED";
|
|
65
|
+
CircuitState["OPEN"] = "OPEN";
|
|
66
|
+
CircuitState["HALF_OPEN"] = "HALF_OPEN";
|
|
67
|
+
})(CircuitState || (exports.CircuitState = CircuitState = {}));
|
|
68
|
+
/**
|
|
69
|
+
* Circuit breaker implementation for managing service availability
|
|
70
|
+
*/
|
|
71
|
+
class CircuitBreaker {
|
|
72
|
+
state = CircuitState.CLOSED;
|
|
73
|
+
failureCount = 0;
|
|
74
|
+
successCount = 0;
|
|
75
|
+
lastFailureTime = 0;
|
|
76
|
+
config;
|
|
77
|
+
name;
|
|
78
|
+
constructor(name, config = {}) {
|
|
79
|
+
this.name = name;
|
|
80
|
+
this.config = { ...exports.DEFAULT_CIRCUIT_BREAKER_CONFIG, ...config };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if circuit allows a call
|
|
84
|
+
*/
|
|
85
|
+
canCall() {
|
|
86
|
+
if (this.state === CircuitState.CLOSED) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
if (this.state === CircuitState.OPEN) {
|
|
90
|
+
// Check if enough time has passed to try again
|
|
91
|
+
if (Date.now() - this.lastFailureTime >= this.config.resetTimeoutMs) {
|
|
92
|
+
this.state = CircuitState.HALF_OPEN;
|
|
93
|
+
this.successCount = 0;
|
|
94
|
+
logger.info(`[CircuitBreaker:${this.name}] Transitioning to HALF_OPEN`);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
// HALF_OPEN - allow limited calls
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Record a successful call
|
|
104
|
+
*/
|
|
105
|
+
recordSuccess() {
|
|
106
|
+
if (this.state === CircuitState.HALF_OPEN) {
|
|
107
|
+
this.successCount++;
|
|
108
|
+
if (this.successCount >= this.config.successThreshold) {
|
|
109
|
+
this.state = CircuitState.CLOSED;
|
|
110
|
+
this.failureCount = 0;
|
|
111
|
+
logger.info(`[CircuitBreaker:${this.name}] Circuit CLOSED after recovery`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (this.state === CircuitState.CLOSED) {
|
|
115
|
+
// Reset failure count on success
|
|
116
|
+
this.failureCount = Math.max(0, this.failureCount - 1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Record a failed call
|
|
121
|
+
*/
|
|
122
|
+
recordFailure() {
|
|
123
|
+
this.failureCount++;
|
|
124
|
+
this.lastFailureTime = Date.now();
|
|
125
|
+
if (this.state === CircuitState.HALF_OPEN) {
|
|
126
|
+
// Immediately open circuit on failure in half-open state
|
|
127
|
+
this.state = CircuitState.OPEN;
|
|
128
|
+
logger.warn(`[CircuitBreaker:${this.name}] Circuit OPEN (failure in half-open state)`);
|
|
129
|
+
}
|
|
130
|
+
else if (this.state === CircuitState.CLOSED && this.failureCount >= this.config.failureThreshold) {
|
|
131
|
+
this.state = CircuitState.OPEN;
|
|
132
|
+
logger.warn(`[CircuitBreaker:${this.name}] Circuit OPEN (threshold reached: ${this.failureCount} failures)`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get current circuit state
|
|
137
|
+
*/
|
|
138
|
+
getState() {
|
|
139
|
+
return this.state;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get time until circuit might close (for OPEN state)
|
|
143
|
+
*/
|
|
144
|
+
getTimeUntilRetry() {
|
|
145
|
+
if (this.state !== CircuitState.OPEN) {
|
|
146
|
+
return 0;
|
|
147
|
+
}
|
|
148
|
+
return Math.max(0, this.config.resetTimeoutMs - (Date.now() - this.lastFailureTime));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Force reset the circuit breaker
|
|
152
|
+
*/
|
|
153
|
+
reset() {
|
|
154
|
+
this.state = CircuitState.CLOSED;
|
|
155
|
+
this.failureCount = 0;
|
|
156
|
+
this.successCount = 0;
|
|
157
|
+
this.lastFailureTime = 0;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get circuit breaker status for monitoring
|
|
161
|
+
*/
|
|
162
|
+
getStatus() {
|
|
163
|
+
return {
|
|
164
|
+
state: this.state,
|
|
165
|
+
failureCount: this.failureCount,
|
|
166
|
+
timeUntilRetry: this.getTimeUntilRetry(),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.CircuitBreaker = CircuitBreaker;
|
|
171
|
+
/**
|
|
172
|
+
* Global circuit breaker registry
|
|
173
|
+
*/
|
|
174
|
+
const circuitBreakers = new Map();
|
|
175
|
+
/**
|
|
176
|
+
* Get or create a circuit breaker by name
|
|
177
|
+
*/
|
|
178
|
+
function getCircuitBreaker(name, config) {
|
|
179
|
+
let breaker = circuitBreakers.get(name);
|
|
180
|
+
if (!breaker) {
|
|
181
|
+
breaker = new CircuitBreaker(name, config);
|
|
182
|
+
circuitBreakers.set(name, breaker);
|
|
183
|
+
}
|
|
184
|
+
return breaker;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Calculate delay with exponential backoff and optional jitter
|
|
188
|
+
*/
|
|
189
|
+
function calculateDelay(attempt, config) {
|
|
190
|
+
let delay = config.baseDelayMs * Math.pow(config.backoffFactor, attempt);
|
|
191
|
+
delay = Math.min(delay, config.maxDelayMs);
|
|
192
|
+
if (config.jitter) {
|
|
193
|
+
// Add random jitter of ±25%
|
|
194
|
+
const jitterRange = delay * 0.25;
|
|
195
|
+
delay = delay - jitterRange + Math.random() * jitterRange * 2;
|
|
196
|
+
}
|
|
197
|
+
return Math.round(delay);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Sleep for specified milliseconds
|
|
201
|
+
*/
|
|
202
|
+
function sleep(ms) {
|
|
203
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Wrap a promise with timeout
|
|
207
|
+
*/
|
|
208
|
+
function withTimeout(promise, timeoutMs, message) {
|
|
209
|
+
return new Promise((resolve, reject) => {
|
|
210
|
+
const timer = setTimeout(() => {
|
|
211
|
+
reject(new Error(message || `Operation timed out after ${timeoutMs}ms`));
|
|
212
|
+
}, timeoutMs);
|
|
213
|
+
promise
|
|
214
|
+
.then(result => {
|
|
215
|
+
clearTimeout(timer);
|
|
216
|
+
resolve(result);
|
|
217
|
+
})
|
|
218
|
+
.catch(error => {
|
|
219
|
+
clearTimeout(timer);
|
|
220
|
+
reject(error);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Execute a function with enhanced retry logic
|
|
226
|
+
*/
|
|
227
|
+
async function withEnhancedRetry(fn, options = {}) {
|
|
228
|
+
const config = { ...exports.DEFAULT_RETRY_CONFIG, ...options.config };
|
|
229
|
+
const label = options.label || 'operation';
|
|
230
|
+
const startTime = Date.now();
|
|
231
|
+
// Get circuit breaker if specified
|
|
232
|
+
let breaker;
|
|
233
|
+
if (options.circuitBreaker) {
|
|
234
|
+
breaker = typeof options.circuitBreaker === 'string'
|
|
235
|
+
? getCircuitBreaker(options.circuitBreaker)
|
|
236
|
+
: options.circuitBreaker;
|
|
237
|
+
}
|
|
238
|
+
// Check circuit breaker before starting
|
|
239
|
+
if (breaker && !breaker.canCall()) {
|
|
240
|
+
const waitTime = breaker.getTimeUntilRetry();
|
|
241
|
+
return {
|
|
242
|
+
success: false,
|
|
243
|
+
error: new Error(`Circuit breaker is OPEN. Retry in ${Math.round(waitTime / 1000)}s`),
|
|
244
|
+
attempts: 0,
|
|
245
|
+
totalTimeMs: Date.now() - startTime,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
let lastError;
|
|
249
|
+
for (let attempt = 0; attempt <= config.maxRetries; attempt++) {
|
|
250
|
+
try {
|
|
251
|
+
// Execute with optional timeout
|
|
252
|
+
let result;
|
|
253
|
+
if (config.attemptTimeoutMs) {
|
|
254
|
+
result = await withTimeout(fn(), config.attemptTimeoutMs, `${label} timed out`);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
result = await fn();
|
|
258
|
+
}
|
|
259
|
+
// Success - record in circuit breaker
|
|
260
|
+
if (breaker) {
|
|
261
|
+
breaker.recordSuccess();
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
success: true,
|
|
265
|
+
result,
|
|
266
|
+
attempts: attempt + 1,
|
|
267
|
+
totalTimeMs: Date.now() - startTime,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
lastError = error;
|
|
272
|
+
// Record failure in circuit breaker
|
|
273
|
+
if (breaker) {
|
|
274
|
+
breaker.recordFailure();
|
|
275
|
+
if (!breaker.canCall()) {
|
|
276
|
+
logger.warn(`[${label}] Circuit breaker opened, stopping retries`);
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Check if we should retry
|
|
281
|
+
if (options.shouldRetry && !options.shouldRetry(error, attempt)) {
|
|
282
|
+
logger.warn(`[${label}] Error is not retryable: ${error.message}`);
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
// Check if we have more retries
|
|
286
|
+
if (attempt >= config.maxRetries) {
|
|
287
|
+
logger.error(`[${label}] All ${config.maxRetries + 1} attempts failed`);
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
// Calculate delay
|
|
291
|
+
const delay = calculateDelay(attempt, config);
|
|
292
|
+
// Notify on retry
|
|
293
|
+
if (options.onRetry) {
|
|
294
|
+
options.onRetry(error, attempt, delay);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
logger.warn(`[${label}] Attempt ${attempt + 1} failed: ${error.message}. Retrying in ${delay}ms...`);
|
|
298
|
+
}
|
|
299
|
+
await sleep(delay);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return {
|
|
303
|
+
success: false,
|
|
304
|
+
error: lastError,
|
|
305
|
+
attempts: config.maxRetries + 1,
|
|
306
|
+
totalTimeMs: Date.now() - startTime,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Check if an error is transient and worth retrying
|
|
311
|
+
*/
|
|
312
|
+
function isTransientError(error) {
|
|
313
|
+
const message = error.message.toLowerCase();
|
|
314
|
+
// Network errors
|
|
315
|
+
if (message.includes('econnreset') ||
|
|
316
|
+
message.includes('econnrefused') ||
|
|
317
|
+
message.includes('etimedout') ||
|
|
318
|
+
message.includes('enotfound') ||
|
|
319
|
+
message.includes('socket hang up')) {
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
// Service unavailable
|
|
323
|
+
if (message.includes('unavailable') ||
|
|
324
|
+
message.includes('503') ||
|
|
325
|
+
message.includes('502') ||
|
|
326
|
+
message.includes('504')) {
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
// Rate limiting (should retry after delay)
|
|
330
|
+
if (message.includes('rate limit') ||
|
|
331
|
+
message.includes('429') ||
|
|
332
|
+
message.includes('too many requests')) {
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
// Temporary server errors
|
|
336
|
+
if (message.includes('internal server error') ||
|
|
337
|
+
message.includes('500') ||
|
|
338
|
+
message.includes('temporarily')) {
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Check if an error is permanent and should not be retried
|
|
345
|
+
*/
|
|
346
|
+
function isPermanentError(error) {
|
|
347
|
+
const message = error.message.toLowerCase();
|
|
348
|
+
// Authentication errors
|
|
349
|
+
if (message.includes('unauthorized') ||
|
|
350
|
+
message.includes('401') ||
|
|
351
|
+
message.includes('forbidden') ||
|
|
352
|
+
message.includes('403') ||
|
|
353
|
+
message.includes('not authenticated')) {
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
// Configuration/setup errors
|
|
357
|
+
if (message.includes('not found') ||
|
|
358
|
+
message.includes('404') ||
|
|
359
|
+
message.includes('invalid configuration') ||
|
|
360
|
+
message.includes('invalid api key')) {
|
|
361
|
+
return true;
|
|
362
|
+
}
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Default retry predicate
|
|
367
|
+
*/
|
|
368
|
+
function defaultShouldRetry(error, attempt) {
|
|
369
|
+
if (isPermanentError(error)) {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
return isTransientError(error);
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunService - Manages CursorFlow run history and active processes
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - List all runs (with filtering by status)
|
|
6
|
+
* - Get detailed run information
|
|
7
|
+
* - Stop running processes
|
|
8
|
+
* - Delete run resources
|
|
9
|
+
*/
|
|
10
|
+
import { RunStatus, RunInfo } from './types';
|
|
11
|
+
export interface RunFilter {
|
|
12
|
+
status?: RunStatus;
|
|
13
|
+
limit?: number;
|
|
14
|
+
taskName?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface RunResources {
|
|
17
|
+
branches: string[];
|
|
18
|
+
worktrees: string[];
|
|
19
|
+
logSize: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class RunService {
|
|
22
|
+
private logsDir;
|
|
23
|
+
private runsDir;
|
|
24
|
+
constructor(logsDir: string);
|
|
25
|
+
/**
|
|
26
|
+
* List all runs with optional filtering
|
|
27
|
+
*/
|
|
28
|
+
listRuns(filter?: RunFilter): RunInfo[];
|
|
29
|
+
/**
|
|
30
|
+
* Get detailed information about a specific run
|
|
31
|
+
*/
|
|
32
|
+
getRunInfo(runId: string): RunInfo | null;
|
|
33
|
+
/**
|
|
34
|
+
* Get currently active (running) runs
|
|
35
|
+
*/
|
|
36
|
+
getActiveRuns(): RunInfo[];
|
|
37
|
+
/**
|
|
38
|
+
* Calculate overall run status based on lane statuses
|
|
39
|
+
*/
|
|
40
|
+
private calculateRunStatus;
|
|
41
|
+
/**
|
|
42
|
+
* Extract timestamp from run ID (format: run-TIMESTAMP)
|
|
43
|
+
*/
|
|
44
|
+
private extractTimestampFromRunId;
|
|
45
|
+
/**
|
|
46
|
+
* Extract task name from run ID or directory structure
|
|
47
|
+
*/
|
|
48
|
+
private extractTaskNameFromRunId;
|
|
49
|
+
/**
|
|
50
|
+
* Get run end time from lane states
|
|
51
|
+
*/
|
|
52
|
+
private getRunEndTime;
|
|
53
|
+
/**
|
|
54
|
+
* Get resources linked to a run (branches, worktrees)
|
|
55
|
+
*/
|
|
56
|
+
getLinkedResources(runId: string): RunResources;
|
|
57
|
+
/**
|
|
58
|
+
* Stop a running workflow
|
|
59
|
+
*/
|
|
60
|
+
stopRun(runId: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Stop all running workflows
|
|
63
|
+
*/
|
|
64
|
+
stopAllRuns(): number;
|
|
65
|
+
/**
|
|
66
|
+
* Delete a run and optionally its associated resources
|
|
67
|
+
*/
|
|
68
|
+
deleteRun(runId: string, options?: {
|
|
69
|
+
includeBranches?: boolean;
|
|
70
|
+
force?: boolean;
|
|
71
|
+
}): void;
|
|
72
|
+
/**
|
|
73
|
+
* Calculate directory size in bytes
|
|
74
|
+
*/
|
|
75
|
+
private getDirectorySize;
|
|
76
|
+
/**
|
|
77
|
+
* Format duration for display
|
|
78
|
+
*/
|
|
79
|
+
static formatDuration(ms: number): string;
|
|
80
|
+
/**
|
|
81
|
+
* Format bytes for display
|
|
82
|
+
*/
|
|
83
|
+
static formatBytes(bytes: number): string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a RunService instance with default paths
|
|
87
|
+
*/
|
|
88
|
+
export declare function createRunService(projectRoot?: string): RunService;
|