pi-worker-graph 0.1.0-dev.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +455 -0
  3. package/SECURITY.md +54 -0
  4. package/dist/config.d.ts +25 -0
  5. package/dist/config.d.ts.map +1 -0
  6. package/dist/config.js +181 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/context.d.ts +22 -0
  9. package/dist/context.d.ts.map +1 -0
  10. package/dist/context.js +81 -0
  11. package/dist/context.js.map +1 -0
  12. package/dist/coordination.d.ts +19 -0
  13. package/dist/coordination.d.ts.map +1 -0
  14. package/dist/coordination.js +267 -0
  15. package/dist/coordination.js.map +1 -0
  16. package/dist/execution-failure.d.ts +42 -0
  17. package/dist/execution-failure.d.ts.map +1 -0
  18. package/dist/execution-failure.js +90 -0
  19. package/dist/execution-failure.js.map +1 -0
  20. package/dist/extension.d.ts +8 -0
  21. package/dist/extension.d.ts.map +1 -0
  22. package/dist/extension.js +641 -0
  23. package/dist/extension.js.map +1 -0
  24. package/dist/graph.d.ts +44 -0
  25. package/dist/graph.d.ts.map +1 -0
  26. package/dist/graph.js +292 -0
  27. package/dist/graph.js.map +1 -0
  28. package/dist/index.d.ts +16 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +8 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/json.d.ts +9 -0
  33. package/dist/json.d.ts.map +1 -0
  34. package/dist/json.js +66 -0
  35. package/dist/json.js.map +1 -0
  36. package/dist/orchestrator.d.ts +15 -0
  37. package/dist/orchestrator.d.ts.map +1 -0
  38. package/dist/orchestrator.js +473 -0
  39. package/dist/orchestrator.js.map +1 -0
  40. package/dist/output.d.ts +61 -0
  41. package/dist/output.d.ts.map +1 -0
  42. package/dist/output.js +248 -0
  43. package/dist/output.js.map +1 -0
  44. package/dist/pi-subprocess.d.ts +92 -0
  45. package/dist/pi-subprocess.d.ts.map +1 -0
  46. package/dist/pi-subprocess.js +897 -0
  47. package/dist/pi-subprocess.js.map +1 -0
  48. package/dist/run.d.ts +89 -0
  49. package/dist/run.d.ts.map +1 -0
  50. package/dist/run.js +562 -0
  51. package/dist/run.js.map +1 -0
  52. package/dist/store.d.ts +331 -0
  53. package/dist/store.d.ts.map +1 -0
  54. package/dist/store.js +1993 -0
  55. package/dist/store.js.map +1 -0
  56. package/dist/usage.d.ts +35 -0
  57. package/dist/usage.d.ts.map +1 -0
  58. package/dist/usage.js +88 -0
  59. package/dist/usage.js.map +1 -0
  60. package/docs/DECISIONS.md +221 -0
  61. package/docs/DESIGN.md +392 -0
  62. package/docs/NEXT.md +229 -0
  63. package/docs/PLAN.md +203 -0
  64. package/docs/worker-graph.example.json +12 -0
  65. package/extensions/index.ts +1 -0
  66. package/extensions/tsconfig.json +11 -0
  67. package/package.json +66 -0
package/dist/run.js ADDED
@@ -0,0 +1,562 @@
1
+ import { resolve } from "node:path";
2
+ import { PrerequisiteContextOverflowError, serializePrerequisiteReports, } from "./context.js";
3
+ import { taskExecutionDiagnostics, taskExecutionFailureTaskId, taskExecutionUsage, } from "./execution-failure.js";
4
+ import { createInitialState, isGraphComplete, normalizeGraph, readyFrontier, setNodeStatus, settleBlocked, } from "./graph.js";
5
+ import { isJsonValue, jsonByteLength } from "./json.js";
6
+ import { parseNodeArtifact, parseNodeDiagnostics, parseNodeOutput, } from "./output.js";
7
+ import { acquireRunOwnership, createRun, publishNodeOutput, RUN_STORE_DEFAULT_MAX_RUNS, RUN_STORE_MAX_RUNS, RunStoreError, readNodeOutput, readNodeState, readRun, recoverRunMutationLock, releaseRunOwnership, writeNodeState, } from "./store.js";
8
+ import { parseTaskUsage } from "./usage.js";
9
+ /**
10
+ * Attempts the parent makes at one store mutation when the run mutation lock
11
+ * is busy. Workers take the same lock to publish coordination records, so a
12
+ * parent mutation has to outlast ordinary contention; each attempt waits out
13
+ * the store's own lock deadline before giving up.
14
+ */
15
+ const MUTATION_LOCK_ATTEMPTS = 4;
16
+ export const RUN_GRAPH_LIMITS = Object.freeze({
17
+ maxTasks: 32,
18
+ maxDependenciesPerTask: 8,
19
+ maxConcurrency: 8,
20
+ maxPayloadBytes: 64 * 1024,
21
+ maxOutputBytes: 128 * 1024,
22
+ maxPrerequisiteBytes: 256 * 1024,
23
+ maxTaskRuntimeMs: 10 * 60 * 1000,
24
+ maxExecutorCleanupMs: 5_000,
25
+ maxRetainedRuns: RUN_STORE_MAX_RUNS,
26
+ });
27
+ export class RunGraphValidationError extends Error {
28
+ issues;
29
+ constructor(issues) {
30
+ super(`Invalid graph run: ${issues.map((issue) => issue.message).join("; ")}`);
31
+ this.name = "RunGraphValidationError";
32
+ this.issues = Object.freeze([...issues]);
33
+ }
34
+ }
35
+ function validateRun(graph, workingDirectory, taskTimeoutMs, maxRetainedRuns) {
36
+ const issues = [];
37
+ if (workingDirectory.trim().length === 0) {
38
+ issues.push({
39
+ code: "invalid_working_directory",
40
+ message: "Working directory must not be empty",
41
+ });
42
+ }
43
+ if (!Number.isInteger(taskTimeoutMs) ||
44
+ taskTimeoutMs <= 0 ||
45
+ taskTimeoutMs > RUN_GRAPH_LIMITS.maxTaskRuntimeMs) {
46
+ issues.push({
47
+ code: "invalid_task_timeout",
48
+ message: `Task timeout must be a positive integer no greater than ${RUN_GRAPH_LIMITS.maxTaskRuntimeMs}`,
49
+ });
50
+ }
51
+ if (!Number.isInteger(maxRetainedRuns) ||
52
+ maxRetainedRuns <= 0 ||
53
+ maxRetainedRuns > RUN_GRAPH_LIMITS.maxRetainedRuns) {
54
+ issues.push({
55
+ code: "invalid_retention_limit",
56
+ message: `Retained run count must be a positive integer no greater than ${RUN_GRAPH_LIMITS.maxRetainedRuns}`,
57
+ });
58
+ }
59
+ if (graph.tasks.length > RUN_GRAPH_LIMITS.maxTasks) {
60
+ issues.push({
61
+ code: "task_limit",
62
+ message: `Graph has ${graph.tasks.length} tasks; limit is ${RUN_GRAPH_LIMITS.maxTasks}`,
63
+ });
64
+ }
65
+ if (graph.concurrency !== undefined &&
66
+ graph.concurrency > RUN_GRAPH_LIMITS.maxConcurrency) {
67
+ issues.push({
68
+ code: "concurrency_limit",
69
+ message: `Concurrency ${graph.concurrency} exceeds limit ${RUN_GRAPH_LIMITS.maxConcurrency}`,
70
+ });
71
+ }
72
+ if (graph.tasks.length > RUN_GRAPH_LIMITS.maxTasks)
73
+ return issues;
74
+ for (const task of graph.tasks) {
75
+ if ((task.needs?.length ?? 0) > RUN_GRAPH_LIMITS.maxDependenciesPerTask) {
76
+ issues.push({
77
+ code: "dependency_limit",
78
+ taskId: task.id,
79
+ message: `Task ${JSON.stringify(task.id)} has too many dependencies`,
80
+ });
81
+ }
82
+ if (task.payload === undefined)
83
+ continue;
84
+ if (!isJsonValue(task.payload)) {
85
+ issues.push({
86
+ code: "invalid_payload",
87
+ taskId: task.id,
88
+ message: `Task ${JSON.stringify(task.id)} payload is not a JSON value`,
89
+ });
90
+ continue;
91
+ }
92
+ try {
93
+ if (jsonByteLength(task.payload) > RUN_GRAPH_LIMITS.maxPayloadBytes) {
94
+ issues.push({
95
+ code: "payload_limit",
96
+ taskId: task.id,
97
+ message: `Task ${JSON.stringify(task.id)} payload exceeds ${RUN_GRAPH_LIMITS.maxPayloadBytes} bytes`,
98
+ });
99
+ }
100
+ }
101
+ catch {
102
+ issues.push({
103
+ code: "invalid_payload",
104
+ taskId: task.id,
105
+ message: `Task ${JSON.stringify(task.id)} payload cannot be serialized safely`,
106
+ });
107
+ }
108
+ }
109
+ return issues;
110
+ }
111
+ /**
112
+ * Runs the executor's own whole-graph validation and normalizes its rejection
113
+ * into the same structured error the runtime bounds use. Only allowlisted
114
+ * adapter diagnostics are surfaced, so a rejected graph cannot leak adapter
115
+ * internals into the caller's error path.
116
+ */
117
+ function validateAdapterTasks(executor, tasks) {
118
+ if (!executor.validateTasks)
119
+ return;
120
+ try {
121
+ executor.validateTasks(tasks);
122
+ }
123
+ catch (error) {
124
+ const diagnostics = taskExecutionDiagnostics(error);
125
+ if (diagnostics === undefined)
126
+ throw error;
127
+ const taskId = taskExecutionFailureTaskId(error);
128
+ throw new RunGraphValidationError([
129
+ {
130
+ code: "adapter_validation",
131
+ message: taskId === undefined
132
+ ? diagnostics
133
+ : `Task ${JSON.stringify(taskId)} rejected by the executor: ${diagnostics}`,
134
+ ...(taskId === undefined ? {} : { taskId }),
135
+ },
136
+ ]);
137
+ }
138
+ }
139
+ function invalidExecutorResult(taskId) {
140
+ return {
141
+ taskId,
142
+ status: "failed",
143
+ diagnostics: "Task executor returned an invalid or oversized result",
144
+ };
145
+ }
146
+ function validateExecutorResult(taskId, value) {
147
+ try {
148
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
149
+ return invalidExecutorResult(taskId);
150
+ }
151
+ const prototype = Object.getPrototypeOf(value);
152
+ if (prototype !== Object.prototype && prototype !== null) {
153
+ return invalidExecutorResult(taskId);
154
+ }
155
+ const keys = Reflect.ownKeys(value);
156
+ if (keys.length === 0 ||
157
+ keys.length > 4 ||
158
+ !keys.includes("output") ||
159
+ !keys.every((key) => typeof key === "string" &&
160
+ (key === "output" ||
161
+ key === "artifact" ||
162
+ key === "usage" ||
163
+ key === "diagnostics"))) {
164
+ return invalidExecutorResult(taskId);
165
+ }
166
+ const outputDescriptor = Object.getOwnPropertyDescriptor(value, "output");
167
+ const artifactDescriptor = Object.getOwnPropertyDescriptor(value, "artifact");
168
+ const usageDescriptor = Object.getOwnPropertyDescriptor(value, "usage");
169
+ const diagnosticsDescriptor = Object.getOwnPropertyDescriptor(value, "diagnostics");
170
+ if (outputDescriptor === undefined ||
171
+ !outputDescriptor.enumerable ||
172
+ !("value" in outputDescriptor) ||
173
+ (artifactDescriptor !== undefined &&
174
+ (!artifactDescriptor.enumerable || !("value" in artifactDescriptor))) ||
175
+ (usageDescriptor !== undefined &&
176
+ (!usageDescriptor.enumerable || !("value" in usageDescriptor))) ||
177
+ (diagnosticsDescriptor !== undefined &&
178
+ (!diagnosticsDescriptor.enumerable ||
179
+ !("value" in diagnosticsDescriptor)))) {
180
+ return invalidExecutorResult(taskId);
181
+ }
182
+ const output = parseNodeOutput(outputDescriptor.value);
183
+ const artifact = parseNodeArtifact(artifactDescriptor?.value);
184
+ const usage = parseTaskUsage(usageDescriptor?.value);
185
+ const diagnostics = parseNodeDiagnostics(diagnosticsDescriptor?.value);
186
+ // Only what a dependent task and the parent are handed is weighed against
187
+ // this limit. `parseNodeArtifact` bounds the artifact separately, because
188
+ // it reaches neither.
189
+ const reported = {
190
+ output,
191
+ ...(diagnostics === undefined ? {} : { diagnostics }),
192
+ };
193
+ if (jsonByteLength(reported) >
194
+ RUN_GRAPH_LIMITS.maxOutputBytes) {
195
+ return invalidExecutorResult(taskId);
196
+ }
197
+ const boundedValue = {
198
+ ...reported,
199
+ ...(artifact === undefined ? {} : { artifact }),
200
+ ...(usage === undefined ? {} : { usage }),
201
+ };
202
+ return output.blockers.length > 0
203
+ ? {
204
+ taskId,
205
+ status: "failed",
206
+ ...boundedValue,
207
+ }
208
+ : {
209
+ taskId,
210
+ status: "succeeded",
211
+ ...boundedValue,
212
+ };
213
+ }
214
+ catch {
215
+ return invalidExecutorResult(taskId);
216
+ }
217
+ }
218
+ /**
219
+ * A timeout and an abort are decided by the runner, which discards whatever
220
+ * the executor eventually settles with. The spend is still real, so usage the
221
+ * executor did report is carried onto the runner's own outcome.
222
+ */
223
+ function withUsage(result, usage) {
224
+ return usage === undefined ? result : { ...result, usage };
225
+ }
226
+ function executeTask(executor, input, parentSignal, timeoutMs) {
227
+ return new Promise((resolveTask) => {
228
+ const controller = new AbortController();
229
+ const executionInput = {
230
+ ...input,
231
+ signal: controller.signal,
232
+ };
233
+ let settled = false;
234
+ let timedOut = false;
235
+ let abortResult;
236
+ let cleanupTimeout;
237
+ const parentAbort = () => controller.abort();
238
+ const timeout = setTimeout(() => {
239
+ timedOut = true;
240
+ controller.abort();
241
+ }, timeoutMs);
242
+ const settle = (result) => {
243
+ if (settled)
244
+ return;
245
+ settled = true;
246
+ clearTimeout(timeout);
247
+ if (cleanupTimeout)
248
+ clearTimeout(cleanupTimeout);
249
+ parentSignal.removeEventListener("abort", parentAbort);
250
+ controller.signal.removeEventListener("abort", abort);
251
+ resolveTask(result);
252
+ };
253
+ const abort = () => {
254
+ const result = timedOut
255
+ ? {
256
+ taskId: input.taskId,
257
+ status: "failed",
258
+ diagnostics: "Task executor timed out",
259
+ }
260
+ : {
261
+ taskId: input.taskId,
262
+ status: "aborted",
263
+ diagnostics: "Graph run was aborted",
264
+ };
265
+ abortResult = result;
266
+ cleanupTimeout = setTimeout(() => settle(result), RUN_GRAPH_LIMITS.maxExecutorCleanupMs);
267
+ };
268
+ controller.signal.addEventListener("abort", abort, { once: true });
269
+ if (parentSignal.aborted) {
270
+ parentAbort();
271
+ if (abortResult)
272
+ settle(abortResult);
273
+ return;
274
+ }
275
+ parentSignal.addEventListener("abort", parentAbort, { once: true });
276
+ Promise.resolve()
277
+ .then(() => executor(executionInput))
278
+ .then((result) => {
279
+ const completed = validateExecutorResult(input.taskId, result);
280
+ settle(abortResult === undefined
281
+ ? completed
282
+ : withUsage(abortResult, completed.usage));
283
+ }, (error) => {
284
+ settle(withUsage(abortResult ?? {
285
+ taskId: input.taskId,
286
+ status: "failed",
287
+ diagnostics: taskExecutionDiagnostics(error) ?? "Task executor failed",
288
+ }, taskExecutionUsage(error)));
289
+ });
290
+ });
291
+ }
292
+ async function prerequisiteOutputs(stateRoot, manifest, taskId) {
293
+ const task = manifest.graph.tasks.find((candidate) => candidate.id === taskId);
294
+ if (!task)
295
+ throw new Error(`Unknown task ${JSON.stringify(taskId)}`);
296
+ return Promise.all(task.needs.map(async (dependency) => {
297
+ const record = await readNodeOutput(stateRoot, manifest.runId, dependency);
298
+ if (record.status !== "succeeded") {
299
+ throw new Error(`Prerequisite ${JSON.stringify(dependency)} did not succeed`);
300
+ }
301
+ return {
302
+ taskId: dependency,
303
+ output: record.output,
304
+ };
305
+ }));
306
+ }
307
+ function createMutationGuard(stateRoot, ownership, isHolderFinished) {
308
+ return async (mutate) => {
309
+ for (let attempt = 1;; attempt += 1) {
310
+ try {
311
+ return await mutate();
312
+ }
313
+ catch (error) {
314
+ if (!(error instanceof RunStoreError) ||
315
+ error.code !== "locked" ||
316
+ attempt >= MUTATION_LOCK_ATTEMPTS) {
317
+ throw error;
318
+ }
319
+ await recoverRunMutationLock(stateRoot, ownership, isHolderFinished);
320
+ }
321
+ }
322
+ };
323
+ }
324
+ async function settlePersistedBlocked(stateRoot, runId, graph, state, ownership, guard) {
325
+ const settled = settleBlocked(graph, state);
326
+ for (const task of graph.tasks) {
327
+ if (state.get(task.id) === "pending" &&
328
+ settled.get(task.id) === "blocked") {
329
+ await guard(() => writeNodeState(stateRoot, runId, task.id, "blocked", ownership));
330
+ }
331
+ }
332
+ return settled;
333
+ }
334
+ async function persistCompletion(stateRoot, runId, completion, ownership, guard) {
335
+ const output = completion.status === "succeeded"
336
+ ? {
337
+ taskId: completion.taskId,
338
+ status: completion.status,
339
+ output: completion.output,
340
+ ...(completion.artifact === undefined
341
+ ? {}
342
+ : { artifact: completion.artifact }),
343
+ ...(completion.usage === undefined
344
+ ? {}
345
+ : { usage: completion.usage }),
346
+ ...(completion.diagnostics === undefined
347
+ ? {}
348
+ : { diagnostics: completion.diagnostics }),
349
+ }
350
+ : completion.status === "failed"
351
+ ? {
352
+ taskId: completion.taskId,
353
+ status: completion.status,
354
+ ...(completion.output === undefined
355
+ ? {}
356
+ : { output: completion.output }),
357
+ ...(completion.artifact === undefined
358
+ ? {}
359
+ : { artifact: completion.artifact }),
360
+ ...(completion.usage === undefined
361
+ ? {}
362
+ : { usage: completion.usage }),
363
+ ...(completion.diagnostics === undefined
364
+ ? {}
365
+ : { diagnostics: completion.diagnostics }),
366
+ }
367
+ : {
368
+ taskId: completion.taskId,
369
+ status: completion.status,
370
+ ...(completion.usage === undefined
371
+ ? {}
372
+ : { usage: completion.usage }),
373
+ ...(completion.diagnostics === undefined
374
+ ? {}
375
+ : { diagnostics: completion.diagnostics }),
376
+ };
377
+ // Contention is detected before either record is written, so a guarded
378
+ // retry never republishes an immutable output it already stored.
379
+ await guard(() => publishNodeOutput(stateRoot, runId, output, ownership));
380
+ await guard(() => writeNodeState(stateRoot, runId, completion.taskId, completion.status, ownership));
381
+ }
382
+ async function abortPending(stateRoot, runId, graph, initialState, ownership, guard) {
383
+ let state = await settlePersistedBlocked(stateRoot, runId, graph, initialState, ownership, guard);
384
+ while (!isGraphComplete(graph, state)) {
385
+ const ready = readyFrontier(graph, state);
386
+ if (ready.length === 0) {
387
+ throw new Error("Graph has pending tasks but no abortable frontier");
388
+ }
389
+ for (const taskId of ready) {
390
+ await persistCompletion(stateRoot, runId, {
391
+ taskId,
392
+ status: "aborted",
393
+ diagnostics: "Graph run was aborted before task execution",
394
+ }, ownership, guard);
395
+ state = setNodeStatus(graph, state, taskId, "aborted");
396
+ }
397
+ state = await settlePersistedBlocked(stateRoot, runId, graph, state, ownership, guard);
398
+ }
399
+ return state;
400
+ }
401
+ /**
402
+ * Ends the parent's hold on a run once every task has settled, and reports the
403
+ * first failure rather than throwing.
404
+ *
405
+ * Ownership is released even when the mutation lock could not be recovered
406
+ * first: a run left owned admits no further work at all. In practice both
407
+ * steps fail together, because each reads the same owner record and the
408
+ * release takes the lock the recovery was meant to clear — so this orders the
409
+ * attempts and picks the more informative failure rather than rescuing a run
410
+ * whose state has already diverged.
411
+ */
412
+ async function releaseRunHold(stateRoot, ownership) {
413
+ let failure;
414
+ try {
415
+ await recoverRunMutationLock(stateRoot, ownership);
416
+ }
417
+ catch (error) {
418
+ failure = error;
419
+ }
420
+ try {
421
+ await releaseRunOwnership(stateRoot, ownership);
422
+ }
423
+ catch (error) {
424
+ failure ??= error;
425
+ }
426
+ return failure;
427
+ }
428
+ function aggregateStatus(nodes) {
429
+ if (nodes.some((node) => node.status === "aborted"))
430
+ return "aborted";
431
+ if (nodes.some((node) => node.status !== "succeeded"))
432
+ return "failed";
433
+ return "succeeded";
434
+ }
435
+ export async function runGraph(options) {
436
+ const taskTimeoutMs = options.taskTimeoutMs ?? RUN_GRAPH_LIMITS.maxTaskRuntimeMs;
437
+ const maxRetainedRuns = options.maxRetainedRuns ?? RUN_STORE_DEFAULT_MAX_RUNS;
438
+ const issues = validateRun(options.graph, options.workingDirectory, taskTimeoutMs, maxRetainedRuns);
439
+ if (issues.length > 0)
440
+ throw new RunGraphValidationError(issues);
441
+ const graph = normalizeGraph(options.graph);
442
+ validateAdapterTasks(options.executor, graph.tasks);
443
+ const workingDirectory = resolve(options.workingDirectory);
444
+ const created = await createRun(options.stateRoot, graph, maxRetainedRuns);
445
+ const manifest = await readRun(options.stateRoot, created.runId);
446
+ const persistedGraph = normalizeGraph({
447
+ tasks: manifest.graph.tasks.map((task) => ({
448
+ id: task.id,
449
+ needs: task.needs,
450
+ ...(task.payload === undefined ? {} : { payload: task.payload }),
451
+ })),
452
+ ...(manifest.graph.concurrency === undefined
453
+ ? {}
454
+ : { concurrency: manifest.graph.concurrency }),
455
+ });
456
+ const ownership = await acquireRunOwnership(options.stateRoot, created.runId);
457
+ const concurrency = persistedGraph.concurrency ?? 1;
458
+ const runController = new AbortController();
459
+ const abortRun = () => runController.abort();
460
+ if (options.signal?.aborted)
461
+ abortRun();
462
+ else
463
+ options.signal?.addEventListener("abort", abortRun, { once: true });
464
+ const signal = runController.signal;
465
+ const running = new Map();
466
+ let state = createInitialState(persistedGraph);
467
+ let result;
468
+ let cleanupFailure;
469
+ const underMutationLock = createMutationGuard(options.stateRoot, ownership,
470
+ // Answered only for a task of this graph that is no longer running, so a
471
+ // lock a live worker still holds is waited out rather than taken away.
472
+ (taskId) => !running.has(taskId) &&
473
+ persistedGraph.tasks.some((task) => task.id === taskId));
474
+ try {
475
+ while (!isGraphComplete(persistedGraph, state)) {
476
+ if (!signal.aborted) {
477
+ const available = concurrency - running.size;
478
+ const ready = readyFrontier(persistedGraph, state).slice(0, available);
479
+ for (const taskId of ready) {
480
+ if (signal.aborted)
481
+ break;
482
+ const task = manifest.graph.tasks.find((candidate) => candidate.id === taskId);
483
+ if (!task)
484
+ throw new Error(`Unknown task ${JSON.stringify(taskId)}`);
485
+ const prerequisites = await prerequisiteOutputs(options.stateRoot, manifest, taskId);
486
+ let prerequisiteContext;
487
+ let contextTooLarge = false;
488
+ try {
489
+ prerequisiteContext = serializePrerequisiteReports(prerequisites, RUN_GRAPH_LIMITS.maxPrerequisiteBytes).text;
490
+ }
491
+ catch (error) {
492
+ if (!(error instanceof PrerequisiteContextOverflowError)) {
493
+ throw error;
494
+ }
495
+ contextTooLarge = true;
496
+ }
497
+ await underMutationLock(() => writeNodeState(options.stateRoot, manifest.runId, taskId, "running", ownership));
498
+ state = setNodeStatus(persistedGraph, state, taskId, "running");
499
+ running.set(taskId, signal.aborted
500
+ ? Promise.resolve({
501
+ taskId,
502
+ status: "aborted",
503
+ diagnostics: "Graph run was aborted",
504
+ })
505
+ : contextTooLarge
506
+ ? Promise.resolve({
507
+ taskId,
508
+ status: "failed",
509
+ diagnostics: "Serialized direct-prerequisite context exceeds limit",
510
+ })
511
+ : executeTask(options.executor, {
512
+ runId: manifest.runId,
513
+ taskId,
514
+ payload: task.payload,
515
+ workingDirectory,
516
+ prerequisites,
517
+ prerequisiteContext: prerequisiteContext ?? "",
518
+ runStateRoot: options.stateRoot,
519
+ }, signal, taskTimeoutMs));
520
+ }
521
+ }
522
+ if (running.size === 0) {
523
+ if (signal.aborted) {
524
+ state = await abortPending(options.stateRoot, manifest.runId, persistedGraph, state, ownership, underMutationLock);
525
+ break;
526
+ }
527
+ state = await settlePersistedBlocked(options.stateRoot, manifest.runId, persistedGraph, state, ownership, underMutationLock);
528
+ if (!isGraphComplete(persistedGraph, state)) {
529
+ throw new Error("Graph made no scheduling progress");
530
+ }
531
+ break;
532
+ }
533
+ const completion = await Promise.race(running.values());
534
+ running.delete(completion.taskId);
535
+ await persistCompletion(options.stateRoot, manifest.runId, completion, ownership, underMutationLock);
536
+ state = setNodeStatus(persistedGraph, state, completion.taskId, completion.status);
537
+ state = await settlePersistedBlocked(options.stateRoot, manifest.runId, persistedGraph, state, ownership, underMutationLock);
538
+ }
539
+ const nodes = await Promise.all(persistedGraph.tasks.map((task) => readNodeState(options.stateRoot, manifest.runId, task.id)));
540
+ result = {
541
+ runId: manifest.runId,
542
+ status: aggregateStatus(nodes),
543
+ nodes,
544
+ };
545
+ }
546
+ catch (error) {
547
+ abortRun();
548
+ await Promise.allSettled(running.values());
549
+ throw error;
550
+ }
551
+ finally {
552
+ options.signal?.removeEventListener("abort", abortRun);
553
+ cleanupFailure = await releaseRunHold(options.stateRoot, ownership);
554
+ }
555
+ // Reached only when the run itself succeeded, because the catch above always
556
+ // rethrows. Cleanup therefore never replaces the error that ended a run,
557
+ // which says far more than a failure to tidy up after it.
558
+ if (cleanupFailure !== undefined)
559
+ throw cleanupFailure;
560
+ return result;
561
+ }
562
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}