@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.
Files changed (60) hide show
  1. package/dist/__tests__/engine.map-batch.test.d.ts +2 -0
  2. package/dist/__tests__/engine.map-batch.test.d.ts.map +1 -0
  3. package/dist/__tests__/engine.map-batch.test.js +216 -0
  4. package/dist/__tests__/engine.map-batch.test.js.map +1 -0
  5. package/dist/engine.d.ts +4 -0
  6. package/dist/engine.d.ts.map +1 -1
  7. package/dist/engine.js +29 -1
  8. package/dist/engine.js.map +1 -1
  9. package/dist/events.d.ts +24 -6
  10. package/dist/events.d.ts.map +1 -1
  11. package/dist/events.js.map +1 -1
  12. package/dist/index.d.ts +5 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +5 -2
  15. package/dist/index.js.map +1 -1
  16. package/dist/pipeline/agent-loader.test.js +0 -36
  17. package/dist/pipeline/agent-loader.test.js.map +1 -1
  18. package/dist/pipeline/call-orchestrator.d.ts +3 -1
  19. package/dist/pipeline/call-orchestrator.d.ts.map +1 -1
  20. package/dist/pipeline/call-orchestrator.js +8 -3
  21. package/dist/pipeline/call-orchestrator.js.map +1 -1
  22. package/dist/pipeline/condition-evaluator.d.ts +11 -6
  23. package/dist/pipeline/condition-evaluator.d.ts.map +1 -1
  24. package/dist/pipeline/condition-evaluator.js +12 -0
  25. package/dist/pipeline/condition-evaluator.js.map +1 -1
  26. package/dist/pipeline/contract-coverage.d.ts +20 -0
  27. package/dist/pipeline/contract-coverage.d.ts.map +1 -0
  28. package/dist/pipeline/contract-coverage.js +43 -0
  29. package/dist/pipeline/contract-coverage.js.map +1 -0
  30. package/dist/pipeline/contract-coverage.test.d.ts +2 -0
  31. package/dist/pipeline/contract-coverage.test.d.ts.map +1 -0
  32. package/dist/pipeline/contract-coverage.test.js +72 -0
  33. package/dist/pipeline/contract-coverage.test.js.map +1 -0
  34. package/dist/pipeline/group-orchestrator.d.ts.map +1 -1
  35. package/dist/pipeline/group-orchestrator.js +21 -1
  36. package/dist/pipeline/group-orchestrator.js.map +1 -1
  37. package/dist/pipeline/loader.d.ts.map +1 -1
  38. package/dist/pipeline/loader.js +29 -1
  39. package/dist/pipeline/loader.js.map +1 -1
  40. package/dist/pipeline/loader.test.js +38 -0
  41. package/dist/pipeline/loader.test.js.map +1 -1
  42. package/dist/pipeline/map-orchestrator.d.ts +8 -1
  43. package/dist/pipeline/map-orchestrator.d.ts.map +1 -1
  44. package/dist/pipeline/map-orchestrator.js +89 -5
  45. package/dist/pipeline/map-orchestrator.js.map +1 -1
  46. package/dist/pipeline/stage-executor.d.ts.map +1 -1
  47. package/dist/pipeline/stage-executor.js +30 -19
  48. package/dist/pipeline/stage-executor.js.map +1 -1
  49. package/dist/pipeline/strict-fields.d.ts +1 -1
  50. package/dist/pipeline/strict-fields.js +1 -1
  51. package/dist/pipeline/types.d.ts +3 -1
  52. package/dist/pipeline/types.d.ts.map +1 -1
  53. package/dist/spawners/direct-engine-spawner.d.ts.map +1 -1
  54. package/dist/spawners/direct-engine-spawner.js +23 -2
  55. package/dist/spawners/direct-engine-spawner.js.map +1 -1
  56. package/package.json +4 -4
  57. package/dist/repo-resolver.d.ts +0 -10
  58. package/dist/repo-resolver.d.ts.map +0 -1
  59. package/dist/repo-resolver.js +0 -39
  60. package/dist/repo-resolver.js.map +0 -1
@@ -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,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
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
- // Repo resolution
31
- export { resolveRepoPath, cloneRepo } from './repo-resolver.js';
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,kBAAkB;AAClB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
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;AAC1G,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;CAClB;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;CAmH1B"}
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
- return finish('success', spawn.output);
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":"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"}
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
- export declare function evaluateCondition(condition: string, context: {
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
- }): boolean;
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":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAM9D,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACpE,OAAO,CAyBT;AASD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACpE,OAAO,CA6BT"}
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":"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"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contract-coverage.test.d.ts.map
@@ -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,EAAyB,MAAM,8BAA8B,CAAC;AACtF,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;YAoJX,aAAa;CAiS5B"}
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
  };