@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.
Files changed (109) hide show
  1. package/dist/ansi-stripper.d.ts +11 -0
  2. package/dist/ansi-stripper.d.ts.map +1 -0
  3. package/dist/ansi-stripper.js +19 -0
  4. package/dist/ansi-stripper.js.map +1 -0
  5. package/dist/capability-detector.d.ts +5 -0
  6. package/dist/capability-detector.d.ts.map +1 -0
  7. package/dist/capability-detector.js +43 -0
  8. package/dist/capability-detector.js.map +1 -0
  9. package/dist/config.d.ts +27 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +144 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/executor/base.executor.d.ts +55 -0
  14. package/dist/executor/base.executor.d.ts.map +1 -0
  15. package/dist/executor/base.executor.js +30 -0
  16. package/dist/executor/base.executor.js.map +1 -0
  17. package/dist/executor/claude.executor.d.ts +23 -0
  18. package/dist/executor/claude.executor.d.ts.map +1 -0
  19. package/dist/executor/claude.executor.js +106 -0
  20. package/dist/executor/claude.executor.js.map +1 -0
  21. package/dist/executor/codex.executor.d.ts +20 -0
  22. package/dist/executor/codex.executor.d.ts.map +1 -0
  23. package/dist/executor/codex.executor.js +51 -0
  24. package/dist/executor/codex.executor.js.map +1 -0
  25. package/dist/executor/cursor.executor.d.ts +19 -0
  26. package/dist/executor/cursor.executor.d.ts.map +1 -0
  27. package/dist/executor/cursor.executor.js +46 -0
  28. package/dist/executor/cursor.executor.js.map +1 -0
  29. package/dist/executor/custom.executor.d.ts +21 -0
  30. package/dist/executor/custom.executor.d.ts.map +1 -0
  31. package/dist/executor/custom.executor.js +57 -0
  32. package/dist/executor/custom.executor.js.map +1 -0
  33. package/dist/executor/executor.factory.d.ts +9 -0
  34. package/dist/executor/executor.factory.d.ts.map +1 -0
  35. package/dist/executor/executor.factory.js +29 -0
  36. package/dist/executor/executor.factory.js.map +1 -0
  37. package/dist/git-operations.d.ts +23 -0
  38. package/dist/git-operations.d.ts.map +1 -0
  39. package/dist/git-operations.js +94 -0
  40. package/dist/git-operations.js.map +1 -0
  41. package/dist/hardware.d.ts +14 -0
  42. package/dist/hardware.d.ts.map +1 -0
  43. package/dist/hardware.js +92 -0
  44. package/dist/hardware.js.map +1 -0
  45. package/dist/healthz.d.ts +14 -0
  46. package/dist/healthz.d.ts.map +1 -0
  47. package/dist/healthz.js +104 -0
  48. package/dist/healthz.js.map +1 -0
  49. package/dist/jwt-manager.d.ts +23 -0
  50. package/dist/jwt-manager.d.ts.map +1 -0
  51. package/dist/jwt-manager.js +169 -0
  52. package/dist/jwt-manager.js.map +1 -0
  53. package/dist/lease-manager.d.ts +17 -0
  54. package/dist/lease-manager.d.ts.map +1 -0
  55. package/dist/lease-manager.js +62 -0
  56. package/dist/lease-manager.js.map +1 -0
  57. package/dist/main.d.ts +3 -0
  58. package/dist/main.d.ts.map +1 -0
  59. package/dist/main.js +497 -0
  60. package/dist/main.js.map +1 -0
  61. package/dist/orphan-reaper.d.ts +6 -0
  62. package/dist/orphan-reaper.d.ts.map +1 -0
  63. package/dist/orphan-reaper.js +148 -0
  64. package/dist/orphan-reaper.js.map +1 -0
  65. package/dist/pipeline-parser.d.ts +14 -0
  66. package/dist/pipeline-parser.d.ts.map +1 -0
  67. package/dist/pipeline-parser.js +183 -0
  68. package/dist/pipeline-parser.js.map +1 -0
  69. package/dist/pipeline-runner.d.ts +120 -0
  70. package/dist/pipeline-runner.d.ts.map +1 -0
  71. package/dist/pipeline-runner.js +568 -0
  72. package/dist/pipeline-runner.js.map +1 -0
  73. package/dist/project-mutex.d.ts +14 -0
  74. package/dist/project-mutex.d.ts.map +1 -0
  75. package/dist/project-mutex.js +25 -0
  76. package/dist/project-mutex.js.map +1 -0
  77. package/dist/pty-manager.d.ts +50 -0
  78. package/dist/pty-manager.d.ts.map +1 -0
  79. package/dist/pty-manager.js +203 -0
  80. package/dist/pty-manager.js.map +1 -0
  81. package/dist/ringbuffer.d.ts +22 -0
  82. package/dist/ringbuffer.d.ts.map +1 -0
  83. package/dist/ringbuffer.js +57 -0
  84. package/dist/ringbuffer.js.map +1 -0
  85. package/dist/safe-env.d.ts +6 -0
  86. package/dist/safe-env.d.ts.map +1 -0
  87. package/dist/safe-env.js +19 -0
  88. package/dist/safe-env.js.map +1 -0
  89. package/dist/stage-detector.d.ts +62 -0
  90. package/dist/stage-detector.d.ts.map +1 -0
  91. package/dist/stage-detector.js +140 -0
  92. package/dist/stage-detector.js.map +1 -0
  93. package/dist/task-handler.d.ts +56 -0
  94. package/dist/task-handler.d.ts.map +1 -0
  95. package/dist/task-handler.js +296 -0
  96. package/dist/task-handler.js.map +1 -0
  97. package/dist/tunnel-manager.d.ts +34 -0
  98. package/dist/tunnel-manager.d.ts.map +1 -0
  99. package/dist/tunnel-manager.js +165 -0
  100. package/dist/tunnel-manager.js.map +1 -0
  101. package/dist/worker-client.d.ts +62 -0
  102. package/dist/worker-client.d.ts.map +1 -0
  103. package/dist/worker-client.js +303 -0
  104. package/dist/worker-client.js.map +1 -0
  105. package/dist/workspace-manager.d.ts +51 -0
  106. package/dist/workspace-manager.d.ts.map +1 -0
  107. package/dist/workspace-manager.js +276 -0
  108. package/dist/workspace-manager.js.map +1 -0
  109. 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"}