@studio-foundation/engine 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/engine.map-batch.test.d.ts +2 -0
- package/dist/__tests__/engine.map-batch.test.d.ts.map +1 -0
- package/dist/__tests__/engine.map-batch.test.js +216 -0
- package/dist/__tests__/engine.map-batch.test.js.map +1 -0
- package/dist/engine.d.ts +4 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +29 -1
- package/dist/engine.js.map +1 -1
- package/dist/events.d.ts +24 -6
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/pipeline/agent-loader.test.js +0 -36
- package/dist/pipeline/agent-loader.test.js.map +1 -1
- package/dist/pipeline/call-orchestrator.d.ts +3 -1
- package/dist/pipeline/call-orchestrator.d.ts.map +1 -1
- package/dist/pipeline/call-orchestrator.js +8 -3
- package/dist/pipeline/call-orchestrator.js.map +1 -1
- package/dist/pipeline/condition-evaluator.d.ts +11 -6
- package/dist/pipeline/condition-evaluator.d.ts.map +1 -1
- package/dist/pipeline/condition-evaluator.js +12 -0
- package/dist/pipeline/condition-evaluator.js.map +1 -1
- package/dist/pipeline/contract-coverage.d.ts +20 -0
- package/dist/pipeline/contract-coverage.d.ts.map +1 -0
- package/dist/pipeline/contract-coverage.js +43 -0
- package/dist/pipeline/contract-coverage.js.map +1 -0
- package/dist/pipeline/contract-coverage.test.d.ts +2 -0
- package/dist/pipeline/contract-coverage.test.d.ts.map +1 -0
- package/dist/pipeline/contract-coverage.test.js +72 -0
- package/dist/pipeline/contract-coverage.test.js.map +1 -0
- package/dist/pipeline/group-orchestrator.d.ts.map +1 -1
- package/dist/pipeline/group-orchestrator.js +21 -1
- package/dist/pipeline/group-orchestrator.js.map +1 -1
- package/dist/pipeline/loader.d.ts.map +1 -1
- package/dist/pipeline/loader.js +29 -1
- package/dist/pipeline/loader.js.map +1 -1
- package/dist/pipeline/loader.test.js +38 -0
- package/dist/pipeline/loader.test.js.map +1 -1
- package/dist/pipeline/map-orchestrator.d.ts +8 -1
- package/dist/pipeline/map-orchestrator.d.ts.map +1 -1
- package/dist/pipeline/map-orchestrator.js +89 -5
- package/dist/pipeline/map-orchestrator.js.map +1 -1
- package/dist/pipeline/stage-executor.d.ts.map +1 -1
- package/dist/pipeline/stage-executor.js +30 -19
- package/dist/pipeline/stage-executor.js.map +1 -1
- package/dist/pipeline/strict-fields.d.ts +1 -1
- package/dist/pipeline/strict-fields.js +1 -1
- package/dist/pipeline/types.d.ts +3 -1
- package/dist/pipeline/types.d.ts.map +1 -1
- package/dist/spawners/direct-engine-spawner.d.ts.map +1 -1
- package/dist/spawners/direct-engine-spawner.js +23 -2
- package/dist/spawners/direct-engine-spawner.js.map +1 -1
- package/package.json +4 -4
- package/dist/repo-resolver.d.ts +0 -10
- package/dist/repo-resolver.d.ts.map +0 -1
- package/dist/repo-resolver.js +0 -39
- package/dist/repo-resolver.js.map +0 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,2BAA2B,EAC3B,aAAa,EACb,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAClG,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACpF,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGhF,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGvG,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC7E,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG1E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -22,11 +22,14 @@ export { resolveEnvVars } from './pipeline/env-vars.js';
|
|
|
22
22
|
export { loadContract, parseContractYaml } from './pipeline/contract-loader.js';
|
|
23
23
|
// Context propagation
|
|
24
24
|
export { createInitialContext, addStageOutput, getContextForStage, setGroupFeedback, clearGroupFeedback, } from './pipeline/context-propagation.js';
|
|
25
|
+
// Contract coverage — stages running with nothing to validate against
|
|
26
|
+
export { findUnvalidatedStages, findUnvalidatedStagesInPipeline, formatUnvalidatedStages, } from './pipeline/contract-coverage.js';
|
|
25
27
|
// Contract validation
|
|
26
28
|
export { validateOutput } from './pipeline/output-validator.js';
|
|
27
29
|
export { validateSchema } from '@studio-foundation/ralph';
|
|
28
30
|
// Spawners
|
|
29
31
|
export { DirectEngineSpawner } from './spawners/direct-engine-spawner.js';
|
|
30
|
-
//
|
|
31
|
-
export {
|
|
32
|
+
// Condition evaluation and {{...}} interpolation, reused by webhook triggers
|
|
33
|
+
export { evaluateCondition, resolveContextPath } from './pipeline/condition-evaluator.js';
|
|
34
|
+
export { interpolateTemplate } from './pipeline/template-interpolation.js';
|
|
32
35
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,SAAS;AACT,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAyBnD,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,eAAe,GAChB,MAAM,8BAA8B,CAAC;AAGtC,mCAAmC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE,mBAAmB;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGzE,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEpF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEnE,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEhF,sBAAsB;AACtB,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAG3C,sBAAsB;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,WAAW;AACX,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,SAAS;AACT,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAyBnD,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,eAAe,GAChB,MAAM,8BAA8B,CAAC;AAGtC,mCAAmC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE,mBAAmB;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGzE,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEpF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEnE,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEhF,sBAAsB;AACtB,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAG3C,sEAAsE;AACtE,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,uBAAuB,GACxB,MAAM,iCAAiC,CAAC;AAGzC,sBAAsB;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,WAAW;AACX,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,6EAA6E;AAC7E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAE1F,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC"}
|
|
@@ -123,40 +123,4 @@ model: claude-haiku-4-5-20251001
|
|
|
123
123
|
expect(result.skills).toBeUndefined();
|
|
124
124
|
});
|
|
125
125
|
});
|
|
126
|
-
describe('project skill injection logic', () => {
|
|
127
|
-
it('appends skill content to system_prompt for declared skills', () => {
|
|
128
|
-
const agent = parseAgentYaml(`
|
|
129
|
-
name: coder
|
|
130
|
-
provider: anthropic
|
|
131
|
-
model: claude-sonnet-4-6
|
|
132
|
-
system_prompt: "You are a developer."
|
|
133
|
-
skills:
|
|
134
|
-
- git-workflow
|
|
135
|
-
`);
|
|
136
|
-
// Simulate what engine does: format loaded skills and append to system_prompt
|
|
137
|
-
const loadedSkills = [{ name: 'git-workflow', content: '# Git Workflow\n\nAlways branch from main.' }];
|
|
138
|
-
if (agent.skills?.length && loadedSkills.length > 0) {
|
|
139
|
-
const skillChunks = loadedSkills.map((s) => `## Skill: ${s.name}\n\n${s.content}`);
|
|
140
|
-
agent.system_prompt = `${agent.system_prompt ?? ''}\n\n${skillChunks.join('\n\n---\n\n')}`;
|
|
141
|
-
}
|
|
142
|
-
expect(agent.system_prompt).toContain('You are a developer.');
|
|
143
|
-
expect(agent.system_prompt).toContain('## Skill: git-workflow');
|
|
144
|
-
expect(agent.system_prompt).toContain('Always branch from main.');
|
|
145
|
-
});
|
|
146
|
-
it('does not modify system_prompt when no skills declared', () => {
|
|
147
|
-
const agent = parseAgentYaml(`
|
|
148
|
-
name: analyst
|
|
149
|
-
provider: anthropic
|
|
150
|
-
model: claude-sonnet-4-6
|
|
151
|
-
system_prompt: "You are an analyst."
|
|
152
|
-
`);
|
|
153
|
-
const originalPrompt = agent.system_prompt;
|
|
154
|
-
const loadedSkills = [];
|
|
155
|
-
if (agent.skills?.length && loadedSkills.length > 0) {
|
|
156
|
-
const skillChunks = loadedSkills.map((s) => `## Skill: ${s.name}\n\n${s.content}`);
|
|
157
|
-
agent.system_prompt = `${agent.system_prompt ?? ''}\n\n${skillChunks.join('\n\n---\n\n')}`;
|
|
158
|
-
}
|
|
159
|
-
expect(agent.system_prompt).toBe(originalPrompt);
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
126
|
//# sourceMappingURL=agent-loader.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loader.test.js","sourceRoot":"","sources":["../../src/pipeline/agent-loader.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-loader.test.js","sourceRoot":"","sources":["../../src/pipeline/agent-loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CallStage, RunSpawner, StageRun, StageStatus } from '@studio-foundation/contracts';
|
|
1
|
+
import type { CallStage, RunSpawner, StageRun, StageStatus, TokenUsage } from '@studio-foundation/contracts';
|
|
2
2
|
import type { EngineEvents, PipelineEventEmitter } from '../events.js';
|
|
3
3
|
import type { PipelineContext } from './context-propagation.js';
|
|
4
4
|
export interface CallRunResult {
|
|
@@ -6,6 +6,8 @@ export interface CallRunResult {
|
|
|
6
6
|
stageRun: StageRun;
|
|
7
7
|
/** The child pipeline's output — propagated to downstream stages under the stage name. */
|
|
8
8
|
output?: unknown;
|
|
9
|
+
/** What the child run spent. A `call` stage makes no LLM call of its own. */
|
|
10
|
+
tokenUsage?: TokenUsage;
|
|
9
11
|
}
|
|
10
12
|
export interface CallOrchestratorConfig {
|
|
11
13
|
events?: EngineEvents;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-orchestrator.d.ts","sourceRoot":"","sources":["../../src/pipeline/call-orchestrator.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAW,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"call-orchestrator.d.ts","sourceRoot":"","sources":["../../src/pipeline/call-orchestrator.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAW,UAAU,EAAE,MAAM,8BAA8B,CAAC;AACtH,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,qBAAa,gBAAgB;IACf,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,sBAAsB;IAE5C,GAAG,CACP,IAAI,EAAE,SAAS,EACf,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,aAAa,CAAC;CA4H1B"}
|
|
@@ -27,13 +27,15 @@ export class CallOrchestrator {
|
|
|
27
27
|
started_at: startedAt,
|
|
28
28
|
tasks: [],
|
|
29
29
|
};
|
|
30
|
-
const finish = (status, output, skippedReason) => {
|
|
30
|
+
const finish = (status, output, skippedReason, tokenUsage) => {
|
|
31
31
|
stageRun.status = status;
|
|
32
32
|
stageRun.completed_at = new Date().toISOString();
|
|
33
33
|
if (output !== undefined)
|
|
34
34
|
stageRun.output = output;
|
|
35
35
|
if (skippedReason)
|
|
36
36
|
stageRun.skipped_reason = skippedReason;
|
|
37
|
+
if (tokenUsage)
|
|
38
|
+
stageRun.token_usage = tokenUsage;
|
|
37
39
|
this.config.events?.onStageComplete?.({
|
|
38
40
|
stage_name: call.call,
|
|
39
41
|
stage_index: stageIndex,
|
|
@@ -42,10 +44,11 @@ export class CallOrchestrator {
|
|
|
42
44
|
attempts: 1,
|
|
43
45
|
duration_ms: Date.now() - new Date(startedAt).getTime(),
|
|
44
46
|
...(output !== undefined ? { output } : {}),
|
|
47
|
+
...(tokenUsage ? { token_usage: tokenUsage } : {}),
|
|
45
48
|
...(skippedReason ? { skipped_reason: skippedReason } : {}),
|
|
46
49
|
});
|
|
47
50
|
this.config.emitter.emit({ type: 'stage_complete', stageId: stageRun.id, stageName: call.call });
|
|
48
|
-
return { status, stageRun, output };
|
|
51
|
+
return { status, stageRun, output, tokenUsage };
|
|
49
52
|
};
|
|
50
53
|
// Technical/child failure — record the reason as a failed task so it surfaces
|
|
51
54
|
// in `studio status`, the run JSONL, and the CLI's "Errors:" line.
|
|
@@ -116,7 +119,9 @@ export class CallOrchestrator {
|
|
|
116
119
|
});
|
|
117
120
|
// Remember which child run this stage produced so readers can nest it.
|
|
118
121
|
stageRun.child_run_id = spawn.run_id;
|
|
119
|
-
|
|
122
|
+
// The child's cost, rolled up onto this stage. The child's own stages live
|
|
123
|
+
// in its run, not in this one, so a per-run total never counts them twice.
|
|
124
|
+
return finish('success', spawn.output, undefined, spawn.token_usage);
|
|
120
125
|
}
|
|
121
126
|
catch (err) {
|
|
122
127
|
// Cancelled mid-flight → cancelled, not a real failure.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-orchestrator.js","sourceRoot":"","sources":["../../src/pipeline/call-orchestrator.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAChF,6EAA6E;AAC7E,gEAAgE;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"call-orchestrator.js","sourceRoot":"","sources":["../../src/pipeline/call-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import type { PipelineInput } from './context-propagation.js';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* `roots` lets a caller outside the pipeline evaluate the same condition syntax
|
|
4
|
+
* over its own data — a webhook trigger reads `payload.<path>` this way — without
|
|
5
|
+
* either side reimplementing the comparison rules.
|
|
6
|
+
*/
|
|
7
|
+
export interface ConditionContext {
|
|
3
8
|
input: PipelineInput;
|
|
4
9
|
stageOutputs: Map<string, unknown>;
|
|
5
|
-
|
|
10
|
+
roots?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export declare function evaluateCondition(condition: string, context: ConditionContext): boolean;
|
|
6
13
|
/**
|
|
7
14
|
* Resolve a context reference to its value. Shared by the condition evaluator
|
|
8
15
|
* and the fan-out `over:`/`{{...}}` resolution so both read context identically.
|
|
9
16
|
* Supported forms:
|
|
10
17
|
* input.<field.path>
|
|
11
18
|
* stages.<stage-name>.output.<field.path>
|
|
19
|
+
* <root>.<field.path> for any root in `context.roots`
|
|
12
20
|
* Returns undefined for any unknown prefix or unreachable path.
|
|
13
21
|
*/
|
|
14
|
-
export declare function resolveContextPath(ref: string, context:
|
|
15
|
-
input: PipelineInput;
|
|
16
|
-
stageOutputs: Map<string, unknown>;
|
|
17
|
-
}): unknown;
|
|
22
|
+
export declare function resolveContextPath(ref: string, context: ConditionContext): unknown;
|
|
18
23
|
//# sourceMappingURL=condition-evaluator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"condition-evaluator.d.ts","sourceRoot":"","sources":["../../src/pipeline/condition-evaluator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"condition-evaluator.d.ts","sourceRoot":"","sources":["../../src/pipeline/condition-evaluator.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAMD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAyBT;AAMD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAsClF"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Supported syntax:
|
|
3
3
|
// input.<field.path> compared to a literal
|
|
4
4
|
// stages.<stage-name>.output.<field.path> compared to a literal
|
|
5
|
+
// <root>.<field.path> for any root passed in `roots`
|
|
5
6
|
// Operators: ===, !==, >=, <=, ==, !=, >, <
|
|
6
7
|
// Returns false for any undefined/invalid path (skip-safe).
|
|
7
8
|
// Longest-first to avoid '>' matching inside '>='
|
|
@@ -38,9 +39,20 @@ function resolveLhs(lhs, context) {
|
|
|
38
39
|
* Supported forms:
|
|
39
40
|
* input.<field.path>
|
|
40
41
|
* stages.<stage-name>.output.<field.path>
|
|
42
|
+
* <root>.<field.path> for any root in `context.roots`
|
|
41
43
|
* Returns undefined for any unknown prefix or unreachable path.
|
|
42
44
|
*/
|
|
43
45
|
export function resolveContextPath(ref, context) {
|
|
46
|
+
const dot = ref.indexOf('.');
|
|
47
|
+
const head = dot === -1 ? ref : ref.slice(0, dot);
|
|
48
|
+
if (context.roots && head in context.roots) {
|
|
49
|
+
const root = context.roots[head];
|
|
50
|
+
if (dot === -1)
|
|
51
|
+
return root;
|
|
52
|
+
if (root === null || typeof root !== 'object')
|
|
53
|
+
return undefined;
|
|
54
|
+
return traversePath(root, ref.slice(dot + 1));
|
|
55
|
+
}
|
|
44
56
|
if (ref === 'input')
|
|
45
57
|
return context.input;
|
|
46
58
|
if (ref.startsWith('input.')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"condition-evaluator.js","sourceRoot":"","sources":["../../src/pipeline/condition-evaluator.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,oBAAoB;AACpB,kEAAkE;AAClE,kEAAkE;AAClE,4CAA4C;AAC5C,4DAA4D;
|
|
1
|
+
{"version":3,"file":"condition-evaluator.js","sourceRoot":"","sources":["../../src/pipeline/condition-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PipelineDefinition, PipelineEntry } from '@studio-foundation/contracts';
|
|
2
|
+
/** A leaf stage that declares no `contract:`. */
|
|
3
|
+
export interface UnvalidatedStage {
|
|
4
|
+
stage: string;
|
|
5
|
+
/** Name of the enclosing group, when the stage lives inside one. */
|
|
6
|
+
group?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Every leaf stage without a `contract:`, in pipeline order.
|
|
10
|
+
*
|
|
11
|
+
* Only stages that *can* carry a contract are considered: `map` and `call`
|
|
12
|
+
* entries have no `contract` field at all — their validation is the
|
|
13
|
+
* sub-pipeline's own — so they are never reported.
|
|
14
|
+
*/
|
|
15
|
+
export declare function findUnvalidatedStages(entries: PipelineEntry[]): UnvalidatedStage[];
|
|
16
|
+
/** Same, for a whole pipeline definition. */
|
|
17
|
+
export declare function findUnvalidatedStagesInPipeline(pipeline: PipelineDefinition): UnvalidatedStage[];
|
|
18
|
+
/** One human-readable line per unvalidated stage, for a CLI to print. */
|
|
19
|
+
export declare function formatUnvalidatedStages(stages: UnvalidatedStage[]): string[];
|
|
20
|
+
//# sourceMappingURL=contract-coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-coverage.d.ts","sourceRoot":"","sources":["../../src/pipeline/contract-coverage.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGtF,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,CAalF;AAED,6CAA6C;AAC7C,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,gBAAgB,EAAE,CAEhG;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,EAAE,CAK5E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Contract coverage — which stages of a pipeline run with nothing to validate
|
|
2
|
+
// against.
|
|
3
|
+
//
|
|
4
|
+
// `contract:` is optional on a stage. When it is absent the RALPH loop keeps
|
|
5
|
+
// only its terminal-error check: no schema, no `tool_calls` floor, no rejection
|
|
6
|
+
// detection. That is legitimate (a scratch pipeline, a stage nothing downstream
|
|
7
|
+
// reads) but it is silent, and a `.studio/contracts/` directory next door makes
|
|
8
|
+
// it look like validation is in force when it is not (STU-703). Callers use
|
|
9
|
+
// this to say so out loud — a warning, never a failure.
|
|
10
|
+
import { isStageGroup, isMapStage, isCallStage } from '@studio-foundation/contracts';
|
|
11
|
+
/**
|
|
12
|
+
* Every leaf stage without a `contract:`, in pipeline order.
|
|
13
|
+
*
|
|
14
|
+
* Only stages that *can* carry a contract are considered: `map` and `call`
|
|
15
|
+
* entries have no `contract` field at all — their validation is the
|
|
16
|
+
* sub-pipeline's own — so they are never reported.
|
|
17
|
+
*/
|
|
18
|
+
export function findUnvalidatedStages(entries) {
|
|
19
|
+
const found = [];
|
|
20
|
+
for (const entry of entries) {
|
|
21
|
+
if (isMapStage(entry) || isCallStage(entry))
|
|
22
|
+
continue;
|
|
23
|
+
if (isStageGroup(entry)) {
|
|
24
|
+
for (const stage of entry.stages) {
|
|
25
|
+
if (!stage.contract)
|
|
26
|
+
found.push({ stage: stage.name, group: entry.group });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else if (!entry.contract) {
|
|
30
|
+
found.push({ stage: entry.name });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return found;
|
|
34
|
+
}
|
|
35
|
+
/** Same, for a whole pipeline definition. */
|
|
36
|
+
export function findUnvalidatedStagesInPipeline(pipeline) {
|
|
37
|
+
return findUnvalidatedStages(pipeline.stages);
|
|
38
|
+
}
|
|
39
|
+
/** One human-readable line per unvalidated stage, for a CLI to print. */
|
|
40
|
+
export function formatUnvalidatedStages(stages) {
|
|
41
|
+
return stages.map(({ stage, group }) => `stage '${stage}'${group ? ` (in group '${group}')` : ''} has no contract — output is not validated`);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=contract-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-coverage.js","sourceRoot":"","sources":["../../src/pipeline/contract-coverage.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,WAAW;AACX,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAChF,4EAA4E;AAC5E,wDAAwD;AAGxD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AASrF;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAwB;IAC5D,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC;YAAE,SAAS;QACtD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,CAAC,QAAQ;oBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,+BAA+B,CAAC,QAA4B;IAC1E,OAAO,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,uBAAuB,CAAC,MAA0B;IAChE,OAAO,MAAM,CAAC,GAAG,CACf,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CACnB,UAAU,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,4CAA4C,CACvG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-coverage.test.d.ts","sourceRoot":"","sources":["../../src/pipeline/contract-coverage.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { findUnvalidatedStages, formatUnvalidatedStages, } from './contract-coverage.js';
|
|
3
|
+
describe('findUnvalidatedStages', () => {
|
|
4
|
+
it('returns nothing when every stage declares a contract', () => {
|
|
5
|
+
const entries = [
|
|
6
|
+
{ name: 'plan', agent: 'planner', contract: 'plan' },
|
|
7
|
+
{ name: 'code', agent: 'coder', contract: 'code-generation' },
|
|
8
|
+
];
|
|
9
|
+
expect(findUnvalidatedStages(entries)).toEqual([]);
|
|
10
|
+
});
|
|
11
|
+
it('reports a simple stage with no contract', () => {
|
|
12
|
+
const entries = [
|
|
13
|
+
{ name: 'plan', agent: 'planner', contract: 'plan' },
|
|
14
|
+
{ name: 'code', agent: 'coder' },
|
|
15
|
+
];
|
|
16
|
+
expect(findUnvalidatedStages(entries)).toEqual([{ stage: 'code' }]);
|
|
17
|
+
});
|
|
18
|
+
it('reports stages inside a group, naming the group', () => {
|
|
19
|
+
const entries = [
|
|
20
|
+
{
|
|
21
|
+
group: 'implementation-review',
|
|
22
|
+
max_iterations: 3,
|
|
23
|
+
stages: [
|
|
24
|
+
{ name: 'code', agent: 'coder' },
|
|
25
|
+
{ name: 'qa', agent: 'analyst', contract: 'qa-review' },
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
expect(findUnvalidatedStages(entries)).toEqual([
|
|
30
|
+
{ stage: 'code', group: 'implementation-review' },
|
|
31
|
+
]);
|
|
32
|
+
});
|
|
33
|
+
it('reports a script stage with no contract', () => {
|
|
34
|
+
const entries = [
|
|
35
|
+
{ name: 'export', executor: 'script', script: 'export.py', runtime: 'python' },
|
|
36
|
+
];
|
|
37
|
+
expect(findUnvalidatedStages(entries)).toEqual([{ stage: 'export' }]);
|
|
38
|
+
});
|
|
39
|
+
it('ignores map and call entries — they carry no contract field', () => {
|
|
40
|
+
const entries = [
|
|
41
|
+
{ map: 'pages', over: 'stages.plan.output.items', pipeline: 'page-item', on_item_failure: 'fail-fast' },
|
|
42
|
+
{ call: 'publish', pipeline: 'publisher' },
|
|
43
|
+
];
|
|
44
|
+
expect(findUnvalidatedStages(entries)).toEqual([]);
|
|
45
|
+
});
|
|
46
|
+
it('keeps pipeline order across mixed entries', () => {
|
|
47
|
+
const entries = [
|
|
48
|
+
{ name: 'first', agent: 'a' },
|
|
49
|
+
{ map: 'fan', over: 'stages.first.output.items', pipeline: 'item', on_item_failure: 'fail-fast' },
|
|
50
|
+
{ group: 'g', max_iterations: 2, stages: [{ name: 'second', agent: 'b' }, { name: 'third', agent: 'c', contract: 'x' }] },
|
|
51
|
+
{ name: 'fourth', agent: 'd' },
|
|
52
|
+
];
|
|
53
|
+
expect(findUnvalidatedStages(entries)).toEqual([
|
|
54
|
+
{ stage: 'first' },
|
|
55
|
+
{ stage: 'second', group: 'g' },
|
|
56
|
+
{ stage: 'fourth' },
|
|
57
|
+
]);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('formatUnvalidatedStages', () => {
|
|
61
|
+
it('names the stage', () => {
|
|
62
|
+
expect(formatUnvalidatedStages([{ stage: 'code-generation' }])).toEqual([
|
|
63
|
+
"stage 'code-generation' has no contract — output is not validated",
|
|
64
|
+
]);
|
|
65
|
+
});
|
|
66
|
+
it('names the enclosing group when there is one', () => {
|
|
67
|
+
expect(formatUnvalidatedStages([{ stage: 'code', group: 'impl' }])).toEqual([
|
|
68
|
+
"stage 'code' (in group 'impl') has no contract — output is not validated",
|
|
69
|
+
]);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=contract-coverage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-coverage.test.js","sourceRoot":"","sources":["../../src/pipeline/contract-coverage.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-orchestrator.d.ts","sourceRoot":"","sources":["../../src/pipeline/group-orchestrator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"group-orchestrator.d.ts","sourceRoot":"","sources":["../../src/pipeline/group-orchestrator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAqC,MAAM,8BAA8B,CAAC;AAElG,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,uBAAuB;IAE7C,GAAG,CACP,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3C,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,aAAa,CAAC,EAAE,uBAAuB,GAAG,IAAI,EAC9C,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,WAAW,CAAC;YAOT,WAAW;YAwJX,aAAa;CA0S5B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// GroupOrchestrator — extracted from PipelineEngine.runGroup/runGroupParallel/runGroupSequential()
|
|
2
2
|
// Handles group-level orchestration: parallel and sequential iteration with feedback loops.
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { accumulateTokenUsage, emptyTokenUsage } from '@studio-foundation/contracts';
|
|
4
5
|
import { addStageOutput, addStageToolResults, setGroupFeedback, } from './context-propagation.js';
|
|
5
6
|
export class GroupOrchestrator {
|
|
6
7
|
config;
|
|
@@ -14,6 +15,8 @@ export class GroupOrchestrator {
|
|
|
14
15
|
return this.runSequential(group, context, stageOffset, totalStages, userInput, paths, toolRegistry, runMiddleware, runId, signal, skipSet, originalRunId);
|
|
15
16
|
}
|
|
16
17
|
async runParallel(group, context, stageOffset, totalStages, userInput, paths, toolRegistry, runMiddleware, runId, signal) {
|
|
18
|
+
const totalTokenUsage = emptyTokenUsage();
|
|
19
|
+
let anyUsageReported = false;
|
|
17
20
|
let totalTokensDelta = 0;
|
|
18
21
|
let totalToolCallsDelta = 0;
|
|
19
22
|
this.config.events?.onGroupStart?.({
|
|
@@ -41,7 +44,7 @@ export class GroupOrchestrator {
|
|
|
41
44
|
if (signal?.aborted) {
|
|
42
45
|
this.config.events?.onGroupComplete?.({ group_name: group.group, iterations: 1, status: 'cancelled' });
|
|
43
46
|
this.config.emitter.emit({ type: 'group_complete', groupName: group.group, iterations: 1, status: 'cancelled' });
|
|
44
|
-
return { status: 'cancelled', stageRuns: [], stagesExecuted: group.stages.length, context, totalTokensDelta, totalToolCallsDelta };
|
|
47
|
+
return { status: 'cancelled', stageRuns: [], stagesExecuted: group.stages.length, context, totalTokenUsage: anyUsageReported ? totalTokenUsage : undefined, totalTokensDelta, totalToolCallsDelta };
|
|
45
48
|
}
|
|
46
49
|
// All parallel stages read the same pre-group context snapshot.
|
|
47
50
|
// previousStageName = the last stage before this group.
|
|
@@ -82,6 +85,10 @@ export class GroupOrchestrator {
|
|
|
82
85
|
}
|
|
83
86
|
// After building resultMap, accumulate token/tool call totals
|
|
84
87
|
for (const [, result] of resultMap) {
|
|
88
|
+
if (result.tokenUsage) {
|
|
89
|
+
accumulateTokenUsage(totalTokenUsage, result.tokenUsage);
|
|
90
|
+
anyUsageReported = true;
|
|
91
|
+
}
|
|
85
92
|
totalTokensDelta += result.tokensDelta ?? 0;
|
|
86
93
|
totalToolCallsDelta += result.toolCallsDelta ?? 0;
|
|
87
94
|
}
|
|
@@ -123,6 +130,7 @@ export class GroupOrchestrator {
|
|
|
123
130
|
stageRuns: allStageRuns,
|
|
124
131
|
stagesExecuted: group.stages.length,
|
|
125
132
|
context,
|
|
133
|
+
totalTokenUsage: anyUsageReported ? totalTokenUsage : undefined,
|
|
126
134
|
totalTokensDelta,
|
|
127
135
|
totalToolCallsDelta,
|
|
128
136
|
};
|
|
@@ -130,6 +138,8 @@ export class GroupOrchestrator {
|
|
|
130
138
|
async runSequential(group, context, stageOffset, totalStages, userInput, paths, toolRegistry, runMiddleware, runId, signal, skipSet, originalRunId) {
|
|
131
139
|
const allStageRuns = [];
|
|
132
140
|
let iteration = 0;
|
|
141
|
+
const totalTokenUsage = emptyTokenUsage();
|
|
142
|
+
let anyUsageReported = false;
|
|
133
143
|
let totalTokensDelta = 0;
|
|
134
144
|
let totalToolCallsDelta = 0;
|
|
135
145
|
this.config.events?.onGroupStart?.({
|
|
@@ -160,6 +170,7 @@ export class GroupOrchestrator {
|
|
|
160
170
|
stageRuns: allStageRuns,
|
|
161
171
|
stagesExecuted: group.stages.length,
|
|
162
172
|
context,
|
|
173
|
+
totalTokenUsage: anyUsageReported ? totalTokenUsage : undefined,
|
|
163
174
|
totalTokensDelta,
|
|
164
175
|
totalToolCallsDelta,
|
|
165
176
|
};
|
|
@@ -217,6 +228,10 @@ export class GroupOrchestrator {
|
|
|
217
228
|
}
|
|
218
229
|
const result = await this.config.stageExecutor.execute(stage, context, previousStageName, userInput, stageNumber, totalStages, paths, toolRegistry, runMiddleware, runId, signal);
|
|
219
230
|
allStageRuns.push(result.stageRun);
|
|
231
|
+
if (result.tokenUsage) {
|
|
232
|
+
accumulateTokenUsage(totalTokenUsage, result.tokenUsage);
|
|
233
|
+
anyUsageReported = true;
|
|
234
|
+
}
|
|
220
235
|
totalTokensDelta += result.tokensDelta ?? 0;
|
|
221
236
|
totalToolCallsDelta += result.toolCallsDelta ?? 0;
|
|
222
237
|
if (result.status !== 'skipped')
|
|
@@ -239,6 +254,7 @@ export class GroupOrchestrator {
|
|
|
239
254
|
stageRuns: allStageRuns,
|
|
240
255
|
stagesExecuted: group.stages.length,
|
|
241
256
|
context,
|
|
257
|
+
totalTokenUsage: anyUsageReported ? totalTokenUsage : undefined,
|
|
242
258
|
totalTokensDelta,
|
|
243
259
|
totalToolCallsDelta,
|
|
244
260
|
};
|
|
@@ -261,6 +277,7 @@ export class GroupOrchestrator {
|
|
|
261
277
|
stageRuns: allStageRuns,
|
|
262
278
|
stagesExecuted: group.stages.length,
|
|
263
279
|
context,
|
|
280
|
+
totalTokenUsage: anyUsageReported ? totalTokenUsage : undefined,
|
|
264
281
|
totalTokensDelta,
|
|
265
282
|
totalToolCallsDelta,
|
|
266
283
|
};
|
|
@@ -323,6 +340,7 @@ export class GroupOrchestrator {
|
|
|
323
340
|
stageRuns: allStageRuns,
|
|
324
341
|
stagesExecuted: group.stages.length,
|
|
325
342
|
context,
|
|
343
|
+
totalTokenUsage: anyUsageReported ? totalTokenUsage : undefined,
|
|
326
344
|
totalTokensDelta,
|
|
327
345
|
totalToolCallsDelta,
|
|
328
346
|
};
|
|
@@ -346,6 +364,7 @@ export class GroupOrchestrator {
|
|
|
346
364
|
stageRuns: allStageRuns,
|
|
347
365
|
stagesExecuted: group.stages.length,
|
|
348
366
|
context,
|
|
367
|
+
totalTokenUsage: anyUsageReported ? totalTokenUsage : undefined,
|
|
349
368
|
totalTokensDelta,
|
|
350
369
|
totalToolCallsDelta,
|
|
351
370
|
};
|
|
@@ -368,6 +387,7 @@ export class GroupOrchestrator {
|
|
|
368
387
|
stageRuns: allStageRuns,
|
|
369
388
|
stagesExecuted: group.stages.length,
|
|
370
389
|
context,
|
|
390
|
+
totalTokenUsage: anyUsageReported ? totalTokenUsage : undefined,
|
|
371
391
|
totalTokensDelta,
|
|
372
392
|
totalToolCallsDelta,
|
|
373
393
|
};
|