@osolmaz/pi-workflows 0.9.0 → 0.10.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 (78) hide show
  1. package/README.md +50 -16
  2. package/dist/builtins/autodevise.workflow.d.ts +58 -0
  3. package/dist/builtins/autodevise.workflow.js +190 -0
  4. package/dist/builtins/autodevise.workflow.js.map +1 -0
  5. package/dist/builtins/autoimplement.workflow.d.ts +154 -0
  6. package/dist/builtins/autoimplement.workflow.js +729 -0
  7. package/dist/builtins/autoimplement.workflow.js.map +1 -0
  8. package/dist/builtins/catalog.js +5 -1
  9. package/dist/builtins/catalog.js.map +1 -1
  10. package/dist/builtins/index.d.ts +3 -0
  11. package/dist/builtins/index.js +4 -0
  12. package/dist/builtins/index.js.map +1 -0
  13. package/dist/builtins/monitor.workflow.d.ts +25 -3
  14. package/dist/builtins/monitor.workflow.js +200 -13
  15. package/dist/builtins/monitor.workflow.js.map +1 -1
  16. package/dist/extension/herdr-viewer.js +2 -6
  17. package/dist/extension/herdr-viewer.js.map +1 -1
  18. package/dist/render/graph-render.js +13 -2
  19. package/dist/render/graph-render.js.map +1 -1
  20. package/dist/workflows/catalog.d.ts +1 -0
  21. package/dist/workflows/catalog.js +6 -0
  22. package/dist/workflows/catalog.js.map +1 -1
  23. package/dist/workflows/composition.d.ts +45 -0
  24. package/dist/workflows/composition.js +471 -0
  25. package/dist/workflows/composition.js.map +1 -0
  26. package/dist/workflows/decision.d.ts +11 -5
  27. package/dist/workflows/decision.js.map +1 -1
  28. package/dist/workflows/definition.d.ts +22 -3
  29. package/dist/workflows/definition.js +46 -3
  30. package/dist/workflows/definition.js.map +1 -1
  31. package/dist/workflows/engine.js +115 -16
  32. package/dist/workflows/engine.js.map +1 -1
  33. package/dist/workflows/graph.js +8 -6
  34. package/dist/workflows/graph.js.map +1 -1
  35. package/dist/workflows/index.d.ts +3 -2
  36. package/dist/workflows/index.js +2 -1
  37. package/dist/workflows/index.js.map +1 -1
  38. package/dist/workflows/loader.d.ts +5 -4
  39. package/dist/workflows/loader.js +118 -18
  40. package/dist/workflows/loader.js.map +1 -1
  41. package/dist/workflows/schema.d.ts +3 -1
  42. package/dist/workflows/schema.js +49 -2
  43. package/dist/workflows/schema.js.map +1 -1
  44. package/dist/workflows/store.js +32 -2
  45. package/dist/workflows/store.js.map +1 -1
  46. package/dist/workflows/types.d.ts +77 -2
  47. package/docs/CONTROLLERS.md +1 -1
  48. package/docs/DESIGN_PHILOSOPHY.md +1 -1
  49. package/docs/MONITOR.md +35 -18
  50. package/docs/WORKFLOW_COMPOSITION.md +326 -0
  51. package/docs/plans/2026-08-19-workflow-composition-plan.md +300 -0
  52. package/docs/run-bundles.md +24 -10
  53. package/docs/workflows.md +65 -12
  54. package/examples/workflows/autodevise.workflow.ts +1 -0
  55. package/examples/workflows/autoimplement.workflow.ts +1 -92
  56. package/herdr-plugin.toml +1 -1
  57. package/package.json +5 -1
  58. package/skills/monitor/SKILL.md +6 -1
  59. package/skills/pi-workflows/SKILL.md +3 -1
  60. package/src/builtins/autodevise.workflow.ts +231 -0
  61. package/src/builtins/autoimplement.workflow.ts +856 -0
  62. package/src/builtins/catalog.ts +5 -1
  63. package/src/builtins/index.ts +13 -0
  64. package/src/builtins/monitor.workflow.ts +242 -15
  65. package/src/extension/herdr-viewer.ts +1 -6
  66. package/src/render/graph-render.ts +14 -2
  67. package/src/workflows/catalog.ts +7 -0
  68. package/src/workflows/composition.ts +627 -0
  69. package/src/workflows/decision.ts +12 -5
  70. package/src/workflows/definition.ts +118 -8
  71. package/src/workflows/engine.ts +151 -18
  72. package/src/workflows/graph.ts +8 -6
  73. package/src/workflows/index.ts +20 -0
  74. package/src/workflows/loader.ts +186 -18
  75. package/src/workflows/schema.ts +62 -2
  76. package/src/workflows/store.ts +37 -2
  77. package/src/workflows/types.ts +109 -2
  78. package/examples/workflows/elegant-solution.workflow.ts +0 -95
@@ -0,0 +1,471 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ const COMPILED_WORKFLOW_BRAND = Symbol.for("pi-workflows.compiled-definition");
5
+ const COMPOSITION_METADATA = Symbol.for("pi-workflows.composition-metadata");
6
+ export function isCompiledWorkflow(workflow) {
7
+ return workflow[COMPILED_WORKFLOW_BRAND] === true;
8
+ }
9
+ export function compositionMetadata(workflow) {
10
+ return workflow[COMPOSITION_METADATA];
11
+ }
12
+ /**
13
+ * Compile direct includes into one qualified graph. Dynamic string references
14
+ * must be resolved to direct definitions before this function is called.
15
+ */
16
+ export function compileWorkflowDefinition(workflow, options = {}) {
17
+ if (isCompiledWorkflow(workflow))
18
+ return workflow;
19
+ validateAuthoredWorkflow(workflow);
20
+ const nodes = {};
21
+ const edges = [];
22
+ const mounts = [];
23
+ const scopes = {};
24
+ const entries = {};
25
+ const exits = {};
26
+ const sources = [];
27
+ const activeDefinitions = [];
28
+ const mountWorkflow = (current, scopePath, parentPath, mountName) => {
29
+ const cycleAt = activeDefinitions.indexOf(current);
30
+ if (cycleAt >= 0) {
31
+ const chain = [...activeDefinitions.slice(cycleAt).map((item) => item.name), current.name];
32
+ throw new Error(`Workflow include cycle: ${chain.join(" -> ")}`);
33
+ }
34
+ activeDefinitions.push(current);
35
+ validateAuthoredWorkflow(current, scopePath !== "");
36
+ const authoredNodes = Object.fromEntries(Object.keys(current.nodes).map((nodeId) => [nodeId, qualify(scopePath, nodeId)]));
37
+ const childMounts = Object.fromEntries(Object.keys(current.includes ?? {}).map((name) => [name, qualify(scopePath, name)]));
38
+ scopes[scopePath] = {
39
+ path: scopePath,
40
+ workflowName: current.name,
41
+ ...(current.maxSteps !== undefined ? { maxSteps: current.maxSteps } : {}),
42
+ authoredNodes,
43
+ childMounts,
44
+ };
45
+ if (scopePath !== "" && parentPath !== null && mountName !== null) {
46
+ const source = options.sourceMap?.get(current) ?? sourceFromDefinition(current);
47
+ if (source !== undefined) {
48
+ sources.push({
49
+ mountPath: scopePath.split("/"),
50
+ workflowName: current.name,
51
+ source,
52
+ });
53
+ }
54
+ }
55
+ for (const [localNodeId, node] of Object.entries(current.nodes)) {
56
+ const qualifiedNodeId = qualify(scopePath, localNodeId);
57
+ nodes[qualifiedNodeId] = wrapNode(node, scopePath, scopes, entries, exits);
58
+ }
59
+ for (const [name, include] of Object.entries(current.includes ?? {})) {
60
+ const child = typeof include.workflow === "string" ? include.contract : include.workflow;
61
+ if (child === undefined) {
62
+ throw new Error(`Workflow include ${qualify(scopePath, name)} is unresolved: ${include.workflow}`);
63
+ }
64
+ const mountPath = qualify(scopePath, name);
65
+ const childExits = child.exits ?? {};
66
+ if (Object.keys(childExits).length === 0) {
67
+ throw new Error(`Included workflow ${child.name} must declare at least one exit`);
68
+ }
69
+ const entryNode = mountPath;
70
+ entries[entryNode] = {
71
+ mountPath,
72
+ mountName: name,
73
+ parentPath: scopePath,
74
+ workflowName: child.name,
75
+ input: include.input,
76
+ normalizeInput: child.input,
77
+ };
78
+ nodes[entryNode] = {
79
+ nodeType: "compute",
80
+ statusDetail: `entering ${child.name}`,
81
+ run: async (context) => {
82
+ const parentContext = projectWorkflowContext(context, scopePath, scopes, entries, exits);
83
+ const mapped = include.input ? await include.input(parentContext) : parentContext.input;
84
+ const normalized = child.input ? await child.input(mapped) : mapped;
85
+ return {
86
+ schema: "pi-workflows.include-entry.v1",
87
+ invocation: countCompletedEntries(context.state, entryNode) + 1,
88
+ input: normalized === undefined ? null : normalized,
89
+ };
90
+ },
91
+ };
92
+ edges.push({ from: entryNode, to: qualify(mountPath, child.startAt) });
93
+ const exitNodes = {};
94
+ for (const [exitName, exit] of Object.entries(childExits)) {
95
+ const exitNodeId = qualify(mountPath, `__piw_exit_${exitName}`);
96
+ const fromNode = qualify(mountPath, exit.from);
97
+ exitNodes[exitName] = exitNodeId;
98
+ exits[exitNodeId] = {
99
+ nodeId: exitNodeId,
100
+ mountPath,
101
+ mountName: name,
102
+ parentPath: scopePath,
103
+ exitName,
104
+ fromNode,
105
+ validate: exit.validate,
106
+ };
107
+ nodes[exitNodeId] = {
108
+ nodeType: "compute",
109
+ statusDetail: `leaving ${child.name} through ${exitName}`,
110
+ run: async (context) => {
111
+ const childContext = projectWorkflowContext(context, mountPath, scopes, entries, exits);
112
+ const raw = childContext.outputs[exit.from];
113
+ const output = exit.validate ? await exit.validate(raw) : raw;
114
+ return { exit: exitName, output: output === undefined ? null : output };
115
+ },
116
+ };
117
+ edges.push({ from: fromNode, to: exitNodeId });
118
+ }
119
+ mounts.push({
120
+ mountPath: mountPath.split("/"),
121
+ workflowName: child.name,
122
+ entryNode,
123
+ exits: exitNodes,
124
+ ...(child.maxSteps !== undefined ? { maxSteps: child.maxSteps } : {}),
125
+ });
126
+ mountWorkflow(child, mountPath, scopePath, name);
127
+ }
128
+ for (const edge of current.edges) {
129
+ const from = resolveAuthoredFrom(scopePath, current, edge.from, exits);
130
+ if ("to" in edge) {
131
+ edges.push({ from, to: resolveAuthoredTo(scopePath, current, edge.to) });
132
+ }
133
+ else {
134
+ edges.push({
135
+ from,
136
+ switch: {
137
+ on: edge.switch.on,
138
+ cases: Object.fromEntries(Object.entries(edge.switch.cases).map(([key, target]) => [
139
+ key,
140
+ resolveAuthoredTo(scopePath, current, target),
141
+ ])),
142
+ },
143
+ });
144
+ }
145
+ }
146
+ activeDefinitions.pop();
147
+ };
148
+ mountWorkflow(workflow, "", null, null);
149
+ const metadata = {
150
+ snapshot: { mounts: mounts.sort(compareMounts) },
151
+ scopes,
152
+ entries,
153
+ exits,
154
+ sources: sources.sort(compareSources),
155
+ };
156
+ const compiled = {
157
+ ...workflow,
158
+ nodes,
159
+ edges,
160
+ };
161
+ delete compiled.includes;
162
+ delete compiled.exits;
163
+ for (const symbol of Object.getOwnPropertySymbols(workflow)) {
164
+ const descriptor = Object.getOwnPropertyDescriptor(workflow, symbol);
165
+ if (descriptor !== undefined)
166
+ Object.defineProperty(compiled, symbol, descriptor);
167
+ }
168
+ Object.defineProperty(compiled, COMPILED_WORKFLOW_BRAND, {
169
+ value: true,
170
+ enumerable: false,
171
+ });
172
+ Object.defineProperty(compiled, COMPOSITION_METADATA, {
173
+ value: metadata,
174
+ enumerable: false,
175
+ });
176
+ return compiled;
177
+ }
178
+ function validateAuthoredWorkflow(workflow, included = false) {
179
+ if (!Object.hasOwn(workflow.nodes, workflow.startAt)) {
180
+ throw new Error(`Workflow start node is missing: ${workflow.startAt}`);
181
+ }
182
+ const includes = workflow.includes ?? {};
183
+ const exits = workflow.exits ?? {};
184
+ const outgoing = new Set();
185
+ for (const edge of workflow.edges) {
186
+ if (outgoing.has(edge.from)) {
187
+ throw new Error(`Workflow node must not declare multiple outgoing edges: ${edge.from}`);
188
+ }
189
+ outgoing.add(edge.from);
190
+ assertAuthoredFrom(workflow, edge.from);
191
+ const targets = "to" in edge ? [edge.to] : Object.values(edge.switch.cases);
192
+ for (const target of targets)
193
+ assertAuthoredTo(workflow, target);
194
+ }
195
+ const exitNodes = new Set();
196
+ for (const [exitName, exit] of Object.entries(exits)) {
197
+ if (!Object.hasOwn(workflow.nodes, exit.from)) {
198
+ throw new Error(`Workflow exit ${exitName} references unknown node: ${exit.from}`);
199
+ }
200
+ if (outgoing.has(exit.from)) {
201
+ throw new Error(`Workflow exit ${exitName} must reference a terminal node: ${exit.from}`);
202
+ }
203
+ if (exitNodes.has(exit.from)) {
204
+ throw new Error(`Workflow terminal node has more than one exit: ${exit.from}`);
205
+ }
206
+ exitNodes.add(exit.from);
207
+ }
208
+ if (included) {
209
+ const undeclared = Object.keys(workflow.nodes).filter((nodeId) => !outgoing.has(nodeId) && !exitNodes.has(nodeId));
210
+ if (undeclared.length > 0) {
211
+ throw new Error(`Included workflow ${workflow.name} has terminal nodes without named exits: ${undeclared.join(", ")}`);
212
+ }
213
+ }
214
+ const reachable = new Set([workflow.startAt]);
215
+ const queue = [workflow.startAt];
216
+ while (queue.length > 0) {
217
+ const from = queue.shift();
218
+ const edge = workflow.edges.find((candidate) => candidate.from === from);
219
+ if (edge !== undefined) {
220
+ const targets = "to" in edge ? [edge.to] : Object.values(edge.switch.cases);
221
+ for (const target of targets)
222
+ addReachable(target, reachable, queue);
223
+ }
224
+ if (Object.hasOwn(includes, from)) {
225
+ const include = includes[from];
226
+ const child = include && typeof include.workflow !== "string" ? include.workflow : include?.contract;
227
+ for (const exitName of Object.keys(child?.exits ?? {})) {
228
+ addReachable(`${from}.${exitName}`, reachable, queue);
229
+ }
230
+ }
231
+ }
232
+ const unreachable = [...Object.keys(workflow.nodes), ...Object.keys(includes)].filter((id) => !reachable.has(id));
233
+ if (unreachable.length > 0) {
234
+ throw new Error(`Workflow has unreachable nodes: ${unreachable.join(", ")}`);
235
+ }
236
+ }
237
+ function assertAuthoredFrom(workflow, from) {
238
+ if (Object.hasOwn(workflow.nodes, from))
239
+ return;
240
+ const parsed = parseExitReference(from);
241
+ const include = parsed ? workflow.includes?.[parsed.mount] : undefined;
242
+ const child = include && typeof include.workflow !== "string" ? include.workflow : include?.contract;
243
+ if (parsed && child?.exits && Object.hasOwn(child.exits, parsed.exit))
244
+ return;
245
+ throw new Error(`Workflow edge references unknown from-node or include exit: ${from}`);
246
+ }
247
+ function assertAuthoredTo(workflow, to) {
248
+ if (Object.hasOwn(workflow.nodes, to) || Object.hasOwn(workflow.includes ?? {}, to))
249
+ return;
250
+ throw new Error(`Workflow edge references unknown to-node: ${to}`);
251
+ }
252
+ function resolveAuthoredFrom(scopePath, workflow, from, exitMetadata) {
253
+ if (Object.hasOwn(workflow.nodes, from))
254
+ return qualify(scopePath, from);
255
+ const parsed = parseExitReference(from);
256
+ if (!parsed)
257
+ throw new Error(`Invalid include exit reference: ${from}`);
258
+ const mountPath = qualify(scopePath, parsed.mount);
259
+ const match = Object.values(exitMetadata).find((exit) => exit.mountPath === mountPath && exit.exitName === parsed.exit);
260
+ if (!match)
261
+ throw new Error(`Unknown include exit reference: ${from}`);
262
+ return match.nodeId;
263
+ }
264
+ function resolveAuthoredTo(scopePath, workflow, target) {
265
+ if (Object.hasOwn(workflow.nodes, target) || Object.hasOwn(workflow.includes ?? {}, target)) {
266
+ return qualify(scopePath, target);
267
+ }
268
+ throw new Error(`Unknown workflow target: ${target}`);
269
+ }
270
+ function parseExitReference(value) {
271
+ const dot = value.indexOf(".");
272
+ if (dot <= 0 || dot === value.length - 1 || value.indexOf(".", dot + 1) >= 0)
273
+ return undefined;
274
+ return { mount: value.slice(0, dot), exit: value.slice(dot + 1) };
275
+ }
276
+ function addReachable(value, reachable, queue) {
277
+ if (reachable.has(value))
278
+ return;
279
+ reachable.add(value);
280
+ queue.push(value);
281
+ }
282
+ function qualify(scopePath, localId) {
283
+ return scopePath === "" ? localId : `${scopePath}/${localId}`;
284
+ }
285
+ function compareMounts(a, b) {
286
+ return a.mountPath.join("/").localeCompare(b.mountPath.join("/"));
287
+ }
288
+ function compareSources(a, b) {
289
+ return a.mountPath.join("/").localeCompare(b.mountPath.join("/"));
290
+ }
291
+ function sourceFromDefinition(workflow) {
292
+ if (workflow.source === undefined)
293
+ return undefined;
294
+ let filePath;
295
+ try {
296
+ filePath = fileURLToPath(workflow.source);
297
+ }
298
+ catch {
299
+ throw new Error(`Workflow ${workflow.name} source must be a file URL: ${workflow.source}`);
300
+ }
301
+ const hash = createHash("sha256").update(readFileSync(filePath)).digest("hex");
302
+ return { kind: "file", path: filePath, hash };
303
+ }
304
+ function wrapNode(node, scopePath, scopes, entries, exits) {
305
+ if (scopePath === "" && Object.keys(scopes[scopePath]?.childMounts ?? {}).length === 0) {
306
+ return node;
307
+ }
308
+ const project = (context) => projectWorkflowContext(context, scopePath, scopes, entries, exits);
309
+ const timeoutResolver = node.timeoutMs;
310
+ const timeoutMs = typeof timeoutResolver === "function"
311
+ ? (context) => timeoutResolver(project(context))
312
+ : timeoutResolver;
313
+ const common = {
314
+ ...(timeoutMs !== undefined ? { timeoutMs } : {}),
315
+ ...(node.statusDetail !== undefined ? { statusDetail: node.statusDetail } : {}),
316
+ };
317
+ switch (node.nodeType) {
318
+ case "agent":
319
+ return {
320
+ ...common,
321
+ nodeType: "agent",
322
+ prompt: (context) => node.prompt(project(context)),
323
+ ...(node.expectedOutput !== undefined ? { expectedOutput: node.expectedOutput } : {}),
324
+ ...(node.validate !== undefined
325
+ ? {
326
+ validate: (output, context) => node.validate?.(output, project(context)),
327
+ }
328
+ : {}),
329
+ };
330
+ case "compute":
331
+ return {
332
+ ...common,
333
+ nodeType: "compute",
334
+ run: (context) => node.run(project(context)),
335
+ };
336
+ case "notify":
337
+ return {
338
+ ...common,
339
+ nodeType: "notify",
340
+ message: (context) => node.message(project(context)),
341
+ ...(node.kind !== undefined ? { kind: node.kind } : {}),
342
+ };
343
+ case "checkpoint":
344
+ return {
345
+ ...common,
346
+ nodeType: "checkpoint",
347
+ ...(node.summary !== undefined ? { summary: node.summary } : {}),
348
+ ...(node.run !== undefined
349
+ ? { run: (context) => node.run?.(project(context)) }
350
+ : {}),
351
+ };
352
+ case "action":
353
+ if ("exec" in node) {
354
+ const shell = node;
355
+ return {
356
+ ...common,
357
+ nodeType: "action",
358
+ exec: (context) => shell.exec(project(context)),
359
+ ...(shell.parse !== undefined
360
+ ? {
361
+ parse: (result, context) => shell.parse?.(result, project(context)),
362
+ }
363
+ : {}),
364
+ ...(shell.updates !== undefined
365
+ ? {
366
+ updates: {
367
+ ...(shell.updates.streams !== undefined
368
+ ? { streams: [...shell.updates.streams] }
369
+ : {}),
370
+ parseLine: (line, context) => shell.updates?.parseLine(line, projectActionContext(context, scopePath, scopes, entries, exits)),
371
+ },
372
+ }
373
+ : {}),
374
+ };
375
+ }
376
+ return {
377
+ ...common,
378
+ nodeType: "action",
379
+ run: (context) => node.run(projectActionContext(context, scopePath, scopes, entries, exits)),
380
+ };
381
+ }
382
+ }
383
+ function projectActionContext(context, scopePath, scopes, entries, exits) {
384
+ return {
385
+ ...projectWorkflowContext(context, scopePath, scopes, entries, exits),
386
+ publishUpdate: context.publishUpdate,
387
+ };
388
+ }
389
+ export function projectWorkflowContext(context, scopePath, scopes, _entries, exits) {
390
+ const scope = scopes[scopePath];
391
+ if (!scope)
392
+ throw new Error(`Workflow scope is missing: ${scopePath || "root"}`);
393
+ const entryIndex = scopePath === "" ? -1 : latestStepIndex(context.state.steps, scopePath);
394
+ if (scopePath !== "" && entryIndex < 0) {
395
+ throw new Error(`Workflow include entry is missing: ${scopePath}`);
396
+ }
397
+ const entry = scopePath === ""
398
+ ? undefined
399
+ : context.state.steps[entryIndex]?.output;
400
+ const outputs = {};
401
+ const results = {};
402
+ for (const [local, qualified] of Object.entries(scope.authoredNodes)) {
403
+ if (latestStepIndex(context.state.steps, qualified) <= entryIndex)
404
+ continue;
405
+ if (Object.hasOwn(context.state.outputs, qualified))
406
+ outputs[local] = context.state.outputs[qualified];
407
+ const result = context.state.results[qualified];
408
+ if (result !== undefined)
409
+ results[local] = result;
410
+ }
411
+ for (const [local, mountPath] of Object.entries(scope.childMounts)) {
412
+ const latestExit = Object.values(exits)
413
+ .filter((candidate) => candidate.mountPath === mountPath)
414
+ .map((candidate) => latestStepIndex(context.state.steps, candidate.nodeId))
415
+ .reduce((max, value) => Math.max(max, value), -1);
416
+ if (latestExit <= entryIndex)
417
+ continue;
418
+ if (Object.hasOwn(context.state.outputs, mountPath))
419
+ outputs[local] = context.state.outputs[mountPath];
420
+ const result = context.state.results[mountPath];
421
+ if (result !== undefined)
422
+ results[local] = result;
423
+ }
424
+ const localSteps = context.state.steps.slice(entryIndex + 1).flatMap((step) => {
425
+ if (Object.values(scope.authoredNodes).includes(step.nodeId)) {
426
+ return [{ ...step, nodeId: localNameFor(scope, step.nodeId) }];
427
+ }
428
+ const exit = exits[step.nodeId];
429
+ if (exit?.parentPath === scopePath) {
430
+ return [{ ...step, nodeId: exit.mountName }];
431
+ }
432
+ return [];
433
+ });
434
+ const currentNode = context.state.currentNode
435
+ ? localNameFor(scope, context.state.currentNode)
436
+ : undefined;
437
+ const localInput = scopePath === "" ? context.input : (entry?.input ?? null);
438
+ const state = {
439
+ ...context.state,
440
+ input: localInput,
441
+ outputs,
442
+ results,
443
+ steps: localSteps,
444
+ ...(currentNode !== undefined ? { currentNode } : {}),
445
+ };
446
+ return {
447
+ input: localInput,
448
+ outputs,
449
+ results,
450
+ state,
451
+ signal: context.signal,
452
+ };
453
+ }
454
+ function localNameFor(scope, qualified) {
455
+ for (const [local, global] of Object.entries(scope.authoredNodes)) {
456
+ if (global === qualified)
457
+ return local;
458
+ }
459
+ return qualified;
460
+ }
461
+ function latestStepIndex(steps, nodeId) {
462
+ for (let index = steps.length - 1; index >= 0; index -= 1) {
463
+ if (steps[index]?.nodeId === nodeId)
464
+ return index;
465
+ }
466
+ return -1;
467
+ }
468
+ function countCompletedEntries(state, entryNode) {
469
+ return state.steps.filter((step) => step.nodeId === entryNode && step.outcome === "ok").length;
470
+ }
471
+ //# sourceMappingURL=composition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition.js","sourceRoot":"","sources":["../../src/workflows/composition.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { AgentNodeDefinition, WorkflowEdge, WorkflowNodeContext } from "./types.js";
1
+ import type { AgentNodeDefinition, WorkflowNodeContext } from "./types.js";
2
2
  type DecisionAgentOptions = Omit<AgentNodeDefinition, "nodeType" | "prompt" | "expectedOutput" | "validate">;
3
3
  export type DecisionDefinition<TChoice extends string> = DecisionAgentOptions & {
4
4
  question: string | ((context: WorkflowNodeContext) => string | Promise<string>);
@@ -16,10 +16,16 @@ export declare function decision<TChoice extends string>(definition: DecisionDef
16
16
  * Build the matching `switch` edge for a `decision` node. Typing `cases` as
17
17
  * `Record<TChoice, string>` makes a missing case a compile error.
18
18
  */
19
- export declare function decisionEdge<TChoice extends string>(args: {
20
- from: string;
19
+ export declare function decisionEdge<TChoice extends string, const TFrom extends string, const TCases extends Record<TChoice, string>>(args: {
20
+ from: TFrom;
21
21
  choices: readonly TChoice[];
22
22
  field?: string;
23
- cases: Record<TChoice, string>;
24
- }): WorkflowEdge;
23
+ cases: TCases;
24
+ }): {
25
+ from: TFrom;
26
+ switch: {
27
+ on: string;
28
+ cases: TCases;
29
+ };
30
+ };
25
31
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/workflows/decision.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/workflows/decision.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,24 @@
1
- import type { AgentNodeDefinition, CheckpointNodeDefinition, ComputeNodeDefinition, FunctionActionNodeDefinition, NotifyNodeDefinition, ShellActionNodeDefinition, WorkflowDefinition } from "./types.js";
2
- export declare function defineWorkflow<TWorkflow extends WorkflowDefinition>(definition: TWorkflow): TWorkflow;
3
- export declare function isWorkflowDefinition(value: unknown): value is WorkflowDefinition;
1
+ import type { AgentNodeDefinition, CheckpointNodeDefinition, ComputeNodeDefinition, FunctionActionNodeDefinition, NotifyNodeDefinition, ShellActionNodeDefinition, WorkflowDefinition, WorkflowExitMap, WorkflowIncludeDefinition, WorkflowIncludedResult, WorkflowIncludeMap, WorkflowInputOf, WorkflowNodeContext, WorkflowNodeDefinition, WorkflowTypedEdge, WorkflowValueParser } from "./types.js";
2
+ type WorkflowDefinitionInput<TInput, TNodes extends Record<string, WorkflowNodeDefinition>, TIncludes extends WorkflowIncludeMap, TExits extends WorkflowExitMap> = Omit<WorkflowDefinition<TInput, TExits, TIncludes>, "input" | "nodes" | "includes" | "exits" | "edges"> & {
3
+ input?: WorkflowValueParser<TInput>;
4
+ nodes: TNodes;
5
+ includes?: TIncludes;
6
+ exits?: TExits;
7
+ edges: WorkflowTypedEdge<TNodes, TIncludes>[];
8
+ };
9
+ export declare function defineWorkflow<TInput = unknown, const TNodes extends Record<string, WorkflowNodeDefinition> = Record<string, WorkflowNodeDefinition>, const TIncludes extends WorkflowIncludeMap = Record<never, never>, const TExits extends WorkflowExitMap = Record<never, never>>(definition: WorkflowDefinitionInput<TInput, TNodes, TIncludes, TExits>): WorkflowDefinition<TInput, TExits, TIncludes> & {
10
+ nodes: TNodes;
11
+ includes?: TIncludes;
12
+ exits?: TExits;
13
+ };
14
+ export declare function includeWorkflow<TWorkflow extends WorkflowDefinition<any, any, any>>(workflow: TWorkflow, options?: {
15
+ input?: (context: WorkflowNodeContext) => Promise<WorkflowInputOf<TWorkflow>> | WorkflowInputOf<TWorkflow>;
16
+ }): WorkflowIncludeDefinition<TWorkflow>;
17
+ export declare function includeWorkflow<TWorkflow extends WorkflowDefinition<any, any, any>>(definition: WorkflowIncludeDefinition<TWorkflow>): WorkflowIncludeDefinition<TWorkflow>;
18
+ export declare function includedResult<TWorkflow extends WorkflowDefinition<any, any, any>>(workflow: TWorkflow, value: unknown): WorkflowIncludedResult<TWorkflow>;
19
+ /** Preserve exact workflow types while checking duplicate registry names. */
20
+ export declare function defineWorkflowRegistry<const TRegistry extends Record<string, WorkflowDefinition<any, any, any>>>(registry: TRegistry): Readonly<TRegistry>;
21
+ export declare function isWorkflowDefinition(value: unknown): value is WorkflowDefinition<any, any, any>;
4
22
  export declare function agent(definition: Omit<AgentNodeDefinition, "nodeType">): AgentNodeDefinition;
5
23
  export declare function compute(definition: Omit<ComputeNodeDefinition, "nodeType">): ComputeNodeDefinition;
6
24
  export declare function notify(definition: Omit<NotifyNodeDefinition, "nodeType">): NotifyNodeDefinition;
@@ -8,3 +26,4 @@ export declare function action(definition: Omit<FunctionActionNodeDefinition, "n
8
26
  export declare function action(definition: Omit<ShellActionNodeDefinition, "nodeType">): ShellActionNodeDefinition;
9
27
  export declare function shell(definition: Omit<ShellActionNodeDefinition, "nodeType">): ShellActionNodeDefinition;
10
28
  export declare function checkpoint(definition?: Omit<CheckpointNodeDefinition, "nodeType">): CheckpointNodeDefinition;
29
+ export {};
@@ -2,17 +2,60 @@ import { assertValidAgentNode, assertValidActionNode, assertValidCheckpointNode,
2
2
  const WORKFLOW_DEFINITION_BRAND = Symbol.for("pi-workflows.definition");
3
3
  export function defineWorkflow(definition) {
4
4
  assertValidWorkflowDefinitionShape(definition);
5
- if (isWorkflowDefinition(definition)) {
6
- return definition;
5
+ const typed = definition;
6
+ if (isWorkflowDefinition(typed)) {
7
+ return typed;
7
8
  }
8
- Object.defineProperty(definition, WORKFLOW_DEFINITION_BRAND, {
9
+ Object.defineProperty(typed, WORKFLOW_DEFINITION_BRAND, {
9
10
  value: true,
10
11
  enumerable: false,
11
12
  configurable: false,
12
13
  writable: false,
13
14
  });
15
+ return typed;
16
+ }
17
+ export function includeWorkflow(workflowOrDefinition, options = {}) {
18
+ const definition = isWorkflowDefinition(workflowOrDefinition)
19
+ ? { workflow: workflowOrDefinition, ...options }
20
+ : workflowOrDefinition;
21
+ if (typeof definition.workflow !== "string" && !isWorkflowDefinition(definition.workflow)) {
22
+ throw new Error("Included workflow must be a defined workflow or a workflow reference");
23
+ }
24
+ if (definition.input !== undefined && typeof definition.input !== "function") {
25
+ throw new Error("Included workflow input must be a function");
26
+ }
27
+ if (definition.contract !== undefined && !isWorkflowDefinition(definition.contract)) {
28
+ throw new Error("Included workflow contract must be defined with defineWorkflow");
29
+ }
14
30
  return definition;
15
31
  }
32
+ export function includedResult(workflow, value) {
33
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
34
+ throw new Error(`Included ${workflow.name} result must be an object`);
35
+ }
36
+ const exit = value.exit;
37
+ if (typeof exit !== "string" || !Object.hasOwn(workflow.exits ?? {}, exit)) {
38
+ throw new Error(`Included ${workflow.name} result has unknown exit ${JSON.stringify(exit)}`);
39
+ }
40
+ if (!Object.hasOwn(value, "output")) {
41
+ throw new Error(`Included ${workflow.name} result requires output`);
42
+ }
43
+ return value;
44
+ }
45
+ /** Preserve exact workflow types while checking duplicate registry names. */
46
+ export function defineWorkflowRegistry(registry) {
47
+ const names = new Set();
48
+ for (const [key, workflow] of Object.entries(registry)) {
49
+ if (!isWorkflowDefinition(workflow)) {
50
+ throw new Error(`Workflow registry entry ${key} is not defined with defineWorkflow`);
51
+ }
52
+ if (names.has(workflow.name)) {
53
+ throw new Error(`Workflow registry has duplicate workflow name: ${workflow.name}`);
54
+ }
55
+ names.add(workflow.name);
56
+ }
57
+ return Object.freeze({ ...registry });
58
+ }
16
59
  export function isWorkflowDefinition(value) {
17
60
  return (value != null &&
18
61
  typeof value === "object" &&