agentfootprint 2.14.4 → 3.0.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 (224) hide show
  1. package/dist/cache/CacheDecisionSubflow.js +3 -1
  2. package/dist/cache/CacheDecisionSubflow.js.map +1 -1
  3. package/dist/conventions.js +3 -2
  4. package/dist/conventions.js.map +1 -1
  5. package/dist/core/Agent.js +69 -23
  6. package/dist/core/Agent.js.map +1 -1
  7. package/dist/core/LLMCall.js +44 -5
  8. package/dist/core/LLMCall.js.map +1 -1
  9. package/dist/core/RunnerBase.js +173 -0
  10. package/dist/core/RunnerBase.js.map +1 -1
  11. package/dist/core/agent/buildAgentChart.js +12 -2
  12. package/dist/core/agent/buildAgentChart.js.map +1 -1
  13. package/dist/core/runner.js +4 -3
  14. package/dist/core/runner.js.map +1 -1
  15. package/dist/core/slots/buildMessagesSlot.js +1 -1
  16. package/dist/core/slots/buildMessagesSlot.js.map +1 -1
  17. package/dist/core/slots/buildSystemPromptSlot.js +1 -1
  18. package/dist/core/slots/buildSystemPromptSlot.js.map +1 -1
  19. package/dist/core/slots/buildThinkingSubflow.js +1 -1
  20. package/dist/core/slots/buildThinkingSubflow.js.map +1 -1
  21. package/dist/core/slots/buildToolsSlot.js +3 -1
  22. package/dist/core/slots/buildToolsSlot.js.map +1 -1
  23. package/dist/core/translator.js +32 -0
  24. package/dist/core/translator.js.map +1 -0
  25. package/dist/core-flow/Conditional.js +73 -10
  26. package/dist/core-flow/Conditional.js.map +1 -1
  27. package/dist/core-flow/Loop.js +60 -16
  28. package/dist/core-flow/Loop.js.map +1 -1
  29. package/dist/core-flow/Parallel.js +241 -92
  30. package/dist/core-flow/Parallel.js.map +1 -1
  31. package/dist/core-flow/Sequence.js +51 -8
  32. package/dist/core-flow/Sequence.js.map +1 -1
  33. package/dist/esm/cache/CacheDecisionSubflow.js +3 -1
  34. package/dist/esm/cache/CacheDecisionSubflow.js.map +1 -1
  35. package/dist/esm/conventions.js +3 -2
  36. package/dist/esm/conventions.js.map +1 -1
  37. package/dist/esm/core/Agent.js +69 -23
  38. package/dist/esm/core/Agent.js.map +1 -1
  39. package/dist/esm/core/LLMCall.js +44 -5
  40. package/dist/esm/core/LLMCall.js.map +1 -1
  41. package/dist/esm/core/RunnerBase.js +173 -0
  42. package/dist/esm/core/RunnerBase.js.map +1 -1
  43. package/dist/esm/core/agent/buildAgentChart.js +12 -2
  44. package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
  45. package/dist/esm/core/runner.js +4 -3
  46. package/dist/esm/core/runner.js.map +1 -1
  47. package/dist/esm/core/slots/buildMessagesSlot.js +1 -1
  48. package/dist/esm/core/slots/buildMessagesSlot.js.map +1 -1
  49. package/dist/esm/core/slots/buildSystemPromptSlot.js +1 -1
  50. package/dist/esm/core/slots/buildSystemPromptSlot.js.map +1 -1
  51. package/dist/esm/core/slots/buildThinkingSubflow.js +1 -1
  52. package/dist/esm/core/slots/buildThinkingSubflow.js.map +1 -1
  53. package/dist/esm/core/slots/buildToolsSlot.js +3 -1
  54. package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
  55. package/dist/esm/core/translator.js +31 -0
  56. package/dist/esm/core/translator.js.map +1 -0
  57. package/dist/esm/core-flow/Conditional.js +73 -10
  58. package/dist/esm/core-flow/Conditional.js.map +1 -1
  59. package/dist/esm/core-flow/Loop.js +60 -16
  60. package/dist/esm/core-flow/Loop.js.map +1 -1
  61. package/dist/esm/core-flow/Parallel.js +242 -93
  62. package/dist/esm/core-flow/Parallel.js.map +1 -1
  63. package/dist/esm/core-flow/Sequence.js +51 -8
  64. package/dist/esm/core-flow/Sequence.js.map +1 -1
  65. package/dist/esm/index.js +1 -0
  66. package/dist/esm/index.js.map +1 -1
  67. package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js +1 -1
  68. package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
  69. package/dist/esm/memory/causal/snapshotPipeline.js +6 -2
  70. package/dist/esm/memory/causal/snapshotPipeline.js.map +1 -1
  71. package/dist/esm/memory/pipeline/auto.js +2 -2
  72. package/dist/esm/memory/pipeline/auto.js.map +1 -1
  73. package/dist/esm/memory/pipeline/default.js +4 -2
  74. package/dist/esm/memory/pipeline/default.js.map +1 -1
  75. package/dist/esm/memory/pipeline/ephemeral.js +3 -1
  76. package/dist/esm/memory/pipeline/ephemeral.js.map +1 -1
  77. package/dist/esm/memory/pipeline/fact.js +4 -2
  78. package/dist/esm/memory/pipeline/fact.js.map +1 -1
  79. package/dist/esm/memory/pipeline/narrative.js +4 -2
  80. package/dist/esm/memory/pipeline/narrative.js.map +1 -1
  81. package/dist/esm/memory/pipeline/semantic.js +2 -2
  82. package/dist/esm/memory/pipeline/semantic.js.map +1 -1
  83. package/dist/esm/observe.js +1 -1
  84. package/dist/esm/observe.js.map +1 -1
  85. package/dist/esm/patterns/MapReduce.js +5 -5
  86. package/dist/esm/patterns/MapReduce.js.map +1 -1
  87. package/dist/esm/patterns/Swarm.js +1 -1
  88. package/dist/esm/patterns/Swarm.js.map +1 -1
  89. package/dist/esm/recorders/observability/BoundaryRecorder.js +315 -36
  90. package/dist/esm/recorders/observability/BoundaryRecorder.js.map +1 -1
  91. package/dist/esm/recorders/observability/FlowchartRecorder.js +10 -0
  92. package/dist/esm/recorders/observability/FlowchartRecorder.js.map +1 -1
  93. package/dist/esm/recorders/observability/LiveStateRecorder.js +112 -21
  94. package/dist/esm/recorders/observability/LiveStateRecorder.js.map +1 -1
  95. package/dist/esm/recorders/observability/RunStepRecorder.js +652 -0
  96. package/dist/esm/recorders/observability/RunStepRecorder.js.map +1 -0
  97. package/dist/esm/recorders/observability/commentary/commentaryTemplates.js +3 -4
  98. package/dist/esm/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
  99. package/dist/esm/recorders/observability/internal/ActorArrowClassifier.js +34 -0
  100. package/dist/esm/recorders/observability/internal/ActorArrowClassifier.js.map +1 -0
  101. package/dist/esm/recorders/observability/internal/CandidateAnswerBuffer.js +32 -0
  102. package/dist/esm/recorders/observability/internal/CandidateAnswerBuffer.js.map +1 -0
  103. package/dist/esm/recorders/observability/internal/ForkTracker.js +84 -0
  104. package/dist/esm/recorders/observability/internal/ForkTracker.js.map +1 -0
  105. package/dist/esm/recorders/observability/internal/RootInferrer.js +114 -0
  106. package/dist/esm/recorders/observability/internal/RootInferrer.js.map +1 -0
  107. package/dist/esm/recorders/observability/internal/SequenceSiblingTracker.js +31 -0
  108. package/dist/esm/recorders/observability/internal/SequenceSiblingTracker.js.map +1 -0
  109. package/dist/esm/recorders/observability/observeRunId.js +21 -0
  110. package/dist/esm/recorders/observability/observeRunId.js.map +1 -0
  111. package/dist/esm/reliability/buildReliabilityGateChart.js +1 -1
  112. package/dist/esm/reliability/buildReliabilityGateChart.js.map +1 -1
  113. package/dist/index.js +7 -3
  114. package/dist/index.js.map +1 -1
  115. package/dist/lib/injection-engine/buildInjectionEngineSubflow.js +1 -1
  116. package/dist/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
  117. package/dist/memory/causal/snapshotPipeline.js +6 -2
  118. package/dist/memory/causal/snapshotPipeline.js.map +1 -1
  119. package/dist/memory/pipeline/auto.js +2 -2
  120. package/dist/memory/pipeline/auto.js.map +1 -1
  121. package/dist/memory/pipeline/default.js +4 -2
  122. package/dist/memory/pipeline/default.js.map +1 -1
  123. package/dist/memory/pipeline/ephemeral.js +3 -1
  124. package/dist/memory/pipeline/ephemeral.js.map +1 -1
  125. package/dist/memory/pipeline/fact.js +4 -2
  126. package/dist/memory/pipeline/fact.js.map +1 -1
  127. package/dist/memory/pipeline/narrative.js +4 -2
  128. package/dist/memory/pipeline/narrative.js.map +1 -1
  129. package/dist/memory/pipeline/semantic.js +2 -2
  130. package/dist/memory/pipeline/semantic.js.map +1 -1
  131. package/dist/observe.js +1 -1
  132. package/dist/observe.js.map +1 -1
  133. package/dist/patterns/MapReduce.js +5 -5
  134. package/dist/patterns/MapReduce.js.map +1 -1
  135. package/dist/patterns/Swarm.js +1 -1
  136. package/dist/patterns/Swarm.js.map +1 -1
  137. package/dist/recorders/observability/BoundaryRecorder.js +314 -35
  138. package/dist/recorders/observability/BoundaryRecorder.js.map +1 -1
  139. package/dist/recorders/observability/FlowchartRecorder.js +10 -0
  140. package/dist/recorders/observability/FlowchartRecorder.js.map +1 -1
  141. package/dist/recorders/observability/LiveStateRecorder.js +111 -20
  142. package/dist/recorders/observability/LiveStateRecorder.js.map +1 -1
  143. package/dist/recorders/observability/RunStepRecorder.js +658 -0
  144. package/dist/recorders/observability/RunStepRecorder.js.map +1 -0
  145. package/dist/recorders/observability/commentary/commentaryTemplates.js +3 -4
  146. package/dist/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
  147. package/dist/recorders/observability/internal/ActorArrowClassifier.js +38 -0
  148. package/dist/recorders/observability/internal/ActorArrowClassifier.js.map +1 -0
  149. package/dist/recorders/observability/internal/CandidateAnswerBuffer.js +36 -0
  150. package/dist/recorders/observability/internal/CandidateAnswerBuffer.js.map +1 -0
  151. package/dist/recorders/observability/internal/ForkTracker.js +88 -0
  152. package/dist/recorders/observability/internal/ForkTracker.js.map +1 -0
  153. package/dist/recorders/observability/internal/RootInferrer.js +118 -0
  154. package/dist/recorders/observability/internal/RootInferrer.js.map +1 -0
  155. package/dist/recorders/observability/internal/SequenceSiblingTracker.js +35 -0
  156. package/dist/recorders/observability/internal/SequenceSiblingTracker.js.map +1 -0
  157. package/dist/recorders/observability/observeRunId.js +25 -0
  158. package/dist/recorders/observability/observeRunId.js.map +1 -0
  159. package/dist/reliability/buildReliabilityGateChart.js +1 -1
  160. package/dist/reliability/buildReliabilityGateChart.js.map +1 -1
  161. package/dist/types/cache/CacheDecisionSubflow.d.ts.map +1 -1
  162. package/dist/types/conventions.d.ts.map +1 -1
  163. package/dist/types/core/Agent.d.ts +20 -18
  164. package/dist/types/core/Agent.d.ts.map +1 -1
  165. package/dist/types/core/LLMCall.d.ts +28 -2
  166. package/dist/types/core/LLMCall.d.ts.map +1 -1
  167. package/dist/types/core/RunnerBase.d.ts +124 -4
  168. package/dist/types/core/RunnerBase.d.ts.map +1 -1
  169. package/dist/types/core/agent/buildAgentChart.d.ts +7 -1
  170. package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
  171. package/dist/types/core/agent/types.d.ts +29 -0
  172. package/dist/types/core/agent/types.d.ts.map +1 -1
  173. package/dist/types/core/runner.d.ts +51 -5
  174. package/dist/types/core/runner.d.ts.map +1 -1
  175. package/dist/types/core/slots/buildMessagesSlot.d.ts.map +1 -1
  176. package/dist/types/core/slots/buildSystemPromptSlot.d.ts.map +1 -1
  177. package/dist/types/core/slots/buildThinkingSubflow.d.ts.map +1 -1
  178. package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
  179. package/dist/types/core/translator.d.ts +95 -0
  180. package/dist/types/core/translator.d.ts.map +1 -0
  181. package/dist/types/core-flow/Conditional.d.ts +48 -4
  182. package/dist/types/core-flow/Conditional.d.ts.map +1 -1
  183. package/dist/types/core-flow/Loop.d.ts +42 -3
  184. package/dist/types/core-flow/Loop.d.ts.map +1 -1
  185. package/dist/types/core-flow/Parallel.d.ts +99 -4
  186. package/dist/types/core-flow/Parallel.d.ts.map +1 -1
  187. package/dist/types/core-flow/Sequence.d.ts +49 -3
  188. package/dist/types/core-flow/Sequence.d.ts.map +1 -1
  189. package/dist/types/events/payloads.d.ts +22 -1
  190. package/dist/types/events/payloads.d.ts.map +1 -1
  191. package/dist/types/index.d.ts +4 -2
  192. package/dist/types/index.d.ts.map +1 -1
  193. package/dist/types/lib/injection-engine/buildInjectionEngineSubflow.d.ts.map +1 -1
  194. package/dist/types/memory/causal/snapshotPipeline.d.ts.map +1 -1
  195. package/dist/types/memory/pipeline/auto.d.ts.map +1 -1
  196. package/dist/types/memory/pipeline/default.d.ts.map +1 -1
  197. package/dist/types/memory/pipeline/ephemeral.d.ts.map +1 -1
  198. package/dist/types/memory/pipeline/fact.d.ts.map +1 -1
  199. package/dist/types/memory/pipeline/narrative.d.ts.map +1 -1
  200. package/dist/types/memory/pipeline/semantic.d.ts.map +1 -1
  201. package/dist/types/observe.d.ts +2 -2
  202. package/dist/types/observe.d.ts.map +1 -1
  203. package/dist/types/recorders/observability/BoundaryRecorder.d.ts +160 -6
  204. package/dist/types/recorders/observability/BoundaryRecorder.d.ts.map +1 -1
  205. package/dist/types/recorders/observability/FlowchartRecorder.d.ts.map +1 -1
  206. package/dist/types/recorders/observability/LiveStateRecorder.d.ts +42 -6
  207. package/dist/types/recorders/observability/LiveStateRecorder.d.ts.map +1 -1
  208. package/dist/types/recorders/observability/RunStepRecorder.d.ts +232 -0
  209. package/dist/types/recorders/observability/RunStepRecorder.d.ts.map +1 -0
  210. package/dist/types/recorders/observability/commentary/commentaryTemplates.d.ts.map +1 -1
  211. package/dist/types/recorders/observability/internal/ActorArrowClassifier.d.ts +26 -0
  212. package/dist/types/recorders/observability/internal/ActorArrowClassifier.d.ts.map +1 -0
  213. package/dist/types/recorders/observability/internal/CandidateAnswerBuffer.d.ts +29 -0
  214. package/dist/types/recorders/observability/internal/CandidateAnswerBuffer.d.ts.map +1 -0
  215. package/dist/types/recorders/observability/internal/ForkTracker.d.ts +61 -0
  216. package/dist/types/recorders/observability/internal/ForkTracker.d.ts.map +1 -0
  217. package/dist/types/recorders/observability/internal/RootInferrer.d.ts +52 -0
  218. package/dist/types/recorders/observability/internal/RootInferrer.d.ts.map +1 -0
  219. package/dist/types/recorders/observability/internal/SequenceSiblingTracker.d.ts +25 -0
  220. package/dist/types/recorders/observability/internal/SequenceSiblingTracker.d.ts.map +1 -0
  221. package/dist/types/recorders/observability/observeRunId.d.ts +37 -0
  222. package/dist/types/recorders/observability/observeRunId.d.ts.map +1 -0
  223. package/dist/types/reliability/buildReliabilityGateChart.d.ts.map +1 -1
  224. package/package.json +3 -3
@@ -10,7 +10,7 @@
10
10
  * composition.fork_start / branch_complete / merge_end
11
11
  * (via compositionRecorder).
12
12
  */
13
- import { FlowChartExecutor, flowChart, } from 'footprintjs';
13
+ import { FlowChartExecutor, flowChart, isFlowEvent, } from 'footprintjs';
14
14
  import { RunnerBase, makeRunId } from '../core/RunnerBase.js';
15
15
  import { ContextRecorder } from '../recorders/core/ContextRecorder.js';
16
16
  import { streamRecorder } from '../recorders/core/StreamRecorder.js';
@@ -22,13 +22,29 @@ export class Parallel extends RunnerBase {
22
22
  id;
23
23
  branches;
24
24
  merge;
25
+ opts;
25
26
  currentRunContext = {
26
27
  runStartMs: 0,
27
28
  runId: 'pending',
28
29
  compositionPath: [],
29
30
  };
31
+ /**
32
+ * Per-branch first-error messages captured during the current run.
33
+ *
34
+ * Filled by an internal CombinedRecorder attached in `createExecutor()`
35
+ * that observes footprintjs `FlowErrorEvent`s. Errors are keyed by the
36
+ * branch id (the first segment of `traversalContext.subflowPath`); only
37
+ * the first error per branch is kept so the surface mirrors the wrapper
38
+ * `try/catch` semantics that preceded the v0.x architectural refactor.
39
+ *
40
+ * Read by the Merge stage to populate strict-mode error messages and
41
+ * tolerant-mode `BranchOutcome.error` strings. Cleared at the start of
42
+ * every `run()` / `resume()`.
43
+ */
44
+ branchErrors = new Map();
30
45
  constructor(opts, branches, merge) {
31
46
  super();
47
+ this.opts = opts;
32
48
  this.name = opts.name ?? 'Parallel';
33
49
  this.id = opts.id ?? 'parallel';
34
50
  if (branches.length < 2) {
@@ -36,15 +52,53 @@ export class Parallel extends RunnerBase {
36
52
  }
37
53
  this.branches = branches;
38
54
  this.merge = merge;
55
+ // Eager chart construction — see `RunnerBase.initChart` JSDoc.
56
+ // Safe: the merge stage's closure captures `this.branchErrors`
57
+ // (an instance field initialized at declaration time, line 130),
58
+ // which is set BEFORE the constructor body runs.
59
+ this.initChart(() => this.buildChart());
39
60
  }
40
61
  static create(opts = {}) {
41
62
  return new ParallelBuilder(opts);
42
63
  }
43
- toFlowChart() {
44
- return this.buildChart();
64
+ // `getSpec()` inherited from RunnerBase — returns the cached chart.
65
+ // ─── UI group translation (L1b) ───────────────────────────────
66
+ getGroupTranslator() {
67
+ return this.opts.groupTranslator;
68
+ }
69
+ /**
70
+ * Build the Parallel's `GroupMetadata` — kind `'Parallel'`, with one
71
+ * `GroupMember` per branch. Each member exposes its `runner` plus
72
+ * the runner's own `getUIGroup()` output (when the consumer
73
+ * threaded the same translator through that branch's construction).
74
+ */
75
+ buildUIGroupMetadata() {
76
+ const members = this.branches.map((b) => ({
77
+ memberId: b.id,
78
+ runner: b.runner,
79
+ // Per-method override (L1c) takes precedence over the branch
80
+ // runner's own constructor-level translator. When present, the
81
+ // override runs against the branch runner's own GroupMetadata
82
+ // and its output becomes `member.uiGroup`. When absent, fall
83
+ // back to `branch.runner.getUIGroup()` which applies the
84
+ // runner's own translator (if any).
85
+ uiGroup: b.groupTranslator !== undefined
86
+ ? b.runner.getUIGroupWith(b.groupTranslator)
87
+ : b.runner.getUIGroup(),
88
+ }));
89
+ return {
90
+ kind: 'Parallel',
91
+ id: this.id,
92
+ name: this.name,
93
+ members,
94
+ extra: {
95
+ mergeStrategy: this.merge.kind,
96
+ },
97
+ };
45
98
  }
46
99
  async run(input, options) {
47
100
  const executor = this.createExecutor();
101
+ this.lastExecutor = executor;
48
102
  const result = await executor.run({
49
103
  input: { message: input.message },
50
104
  ...(options ?? {}),
@@ -63,18 +117,71 @@ export class Parallel extends RunnerBase {
63
117
  runId: makeRunId(),
64
118
  compositionPath: [`Parallel:${this.id}`],
65
119
  };
66
- const chart = this.buildChart();
67
- const executor = new FlowChartExecutor(chart);
120
+ // Reset per-run branch-error capture. Fork children now mount the
121
+ // branch runner's own chart (no try/catch wrapper); errors are
122
+ // captured via FlowRecorder.onError correlation by subflow path.
123
+ this.branchErrors.clear();
124
+ // Reuse the cached chart built at constructor time.
125
+ const executor = new FlowChartExecutor(this.getSpec());
68
126
  const dispatcher = this.getDispatcher();
69
127
  const getRunCtx = () => this.currentRunContext;
70
128
  executor.attachCombinedRecorder(new ContextRecorder({ dispatcher, getRunContext: getRunCtx }));
71
129
  executor.attachCombinedRecorder(streamRecorder({ dispatcher, getRunContext: getRunCtx }));
72
130
  executor.attachCombinedRecorder(agentRecorder({ dispatcher, getRunContext: getRunCtx }));
73
131
  executor.attachCombinedRecorder(compositionRecorder({ dispatcher, getRunContext: getRunCtx }));
132
+ executor.attachCombinedRecorder(this.makeBranchErrorRecorder());
74
133
  for (const r of this.attachedRecorders)
75
134
  executor.attachCombinedRecorder(r);
76
135
  return executor;
77
136
  }
137
+ /**
138
+ * Build the internal recorder that captures first-error-per-branch.
139
+ *
140
+ * footprintjs's `SubflowExecutor` swallows subflow errors into
141
+ * `parentContext.debug.addError(...)` and skips the `outputMapper`,
142
+ * so the failed branch's error message never lands in parent scope.
143
+ * To preserve the per-branch error surface the wrapper-based design
144
+ * provided, we observe `FlowRecorder.onError` and correlate by the
145
+ * first segment of `traversalContext.subflowPath`.
146
+ *
147
+ * Only the FIRST error per branch is kept. Errors fired outside any
148
+ * branch (e.g., a Merge-stage error) are ignored.
149
+ */
150
+ makeBranchErrorRecorder() {
151
+ const branchIds = new Set(this.branches.map((b) => b.id));
152
+ return {
153
+ id: 'parallel-branch-errors',
154
+ onError: (event) => {
155
+ if (!isFlowEvent(event))
156
+ return;
157
+ const ctx = event.traversalContext;
158
+ if (!ctx)
159
+ return;
160
+ // The branch id is the first segment of the engine-prefixed
161
+ // `stageId` (e.g. `bad/call-llm` → branch `bad`). `subflowPath`
162
+ // is sometimes empty for first-level subflows, and `subflowId`
163
+ // can be deeper than the branch when LLMCall/Agent mount their
164
+ // own internal subflows. The stageId prefix is the canonical
165
+ // origin path.
166
+ const stageId = ctx.stageId ?? '';
167
+ const slash = stageId.indexOf('/');
168
+ const branchId = slash >= 0 ? stageId.slice(0, slash) : undefined;
169
+ if (branchId === undefined || !branchIds.has(branchId))
170
+ return;
171
+ if (!this.branchErrors.has(branchId)) {
172
+ // Strip the leading "Error: " that `error.toString()` adds
173
+ // for standard `Error` instances so the captured message
174
+ // matches the original `throw new Error(msg)` reason exactly
175
+ // (consumers expect the bare message). Non-Error throws
176
+ // never carry this prefix, so the strip is a no-op there.
177
+ const m = event.message.startsWith('Error: ')
178
+ ? event.message.slice('Error: '.length)
179
+ : event.message;
180
+ this.branchErrors.set(branchId, m);
181
+ }
182
+ },
183
+ };
184
+ }
78
185
  finalizeResult(executor, result) {
79
186
  const paused = this.detectPause(executor, result);
80
187
  if (paused)
@@ -107,74 +214,137 @@ export class Parallel extends RunnerBase {
107
214
  };
108
215
  // Root description prefix `Parallel:` is the taxonomy marker — see
109
216
  // FlowchartRecorder.mapTopologyToSteps for the consumer side.
110
- let builder = flowChart('Seed', seed, 'seed', undefined, `Parallel: ${branches.length}-way fanout`);
111
- // Fork children each branch is wrapped in a chart that runs the
112
- // branch runner in try/catch. The wrapper always succeeds (no error
113
- // propagates up), so the outputMapper always fires and records a
114
- // typed `BranchOutcome` for the Merge stage to inspect.
217
+ // The 4th arg threads the consumer's `structureRecorders` (when set)
218
+ // into footprintjs's builder so every node in this chart is observed
219
+ // by them at construction time.
220
+ let builder = flowChart('Seed', seed, 'seed', {
221
+ ...(this.opts.structureRecorders !== undefined && {
222
+ structureRecorders: [...this.opts.structureRecorders],
223
+ }),
224
+ description: `Parallel: ${branches.length}-way fanout`,
225
+ });
226
+ // Fork children — each branch is mounted as a proper subflow via
227
+ // footprintjs's native fork mode. Multiple `addSubFlowChart` calls
228
+ // on the same builder cursor produce a fork node (`type: 'fork'`);
229
+ // `ChildrenExecutor` runs them concurrently via `Promise.allSettled`.
115
230
  //
116
- // Strict mode (default): Merge throws on any branch failure. Tolerant
117
- // mode: Merge passes the full outcomes map to the consumer's merge fn.
231
+ // The branch's OWN chart (its `getSpec()`) is mounted directly no
232
+ // wrapper. This preserves the parent's `runtimeStageId` address
233
+ // space across branch internals: every LLM call, tool execution,
234
+ // and commit inside a branch appears in the parent executor's
235
+ // commitLog with a globally-unique id. Recorder events flow
236
+ // naturally — no `scope.$emit` forwarding needed.
237
+ //
238
+ // Error handling: a failing branch's `outputMapper` does NOT fire
239
+ // (footprintjs convention: `subflowError` skips output mapping).
240
+ // The branch id is absent from `branchResults`. The merge stage
241
+ // detects this via `branches.map(b => b.id) \ keys(branchResults)`
242
+ // and either throws (strict mode) or synthesizes `BranchOutcome`
243
+ // entries for the tolerant `outcomes-fn` merge.
118
244
  for (const branch of branches) {
119
- builder = builder.addSubFlowChart(branch.id, buildBranchWrapperChart(branch), branch.name, {
245
+ builder = builder.addSubFlowChart(branch.id, branch.runner.getSpec(), branch.name, {
120
246
  inputMapper: (parent) => ({ message: parent.userMessage ?? '' }),
121
- // The wrapper's terminal stage returns a BranchOutcome. Stash it
122
- // under the branch id; shallow-merge across siblings produces
123
- // the full outcomes map.
124
247
  outputMapper: (sfOutput) => ({
125
- branchOutcomes: {
126
- [branch.id]: sfOutput,
248
+ branchResults: {
249
+ [branch.id]: typeof sfOutput === 'string' ? sfOutput : '',
127
250
  },
128
251
  }),
129
252
  });
130
253
  }
131
254
  // Merge stage — runs after all fork children complete (join point).
255
+ // Closes over `this.branchErrors` (populated by the internal
256
+ // `parallel-branch-errors` recorder) so per-branch error messages
257
+ // survive subflow boundary swallowing in footprintjs.
258
+ const branchErrors = this.branchErrors;
132
259
  const mergeStage = async (scope) => {
133
- const outcomes = scope.branchOutcomes ?? {};
134
- const failures = Object.entries(outcomes).filter(([, o]) => !o.ok);
260
+ const results = scope.branchResults ?? {};
261
+ // Detect failures by absence: any expected branch id missing
262
+ // from `branchResults` is a branch whose `outputMapper` didn't
263
+ // fire — i.e., one whose subflow errored. The specific error
264
+ // message comes from the recorder-captured `branchErrors` map.
265
+ //
266
+ // Caveat: footprintjs does NOT fire `FlowRecorder.onError` for
267
+ // errors thrown INSIDE `applyOutputMapping` (those are caught
268
+ // separately in `SubflowExecutor` and routed to
269
+ // `parentContext.addError('outputMapperError', ...)`). A branch
270
+ // whose subflow completed cleanly but whose outputMapper threw
271
+ // will therefore show up here as a missing id with no entry in
272
+ // `branchErrors` — strict-mode aggregation prints `unknown
273
+ // error` for it and tolerant-mode synthesizes the same string.
274
+ // This is a known gap; see `core-flow/README.md` Decision 8.
275
+ const failedIds = branches.map((b) => b.id).filter((id) => !(id in results));
135
276
  const isTolerant = merge.kind === 'outcomes-fn';
136
- if (failures.length > 0 && !isTolerant) {
137
- const details = failures
138
- .map(([id, o]) => ` ${id}: ${o.error}`)
139
- .join('\n');
277
+ if (failedIds.length > 0 && !isTolerant) {
140
278
  typedEmit(scope, 'agentfootprint.composition.exit', {
141
279
  kind: 'Parallel',
142
280
  id: compositionId,
281
+ name: compositionName,
143
282
  status: 'err',
144
283
  durationMs: Date.now() - this.currentRunContext.runStartMs,
145
284
  });
146
- throw new Error(`Parallel '${compositionId}': ${failures.length} branch(es) failed:\n${details}\n` +
285
+ const details = failedIds
286
+ .map((id) => ` ${id}: ${branchErrors.get(id) ?? 'unknown error'}`)
287
+ .join('\n');
288
+ throw new Error(`Parallel '${compositionId}': ${failedIds.length} branch(es) failed:\n${details}\n` +
147
289
  `(use .mergeOutcomesWithFn() for tolerant-mode partial-failure handling)`);
148
290
  }
291
+ // Run the merge strategy. Wrap in try/catch so that a merge-stage
292
+ // failure (e.g., merge LLM throws) still produces a
293
+ // `composition.exit` event with `status: 'err'` — without this the
294
+ // event stream would have a `composition.enter` without a matching
295
+ // `composition.exit`, breaking dashboards that pair the two.
149
296
  let merged;
150
- if (merge.kind === 'fn') {
151
- const results = {};
152
- for (const [id, o] of Object.entries(outcomes)) {
153
- if (o.ok)
154
- results[id] = o.value;
297
+ try {
298
+ if (merge.kind === 'fn') {
299
+ merged = merge.fn(results);
155
300
  }
156
- merged = merge.fn(results);
157
- }
158
- else if (merge.kind === 'llm') {
159
- const results = {};
160
- for (const [id, o] of Object.entries(outcomes)) {
161
- if (o.ok)
162
- results[id] = o.value;
301
+ else if (merge.kind === 'llm') {
302
+ merged = await mergeWithLLM(scope, merge.opts, results);
303
+ }
304
+ else {
305
+ // Tolerant-mode: synthesize BranchOutcome map for the consumer.
306
+ const outcomes = {};
307
+ for (const b of branches) {
308
+ if (b.id in results) {
309
+ outcomes[b.id] = { ok: true, value: results[b.id] };
310
+ }
311
+ else {
312
+ outcomes[b.id] = {
313
+ ok: false,
314
+ error: branchErrors.get(b.id) ?? 'unknown error',
315
+ };
316
+ }
317
+ }
318
+ merged = merge.fn(outcomes);
163
319
  }
164
- merged = await mergeWithLLM(scope, merge.opts, results);
165
320
  }
166
- else {
167
- merged = merge.fn(outcomes);
321
+ catch (err) {
322
+ typedEmit(scope, 'agentfootprint.composition.exit', {
323
+ kind: 'Parallel',
324
+ id: compositionId,
325
+ name: compositionName,
326
+ status: 'err',
327
+ durationMs: Date.now() - this.currentRunContext.runStartMs,
328
+ });
329
+ throw err;
168
330
  }
331
+ const succeededCount = Object.keys(results).length;
169
332
  typedEmit(scope, 'agentfootprint.composition.merge_end', {
170
333
  parentId: compositionId,
171
- strategy: merge.kind === 'outcomes-fn' ? 'fn' : merge.kind,
334
+ // Emit the merge.kind verbatim so consumers can distinguish
335
+ // tolerant (`outcomes-fn`) from strict (`fn` / `llm`).
336
+ strategy: merge.kind,
172
337
  resultSummary: truncate(merged, 80),
173
- mergedBranchCount: branches.length,
338
+ // Number of branches that actually contributed a result to the
339
+ // merge. Equals `totalBranchCount` on full success; smaller in
340
+ // tolerant-mode runs where some branches failed.
341
+ mergedBranchCount: succeededCount,
342
+ totalBranchCount: branches.length,
174
343
  });
175
344
  typedEmit(scope, 'agentfootprint.composition.exit', {
176
345
  kind: 'Parallel',
177
346
  id: compositionId,
347
+ name: compositionName,
178
348
  status: 'ok',
179
349
  durationMs: Date.now() - this.currentRunContext.runStartMs,
180
350
  });
@@ -184,54 +354,6 @@ export class Parallel extends RunnerBase {
184
354
  return builder.build();
185
355
  }
186
356
  }
187
- /**
188
- * Build a wrapper chart that runs a branch Runner in a try/catch and
189
- * emits its events to the Parallel's dispatcher. The chart's terminal
190
- * stage returns a `BranchOutcome` — never throws up to the traverser.
191
- *
192
- * Event forwarding: the branch runner has its own EventDispatcher. We
193
- * subscribe to the wildcard `'*'` during run() and re-dispatch each
194
- * event on Parallel's dispatcher so consumers who attach listeners at
195
- * the Parallel level see the branch's llm/context/agent events.
196
- */
197
- function buildBranchWrapperChart(branch) {
198
- const runBranch = async (scope) => {
199
- const args = scope.$getArgs();
200
- // Forward every branch-runner event via `scope.$emit` so it flows
201
- // through footprintjs's emit channel. That channel reaches every
202
- // EmitBridge attached to the CURRENT executor — including bridges
203
- // belonging to outer compositions when this Parallel is nested
204
- // (e.g., `Loop(Parallel(...))`). Forwarding directly to the
205
- // Parallel's own dispatcher would be invisible to outer layers.
206
- const unsubscribe = branch.runner.on('*', (e) => {
207
- // `e.payload` is the typed payload union for the specific event;
208
- // $emit accepts `unknown`, so no cast is needed — let it pass
209
- // through structurally.
210
- scope.$emit(e.type, e.payload);
211
- });
212
- try {
213
- const result = await branch.runner.run({ message: args.message ?? '' });
214
- if (typeof result === 'string') {
215
- return { ok: true, value: result };
216
- }
217
- // Paused outcome: surface as "ok" with empty value — pauses from
218
- // nested runners aren't failures, but Parallel doesn't yet propagate
219
- // them through the merge. Consumers who need pause-inside-Parallel
220
- // should set up nested pause handling at their own layer.
221
- return { ok: true, value: '' };
222
- }
223
- catch (err) {
224
- return {
225
- ok: false,
226
- error: err instanceof Error ? err.message : String(err),
227
- };
228
- }
229
- finally {
230
- unsubscribe();
231
- }
232
- };
233
- return flowChart('RunBranch', runBranch, 'run-branch', undefined, `Parallel branch '${branch.id}' — catches failures`).build();
234
- }
235
357
  /** Fluent builder. Requires at least 2 branches + one merge strategy. */
236
358
  export class ParallelBuilder {
237
359
  opts;
@@ -241,13 +363,40 @@ export class ParallelBuilder {
241
363
  constructor(opts) {
242
364
  this.opts = opts;
243
365
  }
244
- /** Add a branch. All branches run concurrently with the same input. */
245
- branch(id, runner, name) {
366
+ /**
367
+ * Add a branch. All branches run concurrently with the same input.
368
+ *
369
+ * Third arg accepts EITHER a legacy bare `name` string (back-compat
370
+ * with pre-L1c callers) OR a `ParallelBranchOptions` bag containing
371
+ * `name` and/or a per-method `groupTranslator` override. The
372
+ * override applies ONLY to this branch's `member.uiGroup` and does
373
+ * not affect any other branch or the runner's own translator.
374
+ */
375
+ branch(id, runner, nameOrOpts) {
246
376
  if (this.seenIds.has(id)) {
247
377
  throw new Error(`Parallel.branch(): duplicate branch id '${id}'`);
248
378
  }
379
+ // Branch errors are correlated back to the originating branch by the
380
+ // first `/`-separated segment of footprintjs's engine-prefixed
381
+ // `traversalContext.stageId` (e.g., `legal/call-llm` → branch
382
+ // `legal`). A branch id containing `/` would silently shadow that
383
+ // mapping and drop the error message into 'unknown error' fallback.
384
+ if (id.includes('/')) {
385
+ throw new Error(`Parallel.branch(): id '${id}' must not contain '/' — it collides with footprintjs's subflow-path separator used for per-branch error correlation`);
386
+ }
249
387
  this.seenIds.add(id);
250
- this.branches.push({ id, runner, name: name ?? id });
388
+ const opts = typeof nameOrOpts === 'string'
389
+ ? ({ name: nameOrOpts })
390
+ : nameOrOpts ?? {};
391
+ const entry = {
392
+ id,
393
+ runner,
394
+ name: opts.name ?? id,
395
+ ...(opts.groupTranslator !== undefined && {
396
+ groupTranslator: opts.groupTranslator,
397
+ }),
398
+ };
399
+ this.branches.push(entry);
251
400
  return this;
252
401
  }
253
402
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Parallel.js","sourceRoot":"","sources":["../../../src/core-flow/Parallel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Parallel.js","sourceRoot":"","sources":["../../../src/core-flow/Parallel.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ export class Sequence extends RunnerBase {
22
22
  name;
23
23
  id;
24
24
  steps;
25
+ opts;
25
26
  currentRunContext = {
26
27
  runStartMs: 0,
27
28
  runId: 'pending',
@@ -29,21 +30,46 @@ export class Sequence extends RunnerBase {
29
30
  };
30
31
  constructor(opts, steps) {
31
32
  super();
33
+ this.opts = opts;
32
34
  this.name = opts.name ?? 'Sequence';
33
35
  this.id = opts.id ?? 'sequence';
34
36
  if (steps.length === 0) {
35
37
  throw new Error('Sequence: must have at least one .step()');
36
38
  }
37
39
  this.steps = steps;
40
+ // Eager chart construction — see `RunnerBase.initChart` JSDoc.
41
+ this.initChart(() => this.buildChart());
38
42
  }
39
43
  static create(opts = {}) {
40
44
  return new SequenceBuilder(opts);
41
45
  }
42
- toFlowChart() {
43
- return this.buildChart();
46
+ // `getSpec()` inherited from RunnerBase — returns the cached chart.
47
+ // ─── UI group translation (L1b) ───────────────────────────────
48
+ getGroupTranslator() {
49
+ return this.opts.groupTranslator;
50
+ }
51
+ /** Sequence is a flat ordered list of steps. One member per step,
52
+ * preserving definition order so the consumer can render them
53
+ * linearly (default Lens UX). Per-method overrides (L1c) take
54
+ * precedence over the step runner's own translator. */
55
+ buildUIGroupMetadata() {
56
+ const members = this.steps.map((s) => ({
57
+ memberId: s.id,
58
+ runner: s.runner,
59
+ uiGroup: s.groupTranslator !== undefined
60
+ ? s.runner.getUIGroupWith(s.groupTranslator)
61
+ : s.runner.getUIGroup(),
62
+ }));
63
+ return {
64
+ kind: 'Sequence',
65
+ id: this.id,
66
+ name: this.name,
67
+ members,
68
+ };
44
69
  }
45
70
  async run(input, options) {
46
71
  const executor = this.createExecutor();
72
+ this.lastExecutor = executor;
47
73
  const result = await executor.run({
48
74
  input: { message: input.message },
49
75
  ...(options ?? {}),
@@ -62,8 +88,8 @@ export class Sequence extends RunnerBase {
62
88
  runId: makeRunId(),
63
89
  compositionPath: [`Sequence:${this.id}`],
64
90
  };
65
- const chart = this.buildChart();
66
- const executor = new FlowChartExecutor(chart);
91
+ // Reuse the cached chart built at constructor time.
92
+ const executor = new FlowChartExecutor(this.getSpec());
67
93
  const dispatcher = this.getDispatcher();
68
94
  const getRunCtx = () => this.currentRunContext;
69
95
  executor.attachCombinedRecorder(new ContextRecorder({ dispatcher, getRunContext: getRunCtx }));
@@ -102,12 +128,17 @@ export class Sequence extends RunnerBase {
102
128
  // downstream consumers (Lens, FlowchartRecorder) detect composition
103
129
  // primitives via the `<Kind>:` prefix convention. See
104
130
  // FlowchartRecorder.mapTopologyToSteps for the consumer side.
105
- let builder = flowChart('Seed', seed, 'seed', undefined, `Sequence: ${steps.length}-step pipeline`);
131
+ let builder = flowChart('Seed', seed, 'seed', {
132
+ ...(this.opts.structureRecorders !== undefined && {
133
+ structureRecorders: [...this.opts.structureRecorders],
134
+ }),
135
+ description: `Sequence: ${steps.length}-step pipeline`,
136
+ });
106
137
  // Mount each step as a subflow via addSubFlowChartNext. The step's
107
138
  // input comes from parent.current (mapped via mapFromPrev); the
108
139
  // step's return becomes parent.current (via outputMapper).
109
140
  for (const step of steps) {
110
- builder = builder.addSubFlowChartNext(`step-${step.id}`, step.runner.toFlowChart(), step.id, {
141
+ builder = builder.addSubFlowChartNext(`step-${step.id}`, step.runner.getSpec(), step.id, {
111
142
  inputMapper: (parent) => step.mapFromPrev(parent.current ?? ''),
112
143
  // `sfOutput` is the subflow's TraversalResult — for Runner-backed
113
144
  // subflows whose last stage returns a string, sfOutput IS that
@@ -125,6 +156,7 @@ export class Sequence extends RunnerBase {
125
156
  typedEmit(scope, 'agentfootprint.composition.exit', {
126
157
  kind: 'Sequence',
127
158
  id: compositionId,
159
+ name: compositionName,
128
160
  status: 'ok',
129
161
  durationMs: Date.now() - this.currentRunContext.runStartMs,
130
162
  });
@@ -156,15 +188,26 @@ export class SequenceBuilder {
156
188
  * First step receives the Sequence input; subsequent steps receive the
157
189
  * previous step's output (via the default string-chain mapper, or via
158
190
  * the transformer set by a preceding `.pipeVia(fn)` call).
191
+ *
192
+ * Optional third arg `opts.groupTranslator` overrides the runner's
193
+ * own constructor-level translator for THIS step only — only its
194
+ * `member.uiGroup` flips to the override's output.
159
195
  */
160
- step(id, runner) {
196
+ step(id, runner, opts) {
161
197
  if (this.seenIds.has(id)) {
162
198
  throw new Error(`Sequence.step(): duplicate step id '${id}'`);
163
199
  }
164
200
  this.seenIds.add(id);
165
201
  const mapFromPrev = this.pendingPipe ?? defaultMapBetween;
166
202
  this.pendingPipe = undefined;
167
- this.steps.push({ id, runner, mapFromPrev });
203
+ this.steps.push({
204
+ id,
205
+ runner,
206
+ mapFromPrev,
207
+ ...(opts?.groupTranslator !== undefined && {
208
+ groupTranslator: opts.groupTranslator,
209
+ }),
210
+ });
168
211
  return this;
169
212
  }
170
213
  /**