@elaraai/e3-core 0.0.1-alpha.2

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 (63) hide show
  1. package/LICENSE.md +50 -0
  2. package/README.md +103 -0
  3. package/dist/src/dataflow.d.ts +136 -0
  4. package/dist/src/dataflow.d.ts.map +1 -0
  5. package/dist/src/dataflow.js +562 -0
  6. package/dist/src/dataflow.js.map +1 -0
  7. package/dist/src/errors.d.ts +125 -0
  8. package/dist/src/errors.d.ts.map +1 -0
  9. package/dist/src/errors.js +211 -0
  10. package/dist/src/errors.js.map +1 -0
  11. package/dist/src/executions.d.ts +176 -0
  12. package/dist/src/executions.d.ts.map +1 -0
  13. package/dist/src/executions.js +585 -0
  14. package/dist/src/executions.js.map +1 -0
  15. package/dist/src/formats.d.ts +38 -0
  16. package/dist/src/formats.d.ts.map +1 -0
  17. package/dist/src/formats.js +115 -0
  18. package/dist/src/formats.js.map +1 -0
  19. package/dist/src/gc.d.ts +54 -0
  20. package/dist/src/gc.d.ts.map +1 -0
  21. package/dist/src/gc.js +233 -0
  22. package/dist/src/gc.js.map +1 -0
  23. package/dist/src/index.d.ts +25 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js +72 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/objects.d.ts +62 -0
  28. package/dist/src/objects.d.ts.map +1 -0
  29. package/dist/src/objects.js +245 -0
  30. package/dist/src/objects.js.map +1 -0
  31. package/dist/src/packages.d.ts +93 -0
  32. package/dist/src/packages.d.ts.map +1 -0
  33. package/dist/src/packages.js +370 -0
  34. package/dist/src/packages.js.map +1 -0
  35. package/dist/src/repository.d.ts +38 -0
  36. package/dist/src/repository.d.ts.map +1 -0
  37. package/dist/src/repository.js +103 -0
  38. package/dist/src/repository.js.map +1 -0
  39. package/dist/src/tasks.d.ts +63 -0
  40. package/dist/src/tasks.d.ts.map +1 -0
  41. package/dist/src/tasks.js +145 -0
  42. package/dist/src/tasks.js.map +1 -0
  43. package/dist/src/test-helpers.d.ts +44 -0
  44. package/dist/src/test-helpers.d.ts.map +1 -0
  45. package/dist/src/test-helpers.js +141 -0
  46. package/dist/src/test-helpers.js.map +1 -0
  47. package/dist/src/trees.d.ts +178 -0
  48. package/dist/src/trees.d.ts.map +1 -0
  49. package/dist/src/trees.js +636 -0
  50. package/dist/src/trees.js.map +1 -0
  51. package/dist/src/workspaceLock.d.ts +67 -0
  52. package/dist/src/workspaceLock.d.ts.map +1 -0
  53. package/dist/src/workspaceLock.js +217 -0
  54. package/dist/src/workspaceLock.js.map +1 -0
  55. package/dist/src/workspaceStatus.d.ts +126 -0
  56. package/dist/src/workspaceStatus.d.ts.map +1 -0
  57. package/dist/src/workspaceStatus.js +352 -0
  58. package/dist/src/workspaceStatus.js.map +1 -0
  59. package/dist/src/workspaces.d.ts +150 -0
  60. package/dist/src/workspaces.d.ts.map +1 -0
  61. package/dist/src/workspaces.js +390 -0
  62. package/dist/src/workspaces.js.map +1 -0
  63. package/package.json +59 -0
@@ -0,0 +1,585 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Task execution for e3 repositories.
7
+ *
8
+ * Provides APIs for:
9
+ * - Computing execution identity (inputsHash)
10
+ * - Querying execution status and results
11
+ * - Reading execution logs
12
+ * - Running tasks with caching
13
+ */
14
+ import * as fs from 'fs/promises';
15
+ import * as path from 'path';
16
+ import { spawn } from 'child_process';
17
+ import { createWriteStream } from 'fs';
18
+ import { tmpdir } from 'os';
19
+ import { decodeBeast2For, encodeBeast2For, variant, EastIR, IRType } from '@elaraai/east';
20
+ import { ExecutionStatusType, TaskObjectType, } from '@elaraai/e3-types';
21
+ import { computeHash, objectRead, objectWrite } from './objects.js';
22
+ import { ExecutionCorruptError, isNotFoundError } from './errors.js';
23
+ // ============================================================================
24
+ // Execution Identity
25
+ // ============================================================================
26
+ /**
27
+ * Compute the combined hash of input hashes.
28
+ *
29
+ * Used to create a unique identifier for an execution based on its inputs.
30
+ * The order of inputs matters - different orderings produce different hashes.
31
+ *
32
+ * @param inputHashes - Array of input dataset hashes
33
+ * @returns Combined SHA256 hash
34
+ */
35
+ export function inputsHash(inputHashes) {
36
+ const data = inputHashes.join('\0');
37
+ return computeHash(new TextEncoder().encode(data));
38
+ }
39
+ /**
40
+ * Get the filesystem path for an execution directory.
41
+ *
42
+ * @param repoPath - Path to .e3 repository
43
+ * @param taskHash - Hash of the task object
44
+ * @param inHash - Combined hash of input hashes
45
+ * @returns Path to execution directory: executions/<taskHash>/<inputsHash>/
46
+ */
47
+ export function executionPath(repoPath, taskHash, inHash) {
48
+ return path.join(repoPath, 'executions', taskHash, inHash);
49
+ }
50
+ // ============================================================================
51
+ // Execution Status
52
+ // ============================================================================
53
+ /**
54
+ * Get execution status.
55
+ *
56
+ * @param repoPath - Path to .e3 repository
57
+ * @param taskHash - Hash of the task object
58
+ * @param inHash - Combined hash of input hashes
59
+ * @returns ExecutionStatus or null if execution doesn't exist
60
+ * @throws {ExecutionCorruptError} If status file exists but cannot be decoded
61
+ */
62
+ export async function executionGet(repoPath, taskHash, inHash) {
63
+ const execDir = executionPath(repoPath, taskHash, inHash);
64
+ const statusPath = path.join(execDir, 'status.beast2');
65
+ let data;
66
+ try {
67
+ data = await fs.readFile(statusPath);
68
+ }
69
+ catch (err) {
70
+ if (isNotFoundError(err)) {
71
+ return null;
72
+ }
73
+ throw err;
74
+ }
75
+ try {
76
+ const decoder = decodeBeast2For(ExecutionStatusType);
77
+ return decoder(data);
78
+ }
79
+ catch (err) {
80
+ throw new ExecutionCorruptError(taskHash, inHash, err instanceof Error ? err : new Error(String(err)));
81
+ }
82
+ }
83
+ /**
84
+ * Get output hash for a completed execution.
85
+ *
86
+ * @param repoPath - Path to .e3 repository
87
+ * @param taskHash - Hash of the task object
88
+ * @param inHash - Combined hash of input hashes
89
+ * @returns Output hash or null if not complete or failed
90
+ */
91
+ export async function executionGetOutput(repoPath, taskHash, inHash) {
92
+ const execDir = executionPath(repoPath, taskHash, inHash);
93
+ const outputPath = path.join(execDir, 'output');
94
+ try {
95
+ const content = await fs.readFile(outputPath, 'utf-8');
96
+ return content.trim();
97
+ }
98
+ catch (err) {
99
+ if (isNotFoundError(err)) {
100
+ return null;
101
+ }
102
+ throw err;
103
+ }
104
+ }
105
+ /**
106
+ * List all input hashes that have executions for a given task.
107
+ *
108
+ * @param repoPath - Path to .e3 repository
109
+ * @param taskHash - Hash of the task object
110
+ * @returns Array of input hashes
111
+ */
112
+ export async function executionListForTask(repoPath, taskHash) {
113
+ const taskDir = path.join(repoPath, 'executions', taskHash);
114
+ try {
115
+ const entries = await fs.readdir(taskDir);
116
+ // Filter to only valid hash directories (64 hex chars)
117
+ return entries.filter((e) => /^[a-f0-9]{64}$/.test(e));
118
+ }
119
+ catch {
120
+ return [];
121
+ }
122
+ }
123
+ /**
124
+ * List all executions in the repository.
125
+ *
126
+ * @param repoPath - Path to .e3 repository
127
+ * @returns Array of { taskHash, inputsHash } objects
128
+ */
129
+ export async function executionList(repoPath) {
130
+ const executionsDir = path.join(repoPath, 'executions');
131
+ const result = [];
132
+ try {
133
+ const taskDirs = await fs.readdir(executionsDir);
134
+ for (const taskHash of taskDirs) {
135
+ if (!/^[a-f0-9]{64}$/.test(taskHash))
136
+ continue;
137
+ const taskDir = path.join(executionsDir, taskHash);
138
+ const stat = await fs.stat(taskDir);
139
+ if (!stat.isDirectory())
140
+ continue;
141
+ const inputsDirs = await fs.readdir(taskDir);
142
+ for (const inputsHash of inputsDirs) {
143
+ if (/^[a-f0-9]{64}$/.test(inputsHash)) {
144
+ result.push({ taskHash, inputsHash });
145
+ }
146
+ }
147
+ }
148
+ }
149
+ catch {
150
+ // Executions directory doesn't exist
151
+ }
152
+ return result;
153
+ }
154
+ /**
155
+ * Read execution logs with pagination support.
156
+ *
157
+ * @param repoPath - Path to .e3 repository
158
+ * @param taskHash - Hash of the task object
159
+ * @param inHash - Combined hash of input hashes
160
+ * @param stream - Which log stream to read ('stdout' or 'stderr')
161
+ * @param options - Pagination options
162
+ * @returns Log chunk with data and metadata
163
+ */
164
+ export async function executionReadLog(repoPath, taskHash, inHash, stream, options = {}) {
165
+ const execDir = executionPath(repoPath, taskHash, inHash);
166
+ const logPath = path.join(execDir, `${stream}.txt`);
167
+ const offset = options.offset ?? 0;
168
+ const limit = options.limit ?? 65536; // 64KB default
169
+ try {
170
+ const stat = await fs.stat(logPath);
171
+ const totalSize = stat.size;
172
+ // Open file and read chunk
173
+ const fd = await fs.open(logPath, 'r');
174
+ try {
175
+ const buffer = Buffer.alloc(Math.min(limit, totalSize - offset));
176
+ const { bytesRead } = await fd.read(buffer, 0, buffer.length, offset);
177
+ return {
178
+ data: buffer.slice(0, bytesRead).toString('utf-8'),
179
+ offset,
180
+ size: bytesRead,
181
+ totalSize,
182
+ complete: offset + bytesRead >= totalSize,
183
+ };
184
+ }
185
+ finally {
186
+ await fd.close();
187
+ }
188
+ }
189
+ catch {
190
+ // Log file doesn't exist yet
191
+ return {
192
+ data: '',
193
+ offset: 0,
194
+ size: 0,
195
+ totalSize: 0,
196
+ complete: true,
197
+ };
198
+ }
199
+ }
200
+ // ============================================================================
201
+ // Command IR Evaluation
202
+ // ============================================================================
203
+ /**
204
+ * Evaluate command IR to get exec args.
205
+ *
206
+ * The IR is an East function: (inputs: Array<String>, output: String) -> Array<String>
207
+ *
208
+ * @param repoPath - Path to .e3 repository
209
+ * @param commandIrHash - Hash of the IR object
210
+ * @param inputPaths - Paths to staged input files
211
+ * @param outputPath - Path where output should be written
212
+ * @returns Array of strings to exec
213
+ */
214
+ export async function evaluateCommandIr(repoPath, commandIrHash, inputPaths, outputPath) {
215
+ const irData = await objectRead(repoPath, commandIrHash);
216
+ try {
217
+ // Decode the IR from beast2 format
218
+ const decoder = decodeBeast2For(IRType);
219
+ const ir = decoder(Buffer.from(irData));
220
+ // Create EastIR wrapper and compile it (no platform functions needed)
221
+ const eastIr = new EastIR(ir);
222
+ const compiledFn = eastIr.compile([]);
223
+ // Execute the compiled function with inputPaths and outputPath
224
+ const result = compiledFn(inputPaths, outputPath);
225
+ // Validate result is an array of strings
226
+ if (!Array.isArray(result)) {
227
+ throw new Error(`Command IR returned ${typeof result}, expected array`);
228
+ }
229
+ for (const item of result) {
230
+ if (typeof item !== 'string') {
231
+ throw new Error(`Command IR returned array containing ${typeof item}, expected strings`);
232
+ }
233
+ }
234
+ return result;
235
+ }
236
+ catch (err) {
237
+ throw new Error(`Failed to evaluate command IR: ${err}`);
238
+ }
239
+ }
240
+ // ============================================================================
241
+ // Process Identification (for crash detection)
242
+ // ============================================================================
243
+ /**
244
+ * Get the current system boot ID.
245
+ * Used for detecting stale locks/processes after system reboot.
246
+ */
247
+ export async function getBootId() {
248
+ try {
249
+ const data = await fs.readFile('/proc/sys/kernel/random/boot_id', 'utf-8');
250
+ return data.trim();
251
+ }
252
+ catch {
253
+ // Not on Linux, use a placeholder
254
+ return 'unknown-boot-id';
255
+ }
256
+ }
257
+ /**
258
+ * Get process start time from /proc/<pid>/stat.
259
+ * Returns the starttime field (field 22) which is jiffies since boot.
260
+ * Used together with boot ID to uniquely identify a process (handles PID reuse).
261
+ */
262
+ export async function getPidStartTime(pid) {
263
+ try {
264
+ const data = await fs.readFile(`/proc/${pid}/stat`, 'utf-8');
265
+ // Fields are space-separated, but comm (field 2) can contain spaces and is in parens
266
+ // Find the closing paren, then split the rest
267
+ const closeParen = data.lastIndexOf(')');
268
+ const fields = data.slice(closeParen + 2).split(' ');
269
+ // After the closing paren, field index 0 is state (field 3), so starttime is at index 19
270
+ // (field 22 - 3 = 19)
271
+ return parseInt(fields[19], 10);
272
+ }
273
+ catch {
274
+ return 0;
275
+ }
276
+ }
277
+ /**
278
+ * Check if a process is still alive based on stored identification
279
+ */
280
+ export async function isProcessAlive(pid, pidStartTime, bootId) {
281
+ // Different boot? Process is dead
282
+ const currentBootId = await getBootId();
283
+ if (currentBootId !== bootId)
284
+ return false;
285
+ // Check if PID exists and has same start time
286
+ const currentStartTime = await getPidStartTime(pid);
287
+ if (currentStartTime === 0)
288
+ return false; // PID doesn't exist
289
+ if (currentStartTime !== pidStartTime)
290
+ return false; // PID reused
291
+ return true;
292
+ }
293
+ /**
294
+ * Execute a single task.
295
+ *
296
+ * This is the core execution primitive. It:
297
+ * 1. Computes the execution identity from task + inputs
298
+ * 2. Checks cache (unless force=true)
299
+ * 3. Marshals inputs to a scratch directory
300
+ * 4. Evaluates command IR to get exec args
301
+ * 5. Runs the command
302
+ * 6. Stores the output and updates status
303
+ *
304
+ * @param repoPath - Path to .e3 repository
305
+ * @param taskHash - Hash of the task object
306
+ * @param inputHashes - Array of input dataset hashes
307
+ * @param options - Execution options
308
+ * @returns Execution result
309
+ */
310
+ export async function taskExecute(repoPath, taskHash, inputHashes, options = {}) {
311
+ const inHash = inputsHash(inputHashes);
312
+ const execDir = executionPath(repoPath, taskHash, inHash);
313
+ const startTime = Date.now();
314
+ // Step 1: Check cache (unless force)
315
+ if (!options.force) {
316
+ const existingOutput = await executionGetOutput(repoPath, taskHash, inHash);
317
+ if (existingOutput !== null) {
318
+ const status = await executionGet(repoPath, taskHash, inHash);
319
+ if (status && status.type === 'success') {
320
+ return {
321
+ inputsHash: inHash,
322
+ cached: true,
323
+ state: 'success',
324
+ outputHash: existingOutput,
325
+ exitCode: 0,
326
+ duration: 0,
327
+ error: null,
328
+ };
329
+ }
330
+ }
331
+ }
332
+ // Step 2: Read task object
333
+ let task;
334
+ try {
335
+ const taskData = await objectRead(repoPath, taskHash);
336
+ const decoder = decodeBeast2For(TaskObjectType);
337
+ task = decoder(Buffer.from(taskData));
338
+ }
339
+ catch (err) {
340
+ return {
341
+ inputsHash: inHash,
342
+ cached: false,
343
+ state: 'error',
344
+ outputHash: null,
345
+ exitCode: null,
346
+ duration: Date.now() - startTime,
347
+ error: `Failed to read task object: ${err}`,
348
+ };
349
+ }
350
+ // Step 3: Create scratch directory
351
+ // Include PID to prevent collisions when multiple e3 processes run the same
352
+ // task concurrently (e.g., same task in different workspaces at same millisecond)
353
+ const scratchDir = path.join(tmpdir(), `e3-exec-${taskHash.slice(0, 8)}-${inHash.slice(0, 8)}-${process.pid}-${Date.now()}`);
354
+ await fs.mkdir(scratchDir, { recursive: true });
355
+ try {
356
+ // Step 4: Marshal inputs to scratch dir
357
+ const inputPaths = [];
358
+ for (let i = 0; i < inputHashes.length; i++) {
359
+ const inputPath = path.join(scratchDir, `input-${i}.beast2`);
360
+ const inputData = await objectRead(repoPath, inputHashes[i]);
361
+ await fs.writeFile(inputPath, inputData);
362
+ inputPaths.push(inputPath);
363
+ }
364
+ // Step 5: Evaluate command IR to get exec args
365
+ const outputPath = path.join(scratchDir, 'output.beast2');
366
+ let args;
367
+ try {
368
+ args = await evaluateCommandIr(repoPath, task.commandIr, inputPaths, outputPath);
369
+ }
370
+ catch (err) {
371
+ return {
372
+ inputsHash: inHash,
373
+ cached: false,
374
+ state: 'error',
375
+ outputHash: null,
376
+ exitCode: null,
377
+ duration: Date.now() - startTime,
378
+ error: `Failed to evaluate command IR: ${err}`,
379
+ };
380
+ }
381
+ if (args.length === 0) {
382
+ return {
383
+ inputsHash: inHash,
384
+ cached: false,
385
+ state: 'error',
386
+ outputHash: null,
387
+ exitCode: null,
388
+ duration: Date.now() - startTime,
389
+ error: 'Command IR produced empty command',
390
+ };
391
+ }
392
+ // Step 6: Create execution directory
393
+ await fs.mkdir(execDir, { recursive: true });
394
+ // Step 7: Get boot ID for crash detection
395
+ const bootId = await getBootId();
396
+ // Step 8: Execute command
397
+ const result = await runCommand(args, execDir, inputHashes, bootId, options);
398
+ // Step 9: Handle result
399
+ if (result.exitCode === 0) {
400
+ // Success - read and store output
401
+ try {
402
+ const outputData = await fs.readFile(outputPath);
403
+ const outputHash = await objectWrite(repoPath, outputData);
404
+ // Write output ref
405
+ await fs.writeFile(path.join(execDir, 'output'), outputHash + '\n');
406
+ // Write success status
407
+ const status = variant('success', {
408
+ inputHashes,
409
+ outputHash,
410
+ startedAt: new Date(startTime),
411
+ completedAt: new Date(),
412
+ });
413
+ const encoder = encodeBeast2For(ExecutionStatusType);
414
+ await fs.writeFile(path.join(execDir, 'status.beast2'), encoder(status));
415
+ return {
416
+ inputsHash: inHash,
417
+ cached: false,
418
+ state: 'success',
419
+ outputHash,
420
+ exitCode: 0,
421
+ duration: Date.now() - startTime,
422
+ error: null,
423
+ };
424
+ }
425
+ catch (err) {
426
+ // Output file missing or unreadable
427
+ const status = variant('error', {
428
+ inputHashes,
429
+ startedAt: new Date(startTime),
430
+ completedAt: new Date(),
431
+ message: `Failed to read output: ${err}`,
432
+ });
433
+ const encoder = encodeBeast2For(ExecutionStatusType);
434
+ await fs.writeFile(path.join(execDir, 'status.beast2'), encoder(status));
435
+ return {
436
+ inputsHash: inHash,
437
+ cached: false,
438
+ state: 'error',
439
+ outputHash: null,
440
+ exitCode: 0,
441
+ duration: Date.now() - startTime,
442
+ error: `Failed to read output: ${err}`,
443
+ };
444
+ }
445
+ }
446
+ else {
447
+ // Failed - write failed status
448
+ const status = variant('failed', {
449
+ inputHashes,
450
+ startedAt: new Date(startTime),
451
+ completedAt: new Date(),
452
+ exitCode: BigInt(result?.exitCode ?? -1),
453
+ });
454
+ const encoder = encodeBeast2For(ExecutionStatusType);
455
+ await fs.writeFile(path.join(execDir, 'status.beast2'), encoder(status));
456
+ return {
457
+ inputsHash: inHash,
458
+ cached: false,
459
+ state: 'failed',
460
+ outputHash: null,
461
+ exitCode: result.exitCode,
462
+ duration: Date.now() - startTime,
463
+ error: result.error,
464
+ };
465
+ }
466
+ }
467
+ finally {
468
+ // Cleanup scratch directory
469
+ try {
470
+ await fs.rm(scratchDir, { recursive: true, force: true });
471
+ }
472
+ catch {
473
+ // Ignore cleanup errors
474
+ }
475
+ }
476
+ }
477
+ /**
478
+ * Run a command and capture output
479
+ */
480
+ async function runCommand(args, execDir, inputHashes, bootId, options) {
481
+ const [cmd, ...cmdArgs] = args;
482
+ // Process Lifecycle Management
483
+ // ============================
484
+ // We use detached: true to create a new process group, allowing us to kill
485
+ // the entire process tree by signaling the negative PID (process group leader).
486
+ //
487
+ // LIMITATION: Process groups are flat, not hierarchical. If a task spawns a
488
+ // subprocess that creates its own process group (via setsid, daemonization,
489
+ // or another detached spawn), that subprocess will escape our kill signal.
490
+ // This is a fundamental Unix limitation - process groups were designed for
491
+ // terminal job control (Ctrl+C/Ctrl+Z), not process tree management.
492
+ //
493
+ // For most tasks (shell scripts, pipelines, normal child processes) this works
494
+ // fine. A task would have to intentionally call setsid() to escape.
495
+ //
496
+ // Potential improvements for hosted e3:
497
+ // - Linux cgroups: Hierarchical containment with no escape. Requires root or
498
+ // systemd integration (systemd-run --scope). Used by Docker/Kubernetes.
499
+ // - PR_SET_CHILD_SUBREAPER: Makes e3 adopt orphaned processes instead of init,
500
+ // allowing tracking and cleanup. Requires polling to detect orphans.
501
+ // - Firecracker/microVMs: Complete isolation with hardware virtualization.
502
+ // The VM boundary provides bulletproof containment. Best for multi-tenant.
503
+ const child = spawn(cmd, cmdArgs, {
504
+ stdio: ['ignore', 'pipe', 'pipe'],
505
+ detached: true,
506
+ });
507
+ // Set up event listeners IMMEDIATELY before any async work
508
+ // to avoid missing events if the process completes quickly
509
+ const resultPromise = new Promise((resolve) => {
510
+ child.on('error', (err) => {
511
+ resolve({ exitCode: null, error: `Failed to spawn: ${err.message}` });
512
+ });
513
+ child.on('close', (code) => {
514
+ resolve({ exitCode: code, error: code !== 0 ? `Exit code: ${code}` : null });
515
+ });
516
+ });
517
+ // Open log files for writing
518
+ const stdoutStream = createWriteStream(path.join(execDir, 'stdout.txt'));
519
+ const stderrStream = createWriteStream(path.join(execDir, 'stderr.txt'));
520
+ // Tee stdout
521
+ child.stdout?.on('data', (data) => {
522
+ stdoutStream.write(data);
523
+ if (options.onStdout) {
524
+ options.onStdout(data.toString('utf-8'));
525
+ }
526
+ });
527
+ // Tee stderr
528
+ child.stderr?.on('data', (data) => {
529
+ stderrStream.write(data);
530
+ if (options.onStderr) {
531
+ options.onStderr(data.toString('utf-8'));
532
+ }
533
+ });
534
+ // Helper to kill the entire process group (child and all its descendants).
535
+ // With detached: true, child.pid is the process group leader, so killing
536
+ // -child.pid sends the signal to all processes in that group.
537
+ const killProcessGroup = () => {
538
+ if (child.pid) {
539
+ try {
540
+ process.kill(-child.pid, 'SIGKILL');
541
+ }
542
+ catch {
543
+ // Process may have already exited
544
+ }
545
+ }
546
+ };
547
+ // Handle timeout
548
+ let timeoutId;
549
+ if (options.timeout) {
550
+ timeoutId = setTimeout(killProcessGroup, options.timeout);
551
+ }
552
+ // Handle abort signal
553
+ if (options.signal) {
554
+ if (options.signal.aborted) {
555
+ // Already aborted before we started
556
+ killProcessGroup();
557
+ }
558
+ else {
559
+ options.signal.addEventListener('abort', killProcessGroup, { once: true });
560
+ }
561
+ }
562
+ // Write running status with actual child PID (can be async now)
563
+ const pidStartTime = await getPidStartTime(child.pid);
564
+ const status = variant('running', {
565
+ inputHashes,
566
+ startedAt: new Date(),
567
+ pid: BigInt(child.pid ?? -1),
568
+ pidStartTime: BigInt(pidStartTime ?? -1),
569
+ bootId,
570
+ });
571
+ const encoder = encodeBeast2For(ExecutionStatusType);
572
+ await fs.writeFile(path.join(execDir, 'status.beast2'), encoder(status));
573
+ // Wait for process to complete
574
+ const result = await resultPromise;
575
+ // Cleanup
576
+ if (timeoutId)
577
+ clearTimeout(timeoutId);
578
+ if (options.signal) {
579
+ options.signal.removeEventListener('abort', killProcessGroup);
580
+ }
581
+ stdoutStream.end();
582
+ stderrStream.end();
583
+ return result;
584
+ }
585
+ //# sourceMappingURL=executions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executions.js","sourceRoot":"","sources":["../../src/executions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ import { type IR } from '@elaraai/east';
6
+ /**
7
+ * Load IR from a file (.json, .east, or .beast2)
8
+ */
9
+ export declare function loadIR(filePath: string): Promise<IR>;
10
+ /**
11
+ * Encode IR to Beast2 format
12
+ */
13
+ export declare function irToBeast2(ir: IR): Uint8Array;
14
+ /**
15
+ * Write a ReadableStream to a file
16
+ */
17
+ export declare function writeStreamToFile(stream: ReadableStream<Uint8Array>, filePath: string): Promise<void>;
18
+ /**
19
+ * Load a value from Beast2 file
20
+ */
21
+ export declare function loadBeast2(filePath: string, type: any): Promise<any>;
22
+ /**
23
+ * Format a value as .east format
24
+ */
25
+ export declare function formatEast(value: any, type: any): string;
26
+ /**
27
+ * Parse a value from .east format
28
+ */
29
+ export declare function parseEast(text: string, type: any): any;
30
+ /**
31
+ * Load a value from any format (.json, .east, or .beast2)
32
+ */
33
+ export declare function loadValue(filePath: string, type: any): Promise<any>;
34
+ /**
35
+ * Encode a value to Beast2 format
36
+ */
37
+ export declare function valueToBeast2(value: any, type: any): Uint8Array;
38
+ //# sourceMappingURL=formats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formats.d.ts","sourceRoot":"","sources":["../../src/formats.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAOL,KAAK,EAAE,EACR,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CA4B1D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,UAAU,CAG7C;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAI1E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAGxD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,GAAG,CAStD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAkBzE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,UAAU,CAG/D"}