@overlordai/worker 1.0.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/dist/ansi-stripper.d.ts +11 -0
- package/dist/ansi-stripper.d.ts.map +1 -0
- package/dist/ansi-stripper.js +19 -0
- package/dist/ansi-stripper.js.map +1 -0
- package/dist/capability-detector.d.ts +5 -0
- package/dist/capability-detector.d.ts.map +1 -0
- package/dist/capability-detector.js +43 -0
- package/dist/capability-detector.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +144 -0
- package/dist/config.js.map +1 -0
- package/dist/executor/base.executor.d.ts +55 -0
- package/dist/executor/base.executor.d.ts.map +1 -0
- package/dist/executor/base.executor.js +30 -0
- package/dist/executor/base.executor.js.map +1 -0
- package/dist/executor/claude.executor.d.ts +23 -0
- package/dist/executor/claude.executor.d.ts.map +1 -0
- package/dist/executor/claude.executor.js +106 -0
- package/dist/executor/claude.executor.js.map +1 -0
- package/dist/executor/codex.executor.d.ts +20 -0
- package/dist/executor/codex.executor.d.ts.map +1 -0
- package/dist/executor/codex.executor.js +51 -0
- package/dist/executor/codex.executor.js.map +1 -0
- package/dist/executor/cursor.executor.d.ts +19 -0
- package/dist/executor/cursor.executor.d.ts.map +1 -0
- package/dist/executor/cursor.executor.js +46 -0
- package/dist/executor/cursor.executor.js.map +1 -0
- package/dist/executor/custom.executor.d.ts +21 -0
- package/dist/executor/custom.executor.d.ts.map +1 -0
- package/dist/executor/custom.executor.js +57 -0
- package/dist/executor/custom.executor.js.map +1 -0
- package/dist/executor/executor.factory.d.ts +9 -0
- package/dist/executor/executor.factory.d.ts.map +1 -0
- package/dist/executor/executor.factory.js +29 -0
- package/dist/executor/executor.factory.js.map +1 -0
- package/dist/git-operations.d.ts +23 -0
- package/dist/git-operations.d.ts.map +1 -0
- package/dist/git-operations.js +94 -0
- package/dist/git-operations.js.map +1 -0
- package/dist/hardware.d.ts +14 -0
- package/dist/hardware.d.ts.map +1 -0
- package/dist/hardware.js +92 -0
- package/dist/hardware.js.map +1 -0
- package/dist/healthz.d.ts +14 -0
- package/dist/healthz.d.ts.map +1 -0
- package/dist/healthz.js +104 -0
- package/dist/healthz.js.map +1 -0
- package/dist/jwt-manager.d.ts +23 -0
- package/dist/jwt-manager.d.ts.map +1 -0
- package/dist/jwt-manager.js +169 -0
- package/dist/jwt-manager.js.map +1 -0
- package/dist/lease-manager.d.ts +17 -0
- package/dist/lease-manager.d.ts.map +1 -0
- package/dist/lease-manager.js +62 -0
- package/dist/lease-manager.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +497 -0
- package/dist/main.js.map +1 -0
- package/dist/orphan-reaper.d.ts +6 -0
- package/dist/orphan-reaper.d.ts.map +1 -0
- package/dist/orphan-reaper.js +148 -0
- package/dist/orphan-reaper.js.map +1 -0
- package/dist/pipeline-parser.d.ts +14 -0
- package/dist/pipeline-parser.d.ts.map +1 -0
- package/dist/pipeline-parser.js +183 -0
- package/dist/pipeline-parser.js.map +1 -0
- package/dist/pipeline-runner.d.ts +120 -0
- package/dist/pipeline-runner.d.ts.map +1 -0
- package/dist/pipeline-runner.js +568 -0
- package/dist/pipeline-runner.js.map +1 -0
- package/dist/project-mutex.d.ts +14 -0
- package/dist/project-mutex.d.ts.map +1 -0
- package/dist/project-mutex.js +25 -0
- package/dist/project-mutex.js.map +1 -0
- package/dist/pty-manager.d.ts +50 -0
- package/dist/pty-manager.d.ts.map +1 -0
- package/dist/pty-manager.js +203 -0
- package/dist/pty-manager.js.map +1 -0
- package/dist/ringbuffer.d.ts +22 -0
- package/dist/ringbuffer.d.ts.map +1 -0
- package/dist/ringbuffer.js +57 -0
- package/dist/ringbuffer.js.map +1 -0
- package/dist/safe-env.d.ts +6 -0
- package/dist/safe-env.d.ts.map +1 -0
- package/dist/safe-env.js +19 -0
- package/dist/safe-env.js.map +1 -0
- package/dist/stage-detector.d.ts +62 -0
- package/dist/stage-detector.d.ts.map +1 -0
- package/dist/stage-detector.js +140 -0
- package/dist/stage-detector.js.map +1 -0
- package/dist/task-handler.d.ts +56 -0
- package/dist/task-handler.d.ts.map +1 -0
- package/dist/task-handler.js +296 -0
- package/dist/task-handler.js.map +1 -0
- package/dist/tunnel-manager.d.ts +34 -0
- package/dist/tunnel-manager.d.ts.map +1 -0
- package/dist/tunnel-manager.js +165 -0
- package/dist/tunnel-manager.js.map +1 -0
- package/dist/worker-client.d.ts +62 -0
- package/dist/worker-client.d.ts.map +1 -0
- package/dist/worker-client.js +303 -0
- package/dist/worker-client.js.map +1 -0
- package/dist/workspace-manager.d.ts +51 -0
- package/dist/workspace-manager.d.ts.map +1 -0
- package/dist/workspace-manager.js +276 -0
- package/dist/workspace-manager.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,568 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PipelineRunner = void 0;
|
|
7
|
+
exports.getOwnership = getOwnership;
|
|
8
|
+
exports.casOwnership = casOwnership;
|
|
9
|
+
exports.clearOwnership = clearOwnership;
|
|
10
|
+
const node_events_1 = require("node:events");
|
|
11
|
+
const protocol_1 = require("@overlordai/protocol");
|
|
12
|
+
const pipeline_parser_js_1 = require("./pipeline-parser.js");
|
|
13
|
+
const stage_detector_js_1 = require("./stage-detector.js");
|
|
14
|
+
const pino_1 = __importDefault(require("pino"));
|
|
15
|
+
const log = (0, pino_1.default)({ name: 'pipeline-runner' });
|
|
16
|
+
/** In-memory CAS map for PTY ownership */
|
|
17
|
+
const ownershipMap = new Map();
|
|
18
|
+
/** Maximum number of ownership entries before pruning stale ones. */
|
|
19
|
+
const OWNERSHIP_MAP_MAX_SIZE = 1000;
|
|
20
|
+
function getOwnership(sessionId) {
|
|
21
|
+
let entry = ownershipMap.get(sessionId);
|
|
22
|
+
if (!entry) {
|
|
23
|
+
// Prune stale entries if the map grows too large
|
|
24
|
+
if (ownershipMap.size >= OWNERSHIP_MAP_MAX_SIZE) {
|
|
25
|
+
const entriesToDelete = Math.floor(OWNERSHIP_MAP_MAX_SIZE / 2);
|
|
26
|
+
let deleted = 0;
|
|
27
|
+
for (const key of ownershipMap.keys()) {
|
|
28
|
+
if (deleted >= entriesToDelete)
|
|
29
|
+
break;
|
|
30
|
+
ownershipMap.delete(key);
|
|
31
|
+
deleted++;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
entry = { owner: 'pipeline', revision: 0 };
|
|
35
|
+
ownershipMap.set(sessionId, entry);
|
|
36
|
+
}
|
|
37
|
+
return entry;
|
|
38
|
+
}
|
|
39
|
+
function casOwnership(sessionId, expectedRevision, newOwner) {
|
|
40
|
+
const entry = getOwnership(sessionId);
|
|
41
|
+
if (entry.revision !== expectedRevision) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
entry.owner = newOwner;
|
|
45
|
+
entry.revision += 1;
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
function clearOwnership(sessionId) {
|
|
49
|
+
ownershipMap.delete(sessionId);
|
|
50
|
+
}
|
|
51
|
+
// -- Detection polling interval --
|
|
52
|
+
/** Escape a value for safe use in a shell export statement. */
|
|
53
|
+
function shellEscape(value) {
|
|
54
|
+
// Wrap in single quotes; escape any embedded single quotes
|
|
55
|
+
return "'" + value.replace(/'/g, "'\\''") + "'";
|
|
56
|
+
}
|
|
57
|
+
const DETECTION_POLL_MS = 1_000;
|
|
58
|
+
const NO_OUTPUT_ALERT_MS = protocol_1.PTY_IDLE_TIMEOUT_MS; // 15 min
|
|
59
|
+
// -- PipelineRunner class --
|
|
60
|
+
class PipelineRunner extends node_events_1.EventEmitter {
|
|
61
|
+
taskId;
|
|
62
|
+
sessionId;
|
|
63
|
+
ptySession;
|
|
64
|
+
leaseChecker;
|
|
65
|
+
promptDetector;
|
|
66
|
+
pipeline = null;
|
|
67
|
+
stageDetector = null;
|
|
68
|
+
state = {
|
|
69
|
+
currentStageIndex: 0,
|
|
70
|
+
currentStageName: '',
|
|
71
|
+
status: 'running',
|
|
72
|
+
loopCount: 0,
|
|
73
|
+
retryCount: 0,
|
|
74
|
+
};
|
|
75
|
+
lastConfirmResult = '';
|
|
76
|
+
/** Set to true by destroy() to prevent the runLoop from creating new ownership entries. */
|
|
77
|
+
destroyed = false;
|
|
78
|
+
/** Accumulated env vars from stage configs, prepended to commands as exports. */
|
|
79
|
+
stageEnv = {};
|
|
80
|
+
// Timers
|
|
81
|
+
detectionTimer = null;
|
|
82
|
+
stageTimeoutTimer = null;
|
|
83
|
+
taskTimeoutTimer = null;
|
|
84
|
+
confirmTimeoutTimer = null;
|
|
85
|
+
noOutputAlertTimer = null;
|
|
86
|
+
// Resolve for current stage completion
|
|
87
|
+
stageResolve = null;
|
|
88
|
+
// Confirm resolve
|
|
89
|
+
confirmResolve = null;
|
|
90
|
+
constructor(taskId, sessionId, ptySession, leaseChecker, promptDetector) {
|
|
91
|
+
super();
|
|
92
|
+
this.taskId = taskId;
|
|
93
|
+
this.sessionId = sessionId;
|
|
94
|
+
this.ptySession = ptySession;
|
|
95
|
+
this.leaseChecker = leaseChecker;
|
|
96
|
+
this.promptDetector = promptDetector;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Start pipeline execution.
|
|
100
|
+
* @param pipelineJson - raw JSON string from ConfigSnapshot.pipeline (or null)
|
|
101
|
+
* @param taskDescription - used as command for default pipeline
|
|
102
|
+
*/
|
|
103
|
+
async start(pipelineJson, taskDescription) {
|
|
104
|
+
try {
|
|
105
|
+
this.pipeline = pipeline_parser_js_1.PipelineParser.parse(pipelineJson, taskDescription);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
109
|
+
log.error({ taskId: this.taskId, err: msg }, 'Failed to parse pipeline');
|
|
110
|
+
this.state.status = 'failed';
|
|
111
|
+
this.emit('pipelineFailed', this.taskId, msg);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Initialize ownership
|
|
115
|
+
getOwnership(this.sessionId);
|
|
116
|
+
// Start overall task timeout
|
|
117
|
+
const totalTimeout = Math.min(this.pipeline.stages.reduce((sum, s) => sum + (s.timeout ?? protocol_1.DEFAULT_STAGE_TIMEOUT_MS), 0), protocol_1.MAX_TASK_DURATION_MS);
|
|
118
|
+
this.taskTimeoutTimer = setTimeout(() => {
|
|
119
|
+
this.handleTaskTimeout();
|
|
120
|
+
}, totalTimeout);
|
|
121
|
+
if (this.taskTimeoutTimer.unref)
|
|
122
|
+
this.taskTimeoutTimer.unref();
|
|
123
|
+
// Run main loop
|
|
124
|
+
await this.runLoop();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Suspend pipeline execution.
|
|
128
|
+
*/
|
|
129
|
+
suspend(reason) {
|
|
130
|
+
if (this.state.status === 'completed' || this.state.status === 'failed')
|
|
131
|
+
return;
|
|
132
|
+
log.info({ taskId: this.taskId, reason }, 'Pipeline suspended');
|
|
133
|
+
this.state.status = 'suspended';
|
|
134
|
+
this.state.suspendReason = reason;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Resume pipeline execution.
|
|
138
|
+
*/
|
|
139
|
+
resume() {
|
|
140
|
+
if (this.state.status !== 'suspended')
|
|
141
|
+
return;
|
|
142
|
+
log.info({ taskId: this.taskId }, 'Pipeline resumed');
|
|
143
|
+
this.state.status = 'running';
|
|
144
|
+
this.state.suspendReason = undefined;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Confirm an interactive stage with a user-provided result.
|
|
148
|
+
*/
|
|
149
|
+
confirmStage(_taskId, stageIndex, result) {
|
|
150
|
+
if (this.state.status !== 'waiting_confirm') {
|
|
151
|
+
log.warn({ taskId: this.taskId }, 'confirmStage called but not in waiting_confirm state');
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (stageIndex !== this.state.currentStageIndex) {
|
|
155
|
+
log.warn({ taskId: this.taskId, expectedStageIndex: this.state.currentStageIndex, receivedStageIndex: stageIndex }, 'Stale stage confirm response (stageIndex mismatch), ignoring');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
this.clearConfirmTimeout();
|
|
159
|
+
if (this.confirmResolve) {
|
|
160
|
+
this.confirmResolve(result);
|
|
161
|
+
this.confirmResolve = null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get current pipeline state.
|
|
166
|
+
*/
|
|
167
|
+
getState() {
|
|
168
|
+
return { ...this.state };
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Stop all timers and clean up.
|
|
172
|
+
*/
|
|
173
|
+
destroy() {
|
|
174
|
+
this.destroyed = true;
|
|
175
|
+
this.clearDetectionTimer();
|
|
176
|
+
this.clearStageTimeout();
|
|
177
|
+
this.clearTaskTimeout();
|
|
178
|
+
this.clearConfirmTimeout();
|
|
179
|
+
this.clearNoOutputAlert();
|
|
180
|
+
clearOwnership(this.sessionId);
|
|
181
|
+
}
|
|
182
|
+
// -- Event registration helpers (typed) --
|
|
183
|
+
onStageChanged(handler) {
|
|
184
|
+
this.on('stageStart', handler);
|
|
185
|
+
}
|
|
186
|
+
onCompleted(handler) {
|
|
187
|
+
this.on('pipelineComplete', handler);
|
|
188
|
+
}
|
|
189
|
+
onFailed(handler) {
|
|
190
|
+
this.on('pipelineFailed', handler);
|
|
191
|
+
}
|
|
192
|
+
onConfirmRequired(handler) {
|
|
193
|
+
this.on('confirmRequired', handler);
|
|
194
|
+
}
|
|
195
|
+
// -- Main execution loop --
|
|
196
|
+
isTerminal() {
|
|
197
|
+
return this.destroyed || this.state.status === 'failed' || this.state.status === 'completed';
|
|
198
|
+
}
|
|
199
|
+
async runLoop() {
|
|
200
|
+
if (!this.pipeline)
|
|
201
|
+
return;
|
|
202
|
+
const { stages } = this.pipeline;
|
|
203
|
+
while (this.state.currentStageIndex < stages.length) {
|
|
204
|
+
if (this.isTerminal())
|
|
205
|
+
break;
|
|
206
|
+
const stage = stages[this.state.currentStageIndex];
|
|
207
|
+
this.state.currentStageName = stage.name;
|
|
208
|
+
// Wait if suspended
|
|
209
|
+
await this.waitWhileSuspended();
|
|
210
|
+
if (this.isTerminal())
|
|
211
|
+
break;
|
|
212
|
+
// Check ownership
|
|
213
|
+
const ownership = getOwnership(this.sessionId);
|
|
214
|
+
if (ownership.owner !== 'pipeline') {
|
|
215
|
+
this.suspend('human_takeover');
|
|
216
|
+
await this.waitWhileSuspended();
|
|
217
|
+
if (this.isTerminal())
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
// Handle interactive stage
|
|
221
|
+
const isInteractive = this.isInteractiveStage(stage);
|
|
222
|
+
if (isInteractive) {
|
|
223
|
+
const shouldContinue = await this.handleInteractiveStage(stage);
|
|
224
|
+
if (!shouldContinue)
|
|
225
|
+
break;
|
|
226
|
+
// After confirm, advance to next stage
|
|
227
|
+
this.state.currentStageIndex++;
|
|
228
|
+
this.state.retryCount = 0;
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
// Check irreversible stage lease
|
|
232
|
+
if (stage.irreversible) {
|
|
233
|
+
if (!this.leaseChecker.isLeaseValid()) {
|
|
234
|
+
log.warn({ taskId: this.taskId, stage: stage.name }, 'Execution lease expired, pipeline suspended before irreversible stage');
|
|
235
|
+
this.suspend('lease_expired');
|
|
236
|
+
await this.waitWhileSuspended();
|
|
237
|
+
if (this.isTerminal())
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Reset clean output for fresh stage detection
|
|
242
|
+
this.ptySession.resetCleanOutput?.();
|
|
243
|
+
// Emit stage start
|
|
244
|
+
this.state.status = 'running';
|
|
245
|
+
this.emit('stageStart', this.taskId, stage.name);
|
|
246
|
+
// Inject env vars
|
|
247
|
+
this.injectEnv(stage);
|
|
248
|
+
// Write command to PTY (with env exports prepended)
|
|
249
|
+
const envPrefix = this.buildEnvPrefix();
|
|
250
|
+
const command = envPrefix + (stage.command ?? '');
|
|
251
|
+
log.info({ taskId: this.taskId, stage: stage.name, command }, 'Injecting stage command');
|
|
252
|
+
this.ptySession.write(command + '\n');
|
|
253
|
+
// Detect stage completion
|
|
254
|
+
const result = await this.waitForStageCompletion(stage);
|
|
255
|
+
if (result === null) {
|
|
256
|
+
// Stage timed out — treat as failure
|
|
257
|
+
const shouldRetry = await this.handleStageFailure(stage);
|
|
258
|
+
if (!shouldRetry) {
|
|
259
|
+
this.state.status = 'failed';
|
|
260
|
+
this.emit('pipelineFailed', this.taskId, 'Stage timed out');
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
const stageFailed = result.type === 'exit_code' && result.exitCode !== 0;
|
|
266
|
+
if (stageFailed) {
|
|
267
|
+
this.emit('stageFailed', this.taskId, stage.name, `Exit code: ${result.exitCode}`);
|
|
268
|
+
const shouldContinue = await this.handleStageFailure(stage);
|
|
269
|
+
if (!shouldContinue)
|
|
270
|
+
break;
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
// Stage completed successfully
|
|
274
|
+
this.emit('stageComplete', this.taskId, stage.name);
|
|
275
|
+
this.state.currentStageIndex++;
|
|
276
|
+
this.state.retryCount = 0;
|
|
277
|
+
}
|
|
278
|
+
// Pipeline complete
|
|
279
|
+
if (this.state.status === 'running') {
|
|
280
|
+
this.state.status = 'completed';
|
|
281
|
+
log.info({ taskId: this.taskId }, 'Pipeline completed');
|
|
282
|
+
this.emit('pipelineComplete', this.taskId);
|
|
283
|
+
}
|
|
284
|
+
this.destroy();
|
|
285
|
+
}
|
|
286
|
+
// -- Interactive stage handling --
|
|
287
|
+
isInteractiveStage(stage) {
|
|
288
|
+
return stage.type !== undefined || stage.confirm === true;
|
|
289
|
+
}
|
|
290
|
+
async handleInteractiveStage(stage) {
|
|
291
|
+
if (!stage.type && !stage.confirm) {
|
|
292
|
+
// Not actually interactive — skip confirm logic
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
const mode = stage.type ?? 'confirm';
|
|
296
|
+
this.state.status = 'waiting_confirm';
|
|
297
|
+
log.info({ taskId: this.taskId, stage: stage.name, mode }, 'Waiting for user confirmation');
|
|
298
|
+
const timeout = stage.confirm_timeout ?? protocol_1.DEFAULT_CONFIRM_TIMEOUT_SEC * 1000;
|
|
299
|
+
this.emit('confirmRequired', this.taskId, stage.name, mode, stage.prompt, stage.choices, timeout);
|
|
300
|
+
// Wait for confirm or timeout
|
|
301
|
+
const result = await this.waitForConfirm(stage, mode, timeout);
|
|
302
|
+
if (result === null) {
|
|
303
|
+
// Timeout handling
|
|
304
|
+
return this.handleConfirmTimeout(stage, mode);
|
|
305
|
+
}
|
|
306
|
+
if (result === 'cancel') {
|
|
307
|
+
this.state.status = 'failed';
|
|
308
|
+
log.info({ taskId: this.taskId, stage: stage.name }, 'User cancelled interactive stage');
|
|
309
|
+
this.emit('pipelineFailed', this.taskId, 'User cancelled');
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
// Validate choice result
|
|
313
|
+
if (mode === 'choice' && stage.choices) {
|
|
314
|
+
const validValues = new Set(stage.choices.map((c) => c.value));
|
|
315
|
+
if (!validValues.has(result)) {
|
|
316
|
+
this.state.status = 'failed';
|
|
317
|
+
log.error({ taskId: this.taskId, stage: stage.name, result }, 'Invalid choice value');
|
|
318
|
+
this.emit('pipelineFailed', this.taskId, `Invalid choice value: ${result}`);
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
this.lastConfirmResult = result;
|
|
323
|
+
this.state.status = 'running';
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
waitForConfirm(_stage, _mode, timeout) {
|
|
327
|
+
return new Promise((resolve) => {
|
|
328
|
+
this.confirmResolve = resolve;
|
|
329
|
+
this.confirmTimeoutTimer = setTimeout(() => {
|
|
330
|
+
this.confirmResolve = null;
|
|
331
|
+
resolve(null);
|
|
332
|
+
}, timeout);
|
|
333
|
+
if (this.confirmTimeoutTimer.unref)
|
|
334
|
+
this.confirmTimeoutTimer.unref();
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
handleConfirmTimeout(stage, mode) {
|
|
338
|
+
log.warn({ taskId: this.taskId, stage: stage.name, mode }, 'Confirm timeout');
|
|
339
|
+
if (mode === 'choice' && stage.default_choice !== undefined) {
|
|
340
|
+
// Auto-select default choice
|
|
341
|
+
this.lastConfirmResult = stage.default_choice;
|
|
342
|
+
this.state.status = 'running';
|
|
343
|
+
log.info({ taskId: this.taskId, stage: stage.name, defaultChoice: stage.default_choice }, 'Auto-selected default choice on timeout');
|
|
344
|
+
return true;
|
|
345
|
+
}
|
|
346
|
+
// confirm / input / choice without default → cancel → FAILED
|
|
347
|
+
this.state.status = 'failed';
|
|
348
|
+
this.emit('pipelineFailed', this.taskId, `Confirm timeout for stage "${stage.name}"`);
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
// -- Stage completion detection --
|
|
352
|
+
waitForStageCompletion(stage) {
|
|
353
|
+
return new Promise((resolve) => {
|
|
354
|
+
const stageTimeout = stage.timeout ?? protocol_1.DEFAULT_STAGE_TIMEOUT_MS;
|
|
355
|
+
// Clear handlers from previous stage to prevent accumulation
|
|
356
|
+
this.ptySession.clearHandlers?.();
|
|
357
|
+
// Initialize detector
|
|
358
|
+
this.stageDetector = new stage_detector_js_1.StageDetector(stage.name, this.promptDetector);
|
|
359
|
+
this.stageResolve = resolve;
|
|
360
|
+
// Listen for PTY output
|
|
361
|
+
this.ptySession.onData(() => {
|
|
362
|
+
this.stageDetector?.onOutput();
|
|
363
|
+
this.resetNoOutputAlert(stage);
|
|
364
|
+
});
|
|
365
|
+
// Listen for process exit
|
|
366
|
+
this.ptySession.onExit((exitCode) => {
|
|
367
|
+
if (this.stageResolve && this.stageDetector) {
|
|
368
|
+
const result = this.stageDetector.onProcessExit(exitCode);
|
|
369
|
+
this.clearDetectionTimer();
|
|
370
|
+
this.clearStageTimeout();
|
|
371
|
+
this.clearNoOutputAlert();
|
|
372
|
+
this.stageResolve(result);
|
|
373
|
+
this.stageResolve = null;
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
// Polling detection
|
|
377
|
+
this.detectionTimer = setInterval(() => {
|
|
378
|
+
if (this.state.status === 'suspended')
|
|
379
|
+
return; // Don't detect while suspended
|
|
380
|
+
if (!this.stageDetector)
|
|
381
|
+
return;
|
|
382
|
+
const cleanOutput = this.ptySession.getCleanOutput();
|
|
383
|
+
const result = this.stageDetector.detect(cleanOutput);
|
|
384
|
+
if (result && result.confidence === 'low') {
|
|
385
|
+
// Don't trust low-confidence keyword detection alone
|
|
386
|
+
return; // keep polling
|
|
387
|
+
}
|
|
388
|
+
if (result && this.stageResolve) {
|
|
389
|
+
this.clearDetectionTimer();
|
|
390
|
+
this.clearStageTimeout();
|
|
391
|
+
this.clearNoOutputAlert();
|
|
392
|
+
this.stageResolve(result);
|
|
393
|
+
this.stageResolve = null;
|
|
394
|
+
}
|
|
395
|
+
}, DETECTION_POLL_MS);
|
|
396
|
+
if (this.detectionTimer.unref)
|
|
397
|
+
this.detectionTimer.unref();
|
|
398
|
+
// Stage timeout
|
|
399
|
+
this.stageTimeoutTimer = setTimeout(() => {
|
|
400
|
+
log.error({ taskId: this.taskId, stage: stage.name, timeoutMs: stageTimeout }, 'Stage timed out');
|
|
401
|
+
this.clearDetectionTimer();
|
|
402
|
+
this.clearNoOutputAlert();
|
|
403
|
+
this.emit('stageFailed', this.taskId, stage.name, 'Stage timeout');
|
|
404
|
+
// Attempt failure handling inline
|
|
405
|
+
if (this.stageResolve) {
|
|
406
|
+
this.stageResolve(null);
|
|
407
|
+
this.stageResolve = null;
|
|
408
|
+
}
|
|
409
|
+
}, stageTimeout);
|
|
410
|
+
if (this.stageTimeoutTimer.unref)
|
|
411
|
+
this.stageTimeoutTimer.unref();
|
|
412
|
+
// No-output alert
|
|
413
|
+
this.resetNoOutputAlert(stage);
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
// -- Failure handling --
|
|
417
|
+
async handleStageFailure(stage) {
|
|
418
|
+
// Try retries first
|
|
419
|
+
if (stage.retries && this.state.retryCount < stage.retries) {
|
|
420
|
+
this.state.retryCount++;
|
|
421
|
+
log.info({ taskId: this.taskId, stage: stage.name, retry: this.state.retryCount, maxRetries: stage.retries }, 'Retrying stage');
|
|
422
|
+
return true; // Continue loop, same stage index
|
|
423
|
+
}
|
|
424
|
+
// Try onFailure goto
|
|
425
|
+
if (stage.onFailure?.goto && this.pipeline) {
|
|
426
|
+
if (this.state.loopCount >= stage.onFailure.maxLoops) {
|
|
427
|
+
log.error({
|
|
428
|
+
taskId: this.taskId,
|
|
429
|
+
stage: stage.name,
|
|
430
|
+
loopCount: this.state.loopCount,
|
|
431
|
+
maxLoops: stage.onFailure.maxLoops,
|
|
432
|
+
}, 'Max loops exhausted, pipeline failed');
|
|
433
|
+
this.state.status = 'failed';
|
|
434
|
+
this.emit('pipelineFailed', this.taskId, `Max loops (${stage.onFailure.maxLoops}) exhausted at stage "${stage.name}"`);
|
|
435
|
+
return false;
|
|
436
|
+
}
|
|
437
|
+
const targetIndex = this.pipeline.stages.findIndex((s) => s.name === stage.onFailure.goto);
|
|
438
|
+
if (targetIndex === -1) {
|
|
439
|
+
this.state.status = 'failed';
|
|
440
|
+
this.emit('pipelineFailed', this.taskId, `onFailure.goto target "${stage.onFailure.goto}" not found`);
|
|
441
|
+
return false;
|
|
442
|
+
}
|
|
443
|
+
this.state.loopCount++;
|
|
444
|
+
this.state.retryCount = 0;
|
|
445
|
+
this.state.currentStageIndex = targetIndex;
|
|
446
|
+
log.info({
|
|
447
|
+
taskId: this.taskId,
|
|
448
|
+
from: stage.name,
|
|
449
|
+
to: stage.onFailure.goto,
|
|
450
|
+
loopCount: this.state.loopCount,
|
|
451
|
+
}, 'Jumping to failure target stage');
|
|
452
|
+
return true;
|
|
453
|
+
}
|
|
454
|
+
// No retry or goto — fail
|
|
455
|
+
this.state.status = 'failed';
|
|
456
|
+
this.emit('pipelineFailed', this.taskId, `Stage "${stage.name}" failed with no recovery option`);
|
|
457
|
+
return false;
|
|
458
|
+
}
|
|
459
|
+
// -- Env injection --
|
|
460
|
+
injectEnv(stage) {
|
|
461
|
+
// Clear accumulated env from previous stages to prevent leaking
|
|
462
|
+
// (e.g. $CONFIRM_RESULT from a prior interactive stage)
|
|
463
|
+
this.stageEnv = {};
|
|
464
|
+
if (!stage.env)
|
|
465
|
+
return;
|
|
466
|
+
for (const [key, value] of Object.entries(stage.env)) {
|
|
467
|
+
if (value === '$CONFIRM_RESULT') {
|
|
468
|
+
this.stageEnv[key] = this.lastConfirmResult;
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
this.stageEnv[key] = value;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
/** Build an export prefix string for accumulated stage env vars. */
|
|
476
|
+
buildEnvPrefix() {
|
|
477
|
+
const entries = Object.entries(this.stageEnv);
|
|
478
|
+
if (entries.length === 0)
|
|
479
|
+
return '';
|
|
480
|
+
const validKeyPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
481
|
+
const exports = [];
|
|
482
|
+
for (const [key, value] of entries) {
|
|
483
|
+
if (!validKeyPattern.test(key)) {
|
|
484
|
+
log.warn({ taskId: this.taskId, key }, 'Skipping env key with invalid characters');
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
exports.push(`export ${key}=${shellEscape(value)}`);
|
|
488
|
+
}
|
|
489
|
+
if (exports.length === 0)
|
|
490
|
+
return '';
|
|
491
|
+
return exports.join(' && ') + ' && ';
|
|
492
|
+
}
|
|
493
|
+
// -- Suspend / resume wait --
|
|
494
|
+
waitWhileSuspended() {
|
|
495
|
+
if (this.state.status !== 'suspended' || this.destroyed) {
|
|
496
|
+
return Promise.resolve();
|
|
497
|
+
}
|
|
498
|
+
return new Promise((resolve) => {
|
|
499
|
+
const interval = setInterval(() => {
|
|
500
|
+
if (this.state.status !== 'suspended' || this.destroyed) {
|
|
501
|
+
clearInterval(interval);
|
|
502
|
+
resolve();
|
|
503
|
+
}
|
|
504
|
+
}, 500);
|
|
505
|
+
if (interval.unref)
|
|
506
|
+
interval.unref();
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
// -- Task-level timeout --
|
|
510
|
+
handleTaskTimeout() {
|
|
511
|
+
if (this.state.status === 'completed' || this.state.status === 'failed')
|
|
512
|
+
return;
|
|
513
|
+
log.error({ taskId: this.taskId }, 'Task overall timeout reached');
|
|
514
|
+
this.state.status = 'failed';
|
|
515
|
+
this.emit('pipelineFailed', this.taskId, 'Task overall timeout exceeded');
|
|
516
|
+
// Unblock any waiting stage
|
|
517
|
+
if (this.stageResolve) {
|
|
518
|
+
this.stageResolve(null);
|
|
519
|
+
this.stageResolve = null;
|
|
520
|
+
}
|
|
521
|
+
if (this.confirmResolve) {
|
|
522
|
+
this.confirmResolve(null);
|
|
523
|
+
this.confirmResolve = null;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
// -- No-output alert --
|
|
527
|
+
resetNoOutputAlert(stage) {
|
|
528
|
+
this.clearNoOutputAlert();
|
|
529
|
+
this.noOutputAlertTimer = setTimeout(() => {
|
|
530
|
+
log.warn({ taskId: this.taskId, stage: stage.name, alertMs: NO_OUTPUT_ALERT_MS }, 'No PTY output for extended period');
|
|
531
|
+
}, NO_OUTPUT_ALERT_MS);
|
|
532
|
+
if (this.noOutputAlertTimer.unref)
|
|
533
|
+
this.noOutputAlertTimer.unref();
|
|
534
|
+
}
|
|
535
|
+
// -- Timer cleanup --
|
|
536
|
+
clearDetectionTimer() {
|
|
537
|
+
if (this.detectionTimer) {
|
|
538
|
+
clearInterval(this.detectionTimer);
|
|
539
|
+
this.detectionTimer = null;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
clearStageTimeout() {
|
|
543
|
+
if (this.stageTimeoutTimer) {
|
|
544
|
+
clearTimeout(this.stageTimeoutTimer);
|
|
545
|
+
this.stageTimeoutTimer = null;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
clearTaskTimeout() {
|
|
549
|
+
if (this.taskTimeoutTimer) {
|
|
550
|
+
clearTimeout(this.taskTimeoutTimer);
|
|
551
|
+
this.taskTimeoutTimer = null;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
clearConfirmTimeout() {
|
|
555
|
+
if (this.confirmTimeoutTimer) {
|
|
556
|
+
clearTimeout(this.confirmTimeoutTimer);
|
|
557
|
+
this.confirmTimeoutTimer = null;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
clearNoOutputAlert() {
|
|
561
|
+
if (this.noOutputAlertTimer) {
|
|
562
|
+
clearTimeout(this.noOutputAlertTimer);
|
|
563
|
+
this.noOutputAlertTimer = null;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
exports.PipelineRunner = PipelineRunner;
|
|
568
|
+
//# sourceMappingURL=pipeline-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-runner.js","sourceRoot":"","sources":["../src/pipeline-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { MutexInterface } from 'async-mutex';
|
|
2
|
+
/**
|
|
3
|
+
* Per-project mutex to serialize operations on shared _base/ bare repos.
|
|
4
|
+
* Lazily creates a mutex for each project key on first access.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ProjectMutex {
|
|
7
|
+
private mutexes;
|
|
8
|
+
/**
|
|
9
|
+
* Acquire the mutex for a given project key.
|
|
10
|
+
* Returns a release function that MUST be called when done.
|
|
11
|
+
*/
|
|
12
|
+
acquire(projectKey: string): Promise<MutexInterface.Releaser>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=project-mutex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-mutex.d.ts","sourceRoot":"","sources":["../src/project-mutex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA4B;IAE3C;;;OAGG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;CAQpE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProjectMutex = void 0;
|
|
4
|
+
const async_mutex_1 = require("async-mutex");
|
|
5
|
+
/**
|
|
6
|
+
* Per-project mutex to serialize operations on shared _base/ bare repos.
|
|
7
|
+
* Lazily creates a mutex for each project key on first access.
|
|
8
|
+
*/
|
|
9
|
+
class ProjectMutex {
|
|
10
|
+
mutexes = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Acquire the mutex for a given project key.
|
|
13
|
+
* Returns a release function that MUST be called when done.
|
|
14
|
+
*/
|
|
15
|
+
async acquire(projectKey) {
|
|
16
|
+
let mutex = this.mutexes.get(projectKey);
|
|
17
|
+
if (!mutex) {
|
|
18
|
+
mutex = new async_mutex_1.Mutex();
|
|
19
|
+
this.mutexes.set(projectKey, mutex);
|
|
20
|
+
}
|
|
21
|
+
return mutex.acquire();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.ProjectMutex = ProjectMutex;
|
|
25
|
+
//# sourceMappingURL=project-mutex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-mutex.js","sourceRoot":"","sources":["../src/project-mutex.ts"],"names":[],"mappings":";;;AAAA,6CAAoD;AAEpD;;;GAGG;AACH,MAAa,YAAY;IACf,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IAE3C;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,UAAkB;QAC9B,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,mBAAK,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;CACF;AAfD,oCAeC"}
|