@elaraai/e3-core 0.0.2-beta.3 → 0.0.2-beta.31

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 (184) hide show
  1. package/README.md +25 -22
  2. package/dist/src/dataflow/api-compat.d.ts +90 -0
  3. package/dist/src/dataflow/api-compat.d.ts.map +1 -0
  4. package/dist/src/dataflow/api-compat.js +134 -0
  5. package/dist/src/dataflow/api-compat.js.map +1 -0
  6. package/dist/src/dataflow/index.d.ts +18 -0
  7. package/dist/src/dataflow/index.d.ts.map +1 -0
  8. package/dist/src/dataflow/index.js +23 -0
  9. package/dist/src/dataflow/index.js.map +1 -0
  10. package/dist/src/dataflow/orchestrator/LocalOrchestrator.d.ts +53 -0
  11. package/dist/src/dataflow/orchestrator/LocalOrchestrator.d.ts.map +1 -0
  12. package/dist/src/dataflow/orchestrator/LocalOrchestrator.js +416 -0
  13. package/dist/src/dataflow/orchestrator/LocalOrchestrator.js.map +1 -0
  14. package/dist/src/dataflow/orchestrator/index.d.ts +12 -0
  15. package/dist/src/dataflow/orchestrator/index.d.ts.map +1 -0
  16. package/dist/src/dataflow/orchestrator/index.js +12 -0
  17. package/dist/src/dataflow/orchestrator/index.js.map +1 -0
  18. package/dist/src/dataflow/orchestrator/interfaces.d.ts +157 -0
  19. package/dist/src/dataflow/orchestrator/interfaces.d.ts.map +1 -0
  20. package/dist/src/dataflow/orchestrator/interfaces.js +51 -0
  21. package/dist/src/dataflow/orchestrator/interfaces.js.map +1 -0
  22. package/dist/src/dataflow/state-store/FileStateStore.d.ts +67 -0
  23. package/dist/src/dataflow/state-store/FileStateStore.d.ts.map +1 -0
  24. package/dist/src/dataflow/state-store/FileStateStore.js +286 -0
  25. package/dist/src/dataflow/state-store/FileStateStore.js.map +1 -0
  26. package/dist/src/dataflow/state-store/InMemoryStateStore.d.ts +42 -0
  27. package/dist/src/dataflow/state-store/InMemoryStateStore.d.ts.map +1 -0
  28. package/dist/src/dataflow/state-store/InMemoryStateStore.js +214 -0
  29. package/dist/src/dataflow/state-store/InMemoryStateStore.js.map +1 -0
  30. package/dist/src/dataflow/state-store/index.d.ts +13 -0
  31. package/dist/src/dataflow/state-store/index.d.ts.map +1 -0
  32. package/dist/src/dataflow/state-store/index.js +13 -0
  33. package/dist/src/dataflow/state-store/index.js.map +1 -0
  34. package/dist/src/dataflow/state-store/interfaces.d.ts +159 -0
  35. package/dist/src/dataflow/state-store/interfaces.d.ts.map +1 -0
  36. package/dist/src/dataflow/state-store/interfaces.js +6 -0
  37. package/dist/src/dataflow/state-store/interfaces.js.map +1 -0
  38. package/dist/src/dataflow/steps.d.ts +176 -0
  39. package/dist/src/dataflow/steps.d.ts.map +1 -0
  40. package/dist/src/dataflow/steps.js +528 -0
  41. package/dist/src/dataflow/steps.js.map +1 -0
  42. package/dist/src/dataflow/types.d.ts +116 -0
  43. package/dist/src/dataflow/types.d.ts.map +1 -0
  44. package/dist/src/dataflow/types.js +7 -0
  45. package/dist/src/dataflow/types.js.map +1 -0
  46. package/dist/src/dataflow.d.ts +142 -9
  47. package/dist/src/dataflow.d.ts.map +1 -1
  48. package/dist/src/dataflow.js +427 -64
  49. package/dist/src/dataflow.js.map +1 -1
  50. package/dist/src/errors.d.ts +39 -9
  51. package/dist/src/errors.d.ts.map +1 -1
  52. package/dist/src/errors.js +51 -8
  53. package/dist/src/errors.js.map +1 -1
  54. package/dist/src/execution/LocalTaskRunner.d.ts +73 -0
  55. package/dist/src/execution/LocalTaskRunner.d.ts.map +1 -0
  56. package/dist/src/execution/LocalTaskRunner.js +399 -0
  57. package/dist/src/execution/LocalTaskRunner.js.map +1 -0
  58. package/dist/src/execution/MockTaskRunner.d.ts +49 -0
  59. package/dist/src/execution/MockTaskRunner.d.ts.map +1 -0
  60. package/dist/src/execution/MockTaskRunner.js +55 -0
  61. package/dist/src/execution/MockTaskRunner.js.map +1 -0
  62. package/dist/src/execution/index.d.ts +16 -0
  63. package/dist/src/execution/index.d.ts.map +1 -0
  64. package/dist/src/execution/index.js +8 -0
  65. package/dist/src/execution/index.js.map +1 -0
  66. package/dist/src/execution/interfaces.d.ts +246 -0
  67. package/dist/src/execution/interfaces.d.ts.map +1 -0
  68. package/dist/src/execution/interfaces.js +6 -0
  69. package/dist/src/execution/interfaces.js.map +1 -0
  70. package/dist/src/execution/processHelpers.d.ts +20 -0
  71. package/dist/src/execution/processHelpers.d.ts.map +1 -0
  72. package/dist/src/execution/processHelpers.js +62 -0
  73. package/dist/src/execution/processHelpers.js.map +1 -0
  74. package/dist/src/executions.d.ts +71 -104
  75. package/dist/src/executions.d.ts.map +1 -1
  76. package/dist/src/executions.js +110 -476
  77. package/dist/src/executions.js.map +1 -1
  78. package/dist/src/index.d.ts +17 -9
  79. package/dist/src/index.d.ts.map +1 -1
  80. package/dist/src/index.js +44 -18
  81. package/dist/src/index.js.map +1 -1
  82. package/dist/src/objects.d.ts +6 -53
  83. package/dist/src/objects.d.ts.map +1 -1
  84. package/dist/src/objects.js +11 -232
  85. package/dist/src/objects.js.map +1 -1
  86. package/dist/src/packages.d.ts +22 -14
  87. package/dist/src/packages.d.ts.map +1 -1
  88. package/dist/src/packages.js +116 -83
  89. package/dist/src/packages.js.map +1 -1
  90. package/dist/src/storage/in-memory/InMemoryRepoStore.d.ts +35 -0
  91. package/dist/src/storage/in-memory/InMemoryRepoStore.d.ts.map +1 -0
  92. package/dist/src/storage/in-memory/InMemoryRepoStore.js +107 -0
  93. package/dist/src/storage/in-memory/InMemoryRepoStore.js.map +1 -0
  94. package/dist/src/storage/in-memory/InMemoryStorage.d.ts +114 -0
  95. package/dist/src/storage/in-memory/InMemoryStorage.d.ts.map +1 -0
  96. package/dist/src/storage/in-memory/InMemoryStorage.js +349 -0
  97. package/dist/src/storage/in-memory/InMemoryStorage.js.map +1 -0
  98. package/dist/src/storage/in-memory/index.d.ts +12 -0
  99. package/dist/src/storage/in-memory/index.d.ts.map +1 -0
  100. package/dist/src/storage/in-memory/index.js +12 -0
  101. package/dist/src/storage/in-memory/index.js.map +1 -0
  102. package/dist/src/storage/index.d.ts +18 -0
  103. package/dist/src/storage/index.d.ts.map +1 -0
  104. package/dist/src/storage/index.js +10 -0
  105. package/dist/src/storage/index.js.map +1 -0
  106. package/dist/src/storage/interfaces.d.ts +520 -0
  107. package/dist/src/storage/interfaces.d.ts.map +1 -0
  108. package/dist/src/storage/interfaces.js +6 -0
  109. package/dist/src/storage/interfaces.js.map +1 -0
  110. package/dist/src/storage/local/LocalBackend.d.ts +54 -0
  111. package/dist/src/storage/local/LocalBackend.d.ts.map +1 -0
  112. package/dist/src/storage/local/LocalBackend.js +141 -0
  113. package/dist/src/storage/local/LocalBackend.js.map +1 -0
  114. package/dist/src/storage/local/LocalLockService.d.ts +105 -0
  115. package/dist/src/storage/local/LocalLockService.d.ts.map +1 -0
  116. package/dist/src/storage/local/LocalLockService.js +342 -0
  117. package/dist/src/storage/local/LocalLockService.js.map +1 -0
  118. package/dist/src/storage/local/LocalLogStore.d.ts +23 -0
  119. package/dist/src/storage/local/LocalLogStore.d.ts.map +1 -0
  120. package/dist/src/storage/local/LocalLogStore.js +66 -0
  121. package/dist/src/storage/local/LocalLogStore.js.map +1 -0
  122. package/dist/src/storage/local/LocalObjectStore.d.ts +52 -0
  123. package/dist/src/storage/local/LocalObjectStore.d.ts.map +1 -0
  124. package/dist/src/storage/local/LocalObjectStore.js +287 -0
  125. package/dist/src/storage/local/LocalObjectStore.js.map +1 -0
  126. package/dist/src/storage/local/LocalRefStore.d.ts +50 -0
  127. package/dist/src/storage/local/LocalRefStore.d.ts.map +1 -0
  128. package/dist/src/storage/local/LocalRefStore.js +337 -0
  129. package/dist/src/storage/local/LocalRefStore.js.map +1 -0
  130. package/dist/src/storage/local/LocalRepoStore.d.ts +53 -0
  131. package/dist/src/storage/local/LocalRepoStore.d.ts.map +1 -0
  132. package/dist/src/storage/local/LocalRepoStore.js +353 -0
  133. package/dist/src/storage/local/LocalRepoStore.js.map +1 -0
  134. package/dist/src/storage/local/gc.d.ts +92 -0
  135. package/dist/src/storage/local/gc.d.ts.map +1 -0
  136. package/dist/src/storage/local/gc.js +322 -0
  137. package/dist/src/storage/local/gc.js.map +1 -0
  138. package/dist/src/storage/local/index.d.ts +17 -0
  139. package/dist/src/storage/local/index.d.ts.map +1 -0
  140. package/dist/src/storage/local/index.js +17 -0
  141. package/dist/src/storage/local/index.js.map +1 -0
  142. package/dist/src/storage/local/localHelpers.d.ts +25 -0
  143. package/dist/src/storage/local/localHelpers.d.ts.map +1 -0
  144. package/dist/src/storage/local/localHelpers.js +69 -0
  145. package/dist/src/storage/local/localHelpers.js.map +1 -0
  146. package/dist/src/{repository.d.ts → storage/local/repository.d.ts} +8 -4
  147. package/dist/src/storage/local/repository.d.ts.map +1 -0
  148. package/dist/src/{repository.js → storage/local/repository.js} +31 -29
  149. package/dist/src/storage/local/repository.js.map +1 -0
  150. package/dist/src/tasks.d.ts +16 -10
  151. package/dist/src/tasks.d.ts.map +1 -1
  152. package/dist/src/tasks.js +35 -41
  153. package/dist/src/tasks.js.map +1 -1
  154. package/dist/src/test-helpers.d.ts +4 -4
  155. package/dist/src/test-helpers.d.ts.map +1 -1
  156. package/dist/src/test-helpers.js +7 -21
  157. package/dist/src/test-helpers.js.map +1 -1
  158. package/dist/src/trees.d.ts +89 -27
  159. package/dist/src/trees.d.ts.map +1 -1
  160. package/dist/src/trees.js +218 -100
  161. package/dist/src/trees.js.map +1 -1
  162. package/dist/src/uuid.d.ts +26 -0
  163. package/dist/src/uuid.d.ts.map +1 -0
  164. package/dist/src/uuid.js +80 -0
  165. package/dist/src/uuid.js.map +1 -0
  166. package/dist/src/workspaceStatus.d.ts +6 -4
  167. package/dist/src/workspaceStatus.d.ts.map +1 -1
  168. package/dist/src/workspaceStatus.js +43 -49
  169. package/dist/src/workspaceStatus.js.map +1 -1
  170. package/dist/src/workspaces.d.ts +35 -26
  171. package/dist/src/workspaces.d.ts.map +1 -1
  172. package/dist/src/workspaces.js +169 -118
  173. package/dist/src/workspaces.js.map +1 -1
  174. package/package.json +4 -4
  175. package/dist/src/gc.d.ts +0 -54
  176. package/dist/src/gc.d.ts.map +0 -1
  177. package/dist/src/gc.js +0 -233
  178. package/dist/src/gc.js.map +0 -1
  179. package/dist/src/repository.d.ts.map +0 -1
  180. package/dist/src/repository.js.map +0 -1
  181. package/dist/src/workspaceLock.d.ts +0 -67
  182. package/dist/src/workspaceLock.d.ts.map +0 -1
  183. package/dist/src/workspaceLock.js +0 -217
  184. package/dist/src/workspaceLock.js.map +0 -1
@@ -0,0 +1,416 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Local in-process dataflow orchestrator.
7
+ *
8
+ * Executes dataflow using an async loop with step functions.
9
+ * This is the default orchestrator for CLI and local API server usage.
10
+ */
11
+ import { variant } from '@elaraai/east';
12
+ import { taskExecute } from '../../execution/LocalTaskRunner.js';
13
+ import { workspaceSetDatasetByHash } from '../../trees.js';
14
+ import { parsePathString } from '../../dataflow.js';
15
+ import { WorkspaceLockError, DataflowAbortedError } from '../../errors.js';
16
+ import { stateToStatus } from './interfaces.js';
17
+ import { stepInitialize, stepGetReady, stepPrepareTask, stepTaskStarted, stepTaskCompleted, stepTaskFailed, stepTasksSkipped, stepIsComplete, stepFinalize, stepCancel, } from '../steps.js';
18
+ /**
19
+ * Simple async mutex to serialize workspace state updates.
20
+ *
21
+ * When multiple tasks complete concurrently, their workspace writes must be
22
+ * serialized to prevent race conditions (read-modify-write on the workspace
23
+ * root hash). This mutex ensures only one update runs at a time.
24
+ */
25
+ class AsyncMutex {
26
+ queue = [];
27
+ locked = false;
28
+ /**
29
+ * Acquire the mutex, execute the callback, then release.
30
+ * If the mutex is already held, waits until it's available.
31
+ */
32
+ async runExclusive(fn) {
33
+ await this.acquire();
34
+ try {
35
+ return await fn();
36
+ }
37
+ finally {
38
+ this.release();
39
+ }
40
+ }
41
+ acquire() {
42
+ return new Promise((resolve) => {
43
+ if (!this.locked) {
44
+ this.locked = true;
45
+ resolve();
46
+ }
47
+ else {
48
+ this.queue.push(resolve);
49
+ }
50
+ });
51
+ }
52
+ release() {
53
+ const next = this.queue.shift();
54
+ if (next) {
55
+ next();
56
+ }
57
+ else {
58
+ this.locked = false;
59
+ }
60
+ }
61
+ }
62
+ /**
63
+ * Local orchestrator for in-process dataflow execution.
64
+ *
65
+ * @remarks
66
+ * - Uses step functions for each operation
67
+ * - Serializes workspace writes with AsyncMutex
68
+ * - Supports AbortSignal for cancellation
69
+ * - Persists state through the provided state store
70
+ */
71
+ export class LocalOrchestrator {
72
+ stateStore;
73
+ executions = new Map();
74
+ /**
75
+ * Create a new LocalOrchestrator.
76
+ *
77
+ * @param stateStore - Optional state store for persistence.
78
+ * If not provided, state is only kept in memory.
79
+ */
80
+ constructor(stateStore) {
81
+ this.stateStore = stateStore;
82
+ }
83
+ async start(storage, repo, workspace, options = {}) {
84
+ // Acquire lock if not provided externally
85
+ const externalLock = !!options.lock;
86
+ const lock = options.lock ?? await storage.locks.acquire(repo, workspace, variant('dataflow', null));
87
+ if (!lock) {
88
+ throw new WorkspaceLockError(workspace);
89
+ }
90
+ try {
91
+ // Get next execution ID from state store if available
92
+ const executionId = this.stateStore
93
+ ? await this.stateStore.nextExecutionId(repo, workspace)
94
+ : String(Date.now()); // Fallback to timestamp if no state store
95
+ // Initialize execution state
96
+ const { state, readyTasks: _ } = await stepInitialize(storage, repo, workspace, executionId, {
97
+ concurrency: options.concurrency,
98
+ force: options.force,
99
+ filter: options.filter,
100
+ });
101
+ // Persist initial state
102
+ if (this.stateStore) {
103
+ await this.stateStore.create(state);
104
+ }
105
+ // Create completion promise
106
+ let resolveCompletion;
107
+ let rejectCompletion;
108
+ const completionPromise = new Promise((resolve, reject) => {
109
+ resolveCompletion = resolve;
110
+ rejectCompletion = reject;
111
+ });
112
+ // Create running execution state
113
+ const execution = {
114
+ state,
115
+ lock,
116
+ externalLock,
117
+ options,
118
+ mutex: new AsyncMutex(),
119
+ aborted: false,
120
+ runningTasks: new Map(),
121
+ completionPromise,
122
+ resolveCompletion,
123
+ rejectCompletion,
124
+ };
125
+ const key = this.executionKey(repo, workspace, executionId);
126
+ this.executions.set(key, execution);
127
+ // Listen for abort signal to persist cancellation immediately.
128
+ // This ensures the "cancelled" status survives even if the process
129
+ // is killed (e.g., repeated Ctrl-C) before the loop can persist.
130
+ if (options.signal) {
131
+ const onAbort = () => {
132
+ execution.aborted = true;
133
+ if (this.stateStore) {
134
+ // Fire-and-forget: best-effort immediate persistence
135
+ void this.stateStore.updateStatus(repo, workspace, executionId, 'cancelled', { error: 'Execution was cancelled' }).catch(() => { });
136
+ }
137
+ };
138
+ options.signal.addEventListener('abort', onAbort, { once: true });
139
+ }
140
+ // Start the execution loop (non-blocking)
141
+ this.runExecutionLoop(storage, repo, execution).catch(err => {
142
+ rejectCompletion(err);
143
+ });
144
+ return { id: executionId, repo, workspace };
145
+ }
146
+ catch (err) {
147
+ // Release lock on initialization failure (if we acquired it)
148
+ if (!externalLock) {
149
+ await lock.release();
150
+ }
151
+ throw err;
152
+ }
153
+ }
154
+ async wait(handle) {
155
+ const key = this.executionKey(handle.repo, handle.workspace, handle.id);
156
+ const execution = this.executions.get(key);
157
+ if (!execution) {
158
+ throw new Error(`Execution ${handle.id} not found for workspace '${handle.workspace}'`);
159
+ }
160
+ return execution.completionPromise;
161
+ }
162
+ async getStatus(handle) {
163
+ const key = this.executionKey(handle.repo, handle.workspace, handle.id);
164
+ const execution = this.executions.get(key);
165
+ if (!execution) {
166
+ // Try to read from state store
167
+ if (this.stateStore) {
168
+ const state = await this.stateStore.read(handle.repo, handle.workspace, handle.id);
169
+ if (state) {
170
+ return stateToStatus(state);
171
+ }
172
+ }
173
+ throw new Error(`Execution ${handle.id} not found for workspace '${handle.workspace}'`);
174
+ }
175
+ return stateToStatus(execution.state);
176
+ }
177
+ async cancel(handle) {
178
+ const key = this.executionKey(handle.repo, handle.workspace, handle.id);
179
+ const execution = this.executions.get(key);
180
+ if (!execution) {
181
+ throw new Error(`Execution ${handle.id} not found for workspace '${handle.workspace}'`);
182
+ }
183
+ execution.aborted = true;
184
+ // Persist cancellation immediately so it survives process crashes.
185
+ // The execution loop will also detect the abort and clean up gracefully.
186
+ if (this.stateStore) {
187
+ await this.stateStore.updateStatus(handle.repo, handle.workspace, handle.id, 'cancelled', { error: 'Execution was cancelled' });
188
+ }
189
+ }
190
+ async getEvents(handle, sinceSeq) {
191
+ if (!this.stateStore) {
192
+ return [];
193
+ }
194
+ return this.stateStore.getEventsSince(handle.repo, handle.workspace, handle.id, sinceSeq);
195
+ }
196
+ /**
197
+ * Main execution loop.
198
+ *
199
+ * Uses step functions to execute tasks, managing concurrency and
200
+ * workspace state updates.
201
+ */
202
+ async runExecutionLoop(storage, repo, execution) {
203
+ const { state, options, mutex } = execution;
204
+ try {
205
+ let hasFailure = false;
206
+ // Check for abort signal from options
207
+ const checkAborted = () => {
208
+ if (options.signal?.aborted && !execution.aborted) {
209
+ execution.aborted = true;
210
+ }
211
+ return execution.aborted;
212
+ };
213
+ while (true) {
214
+ // Check if we're done
215
+ if (execution.runningTasks.size === 0 && stepIsComplete(state)) {
216
+ break;
217
+ }
218
+ // Get ready tasks
219
+ const readyTasks = stepGetReady(state);
220
+ // Launch tasks up to concurrency limit if no failure and not aborted
221
+ const concurrencyLimit = Number(state.concurrency);
222
+ while (!hasFailure &&
223
+ !checkAborted() &&
224
+ readyTasks.length > 0 &&
225
+ execution.runningTasks.size < concurrencyLimit) {
226
+ const taskName = readyTasks.shift();
227
+ const taskState = state.tasks.get(taskName);
228
+ if (!taskState || taskState.status === 'in_progress' || taskState.status === 'completed') {
229
+ continue;
230
+ }
231
+ // Prepare task (resolve inputs, check cache)
232
+ const prepared = await stepPrepareTask(storage, state, taskName);
233
+ // Check cache
234
+ if (prepared.cachedOutputHash !== null) {
235
+ // Cache hit - handle synchronously within mutex
236
+ await mutex.runExclusive(async () => {
237
+ stepTaskCompleted(state, taskName, prepared.cachedOutputHash, true, 0);
238
+ // Notify callback
239
+ options.onTaskComplete?.({
240
+ name: taskName,
241
+ cached: true,
242
+ state: 'success',
243
+ duration: 0,
244
+ });
245
+ // Update state store (events are added by step function)
246
+ if (this.stateStore) {
247
+ await this.stateStore.update(state);
248
+ }
249
+ });
250
+ continue;
251
+ }
252
+ // Mark as started (event added by step function)
253
+ stepTaskStarted(state, taskName);
254
+ if (this.stateStore) {
255
+ await this.stateStore.update(state);
256
+ }
257
+ options.onTaskStart?.(taskName);
258
+ // Launch task execution
259
+ const taskPromise = this.executeTask(storage, repo, execution, taskName, prepared).then(async (result) => {
260
+ // Handle task completion within mutex
261
+ await mutex.runExclusive(async () => {
262
+ if (result.state === 'success') {
263
+ const outputPath = parsePathString(prepared.outputPath);
264
+ if (result.outputHash) {
265
+ await workspaceSetDatasetByHash(storage, repo, state.workspace, outputPath, result.outputHash);
266
+ }
267
+ stepTaskCompleted(state, taskName, result.outputHash ?? '', result.cached, result.duration);
268
+ options.onTaskComplete?.({
269
+ name: taskName,
270
+ cached: result.cached,
271
+ state: 'success',
272
+ duration: result.duration,
273
+ });
274
+ }
275
+ else {
276
+ hasFailure = true;
277
+ const { result: failedResult } = stepTaskFailed(state, taskName, result.error, result.exitCode, result.duration);
278
+ options.onTaskComplete?.({
279
+ name: taskName,
280
+ cached: false,
281
+ state: result.state === 'failed' ? 'failed' : 'error',
282
+ error: result.error,
283
+ exitCode: result.exitCode,
284
+ duration: result.duration,
285
+ });
286
+ // Skip dependents (events added by step function)
287
+ const skipEvents = stepTasksSkipped(state, failedResult.toSkip, taskName);
288
+ for (const skipEvent of skipEvents) {
289
+ // skipEvents are always task_skipped events
290
+ if (skipEvent.type === 'task_skipped') {
291
+ options.onTaskComplete?.({
292
+ name: skipEvent.value.task,
293
+ cached: false,
294
+ state: 'skipped',
295
+ duration: 0,
296
+ });
297
+ }
298
+ }
299
+ }
300
+ // Update state store
301
+ if (this.stateStore) {
302
+ await this.stateStore.update(state);
303
+ }
304
+ });
305
+ }).finally(() => {
306
+ execution.runningTasks.delete(taskName);
307
+ });
308
+ execution.runningTasks.set(taskName, taskPromise);
309
+ }
310
+ // Wait for at least one task to complete if we can't launch more
311
+ if (execution.runningTasks.size > 0) {
312
+ await Promise.race(execution.runningTasks.values());
313
+ }
314
+ else if (readyTasks.length === 0 || checkAborted() || hasFailure) {
315
+ break;
316
+ }
317
+ }
318
+ // Wait for any remaining tasks
319
+ if (execution.runningTasks.size > 0) {
320
+ await Promise.all(execution.runningTasks.values());
321
+ }
322
+ // Check for abort one final time
323
+ if (checkAborted()) {
324
+ stepCancel(state, 'Execution was aborted');
325
+ if (this.stateStore) {
326
+ await this.stateStore.update(state);
327
+ }
328
+ // Build partial results for abort error
329
+ const partialResults = this.buildPartialResults(state);
330
+ throw new DataflowAbortedError(partialResults);
331
+ }
332
+ // Finalize (event added by step function)
333
+ const { result } = stepFinalize(state);
334
+ if (this.stateStore) {
335
+ await this.stateStore.update(state);
336
+ }
337
+ execution.resolveCompletion(result);
338
+ }
339
+ finally {
340
+ // Release lock if we acquired it
341
+ if (!execution.externalLock) {
342
+ await execution.lock.release();
343
+ }
344
+ // Clean up execution state
345
+ const key = this.executionKey(repo, state.workspace, state.id);
346
+ this.executions.delete(key);
347
+ }
348
+ }
349
+ /**
350
+ * Execute a single task.
351
+ */
352
+ async executeTask(storage, repo, execution, taskName, prepared) {
353
+ const { options } = execution;
354
+ const startTime = Date.now();
355
+ const execOptions = {
356
+ force: execution.state.force,
357
+ signal: options.signal,
358
+ onStdout: options.onStdout ? (data) => options.onStdout(taskName, data) : undefined,
359
+ onStderr: options.onStderr ? (data) => options.onStderr(taskName, data) : undefined,
360
+ };
361
+ // Use provided runner if available, otherwise call taskExecute directly
362
+ if (options.runner) {
363
+ const result = await options.runner.execute(storage, prepared.taskHash, prepared.inputHashes, execOptions);
364
+ return {
365
+ state: result.state,
366
+ cached: result.cached,
367
+ outputHash: result.outputHash,
368
+ exitCode: result.exitCode,
369
+ error: result.error,
370
+ duration: Date.now() - startTime,
371
+ };
372
+ }
373
+ else {
374
+ const result = await taskExecute(storage, repo, prepared.taskHash, prepared.inputHashes, execOptions);
375
+ return {
376
+ state: result.state,
377
+ cached: result.cached,
378
+ outputHash: result.outputHash ?? undefined,
379
+ exitCode: result.exitCode ?? undefined,
380
+ error: result.error ?? undefined,
381
+ duration: Date.now() - startTime,
382
+ };
383
+ }
384
+ }
385
+ /**
386
+ * Build partial results for abort error.
387
+ */
388
+ buildPartialResults(state) {
389
+ const results = [];
390
+ for (const [name, taskState] of state.tasks) {
391
+ if (taskState.status === 'completed' || taskState.status === 'failed' || taskState.status === 'skipped') {
392
+ // Extract values from Option types
393
+ const cached = taskState.cached.type === 'some' ? taskState.cached.value : false;
394
+ const error = taskState.error.type === 'some' ? taskState.error.value : undefined;
395
+ const exitCode = taskState.exitCode.type === 'some' ? Number(taskState.exitCode.value) : undefined;
396
+ const duration = taskState.duration.type === 'some' ? Number(taskState.duration.value) : 0;
397
+ results.push({
398
+ name,
399
+ cached,
400
+ state: taskState.status === 'completed' ? 'success' : taskState.status,
401
+ error,
402
+ exitCode,
403
+ duration,
404
+ });
405
+ }
406
+ }
407
+ return results;
408
+ }
409
+ /**
410
+ * Generate unique key for an execution.
411
+ */
412
+ executionKey(repo, workspace, id) {
413
+ return `${repo}::${workspace}:${id}`;
414
+ }
415
+ }
416
+ //# sourceMappingURL=LocalOrchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalOrchestrator.js","sourceRoot":"","sources":["../../../../src/dataflow/orchestrator/LocalOrchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Orchestrator implementations for dataflow execution.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ export * from './interfaces.js';
11
+ export * from './LocalOrchestrator.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/dataflow/orchestrator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Orchestrator implementations for dataflow execution.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ export * from './interfaces.js';
11
+ export * from './LocalOrchestrator.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/dataflow/orchestrator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Orchestrator interface for dataflow execution.
7
+ *
8
+ * Abstracts the execution loop, enabling:
9
+ * - LocalOrchestrator: In-process async loop with mutex
10
+ * - StepFunctionsOrchestrator: AWS Step Functions state machine (in e3-aws)
11
+ */
12
+ import type { StorageBackend, LockHandle } from '../../storage/interfaces.js';
13
+ import type { TaskRunner } from '../../execution/interfaces.js';
14
+ import type { DataflowExecutionState, ExecutionEvent, FinalizeResult } from '../types.js';
15
+ /**
16
+ * Handle to a running dataflow execution.
17
+ */
18
+ export interface ExecutionHandle {
19
+ /** Unique execution ID (string for UUID support) */
20
+ readonly id: string;
21
+ /** Repository identifier */
22
+ readonly repo: string;
23
+ /** Workspace name */
24
+ readonly workspace: string;
25
+ }
26
+ /**
27
+ * Status of a dataflow execution (summary view).
28
+ */
29
+ export interface ExecutionStatus {
30
+ /** Execution ID (string for UUID support) */
31
+ id: string;
32
+ /** Current state */
33
+ state: 'running' | 'completed' | 'failed' | 'cancelled';
34
+ /** Tasks that have completed successfully */
35
+ completed: string[];
36
+ /** Tasks currently running */
37
+ running: string[];
38
+ /** Tasks waiting to run */
39
+ pending: string[];
40
+ /** Tasks that failed */
41
+ failed: string[];
42
+ /** Tasks skipped due to upstream failure */
43
+ skipped: string[];
44
+ /** Error message if state is 'failed' */
45
+ error?: string;
46
+ /** Start time */
47
+ startedAt: Date;
48
+ /** Completion time */
49
+ completedAt?: Date;
50
+ }
51
+ /**
52
+ * Options for starting a dataflow execution.
53
+ */
54
+ export interface OrchestratorStartOptions {
55
+ /** Maximum concurrent task executions (default: 4) */
56
+ concurrency?: number;
57
+ /** Force re-execution even if cached (default: false) */
58
+ force?: boolean;
59
+ /** Filter to run only specific task(s) by exact name */
60
+ filter?: string;
61
+ /** AbortSignal for cancellation */
62
+ signal?: AbortSignal;
63
+ /** External lock handle (if caller manages locking) */
64
+ lock?: LockHandle;
65
+ /** Task runner for executing individual tasks */
66
+ runner?: TaskRunner;
67
+ /** Callback when a task starts */
68
+ onTaskStart?: (name: string) => void;
69
+ /** Callback when a task completes */
70
+ onTaskComplete?: (result: TaskCompletedCallback) => void;
71
+ /** Callback for task stdout */
72
+ onStdout?: (taskName: string, data: string) => void;
73
+ /** Callback for task stderr */
74
+ onStderr?: (taskName: string, data: string) => void;
75
+ }
76
+ /**
77
+ * Callback data for task completion.
78
+ */
79
+ export interface TaskCompletedCallback {
80
+ /** Task name */
81
+ name: string;
82
+ /** Whether the task was cached */
83
+ cached: boolean;
84
+ /** Final state */
85
+ state: 'success' | 'failed' | 'error' | 'skipped';
86
+ /** Error message if state is 'error' */
87
+ error?: string;
88
+ /** Exit code if state is 'failed' */
89
+ exitCode?: number;
90
+ /** Duration in milliseconds */
91
+ duration: number;
92
+ }
93
+ /**
94
+ * Interface for dataflow orchestration.
95
+ *
96
+ * Orchestrators manage the execution loop, calling step functions in sequence
97
+ * and handling concurrency, cancellation, and state persistence.
98
+ */
99
+ export interface DataflowOrchestrator {
100
+ /**
101
+ * Start a dataflow execution.
102
+ *
103
+ * Acquires the workspace lock (if not provided) and begins execution.
104
+ * Returns immediately with a handle that can be used to monitor progress.
105
+ *
106
+ * @param storage - Storage backend
107
+ * @param repo - Repository identifier
108
+ * @param workspace - Workspace name
109
+ * @param options - Execution options
110
+ * @returns Execution handle
111
+ *
112
+ * @throws {WorkspaceNotFoundError} If workspace doesn't exist
113
+ * @throws {WorkspaceNotDeployedError} If workspace has no package deployed
114
+ * @throws {WorkspaceLockError} If workspace is locked by another process
115
+ */
116
+ start(storage: StorageBackend, repo: string, workspace: string, options?: OrchestratorStartOptions): Promise<ExecutionHandle>;
117
+ /**
118
+ * Wait for a dataflow execution to complete.
119
+ *
120
+ * Blocks until the execution completes (success, failure, or cancellation).
121
+ *
122
+ * @param handle - Execution handle from start()
123
+ * @returns Final result
124
+ */
125
+ wait(handle: ExecutionHandle): Promise<FinalizeResult>;
126
+ /**
127
+ * Get the current status of a dataflow execution.
128
+ *
129
+ * @param handle - Execution handle from start()
130
+ * @returns Current status
131
+ */
132
+ getStatus(handle: ExecutionHandle): Promise<ExecutionStatus>;
133
+ /**
134
+ * Cancel a running dataflow execution.
135
+ *
136
+ * Running tasks will be terminated. The execution will transition to
137
+ * 'cancelled' state.
138
+ *
139
+ * @param handle - Execution handle from start()
140
+ */
141
+ cancel(handle: ExecutionHandle): Promise<void>;
142
+ /**
143
+ * Get events for a dataflow execution since a given sequence number.
144
+ *
145
+ * Used for polling/watching execution progress.
146
+ *
147
+ * @param handle - Execution handle from start()
148
+ * @param sinceSeq - Only return events with seq > sinceSeq
149
+ * @returns Array of events in sequence order
150
+ */
151
+ getEvents(handle: ExecutionHandle, sinceSeq: number): Promise<ExecutionEvent[]>;
152
+ }
153
+ /**
154
+ * Convert execution state to status summary.
155
+ */
156
+ export declare function stateToStatus(state: DataflowExecutionState): ExecutionStatus;
157
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/dataflow/orchestrator/interfaces.ts"],"names":[],"mappings":"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"}