automategraph 1.5.0 → 1.5.3

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 (88) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/UPGRADE-PROPOSAL.md +141 -0
  3. package/docs/diagrams/c19-resilience-scenario.md +61 -0
  4. package/docs/diagrams/c19-resilience-scenario.mmd +28 -0
  5. package/docs/diagrams/c19-resilience-scenario.svg +181 -0
  6. package/examples/README.md +206 -0
  7. package/examples/branching-edges.ts +192 -0
  8. package/examples/branching-graph.ts +333 -0
  9. package/examples/branching-router.ts +475 -0
  10. package/examples/json-graph.ts +231 -0
  11. package/examples/json-scripts.ts +152 -0
  12. package/examples/order-flow.functions.cjs +32 -0
  13. package/examples/order-flow.graph.json +27 -0
  14. package/examples/order-flow.scripted.graph.json +68 -0
  15. package/js/examples/branching-edges.js +133 -0
  16. package/js/examples/branching-edges.js.map +1 -0
  17. package/js/examples/branching-graph.js +232 -0
  18. package/js/examples/branching-graph.js.map +1 -0
  19. package/js/examples/branching-router.js +305 -0
  20. package/js/examples/branching-router.js.map +1 -0
  21. package/js/examples/json-graph.js +197 -0
  22. package/js/examples/json-graph.js.map +1 -0
  23. package/js/examples/json-scripts.js +131 -0
  24. package/js/examples/json-scripts.js.map +1 -0
  25. package/js/tests/async.test.js +592 -0
  26. package/js/tests/async.test.js.map +1 -0
  27. package/js/tests/complex.test.js +972 -0
  28. package/js/tests/complex.test.js.map +1 -0
  29. package/js/tests/conformance.test.js +365 -0
  30. package/js/tests/conformance.test.js.map +1 -0
  31. package/js/tests/edges.test.js +702 -0
  32. package/js/tests/edges.test.js.map +1 -0
  33. package/js/tests/graphjson.test.js +504 -0
  34. package/js/tests/graphjson.test.js.map +1 -0
  35. package/js/tests/harness.js +192 -0
  36. package/js/tests/harness.js.map +1 -0
  37. package/js/tests/helpers.js +136 -0
  38. package/js/tests/helpers.js.map +1 -0
  39. package/js/tests/lint.test.js +317 -0
  40. package/js/tests/lint.test.js.map +1 -0
  41. package/js/tests/registry.test.js +705 -0
  42. package/js/tests/registry.test.js.map +1 -0
  43. package/js/tests/report.js +422 -0
  44. package/js/tests/report.js.map +1 -0
  45. package/js/tests/runner.js +67 -0
  46. package/js/tests/runner.js.map +1 -0
  47. package/js/tests/scripts.test.js +552 -0
  48. package/js/tests/scripts.test.js.map +1 -0
  49. package/js/tests/unit.test.js +1239 -0
  50. package/js/tests/unit.test.js.map +1 -0
  51. package/js/tests/upgrade.test.js +618 -0
  52. package/js/tests/upgrade.test.js.map +1 -0
  53. package/package.json +2 -9
  54. package/report/index.html +3727 -0
  55. package/report/report.json +3053 -0
  56. package/tests/async.test.ts +668 -0
  57. package/tests/complex.test.ts +1123 -0
  58. package/tests/conformance.test.ts +442 -0
  59. package/tests/edges.test.ts +848 -0
  60. package/tests/fixtures/scripts/bad-registration.cjs +4 -0
  61. package/tests/fixtures/scripts/broken.cjs +2 -0
  62. package/tests/fixtures/scripts/cjs-default.js +4 -0
  63. package/tests/fixtures/scripts/collide-a.cjs +4 -0
  64. package/tests/fixtures/scripts/collide-b.cjs +4 -0
  65. package/tests/fixtures/scripts/empty.cjs +2 -0
  66. package/tests/fixtures/scripts/esm-functions.mjs +10 -0
  67. package/tests/fixtures/scripts/esm-syntax.js +3 -0
  68. package/tests/fixtures/scripts/global-channel.cjs +6 -0
  69. package/tests/fixtures/scripts/global-channel.mjs +7 -0
  70. package/tests/fixtures/scripts/mismatch.cjs +4 -0
  71. package/tests/fixtures/scripts/needs-sibling.cjs +7 -0
  72. package/tests/fixtures/scripts/order.cjs +14 -0
  73. package/tests/fixtures/scripts/sibling-helper.cjs +3 -0
  74. package/tests/fixtures/scripts/throwing-global.mjs +6 -0
  75. package/tests/graphjson.test.ts +737 -0
  76. package/tests/harness.ts +291 -0
  77. package/tests/helpers.ts +216 -0
  78. package/tests/lint.test.ts +381 -0
  79. package/tests/registry.test.ts +1134 -0
  80. package/tests/report.ts +452 -0
  81. package/tests/runner.ts +58 -0
  82. package/tests/scripts.test.ts +970 -0
  83. package/tests/unit.test.ts +1192 -0
  84. package/tests/upgrade.test.ts +725 -0
  85. package/tools/server.mjs +152 -0
  86. package/tsconfig.browser.json +19 -0
  87. package/tsconfig.json +18 -0
  88. package/tsconfig.publish.json +13 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branching-graph.js","sourceRoot":"","sources":["../../examples/branching-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,305 @@
1
+ "use strict";
2
+ /* ============================================================
3
+ * Branching router example — the a → b/c/d/e/f picture
4
+ * ------------------------------------------------------------
5
+ * The graph under discussion:
6
+ *
7
+ * a ── result === 1 ────────────────▶ b ──(forces)──▶ f
8
+ * a ── test(result) === true ───────▶ c
9
+ * a ── otherwise ───────────────────▶ d
10
+ * a ── on throw ────────────────────▶ e
11
+ * a ── on retry ────────────────────▶ f
12
+ *
13
+ * WHY THIS IS NOT A SINGLE GraphDefinition
14
+ * GraphDefinition.next is an UNCONDITIONAL fan-out: every target is
15
+ * scheduled, every time. The engine also has no "goto" and no
16
+ * per-attempt transition. So the arrows above cannot be encoded in
17
+ * the definition — they are routing *decisions*, and decisions need
18
+ * a place to run. This file keeps src/automategraph.ts untouched and
19
+ * puts the decisions in a small host-side router: one engine
20
+ * execution per step, the router inspects the finished execution
21
+ * (output / attempts / errors / control events) and chooses the next
22
+ * hop.
23
+ *
24
+ * Arrow → mechanism used here (all engine-native)
25
+ * ------------------------------------------------------------------
26
+ * result === 1 → returned value + ordered `routes` predicate
27
+ * test(...) === true→ returned value + ordered `routes` predicate
28
+ * otherwise → `otherwise` fallback target
29
+ * on throw → report.status / unhandled error → `onThrow`
30
+ * on retry → context.attempt > 1 (seen via node.started) → `onRetry`
31
+ * b forces f → b returns void and emits "router.goto" on the
32
+ * public event bus; the router honours the request
33
+ *
34
+ * Decision precedence (first match wins): goto → throw → retry →
35
+ * routes → otherwise → stop. Flip `onRetry` before `onThrow` in
36
+ * decide() if you prefer "any retry goes to f, even a failed one".
37
+ *
38
+ * Run it: npm run example:branching
39
+ * Exits non-zero if any scenario deviates from its expected path, so
40
+ * it doubles as a smoke test.
41
+ * ============================================================ */
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.GOTO_EVENT = exports.test = void 0;
44
+ exports.buildSteps = buildSteps;
45
+ exports.decide = decide;
46
+ exports.runWalk = runWalk;
47
+ const automategraph_1 = require("../src/automategraph");
48
+ /** The spec's `test(result)`: decides between c and d. */
49
+ const test = (result) => result === 2;
50
+ exports.test = test;
51
+ /** Event a node emits when it wants to force the next hop from inside. */
52
+ exports.GOTO_EVENT = "router.goto";
53
+ /* =========================
54
+ * 2. The nodes
55
+ * ========================= */
56
+ function buildSteps(state) {
57
+ return {
58
+ /**
59
+ * a — produces 1 | 2 | 3, or throws.
60
+ * It carries the whole arrow table from the picture.
61
+ */
62
+ a: {
63
+ run: (_state, context) => {
64
+ if (state.seed === "throw") {
65
+ throw new Error("a: upstream exploded");
66
+ }
67
+ if (state.seed === "retry" && context.attempt === 1) {
68
+ throw new Error(`a: transient failure on attempt ${context.attempt}`);
69
+ }
70
+ // On the retry path, attempt 2 succeeds with value 2.
71
+ return state.seed === "retry" ? 2 : state.seed;
72
+ },
73
+ retry: { maxAttempts: 2, delayMs: 10 },
74
+ errorPolicy: "RETRY",
75
+ routes: {
76
+ routes: [
77
+ { when: value => value === 1, to: "b" },
78
+ { when: value => typeof value === "number" && (0, exports.test)(value), to: "c" }
79
+ ],
80
+ otherwise: "d",
81
+ onThrow: "e",
82
+ onRetry: "f"
83
+ }
84
+ },
85
+ /**
86
+ * b — returns void, but forces the walk to f *from inside its own
87
+ * execution* by emitting a control message. The engine never
88
+ * schedules the jump; the router (host code) performs it.
89
+ */
90
+ b: {
91
+ run: async (_state, context) => {
92
+ await context.emit(exports.GOTO_EVENT, {
93
+ to: "f",
94
+ reason: "b short-circuits to f"
95
+ });
96
+ return undefined; // void, as specified
97
+ },
98
+ // Belt and braces: also true if a goto is ever ignored.
99
+ routes: { otherwise: "f" }
100
+ },
101
+ c: { run: () => "c: even result handled" },
102
+ d: { run: () => "d: fallback branch handled" },
103
+ /** e — the throw route; can read the failure the router recorded. */
104
+ e: {
105
+ run: () => `e: recovered from ${state.lastError?.nodeId ?? "?"} (${state.lastError?.code ?? "?"})`
106
+ },
107
+ f: { run: () => "f: retry/forced path handled" }
108
+ };
109
+ }
110
+ /* =========================
111
+ * 3. One step = one execution
112
+ * ========================= */
113
+ /**
114
+ * Build the single-node graph for a hop. The node is BOTH the entry
115
+ * and the terminal, which keeps the graph lint-clean (the v1.2
116
+ * SUCCESS_DEAD_END rule needs each non-terminal node to have a
117
+ * `next`) and guarantees the engine schedules nothing on its own.
118
+ *
119
+ * `onThrow` is deliberately NOT declared on the engine node: its
120
+ * target would have to exist inside this one-node graph, and error
121
+ * routing is the router's job here (see decide()).
122
+ */
123
+ function stepGraph(id, step, state) {
124
+ const definition = {
125
+ id,
126
+ run: (context) => step.run(state, context),
127
+ retry: step.retry,
128
+ errorPolicy: step.errorPolicy
129
+ };
130
+ return {
131
+ id: `branching-step:${id}`,
132
+ version: "1.0.0",
133
+ entryNodes: [id],
134
+ terminalNodes: [id],
135
+ nodes: { [id]: definition }
136
+ };
137
+ }
138
+ function isGotoRequest(value) {
139
+ return (typeof value === "object" &&
140
+ value !== null &&
141
+ typeof value.to === "string");
142
+ }
143
+ async function runOne(nodeId, step, state, storage) {
144
+ const engine = new automategraph_1.GraphExecutionEngine(stepGraph(nodeId, step, state), {
145
+ storage,
146
+ maxActivations: 1 // a hop starts exactly one activation
147
+ });
148
+ let attempts = 0;
149
+ const gotoRequests = [];
150
+ // Required listeners are awaited by the bus, so by the time run()
151
+ // resolves we have the true attempt count and every goto request.
152
+ engine.events.on("node.started", payload => {
153
+ const { attempt } = payload;
154
+ attempts = Math.max(attempts, attempt);
155
+ }, { required: true });
156
+ engine.events.on(exports.GOTO_EVENT, payload => {
157
+ if (isGotoRequest(payload))
158
+ gotoRequests.push(payload);
159
+ }, { required: true });
160
+ const report = await engine.run();
161
+ return { report, attempts, gotoRequests };
162
+ }
163
+ /**
164
+ * Decision precedence: goto → throw → retry → returned value → stop.
165
+ * A *failed* step goes to `onThrow` even when it consumed retries;
166
+ * `onRetry` is for a step that recovered on a later attempt.
167
+ */
168
+ function decide(routes, run) {
169
+ const { report, attempts, gotoRequests } = run;
170
+ if (gotoRequests.length > 0) {
171
+ const request = gotoRequests[0];
172
+ return {
173
+ by: "goto",
174
+ to: request.to,
175
+ reason: `forced from inside the node (${request.reason ?? "no reason given"})`
176
+ };
177
+ }
178
+ const failed = report.status !== "COMPLETED";
179
+ if (failed) {
180
+ if (routes?.onThrow) {
181
+ return { by: "throw", to: routes.onThrow, reason: `step ended ${report.status}` };
182
+ }
183
+ return { by: "none", reason: `step ended ${report.status} and no onThrow is declared` };
184
+ }
185
+ if (attempts > 1 && routes?.onRetry) {
186
+ return { by: "retry", to: routes.onRetry, reason: `recovered on attempt ${attempts}` };
187
+ }
188
+ const output = report.results[0]?.output;
189
+ for (const route of routes?.routes ?? []) {
190
+ if (route.when(output)) {
191
+ return { by: "return", to: route.to, reason: "value route matched" };
192
+ }
193
+ }
194
+ if (routes?.otherwise) {
195
+ return { by: "otherwise", to: routes.otherwise, reason: "no value route matched" };
196
+ }
197
+ return { by: "none", reason: "no transition declared; walk complete" };
198
+ }
199
+ /* =========================
200
+ * 5. The walk factory (public entry point)
201
+ * ========================= */
202
+ /**
203
+ * Seeds the walk, builds the steps against the shared state, and runs
204
+ * the router loop. This is the whole "interpreter": run one node, read
205
+ * its outcome, follow the matching arrow.
206
+ */
207
+ async function runWalk(seed, options = {}) {
208
+ const storage = options.storage ?? new automategraph_1.InMemoryStorage();
209
+ const maxSteps = options.maxSteps ?? 64;
210
+ const state = { seed, visited: [], notes: [] };
211
+ const steps = buildSteps(state);
212
+ const hops = [];
213
+ const executionIds = [];
214
+ let current = "a";
215
+ while (current !== undefined) {
216
+ if (hops.length >= maxSteps) {
217
+ throw new automategraph_1.AutomateGraphError(`Walk exceeded maxSteps=${maxSteps} (possible cycle)`, "WALK_STEP_LIMIT", { visited: [...state.visited] });
218
+ }
219
+ const step = steps[current];
220
+ if (!step) {
221
+ throw new automategraph_1.AutomateGraphError(`Route target "${current}" has no node definition`, "ROUTE_TARGET_UNKNOWN", { visited: [...state.visited] });
222
+ }
223
+ const startedAt = Date.now();
224
+ const run = await runOne(current, step, state, storage);
225
+ const { report, attempts, gotoRequests } = run;
226
+ // Record the failure so the next hop (e) can read it.
227
+ const unhandled = report.errors.find(error => !error.handled);
228
+ if (unhandled) {
229
+ state.lastError = {
230
+ nodeId: unhandled.nodeId ?? current,
231
+ code: unhandled.code,
232
+ message: unhandled.message
233
+ };
234
+ }
235
+ const decision = decide(step.routes, run);
236
+ const hop = {
237
+ step: hops.length + 1,
238
+ nodeId: current,
239
+ executionId: report.executionId,
240
+ status: report.status,
241
+ attempts,
242
+ output: report.results[0]?.output,
243
+ errorCode: report.errors[0]?.code,
244
+ decision,
245
+ durationMs: Date.now() - startedAt
246
+ };
247
+ hops.push(hop);
248
+ executionIds.push(report.executionId);
249
+ state.visited.push(current);
250
+ options.onHop?.(hop);
251
+ if (gotoRequests.length > 1) {
252
+ state.notes.push(`${current} requested ${gotoRequests.length} jumps; using the first`);
253
+ }
254
+ current = decision.to;
255
+ }
256
+ return { result: { hops, path: state.visited, executionIds }, state };
257
+ }
258
+ /* =========================
259
+ * 6. Demo — proves the picture
260
+ * ========================= */
261
+ const SCENARIOS = [
262
+ { label: "result === 1 → b, then b forces f", seed: 1, expected: ["a", "b", "f"] },
263
+ { label: "test(result) === true → c", seed: 2, expected: ["a", "c"] },
264
+ { label: "otherwise → d", seed: 3, expected: ["a", "d"] },
265
+ { label: "on throw → e", seed: "throw", expected: ["a", "e"] },
266
+ { label: "on retry (recovered) → f", seed: "retry", expected: ["a", "f"] }
267
+ ];
268
+ function show(value) {
269
+ return value === undefined ? "undefined" : JSON.stringify(value);
270
+ }
271
+ async function main() {
272
+ const storage = new automategraph_1.InMemoryStorage();
273
+ let failures = 0;
274
+ console.log("=".repeat(96));
275
+ console.log("Branching router — engine untouched, arrows resolved by the host-side router");
276
+ console.log("=".repeat(96));
277
+ for (const scenario of SCENARIOS) {
278
+ const { result } = await runWalk(scenario.seed, { storage });
279
+ const path = result.path.join(" → ");
280
+ const expected = scenario.expected.join(" → ");
281
+ const ok = path === expected;
282
+ if (!ok)
283
+ failures += 1;
284
+ console.log(`\n▶ seed = ${JSON.stringify(scenario.seed)} ${scenario.label}`);
285
+ for (const hop of result.hops) {
286
+ const target = hop.decision.to ? `→ ${hop.decision.to}` : "stop";
287
+ console.log(` hop ${hop.step} ${hop.nodeId} ${hop.status.padEnd(9)}` +
288
+ ` attempts=${hop.attempts} output=${show(hop.output).padEnd(42)}` +
289
+ ` ${hop.decision.by.padEnd(9)} ${target} (${hop.decision.reason})`);
290
+ }
291
+ console.log(` path: ${path} ${ok ? "✓ as expected" : `✗ expected ${expected}`}`);
292
+ }
293
+ const snapshotIds = await storage.listExecutionIds();
294
+ console.log(`\n${"-".repeat(96)}`);
295
+ console.log(`scenarios: ${SCENARIOS.length - failures}/${SCENARIOS.length} matched · ` +
296
+ `engine executions (one per hop): ${snapshotIds.length} · ` +
297
+ `checkpoints retrievable via storage.load(executionId)`);
298
+ if (failures > 0) {
299
+ process.exitCode = 1;
300
+ }
301
+ }
302
+ if (require.main === module) {
303
+ void main();
304
+ }
305
+ //# sourceMappingURL=branching-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branching-router.js","sourceRoot":"","sources":["../../examples/branching-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ /* ============================================================
3
+ * Graph as a DATA FILE (v1.4)
4
+ * ------------------------------------------------------------
5
+ * examples/order-flow.graph.json declares nodes and edges, but no
6
+ * JavaScript. Every function is referenced by name and supplied to the
7
+ * engine at construction, so the SAME document runs against different
8
+ * implementations:
9
+ *
10
+ * classify ── isPriority ──▶ charge ──▶ ship
11
+ * ── "manual" ────▶ manual
12
+ * ── else ────────▶ reject
13
+ *
14
+ * Scenario D runs the document with a registry that is missing
15
+ * `shipOrder` — nothing throws at build time; the activation fails with
16
+ * UNKNOWN_FUNCTION and the run settles FAILED.
17
+ *
18
+ * Run: npm run example:graphjson (after npm run build)
19
+ * ============================================================ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const graph_json_1 = require("../src/graph-json");
47
+ const DOCUMENT_PATH = path.join(__dirname, "..", "..", "examples", "order-flow.graph.json");
48
+ /* ---------------------------------------------------------------
49
+ * The implementations, keyed by the names the document uses.
50
+ * ------------------------------------------------------------- */
51
+ function isPriority(value) {
52
+ return value === "priority";
53
+ }
54
+ function chargeCard(context) {
55
+ if (context.attempt === 1) {
56
+ throw new Error("chargeCard: gateway timeout (transient)");
57
+ }
58
+ return "charged";
59
+ }
60
+ function shipOrder() {
61
+ return "shipped";
62
+ }
63
+ function manualReview() {
64
+ return "queued for a human";
65
+ }
66
+ function rejectOrder() {
67
+ return "rejected";
68
+ }
69
+ /*
70
+ * Three classifier IMPLEMENTATIONS — the document itself never changes.
71
+ * Each has its own source, so the registry fingerprint moves with it.
72
+ */
73
+ function classifyAsPriority() {
74
+ return "priority";
75
+ }
76
+ function classifyAsManual() {
77
+ return "manual";
78
+ }
79
+ function classifyAsStandard() {
80
+ return "standard";
81
+ }
82
+ const SCENARIOS = [
83
+ {
84
+ label: "priority order → charge → ship",
85
+ registry: {
86
+ classifyOrder: classifyAsPriority,
87
+ isPriority,
88
+ chargeCard,
89
+ shipOrder,
90
+ manualReview,
91
+ rejectOrder
92
+ },
93
+ expect: "classify → charge → ship",
94
+ expectStatus: "COMPLETED"
95
+ },
96
+ {
97
+ label: 'returned "manual" → manual review',
98
+ registry: {
99
+ classifyOrder: classifyAsManual,
100
+ isPriority,
101
+ chargeCard,
102
+ shipOrder,
103
+ manualReview,
104
+ rejectOrder
105
+ },
106
+ expect: "classify → manual",
107
+ expectStatus: "COMPLETED"
108
+ },
109
+ {
110
+ label: "anything else → else edge → reject",
111
+ registry: {
112
+ classifyOrder: classifyAsStandard,
113
+ isPriority,
114
+ chargeCard,
115
+ shipOrder,
116
+ manualReview,
117
+ rejectOrder
118
+ },
119
+ expect: "classify → reject",
120
+ expectStatus: "COMPLETED"
121
+ },
122
+ {
123
+ label: "registry missing shipOrder → UNKNOWN_FUNCTION",
124
+ registry: {
125
+ classifyOrder: classifyAsPriority,
126
+ isPriority,
127
+ chargeCard,
128
+ manualReview,
129
+ rejectOrder
130
+ },
131
+ expect: "classify → charge",
132
+ expectStatus: "FAILED"
133
+ }
134
+ ];
135
+ async function main() {
136
+ const document = fs.readFileSync(DOCUMENT_PATH, "utf8");
137
+ console.log("=".repeat(96));
138
+ console.log(`graph as a data file — ${path.basename(DOCUMENT_PATH)}`);
139
+ console.log("=".repeat(96));
140
+ /* Parsing needs no registry at all: names resolve lazily. */
141
+ const definition = (0, graph_json_1.parseGraphJSON)(document);
142
+ console.log(`parsed: ${definition.id} v${definition.version}, ` +
143
+ `${Object.keys(definition.nodes).length} nodes, ` +
144
+ `${definition.entryNodes.join(",")} → ${definition.terminalNodes.join(",")}\n`);
145
+ let failures = 0;
146
+ let previousFingerprint;
147
+ for (const scenario of SCENARIOS) {
148
+ const engine = (0, graph_json_1.createEngineFromJSON)(document, {
149
+ functions: scenario.registry,
150
+ lint: "error",
151
+ onLog: (level, message) => {
152
+ if (level === "warn" || level === "error") {
153
+ console.log(` log[${level}] ${message}`);
154
+ }
155
+ }
156
+ });
157
+ const report = await engine.run();
158
+ const path2 = report.results
159
+ .filter(result => result.status === "SUCCEEDED")
160
+ .map(result => result.nodeId)
161
+ .join(" → ");
162
+ const ok = report.status === scenario.expectStatus &&
163
+ path2 === scenario.expect;
164
+ if (!ok)
165
+ failures += 1;
166
+ const fingerprint = report.registry?.fingerprint ?? "(none)";
167
+ const drift = previousFingerprint !== undefined &&
168
+ previousFingerprint !== fingerprint
169
+ ? " ← registry changed (fingerprint moved)"
170
+ : "";
171
+ previousFingerprint = fingerprint;
172
+ console.log(`▶ ${scenario.label}`);
173
+ console.log(` ${report.status} path: ${path2 || "(none)"} ` +
174
+ `${ok ? "✓" : `✗ expected ${scenario.expectStatus} / ${scenario.expect}`}`);
175
+ console.log(` registry ${fingerprint}${drift}`);
176
+ console.log(` names: ${(report.registry?.names ?? []).join(", ")}`);
177
+ for (const result of report.results) {
178
+ if (result.fn) {
179
+ console.log(` ${result.nodeId.padEnd(9)} fn=${result.fn} ` +
180
+ `attempt=${result.attempt} ${result.status}`);
181
+ }
182
+ }
183
+ for (const error of report.errors) {
184
+ console.log(` error ${error.code} @${error.nodeId ?? "?"} ` +
185
+ `handled=${error.handled} ${error.message}`);
186
+ }
187
+ console.log("");
188
+ }
189
+ console.log("-".repeat(96));
190
+ console.log(`scenarios: ${SCENARIOS.length - failures}/${SCENARIOS.length} matched`);
191
+ if (failures > 0)
192
+ process.exitCode = 1;
193
+ }
194
+ if (require.main === module) {
195
+ void main();
196
+ }
197
+ //# sourceMappingURL=json-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-graph.js","sourceRoot":"","sources":["../../examples/json-graph.ts"],"names":[],"mappings":"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"}