agentfootprint 7.10.0 → 7.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/core-flow/Graph.js +607 -0
- package/dist/core-flow/Graph.js.map +1 -0
- package/dist/esm/core-flow/Graph.d.ts +272 -0
- package/dist/esm/core-flow/Graph.js +601 -0
- package/dist/esm/core-flow/Graph.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/types/core-flow/Graph.d.ts +273 -0
- package/dist/types/core-flow/Graph.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -753,7 +753,7 @@ The flowchart, recorders, and tests don't change between dev and prod.
|
|
|
753
753
|
|
|
754
754
|
**Core**
|
|
755
755
|
- 2 primitives — `LLMCall`, `Agent` (the ReAct loop)
|
|
756
|
-
- 4 control flows — `Sequence`, `Parallel`, `Conditional`, `Loop` (plus `workflow()`, the same sequence with every hand-off type-checked by the compiler)
|
|
756
|
+
- 4 control flows — `Sequence`, `Parallel`, `Conditional`, `Loop` (plus `workflow()`, the same sequence with every hand-off type-checked by the compiler, and `graph()`, a fixed DAG whose independent nodes run concurrently)
|
|
757
757
|
- 1 Injection primitive — `defineSkill` / `defineSteering` / `defineInstruction` / `defineFact`
|
|
758
758
|
- 1 reliability gate — `.reliability({ preCheck, postDecide, providers, circuitBreaker, fallback })`
|
|
759
759
|
- 1 tool dispatch primitive — `ToolProvider` (sync OR async) — `staticTools` · `gatedTools` · `skillScopedTools` · or a custom `ToolProvider` that discovers over hubs / MCP / per-tenant catalogs
|
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* graph() — a FIXED DAG of runners, levelized at build time.
|
|
4
|
+
*
|
|
5
|
+
* WHY this exists: `Sequence` and `workflow()` run steps in a line, and
|
|
6
|
+
* `Parallel` fans out ONCE and merges. Real pipelines are neither: an
|
|
7
|
+
* intake step feeds two independent lookups, and a writer waits for both.
|
|
8
|
+
* Expressing that with the existing compositions means nesting a Parallel
|
|
9
|
+
* inside a Sequence and threading values through by hand — and on this
|
|
10
|
+
* codebase that hand-off silently loses structured data (see "The trap"
|
|
11
|
+
* below). `graph()` states the shape once, as nodes and edges, and lets
|
|
12
|
+
* the engine work out what can run at the same time.
|
|
13
|
+
*
|
|
14
|
+
* What it gives you:
|
|
15
|
+
* - **Concurrency you did not have to schedule.** Kahn levelization at
|
|
16
|
+
* BUILD time groups nodes with no dependency between them; every node
|
|
17
|
+
* in a level runs at the same time.
|
|
18
|
+
* - **A shape checked before it runs.** A cycle, an edge pointing at a
|
|
19
|
+
* node that does not exist, or a duplicate id is refused at BUILD
|
|
20
|
+
* time, naming the offender. You cannot construct a broken graph.
|
|
21
|
+
* - **No silent merges.** A node with two or more parents MUST declare
|
|
22
|
+
* a `join` — a silent merge is a wrong merge, so the build refuses
|
|
23
|
+
* and names the node.
|
|
24
|
+
* - **Values, not text.** An edge's payload is the producer's OUTPUT
|
|
25
|
+
* handed to the consumer, unchanged. There is no shared mutable scope
|
|
26
|
+
* between nodes: a node reads exactly what its parents produced.
|
|
27
|
+
*
|
|
28
|
+
* Pattern: Adapter over footprintjs's subflow mounts — a level with
|
|
29
|
+
* several nodes becomes stacked `addSubFlowChart` calls (a fork,
|
|
30
|
+
* run concurrently); a level with one node is mounted
|
|
31
|
+
* sequentially (`addSubFlowChartNext`, which resumes cleanly
|
|
32
|
+
* across a pause). One join stage between levels.
|
|
33
|
+
* Role: core-flow/ layer, alongside Sequence/Parallel/Conditional/
|
|
34
|
+
* Loop/Workflow. Pure control flow — no LLM dependency.
|
|
35
|
+
* Emits: agentfootprint.composition.enter / exit, reported as kind
|
|
36
|
+
* `'Sequence'`. See "Why kind 'Sequence'" below.
|
|
37
|
+
*
|
|
38
|
+
* ## The trap this was built around (verified against footprintjs, not docs)
|
|
39
|
+
*
|
|
40
|
+
* The obvious sketch — `graph = Sequence(Parallel(level0), Parallel(level1), …)`
|
|
41
|
+
* — does NOT work on this codebase, for two independent reasons:
|
|
42
|
+
*
|
|
43
|
+
* 1. `Sequence`'s step contract is `{ message: string } -> string`, and
|
|
44
|
+
* its step `outputMapper` coerces a non-string step output to `''`.
|
|
45
|
+
* `workflow()` (v7.10.0) exists precisely because of this.
|
|
46
|
+
* 2. `Parallel` has the SAME limit one layer down: its branch type is
|
|
47
|
+
* `Runner<{ message: string }, string>` and its branch `outputMapper`
|
|
48
|
+
* coerces a non-string branch output to `''` (`Parallel.ts`, the
|
|
49
|
+
* `typeof sfOutput === 'string' ? sfOutput : ''` mapper). So a
|
|
50
|
+
* Parallel level cannot carry a structured value either.
|
|
51
|
+
*
|
|
52
|
+
* So `graph()` is built on the pass-through model `workflow()` established
|
|
53
|
+
* — its own composition, its own mappers, the same recorder wiring and the
|
|
54
|
+
* same `composition.enter` / `exit` events — rather than on top of
|
|
55
|
+
* Sequence/Parallel.
|
|
56
|
+
*
|
|
57
|
+
* ## Why kind 'Sequence'
|
|
58
|
+
*
|
|
59
|
+
* `CompositionKind` is a CLOSED public union (`'Sequence' | 'Parallel' |
|
|
60
|
+
* 'Conditional' | 'Loop'`). Widening it would break exhaustive switches in
|
|
61
|
+
* consumer code for no behavioural gain — the same call v7.10.0 made for
|
|
62
|
+
* `workflow()`. A graph's LEVELS are a sequence (level 0, then level 1, …),
|
|
63
|
+
* so `'Sequence'` is the honest member of that union: this composition runs
|
|
64
|
+
* its levels in order. The fan-out WITHIN a level is visible in the chart
|
|
65
|
+
* itself (a fork node per level), which is where a renderer reads it from.
|
|
66
|
+
*
|
|
67
|
+
* ## Honest limits (all verified against the engine, pinned in tests)
|
|
68
|
+
*
|
|
69
|
+
* 1. Only PLAIN DATA crosses a node boundary — the same limit
|
|
70
|
+
* `workflow()` documents. A value with a prototype (Date, Map, class
|
|
71
|
+
* instance) arrives as `{}`; `undefined` fields are dropped.
|
|
72
|
+
* 2. A node must RETURN its output: the value handed to its children is
|
|
73
|
+
* the node chart's traversal result.
|
|
74
|
+
* 3. A node that THROWS is always reported as
|
|
75
|
+
* `graph '<id>': node '<node>' failed: <reason>`, but it reaches that
|
|
76
|
+
* sentence by two different routes. In a CONCURRENT level footprintjs
|
|
77
|
+
* runs children under `Promise.allSettled`, so a failed child is
|
|
78
|
+
* simply ABSENT from the results and the level join turns that
|
|
79
|
+
* absence into the error. In a SEQUENTIAL (single-node) level the
|
|
80
|
+
* error rejects the run raw, and `rethrowWithNodeAttribution` renames
|
|
81
|
+
* it. Consumers see one shape either way.
|
|
82
|
+
* 4. A node that PAUSES surfaces as a pause — the engine halts the
|
|
83
|
+
* traversal before the level's join runs, so `run()` returns a
|
|
84
|
+
* `RunnerPauseOutcome`. `resume()` then carries on through the REST
|
|
85
|
+
* of the graph only when the paused node was ALONE in its level (a
|
|
86
|
+
* sequential mount). Resuming into a fork child completes that child
|
|
87
|
+
* and stops: the remaining levels do not run. Give a node that asks a
|
|
88
|
+
* human a level of its own. Both halves are pinned in tests.
|
|
89
|
+
*
|
|
90
|
+
* @example a diamond: A feeds B and C, D waits for both
|
|
91
|
+
* ```ts
|
|
92
|
+
* const pipeline = graph({
|
|
93
|
+
* nodes: [
|
|
94
|
+
* { id: 'intake', runner: intake },
|
|
95
|
+
* { id: 'orders', runner: lookupOrders },
|
|
96
|
+
* { id: 'billing', runner: lookupBilling },
|
|
97
|
+
* {
|
|
98
|
+
* id: 'reply',
|
|
99
|
+
* runner: writeReply,
|
|
100
|
+
* // Two parents ⇒ a join is REQUIRED. `upstream` is keyed by node id.
|
|
101
|
+
* join: (upstream) => ({
|
|
102
|
+
* orders: upstream.orders as OrderInfo,
|
|
103
|
+
* billing: upstream.billing as BillingInfo,
|
|
104
|
+
* }),
|
|
105
|
+
* },
|
|
106
|
+
* ],
|
|
107
|
+
* edges: [
|
|
108
|
+
* { from: 'intake', to: 'orders' },
|
|
109
|
+
* { from: 'intake', to: 'billing' },
|
|
110
|
+
* { from: 'orders', to: 'reply' },
|
|
111
|
+
* { from: 'billing', to: 'reply' },
|
|
112
|
+
* ],
|
|
113
|
+
* });
|
|
114
|
+
*
|
|
115
|
+
* const out = await pipeline.run({ message: 'where is my refund?' });
|
|
116
|
+
* // out = { intake: …, orders: …, billing: …, reply: … } — keyed by node id
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
120
|
+
exports.graph = exports.Graph = exports.levelize = void 0;
|
|
121
|
+
const footprintjs_1 = require("footprintjs");
|
|
122
|
+
const RunnerBase_js_1 = require("../core/RunnerBase.js");
|
|
123
|
+
const AgentRecorder_js_1 = require("../recorders/core/AgentRecorder.js");
|
|
124
|
+
const CompositionRecorder_js_1 = require("../recorders/core/CompositionRecorder.js");
|
|
125
|
+
const ContextRecorder_js_1 = require("../recorders/core/ContextRecorder.js");
|
|
126
|
+
const StreamRecorder_js_1 = require("../recorders/core/StreamRecorder.js");
|
|
127
|
+
const typedEmit_js_1 = require("../recorders/core/typedEmit.js");
|
|
128
|
+
/**
|
|
129
|
+
* The one sentence every node failure is reported with, whatever mount the
|
|
130
|
+
* level used. A graph has two mount paths — a fork for concurrent levels, a
|
|
131
|
+
* sequential mount for single-node ones — and footprintjs surfaces failures
|
|
132
|
+
* differently through each (a fork child's error is swallowed into absence;
|
|
133
|
+
* a sequential child's rejects the run raw). Consumers should not have to
|
|
134
|
+
* know which one they got, so both are reported like this.
|
|
135
|
+
*/
|
|
136
|
+
function nodeFailureMessage(graphId, nodeId, reason) {
|
|
137
|
+
return `graph '${graphId}': node '${nodeId}' failed: ${reason}`;
|
|
138
|
+
}
|
|
139
|
+
// ─── Build-time validation + levelization ────────────────────────────
|
|
140
|
+
/**
|
|
141
|
+
* Kahn levelization: group nodes so that everything in level N depends
|
|
142
|
+
* only on levels < N. Nodes within a level are independent BY
|
|
143
|
+
* CONSTRUCTION, which is exactly the licence to run them concurrently.
|
|
144
|
+
*
|
|
145
|
+
* Declaration order is preserved inside each level so a graph's chart —
|
|
146
|
+
* and therefore its trace — is deterministic.
|
|
147
|
+
*
|
|
148
|
+
* Throws (naming the offender) on: an unknown edge endpoint, a duplicate
|
|
149
|
+
* node id, a cycle, or a fan-in > 1 with no `join`.
|
|
150
|
+
*/
|
|
151
|
+
function levelize(nodes, edges) {
|
|
152
|
+
if (nodes.length === 0) {
|
|
153
|
+
throw new Error('graph: needs at least one node');
|
|
154
|
+
}
|
|
155
|
+
const byId = new Map();
|
|
156
|
+
for (const node of nodes) {
|
|
157
|
+
if (byId.has(node.id)) {
|
|
158
|
+
throw new Error(`graph: duplicate node id '${node.id}' — every node id must be unique (it is the results key).`);
|
|
159
|
+
}
|
|
160
|
+
byId.set(node.id, node);
|
|
161
|
+
}
|
|
162
|
+
const parents = new Map();
|
|
163
|
+
const children = new Map();
|
|
164
|
+
for (const node of nodes) {
|
|
165
|
+
parents.set(node.id, []);
|
|
166
|
+
children.set(node.id, []);
|
|
167
|
+
}
|
|
168
|
+
for (const edge of edges) {
|
|
169
|
+
if (!byId.has(edge.from)) {
|
|
170
|
+
throw new Error(`graph: edge '${edge.from}' -> '${edge.to}' references unknown node '${edge.from}'.`);
|
|
171
|
+
}
|
|
172
|
+
if (!byId.has(edge.to)) {
|
|
173
|
+
throw new Error(`graph: edge '${edge.from}' -> '${edge.to}' references unknown node '${edge.to}'.`);
|
|
174
|
+
}
|
|
175
|
+
parents.get(edge.to)?.push(edge.from);
|
|
176
|
+
children.get(edge.from)?.push(edge.to);
|
|
177
|
+
}
|
|
178
|
+
// Fan-in > 1 demands an explicit join. Checked BEFORE the cycle walk so
|
|
179
|
+
// the more actionable error wins on a graph that has both problems.
|
|
180
|
+
for (const node of nodes) {
|
|
181
|
+
const up = parents.get(node.id) ?? [];
|
|
182
|
+
if (up.length > 1 && node.join === undefined) {
|
|
183
|
+
throw new Error(`graph: node '${node.id}' has ${up.length} parents (${up.join(', ')}) but no join — ` +
|
|
184
|
+
'a silent merge is a wrong merge. Give the node a join(upstream) that returns its input; ' +
|
|
185
|
+
'upstream is keyed by parent node id.');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Kahn: repeatedly take every node whose parents have all been placed.
|
|
189
|
+
const remainingParents = new Map();
|
|
190
|
+
for (const node of nodes)
|
|
191
|
+
remainingParents.set(node.id, (parents.get(node.id) ?? []).length);
|
|
192
|
+
const levels = [];
|
|
193
|
+
let frontier = nodes.filter((n) => remainingParents.get(n.id) === 0);
|
|
194
|
+
let placed = 0;
|
|
195
|
+
while (frontier.length > 0) {
|
|
196
|
+
levels.push(frontier);
|
|
197
|
+
placed += frontier.length;
|
|
198
|
+
const next = [];
|
|
199
|
+
for (const node of frontier) {
|
|
200
|
+
for (const childId of children.get(node.id) ?? []) {
|
|
201
|
+
const left = (remainingParents.get(childId) ?? 0) - 1;
|
|
202
|
+
remainingParents.set(childId, left);
|
|
203
|
+
if (left === 0) {
|
|
204
|
+
const child = byId.get(childId);
|
|
205
|
+
if (child !== undefined)
|
|
206
|
+
next.push(child);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Restore declaration order — `next` is built in parent-visit order.
|
|
211
|
+
frontier = nodes.filter((n) => next.includes(n));
|
|
212
|
+
}
|
|
213
|
+
if (placed < nodes.length) {
|
|
214
|
+
const stuck = new Set(nodes.filter((n) => (remainingParents.get(n.id) ?? 0) > 0).map((n) => n.id));
|
|
215
|
+
throw new Error(`graph: cycle detected — edge '${findBackEdge(stuck, edges)}' closes a loop. A graph must be acyclic.`);
|
|
216
|
+
}
|
|
217
|
+
return levels;
|
|
218
|
+
}
|
|
219
|
+
exports.levelize = levelize;
|
|
220
|
+
/**
|
|
221
|
+
* Name ONE edge that closes a cycle, so the error can point at something
|
|
222
|
+
* the author can delete. Depth-first over the nodes Kahn could not place;
|
|
223
|
+
* the first edge back onto the current stack is the one reported.
|
|
224
|
+
*/
|
|
225
|
+
function findBackEdge(stuck, edges) {
|
|
226
|
+
const out = new Map();
|
|
227
|
+
for (const edge of edges) {
|
|
228
|
+
if (stuck.has(edge.from) && stuck.has(edge.to)) {
|
|
229
|
+
const list = out.get(edge.from) ?? [];
|
|
230
|
+
list.push(edge.to);
|
|
231
|
+
out.set(edge.from, list);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const onStack = new Set();
|
|
235
|
+
const done = new Set();
|
|
236
|
+
let found;
|
|
237
|
+
const walk = (id) => {
|
|
238
|
+
if (found !== undefined)
|
|
239
|
+
return;
|
|
240
|
+
onStack.add(id);
|
|
241
|
+
for (const next of out.get(id) ?? []) {
|
|
242
|
+
if (found !== undefined)
|
|
243
|
+
return;
|
|
244
|
+
if (onStack.has(next)) {
|
|
245
|
+
found = `${id}' -> '${next}`;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
if (!done.has(next))
|
|
249
|
+
walk(next);
|
|
250
|
+
}
|
|
251
|
+
onStack.delete(id);
|
|
252
|
+
done.add(id);
|
|
253
|
+
};
|
|
254
|
+
for (const id of stuck) {
|
|
255
|
+
if (!done.has(id))
|
|
256
|
+
walk(id);
|
|
257
|
+
if (found !== undefined)
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
// Every unplaced node is on a cycle, so a back edge always exists; the
|
|
261
|
+
// fallback keeps the error useful rather than throwing inside a thrower.
|
|
262
|
+
return found ?? [...stuck].join("' -> '");
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Hand a producer's value to a consumer as its input args.
|
|
266
|
+
*
|
|
267
|
+
* `string` → `{ message }` (the house convention every LLM runner here
|
|
268
|
+
* speaks, identical to `workflow()`'s hand-off rule). Plain object →
|
|
269
|
+
* itself. Anything else is a broken hand-off and says so, naming both
|
|
270
|
+
* ends — the alternative is an empty input inside the consumer with
|
|
271
|
+
* nothing pointing back here.
|
|
272
|
+
*/
|
|
273
|
+
function toNodeArgs(value, nodeId, source) {
|
|
274
|
+
if (typeof value === 'string')
|
|
275
|
+
return { message: value };
|
|
276
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
277
|
+
return { ...value };
|
|
278
|
+
}
|
|
279
|
+
const got = value === null ? 'null' : Array.isArray(value) ? 'an array' : typeof value;
|
|
280
|
+
throw new Error(`graph: ${source} handed node '${nodeId}' ${got}, but a node needs an object ` +
|
|
281
|
+
'(or a string, which arrives as { message }). Make each node return its output.');
|
|
282
|
+
}
|
|
283
|
+
// ─── The composition ─────────────────────────────────────────────────
|
|
284
|
+
/**
|
|
285
|
+
* A fixed DAG of runners. Build one with {@link graph}.
|
|
286
|
+
*/
|
|
287
|
+
class Graph extends RunnerBase_js_1.RunnerBase {
|
|
288
|
+
name;
|
|
289
|
+
id;
|
|
290
|
+
nodes;
|
|
291
|
+
levels;
|
|
292
|
+
parentsOf;
|
|
293
|
+
opts;
|
|
294
|
+
currentRunContext = {
|
|
295
|
+
runStartMs: 0,
|
|
296
|
+
runId: 'pending',
|
|
297
|
+
compositionPath: [],
|
|
298
|
+
};
|
|
299
|
+
/**
|
|
300
|
+
* Per-node first-error records for the current run. footprintjs's
|
|
301
|
+
* `SubflowExecutor` swallows a subflow error into the parent's debug
|
|
302
|
+
* bag and skips the `outputMapper`, so the message never reaches parent
|
|
303
|
+
* scope on its own. An internal recorder captures it here; the level
|
|
304
|
+
* join reads it to name what actually went wrong. Mirrors Parallel's
|
|
305
|
+
* `branchErrors`, epoch-guarded for the same reason.
|
|
306
|
+
*/
|
|
307
|
+
nodeErrors = new Map();
|
|
308
|
+
/** Monotonic run token — see Parallel's `runEpoch`. */
|
|
309
|
+
runEpoch = 0;
|
|
310
|
+
constructor(opts) {
|
|
311
|
+
super();
|
|
312
|
+
this.opts = opts;
|
|
313
|
+
this.name = opts.name ?? 'Graph';
|
|
314
|
+
this.id = opts.id ?? 'graph';
|
|
315
|
+
this.nodes = opts.nodes;
|
|
316
|
+
// Levelization VALIDATES — a broken graph throws here, at construction.
|
|
317
|
+
this.levels = levelize(opts.nodes, opts.edges);
|
|
318
|
+
const parents = new Map();
|
|
319
|
+
for (const node of opts.nodes)
|
|
320
|
+
parents.set(node.id, []);
|
|
321
|
+
for (const edge of opts.edges)
|
|
322
|
+
parents.get(edge.to)?.push(edge.from);
|
|
323
|
+
this.parentsOf = parents;
|
|
324
|
+
// Eager chart construction — see `RunnerBase.initChart` JSDoc.
|
|
325
|
+
this.initChart(() => this.buildChart());
|
|
326
|
+
}
|
|
327
|
+
/** How the graph was levelized — level 0 first. Stable post-construction. */
|
|
328
|
+
getLevels() {
|
|
329
|
+
return this.levels.map((level) => level.map((n) => n.id));
|
|
330
|
+
}
|
|
331
|
+
async run(input, options) {
|
|
332
|
+
const executor = this.createExecutor();
|
|
333
|
+
this.lastExecutor = executor;
|
|
334
|
+
let result;
|
|
335
|
+
try {
|
|
336
|
+
result = await executor.run({ input: { ...input }, ...(options ?? {}) });
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
this.rethrowWithNodeAttribution(err);
|
|
340
|
+
}
|
|
341
|
+
return this.finalizeResult(executor, result);
|
|
342
|
+
}
|
|
343
|
+
async resume(checkpoint, input, options) {
|
|
344
|
+
this.emitPauseResume(checkpoint, input);
|
|
345
|
+
const executor = this.createExecutor();
|
|
346
|
+
this.lastExecutor = executor;
|
|
347
|
+
let result;
|
|
348
|
+
try {
|
|
349
|
+
result = await executor.resume(checkpoint, input, options);
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
this.rethrowWithNodeAttribution(err);
|
|
353
|
+
}
|
|
354
|
+
return this.finalizeResult(executor, result);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Give a RAW rejection the same node-naming shape the level join
|
|
358
|
+
* produces.
|
|
359
|
+
*
|
|
360
|
+
* A node in a SEQUENTIAL (single-node) level rejects the run with its
|
|
361
|
+
* own error — the level join never runs, so nothing has attributed it to
|
|
362
|
+
* a node yet. The error recorder did see it, so correlate (by identity
|
|
363
|
+
* first, then bare message) and rename. Anything that does not correlate
|
|
364
|
+
* — including the join's own already-attributed error — is rethrown
|
|
365
|
+
* untouched.
|
|
366
|
+
*/
|
|
367
|
+
rethrowWithNodeAttribution(err) {
|
|
368
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
369
|
+
for (const [nodeId, record] of this.nodeErrors) {
|
|
370
|
+
if (record.raw === err || record.message === message) {
|
|
371
|
+
throw new Error(nodeFailureMessage(this.id, nodeId, record.message), { cause: err });
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
throw err;
|
|
375
|
+
}
|
|
376
|
+
createExecutor() {
|
|
377
|
+
this.currentRunContext = {
|
|
378
|
+
runStartMs: Date.now(),
|
|
379
|
+
runId: (0, RunnerBase_js_1.makeRunId)(),
|
|
380
|
+
compositionPath: [`Graph:${this.id}`],
|
|
381
|
+
};
|
|
382
|
+
this.runEpoch += 1;
|
|
383
|
+
this.nodeErrors.clear();
|
|
384
|
+
const executor = new footprintjs_1.FlowChartExecutor(this.getSpec());
|
|
385
|
+
const dispatcher = this.getDispatcher();
|
|
386
|
+
const getRunCtx = () => this.currentRunContext;
|
|
387
|
+
executor.attachCombinedRecorder(new ContextRecorder_js_1.ContextRecorder({ dispatcher, getRunContext: getRunCtx }));
|
|
388
|
+
executor.attachCombinedRecorder((0, StreamRecorder_js_1.streamRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
389
|
+
executor.attachCombinedRecorder((0, AgentRecorder_js_1.agentRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
390
|
+
executor.attachCombinedRecorder((0, CompositionRecorder_js_1.compositionRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
391
|
+
executor.attachCombinedRecorder(this.makeNodeErrorRecorder(this.runEpoch));
|
|
392
|
+
for (const r of this.attachedRecorders)
|
|
393
|
+
executor.attachCombinedRecorder(r);
|
|
394
|
+
return executor;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Capture the first error per node. The node id is the first segment of
|
|
398
|
+
* the engine-prefixed `stageId` (`orders/call-llm` → node `orders`) —
|
|
399
|
+
* the same correlation Parallel uses, and the only one that survives a
|
|
400
|
+
* node mounting subflows of its own.
|
|
401
|
+
*/
|
|
402
|
+
makeNodeErrorRecorder(epoch) {
|
|
403
|
+
const nodeIds = new Set(this.nodes.map((n) => n.id));
|
|
404
|
+
return {
|
|
405
|
+
id: 'graph-node-errors',
|
|
406
|
+
onError: (event) => {
|
|
407
|
+
if (epoch !== this.runEpoch)
|
|
408
|
+
return; // straggler from a dead run
|
|
409
|
+
if (!(0, footprintjs_1.isFlowEvent)(event))
|
|
410
|
+
return;
|
|
411
|
+
const stageId = event.traversalContext?.stageId ?? '';
|
|
412
|
+
const slash = stageId.indexOf('/');
|
|
413
|
+
const nodeId = slash >= 0 ? stageId.slice(0, slash) : undefined;
|
|
414
|
+
if (nodeId === undefined || !nodeIds.has(nodeId))
|
|
415
|
+
return;
|
|
416
|
+
if (this.nodeErrors.has(nodeId))
|
|
417
|
+
return;
|
|
418
|
+
const structured = event.structuredError;
|
|
419
|
+
const message = structured?.message ??
|
|
420
|
+
(event.message.startsWith('Error: ')
|
|
421
|
+
? event.message.slice('Error: '.length)
|
|
422
|
+
: event.message);
|
|
423
|
+
this.nodeErrors.set(nodeId, { message, raw: structured?.raw });
|
|
424
|
+
},
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
finalizeResult(executor, result) {
|
|
428
|
+
const paused = this.detectPause(executor, result);
|
|
429
|
+
if (paused)
|
|
430
|
+
return paused;
|
|
431
|
+
if (result instanceof Error)
|
|
432
|
+
throw result;
|
|
433
|
+
return (result ?? {});
|
|
434
|
+
}
|
|
435
|
+
buildChart() {
|
|
436
|
+
const compositionId = this.id;
|
|
437
|
+
const compositionName = this.name;
|
|
438
|
+
const nodeCount = this.nodes.length;
|
|
439
|
+
const levels = this.levels;
|
|
440
|
+
const nodeErrors = this.nodeErrors;
|
|
441
|
+
const seed = (scope) => {
|
|
442
|
+
// The graph's own input is what every ROOT node receives.
|
|
443
|
+
scope.graphInput = scope.$getArgs();
|
|
444
|
+
scope.results = {};
|
|
445
|
+
(0, typedEmit_js_1.typedEmit)(scope, 'agentfootprint.composition.enter', {
|
|
446
|
+
kind: 'Sequence',
|
|
447
|
+
id: compositionId,
|
|
448
|
+
name: compositionName,
|
|
449
|
+
childCount: nodeCount,
|
|
450
|
+
});
|
|
451
|
+
};
|
|
452
|
+
// Root description prefix `Sequence:` is the taxonomy marker every
|
|
453
|
+
// consumer (Lens, FlowchartRecorder.mapTopologyToSteps) already reads.
|
|
454
|
+
let builder = (0, footprintjs_1.flowChart)('Seed', seed, 'seed', {
|
|
455
|
+
...(this.opts.structureRecorders !== undefined && {
|
|
456
|
+
structureRecorders: [...this.opts.structureRecorders],
|
|
457
|
+
}),
|
|
458
|
+
description: `Sequence: ${nodeCount}-node DAG in ${levels.length} level(s)`,
|
|
459
|
+
});
|
|
460
|
+
levels.forEach((level, levelIndex) => {
|
|
461
|
+
// A level with SEVERAL nodes is mounted on the SAME builder cursor —
|
|
462
|
+
// stacked `addSubFlowChart` calls produce a fork node, which
|
|
463
|
+
// footprintjs's ChildrenExecutor runs concurrently. That is the whole
|
|
464
|
+
// reason to levelize.
|
|
465
|
+
//
|
|
466
|
+
// A level with ONE node is mounted SEQUENTIALLY instead
|
|
467
|
+
// (`addSubFlowChartNext`). There is nothing to run it alongside, and
|
|
468
|
+
// the sequential mount is strictly better across a pause: resuming
|
|
469
|
+
// into a fork child completes THAT child and stops, whereas a
|
|
470
|
+
// sequential mount resumes and carries on through the rest of the
|
|
471
|
+
// graph. Verified against footprintjs; see the class JSDoc's
|
|
472
|
+
// "Honest limits".
|
|
473
|
+
const concurrent = level.length > 1;
|
|
474
|
+
for (const node of level) {
|
|
475
|
+
const mount = concurrent
|
|
476
|
+
? builder.addSubFlowChart.bind(builder)
|
|
477
|
+
: builder.addSubFlowChartNext.bind(builder);
|
|
478
|
+
builder = mount(node.id, node.runner.getSpec(), node.name ?? node.id, {
|
|
479
|
+
// A THROW from an inputMapper (a broken hand-off, or a join that
|
|
480
|
+
// rejects what it got) is caught by footprintjs's SubflowExecutor
|
|
481
|
+
// and turned into a plain "this subflow did not run" — the reason
|
|
482
|
+
// never reaches parent scope. Record it first, so the level join
|
|
483
|
+
// can name what actually happened instead of 'unknown error'.
|
|
484
|
+
inputMapper: (parent) => {
|
|
485
|
+
try {
|
|
486
|
+
return this.inputForNode(node, parent);
|
|
487
|
+
}
|
|
488
|
+
catch (err) {
|
|
489
|
+
if (!nodeErrors.has(node.id)) {
|
|
490
|
+
nodeErrors.set(node.id, {
|
|
491
|
+
message: err instanceof Error ? err.message : String(err),
|
|
492
|
+
raw: err,
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
throw err;
|
|
496
|
+
}
|
|
497
|
+
},
|
|
498
|
+
// Untouched: whatever the node's chart returned is what its
|
|
499
|
+
// children (and the caller) receive. No string coercion — this
|
|
500
|
+
// is exactly what Sequence and Parallel cannot do.
|
|
501
|
+
outputMapper: (sfOutput) => ({ results: { [node.id]: sfOutput } }),
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
// The join stage does two jobs: it ADVANCES the builder cursor (so
|
|
505
|
+
// the next level forks from here instead of joining this level's
|
|
506
|
+
// fork), and it turns a failed node's ABSENCE into a loud error.
|
|
507
|
+
builder = builder.addFunction(`Level ${levelIndex} join`, (scope) => {
|
|
508
|
+
// Read through `$getValue`, never `scope.results`: values merged
|
|
509
|
+
// into parent state by a subflow outputMapper are present in
|
|
510
|
+
// shared state but do NOT enumerate through TypedScope's nested
|
|
511
|
+
// property proxy. Verified against footprintjs — the property
|
|
512
|
+
// read returns `{}` while `$getValue` returns the real record.
|
|
513
|
+
const results = scope.$getValue('results') ?? {};
|
|
514
|
+
const missing = level.map((n) => n.id).filter((id) => !(id in results));
|
|
515
|
+
if (missing.length > 0) {
|
|
516
|
+
(0, typedEmit_js_1.typedEmit)(scope, 'agentfootprint.composition.exit', {
|
|
517
|
+
kind: 'Sequence',
|
|
518
|
+
id: compositionId,
|
|
519
|
+
name: compositionName,
|
|
520
|
+
status: 'err',
|
|
521
|
+
durationMs: Date.now() - this.currentRunContext.runStartMs,
|
|
522
|
+
});
|
|
523
|
+
const reasonFor = (id) => nodeErrors.get(id)?.message ?? 'unknown error';
|
|
524
|
+
const firstMissing = missing[0] ?? '';
|
|
525
|
+
if (missing.length === 1) {
|
|
526
|
+
throw new Error(nodeFailureMessage(compositionId, firstMissing, reasonFor(firstMissing)));
|
|
527
|
+
}
|
|
528
|
+
const details = missing.map((id) => ` ${id}: ${reasonFor(id)}`).join('\n');
|
|
529
|
+
throw new Error(`graph '${compositionId}': ${missing.length} nodes failed in level ${levelIndex}:\n${details}`);
|
|
530
|
+
}
|
|
531
|
+
return undefined;
|
|
532
|
+
}, `level-${levelIndex}-join`, `Graph level ${levelIndex} join`);
|
|
533
|
+
});
|
|
534
|
+
builder = builder.addFunction('Finalize', (scope) => {
|
|
535
|
+
(0, typedEmit_js_1.typedEmit)(scope, 'agentfootprint.composition.exit', {
|
|
536
|
+
kind: 'Sequence',
|
|
537
|
+
id: compositionId,
|
|
538
|
+
name: compositionName,
|
|
539
|
+
status: 'ok',
|
|
540
|
+
durationMs: Date.now() - this.currentRunContext.runStartMs,
|
|
541
|
+
});
|
|
542
|
+
// `$getValue` for the same reason as the level join.
|
|
543
|
+
return scope.$getValue('results') ?? {};
|
|
544
|
+
}, 'finalize', 'Graph finalize');
|
|
545
|
+
return builder.build();
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* What one node receives. Roots get the graph's own input; a single
|
|
549
|
+
* parent is passed through; 2+ parents go through the node's `join`
|
|
550
|
+
* (which the build already guaranteed exists).
|
|
551
|
+
*
|
|
552
|
+
* `parent` here is the RAW parent state the engine hands an
|
|
553
|
+
* `inputMapper` — not a TypedScope — so structured upstream values read
|
|
554
|
+
* back intact.
|
|
555
|
+
*/
|
|
556
|
+
inputForNode(node, parent) {
|
|
557
|
+
const results = parent.results ?? {};
|
|
558
|
+
const upstreamIds = this.parentsOf.get(node.id) ?? [];
|
|
559
|
+
if (upstreamIds.length === 0) {
|
|
560
|
+
return { ...(parent.graphInput ?? {}) };
|
|
561
|
+
}
|
|
562
|
+
if (node.join !== undefined) {
|
|
563
|
+
const upstream = {};
|
|
564
|
+
for (const id of upstreamIds)
|
|
565
|
+
upstream[id] = results[id];
|
|
566
|
+
return toNodeArgs(node.join(upstream), node.id, `join of node '${node.id}'`);
|
|
567
|
+
}
|
|
568
|
+
const only = upstreamIds[0] ?? '';
|
|
569
|
+
return toNodeArgs(results[only], node.id, `node '${only}'`);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
exports.Graph = Graph;
|
|
573
|
+
// ─── The factory ─────────────────────────────────────────────────────
|
|
574
|
+
/**
|
|
575
|
+
* Build a fixed DAG of runners. Independent nodes run concurrently; the
|
|
576
|
+
* result is every node's output, keyed by node id.
|
|
577
|
+
*
|
|
578
|
+
* The shape is checked at BUILD time — a cycle, an edge pointing at an
|
|
579
|
+
* unknown node, a duplicate id, or a 2+-parent node with no `join` throws
|
|
580
|
+
* here, naming the offender, rather than misbehaving mid-run.
|
|
581
|
+
*
|
|
582
|
+
* @example a fan-out with a merge
|
|
583
|
+
* ```ts
|
|
584
|
+
* const pipeline = graph({
|
|
585
|
+
* nodes: [
|
|
586
|
+
* { id: 'plan', runner: planner },
|
|
587
|
+
* { id: 'search', runner: searcher },
|
|
588
|
+
* { id: 'recall', runner: memory },
|
|
589
|
+
* { id: 'answer', runner: writer, join: (u) => ({ ...u }) },
|
|
590
|
+
* ],
|
|
591
|
+
* edges: [
|
|
592
|
+
* { from: 'plan', to: 'search' },
|
|
593
|
+
* { from: 'plan', to: 'recall' },
|
|
594
|
+
* { from: 'search', to: 'answer' },
|
|
595
|
+
* { from: 'recall', to: 'answer' },
|
|
596
|
+
* ],
|
|
597
|
+
* });
|
|
598
|
+
*
|
|
599
|
+
* const out = await pipeline.run({ message: 'what changed last week?' });
|
|
600
|
+
* console.log(out.answer);
|
|
601
|
+
* ```
|
|
602
|
+
*/
|
|
603
|
+
function graph(opts) {
|
|
604
|
+
return new Graph(opts);
|
|
605
|
+
}
|
|
606
|
+
exports.graph = graph;
|
|
607
|
+
//# sourceMappingURL=Graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Graph.js","sourceRoot":"","sources":["../../src/core-flow/Graph.ts"],"names":[],"mappings":"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"}
|