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.
- package/LICENSE +21 -0
- package/README.md +455 -0
- package/SECURITY.md +54 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +181 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +22 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +81 -0
- package/dist/context.js.map +1 -0
- package/dist/coordination.d.ts +19 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +267 -0
- package/dist/coordination.js.map +1 -0
- package/dist/execution-failure.d.ts +42 -0
- package/dist/execution-failure.d.ts.map +1 -0
- package/dist/execution-failure.js +90 -0
- package/dist/execution-failure.js.map +1 -0
- package/dist/extension.d.ts +8 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +641 -0
- package/dist/extension.js.map +1 -0
- package/dist/graph.d.ts +44 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +292 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +9 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +66 -0
- package/dist/json.js.map +1 -0
- package/dist/orchestrator.d.ts +15 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +473 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/output.d.ts +61 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +248 -0
- package/dist/output.js.map +1 -0
- package/dist/pi-subprocess.d.ts +92 -0
- package/dist/pi-subprocess.d.ts.map +1 -0
- package/dist/pi-subprocess.js +897 -0
- package/dist/pi-subprocess.js.map +1 -0
- package/dist/run.d.ts +89 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +562 -0
- package/dist/run.js.map +1 -0
- package/dist/store.d.ts +331 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +1993 -0
- package/dist/store.js.map +1 -0
- package/dist/usage.d.ts +35 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +88 -0
- package/dist/usage.js.map +1 -0
- package/docs/DECISIONS.md +221 -0
- package/docs/DESIGN.md +392 -0
- package/docs/NEXT.md +229 -0
- package/docs/PLAN.md +203 -0
- package/docs/worker-graph.example.json +12 -0
- package/extensions/index.ts +1 -0
- package/extensions/tsconfig.json +11 -0
- 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
|
package/dist/run.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|