@osolmaz/pi-workflows 0.3.0 → 0.4.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/README.md +3 -2
- package/dist/builtins/catalog.d.ts +2 -0
- package/dist/builtins/catalog.js +22 -0
- package/dist/builtins/catalog.js.map +1 -0
- package/dist/builtins/monitor.workflow.js +17 -1
- package/dist/builtins/monitor.workflow.js.map +1 -1
- package/dist/controllers/sqlite.d.ts +27 -4
- package/dist/controllers/sqlite.js +83 -5
- package/dist/controllers/sqlite.js.map +1 -1
- package/dist/controllers/workflow-engine-scheduler.d.ts +2 -2
- package/dist/controllers/workflow-engine-scheduler.js +3 -1
- package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
- package/dist/extension/executor.d.ts +3 -0
- package/dist/extension/executor.js +11 -1
- package/dist/extension/executor.js.map +1 -1
- package/dist/extension/index.js +84 -29
- package/dist/extension/index.js.map +1 -1
- package/dist/host/runner.d.ts +1 -0
- package/dist/host/runner.js +48 -19
- package/dist/host/runner.js.map +1 -1
- package/dist/workflows/catalog.d.ts +43 -0
- package/dist/workflows/catalog.js +79 -0
- package/dist/workflows/catalog.js.map +1 -0
- package/dist/workflows/engine.d.ts +5 -6
- package/dist/workflows/engine.js +71 -33
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/index.d.ts +2 -2
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/loader.d.ts +18 -16
- package/dist/workflows/loader.js +58 -23
- package/dist/workflows/loader.js.map +1 -1
- package/dist/workflows/migrate-sources.d.ts +41 -0
- package/dist/workflows/migrate-sources.js +129 -0
- package/dist/workflows/migrate-sources.js.map +1 -0
- package/dist/workflows/schema.js +2 -1
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/store.js +2 -2
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/types.d.ts +18 -4
- package/docs/development.md +5 -3
- package/docs/plans/2026-08-12-coordinated-workflow-timeouts-plan.md +74 -0
- package/docs/plans/2026-08-13-built-in-workflow-catalog-plan.md +97 -0
- package/docs/run-bundles.md +22 -4
- package/docs/workflows.md +34 -10
- package/package.json +1 -1
- package/src/builtins/catalog.ts +22 -0
- package/src/builtins/monitor.workflow.ts +25 -1
- package/src/controllers/sqlite.ts +128 -10
- package/src/controllers/workflow-engine-scheduler.ts +5 -2
- package/src/extension/executor.ts +12 -1
- package/src/extension/index.ts +106 -37
- package/src/host/runner.ts +58 -19
- package/src/workflows/catalog.ts +135 -0
- package/src/workflows/engine.ts +102 -53
- package/src/workflows/index.ts +2 -0
- package/src/workflows/loader.ts +70 -26
- package/src/workflows/migrate-sources.ts +167 -0
- package/src/workflows/schema.ts +2 -1
- package/src/workflows/store.ts +2 -2
- package/src/workflows/types.ts +13 -4
package/dist/host/runner.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
|
+
import { builtinWorkflowCatalog } from "../builtins/catalog.js";
|
|
4
5
|
import { ControllerManager, loadDiscoveredControllers, projectControllerStorePath, SqliteControllerStore, WorkflowEngineScheduler, } from "../controllers/index.js";
|
|
5
6
|
import { WorkflowEngine } from "../workflows/engine.js";
|
|
6
7
|
import { ClaimLostError, errorMessage, isClaimLostError, WorkflowSourceChangedError, } from "../workflows/errors.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
8
|
+
import { resolveWorkflowRef, resolveWorkflowSource } from "../workflows/loader.js";
|
|
9
|
+
import { migrateLegacyWorkflowSources } from "../workflows/migrate-sources.js";
|
|
10
|
+
import { WorkflowRunStore, readRunBundle } from "../workflows/store.js";
|
|
9
11
|
import { HostProcessRegistry } from "./processes.js";
|
|
10
12
|
import { RpcStepExecutor } from "./rpc-executor.js";
|
|
11
13
|
const CLAIM_POLL_MS = 2_000;
|
|
@@ -27,6 +29,7 @@ export class WorkflowHost {
|
|
|
27
29
|
manager = null;
|
|
28
30
|
pollTimer = null;
|
|
29
31
|
activeRuns = new Map();
|
|
32
|
+
migrationBlockedRuns = new Set();
|
|
30
33
|
schedulerExecutors = new Map();
|
|
31
34
|
/** Runs whose resume refused (edited source); skipped until a host restart. */
|
|
32
35
|
skippedRuns = new Set();
|
|
@@ -53,14 +56,22 @@ export class WorkflowHost {
|
|
|
53
56
|
if (reaped.length > 0) {
|
|
54
57
|
this.log(`reaped ${reaped.length} orphaned headless session(s): ${reaped.join(", ")}`);
|
|
55
58
|
}
|
|
59
|
+
const migration = await migrateLegacyWorkflowSources({
|
|
60
|
+
catalog: builtinWorkflowCatalog,
|
|
61
|
+
store: this.childRunStore,
|
|
62
|
+
queue: this.store,
|
|
63
|
+
});
|
|
64
|
+
for (const blocked of migration.blocked) {
|
|
65
|
+
this.migrationBlockedRuns.add(blocked.runId);
|
|
66
|
+
this.log(`run ${blocked.runId} parked: ${blocked.reason}`);
|
|
67
|
+
}
|
|
56
68
|
const definitions = await loadDiscoveredControllers({ cwd: this.options.cwd });
|
|
57
69
|
if (definitions.length > 0) {
|
|
58
70
|
const scheduler = new WorkflowEngineScheduler({
|
|
59
71
|
store: this.childRunStore,
|
|
60
72
|
resolveWorkflow: async (name) => {
|
|
61
|
-
const resolved = await resolveWorkflowRef(name, { cwd: this.options.cwd });
|
|
62
|
-
|
|
63
|
-
return { workflow };
|
|
73
|
+
const resolved = await resolveWorkflowRef(name, { cwd: this.options.cwd }, builtinWorkflowCatalog);
|
|
74
|
+
return { workflow: resolved.definition, workflowSource: resolved.source };
|
|
64
75
|
},
|
|
65
76
|
createEngine: () => {
|
|
66
77
|
const executor = new RpcStepExecutor({
|
|
@@ -131,7 +142,7 @@ export class WorkflowHost {
|
|
|
131
142
|
runnerId: this.runnerId,
|
|
132
143
|
claimToken: randomUUID(),
|
|
133
144
|
leaseMs: RUN_CLAIM_LEASE_MS,
|
|
134
|
-
excludeRunIds: [...this.skippedRuns],
|
|
145
|
+
excludeRunIds: [...this.skippedRuns, ...this.migrationBlockedRuns],
|
|
135
146
|
});
|
|
136
147
|
}
|
|
137
148
|
catch (error) {
|
|
@@ -150,14 +161,32 @@ export class WorkflowHost {
|
|
|
150
161
|
async runClaimed(record) {
|
|
151
162
|
const claimToken = record.claimToken;
|
|
152
163
|
const runId = record.runId;
|
|
153
|
-
this.log(`resuming ${record.
|
|
164
|
+
this.log(`resuming ${record.workflowName} run ${runId}`);
|
|
154
165
|
let workflow;
|
|
155
|
-
let
|
|
166
|
+
let workflowSource;
|
|
156
167
|
try {
|
|
157
|
-
|
|
158
|
-
|
|
168
|
+
const bundle = await readRunBundle(this.childRunStore.runDirFor(runId));
|
|
169
|
+
if (bundle?.state.workflowSource === undefined) {
|
|
170
|
+
throw new Error(`Workflow run ${runId} has no canonical workflow source`);
|
|
171
|
+
}
|
|
172
|
+
workflow = await resolveWorkflowSource(bundle.state.workflowSource, builtinWorkflowCatalog, runId);
|
|
173
|
+
workflowSource = bundle.state.workflowSource;
|
|
159
174
|
}
|
|
160
175
|
catch (error) {
|
|
176
|
+
if (error instanceof WorkflowSourceChangedError) {
|
|
177
|
+
try {
|
|
178
|
+
this.store.parkWorkflowRun({ runId, claimToken });
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Best-effort.
|
|
182
|
+
}
|
|
183
|
+
this.skippedRuns.add(runId);
|
|
184
|
+
this.recordEvent(runId, record.workflowName, "parked", {
|
|
185
|
+
reason: "workflow source changed",
|
|
186
|
+
});
|
|
187
|
+
this.log(`run ${runId} skipped: workflow source changed; install the matching package revision, then restart the host`);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
161
190
|
await this.failUnresumable(record, claimToken, errorMessage(error));
|
|
162
191
|
return;
|
|
163
192
|
}
|
|
@@ -200,23 +229,23 @@ export class WorkflowHost {
|
|
|
200
229
|
}
|
|
201
230
|
}, RUN_CLAIM_RENEW_MS);
|
|
202
231
|
renewTimer.unref?.();
|
|
203
|
-
this.recordEvent(runId, record.
|
|
232
|
+
this.recordEvent(runId, record.workflowName, "resumed", { runnerId: this.runnerId });
|
|
204
233
|
try {
|
|
205
|
-
const result = await engine.resumeRun(workflow, runId, {
|
|
234
|
+
const result = await engine.resumeRun(workflow, runId, { workflowSource });
|
|
206
235
|
clearInterval(renewTimer);
|
|
207
236
|
if (result.state.status === "running") {
|
|
208
237
|
// Parked again mid-drain: leave it claimable for the next runner.
|
|
209
238
|
this.store.parkWorkflowRun({ runId, claimToken });
|
|
210
|
-
this.recordEvent(runId, record.
|
|
211
|
-
this.log(`parked ${record.
|
|
239
|
+
this.recordEvent(runId, record.workflowName, "parked", {});
|
|
240
|
+
this.log(`parked ${record.workflowName} run ${runId}`);
|
|
212
241
|
return;
|
|
213
242
|
}
|
|
214
243
|
this.store.completeWorkflowRun({ runId, claimToken });
|
|
215
|
-
this.recordEvent(runId, record.
|
|
244
|
+
this.recordEvent(runId, record.workflowName, result.state.status, {
|
|
216
245
|
...(result.state.error !== undefined ? { error: result.state.error } : {}),
|
|
217
246
|
...(result.state.waitingOn !== undefined ? { waitingOn: result.state.waitingOn } : {}),
|
|
218
247
|
});
|
|
219
|
-
this.log(`${record.
|
|
248
|
+
this.log(`${record.workflowName} run ${runId} ${result.state.status}`);
|
|
220
249
|
}
|
|
221
250
|
catch (error) {
|
|
222
251
|
clearInterval(renewTimer);
|
|
@@ -234,7 +263,7 @@ export class WorkflowHost {
|
|
|
234
263
|
// Best-effort.
|
|
235
264
|
}
|
|
236
265
|
this.skippedRuns.add(runId);
|
|
237
|
-
this.recordEvent(runId, record.
|
|
266
|
+
this.recordEvent(runId, record.workflowName, "parked", {
|
|
238
267
|
reason: "workflow source changed",
|
|
239
268
|
});
|
|
240
269
|
this.log(`run ${runId} skipped: workflow source changed; revert or force-resume it, then restart the host`);
|
|
@@ -280,10 +309,10 @@ export class WorkflowHost {
|
|
|
280
309
|
// no-op (the bundle was already waiting or completed), so the feed
|
|
281
310
|
// stays truthful for sessions syncing from it.
|
|
282
311
|
if (actualStatus !== undefined && actualStatus !== "failed") {
|
|
283
|
-
this.recordEvent(record.runId, record.
|
|
312
|
+
this.recordEvent(record.runId, record.workflowName, actualStatus, {});
|
|
284
313
|
}
|
|
285
314
|
else {
|
|
286
|
-
this.recordEvent(record.runId, record.
|
|
315
|
+
this.recordEvent(record.runId, record.workflowName, "failed", { error: message });
|
|
287
316
|
}
|
|
288
317
|
this.log(`run ${record.runId} cannot resume: ${message}`);
|
|
289
318
|
}
|
package/dist/host/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/host/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,GAExB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAkBlC;;;;;;GAMG;AACH,MAAM,OAAO,YAAY;IACN,OAAO,CAAsB;IAC7B,QAAQ,CAAS;IACjB,QAAQ,CAAsB;IAC9B,KAAK,CAAwB;IAC7B,aAAa,CAAmB;IACzC,OAAO,GAA6B,IAAI,CAAC;IACzC,SAAS,GAA0C,IAAI,CAAC;IAC/C,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC9C,kBAAkB,GAAG,IAAI,GAAG,EAAmC,CAAC;IACjF,+EAA+E;IAC9D,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,QAAQ,GAAG,KAAK,CAAC;IAER,QAAQ,CAAS;IAElC,YAAY,OAA4B;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,KAAK,GAAG,IAAI,qBAAqB,CACpC,OAAO,CAAC,SAAS,IAAI,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,CAC7D,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3E,IAAI,CAAC,aAAa,GAAG,IAAI,gBAAgB,CACvC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,CAClE,CAAC;IACJ,CAAC;IAEO,GAAG,CAAC,OAAe;QACzB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,KAAK;QACT,sEAAsE;QACtE,sEAAsE;QACtE,uBAAuB;QACvB,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,MAAM,kCAAkC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,yBAAyB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,uBAAuB,CAAC;gBAC5C,KAAK,EAAE,IAAI,CAAC,aAAa;gBACzB,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC9B,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;oBAC3E,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACvD,OAAO,EAAE,QAAQ,EAAE,CAAC;gBACtB,CAAC;gBACD,YAAY,EAAE,GAAG,EAAE;oBACjB,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;wBACnC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;wBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7E,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACrE,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;oBAC3E,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;oBAC9C,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACrD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;wBAC3B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBACvC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACzB,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC;gBACnC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,WAAW;gBACxB,iBAAiB,EAAE,SAAS;aAC7B,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,kCAAkC,WAAW,CAAC,MAAM,gBAAgB,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,aAAa,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,EAAE,CAAC;QACR,CAAC;QACD,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAClD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC;YACxD,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxB,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEgB,aAAa,GAAsB,EAAE,CAAC;IAE/C,SAAS;QACf,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,IAAI,OAA2C,CAAC;QAChD,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC;gBACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,UAAU,EAAE;gBACxB,OAAO,EAAE,kBAAkB;gBAC3B,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;aACrC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gEAAgE;YAChE,IAAI,CAAC,GAAG,CAAC,mCAAmC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACjD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,MAA8B;QACrD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAoB,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,WAAW,QAAQ,KAAK,EAAE,CAAC,CAAC;QACxD,IAAI,QAA4B,CAAC;QACjC,IAAI,YAAoB,CAAC;QACzB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvD,YAAY,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,iEAAiE;YACjE,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;YACtE,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;SAC3B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;YACnC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEpC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC;oBACrF,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;YAC9D,CAAC;QACH,CAAC,EAAE,kBAAkB,CAAC,CAAC;QACvB,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;QAErB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;YACzE,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACtC,kEAAkE;gBAClE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAClD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC1D,IAAI,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,WAAW,QAAQ,KAAK,EAAE,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;gBAC/D,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvF,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,QAAQ,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,iCAAiC,CAAC,CAAC;gBACxD,OAAO;YACT,CAAC;YACD,IAAI,KAAK,YAAY,0BAA0B,EAAE,CAAC;gBAChD,oEAAoE;gBACpE,qEAAqE;gBACrE,IAAI,CAAC;oBACH,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBACpD,CAAC;gBAAC,MAAM,CAAC;oBACP,eAAe;gBACjB,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC5B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE;oBACpD,MAAM,EAAE,yBAAyB;iBAClC,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CACN,OAAO,KAAK,qFAAqF,CAClG,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,MAA8B,EAC9B,UAAkB,EAClB,OAAe;QAEf,IAAI,YAAgC,CAAC;QACrC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC;YACH,oEAAoE;YACpE,iEAAiE;YACjE,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YACnF,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAClF,YAAY,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;QACD,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,4DAA4D;YAC5D,IAAI,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,iCAAiC,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,sEAAsE;QACtE,mEAAmE;QACnE,+CAA+C;QAC/C,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC5D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,mBAAmB,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEO,WAAW,CAAC,KAAa,EAAE,WAAmB,EAAE,IAAY,EAAE,OAAmB;QACvF,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5F,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;IACH,CAAC;CACF;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,QAAgB,EAAE,QAAgB,EAAE,GAAW;IACtE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CACb,8BAA8B,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,QAAQ,4BAA4B,GAAG,EAAE,CAClG,CAAC;IACJ,CAAC;IACD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,EAAE,CAAC,aAAa,CACd,QAAQ,EACR,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAC1F,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,QAAgB;IACzD,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,QAAQ,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAG1D,CAAC;QACF,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/host/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { WorkflowDefinition, WorkflowSource } from "./types.js";
|
|
2
|
+
export type LegacyBuiltinSource = {
|
|
3
|
+
workflowHash: string;
|
|
4
|
+
revision: string;
|
|
5
|
+
pathSuffixes: readonly string[];
|
|
6
|
+
};
|
|
7
|
+
export type BuiltinWorkflowRegistration = {
|
|
8
|
+
id: string;
|
|
9
|
+
revision: string;
|
|
10
|
+
definition: WorkflowDefinition;
|
|
11
|
+
legacySources?: LegacyBuiltinSource[];
|
|
12
|
+
};
|
|
13
|
+
export type BuiltinWorkflowEntry = Readonly<{
|
|
14
|
+
id: string;
|
|
15
|
+
ref: string;
|
|
16
|
+
revision: string;
|
|
17
|
+
definition: WorkflowDefinition;
|
|
18
|
+
legacySources: readonly LegacyBuiltinSource[];
|
|
19
|
+
}>;
|
|
20
|
+
export type LegacyBuiltinMatch = {
|
|
21
|
+
entry: BuiltinWorkflowEntry;
|
|
22
|
+
revision: string;
|
|
23
|
+
};
|
|
24
|
+
/** Process-local catalog of package-provided workflow definitions. */
|
|
25
|
+
export declare class BuiltinWorkflowCatalog {
|
|
26
|
+
private readonly byId;
|
|
27
|
+
private readonly byName;
|
|
28
|
+
constructor(registrations: BuiltinWorkflowRegistration[]);
|
|
29
|
+
list(): BuiltinWorkflowEntry[];
|
|
30
|
+
get(id: string): BuiltinWorkflowEntry | undefined;
|
|
31
|
+
getByName(name: string): BuiltinWorkflowEntry | undefined;
|
|
32
|
+
resolve(source: WorkflowSource, runId?: string): WorkflowDefinition;
|
|
33
|
+
matchLegacy(options: {
|
|
34
|
+
workflowName: string;
|
|
35
|
+
workflowPath: string;
|
|
36
|
+
workflowHash: string;
|
|
37
|
+
}): LegacyBuiltinMatch | undefined;
|
|
38
|
+
/** Identify a registered old built-in path without accepting its revision. */
|
|
39
|
+
legacyPathEntry(options: {
|
|
40
|
+
workflowName: string;
|
|
41
|
+
workflowPath: string;
|
|
42
|
+
}): BuiltinWorkflowEntry | undefined;
|
|
43
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { isWorkflowDefinition } from "./definition.js";
|
|
2
|
+
import { WorkflowSourceChangedError } from "./errors.js";
|
|
3
|
+
const BUILTIN_ID_PATTERN = /^[a-z][a-z0-9-]{0,63}$/;
|
|
4
|
+
const REVISION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
|
|
5
|
+
/** Process-local catalog of package-provided workflow definitions. */
|
|
6
|
+
export class BuiltinWorkflowCatalog {
|
|
7
|
+
byId = new Map();
|
|
8
|
+
byName = new Map();
|
|
9
|
+
constructor(registrations) {
|
|
10
|
+
for (const registration of registrations) {
|
|
11
|
+
if (!BUILTIN_ID_PATTERN.test(registration.id)) {
|
|
12
|
+
throw new Error(`Invalid built-in workflow id: ${JSON.stringify(registration.id)}`);
|
|
13
|
+
}
|
|
14
|
+
if (!REVISION_PATTERN.test(registration.revision)) {
|
|
15
|
+
throw new Error(`Invalid built-in workflow revision: ${JSON.stringify(registration.revision)}`);
|
|
16
|
+
}
|
|
17
|
+
if (!isWorkflowDefinition(registration.definition)) {
|
|
18
|
+
throw new Error(`Built-in workflow ${registration.id} is not defined with defineWorkflow`);
|
|
19
|
+
}
|
|
20
|
+
if (this.byId.has(registration.id)) {
|
|
21
|
+
throw new Error(`Duplicate built-in workflow id: ${registration.id}`);
|
|
22
|
+
}
|
|
23
|
+
if (this.byName.has(registration.definition.name)) {
|
|
24
|
+
throw new Error(`Duplicate built-in workflow name: ${registration.definition.name}`);
|
|
25
|
+
}
|
|
26
|
+
const entry = Object.freeze({
|
|
27
|
+
id: registration.id,
|
|
28
|
+
ref: `builtin:${registration.id}`,
|
|
29
|
+
revision: registration.revision,
|
|
30
|
+
definition: registration.definition,
|
|
31
|
+
legacySources: Object.freeze((registration.legacySources ?? []).map((legacy) => Object.freeze({ ...legacy, pathSuffixes: Object.freeze([...legacy.pathSuffixes]) }))),
|
|
32
|
+
});
|
|
33
|
+
this.byId.set(entry.id, entry);
|
|
34
|
+
this.byName.set(entry.definition.name, entry);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
list() {
|
|
38
|
+
return [...this.byId.values()];
|
|
39
|
+
}
|
|
40
|
+
get(id) {
|
|
41
|
+
return this.byId.get(id);
|
|
42
|
+
}
|
|
43
|
+
getByName(name) {
|
|
44
|
+
return this.byName.get(name);
|
|
45
|
+
}
|
|
46
|
+
resolve(source, runId = `builtin:${source.kind === "builtin" ? source.id : "unknown"}`) {
|
|
47
|
+
if (source.kind !== "builtin") {
|
|
48
|
+
throw new Error("A file workflow source cannot be resolved by the built-in catalog");
|
|
49
|
+
}
|
|
50
|
+
const entry = this.byId.get(source.id);
|
|
51
|
+
if (entry === undefined) {
|
|
52
|
+
throw new Error(`Unknown built-in workflow: ${source.id}`);
|
|
53
|
+
}
|
|
54
|
+
if (entry.revision !== source.revision) {
|
|
55
|
+
throw new WorkflowSourceChangedError(runId);
|
|
56
|
+
}
|
|
57
|
+
return entry.definition;
|
|
58
|
+
}
|
|
59
|
+
matchLegacy(options) {
|
|
60
|
+
const entry = this.legacyPathEntry(options);
|
|
61
|
+
if (entry === undefined)
|
|
62
|
+
return undefined;
|
|
63
|
+
const workflowPath = options.workflowPath.replaceAll("\\", "/");
|
|
64
|
+
const legacy = entry.legacySources.find((candidate) => candidate.workflowHash === options.workflowHash &&
|
|
65
|
+
candidate.pathSuffixes.some((suffix) => workflowPath.endsWith(suffix.replaceAll("\\", "/"))));
|
|
66
|
+
return legacy === undefined ? undefined : { entry, revision: legacy.revision };
|
|
67
|
+
}
|
|
68
|
+
/** Identify a registered old built-in path without accepting its revision. */
|
|
69
|
+
legacyPathEntry(options) {
|
|
70
|
+
const entry = this.byName.get(options.workflowName);
|
|
71
|
+
if (entry === undefined)
|
|
72
|
+
return undefined;
|
|
73
|
+
const workflowPath = options.workflowPath.replaceAll("\\", "/");
|
|
74
|
+
return entry.legacySources.some((legacy) => legacy.pathSuffixes.some((suffix) => workflowPath.endsWith(suffix.replaceAll("\\", "/"))))
|
|
75
|
+
? entry
|
|
76
|
+
: undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/workflows/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { WorkflowDefinition, WorkflowEngineOptions, WorkflowRunResult } from "./types.js";
|
|
1
|
+
import type { WorkflowDefinition, WorkflowEngineOptions, WorkflowRunResult, WorkflowSource } from "./types.js";
|
|
2
2
|
/**
|
|
3
3
|
* Executes a workflow graph step by step. Agent steps are delegated to the
|
|
4
4
|
* configured executor; compute/action/checkpoint nodes run inline. Every
|
|
@@ -38,8 +38,7 @@ export declare class WorkflowEngine {
|
|
|
38
38
|
/** True when a pause has been requested or the run is already held. */
|
|
39
39
|
get pauseRequested(): boolean;
|
|
40
40
|
run(workflow: WorkflowDefinition, input: unknown, options?: {
|
|
41
|
-
|
|
42
|
-
workflowHash?: string;
|
|
41
|
+
workflowSource?: WorkflowSource;
|
|
43
42
|
runId?: string;
|
|
44
43
|
}): Promise<WorkflowRunResult>;
|
|
45
44
|
/**
|
|
@@ -48,7 +47,7 @@ export declare class WorkflowEngine {
|
|
|
48
47
|
* state; only the interrupted node and everything downstream rerun.
|
|
49
48
|
*/
|
|
50
49
|
resumeRun(workflow: WorkflowDefinition, runId: string, options?: {
|
|
51
|
-
|
|
50
|
+
workflowSource?: WorkflowSource;
|
|
52
51
|
force?: boolean;
|
|
53
52
|
}): Promise<WorkflowRunResult>;
|
|
54
53
|
/**
|
|
@@ -57,8 +56,7 @@ export declare class WorkflowEngine {
|
|
|
57
56
|
* and step accounting, and continues routing after the checkpoint.
|
|
58
57
|
*/
|
|
59
58
|
continueRun(workflow: WorkflowDefinition, parentRunId: string, input: unknown, options?: {
|
|
60
|
-
|
|
61
|
-
workflowHash?: string;
|
|
59
|
+
workflowSource?: WorkflowSource;
|
|
62
60
|
runId?: string;
|
|
63
61
|
force?: boolean;
|
|
64
62
|
}): Promise<WorkflowRunResult>;
|
|
@@ -88,6 +86,7 @@ export declare class WorkflowEngine {
|
|
|
88
86
|
private outcomeForError;
|
|
89
87
|
private createNodeResult;
|
|
90
88
|
private runNodeWithTimeout;
|
|
89
|
+
private resolveNodeTimeout;
|
|
91
90
|
private dispatchNode;
|
|
92
91
|
private createNodeContext;
|
|
93
92
|
private runAgentNode;
|
package/dist/workflows/engine.js
CHANGED
|
@@ -9,6 +9,7 @@ import { RUN_STATE_SCHEMA, WorkflowRunStore, createRunId, readRunBundle } from "
|
|
|
9
9
|
const DEFAULT_NODE_TIMEOUT_MS = 15 * 60_000;
|
|
10
10
|
const DEFAULT_MAX_STEPS = 100;
|
|
11
11
|
const TITLE_TIMEOUT_MS = 30_000;
|
|
12
|
+
const TIMEOUT_RESOLUTION_TIMEOUT_MS = 30_000;
|
|
12
13
|
// Covers the shell SIGTERM → SIGKILL escalation (1s) plus stdio close.
|
|
13
14
|
const ABORT_CLEANUP_GRACE_MS = 2_000;
|
|
14
15
|
/**
|
|
@@ -88,7 +89,7 @@ export class WorkflowEngine {
|
|
|
88
89
|
this.cancelled = false;
|
|
89
90
|
this.paused = false;
|
|
90
91
|
this.parked = false;
|
|
91
|
-
const state = await this.createRunState(workflow, normalizedInput, options.
|
|
92
|
+
const state = await this.createRunState(workflow, normalizedInput, options.workflowSource, options.runId);
|
|
92
93
|
const runDir = await this.store.initializeRunBundle(workflow, state);
|
|
93
94
|
await this.persist(runDir, state, {
|
|
94
95
|
scope: "run",
|
|
@@ -130,10 +131,8 @@ export class WorkflowEngine {
|
|
|
130
131
|
const bundle = await this.store.prepareRunResume(runId);
|
|
131
132
|
const { runDir } = bundle;
|
|
132
133
|
const state = bundle.state;
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
state.workflowHash !== options.workflowHash;
|
|
136
|
-
if (hashMismatch && options.force !== true) {
|
|
134
|
+
const sourceMismatch = workflowSourceMismatch(state, options.workflowSource);
|
|
135
|
+
if (sourceMismatch && options.force !== true) {
|
|
137
136
|
throw new WorkflowSourceChangedError(runId);
|
|
138
137
|
}
|
|
139
138
|
const point = this.resumePointFor(workflow, state, "wait");
|
|
@@ -151,7 +150,7 @@ export class WorkflowEngine {
|
|
|
151
150
|
payload: {
|
|
152
151
|
...(point.nodeId !== null ? { resumeAt: point.nodeId } : {}),
|
|
153
152
|
replayedSteps: state.steps.length,
|
|
154
|
-
...(
|
|
153
|
+
...(sourceMismatch ? { workflowSourceMismatch: true, forced: true } : {}),
|
|
155
154
|
},
|
|
156
155
|
});
|
|
157
156
|
await this.onRunStarted?.(runDir, state);
|
|
@@ -205,10 +204,8 @@ export class WorkflowEngine {
|
|
|
205
204
|
if (parent.state.status !== "waiting" || parent.state.waitingOn === undefined) {
|
|
206
205
|
throw new Error(`Cannot continue workflow run ${parentRunId} with status ${parent.state.status}`);
|
|
207
206
|
}
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
parent.state.workflowHash !== options.workflowHash;
|
|
211
|
-
if (hashMismatch && options.force !== true) {
|
|
207
|
+
const sourceMismatch = workflowSourceMismatch(parent.state, options.workflowSource);
|
|
208
|
+
if (sourceMismatch && options.force !== true) {
|
|
212
209
|
throw new WorkflowSourceChangedError(parentRunId);
|
|
213
210
|
}
|
|
214
211
|
const normalizedInput = input === undefined ? null : input;
|
|
@@ -216,7 +213,7 @@ export class WorkflowEngine {
|
|
|
216
213
|
if (options.runId !== undefined && !/^[A-Za-z0-9][A-Za-z0-9._-]{0,199}$/.test(options.runId)) {
|
|
217
214
|
throw new Error(`Invalid workflow run id: ${JSON.stringify(options.runId)}`);
|
|
218
215
|
}
|
|
219
|
-
const state = await this.createRunState(workflow, normalizedInput, options.
|
|
216
|
+
const state = await this.createRunState(workflow, normalizedInput, options.workflowSource, options.runId);
|
|
220
217
|
state.parentRunId = parentRunId;
|
|
221
218
|
// Artifact references point into the parent's bundle, so carried values
|
|
222
219
|
// are fully resolved here and re-externalized into the new bundle.
|
|
@@ -332,7 +329,7 @@ export class WorkflowEngine {
|
|
|
332
329
|
this.activeAbort = null;
|
|
333
330
|
}
|
|
334
331
|
}
|
|
335
|
-
async createRunState(workflow, input,
|
|
332
|
+
async createRunState(workflow, input, workflowSource, runId) {
|
|
336
333
|
const now = new Date().toISOString();
|
|
337
334
|
return {
|
|
338
335
|
schema: RUN_STATE_SCHEMA,
|
|
@@ -340,8 +337,7 @@ export class WorkflowEngine {
|
|
|
340
337
|
runId: runId ?? createRunId(workflow.name),
|
|
341
338
|
workflowName: workflow.name,
|
|
342
339
|
...(await this.resolveTitleBounded(workflow, input)),
|
|
343
|
-
...(
|
|
344
|
-
...(workflowHash !== undefined ? { workflowHash } : {}),
|
|
340
|
+
...(workflowSource !== undefined ? { workflowSource } : {}),
|
|
345
341
|
startedAt: now,
|
|
346
342
|
updatedAt: now,
|
|
347
343
|
status: "running",
|
|
@@ -550,23 +546,29 @@ export class WorkflowEngine {
|
|
|
550
546
|
};
|
|
551
547
|
}
|
|
552
548
|
async runNodeWithTimeout(workflow, state, runDir, nodeId, attemptId, node, meta) {
|
|
553
|
-
const timeoutMs = node.timeoutMs ?? this.defaultNodeTimeoutMs;
|
|
554
549
|
const abort = new AbortController();
|
|
550
|
+
const context = this.createNodeContext(state, abort.signal);
|
|
551
|
+
let timer;
|
|
552
|
+
let dispatchSettled;
|
|
555
553
|
this.activeAbort = abort;
|
|
556
|
-
if (this.parked) {
|
|
557
|
-
// A park that landed during the node_started persist must not let the
|
|
558
|
-
// node dispatch: its discarded side effects would rerun on resume.
|
|
559
|
-
throw new RunParkedError();
|
|
560
|
-
}
|
|
561
|
-
if (this.cancelled) {
|
|
562
|
-
throw new CancelledError();
|
|
563
|
-
}
|
|
564
|
-
const timer = setTimeout(() => {
|
|
565
|
-
abort.abort(new TimeoutError(timeoutMs));
|
|
566
|
-
}, timeoutMs);
|
|
567
|
-
const dispatched = this.dispatchNode(workflow, state, runDir, nodeId, attemptId, node, abort.signal, meta);
|
|
568
|
-
const dispatchSettled = dispatched.then(() => undefined, () => undefined);
|
|
569
554
|
try {
|
|
555
|
+
if (this.parked) {
|
|
556
|
+
// A park that landed during the node_started persist must not let the
|
|
557
|
+
// node dispatch: its discarded side effects would rerun on resume.
|
|
558
|
+
throw new RunParkedError();
|
|
559
|
+
}
|
|
560
|
+
if (this.cancelled) {
|
|
561
|
+
throw new CancelledError();
|
|
562
|
+
}
|
|
563
|
+
const timeoutMs = await this.resolveNodeTimeout(node, context, abort);
|
|
564
|
+
if (abort.signal.aborted) {
|
|
565
|
+
throw abortError(abort.signal);
|
|
566
|
+
}
|
|
567
|
+
timer = setTimeout(() => {
|
|
568
|
+
abort.abort(new TimeoutError(timeoutMs));
|
|
569
|
+
}, timeoutMs);
|
|
570
|
+
const dispatched = this.dispatchNode(workflow, state, runDir, nodeId, attemptId, node, context, abort.signal, meta);
|
|
571
|
+
dispatchSettled = dispatched.then(() => undefined, () => undefined);
|
|
570
572
|
// Race the dispatch against the abort signal so timeouts and cancel
|
|
571
573
|
// take effect even for node callbacks that never observe the signal.
|
|
572
574
|
const execution = await Promise.race([dispatched, abortRejection(abort.signal)]);
|
|
@@ -579,7 +581,7 @@ export class WorkflowEngine {
|
|
|
579
581
|
return execution;
|
|
580
582
|
}
|
|
581
583
|
catch (error) {
|
|
582
|
-
if (node.nodeType === "action" && "exec" in node) {
|
|
584
|
+
if (node.nodeType === "action" && "exec" in node && dispatchSettled !== undefined) {
|
|
583
585
|
// Give the killed shell command a short grace period to close so its
|
|
584
586
|
// action receipt lands in `meta` before the failed attempt persists.
|
|
585
587
|
await Promise.race([
|
|
@@ -590,13 +592,33 @@ export class WorkflowEngine {
|
|
|
590
592
|
const reason = abort.signal.aborted ? abort.signal.reason : undefined;
|
|
591
593
|
throw reason instanceof TimeoutError || reason instanceof CancelledError ? reason : error;
|
|
592
594
|
}
|
|
595
|
+
finally {
|
|
596
|
+
if (timer !== undefined) {
|
|
597
|
+
clearTimeout(timer);
|
|
598
|
+
}
|
|
599
|
+
if (this.activeAbort === abort) {
|
|
600
|
+
this.activeAbort = null;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
async resolveNodeTimeout(node, context, abort) {
|
|
605
|
+
const configured = node.timeoutMs;
|
|
606
|
+
if (typeof configured !== "function") {
|
|
607
|
+
return assertValidTimeout(configured ?? this.defaultNodeTimeoutMs);
|
|
608
|
+
}
|
|
609
|
+
const timer = setTimeout(() => abort.abort(new TimeoutError(TIMEOUT_RESOLUTION_TIMEOUT_MS)), TIMEOUT_RESOLUTION_TIMEOUT_MS);
|
|
610
|
+
try {
|
|
611
|
+
const resolved = await Promise.race([
|
|
612
|
+
Promise.resolve(configured(context)),
|
|
613
|
+
abortRejection(abort.signal),
|
|
614
|
+
]);
|
|
615
|
+
return assertValidTimeout(resolved);
|
|
616
|
+
}
|
|
593
617
|
finally {
|
|
594
618
|
clearTimeout(timer);
|
|
595
|
-
this.activeAbort = null;
|
|
596
619
|
}
|
|
597
620
|
}
|
|
598
|
-
async dispatchNode(workflow, state, runDir, nodeId, attemptId, node, signal, meta) {
|
|
599
|
-
const context = this.createNodeContext(state, signal);
|
|
621
|
+
async dispatchNode(workflow, state, runDir, nodeId, attemptId, node, context, signal, meta) {
|
|
600
622
|
switch (node.nodeType) {
|
|
601
623
|
case "agent":
|
|
602
624
|
return await this.runAgentNode(workflow, state, runDir, nodeId, attemptId, node, context, signal, meta);
|
|
@@ -753,7 +775,12 @@ async function runShellActionNode(node, context, signal, meta) {
|
|
|
753
775
|
const output = node.parse ? await node.parse(result, context) : result;
|
|
754
776
|
return { output, promptText: null, action: shellReceipt(result) };
|
|
755
777
|
}
|
|
756
|
-
|
|
778
|
+
function assertValidTimeout(value) {
|
|
779
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
780
|
+
throw new Error("Node timeoutMs must resolve to a finite positive number");
|
|
781
|
+
}
|
|
782
|
+
return value;
|
|
783
|
+
}
|
|
757
784
|
/** The error carried by an aborted signal, normalized to an Error. */
|
|
758
785
|
function abortError(signal) {
|
|
759
786
|
const reason = signal.reason ?? new CancelledError();
|
|
@@ -776,6 +803,17 @@ function abortRejection(signal) {
|
|
|
776
803
|
* Failing here turns a bad callback return value into a normal node failure
|
|
777
804
|
* instead of corrupting the run state.
|
|
778
805
|
*/
|
|
806
|
+
function workflowSourceMismatch(state, source) {
|
|
807
|
+
if (source === undefined)
|
|
808
|
+
return false;
|
|
809
|
+
if (state.workflowSource !== undefined) {
|
|
810
|
+
return !isDeepStrictEqual(state.workflowSource, source);
|
|
811
|
+
}
|
|
812
|
+
// Bounded compatibility check for pre-catalog file runs. Startup normally
|
|
813
|
+
// converts these records with migrateLegacyWorkflowSources first.
|
|
814
|
+
return (state.workflowHash !== undefined &&
|
|
815
|
+
(source.kind !== "file" || state.workflowHash !== source.hash));
|
|
816
|
+
}
|
|
779
817
|
function assertJsonSerializable(value, what) {
|
|
780
818
|
let encoded;
|
|
781
819
|
try {
|