@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,148 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.OrphanReaper = void 0;
40
+ const node_child_process_1 = require("node:child_process");
41
+ const fs = __importStar(require("node:fs"));
42
+ const os = __importStar(require("node:os"));
43
+ const pino_1 = __importDefault(require("pino"));
44
+ const safe_env_js_1 = require("./safe-env.js");
45
+ const log = (0, pino_1.default)({ name: 'orphan-reaper' });
46
+ class OrphanReaper {
47
+ static reap() {
48
+ const platform = os.platform();
49
+ log.info({ platform }, 'Scanning for orphan processes');
50
+ try {
51
+ if (platform === 'linux') {
52
+ OrphanReaper.reapLinux();
53
+ }
54
+ else if (platform === 'darwin') {
55
+ OrphanReaper.reapDarwin();
56
+ }
57
+ else {
58
+ log.warn({ platform }, 'Orphan reaping not supported on this platform');
59
+ }
60
+ }
61
+ catch (err) {
62
+ log.error({ err }, 'Error during orphan reaping');
63
+ }
64
+ }
65
+ static reapLinux() {
66
+ const procDir = '/proc';
67
+ let entries;
68
+ try {
69
+ entries = fs.readdirSync(procDir);
70
+ }
71
+ catch {
72
+ log.warn('Cannot read /proc directory');
73
+ return;
74
+ }
75
+ const myPid = process.pid;
76
+ let killed = 0;
77
+ for (const entry of entries) {
78
+ const pid = parseInt(entry, 10);
79
+ if (isNaN(pid) || pid === myPid)
80
+ continue;
81
+ try {
82
+ const environPath = `${procDir}/${pid}/environ`;
83
+ if (!fs.existsSync(environPath))
84
+ continue;
85
+ const environ = fs.readFileSync(environPath, 'utf-8');
86
+ if (environ.includes('OVERLORD_TASK_ID=')) {
87
+ log.info({ pid }, 'Killing orphan process');
88
+ process.kill(pid, 'SIGKILL');
89
+ killed++;
90
+ }
91
+ }
92
+ catch {
93
+ // Permission denied or process already gone, skip
94
+ }
95
+ }
96
+ log.info({ killed }, 'Orphan reaping complete (Linux)');
97
+ }
98
+ static reapDarwin() {
99
+ let output;
100
+ try {
101
+ output = (0, node_child_process_1.execFileSync)('ps', ['-eo', 'pid,command'], { encoding: 'utf-8', timeout: 10000, env: (0, safe_env_js_1.buildSafeEnv)() });
102
+ }
103
+ catch {
104
+ log.warn('Failed to run ps command');
105
+ return;
106
+ }
107
+ const myPid = process.pid;
108
+ const lines = output.split('\n');
109
+ let killed = 0;
110
+ // Get the pids that have OVERLORD_TASK_ID in their env
111
+ // On macOS we can't easily read environ from ps, so check /dev/fd approach
112
+ // Instead, use a heuristic: look for processes whose command includes overlord markers
113
+ const overlordPids = [];
114
+ for (const line of lines) {
115
+ const trimmed = line.trim();
116
+ if (!trimmed)
117
+ continue;
118
+ const parts = trimmed.split(/\s+/);
119
+ const pid = parseInt(parts[0] || '', 10);
120
+ if (isNaN(pid) || pid === myPid || pid <= 1)
121
+ continue;
122
+ // Try to read the environment of the process via /proc emulation or launchctl
123
+ let envOutput = '';
124
+ try {
125
+ envOutput = (0, node_child_process_1.execFileSync)('ps', ['-p', String(pid), '-wwE'], { encoding: 'utf-8', timeout: 5000 });
126
+ }
127
+ catch {
128
+ // Process may have exited
129
+ }
130
+ if (envOutput.includes('OVERLORD_TASK_ID=')) {
131
+ overlordPids.push(pid);
132
+ }
133
+ }
134
+ for (const pid of overlordPids) {
135
+ try {
136
+ log.info({ pid }, 'Killing orphan process');
137
+ process.kill(pid, 'SIGKILL');
138
+ killed++;
139
+ }
140
+ catch {
141
+ // Process may already be gone
142
+ }
143
+ }
144
+ log.info({ killed }, 'Orphan reaping complete (macOS)');
145
+ }
146
+ }
147
+ exports.OrphanReaper = OrphanReaper;
148
+ //# sourceMappingURL=orphan-reaper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-reaper.js","sourceRoot":"","sources":["../src/orphan-reaper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2DAAkD;AAClD,4CAA8B;AAC9B,4CAA8B;AAC9B,gDAAwB;AACxB,+CAA6C;AAE7C,MAAM,GAAG,GAAG,IAAA,cAAI,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;AAE5C,MAAa,YAAY;IACvB,MAAM,CAAC,IAAI;QACT,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,+BAA+B,CAAC,CAAC;QAExD,IAAI,CAAC;YACH,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACzB,YAAY,CAAC,SAAS,EAAE,CAAC;YAC3B,CAAC;iBAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,YAAY,CAAC,UAAU,EAAE,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,+CAA+C,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,6BAA6B,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,SAAS;QACtB,MAAM,OAAO,GAAG,OAAO,CAAC;QACxB,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;QAC1B,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK;gBAAE,SAAS;YAE1C,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,GAAG,OAAO,IAAI,GAAG,UAAU,CAAC;gBAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;oBAAE,SAAS;gBAE1C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACtD,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC1C,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;oBAC5C,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBAC7B,MAAM,EAAE,CAAC;gBACX,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kDAAkD;YACpD,CAAC;QACH,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,iCAAiC,CAAC,CAAC;IAC1D,CAAC;IAEO,MAAM,CAAC,UAAU;QACvB,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,IAAA,iCAAY,EAAC,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAA,0BAAY,GAAE,EAAE,CAAC,CAAC;QAClH,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,uDAAuD;QACvD,2EAA2E;QAC3E,uFAAuF;QACvF,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;gBAAE,SAAS;YAEtD,8EAA8E;YAC9E,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,SAAS,GAAG,IAAA,iCAAY,EAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACpG,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;YACD,IAAI,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC5C,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;gBAC5C,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC7B,MAAM,EAAE,CAAC;YACX,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;QACH,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,iCAAiC,CAAC,CAAC;IAC1D,CAAC;CACF;AAtGD,oCAsGC"}
@@ -0,0 +1,14 @@
1
+ import type { PipelineConfig } from '@overlordai/protocol';
2
+ export declare class PipelineParser {
3
+ /**
4
+ * Parse a pipeline JSON string (or null) into a validated PipelineConfig.
5
+ * Returns a default single-stage pipeline when input is null.
6
+ */
7
+ static parse(json: string | null, taskDescription: string): PipelineConfig;
8
+ private static buildDefaultPipeline;
9
+ private static parseStage;
10
+ private static parseStageType;
11
+ private static validateGotoRefs;
12
+ private static validateChoices;
13
+ }
14
+ //# sourceMappingURL=pipeline-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-parser.d.ts","sourceRoot":"","sources":["../src/pipeline-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAIf,MAAM,sBAAsB,CAAC;AAoB9B,qBAAa,cAAc;IACzB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc;IAiD1E,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAgBnC,OAAO,CAAC,MAAM,CAAC,UAAU;IA0FzB,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,MAAM,CAAC,eAAe;CAgB/B"}
@@ -0,0 +1,183 @@
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.PipelineParser = void 0;
7
+ const protocol_1 = require("@overlordai/protocol");
8
+ const pino_1 = __importDefault(require("pino"));
9
+ const log = (0, pino_1.default)({ name: 'pipeline-parser' });
10
+ const DEFAULT_STAGE_DEFAULTS = {
11
+ timeout: protocol_1.DEFAULT_STAGE_TIMEOUT_MS,
12
+ retries: 0,
13
+ confirm: false,
14
+ irreversible: false,
15
+ };
16
+ const DEFAULT_MAX_LOOPS = 3;
17
+ const INTERACTIVE_TYPES = ['confirm', 'choice', 'input'];
18
+ class PipelineParser {
19
+ /**
20
+ * Parse a pipeline JSON string (or null) into a validated PipelineConfig.
21
+ * Returns a default single-stage pipeline when input is null.
22
+ */
23
+ static parse(json, taskDescription) {
24
+ if (json === null) {
25
+ return PipelineParser.buildDefaultPipeline(taskDescription);
26
+ }
27
+ let raw;
28
+ try {
29
+ raw = JSON.parse(json);
30
+ }
31
+ catch {
32
+ throw new Error(`Invalid pipeline JSON: failed to parse`);
33
+ }
34
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
35
+ throw new Error('Pipeline config must be a JSON object');
36
+ }
37
+ const obj = raw;
38
+ // Parse defaults
39
+ const rawDefaults = (obj['defaults'] ?? {});
40
+ const defaults = {
41
+ timeout: typeof rawDefaults.timeout === 'number' ? rawDefaults.timeout : DEFAULT_STAGE_DEFAULTS.timeout,
42
+ retries: typeof rawDefaults.retries === 'number' ? rawDefaults.retries : DEFAULT_STAGE_DEFAULTS.retries,
43
+ confirm: typeof rawDefaults.confirm === 'boolean' ? rawDefaults.confirm : DEFAULT_STAGE_DEFAULTS.confirm,
44
+ irreversible: typeof rawDefaults.irreversible === 'boolean' ? rawDefaults.irreversible : DEFAULT_STAGE_DEFAULTS.irreversible,
45
+ };
46
+ // Parse stages
47
+ const rawStages = obj['stages'];
48
+ if (!Array.isArray(rawStages) || rawStages.length === 0) {
49
+ throw new Error('Pipeline config must have a non-empty stages array');
50
+ }
51
+ const stageNames = new Set();
52
+ const stages = rawStages.map((s, idx) => {
53
+ return PipelineParser.parseStage(s, idx, defaults, stageNames);
54
+ });
55
+ // Validate goto references
56
+ PipelineParser.validateGotoRefs(stages, stageNames);
57
+ // Validate choice options
58
+ PipelineParser.validateChoices(stages);
59
+ log.debug({ stageCount: stages.length }, 'Pipeline parsed successfully');
60
+ return { stages, defaults };
61
+ }
62
+ static buildDefaultPipeline(taskDescription) {
63
+ return {
64
+ stages: [
65
+ {
66
+ name: 'develop',
67
+ command: taskDescription,
68
+ timeout: DEFAULT_STAGE_DEFAULTS.timeout,
69
+ retries: DEFAULT_STAGE_DEFAULTS.retries,
70
+ confirm: DEFAULT_STAGE_DEFAULTS.confirm,
71
+ irreversible: DEFAULT_STAGE_DEFAULTS.irreversible,
72
+ },
73
+ ],
74
+ defaults: { ...DEFAULT_STAGE_DEFAULTS },
75
+ };
76
+ }
77
+ static parseStage(raw, index, defaults, stageNames) {
78
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
79
+ throw new Error(`Stage at index ${index} must be a JSON object`);
80
+ }
81
+ const obj = raw;
82
+ // name is required
83
+ if (typeof obj['name'] !== 'string' || obj['name'].trim() === '') {
84
+ throw new Error(`Stage at index ${index} requires a non-empty "name" field`);
85
+ }
86
+ const name = obj['name'].trim();
87
+ if (stageNames.has(name)) {
88
+ throw new Error(`Duplicate stage name "${name}" at index ${index}`);
89
+ }
90
+ stageNames.add(name);
91
+ // Determine if interactive
92
+ const type = PipelineParser.parseStageType(obj['type']);
93
+ const confirm = typeof obj['confirm'] === 'boolean' ? obj['confirm'] : defaults.confirm;
94
+ const isInteractive = type !== undefined || confirm;
95
+ // command: required for non-interactive stages
96
+ const command = typeof obj['command'] === 'string' ? obj['command'] : undefined;
97
+ if (!isInteractive && command === undefined) {
98
+ throw new Error(`Non-interactive stage "${name}" at index ${index} requires a "command" field`);
99
+ }
100
+ // Merge with defaults
101
+ const stage = {
102
+ name,
103
+ command,
104
+ type,
105
+ timeout: typeof obj['timeout'] === 'number' ? obj['timeout'] : defaults.timeout,
106
+ retries: typeof obj['retries'] === 'number' ? obj['retries'] : defaults.retries,
107
+ confirm,
108
+ irreversible: typeof obj['irreversible'] === 'boolean' ? obj['irreversible'] : defaults.irreversible,
109
+ };
110
+ // Optional interactive fields
111
+ if (typeof obj['prompt'] === 'string') {
112
+ stage.prompt = obj['prompt'];
113
+ }
114
+ if (Array.isArray(obj['choices'])) {
115
+ stage.choices = obj['choices'];
116
+ }
117
+ if (typeof obj['default_choice'] === 'string') {
118
+ stage.default_choice = obj['default_choice'];
119
+ }
120
+ if (typeof obj['confirm_timeout'] === 'number') {
121
+ stage.confirm_timeout = obj['confirm_timeout'] * 1000;
122
+ }
123
+ else if (isInteractive) {
124
+ stage.confirm_timeout = protocol_1.DEFAULT_CONFIRM_TIMEOUT_SEC * 1000;
125
+ }
126
+ // onFailure
127
+ if (typeof obj['onFailure'] === 'object' && obj['onFailure'] !== null) {
128
+ const failure = obj['onFailure'];
129
+ if (typeof failure['goto'] !== 'string') {
130
+ throw new Error(`Stage "${name}" onFailure requires a "goto" string`);
131
+ }
132
+ const maxLoops = typeof failure['maxLoops'] === 'number' ? failure['maxLoops'] : DEFAULT_MAX_LOOPS;
133
+ if (!Number.isInteger(maxLoops) || maxLoops < 1) {
134
+ throw new Error(`Stage "${name}" onFailure.maxLoops must be a positive integer`);
135
+ }
136
+ stage.onFailure = { goto: failure['goto'], maxLoops };
137
+ }
138
+ // env
139
+ if (typeof obj['env'] === 'object' && obj['env'] !== null && !Array.isArray(obj['env'])) {
140
+ stage.env = obj['env'];
141
+ }
142
+ // Validate interactive stage has prompt
143
+ if ((type === 'choice' || type === 'input') && !stage.prompt) {
144
+ throw new Error(`Interactive stage "${name}" of type "${type}" requires a "prompt" field`);
145
+ }
146
+ return stage;
147
+ }
148
+ static parseStageType(value) {
149
+ if (value === undefined || value === null)
150
+ return undefined;
151
+ if (typeof value !== 'string') {
152
+ throw new Error(`Stage type must be a string, got ${typeof value}`);
153
+ }
154
+ if (!INTERACTIVE_TYPES.includes(value)) {
155
+ throw new Error(`Invalid stage type "${value}", must be one of: ${INTERACTIVE_TYPES.join(', ')}`);
156
+ }
157
+ return value;
158
+ }
159
+ static validateGotoRefs(stages, stageNames) {
160
+ for (const stage of stages) {
161
+ if (stage.onFailure?.goto) {
162
+ if (!stageNames.has(stage.onFailure.goto)) {
163
+ throw new Error(`Stage "${stage.name}" onFailure.goto references non-existent stage "${stage.onFailure.goto}"`);
164
+ }
165
+ }
166
+ }
167
+ }
168
+ static validateChoices(stages) {
169
+ for (const stage of stages) {
170
+ if (stage.type === 'choice') {
171
+ if (!stage.choices || stage.choices.length === 0) {
172
+ throw new Error(`Choice stage "${stage.name}" must have a non-empty "choices" array`);
173
+ }
174
+ const validValues = new Set(stage.choices.map((c) => c.value));
175
+ if (stage.default_choice !== undefined && !validValues.has(stage.default_choice)) {
176
+ throw new Error(`Choice stage "${stage.name}" default_choice "${stage.default_choice}" is not in choices values`);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+ exports.PipelineParser = PipelineParser;
183
+ //# sourceMappingURL=pipeline-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-parser.js","sourceRoot":"","sources":["../src/pipeline-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { StageConfirmMode, StageChoiceOption } from '@overlordai/protocol';
3
+ import { type PromptDetector } from './stage-detector.js';
4
+ /** Minimal interface for PTY session interaction */
5
+ export interface PtySession {
6
+ write(data: string): void;
7
+ getCleanOutput(): string;
8
+ resetCleanOutput?(): void;
9
+ onData(handler: (data: string) => void): void;
10
+ onExit(handler: (exitCode: number) => void): void;
11
+ clearHandlers?(): void;
12
+ }
13
+ /** Minimal interface for lease checking */
14
+ export interface LeaseChecker {
15
+ isLeaseValid(): boolean;
16
+ }
17
+ export interface PipelineState {
18
+ currentStageIndex: number;
19
+ currentStageName: string;
20
+ status: 'running' | 'suspended' | 'waiting_confirm' | 'completed' | 'failed';
21
+ loopCount: number;
22
+ retryCount: number;
23
+ suspendReason?: string;
24
+ }
25
+ export interface PipelineRunnerEvents {
26
+ stageStart: [taskId: number, stageName: string];
27
+ stageComplete: [taskId: number, stageName: string];
28
+ stageFailed: [taskId: number, stageName: string, error: string];
29
+ pipelineComplete: [taskId: number];
30
+ pipelineFailed: [taskId: number, error: string];
31
+ confirmRequired: [
32
+ taskId: number,
33
+ stageName: string,
34
+ mode: StageConfirmMode,
35
+ prompt: string | undefined,
36
+ choices: StageChoiceOption[] | undefined,
37
+ timeout: number | undefined
38
+ ];
39
+ }
40
+ interface OwnershipEntry {
41
+ owner: 'pipeline' | 'human';
42
+ revision: number;
43
+ }
44
+ export declare function getOwnership(sessionId: string): OwnershipEntry;
45
+ export declare function casOwnership(sessionId: string, expectedRevision: number, newOwner: 'pipeline' | 'human'): boolean;
46
+ export declare function clearOwnership(sessionId: string): void;
47
+ export declare class PipelineRunner extends EventEmitter {
48
+ private taskId;
49
+ private sessionId;
50
+ private ptySession;
51
+ private leaseChecker;
52
+ private promptDetector;
53
+ private pipeline;
54
+ private stageDetector;
55
+ private state;
56
+ private lastConfirmResult;
57
+ /** Set to true by destroy() to prevent the runLoop from creating new ownership entries. */
58
+ private destroyed;
59
+ /** Accumulated env vars from stage configs, prepended to commands as exports. */
60
+ private stageEnv;
61
+ private detectionTimer;
62
+ private stageTimeoutTimer;
63
+ private taskTimeoutTimer;
64
+ private confirmTimeoutTimer;
65
+ private noOutputAlertTimer;
66
+ private stageResolve;
67
+ private confirmResolve;
68
+ constructor(taskId: number, sessionId: string, ptySession: PtySession, leaseChecker: LeaseChecker, promptDetector: PromptDetector);
69
+ /**
70
+ * Start pipeline execution.
71
+ * @param pipelineJson - raw JSON string from ConfigSnapshot.pipeline (or null)
72
+ * @param taskDescription - used as command for default pipeline
73
+ */
74
+ start(pipelineJson: string | null, taskDescription: string): Promise<void>;
75
+ /**
76
+ * Suspend pipeline execution.
77
+ */
78
+ suspend(reason: 'lease_expired' | 'human_takeover'): void;
79
+ /**
80
+ * Resume pipeline execution.
81
+ */
82
+ resume(): void;
83
+ /**
84
+ * Confirm an interactive stage with a user-provided result.
85
+ */
86
+ confirmStage(_taskId: number, stageIndex: number, result: string): void;
87
+ /**
88
+ * Get current pipeline state.
89
+ */
90
+ getState(): PipelineState;
91
+ /**
92
+ * Stop all timers and clean up.
93
+ */
94
+ destroy(): void;
95
+ onStageChanged(handler: (taskId: number, stage: string) => void): void;
96
+ onCompleted(handler: (taskId: number) => void): void;
97
+ onFailed(handler: (taskId: number, error: string) => void): void;
98
+ onConfirmRequired(handler: (taskId: number, stage: string, mode: StageConfirmMode, prompt?: string, choices?: StageChoiceOption[], timeout?: number) => void): void;
99
+ private isTerminal;
100
+ private runLoop;
101
+ private isInteractiveStage;
102
+ private handleInteractiveStage;
103
+ private waitForConfirm;
104
+ private handleConfirmTimeout;
105
+ private waitForStageCompletion;
106
+ private handleStageFailure;
107
+ private injectEnv;
108
+ /** Build an export prefix string for accumulated stage env vars. */
109
+ private buildEnvPrefix;
110
+ private waitWhileSuspended;
111
+ private handleTaskTimeout;
112
+ private resetNoOutputAlert;
113
+ private clearDetectionTimer;
114
+ private clearStageTimeout;
115
+ private clearTaskTimeout;
116
+ private clearConfirmTimeout;
117
+ private clearNoOutputAlert;
118
+ }
119
+ export {};
120
+ //# sourceMappingURL=pipeline-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-runner.d.ts","sourceRoot":"","sources":["../src/pipeline-runner.ts"],"names":[],"mappings":"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"}