@atom-workflow-agent/workflow-engine 0.1.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 (92) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +36 -0
  3. package/README.zh-CN.md +36 -0
  4. package/dist/cache/cache.d.ts +18 -0
  5. package/dist/cache/cache.d.ts.map +1 -0
  6. package/dist/cache/cache.js +44 -0
  7. package/dist/cache/cache.js.map +1 -0
  8. package/dist/diagnostics/public-value.d.ts +5 -0
  9. package/dist/diagnostics/public-value.d.ts.map +1 -0
  10. package/dist/diagnostics/public-value.js +23 -0
  11. package/dist/diagnostics/public-value.js.map +1 -0
  12. package/dist/diagnostics/run-diagnostics.d.ts +12 -0
  13. package/dist/diagnostics/run-diagnostics.d.ts.map +1 -0
  14. package/dist/diagnostics/run-diagnostics.js +90 -0
  15. package/dist/diagnostics/run-diagnostics.js.map +1 -0
  16. package/dist/diagnostics/run-graph-overlay.d.ts +5 -0
  17. package/dist/diagnostics/run-graph-overlay.d.ts.map +1 -0
  18. package/dist/diagnostics/run-graph-overlay.js +125 -0
  19. package/dist/diagnostics/run-graph-overlay.js.map +1 -0
  20. package/dist/diagnostics/run-root-cause.d.ts +4 -0
  21. package/dist/diagnostics/run-root-cause.d.ts.map +1 -0
  22. package/dist/diagnostics/run-root-cause.js +111 -0
  23. package/dist/diagnostics/run-root-cause.js.map +1 -0
  24. package/dist/handoff/host-handoff.d.ts +59 -0
  25. package/dist/handoff/host-handoff.d.ts.map +1 -0
  26. package/dist/handoff/host-handoff.js +235 -0
  27. package/dist/handoff/host-handoff.js.map +1 -0
  28. package/dist/index.d.ts +21 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +21 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/machine/runtime-machine.d.ts +151 -0
  33. package/dist/machine/runtime-machine.d.ts.map +1 -0
  34. package/dist/machine/runtime-machine.js +141 -0
  35. package/dist/machine/runtime-machine.js.map +1 -0
  36. package/dist/policy/retry.d.ts +10 -0
  37. package/dist/policy/retry.d.ts.map +1 -0
  38. package/dist/policy/retry.js +40 -0
  39. package/dist/policy/retry.js.map +1 -0
  40. package/dist/ports/runtime-ports.d.ts +25 -0
  41. package/dist/ports/runtime-ports.d.ts.map +1 -0
  42. package/dist/ports/runtime-ports.js +2 -0
  43. package/dist/ports/runtime-ports.js.map +1 -0
  44. package/dist/revision/workflow-revision.d.ts +18 -0
  45. package/dist/revision/workflow-revision.d.ts.map +1 -0
  46. package/dist/revision/workflow-revision.js +115 -0
  47. package/dist/revision/workflow-revision.js.map +1 -0
  48. package/dist/runtime/durable-workflow-engine.d.ts +78 -0
  49. package/dist/runtime/durable-workflow-engine.d.ts.map +1 -0
  50. package/dist/runtime/durable-workflow-engine.js +1593 -0
  51. package/dist/runtime/durable-workflow-engine.js.map +1 -0
  52. package/dist/runtime/resume-delivery.d.ts +19 -0
  53. package/dist/runtime/resume-delivery.d.ts.map +1 -0
  54. package/dist/runtime/resume-delivery.js +53 -0
  55. package/dist/runtime/resume-delivery.js.map +1 -0
  56. package/dist/runtime/resume-directive.d.ts +6 -0
  57. package/dist/runtime/resume-directive.d.ts.map +1 -0
  58. package/dist/runtime/resume-directive.js +22 -0
  59. package/dist/runtime/resume-directive.js.map +1 -0
  60. package/dist/runtime/state-machines.d.ts +5 -0
  61. package/dist/runtime/state-machines.d.ts.map +1 -0
  62. package/dist/runtime/state-machines.js +53 -0
  63. package/dist/runtime/state-machines.js.map +1 -0
  64. package/dist/store/execution-run-storage-layout.d.ts +15 -0
  65. package/dist/store/execution-run-storage-layout.d.ts.map +1 -0
  66. package/dist/store/execution-run-storage-layout.js +26 -0
  67. package/dist/store/execution-run-storage-layout.js.map +1 -0
  68. package/dist/store/local-artifact-store.d.ts +18 -0
  69. package/dist/store/local-artifact-store.d.ts.map +1 -0
  70. package/dist/store/local-artifact-store.js +79 -0
  71. package/dist/store/local-artifact-store.js.map +1 -0
  72. package/dist/store/local-execution-run-store.d.ts +52 -0
  73. package/dist/store/local-execution-run-store.d.ts.map +1 -0
  74. package/dist/store/local-execution-run-store.js +143 -0
  75. package/dist/store/local-execution-run-store.js.map +1 -0
  76. package/dist/store/local-workflow-store.d.ts +22 -0
  77. package/dist/store/local-workflow-store.d.ts.map +1 -0
  78. package/dist/store/local-workflow-store.js +145 -0
  79. package/dist/store/local-workflow-store.js.map +1 -0
  80. package/dist/store/runtime-snapshot.d.ts +56 -0
  81. package/dist/store/runtime-snapshot.d.ts.map +1 -0
  82. package/dist/store/runtime-snapshot.js +4 -0
  83. package/dist/store/runtime-snapshot.js.map +1 -0
  84. package/dist/store/workflow-storage-layout.d.ts +7 -0
  85. package/dist/store/workflow-storage-layout.d.ts.map +1 -0
  86. package/dist/store/workflow-storage-layout.js +18 -0
  87. package/dist/store/workflow-storage-layout.js.map +1 -0
  88. package/dist/topology/workflow-topology.d.ts +4 -0
  89. package/dist/topology/workflow-topology.d.ts.map +1 -0
  90. package/dist/topology/workflow-topology.js +76 -0
  91. package/dist/topology/workflow-topology.js.map +1 -0
  92. package/package.json +54 -0
@@ -0,0 +1,143 @@
1
+ import { appendFile, mkdir, readdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { cloneSnapshot } from "./runtime-snapshot.js";
4
+ import { runStoragePaths } from "./execution-run-storage-layout.js";
5
+ import { LocalWorkflowStore } from "./local-workflow-store.js";
6
+ const TERMINAL = new Set(["succeeded", "failed", "cancelled", "unknown_outcome"]);
7
+ async function writeAtomic(path, content) {
8
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
9
+ const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;
10
+ await writeFile(temporary, content, { encoding: "utf8", mode: 0o600 });
11
+ await rename(temporary, path);
12
+ }
13
+ const writeJson = (path, value) => writeAtomic(path, `${JSON.stringify(value, null, 2)}\n`);
14
+ async function readEvents(path) {
15
+ try {
16
+ return (await readFile(path, "utf8")).split("\n").filter(Boolean).map((line) => JSON.parse(line));
17
+ }
18
+ catch (error) {
19
+ if (error.code === "ENOENT")
20
+ return [];
21
+ throw error;
22
+ }
23
+ }
24
+ function summary(snapshot) {
25
+ const active = new Set(["ready", "running", "retry_wait", "awaiting_signal", "awaiting_host"]);
26
+ return {
27
+ schemaVersion: "2.0", runId: snapshot.run.runId, goal: snapshot.run.goal, status: snapshot.run.status,
28
+ ...(snapshot.run.planId ? { planId: snapshot.run.planId } : {}),
29
+ workflowRevisionId: snapshot.revision.workflowRevisionId,
30
+ workflow: { name: snapshot.revision.workflowSpec.name, nodeCount: snapshot.ir.nodes.length, irHash: snapshot.ir.hash },
31
+ currentNodes: snapshot.nodeRuns.filter((node) => active.has(node.status)).map((node) => ({ nodeId: node.nodeId, activationId: node.activationId, status: node.status })),
32
+ pending: { signals: snapshot.signals.filter((signal) => signal.status === "waiting").length, hostTasks: snapshot.hostTasks.filter((task) => task.status === "waiting").length },
33
+ artifactCount: snapshot.artifacts.length,
34
+ ...(snapshot.run.outputs ? { outputs: snapshot.run.outputs } : {}), ...(snapshot.run.error ? { error: snapshot.run.error } : {}),
35
+ createdAt: snapshot.run.createdAt, ...(snapshot.run.startedAt ? { startedAt: snapshot.run.startedAt } : {}), updatedAt: snapshot.run.updatedAt,
36
+ ...(snapshot.run.endedAt ? { endedAt: snapshot.run.endedAt } : {}),
37
+ };
38
+ }
39
+ /** Execution-only Store. Planning and immutable Workflow definitions live in independent stores. */
40
+ export class LocalRunStore {
41
+ rootDirectory;
42
+ workflows;
43
+ locks = new Map();
44
+ constructor(rootDirectory, workflows = new LocalWorkflowStore(rootDirectory)) {
45
+ this.rootDirectory = rootDirectory;
46
+ this.workflows = workflows;
47
+ }
48
+ async create(snapshot) { if (await this.tryLoad(snapshot.run.runId))
49
+ throw new Error(`Run already exists: ${snapshot.run.runId}`); await this.save(snapshot); }
50
+ async load(runId) { const value = await this.tryLoad(runId); if (!value)
51
+ throw new Error(`Run not found: ${runId}`); return value; }
52
+ async tryLoad(runId) {
53
+ try {
54
+ const document = JSON.parse(await readFile(runStoragePaths(this.rootDirectory, runId).checkpoint, "utf8"));
55
+ const workflow = await this.workflows.loadRevision(document.workflowRevisionId);
56
+ const { storageVersion: _storageVersion, workflowRevisionId: _revisionId, ...checkpoint } = document;
57
+ return { ...checkpoint, resumeDeliveries: checkpoint.resumeDeliveries ?? [], revision: workflow.revision, ir: workflow.ir, events: [] };
58
+ }
59
+ catch (error) {
60
+ if (error.code === "ENOENT")
61
+ return undefined;
62
+ throw error;
63
+ }
64
+ }
65
+ async save(snapshot) { await this.exclusive(snapshot.run.runId, async () => this.write(snapshot)); }
66
+ async update(runId, updater) {
67
+ let committed;
68
+ await this.exclusive(runId, async () => { committed = cloneSnapshot(await updater(cloneSnapshot(await this.load(runId)))); await this.write(committed); });
69
+ return committed;
70
+ }
71
+ async list() {
72
+ try {
73
+ const entries = await readdir(join(this.rootDirectory, "runs"), { withFileTypes: true });
74
+ const values = await Promise.all(entries.filter((entry) => entry.isDirectory()).map((entry) => this.tryLoad(entry.name).catch(() => undefined)));
75
+ return values.filter((item) => item !== undefined).sort((a, b) => a.run.createdAt.localeCompare(b.run.createdAt));
76
+ }
77
+ catch (error) {
78
+ if (error.code === "ENOENT")
79
+ return [];
80
+ throw error;
81
+ }
82
+ }
83
+ async listSummaries() {
84
+ try {
85
+ const entries = await readdir(join(this.rootDirectory, "runs"), { withFileTypes: true });
86
+ const values = await Promise.all(entries.filter((entry) => entry.isDirectory()).map(async (entry) => {
87
+ try {
88
+ return JSON.parse(await readFile(join(this.rootDirectory, "runs", entry.name, "summary.json"), "utf8"));
89
+ }
90
+ catch {
91
+ return undefined;
92
+ }
93
+ }));
94
+ return values.filter((item) => item !== undefined).sort((a, b) => b.createdAt.localeCompare(a.createdAt));
95
+ }
96
+ catch (error) {
97
+ if (error.code === "ENOENT")
98
+ return [];
99
+ throw error;
100
+ }
101
+ }
102
+ async listNonTerminal() { return (await this.list()).filter((snapshot) => !TERMINAL.has(snapshot.run.status)); }
103
+ async loadSummary(runId) { try {
104
+ return JSON.parse(await readFile(runStoragePaths(this.rootDirectory, runId).summary, "utf8"));
105
+ }
106
+ catch (error) {
107
+ if (error.code === "ENOENT")
108
+ return undefined;
109
+ throw error;
110
+ } }
111
+ async loadTimeline(runId) { return readEvents(runStoragePaths(this.rootDirectory, runId).events); }
112
+ async write(snapshot) {
113
+ const paths = runStoragePaths(this.rootDirectory, snapshot.run.runId);
114
+ const existing = await readEvents(paths.events);
115
+ const lastSequence = existing.at(-1)?.sequence ?? -1;
116
+ const added = snapshot.events.filter((event) => event.sequence > lastSequence).sort((a, b) => a.sequence - b.sequence);
117
+ if (added.length) {
118
+ await mkdir(dirname(paths.events), { recursive: true, mode: 0o700 });
119
+ await appendFile(paths.events, `${added.map((event) => JSON.stringify(event)).join("\n")}\n`, { encoding: "utf8", mode: 0o600 });
120
+ }
121
+ const { revision: _revision, ir: _ir, events: _events, ...rest } = snapshot;
122
+ const checkpoint = { ...rest, storageVersion: "2.0", workflowRevisionId: snapshot.revision.workflowRevisionId };
123
+ await writeJson(paths.checkpoint, checkpoint);
124
+ await writeJson(paths.summary, summary(snapshot));
125
+ }
126
+ async exclusive(runId, operation) {
127
+ const previous = this.locks.get(runId) ?? Promise.resolve();
128
+ let release;
129
+ const current = new Promise((resolve) => { release = resolve; });
130
+ const chained = previous.then(() => current);
131
+ this.locks.set(runId, chained);
132
+ await previous;
133
+ try {
134
+ await operation();
135
+ }
136
+ finally {
137
+ release();
138
+ if (this.locks.get(runId) === chained)
139
+ this.locks.delete(runId);
140
+ }
141
+ }
142
+ }
143
+ //# sourceMappingURL=local-execution-run-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-execution-run-store.js","sourceRoot":"","sources":["../../src/store/local-execution-run-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAwB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;AA0BrG,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,OAAe;IACtD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IAC7D,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,KAAc,EAAiB,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAE5H,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC,CAAC;IAAC,CAAC;IAC1H,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;AACnG,CAAC;AAED,SAAS,OAAO,CAAC,QAAyB;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC,CAAC;IAC/F,OAAO;QACL,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM;QACrG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,kBAAkB,EAAE,QAAQ,CAAC,QAAQ,CAAC,kBAAkB;QACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QACtH,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxK,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,EAAE;QAC/K,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM;QACxC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChI,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS;QAC9I,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,oGAAoG;AACpG,MAAM,OAAO,aAAa;IAEH;IAAwC;IAD5C,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC1D,YAAqB,aAAqB,EAAmB,YAAY,IAAI,kBAAkB,CAAC,aAAa,CAAC;QAAzF,kBAAa,GAAb,aAAa,CAAQ;QAAmB,cAAS,GAAT,SAAS,CAAwC;IAAG,CAAC;IAElH,KAAK,CAAC,MAAM,CAAC,QAAyB,IAAmB,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/L,KAAK,CAAC,IAAI,CAAC,KAAa,IAA8B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC;IAEtK,KAAK,CAAC,OAAO,CAAC,KAAa;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAA8B,CAAC;YACxI,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAChF,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,GAAG,QAAQ,CAAC;YACrG,OAAO,EAAE,GAAG,UAAU,EAAE,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC1I,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IAC5G,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAyB,IAAmB,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpI,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAkF;QAC5G,IAAI,SAA2B,CAAC;QAChC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,GAAG,SAAS,GAAG,aAAa,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3J,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACzF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACjJ,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAA2B,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7I,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IACrG,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACzF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBAClG,IAAI,CAAC;oBAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAe,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAO,SAAS,CAAC;gBAAC,CAAC;YAC5J,CAAC,CAAC,CAAC,CAAC;YACJ,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAsB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAChI,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IACrG,CAAC;IAED,KAAK,CAAC,eAAe,KAA0C,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrJ,KAAK,CAAC,WAAW,CAAC,KAAa,IAAqC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAe,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC,CAAC,CAAC;IACnS,KAAK,CAAC,YAAY,CAAC,KAAa,IAAsC,OAAO,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAErI,KAAK,CAAC,KAAK,CAAC,QAAyB;QAC3C,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvH,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAAC,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAAC,CAAC;QAC7N,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;QAC5E,MAAM,UAAU,GAA8B,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAC3I,MAAM,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC9C,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,SAA8B;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAAC,IAAI,OAAoB,CAAC;QACtF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,QAAQ,CAAC;QACrK,IAAI,CAAC;YAAC,MAAM,SAAS,EAAE,CAAC;QAAC,CAAC;gBAAS,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,OAAO;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;IACpH,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import { type WorkflowDefinition, type WorkflowIR, type WorkflowRevision } from "@atom-workflow-agent/contracts";
2
+ export interface StoredWorkflowRevision {
3
+ readonly schemaVersion: "1.0";
4
+ readonly revision: WorkflowRevision;
5
+ readonly ir: WorkflowIR;
6
+ }
7
+ export declare class LocalWorkflowStore {
8
+ readonly rootDirectory: string;
9
+ private readonly locks;
10
+ constructor(rootDirectory: string);
11
+ save(document: StoredWorkflowRevision): Promise<WorkflowDefinition>;
12
+ loadRevision(workflowRevisionId: string): Promise<StoredWorkflowRevision>;
13
+ inspect(workflowId: string): Promise<{
14
+ readonly definition: WorkflowDefinition;
15
+ readonly revisions: readonly WorkflowRevision[];
16
+ }>;
17
+ list(): Promise<readonly WorkflowDefinition[]>;
18
+ /** Resolve a user-facing name, Workflow id, exact Revision id, or name@revision. */
19
+ resolve(reference: string): Promise<StoredWorkflowRevision>;
20
+ private exclusive;
21
+ }
22
+ //# sourceMappingURL=local-workflow-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-workflow-store.d.ts","sourceRoot":"","sources":["../../src/store/local-workflow-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuE,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGtL,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;CACzB;AAiBD,qBAAa,kBAAkB;IAEjB,QAAQ,CAAC,aAAa,EAAE,MAAM;IAD1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;gBACrC,aAAa,EAAE,MAAM;IAEpC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA6BnE,YAAY,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAezE,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAA;KAAE,CAAC;IAYlI,IAAI,IAAI,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC;IAWpD,oFAAoF;IAC9E,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;YAcnD,SAAS;CAUxB"}
@@ -0,0 +1,145 @@
1
+ import { mkdir, readdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { AtomWorkflowError, WorkflowDefinitionSchema, WorkflowRevisionSchema } from "@atom-workflow-agent/contracts";
4
+ import { workflowStoragePaths } from "./workflow-storage-layout.js";
5
+ async function writeJson(path, value) {
6
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
7
+ const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;
8
+ await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
9
+ await rename(temporary, path);
10
+ }
11
+ function deepFreeze(value) {
12
+ if (value !== null && typeof value === "object" && !Object.isFrozen(value)) {
13
+ Object.freeze(value);
14
+ for (const nested of Object.values(value))
15
+ deepFreeze(nested);
16
+ }
17
+ return value;
18
+ }
19
+ export class LocalWorkflowStore {
20
+ rootDirectory;
21
+ locks = new Map();
22
+ constructor(rootDirectory) {
23
+ this.rootDirectory = rootDirectory;
24
+ }
25
+ async save(document) {
26
+ const revision = WorkflowRevisionSchema.parse(document.revision);
27
+ if (revision.workflowIrHash !== document.ir.hash)
28
+ throw new AtomWorkflowError("WORKFLOW_REVISION_IR_HASH_MISMATCH", "WorkflowRevision does not match its frozen IR");
29
+ return this.exclusive(revision.workflowId, async () => {
30
+ const paths = workflowStoragePaths(this.rootDirectory, revision.workflowId, revision.workflowRevisionId);
31
+ let definition;
32
+ try {
33
+ definition = WorkflowDefinitionSchema.parse(JSON.parse(await readFile(paths.definition, "utf8")));
34
+ }
35
+ catch (error) {
36
+ if (error.code !== "ENOENT")
37
+ throw error;
38
+ }
39
+ if (definition?.revisionIds.includes(revision.workflowRevisionId)) {
40
+ const existing = await this.loadRevision(revision.workflowRevisionId);
41
+ if (existing.revision.workflowSpecHash !== revision.workflowSpecHash)
42
+ throw new AtomWorkflowError("WORKFLOW_REVISION_CONFLICT", `Revision already exists with different content: ${revision.workflowRevisionId}`);
43
+ return definition;
44
+ }
45
+ const now = revision.createdAt;
46
+ const next = WorkflowDefinitionSchema.parse({
47
+ schemaVersion: "1.0",
48
+ workflowId: revision.workflowId,
49
+ name: revision.workflowSpec.name,
50
+ latestRevisionId: revision.workflowRevisionId,
51
+ revisionIds: [...(definition?.revisionIds ?? []), revision.workflowRevisionId],
52
+ createdAt: definition?.createdAt ?? now,
53
+ updatedAt: now,
54
+ });
55
+ await writeJson(paths.revision, { schemaVersion: "1.0", revision, ir: document.ir });
56
+ await writeJson(paths.definition, next);
57
+ return next;
58
+ });
59
+ }
60
+ async loadRevision(workflowRevisionId) {
61
+ const marker = ":revision:";
62
+ const index = workflowRevisionId.lastIndexOf(marker);
63
+ if (index < 1)
64
+ throw new AtomWorkflowError("WORKFLOW_REVISION_ID_INVALID", `Invalid Workflow Revision id: ${workflowRevisionId}`);
65
+ const workflowId = workflowRevisionId.slice(0, index);
66
+ const path = workflowStoragePaths(this.rootDirectory, workflowId, workflowRevisionId).revision;
67
+ try {
68
+ const document = JSON.parse(await readFile(path, "utf8"));
69
+ return { schemaVersion: "1.0", revision: WorkflowRevisionSchema.parse(document.revision), ir: deepFreeze(document.ir) };
70
+ }
71
+ catch (error) {
72
+ if (error.code === "ENOENT")
73
+ throw new AtomWorkflowError("WORKFLOW_REVISION_NOT_FOUND", `Workflow Revision not found: ${workflowRevisionId}`);
74
+ throw error;
75
+ }
76
+ }
77
+ async inspect(workflowId) {
78
+ const paths = workflowStoragePaths(this.rootDirectory, workflowId);
79
+ try {
80
+ const definition = WorkflowDefinitionSchema.parse(JSON.parse(await readFile(paths.definition, "utf8")));
81
+ const revisions = await Promise.all(definition.revisionIds.map(async (id) => (await this.loadRevision(id)).revision));
82
+ return { definition, revisions };
83
+ }
84
+ catch (error) {
85
+ if (error.code === "ENOENT")
86
+ throw new AtomWorkflowError("WORKFLOW_NOT_FOUND", `Workflow not found: ${workflowId}`);
87
+ throw error;
88
+ }
89
+ }
90
+ async list() {
91
+ try {
92
+ const entries = await readdir(join(this.rootDirectory, "workflows"), { withFileTypes: true });
93
+ const definitions = await Promise.all(entries.filter((entry) => entry.isDirectory()).map(async (entry) => {
94
+ try {
95
+ return WorkflowDefinitionSchema.parse(JSON.parse(await readFile(join(this.rootDirectory, "workflows", entry.name, "definition.json"), "utf8")));
96
+ }
97
+ catch {
98
+ return undefined;
99
+ }
100
+ }));
101
+ return definitions.filter((item) => item !== undefined).sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
102
+ }
103
+ catch (error) {
104
+ if (error.code === "ENOENT")
105
+ return [];
106
+ throw error;
107
+ }
108
+ }
109
+ /** Resolve a user-facing name, Workflow id, exact Revision id, or name@revision. */
110
+ async resolve(reference) {
111
+ if (reference.includes(":revision:"))
112
+ return this.loadRevision(reference);
113
+ const revisionMatch = /^(.*)@(\d+)$/.exec(reference);
114
+ const identity = revisionMatch?.[1] ?? reference;
115
+ const definitions = (await this.list()).filter((item) => item.workflowId === identity || item.name === identity);
116
+ if (definitions.length === 0)
117
+ throw new AtomWorkflowError("WORKFLOW_NOT_FOUND", `Workflow not found: ${identity}`);
118
+ if (definitions.length > 1)
119
+ throw new AtomWorkflowError("WORKFLOW_REFERENCE_AMBIGUOUS", `Workflow reference matches multiple definitions: ${identity}`);
120
+ const definition = definitions[0];
121
+ if (!revisionMatch)
122
+ return this.loadRevision(definition.latestRevisionId);
123
+ const revisionId = `${definition.workflowId}:revision:${Number(revisionMatch[2])}`;
124
+ if (!definition.revisionIds.includes(revisionId))
125
+ throw new AtomWorkflowError("WORKFLOW_REVISION_NOT_FOUND", `Workflow Revision not found: ${reference}`);
126
+ return this.loadRevision(revisionId);
127
+ }
128
+ async exclusive(workflowId, operation) {
129
+ const previous = this.locks.get(workflowId) ?? Promise.resolve();
130
+ let release;
131
+ const current = new Promise((resolve) => { release = resolve; });
132
+ const chained = previous.then(() => current);
133
+ this.locks.set(workflowId, chained);
134
+ await previous;
135
+ try {
136
+ return await operation();
137
+ }
138
+ finally {
139
+ release();
140
+ if (this.locks.get(workflowId) === chained)
141
+ this.locks.delete(workflowId);
142
+ }
143
+ }
144
+ }
145
+ //# sourceMappingURL=local-workflow-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-workflow-store.js","sourceRoot":"","sources":["../../src/store/local-workflow-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,sBAAsB,EAAmE,MAAM,gCAAgC,CAAC;AACtL,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAQpE,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,KAAc;IACnD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IAC7D,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrG,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,UAAU,CAAI,KAAQ;IAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC;YAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,OAAO,kBAAkB;IAER;IADJ,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC1D,YAAqB,aAAqB;QAArB,kBAAa,GAAb,aAAa,CAAQ;IAAG,CAAC;IAE9C,KAAK,CAAC,IAAI,CAAC,QAAgC;QACzC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,cAAc,KAAK,QAAQ,CAAC,EAAE,CAAC,IAAI;YAAE,MAAM,IAAI,iBAAiB,CAAC,oCAAoC,EAAE,+CAA+C,CAAC,CAAC;QACrK,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YACzG,IAAI,UAA0C,CAAC;YAC/C,IAAI,CAAC;gBAAC,UAAU,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAC1G,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,KAAK,CAAC;YAAC,CAAC;YACtF,IAAI,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAClE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;gBACtE,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,KAAK,QAAQ,CAAC,gBAAgB;oBAAE,MAAM,IAAI,iBAAiB,CAAC,4BAA4B,EAAE,mDAAmD,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC;gBAClN,OAAO,UAAU,CAAC;YACpB,CAAC;YACD,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC;YAC/B,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,CAAC;gBAC1C,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI;gBAChC,gBAAgB,EAAE,QAAQ,CAAC,kBAAkB;gBAC7C,WAAW,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC;gBAC9E,SAAS,EAAE,UAAU,EAAE,SAAS,IAAI,GAAG;gBACvC,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;YACH,MAAM,SAAS,CAAC,KAAK,CAAC,QAAS,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAmC,CAAC,CAAC;YACvH,MAAM,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,kBAA0B;QAC3C,MAAM,MAAM,GAAG,YAAY,CAAC;QAC5B,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,EAAE,iCAAiC,kBAAkB,EAAE,CAAC,CAAC;QAClI,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC,QAAS,CAAC;QAChG,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAA2B,CAAC;YACpF,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1H,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,iBAAiB,CAAC,6BAA6B,EAAE,gCAAgC,kBAAkB,EAAE,CAAC,CAAC;YACzK,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAkB;QAC9B,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACxG,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,uBAAuB,UAAU,EAAE,CAAC,CAAC;YAC/I,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9F,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACvG,IAAI,CAAC;oBAAC,OAAO,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBACxJ,MAAM,CAAC;oBAAC,OAAO,SAAS,CAAC;gBAAC,CAAC;YAC7B,CAAC,CAAC,CAAC,CAAC;YACJ,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAA8B,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7I,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IACrG,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,IAAI,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QACjD,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACjH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,uBAAuB,QAAQ,EAAE,CAAC,CAAC;QACnH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,EAAE,oDAAoD,QAAQ,EAAE,CAAC,CAAC;QACxJ,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC;QACnC,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,GAAG,UAAU,CAAC,UAAU,aAAa,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,MAAM,IAAI,iBAAiB,CAAC,6BAA6B,EAAE,gCAAgC,SAAS,EAAE,CAAC,CAAC;QAC1J,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,SAAS,CAAI,UAAkB,EAAE,SAA2B;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACjE,IAAI,OAAoB,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpC,MAAM,QAAQ,CAAC;QACf,IAAI,CAAC;YAAC,OAAO,MAAM,SAAS,EAAE,CAAC;QAAC,CAAC;gBACzB,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,OAAO;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAAC,CAAC;IACnG,CAAC;CACF"}
@@ -0,0 +1,56 @@
1
+ import type { ArtifactRecord, HostTaskRecord, JsonValue, ResourceLeaseRecord, ResumeDeliveryRecord, RuntimeEvent, SignalRecord, WorkflowAttempt, WorkflowIR, WorkflowNodeRunRecord, WorkflowRevision, WorkflowRun } from "@atom-workflow-agent/contracts";
2
+ export interface PendingEdgeActivation {
3
+ readonly edgeId: string;
4
+ readonly targetNodeId: string;
5
+ readonly overlay: Readonly<Record<string, JsonValue>>;
6
+ readonly mapRunId?: string;
7
+ readonly mapItem?: JsonValue;
8
+ readonly mapIndex?: number;
9
+ readonly controlLineage: readonly string[];
10
+ }
11
+ export interface DecisionRecord {
12
+ readonly activationId: string;
13
+ readonly nodeId: string;
14
+ readonly selectedBranch: string;
15
+ readonly matched: boolean;
16
+ readonly edgeId: string;
17
+ readonly selectedAt: string;
18
+ }
19
+ export interface MapRunRecord {
20
+ readonly mapRunId: string;
21
+ readonly mapNodeId: string;
22
+ readonly activationId: string;
23
+ readonly status: "running" | "succeeded" | "failed";
24
+ readonly items: readonly JsonValue[];
25
+ readonly nextIndex: number;
26
+ readonly activeIndices: readonly number[];
27
+ readonly completedIndices: readonly number[];
28
+ readonly createdAt: string;
29
+ readonly updatedAt: string;
30
+ readonly endedAt?: string;
31
+ }
32
+ /** One atomically persisted scheduler checkpoint. */
33
+ export interface RuntimeSnapshot {
34
+ readonly schemaVersion: "1.0";
35
+ readonly run: WorkflowRun;
36
+ readonly revision: WorkflowRevision;
37
+ readonly ir: WorkflowIR;
38
+ readonly nodeRuns: readonly WorkflowNodeRunRecord[];
39
+ readonly attempts: readonly WorkflowAttempt[];
40
+ readonly artifacts: readonly ArtifactRecord[];
41
+ readonly signals: readonly SignalRecord[];
42
+ readonly hostTasks: readonly HostTaskRecord[];
43
+ readonly resumeDeliveries: readonly ResumeDeliveryRecord[];
44
+ readonly resourceLeases: readonly ResourceLeaseRecord[];
45
+ readonly events: readonly RuntimeEvent[];
46
+ /** Monotonic sequence. events contains only the not-yet-flushed batch. */
47
+ readonly eventSequence: number;
48
+ readonly transitionCount: number;
49
+ readonly edgeTraversals: Readonly<Record<string, number>>;
50
+ readonly activationCounts: Readonly<Record<string, number>>;
51
+ readonly pendingEdges: readonly PendingEdgeActivation[];
52
+ readonly decisions: readonly DecisionRecord[];
53
+ readonly mapRuns: readonly MapRunRecord[];
54
+ }
55
+ export declare function cloneSnapshot(snapshot: RuntimeSnapshot): RuntimeSnapshot;
56
+ //# sourceMappingURL=runtime-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-snapshot.d.ts","sourceRoot":"","sources":["../../src/store/runtime-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export function cloneSnapshot(snapshot) {
2
+ return JSON.parse(JSON.stringify(snapshot));
3
+ }
4
+ //# sourceMappingURL=runtime-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-snapshot.js","sourceRoot":"","sources":["../../src/store/runtime-snapshot.ts"],"names":[],"mappings":"AAsEA,MAAM,UAAU,aAAa,CAAC,QAAyB;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAoB,CAAC;AACjE,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function workflowStoragePaths(root: string, workflowId: string, revisionId?: string): {
2
+ revision?: string;
3
+ directory: string;
4
+ definition: string;
5
+ revisions: string;
6
+ };
7
+ //# sourceMappingURL=workflow-storage-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-storage-layout.d.ts","sourceRoot":"","sources":["../../src/store/workflow-storage-layout.ts"],"names":[],"mappings":"AASA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;;;;;EAQzF"}
@@ -0,0 +1,18 @@
1
+ import { createHash } from "node:crypto";
2
+ import { join } from "node:path";
3
+ function safe(value) {
4
+ const normalized = value.normalize("NFKD").replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 120);
5
+ if (!normalized || normalized === "." || normalized === "..")
6
+ return createHash("sha256").update(value).digest("hex").slice(0, 16);
7
+ return normalized === value ? normalized : `${normalized}--${createHash("sha256").update(value).digest("hex").slice(0, 12)}`;
8
+ }
9
+ export function workflowStoragePaths(root, workflowId, revisionId) {
10
+ const directory = join(root, "workflows", safe(workflowId));
11
+ return {
12
+ directory,
13
+ definition: join(directory, "definition.json"),
14
+ revisions: join(directory, "revisions"),
15
+ ...(revisionId ? { revision: join(directory, "revisions", `${safe(revisionId)}.json`) } : {}),
16
+ };
17
+ }
18
+ //# sourceMappingURL=workflow-storage-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-storage-layout.js","sourceRoot":"","sources":["../../src/store/workflow-storage-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,SAAS,IAAI,CAAC,KAAa;IACzB,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnH,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnI,OAAO,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC/H,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,UAAkB,EAAE,UAAmB;IACxF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5D,OAAO;QACL,SAAS;QACT,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC;QAC9C,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;QACvC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { WorkflowIR, WorkflowRevision, WorkflowTopologyView } from "@atom-workflow-agent/contracts";
2
+ export declare function projectWorkflowTopology(revision: WorkflowRevision, ir: WorkflowIR): WorkflowTopologyView;
3
+ export declare function renderWorkflowTopology(view: WorkflowTopologyView): string;
4
+ //# sourceMappingURL=workflow-topology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-topology.d.ts","sourceRoot":"","sources":["../../src/topology/workflow-topology.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAoBpH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,EAAE,EAAE,UAAU,GAAG,oBAAoB,CAmCxG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAUzE"}
@@ -0,0 +1,76 @@
1
+ function collectReferences(value, path, found) {
2
+ if (Array.isArray(value))
3
+ return value.forEach((item, index) => collectReferences(item, `${path}[${index}]`, found));
4
+ if (value === null || typeof value !== "object")
5
+ return;
6
+ if (Object.keys(value).length === 1 && typeof value.$ref === "string") {
7
+ found.push({ path, reference: value.$ref });
8
+ return;
9
+ }
10
+ for (const [key, item] of Object.entries(value))
11
+ collectReferences(item, `${path}.${key}`, found);
12
+ }
13
+ function sourceOf(reference) {
14
+ if (reference.startsWith("workflow.inputs"))
15
+ return "$workflow";
16
+ if (reference.startsWith("map.item") || reference === "map.index")
17
+ return "$map";
18
+ const dependency = /^dependencies\.([a-z][a-z0-9-]*)\./.exec(reference);
19
+ const historical = /^nodes\.([a-z][a-z0-9-]*)\./.exec(reference);
20
+ return dependency?.[1] ?? historical?.[1] ?? "$runtime";
21
+ }
22
+ export function projectWorkflowTopology(revision, ir) {
23
+ const dataEdges = [];
24
+ for (const node of ir.nodes) {
25
+ const references = [];
26
+ if (node.kind === "atom") {
27
+ collectReferences(node.input, "$.input", references);
28
+ }
29
+ else if (node.kind === "switch")
30
+ collectReferences(node.select, "$.select", references);
31
+ else if (node.kind === "map")
32
+ collectReferences(node.items, "$.items", references);
33
+ for (const reference of references)
34
+ dataEdges.push({ source: sourceOf(reference.reference), target: node.id, targetPath: reference.path, reference: reference.reference });
35
+ }
36
+ for (const edge of ir.control.edges) {
37
+ const references = [];
38
+ collectReferences(edge.with, `$.controlEdges.${edge.id}.with`, references);
39
+ for (const target of edge.targets)
40
+ for (const reference of references)
41
+ dataEdges.push({ source: reference.reference.startsWith("node.output") ? edge.sourceNodeId : sourceOf(reference.reference), target, targetPath: reference.path, reference: reference.reference });
42
+ }
43
+ for (const [name, reference] of Object.entries(ir.outputs))
44
+ dataEdges.push({ source: sourceOf(reference.$ref), target: `$output:${name}`, targetPath: `$.outputs.${name}`, reference: reference.$ref });
45
+ return {
46
+ schemaVersion: "1.0",
47
+ workflowRevisionId: revision.workflowRevisionId,
48
+ irHash: ir.hash,
49
+ nodes: ir.nodes.map((node) => ({ id: node.id, kind: node.kind, ...(node.kind === "atom" ? { atom: node.atom.key } : {}), ...(node.mapScope ? { mapScope: node.mapScope } : {}) })).sort((a, b) => a.id.localeCompare(b.id)),
50
+ controlEdges: ir.control.edges.map((edge) => ({
51
+ id: edge.id, source: edge.sourceNodeId, targets: [...edge.targets], kind: edge.kind,
52
+ ...(edge.branchId ? { branch: edge.branchId } : {}), ...(edge.terminal ? { terminal: edge.terminal } : {}),
53
+ backEdge: edge.backEdge, ...(edge.maxTraversals ? { maxTraversals: edge.maxTraversals } : {}),
54
+ })).sort((a, b) => a.id.localeCompare(b.id)),
55
+ dataEdges: dataEdges.sort((a, b) => a.target.localeCompare(b.target) || a.targetPath.localeCompare(b.targetPath) || a.source.localeCompare(b.source)),
56
+ groups: {
57
+ entries: [...ir.control.entry],
58
+ forks: [...ir.readiness.forks].sort((a, b) => a.edgeId.localeCompare(b.edgeId)).map((item) => ({ edgeId: item.edgeId, targets: [...item.targets] })),
59
+ joins: [...ir.readiness.joins].sort((a, b) => a.nodeId.localeCompare(b.nodeId)).map((item) => ({ nodeId: item.nodeId, dependencies: [...item.dependencies] })),
60
+ maps: ir.nodes.filter((node) => node.kind === "map").map((node) => ({ nodeId: node.id, maxItems: node.maxItems, maxConcurrency: node.maxConcurrency, bodyNodeIds: [...node.bodyNodeIds] })).sort((a, b) => a.nodeId.localeCompare(b.nodeId)),
61
+ switches: ir.nodes.filter((node) => node.kind === "switch").map((node) => ({ nodeId: node.id, cases: [...node.caseIds], hasDefault: ir.control.edges.some((edge) => edge.sourceNodeId === node.id && edge.kind === "switch-default") })).sort((a, b) => a.nodeId.localeCompare(b.nodeId)),
62
+ },
63
+ };
64
+ }
65
+ export function renderWorkflowTopology(view) {
66
+ const lines = [`Workflow ${view.workflowRevisionId}`, `entry: ${view.groups.entries.join(", ")}`];
67
+ for (const node of view.nodes) {
68
+ const outgoing = view.controlEdges.filter((edge) => edge.source === node.id).map((edge) => {
69
+ const target = edge.terminal ?? edge.targets.join(",");
70
+ return `${edge.branch ? `[${edge.branch}] ` : ""}${target}${edge.backEdge ? ` ↩≤${edge.maxTraversals ?? "policy"}` : ""}`;
71
+ });
72
+ lines.push(`${node.id} (${node.kind}${node.atom ? `: ${node.atom}` : ""})${outgoing.length ? ` -> ${outgoing.join(" | ")}` : ""}`);
73
+ }
74
+ return lines.join("\n");
75
+ }
76
+ //# sourceMappingURL=workflow-topology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-topology.js","sourceRoot":"","sources":["../../src/topology/workflow-topology.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@atom-workflow-agent/workflow-engine",
3
+ "version": "0.1.0",
4
+ "description": "Durable execution of frozen workflow revisions.",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/joekbits/atom-workflow-agent.git",
9
+ "directory": "packages/workflow-engine"
10
+ },
11
+ "homepage": "https://github.com/joekbits/atom-workflow-agent/tree/main/packages/workflow-engine#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/joekbits/atom-workflow-agent/issues"
14
+ },
15
+ "keywords": [
16
+ "workflow",
17
+ "durable-execution",
18
+ "runtime"
19
+ ],
20
+ "type": "module",
21
+ "files": [
22
+ "dist",
23
+ "README.md",
24
+ "README.zh-CN.md"
25
+ ],
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "default": "./dist/index.js"
30
+ }
31
+ },
32
+ "publishConfig": {
33
+ "access": "public",
34
+ "provenance": true
35
+ },
36
+ "engines": {
37
+ "node": ">=22"
38
+ },
39
+ "dependencies": {
40
+ "zod": "^4.0.0",
41
+ "@atom-workflow-agent/atom-catalog": "0.1.0",
42
+ "@atom-workflow-agent/atom-executor": "0.1.0",
43
+ "@atom-workflow-agent/atom-sdk": "0.1.0",
44
+ "@atom-workflow-agent/contracts": "0.1.0"
45
+ },
46
+ "devDependencies": {
47
+ "@atom-workflow-agent/workflow-compiler": "0.1.0"
48
+ },
49
+ "scripts": {
50
+ "build": "tsc -p tsconfig.json",
51
+ "typecheck": "tsc -p tsconfig.json --noEmit",
52
+ "test": "vitest run"
53
+ }
54
+ }