@farmslot/recipe-harness 0.1.0 → 0.2.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 (86) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/README.md +30 -11
  3. package/bin/farmslot-recipe.mjs +1 -1
  4. package/dist/adapters/core.d.ts +1 -1
  5. package/dist/adapters/core.d.ts.map +1 -1
  6. package/dist/adapters/core.js +1 -1
  7. package/dist/adapters/core.js.map +1 -1
  8. package/dist/adapters/ui.d.ts +1 -1
  9. package/dist/adapters/ui.d.ts.map +1 -1
  10. package/dist/{cli.d.ts → cli/index.d.ts} +1 -1
  11. package/dist/cli/index.d.ts.map +1 -0
  12. package/dist/{cli.js → cli/index.js} +3 -3
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/cli/run-command.d.ts.map +1 -1
  15. package/dist/cli/run-command.js +2 -2
  16. package/dist/cli/run-command.js.map +1 -1
  17. package/dist/{cli-support.d.ts → cli/support.d.ts} +3 -3
  18. package/dist/cli/support.d.ts.map +1 -0
  19. package/dist/{cli-support.js → cli/support.js} +3 -3
  20. package/dist/cli/support.js.map +1 -0
  21. package/dist/cli/validate-command.js +2 -2
  22. package/dist/cli/validate-command.js.map +1 -1
  23. package/dist/core/flows.d.ts +23 -0
  24. package/dist/core/flows.d.ts.map +1 -0
  25. package/dist/core/flows.js +274 -0
  26. package/dist/core/flows.js.map +1 -0
  27. package/dist/core/graph.d.ts +12 -0
  28. package/dist/core/graph.d.ts.map +1 -0
  29. package/dist/core/graph.js +116 -0
  30. package/dist/core/graph.js.map +1 -0
  31. package/dist/core/hud.d.ts +11 -0
  32. package/dist/core/hud.d.ts.map +1 -0
  33. package/dist/core/hud.js +129 -0
  34. package/dist/core/hud.js.map +1 -0
  35. package/dist/core/json.d.ts.map +1 -0
  36. package/dist/core/json.js.map +1 -0
  37. package/dist/core/predicates.d.ts +7 -0
  38. package/dist/core/predicates.d.ts.map +1 -0
  39. package/dist/core/predicates.js +102 -0
  40. package/dist/core/predicates.js.map +1 -0
  41. package/dist/core/runner.d.ts.map +1 -0
  42. package/dist/core/runner.js +532 -0
  43. package/dist/core/runner.js.map +1 -0
  44. package/dist/core/trace.d.ts +5 -0
  45. package/dist/core/trace.d.ts.map +1 -0
  46. package/dist/core/trace.js +23 -0
  47. package/dist/core/trace.js.map +1 -0
  48. package/dist/core/types.d.ts.map +1 -0
  49. package/dist/core/types.js.map +1 -0
  50. package/dist/core/validation.d.ts +4 -0
  51. package/dist/core/validation.d.ts.map +1 -0
  52. package/dist/core/validation.js +18 -0
  53. package/dist/core/validation.js.map +1 -0
  54. package/dist/index.d.ts +2 -11
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +1 -7
  57. package/dist/index.js.map +1 -1
  58. package/dist/{writers.d.ts → node/writers.d.ts} +1 -1
  59. package/dist/node/writers.d.ts.map +1 -0
  60. package/dist/{writers.js → node/writers.js} +1 -1
  61. package/dist/node/writers.js.map +1 -0
  62. package/dist/runtime/cdp.d.ts +1 -1
  63. package/dist/runtime/cdp.d.ts.map +1 -1
  64. package/dist/runtime/cdp.js +1 -1
  65. package/dist/runtime/cdp.js.map +1 -1
  66. package/dist/runtime/react-native-bridge.d.ts +1 -1
  67. package/dist/runtime/react-native-bridge.d.ts.map +1 -1
  68. package/package.json +56 -15
  69. package/dist/cli-support.d.ts.map +0 -1
  70. package/dist/cli-support.js.map +0 -1
  71. package/dist/cli.d.ts.map +0 -1
  72. package/dist/cli.js.map +0 -1
  73. package/dist/json.d.ts.map +0 -1
  74. package/dist/json.js.map +0 -1
  75. package/dist/runner.d.ts.map +0 -1
  76. package/dist/runner.js +0 -1172
  77. package/dist/runner.js.map +0 -1
  78. package/dist/types.d.ts.map +0 -1
  79. package/dist/types.js.map +0 -1
  80. package/dist/writers.d.ts.map +0 -1
  81. package/dist/writers.js.map +0 -1
  82. /package/dist/{json.d.ts → core/json.d.ts} +0 -0
  83. /package/dist/{json.js → core/json.js} +0 -0
  84. /package/dist/{runner.d.ts → core/runner.d.ts} +0 -0
  85. /package/dist/{types.d.ts → core/types.d.ts} +0 -0
  86. /package/dist/{types.js → core/types.js} +0 -0
@@ -0,0 +1,274 @@
1
+ import path from 'node:path';
2
+ import { isDeepStrictEqual } from 'node:util';
3
+ import { resolveNextNode } from './graph.js';
4
+ import { isRecord, normalizeRelativePath, readJsonFile } from './json.js';
5
+ import { evaluateNodeGate, evaluatePredicate, getPathValue } from './predicates.js';
6
+ import { traceNodeMetadata } from './trace.js';
7
+ export async function collectFlows(recipe, options) {
8
+ const flows = new Map();
9
+ if (!isRecord(recipe))
10
+ return flows;
11
+ for (const catalogPath of collectUsePaths(recipe.uses)) {
12
+ const catalog = await readJsonFile(resolveUsePath(catalogPath, options));
13
+ addCatalogFlows(flows, catalog, catalogPath);
14
+ }
15
+ if (isRecord(recipe.flows)) {
16
+ addCatalogFlows(flows, { flows: recipe.flows }, 'recipe.flows');
17
+ }
18
+ return flows;
19
+ }
20
+ function collectUsePaths(value) {
21
+ if (value == null)
22
+ return [];
23
+ if (!Array.isArray(value))
24
+ throw new Error('uses must be an array of flow catalog paths.');
25
+ return value.map((entry, index) => {
26
+ if (typeof entry !== 'string' || !entry.trim()) {
27
+ throw new Error(`uses[${index}] must be a non-empty flow catalog path.`);
28
+ }
29
+ return entry;
30
+ });
31
+ }
32
+ function resolveUsePath(catalogPath, options) {
33
+ const normalized = normalizeRelativePath(catalogPath);
34
+ const fromRecipe = path.join(options.recipeDir, normalized);
35
+ if (path.isAbsolute(catalogPath)) {
36
+ throw new Error(`uses entry ${catalogPath} must be relative.`);
37
+ }
38
+ const relativeToProject = path.relative(options.projectRoot, fromRecipe);
39
+ if (!relativeToProject.startsWith('..') && !path.isAbsolute(relativeToProject)) {
40
+ return fromRecipe;
41
+ }
42
+ return path.join(options.projectRoot, normalized);
43
+ }
44
+ function addCatalogFlows(flows, catalog, source) {
45
+ if (!isRecord(catalog) || !isRecord(catalog.flows)) {
46
+ throw new Error(`Flow catalog ${source} must contain a flows object.`);
47
+ }
48
+ for (const [ref, flow] of Object.entries(catalog.flows)) {
49
+ const normalized = normalizeFlow(ref, flow, source);
50
+ if (flows.has(ref))
51
+ throw new Error(`Flow ${ref} is declared more than once.`);
52
+ flows.set(ref, normalized);
53
+ }
54
+ }
55
+ function normalizeFlow(ref, flow, source) {
56
+ if (!isRecord(flow))
57
+ throw new Error(`Flow ${ref} in ${source} must be an object.`);
58
+ const workflow = isRecord(flow.workflow) ? flow.workflow : flow;
59
+ if (typeof workflow.entry !== 'string' || !workflow.entry.trim() || !isRecord(workflow.nodes)) {
60
+ throw new Error(`Flow ${ref} in ${source} must include workflow.entry and workflow.nodes.`);
61
+ }
62
+ const nodes = Object.create(null);
63
+ for (const [nodeId, node] of Object.entries(workflow.nodes)) {
64
+ if (isRecord(node))
65
+ nodes[nodeId] = node;
66
+ }
67
+ return {
68
+ entry: workflow.entry,
69
+ nodes,
70
+ paramsSchema: flow.paramsSchema,
71
+ postcondition: flow.postcondition,
72
+ };
73
+ }
74
+ export async function executeInlineFlowCall({ callNodeId, node, context, flowCatalog, adapters, traceWriter, callStack, maxCallDepth, }) {
75
+ const ref = typeof node.ref === 'string' && node.ref.trim() ? node.ref.trim() : '';
76
+ if (!ref)
77
+ throw new Error('call.ref must be a non-empty flow id.');
78
+ if (callStack.includes(ref)) {
79
+ throw new Error(`Flow call cycle detected: ${[...callStack, ref].join(' -> ')}.`);
80
+ }
81
+ if (callStack.length >= maxCallDepth) {
82
+ throw new Error(`Flow call depth exceeded maximum ${maxCallDepth}.`);
83
+ }
84
+ const flow = flowCatalog.get(ref);
85
+ if (!flow)
86
+ throw new Error(`Flow ${ref} is not available from recipe uses or inline flows.`);
87
+ const params = isRecord(node.params) ? node.params : {};
88
+ validateParamsSchema(params, flow.paramsSchema, ref);
89
+ const nextCallStack = [...callStack, ref];
90
+ const output = await executeInlineFlow({
91
+ callNodeId,
92
+ flowRef: ref,
93
+ flow,
94
+ params,
95
+ context,
96
+ flowCatalog,
97
+ adapters,
98
+ traceWriter,
99
+ callStack: nextCallStack,
100
+ maxCallDepth,
101
+ });
102
+ if (flow.postcondition != null && !evaluatePredicate(output, flow.postcondition)) {
103
+ throw new Error(`Flow ${ref} failed its postcondition.`);
104
+ }
105
+ return { output };
106
+ }
107
+ async function executeInlineFlow({ callNodeId, flowRef, flow, params, context, flowCatalog, adapters, traceWriter, callStack, maxCallDepth, }) {
108
+ let currentNodeId = flow.entry;
109
+ let transitionCount = 0;
110
+ const maxTransitions = Object.keys(flow.nodes).length * 3;
111
+ const flowOutputs = {};
112
+ const flowOutputMap = new Map();
113
+ flowOutputMap.set('params', params);
114
+ flowOutputMap.set(`${callNodeId}/params`, params);
115
+ while (currentNodeId) {
116
+ transitionCount += 1;
117
+ if (transitionCount > maxTransitions) {
118
+ throw new Error(`Flow ${flowRef} exceeded its maximum transition count.`);
119
+ }
120
+ const localNodeId = currentNodeId;
121
+ const rawFlowNode = flow.nodes[localNodeId];
122
+ if (!rawFlowNode)
123
+ throw new Error(`Flow ${flowRef} node ${localNodeId} does not exist.`);
124
+ const flowNode = resolveParams(rawFlowNode, params);
125
+ const action = String(flowNode.action);
126
+ const adapter = action === 'call' ? undefined : adapters.get(action);
127
+ if (action !== 'call' && !adapter)
128
+ throw new Error(`No adapter registered for flow action ${action}.`);
129
+ const startedAt = new Date();
130
+ const namespacedNodeId = `${callNodeId}/${localNodeId}`;
131
+ try {
132
+ const mergedOutputs = new Map([...context.outputs, ...flowOutputMap]);
133
+ const gate = evaluateNodeGate(flowNode, mergedOutputs);
134
+ if (!gate.run) {
135
+ const next = resolveNextNode(flowNode, {});
136
+ traceWriter.record({
137
+ nodeId: namespacedNodeId,
138
+ action,
139
+ ...traceNodeMetadata(flowNode),
140
+ startedAt: startedAt.toISOString(),
141
+ endedAt: new Date().toISOString(),
142
+ durationMs: Date.now() - startedAt.getTime(),
143
+ ok: true,
144
+ next,
145
+ output: { skipped: true, reason: gate.reason },
146
+ });
147
+ currentNodeId = next;
148
+ continue;
149
+ }
150
+ const childContext = {
151
+ ...context,
152
+ nodeId: namespacedNodeId,
153
+ outputs: mergedOutputs,
154
+ getOutput(nodeId) {
155
+ if (flowOutputMap.has(nodeId))
156
+ return flowOutputMap.get(nodeId);
157
+ const namespacedLookup = `${callNodeId}/${nodeId}`;
158
+ if (flowOutputMap.has(namespacedLookup))
159
+ return flowOutputMap.get(namespacedLookup);
160
+ return context.getOutput(nodeId);
161
+ },
162
+ };
163
+ const result = action === 'call'
164
+ ? await executeInlineFlowCall({
165
+ callNodeId: namespacedNodeId,
166
+ node: flowNode,
167
+ context: childContext,
168
+ flowCatalog,
169
+ adapters,
170
+ traceWriter,
171
+ callStack,
172
+ maxCallDepth,
173
+ })
174
+ : await adapter.execute(flowNode, childContext);
175
+ if (result.output !== undefined) {
176
+ flowOutputs[localNodeId] = result.output;
177
+ flowOutputMap.set(localNodeId, result.output);
178
+ flowOutputMap.set(namespacedNodeId, result.output);
179
+ }
180
+ traceWriter.record({
181
+ nodeId: namespacedNodeId,
182
+ action,
183
+ ...traceNodeMetadata(flowNode, result),
184
+ startedAt: startedAt.toISOString(),
185
+ endedAt: new Date().toISOString(),
186
+ durationMs: Date.now() - startedAt.getTime(),
187
+ ok: true,
188
+ next: resolveNextNode(flowNode, result),
189
+ status: result.status,
190
+ output: result.output,
191
+ });
192
+ if (result.status) {
193
+ if (result.status === 'fail')
194
+ throw new Error(`Flow ${flowRef} failed at ${localNodeId}.`);
195
+ return { ref: flowRef, status: result.status, outputs: flowOutputs };
196
+ }
197
+ currentNodeId = resolveNextNode(flowNode, result);
198
+ }
199
+ catch (error) {
200
+ const message = error instanceof Error ? error.message : String(error);
201
+ traceWriter.record({
202
+ nodeId: namespacedNodeId,
203
+ action,
204
+ ...traceNodeMetadata(flowNode),
205
+ startedAt: startedAt.toISOString(),
206
+ endedAt: new Date().toISOString(),
207
+ durationMs: Date.now() - startedAt.getTime(),
208
+ ok: false,
209
+ error: message,
210
+ });
211
+ throw error;
212
+ }
213
+ }
214
+ return { ref: flowRef, status: 'unknown', outputs: flowOutputs };
215
+ }
216
+ function validateParamsSchema(params, schema, flowRef) {
217
+ if (schema == null)
218
+ return;
219
+ if (!isRecord(schema))
220
+ throw new Error(`Flow ${flowRef} paramsSchema must be an object.`);
221
+ if (schema.type != null && schema.type !== 'object') {
222
+ throw new Error(`Flow ${flowRef} paramsSchema.type must be object.`);
223
+ }
224
+ if (Array.isArray(schema.required)) {
225
+ for (const key of schema.required) {
226
+ if (typeof key !== 'string')
227
+ continue;
228
+ if (!Object.prototype.hasOwnProperty.call(params, key)) {
229
+ throw new Error(`Flow ${flowRef} params missing required field ${key}.`);
230
+ }
231
+ }
232
+ }
233
+ if (!isRecord(schema.properties))
234
+ return;
235
+ for (const [key, propertySchema] of Object.entries(schema.properties)) {
236
+ if (!Object.prototype.hasOwnProperty.call(params, key))
237
+ continue;
238
+ validateParamValue(params[key], propertySchema, `Flow ${flowRef} params.${key}`);
239
+ }
240
+ }
241
+ function validateParamValue(value, schema, label) {
242
+ if (!isRecord(schema))
243
+ return;
244
+ if (Array.isArray(schema.enum) && !schema.enum.some((entry) => isDeepStrictEqual(entry, value))) {
245
+ throw new Error(`${label} must be one of ${JSON.stringify(schema.enum)}.`);
246
+ }
247
+ if (schema.type == null)
248
+ return;
249
+ const actualType = Array.isArray(value) ? 'array' : value === null ? 'null' : typeof value;
250
+ if (actualType !== schema.type) {
251
+ throw new Error(`${label} must be ${String(schema.type)}, received ${actualType}.`);
252
+ }
253
+ }
254
+ function resolveParams(node, params) {
255
+ return resolveParamValue(node, params);
256
+ }
257
+ function resolveParamValue(value, params) {
258
+ if (typeof value === 'string') {
259
+ const fullMatch = /^\{\{params\.([A-Za-z0-9_.-]+)\}\}$/.exec(value);
260
+ if (fullMatch)
261
+ return getPathValue(params, fullMatch[1]);
262
+ return value.replace(/\{\{params\.([A-Za-z0-9_.-]+)\}\}/g, (_match, key) => String(getPathValue(params, key) ?? ''));
263
+ }
264
+ if (Array.isArray(value))
265
+ return value.map((entry) => resolveParamValue(entry, params));
266
+ if (!isRecord(value))
267
+ return value;
268
+ const resolved = {};
269
+ for (const [key, entry] of Object.entries(value)) {
270
+ resolved[key] = resolveParamValue(entry, params);
271
+ }
272
+ return resolved;
273
+ }
274
+ //# sourceMappingURL=flows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flows.js","sourceRoot":"","sources":["../../src/core/flows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ActionResult, PreconditionChecker, PreconditionResult, RecipePreconditionGate } from './types.js';
2
+ export interface WorkflowGraph {
3
+ entry: string;
4
+ nodes: Record<string, Record<string, unknown>>;
5
+ preconditions: RecipePreconditionGate[];
6
+ teardownEntry?: string;
7
+ }
8
+ export declare function extractWorkflowGraph(recipe: unknown): WorkflowGraph;
9
+ export declare function parsePreconditions(value: unknown): RecipePreconditionGate[];
10
+ export declare function normalizePreconditionResult(result: Awaited<ReturnType<PreconditionChecker['execute']>>): PreconditionResult;
11
+ export declare function resolveNextNode(node: Record<string, unknown>, result: ActionResult): string | undefined;
12
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/core/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,aAAa,EAAE,sBAAsB,EAAE,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAsCnE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,EAAE,CAuB3E;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,GAC1D,kBAAkB,CAIpB;AA6CD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,YAAY,GACnB,MAAM,GAAG,SAAS,CASpB"}
@@ -0,0 +1,116 @@
1
+ import { isRecord } from './json.js';
2
+ export function extractWorkflowGraph(recipe) {
3
+ if (!isRecord(recipe) || !isRecord(recipe.validate) || !isRecord(recipe.validate.workflow)) {
4
+ throw new Error('Recipe must include validate.workflow.');
5
+ }
6
+ const workflow = recipe.validate.workflow;
7
+ if (typeof workflow.entry !== 'string' || !isRecord(workflow.nodes)) {
8
+ throw new Error('Recipe workflow must include entry and nodes.');
9
+ }
10
+ const nodes = Object.create(null);
11
+ for (const [nodeId, node] of Object.entries(workflow.nodes)) {
12
+ if (isRecord(node))
13
+ nodes[nodeId] = node;
14
+ }
15
+ const mainEntry = workflow.entry;
16
+ const setupNodes = parseLifecycleNodes(workflow.setup, 'setup');
17
+ const startState = isRecord(recipe.startState)
18
+ ? [{ id: 'startState', node: recipe.startState }]
19
+ : [];
20
+ const teardownNodes = parseLifecycleNodes(workflow.teardown, 'teardown');
21
+ const preconditions = parsePreconditions(workflow.pre_conditions);
22
+ let entry = mainEntry;
23
+ const setupChain = [...setupNodes, ...startState];
24
+ if (setupChain.length > 0) {
25
+ entry = setupChain[0].id;
26
+ linkLifecycleNodes(nodes, setupChain, mainEntry);
27
+ }
28
+ let teardownEntry;
29
+ if (teardownNodes.length > 0) {
30
+ teardownEntry = teardownNodes[0].id;
31
+ linkLifecycleNodes(nodes, teardownNodes, 'teardown:end');
32
+ nodes['teardown:end'] = { action: 'end', status: 'pass', phase: 'teardown' };
33
+ }
34
+ return { entry, nodes, preconditions, teardownEntry };
35
+ }
36
+ export function parsePreconditions(value) {
37
+ if (value == null)
38
+ return [];
39
+ if (!Array.isArray(value)) {
40
+ throw new Error('validate.workflow.pre_conditions must be an array.');
41
+ }
42
+ return value.map((entry, index) => {
43
+ if (typeof entry === 'string' && entry.trim())
44
+ return { id: entry.trim() };
45
+ if (!isRecord(entry)) {
46
+ throw new Error(`validate.workflow.pre_conditions[${index}] must be a string or object.`);
47
+ }
48
+ if (typeof entry.id !== 'string' || !entry.id.trim()) {
49
+ throw new Error(`validate.workflow.pre_conditions[${index}].id must be a non-empty string.`);
50
+ }
51
+ if (entry.params != null && !isRecord(entry.params)) {
52
+ throw new Error(`validate.workflow.pre_conditions[${index}].params must be an object.`);
53
+ }
54
+ return {
55
+ id: entry.id.trim(),
56
+ description: typeof entry.description === 'string' ? entry.description : undefined,
57
+ params: isRecord(entry.params) ? entry.params : undefined,
58
+ required: typeof entry.required === 'boolean' ? entry.required : undefined,
59
+ };
60
+ });
61
+ }
62
+ export function normalizePreconditionResult(result) {
63
+ if (typeof result === 'boolean')
64
+ return { ok: result };
65
+ if (result === undefined)
66
+ return { ok: true };
67
+ return result;
68
+ }
69
+ function parseLifecycleNodes(value, phase) {
70
+ if (value == null)
71
+ return [];
72
+ if (!Array.isArray(value))
73
+ throw new Error(`validate.workflow.${phase} must be an array.`);
74
+ return value.map((entry, index) => {
75
+ if (!isRecord(entry)) {
76
+ throw new Error(`validate.workflow.${phase}[${index}] must be an action node object.`);
77
+ }
78
+ const authoredId = typeof entry.id === 'string' && entry.id.trim() ? entry.id.trim() : `${phase}:${index}`;
79
+ return {
80
+ id: authoredId,
81
+ node: {
82
+ phase,
83
+ ...entry,
84
+ },
85
+ };
86
+ });
87
+ }
88
+ function linkLifecycleNodes(nodes, lifecycleNodes, nextAfterLifecycle) {
89
+ lifecycleNodes.forEach((entry, index) => {
90
+ if (nodes[entry.id])
91
+ throw new Error(`Lifecycle node id ${entry.id} conflicts with graph node.`);
92
+ if (entry.node.next != null) {
93
+ throw new Error(`Lifecycle node ${entry.id} must not declare next; setup and teardown arrays are ordered lists.`);
94
+ }
95
+ const next = lifecycleNodes[index + 1]?.id ?? nextAfterLifecycle;
96
+ nodes[entry.id] = {
97
+ ...entry.node,
98
+ next,
99
+ };
100
+ });
101
+ }
102
+ export function resolveNextNode(node, result) {
103
+ if (result.next)
104
+ return result.next;
105
+ if (result.case && isRecord(node.cases)) {
106
+ const target = node.cases[result.case];
107
+ if (typeof target === 'string')
108
+ return target;
109
+ }
110
+ if (typeof node.next === 'string')
111
+ return node.next;
112
+ if (typeof node.default === 'string')
113
+ return node.default;
114
+ return undefined;
115
+ }
116
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/core/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { RecipeHudOptions } from './types.js';
2
+ export declare function buildHudNode(status: 'running' | 'pass' | 'fail', event: {
3
+ nodeId: string;
4
+ action: string;
5
+ node: Record<string, unknown>;
6
+ recipe: unknown;
7
+ index: number;
8
+ total: number;
9
+ error?: string;
10
+ }, options: RecipeHudOptions | false | undefined): Record<string, unknown>;
11
+ //# sourceMappingURL=hud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hud.d.ts","sourceRoot":"","sources":["../../src/core/hud.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EACnC,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EACD,OAAO,EAAE,gBAAgB,GAAG,KAAK,GAAG,SAAS,GAC5C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoCzB"}
@@ -0,0 +1,129 @@
1
+ import { isRecord } from './json.js';
2
+ export function buildHudNode(status, event, options) {
3
+ const title = options && options.title
4
+ ? options.title
5
+ : isRecord(event.recipe) && typeof event.recipe.title === 'string'
6
+ ? event.recipe.title
7
+ : 'Recipe run';
8
+ const flow = hudFlow(event.action, event.node);
9
+ const subIntent = hudSubIntent(event.node);
10
+ const text = hudText(event.node);
11
+ const detail = normalizeHudSecondary(hudDetail(event.node), text, subIntent || flow);
12
+ const phase = typeof event.node.phase === 'string' && event.node.phase.trim()
13
+ ? event.node.phase
14
+ : lifecyclePhase(status);
15
+ return {
16
+ action: 'app.hud',
17
+ title,
18
+ status,
19
+ node_id: event.nodeId,
20
+ phase,
21
+ flow: flow || undefined,
22
+ detail,
23
+ text,
24
+ sub_intent: subIntent || undefined,
25
+ action_name: event.action,
26
+ proofTarget: event.node.proofTarget,
27
+ record: event.node.record,
28
+ intent: text,
29
+ error: event.error ? hudErrorSummary(event.error) : undefined,
30
+ display: isRecord(event.node.display) ? event.node.display : hudDisplay(options),
31
+ progress: {
32
+ current: event.index,
33
+ total: event.total,
34
+ },
35
+ };
36
+ }
37
+ function hudDisplay(options) {
38
+ if (!options || !options.display)
39
+ return {};
40
+ return { ...options.display };
41
+ }
42
+ function lifecyclePhase(status) {
43
+ if (status === 'running')
44
+ return 'running';
45
+ if (status === 'fail')
46
+ return 'failed';
47
+ return 'passed';
48
+ }
49
+ function hudFlow(_action, node) {
50
+ for (const key of ['flow', 'domain', 'group']) {
51
+ const value = node[key];
52
+ if (typeof value === 'string' && value.trim())
53
+ return value;
54
+ }
55
+ return '';
56
+ }
57
+ function hudSubIntent(node) {
58
+ for (const key of ['sub_intent', 'subIntent']) {
59
+ const value = node[key];
60
+ if (typeof value === 'string' && value.trim())
61
+ return value;
62
+ }
63
+ return '';
64
+ }
65
+ function hudText(node) {
66
+ for (const key of ['intent', 'label', 'title', 'description', 'text']) {
67
+ const value = node[key];
68
+ if (typeof value === 'string' && value.trim())
69
+ return value;
70
+ }
71
+ return 'Executing recipe step';
72
+ }
73
+ function hudDetail(node) {
74
+ const explicitDetail = node.detail;
75
+ if (typeof explicitDetail === 'string' && explicitDetail.trim())
76
+ return explicitDetail;
77
+ const fragments = [];
78
+ for (const key of ['target', 'destination', 'selector', 'test_id', 'testID']) {
79
+ const value = node[key];
80
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
81
+ fragments.push(`${key}=${String(value)}`);
82
+ }
83
+ }
84
+ return fragments.length ? fragments.join(' · ') : undefined;
85
+ }
86
+ function normalizeHudSecondary(value, intent, flow) {
87
+ const normalized = value?.trim();
88
+ if (!normalized)
89
+ return undefined;
90
+ if (normalized === intent || normalized === flow)
91
+ return undefined;
92
+ return normalized;
93
+ }
94
+ function hudErrorSummary(error) {
95
+ const nestedError = error.match(/"error":"([^"]+)"/)?.[1];
96
+ const lines = error
97
+ .split('\n')
98
+ .map((line) => line.trim())
99
+ .filter((line) => {
100
+ if (!line)
101
+ return false;
102
+ if (line.includes("Warning: The 'NO_COLOR' env"))
103
+ return false;
104
+ if (line.startsWith('(Use `node --trace-warnings'))
105
+ return false;
106
+ if (line.startsWith('file://'))
107
+ return false;
108
+ if (line.startsWith('at '))
109
+ return false;
110
+ if (line.startsWith('Node.js '))
111
+ return false;
112
+ return true;
113
+ });
114
+ const errorLine = [...lines].reverse().find((line) => line.startsWith('Error: ')) ??
115
+ lines.find((line) => line.includes('Error: ')) ??
116
+ lines[0] ??
117
+ error;
118
+ let summary = errorLine.includes('Error: ')
119
+ ? errorLine.slice(errorLine.indexOf('Error: ') + 'Error: '.length)
120
+ : errorLine;
121
+ const resultIndex = summary.indexOf('. Result:');
122
+ if (resultIndex > 0)
123
+ summary = summary.slice(0, resultIndex);
124
+ if (nestedError && !summary.includes(nestedError))
125
+ summary = `${summary}: ${nestedError}`;
126
+ const maxLength = 180;
127
+ return summary.length > maxLength ? `${summary.slice(0, maxLength - 1)}…` : summary;
128
+ }
129
+ //# sourceMappingURL=hud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hud.js","sourceRoot":"","sources":["../../src/core/hud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,MAAM,UAAU,YAAY,CAC1B,MAAmC,EACnC,KAQC,EACD,OAA6C;IAE7C,MAAM,KAAK,GACT,OAAO,IAAI,OAAO,CAAC,KAAK;QACtB,CAAC,CAAC,OAAO,CAAC,KAAK;QACf,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ;YAChE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;YACpB,CAAC,CAAC,YAAY,CAAC;IACrB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC;IACrF,MAAM,KAAK,GACT,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAC7D,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;QAClB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,KAAK;QACL,MAAM;QACN,OAAO,EAAE,KAAK,CAAC,MAAM;QACrB,KAAK;QACL,IAAI,EAAE,IAAI,IAAI,SAAS;QACvB,MAAM;QACN,IAAI;QACJ,UAAU,EAAE,SAAS,IAAI,SAAS;QAClC,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW;QACnC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;QACzB,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7D,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QAChF,QAAQ,EAAE;YACR,OAAO,EAAE,KAAK,CAAC,KAAK;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,OAA6C;IAC/D,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAC5C,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,MAAmC;IACzD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IACvC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,OAAO,CAAC,OAAe,EAAE,IAA6B;IAC7D,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,IAA6B;IACjD,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,IAA6B;IAC5C,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC;IAC9D,CAAC;IACD,OAAO,uBAAuB,CAAC;AACjC,CAAC;AAED,SAAS,SAAS,CAAC,IAA6B;IAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,EAAE;QAAE,OAAO,cAAc,CAAC;IACvF,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YACzF,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9D,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAyB,EACzB,MAAc,EACd,IAAY;IAEZ,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACnE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/D,IAAI,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC;YAAE,OAAO,KAAK,CAAC;QACjE,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACL,MAAM,SAAS,GACb,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC9C,KAAK,CAAC,CAAC,CAAC;QACR,KAAK,CAAC;IACR,IAAI,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;QACzC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;QAClE,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC7D,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,GAAG,GAAG,OAAO,KAAK,WAAW,EAAE,CAAC;IAC1F,MAAM,SAAS,GAAG,GAAG,CAAC;IACtB,OAAO,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AACtF,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQrE;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGlF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CASlE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAuB1E"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function evaluateNodeGate(node: Record<string, unknown>, outputs: ReadonlyMap<string, unknown>): {
2
+ run: boolean;
3
+ reason?: string;
4
+ };
5
+ export declare function evaluatePredicate(root: unknown, predicate: unknown): boolean;
6
+ export declare function getPathValue(root: unknown, dottedPath: string): unknown;
7
+ //# sourceMappingURL=predicates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicates.d.ts","sourceRoot":"","sources":["../../src/core/predicates.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CASnC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAmD5E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CASvE"}