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