@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.
- package/README.md +1 -1
- package/dist/__tests__/engine.script-stage.test.js +13 -32
- package/dist/__tests__/engine.script-stage.test.js.map +1 -1
- package/dist/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +134 -1
- package/dist/engine.js.map +1 -1
- package/dist/events.d.ts +48 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/call-input.d.ts +4 -0
- package/dist/pipeline/call-input.d.ts.map +1 -0
- package/dist/pipeline/call-input.js +28 -0
- package/dist/pipeline/call-input.js.map +1 -0
- package/dist/pipeline/call-orchestrator.d.ts +21 -0
- package/dist/pipeline/call-orchestrator.d.ts.map +1 -0
- package/dist/pipeline/call-orchestrator.js +127 -0
- package/dist/pipeline/call-orchestrator.js.map +1 -0
- package/dist/pipeline/condition-evaluator.d.ts +12 -0
- package/dist/pipeline/condition-evaluator.d.ts.map +1 -1
- package/dist/pipeline/condition-evaluator.js +27 -9
- package/dist/pipeline/condition-evaluator.js.map +1 -1
- package/dist/pipeline/context-propagation.d.ts +1 -0
- package/dist/pipeline/context-propagation.d.ts.map +1 -1
- package/dist/pipeline/context-propagation.js +18 -0
- package/dist/pipeline/context-propagation.js.map +1 -1
- package/dist/pipeline/contract-loader.d.ts.map +1 -1
- package/dist/pipeline/contract-loader.js +67 -0
- package/dist/pipeline/contract-loader.js.map +1 -1
- package/dist/pipeline/external-validator.d.ts +3 -0
- package/dist/pipeline/external-validator.d.ts.map +1 -0
- package/dist/pipeline/external-validator.js +65 -0
- package/dist/pipeline/external-validator.js.map +1 -0
- package/dist/pipeline/external-validator.test.d.ts +2 -0
- package/dist/pipeline/external-validator.test.d.ts.map +1 -0
- package/dist/pipeline/external-validator.test.js +40 -0
- package/dist/pipeline/external-validator.test.js.map +1 -0
- package/dist/pipeline/loader.d.ts.map +1 -1
- package/dist/pipeline/loader.js +154 -1
- package/dist/pipeline/loader.js.map +1 -1
- package/dist/pipeline/loader.test.js +30 -0
- package/dist/pipeline/loader.test.js.map +1 -1
- package/dist/pipeline/map-input.d.ts +13 -0
- package/dist/pipeline/map-input.d.ts.map +1 -0
- package/dist/pipeline/map-input.js +80 -0
- package/dist/pipeline/map-input.js.map +1 -0
- package/dist/pipeline/map-orchestrator.d.ts +35 -0
- package/dist/pipeline/map-orchestrator.d.ts.map +1 -0
- package/dist/pipeline/map-orchestrator.js +223 -0
- package/dist/pipeline/map-orchestrator.js.map +1 -0
- package/dist/pipeline/output-checker.d.ts +3 -0
- package/dist/pipeline/output-checker.d.ts.map +1 -0
- package/dist/pipeline/output-checker.js +40 -0
- package/dist/pipeline/output-checker.js.map +1 -0
- package/dist/pipeline/output-checker.test.d.ts +2 -0
- package/dist/pipeline/output-checker.test.d.ts.map +1 -0
- package/dist/pipeline/output-checker.test.js +62 -0
- package/dist/pipeline/output-checker.test.js.map +1 -0
- package/dist/pipeline/stage-executor.d.ts.map +1 -1
- package/dist/pipeline/stage-executor.js +48 -9
- package/dist/pipeline/stage-executor.js.map +1 -1
- package/dist/pipeline/stage-resolver.js +1 -1
- package/dist/pipeline/stage-resolver.js.map +1 -1
- package/dist/pipeline/strict-fields.d.ts +20 -0
- package/dist/pipeline/strict-fields.d.ts.map +1 -0
- package/dist/pipeline/strict-fields.js +62 -0
- package/dist/pipeline/strict-fields.js.map +1 -0
- package/dist/pipeline/task-input.d.ts +14 -0
- package/dist/pipeline/task-input.d.ts.map +1 -0
- package/dist/pipeline/task-input.js +22 -0
- package/dist/pipeline/task-input.js.map +1 -0
- package/dist/pipeline/task-input.test.d.ts +2 -0
- package/dist/pipeline/task-input.test.d.ts.map +1 -0
- package/dist/pipeline/task-input.test.js +33 -0
- package/dist/pipeline/task-input.test.js.map +1 -0
- package/dist/pipeline/template-interpolation.d.ts +9 -0
- package/dist/pipeline/template-interpolation.d.ts.map +1 -0
- package/dist/pipeline/template-interpolation.js +33 -0
- package/dist/pipeline/template-interpolation.js.map +1 -0
- package/dist/state/status-derivation.js +3 -3
- package/dist/state/status-derivation.js.map +1 -1
- package/package.json +5 -5
package/dist/pipeline/loader.js
CHANGED
|
@@ -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.
|
|
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
|