@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.
Files changed (61) hide show
  1. package/README.md +3 -2
  2. package/dist/builtins/catalog.d.ts +2 -0
  3. package/dist/builtins/catalog.js +22 -0
  4. package/dist/builtins/catalog.js.map +1 -0
  5. package/dist/builtins/monitor.workflow.js +17 -1
  6. package/dist/builtins/monitor.workflow.js.map +1 -1
  7. package/dist/controllers/sqlite.d.ts +27 -4
  8. package/dist/controllers/sqlite.js +83 -5
  9. package/dist/controllers/sqlite.js.map +1 -1
  10. package/dist/controllers/workflow-engine-scheduler.d.ts +2 -2
  11. package/dist/controllers/workflow-engine-scheduler.js +3 -1
  12. package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
  13. package/dist/extension/executor.d.ts +3 -0
  14. package/dist/extension/executor.js +11 -1
  15. package/dist/extension/executor.js.map +1 -1
  16. package/dist/extension/index.js +84 -29
  17. package/dist/extension/index.js.map +1 -1
  18. package/dist/host/runner.d.ts +1 -0
  19. package/dist/host/runner.js +48 -19
  20. package/dist/host/runner.js.map +1 -1
  21. package/dist/workflows/catalog.d.ts +43 -0
  22. package/dist/workflows/catalog.js +79 -0
  23. package/dist/workflows/catalog.js.map +1 -0
  24. package/dist/workflows/engine.d.ts +5 -6
  25. package/dist/workflows/engine.js +71 -33
  26. package/dist/workflows/engine.js.map +1 -1
  27. package/dist/workflows/index.d.ts +2 -2
  28. package/dist/workflows/index.js +1 -1
  29. package/dist/workflows/index.js.map +1 -1
  30. package/dist/workflows/loader.d.ts +18 -16
  31. package/dist/workflows/loader.js +58 -23
  32. package/dist/workflows/loader.js.map +1 -1
  33. package/dist/workflows/migrate-sources.d.ts +41 -0
  34. package/dist/workflows/migrate-sources.js +129 -0
  35. package/dist/workflows/migrate-sources.js.map +1 -0
  36. package/dist/workflows/schema.js +2 -1
  37. package/dist/workflows/schema.js.map +1 -1
  38. package/dist/workflows/store.js +2 -2
  39. package/dist/workflows/store.js.map +1 -1
  40. package/dist/workflows/types.d.ts +18 -4
  41. package/docs/development.md +5 -3
  42. package/docs/plans/2026-08-12-coordinated-workflow-timeouts-plan.md +74 -0
  43. package/docs/plans/2026-08-13-built-in-workflow-catalog-plan.md +97 -0
  44. package/docs/run-bundles.md +22 -4
  45. package/docs/workflows.md +34 -10
  46. package/package.json +1 -1
  47. package/src/builtins/catalog.ts +22 -0
  48. package/src/builtins/monitor.workflow.ts +25 -1
  49. package/src/controllers/sqlite.ts +128 -10
  50. package/src/controllers/workflow-engine-scheduler.ts +5 -2
  51. package/src/extension/executor.ts +12 -1
  52. package/src/extension/index.ts +106 -37
  53. package/src/host/runner.ts +58 -19
  54. package/src/workflows/catalog.ts +135 -0
  55. package/src/workflows/engine.ts +102 -53
  56. package/src/workflows/index.ts +2 -0
  57. package/src/workflows/loader.ts +70 -26
  58. package/src/workflows/migrate-sources.ts +167 -0
  59. package/src/workflows/schema.ts +2 -1
  60. package/src/workflows/store.ts +2 -2
  61. package/src/workflows/types.ts +13 -4
@@ -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 { hashWorkflowSource, loadWorkflowFile, resolveWorkflowRef } from "../workflows/loader.js";
8
- import { WorkflowRunStore } from "../workflows/store.js";
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
- const workflow = await loadWorkflowFile(resolved.path);
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.workflowRef} run ${runId}`);
164
+ this.log(`resuming ${record.workflowName} run ${runId}`);
154
165
  let workflow;
155
- let workflowHash;
166
+ let workflowSource;
156
167
  try {
157
- workflow = await loadWorkflowFile(record.workflowPath);
158
- workflowHash = await hashWorkflowSource(record.workflowPath);
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.workflowRef, "resumed", { runnerId: this.runnerId });
232
+ this.recordEvent(runId, record.workflowName, "resumed", { runnerId: this.runnerId });
204
233
  try {
205
- const result = await engine.resumeRun(workflow, runId, { workflowHash });
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.workflowRef, "parked", {});
211
- this.log(`parked ${record.workflowRef} run ${runId}`);
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.workflowRef, result.state.status, {
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.workflowRef} run ${runId} ${result.state.status}`);
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.workflowRef, "parked", {
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.workflowRef, actualStatus, {});
312
+ this.recordEvent(record.runId, record.workflowName, actualStatus, {});
284
313
  }
285
314
  else {
286
- this.recordEvent(record.runId, record.workflowRef, "failed", { error: message });
315
+ this.recordEvent(record.runId, record.workflowName, "failed", { error: message });
287
316
  }
288
317
  this.log(`run ${record.runId} cannot resume: ${message}`);
289
318
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/host/runner.ts"],"names":[],"mappings":"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"}
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
- workflowPath?: string;
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
- workflowHash?: string;
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
- workflowPath?: string;
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;
@@ -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.workflowPath, options.workflowHash, options.runId);
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 hashMismatch = state.workflowHash !== undefined &&
134
- options.workflowHash !== undefined &&
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
- ...(hashMismatch ? { workflowHashMismatch: true, forced: true } : {}),
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 hashMismatch = parent.state.workflowHash !== undefined &&
209
- options.workflowHash !== undefined &&
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.workflowPath, options.workflowHash, options.runId);
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, workflowPath, workflowHash, runId) {
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
- ...(workflowPath !== undefined ? { workflowPath } : {}),
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
- /** Rejects with the abort reason once the signal fires; never resolves. */
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 {