@studio-foundation/engine 0.4.0-beta → 0.5.2

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/README.md +1 -1
  2. package/dist/__tests__/engine.script-stage.test.js +13 -32
  3. package/dist/__tests__/engine.script-stage.test.js.map +1 -1
  4. package/dist/engine.d.ts +2 -0
  5. package/dist/engine.d.ts.map +1 -1
  6. package/dist/engine.js +134 -1
  7. package/dist/engine.js.map +1 -1
  8. package/dist/events.d.ts +48 -0
  9. package/dist/events.d.ts.map +1 -1
  10. package/dist/events.js.map +1 -1
  11. package/dist/index.d.ts +5 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +4 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/pipeline/call-input.d.ts +4 -0
  16. package/dist/pipeline/call-input.d.ts.map +1 -0
  17. package/dist/pipeline/call-input.js +28 -0
  18. package/dist/pipeline/call-input.js.map +1 -0
  19. package/dist/pipeline/call-orchestrator.d.ts +21 -0
  20. package/dist/pipeline/call-orchestrator.d.ts.map +1 -0
  21. package/dist/pipeline/call-orchestrator.js +127 -0
  22. package/dist/pipeline/call-orchestrator.js.map +1 -0
  23. package/dist/pipeline/condition-evaluator.d.ts +12 -0
  24. package/dist/pipeline/condition-evaluator.d.ts.map +1 -1
  25. package/dist/pipeline/condition-evaluator.js +27 -9
  26. package/dist/pipeline/condition-evaluator.js.map +1 -1
  27. package/dist/pipeline/context-propagation.d.ts +1 -0
  28. package/dist/pipeline/context-propagation.d.ts.map +1 -1
  29. package/dist/pipeline/context-propagation.js +18 -0
  30. package/dist/pipeline/context-propagation.js.map +1 -1
  31. package/dist/pipeline/contract-loader.d.ts.map +1 -1
  32. package/dist/pipeline/contract-loader.js +67 -0
  33. package/dist/pipeline/contract-loader.js.map +1 -1
  34. package/dist/pipeline/external-validator.d.ts +3 -0
  35. package/dist/pipeline/external-validator.d.ts.map +1 -0
  36. package/dist/pipeline/external-validator.js +65 -0
  37. package/dist/pipeline/external-validator.js.map +1 -0
  38. package/dist/pipeline/external-validator.test.d.ts +2 -0
  39. package/dist/pipeline/external-validator.test.d.ts.map +1 -0
  40. package/dist/pipeline/external-validator.test.js +40 -0
  41. package/dist/pipeline/external-validator.test.js.map +1 -0
  42. package/dist/pipeline/loader.d.ts.map +1 -1
  43. package/dist/pipeline/loader.js +154 -1
  44. package/dist/pipeline/loader.js.map +1 -1
  45. package/dist/pipeline/loader.test.js +30 -0
  46. package/dist/pipeline/loader.test.js.map +1 -1
  47. package/dist/pipeline/map-input.d.ts +13 -0
  48. package/dist/pipeline/map-input.d.ts.map +1 -0
  49. package/dist/pipeline/map-input.js +80 -0
  50. package/dist/pipeline/map-input.js.map +1 -0
  51. package/dist/pipeline/map-orchestrator.d.ts +35 -0
  52. package/dist/pipeline/map-orchestrator.d.ts.map +1 -0
  53. package/dist/pipeline/map-orchestrator.js +223 -0
  54. package/dist/pipeline/map-orchestrator.js.map +1 -0
  55. package/dist/pipeline/output-checker.d.ts +3 -0
  56. package/dist/pipeline/output-checker.d.ts.map +1 -0
  57. package/dist/pipeline/output-checker.js +40 -0
  58. package/dist/pipeline/output-checker.js.map +1 -0
  59. package/dist/pipeline/output-checker.test.d.ts +2 -0
  60. package/dist/pipeline/output-checker.test.d.ts.map +1 -0
  61. package/dist/pipeline/output-checker.test.js +62 -0
  62. package/dist/pipeline/output-checker.test.js.map +1 -0
  63. package/dist/pipeline/stage-executor.d.ts.map +1 -1
  64. package/dist/pipeline/stage-executor.js +48 -9
  65. package/dist/pipeline/stage-executor.js.map +1 -1
  66. package/dist/pipeline/stage-resolver.js +1 -1
  67. package/dist/pipeline/stage-resolver.js.map +1 -1
  68. package/dist/pipeline/strict-fields.d.ts +20 -0
  69. package/dist/pipeline/strict-fields.d.ts.map +1 -0
  70. package/dist/pipeline/strict-fields.js +62 -0
  71. package/dist/pipeline/strict-fields.js.map +1 -0
  72. package/dist/pipeline/task-input.d.ts +14 -0
  73. package/dist/pipeline/task-input.d.ts.map +1 -0
  74. package/dist/pipeline/task-input.js +22 -0
  75. package/dist/pipeline/task-input.js.map +1 -0
  76. package/dist/pipeline/task-input.test.d.ts +2 -0
  77. package/dist/pipeline/task-input.test.d.ts.map +1 -0
  78. package/dist/pipeline/task-input.test.js +33 -0
  79. package/dist/pipeline/task-input.test.js.map +1 -0
  80. package/dist/pipeline/template-interpolation.d.ts +9 -0
  81. package/dist/pipeline/template-interpolation.d.ts.map +1 -0
  82. package/dist/pipeline/template-interpolation.js +33 -0
  83. package/dist/pipeline/template-interpolation.js.map +1 -0
  84. package/dist/state/status-derivation.js +3 -3
  85. package/dist/state/status-derivation.js.map +1 -1
  86. package/package.json +5 -5
@@ -2,6 +2,77 @@
2
2
  import { readFile } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
4
  import * as yaml from 'js-yaml';
5
+ import { assertKnownFields, suggestClosest } from './strict-fields.js';
6
+ import { CONTEXT_INCLUDE_DIRECTIVES } from './context-propagation.js';
7
+ // Every field the kernel implements, per block (see PipelineDefinition and
8
+ // friends in @studio-foundation/contracts). Anything else is config-theatre
9
+ // and must be rejected at load time, not silently ignored.
10
+ const PIPELINE_FIELDS = [
11
+ 'name', 'description', 'version', 'on_pipeline_start', 'input_schema', 'repo', 'stages',
12
+ ];
13
+ const STAGE_FIELDS = [
14
+ 'name', 'condition', 'kind', 'agent', 'executor', 'script', 'runtime',
15
+ 'timeout_ms', 'contract', 'ralph', 'context', 'tools', 'hooks',
16
+ ];
17
+ const GROUP_FIELDS = ['group', 'max_iterations', 'mode', 'on_failure', 'stages'];
18
+ const MAP_FIELDS = ['map', 'condition', 'over', 'pipeline', 'input', 'as', 'concurrency', 'on_item_failure'];
19
+ const CALL_FIELDS = ['call', 'condition', 'pipeline', 'input'];
20
+ const RALPH_FIELDS = ['max_attempts', 'retry_strategy', 'max_tool_calls'];
21
+ const CONTEXT_FIELDS = ['include', 'packs'];
22
+ const TOOLS_FIELDS = ['required'];
23
+ const HOOKS_FIELDS = ['on_stage_start', 'on_stage_complete', 'pre_tool_use', 'post_tool_use'];
24
+ const STAGE_HOOK_FIELDS = ['command', 'on_failure'];
25
+ const TOOL_HOOK_FIELDS = ['matcher', 'command', 'on_failure'];
26
+ const STARTUP_COMMAND_FIELDS = ['command', 'inject_as'];
27
+ const REPO_FIELDS = ['url', 'branch'];
28
+ const INPUT_SCHEMA_FIELDS = ['type', 'fields'];
29
+ const INPUT_FIELD_FIELDS = ['name', 'type', 'prompt', 'required', 'default', 'items'];
30
+ /** assertKnownFields on a block only if it is a plain object. */
31
+ function checkBlock(block, allowed, what, context) {
32
+ if (block && typeof block === 'object' && !Array.isArray(block)) {
33
+ assertKnownFields(block, allowed, what, context);
34
+ }
35
+ }
36
+ /**
37
+ * Reject a `context.include` directive the kernel does not implement. The block
38
+ * keys (include/packs) are already checked; this checks the include *values* —
39
+ * an unknown one has no switch case in getContextForStage and is silently
40
+ * dropped, so the user believes a context is wired that never arrives (STU-593).
41
+ */
42
+ function checkContextInclude(stage, context) {
43
+ const includes = stage.context?.include;
44
+ if (!Array.isArray(includes))
45
+ return;
46
+ for (const directive of includes) {
47
+ if (typeof directive === 'string' && !CONTEXT_INCLUDE_DIRECTIVES.includes(directive)) {
48
+ const suggestion = suggestClosest(directive, CONTEXT_INCLUDE_DIRECTIVES);
49
+ throw new Error(`Unknown context.include '${directive}' in stage '${stage.name}'${context}.` +
50
+ (suggestion ? ` Did you mean '${suggestion}'?` : '') +
51
+ ` Known directives: ${[...CONTEXT_INCLUDE_DIRECTIVES].sort().join(', ')}.`);
52
+ }
53
+ }
54
+ }
55
+ /** Strict-check a stage and every nested block the kernel owns. */
56
+ function checkStageFields(stage, context) {
57
+ const inStage = `of stage '${stage.name}'`;
58
+ assertKnownFields(stage, STAGE_FIELDS, `stage '${stage.name}'`, context);
59
+ checkBlock(stage.ralph, RALPH_FIELDS, `ralph ${inStage}`, context);
60
+ checkBlock(stage.context, CONTEXT_FIELDS, `context ${inStage}`, context);
61
+ checkContextInclude(stage, context);
62
+ checkBlock(stage.tools, TOOLS_FIELDS, `tools ${inStage}`, context);
63
+ checkBlock(stage.hooks, HOOKS_FIELDS, `hooks ${inStage}`, context);
64
+ if (stage.hooks && typeof stage.hooks === 'object') {
65
+ for (const point of HOOKS_FIELDS) {
66
+ const entries = stage.hooks[point];
67
+ if (!Array.isArray(entries))
68
+ continue;
69
+ const allowed = point.startsWith('on_stage') ? STAGE_HOOK_FIELDS : TOOL_HOOK_FIELDS;
70
+ for (const entry of entries) {
71
+ checkBlock(entry, allowed, `hooks.${point} entry ${inStage}`, context);
72
+ }
73
+ }
74
+ }
75
+ }
5
76
  export async function loadPipeline(path) {
6
77
  let content;
7
78
  try {
@@ -31,15 +102,39 @@ export function parsePipelineYaml(yamlContent, sourcePath) {
31
102
  if (parsed.stages.length === 0) {
32
103
  throw new Error(`Pipeline must have at least one stage${context}`);
33
104
  }
105
+ assertKnownFields(parsed, PIPELINE_FIELDS, `pipeline '${parsed.name}'`, context);
106
+ checkBlock(parsed.repo, REPO_FIELDS, `repo of pipeline '${parsed.name}'`, context);
107
+ checkBlock(parsed.input_schema, INPUT_SCHEMA_FIELDS, `input_schema of pipeline '${parsed.name}'`, context);
108
+ const inputFields = parsed.input_schema?.fields;
109
+ if (Array.isArray(inputFields)) {
110
+ for (const f of inputFields) {
111
+ checkBlock(f, INPUT_FIELD_FIELDS, `input_schema field of pipeline '${parsed.name}'`, context);
112
+ }
113
+ }
114
+ if (Array.isArray(parsed.on_pipeline_start)) {
115
+ for (const cmd of parsed.on_pipeline_start) {
116
+ checkBlock(cmd, STARTUP_COMMAND_FIELDS, `on_pipeline_start entry of pipeline '${parsed.name}'`, context);
117
+ }
118
+ }
34
119
  const stages = [];
35
120
  for (const entry of parsed.stages) {
36
- if (entry.group) {
121
+ if (entry.map !== undefined) {
122
+ // Fan-out / map stage
123
+ stages.push(parseMapStage(entry, context));
124
+ }
125
+ else if (entry.call !== undefined) {
126
+ // One-shot sub-pipeline call
127
+ stages.push(parseCallStage(entry, context));
128
+ }
129
+ else if (entry.group) {
37
130
  // Group entry
131
+ assertKnownFields(entry, GROUP_FIELDS, `group '${entry.group}'`, context);
38
132
  if (!Array.isArray(entry.stages) || entry.stages.length < 2) {
39
133
  throw new Error(`Group '${entry.group}' must have at least 2 stages${context}`);
40
134
  }
41
135
  for (const s of entry.stages) {
42
136
  validateStageFields(s, context);
137
+ checkStageFields(s, context);
43
138
  }
44
139
  const mode = entry.mode === 'parallel' ? 'parallel' : undefined;
45
140
  let maxIterations = entry.max_iterations ?? 3;
@@ -58,6 +153,7 @@ export function parsePipelineYaml(yamlContent, sourcePath) {
58
153
  else {
59
154
  // Simple stage
60
155
  validateStageFields(entry, context);
156
+ checkStageFields(entry, context);
61
157
  stages.push({ ...entry, hooks: parseStageHooks(entry) });
62
158
  }
63
159
  }
@@ -129,4 +225,61 @@ function validateStageFields(stage, context) {
129
225
  if (stage.executor === 'script' && !stage.script)
130
226
  throw new Error(`Stage '${stage.name}' missing 'script' (required when executor: 'script')${context}`);
131
227
  }
228
+ function parseMapStage(entry, context) {
229
+ const name = entry.map;
230
+ if (!name || typeof name !== 'string') {
231
+ throw new Error(`Map stage missing 'map' (the fan-out stage name)${context}`);
232
+ }
233
+ assertKnownFields(entry, MAP_FIELDS, `map stage '${name}'`, context);
234
+ if (!entry.over || typeof entry.over !== 'string') {
235
+ throw new Error(`Map stage '${name}' missing 'over' (context path to the list, e.g. stages.plan.output.items)${context}`);
236
+ }
237
+ if (!entry.pipeline || typeof entry.pipeline !== 'string') {
238
+ throw new Error(`Map stage '${name}' missing 'pipeline' (the sub-pipeline to run per item)${context}`);
239
+ }
240
+ if (entry.input !== undefined && (typeof entry.input !== 'object' || entry.input === null || Array.isArray(entry.input))) {
241
+ throw new Error(`Map stage '${name}' field 'input' must be an object of key → template${context}`);
242
+ }
243
+ if (entry.as !== undefined && typeof entry.as !== 'string') {
244
+ throw new Error(`Map stage '${name}' field 'as' must be a string${context}`);
245
+ }
246
+ if (entry.concurrency !== undefined) {
247
+ if (typeof entry.concurrency !== 'number' || !Number.isInteger(entry.concurrency) || entry.concurrency < 1) {
248
+ throw new Error(`Map stage '${name}' field 'concurrency' must be a positive integer${context}`);
249
+ }
250
+ }
251
+ const onItemFailure = entry.on_item_failure ?? 'fail-fast';
252
+ if (onItemFailure !== 'fail-fast' && onItemFailure !== 'collect-all') {
253
+ throw new Error(`Map stage '${name}' field 'on_item_failure' must be 'fail-fast' or 'collect-all'${context}`);
254
+ }
255
+ return {
256
+ map: name,
257
+ over: entry.over,
258
+ pipeline: entry.pipeline,
259
+ ...(entry.condition !== undefined ? { condition: entry.condition } : {}),
260
+ ...(entry.input !== undefined ? { input: entry.input } : {}),
261
+ ...(entry.as !== undefined ? { as: entry.as } : {}),
262
+ ...(entry.concurrency !== undefined ? { concurrency: entry.concurrency } : {}),
263
+ on_item_failure: onItemFailure,
264
+ };
265
+ }
266
+ function parseCallStage(entry, context) {
267
+ const name = entry.call;
268
+ if (!name || typeof name !== 'string') {
269
+ throw new Error(`Call stage missing 'call' (the stage name)${context}`);
270
+ }
271
+ assertKnownFields(entry, CALL_FIELDS, `call stage '${name}'`, context);
272
+ if (entry.pipeline !== undefined && typeof entry.pipeline !== 'string') {
273
+ throw new Error(`Call stage '${name}' field 'pipeline' must be a string${context}`);
274
+ }
275
+ if (entry.input !== undefined && (typeof entry.input !== 'object' || entry.input === null || Array.isArray(entry.input))) {
276
+ throw new Error(`Call stage '${name}' field 'input' must be an object of key → template${context}`);
277
+ }
278
+ return {
279
+ call: name,
280
+ ...(entry.pipeline !== undefined ? { pipeline: entry.pipeline } : {}),
281
+ ...(entry.condition !== undefined ? { condition: entry.condition } : {}),
282
+ ...(entry.input !== undefined ? { input: entry.input } : {}),
283
+ };
284
+ }
132
285
  //# sourceMappingURL=loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/pipeline/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/pipeline/loader.ts"],"names":[],"mappings":"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"}
@@ -117,4 +117,34 @@ stages:
117
117
  expect(stage.hooks).toBeUndefined();
118
118
  });
119
119
  });
120
+ describe('parsePipelineYaml — context.include directives (STU-593)', () => {
121
+ const withInclude = (include) => `
122
+ name: test-pipeline
123
+ description: test
124
+ version: 1
125
+ stages:
126
+ - name: analyze
127
+ kind: analysis
128
+ agent: analyst
129
+ context:
130
+ include:
131
+ - input
132
+ - ${include}
133
+ `;
134
+ it('accepts every directive getContextForStage implements', () => {
135
+ for (const directive of [
136
+ 'input', 'previous_stage_output', 'all_stage_outputs', 'stage_name',
137
+ 'group_feedback', 'previous_stage_tool_results', 'all_stage_tool_results',
138
+ 'repo_files', 'repo_structure', 'pipeline_start_context',
139
+ ]) {
140
+ expect(() => parsePipelineYaml(withInclude(directive))).not.toThrow();
141
+ }
142
+ });
143
+ it('throws on an unknown context.include directive instead of silently dropping it', () => {
144
+ expect(() => parsePipelineYaml(withInclude('entity-classification'))).toThrow(/Unknown context\.include 'entity-classification' in stage 'analyze'/);
145
+ });
146
+ it('suggests the closest directive on a typo', () => {
147
+ expect(() => parsePipelineYaml(withInclude('all_stage_output'))).toThrow(/Did you mean 'all_stage_outputs'\?/);
148
+ });
149
+ });
120
150
  //# sourceMappingURL=loader.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../src/pipeline/loader.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../src/pipeline/loader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,aAAa,GAAG;;;;CAIrB,CAAC;AAEF,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG;;;;;;;;;;EAUf,aAAa;CACd,CAAC;QACE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;YACvC,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,YAAY,EAAE;YAC1D,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,gBAAgB,EAAE;SACjE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG;;;;;EAKf,aAAa;CACd,CAAC;QACE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,aAAa,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,IAAI,GAAG;;;;;;;EAOf,aAAa;CACd,CAAC;QACE,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,IAAI,GAAG;;;;;;;EAOf,aAAa;CACd,CAAC;QACE,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuB3B,CAAC;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAoB,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC;YAC1C,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE;SAC7C,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC;YAC7C,EAAE,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE;SACtD,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC;YACxC,EAAE,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,EAAE;SAC9F,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC;YACzC,EAAE,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,oCAAoC,EAAE,UAAU,EAAE,MAAM,EAAE;SAC1G,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG;;;;;;;;CAQhB,CAAC;QACE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAoB,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACxE,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC;;;;;;;;;;;YAW/B,OAAO;CAClB,CAAC;IAEA,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,KAAK,MAAM,SAAS,IAAI;YACtB,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,YAAY;YACnE,gBAAgB,EAAE,6BAA6B,EAAE,wBAAwB;YACzE,YAAY,EAAE,gBAAgB,EAAE,wBAAwB;SACzD,EAAE,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,OAAO,CAC3E,qEAAqE,CACtE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CACtE,oCAAoC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { MapStage } from '@studio-foundation/contracts';
2
+ import type { PipelineInput } from './context-propagation.js';
3
+ /**
4
+ * A short, human-readable identity for one item of a fan-out list, for progress
5
+ * display. Prefers a meaningful field of an object item (title/name/id/…) over
6
+ * a bare index, so an operator watching a --live run sees *which* entity is in
7
+ * flight, not just "#37". Never throws — it is display-only and must tolerate
8
+ * any item shape (including the ones buildItemInput would reject).
9
+ */
10
+ export declare function mapItemLabel(item: unknown, index: number): string;
11
+ /** Build the sub-pipeline input for one item of a fan-out stage. */
12
+ export declare function buildItemInput(map: MapStage, item: unknown, index: number, pipelineInput: PipelineInput): Record<string, unknown>;
13
+ //# sourceMappingURL=map-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-input.d.ts","sourceRoot":"","sources":["../../src/pipeline/map-input.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AA4B9D;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAejE;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAC5B,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,aAAa,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuBzB"}
@@ -0,0 +1,80 @@
1
+ // Build the per-item input for a fan-out (map) stage.
2
+ //
3
+ // Each item of the `over:` list becomes one sub-pipeline run. The input for
4
+ // that run is derived from the map stage config:
5
+ // - `input:` template → interpolate {{item}}, {{item.<path>}}, {{index}},
6
+ // {{input}}, {{input.<path>}} in each value.
7
+ // - `as:` shorthand → { [as]: item }
8
+ // - neither → the item itself, if it is a plain object.
9
+ import { interpolateTemplate } from './template-interpolation.js';
10
+ /** Resolve a single {{...}} reference against the item/index/input scope. */
11
+ function resolveRef(ref, scope) {
12
+ if (ref === 'item')
13
+ return scope.item;
14
+ if (ref === 'index')
15
+ return scope.index;
16
+ if (ref === 'input')
17
+ return scope.input;
18
+ if (ref.startsWith('item.'))
19
+ return traverse(scope.item, ref.slice('item.'.length));
20
+ if (ref.startsWith('input.'))
21
+ return traverse(scope.input, ref.slice('input.'.length));
22
+ return undefined;
23
+ }
24
+ function traverse(obj, path) {
25
+ let current = obj;
26
+ for (const part of path.split('.')) {
27
+ if (current === null || current === undefined || typeof current !== 'object')
28
+ return undefined;
29
+ current = current[part];
30
+ }
31
+ return current;
32
+ }
33
+ /**
34
+ * A short, human-readable identity for one item of a fan-out list, for progress
35
+ * display. Prefers a meaningful field of an object item (title/name/id/…) over
36
+ * a bare index, so an operator watching a --live run sees *which* entity is in
37
+ * flight, not just "#37". Never throws — it is display-only and must tolerate
38
+ * any item shape (including the ones buildItemInput would reject).
39
+ */
40
+ export function mapItemLabel(item, index) {
41
+ if (typeof item === 'string')
42
+ return item.trim() || `#${index}`;
43
+ if (typeof item === 'number' || typeof item === 'boolean')
44
+ return String(item);
45
+ if (item !== null && typeof item === 'object' && !Array.isArray(item)) {
46
+ const obj = item;
47
+ for (const key of ['title', 'name', 'id', 'slug', 'label', 'key', 'entity']) {
48
+ const v = obj[key];
49
+ if (typeof v === 'string' && v.trim())
50
+ return v.trim();
51
+ if (typeof v === 'number')
52
+ return String(v);
53
+ }
54
+ for (const v of Object.values(obj)) {
55
+ if (typeof v === 'string' && v.trim())
56
+ return v.trim();
57
+ }
58
+ }
59
+ return `#${index}`;
60
+ }
61
+ /** Build the sub-pipeline input for one item of a fan-out stage. */
62
+ export function buildItemInput(map, item, index, pipelineInput) {
63
+ const scope = { item, index, input: pipelineInput };
64
+ if (map.input) {
65
+ const result = {};
66
+ for (const [key, template] of Object.entries(map.input)) {
67
+ result[key] = interpolateTemplate(template, (ref) => resolveRef(ref, scope));
68
+ }
69
+ return result;
70
+ }
71
+ if (map.as) {
72
+ return { [map.as]: item };
73
+ }
74
+ if (item !== null && typeof item === 'object' && !Array.isArray(item)) {
75
+ return item;
76
+ }
77
+ throw new Error(`Map stage '${map.map}': item at index ${index} is not an object, so it cannot be used as pipeline input directly. ` +
78
+ `Add 'as: <key>' (input becomes { <key>: item }) or an 'input:' template.`);
79
+ }
80
+ //# sourceMappingURL=map-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-input.js","sourceRoot":"","sources":["../../src/pipeline/map-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { MapStage, RunSpawner, StageRun, StageStatus } from '@studio-foundation/contracts';
2
+ import type { EngineEvents, PipelineEventEmitter } from '../events.js';
3
+ import type { PipelineContext } from './context-propagation.js';
4
+ export interface MapItemResult {
5
+ index: number;
6
+ status: 'success' | 'failed';
7
+ output?: unknown;
8
+ error?: string;
9
+ run_id?: string;
10
+ }
11
+ export interface MapStageOutput {
12
+ total: number;
13
+ succeeded: number;
14
+ failed: number;
15
+ results: MapItemResult[];
16
+ /** Successful item outputs in index order — the common "collect what worked" path. */
17
+ outputs: unknown[];
18
+ }
19
+ export interface MapRunResult {
20
+ status: StageStatus;
21
+ stageRun: StageRun;
22
+ output?: MapStageOutput;
23
+ }
24
+ export interface MapOrchestratorConfig {
25
+ events?: EngineEvents;
26
+ emitter: PipelineEventEmitter;
27
+ spawner?: RunSpawner;
28
+ maxDepth: number;
29
+ }
30
+ export declare class MapOrchestrator {
31
+ private config;
32
+ constructor(config: MapOrchestratorConfig);
33
+ run(map: MapStage, context: PipelineContext, stageIndex: number, totalStages: number, runId: string, depth: number, signal?: AbortSignal): Promise<MapRunResult>;
34
+ }
35
+ //# sourceMappingURL=map-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-orchestrator.d.ts","sourceRoot":"","sources":["../../src/pipeline/map-orchestrator.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAW,MAAM,8BAA8B,CAAC;AACzG,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,sFAAsF;IACtF,OAAO,EAAE,OAAO,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,qBAAa,eAAe;IACd,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,qBAAqB;IAE3C,GAAG,CACP,GAAG,EAAE,QAAQ,EACb,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC;CAyNzB"}
@@ -0,0 +1,223 @@
1
+ // MapOrchestrator — executes a fan-out (map) stage.
2
+ //
3
+ // A map stage runs a sub-pipeline once per item of a list and collects the
4
+ // structured outputs. It replaces the "shell `studio run <pipeline>` per item
5
+ // + parse stdout + scrape the run log" glue: child runs are spawned in-process
6
+ // through the engine's RunSpawner and each returns its last-stage output
7
+ // directly — no scraping, no tempfiles.
8
+ //
9
+ // Concurrency is bounded by `concurrency` (default 1 = sequential). The
10
+ // per-item failure policy is `on_item_failure`:
11
+ // - fail-fast (default): stop launching new items on the first failure; the
12
+ // stage fails. In-flight items are allowed to finish.
13
+ // - collect-all: run every item regardless; the stage succeeds as long as at
14
+ // least one item succeeded (or the list was empty). Per-item failures are
15
+ // surfaced in the output, never fatal — the pipeline keeps going.
16
+ import { randomUUID } from 'node:crypto';
17
+ import { resolveContextPath, evaluateCondition } from './condition-evaluator.js';
18
+ import { buildItemInput, mapItemLabel } from './map-input.js';
19
+ function errorMessage(err) {
20
+ return err instanceof Error ? err.message : String(err);
21
+ }
22
+ export class MapOrchestrator {
23
+ config;
24
+ constructor(config) {
25
+ this.config = config;
26
+ }
27
+ async run(map, context, stageIndex, totalStages, runId, depth, signal) {
28
+ const startedAt = new Date().toISOString();
29
+ const stageRun = {
30
+ id: randomUUID(),
31
+ stage_name: map.map,
32
+ status: 'running',
33
+ started_at: startedAt,
34
+ tasks: [],
35
+ };
36
+ const finish = (status, output, skippedReason) => {
37
+ stageRun.status = status;
38
+ stageRun.completed_at = new Date().toISOString();
39
+ if (output !== undefined)
40
+ stageRun.output = output;
41
+ if (skippedReason)
42
+ stageRun.skipped_reason = skippedReason;
43
+ this.config.events?.onStageComplete?.({
44
+ stage_name: map.map,
45
+ stage_index: stageIndex,
46
+ total_stages: totalStages,
47
+ status,
48
+ attempts: 1,
49
+ duration_ms: Date.now() - new Date(startedAt).getTime(),
50
+ ...(output ? { output } : {}),
51
+ ...(skippedReason ? { skipped_reason: skippedReason } : {}),
52
+ });
53
+ this.config.emitter.emit({ type: 'stage_complete', stageId: stageRun.id, stageName: map.map });
54
+ return { status, stageRun, output };
55
+ };
56
+ // Technical failure (bad `over`, missing spawner, depth limit) — record the
57
+ // reason on the stage as a failed task so it surfaces in `studio status`,
58
+ // the run JSONL, and the CLI's "Errors:" line, then fail the stage.
59
+ const failTechnical = (reason) => {
60
+ const now = new Date().toISOString();
61
+ const taskRun = {
62
+ id: randomUUID(),
63
+ task_name: map.map,
64
+ status: 'failed',
65
+ started_at: startedAt,
66
+ completed_at: now,
67
+ agent_runs: [{
68
+ id: randomUUID(),
69
+ agent_name: `map:${map.pipeline}`,
70
+ attempt: 1,
71
+ status: 'failed',
72
+ tool_calls: 0,
73
+ started_at: startedAt,
74
+ completed_at: now,
75
+ error: reason,
76
+ }],
77
+ };
78
+ stageRun.tasks = [taskRun];
79
+ return finish('failed');
80
+ };
81
+ this.config.events?.onStageStart?.({
82
+ stage_name: map.map,
83
+ stage_index: stageIndex,
84
+ total_stages: totalStages,
85
+ max_attempts: 1,
86
+ });
87
+ this.config.emitter.emit({ type: 'stage_start', stageId: stageRun.id, stageName: map.map });
88
+ // Condition — skip the whole fan-out if false
89
+ if (map.condition !== undefined) {
90
+ const shouldRun = evaluateCondition(map.condition, {
91
+ input: context.input,
92
+ stageOutputs: context.stageOutputs,
93
+ });
94
+ if (!shouldRun) {
95
+ return finish('skipped', undefined, `condition not met: ${map.condition}`);
96
+ }
97
+ }
98
+ if (signal?.aborted)
99
+ return finish('cancelled');
100
+ // A map stage spawns child runs — it needs a spawner.
101
+ if (!this.config.spawner) {
102
+ return failTechnical(`Map stage '${map.map}' requires a run spawner, but none is configured. ` +
103
+ `Fan-out stages spawn sub-pipeline runs; construct the engine with a 'spawner'.`);
104
+ }
105
+ const spawner = this.config.spawner;
106
+ // Resolve the list to iterate.
107
+ const resolved = resolveContextPath(map.over, {
108
+ input: context.input,
109
+ stageOutputs: context.stageOutputs,
110
+ });
111
+ if (!Array.isArray(resolved)) {
112
+ return failTechnical(`Map stage '${map.map}': 'over: ${map.over}' did not resolve to an array ` +
113
+ `(got ${resolved === undefined ? 'undefined' : typeof resolved}). ` +
114
+ `It must reference a list, e.g. stages.<name>.output.items or input.items.`);
115
+ }
116
+ const items = resolved;
117
+ const concurrency = Math.max(1, map.concurrency ?? 1);
118
+ const failFast = (map.on_item_failure ?? 'fail-fast') === 'fail-fast';
119
+ this.config.events?.onMapStart?.({ map_name: map.map, total_items: items.length, concurrency });
120
+ this.config.emitter.emit({ type: 'map_start', mapName: map.map, totalItems: items.length });
121
+ if (items.length === 0) {
122
+ const emptyOutput = { total: 0, succeeded: 0, failed: 0, results: [], outputs: [] };
123
+ this.config.events?.onMapComplete?.({ map_name: map.map, total: 0, succeeded: 0, failed: 0, status: 'success' });
124
+ this.config.emitter.emit({ type: 'map_complete', mapName: map.map, succeeded: 0, failed: 0, status: 'success' });
125
+ return finish('success', emptyOutput);
126
+ }
127
+ // Depth guard — mirror studio_run's recursion limit.
128
+ if (depth + 1 > this.config.maxDepth) {
129
+ return failTechnical(`Map stage '${map.map}' would spawn runs at depth ${depth + 1}, exceeding maxDepth ${this.config.maxDepth}. ` +
130
+ `Recursive fan-out is not allowed at this nesting level.`);
131
+ }
132
+ const results = new Array(items.length);
133
+ let cursor = 0;
134
+ let abortLaunch = false; // fail-fast: stop pulling new items after a failure
135
+ const worker = async () => {
136
+ for (;;) {
137
+ if (signal?.aborted || abortLaunch)
138
+ return;
139
+ const i = cursor++;
140
+ if (i >= items.length)
141
+ return;
142
+ // Name the item as it goes in flight, so a --live operator sees which
143
+ // items are running right now (not just an advancing count).
144
+ const label = mapItemLabel(items[i], i);
145
+ this.config.events?.onMapItemStart?.({
146
+ map_name: map.map,
147
+ index: i,
148
+ total_items: items.length,
149
+ label,
150
+ });
151
+ let itemResult;
152
+ try {
153
+ const input = buildItemInput(map, items[i], i, context.input);
154
+ const spawn = await spawner.spawnAndWait({
155
+ pipeline: map.pipeline,
156
+ input,
157
+ parentRunId: runId,
158
+ depth: depth + 1,
159
+ });
160
+ itemResult = { index: i, status: 'success', output: spawn.output, run_id: spawn.run_id };
161
+ }
162
+ catch (err) {
163
+ itemResult = { index: i, status: 'failed', error: errorMessage(err) };
164
+ if (failFast)
165
+ abortLaunch = true;
166
+ }
167
+ results[i] = itemResult;
168
+ this.config.events?.onMapItemComplete?.({
169
+ map_name: map.map,
170
+ index: i,
171
+ total_items: items.length,
172
+ status: itemResult.status,
173
+ label,
174
+ ...(itemResult.run_id ? { run_id: itemResult.run_id } : {}),
175
+ ...(itemResult.error ? { error: itemResult.error } : {}),
176
+ });
177
+ this.config.emitter.emit({ type: 'map_item_complete', mapName: map.map, index: i, status: itemResult.status });
178
+ }
179
+ };
180
+ await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));
181
+ // Cancelled mid-flight → cancelled (don't report success/failure of a partial batch).
182
+ if (signal?.aborted)
183
+ return finish('cancelled');
184
+ const settled = results.filter((r) => r !== undefined);
185
+ settled.sort((a, b) => a.index - b.index);
186
+ const succeeded = settled.filter(r => r.status === 'success');
187
+ const failed = settled.filter(r => r.status === 'failed');
188
+ const output = {
189
+ total: items.length,
190
+ succeeded: succeeded.length,
191
+ failed: failed.length,
192
+ results: settled,
193
+ outputs: succeeded.map(r => r.output),
194
+ };
195
+ // Status policy:
196
+ // fail-fast → any failure fails the stage.
197
+ // collect-all → succeeds as long as at least one item succeeded; a batch
198
+ // where every item failed is a real failure, not per-item noise.
199
+ let status;
200
+ if (failFast) {
201
+ status = failed.length > 0 ? 'failed' : 'success';
202
+ }
203
+ else {
204
+ status = succeeded.length > 0 ? 'success' : 'failed';
205
+ }
206
+ this.config.events?.onMapComplete?.({
207
+ map_name: map.map,
208
+ total: items.length,
209
+ succeeded: succeeded.length,
210
+ failed: failed.length,
211
+ status,
212
+ });
213
+ this.config.emitter.emit({
214
+ type: 'map_complete',
215
+ mapName: map.map,
216
+ succeeded: succeeded.length,
217
+ failed: failed.length,
218
+ status,
219
+ });
220
+ return finish(status, output);
221
+ }
222
+ }
223
+ //# sourceMappingURL=map-orchestrator.js.map