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
|
@@ -15,45 +15,55 @@
|
|
|
15
15
|
*
|
|
16
16
|
* Chart shape:
|
|
17
17
|
*
|
|
18
|
-
*
|
|
18
|
+
* Initialize
|
|
19
19
|
* → [memory READ subflows for each .memory()]
|
|
20
|
-
* → InjectionEngine (subflow)
|
|
21
|
-
* →
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* → CacheDecision (subflow)
|
|
20
|
+
* → InjectionEngine (subflow) ← loop target (tool-calls loops here)
|
|
21
|
+
* → Context (selector, PARALLEL fan-out, failFast)
|
|
22
|
+
* ⇉ {System Prompt ‖ Messages ‖ Tools} (slot subflows)
|
|
23
|
+
* → converge
|
|
25
24
|
* → UpdateSkillHistory
|
|
26
|
-
* →
|
|
27
|
-
*
|
|
28
|
-
* → CallLLM
|
|
29
|
-
* →
|
|
30
|
-
*
|
|
31
|
-
*
|
|
25
|
+
* → Cache (sf-cache subflow: decideCacheMarkers → CacheGate
|
|
26
|
+
* → ApplyMarkers / SkipCaching)
|
|
27
|
+
* → CallLLM (also emits the per-iteration iteration_start marker)
|
|
28
|
+
* → [NormalizeThinking] (subflow, only when a ThinkingHandler resolved)
|
|
29
|
+
* → Route (decider)
|
|
30
|
+
* ├─ tool-calls (pausable) → loopTo(InjectionEngine) ← branch-sourced loop
|
|
31
|
+
* └─ final (subflow) → terminal leaf
|
|
32
|
+
* ┌────── PrepareFinal
|
|
32
33
|
* ├──── [memory WRITE subflows]
|
|
33
34
|
* └──── BreakFinal ($break)
|
|
34
|
-
* loopTo(InjectionEngine)
|
|
35
35
|
*
|
|
36
36
|
* (When v2.11.x reliability is configured, the reliability gate chart
|
|
37
|
-
* mounts as a subflow
|
|
38
|
-
*
|
|
37
|
+
* mounts as a subflow before CallLLM with a TranslateFailFast stage
|
|
38
|
+
* after it. Lands in the next commit.)
|
|
39
39
|
*/
|
|
40
40
|
import { ArrayMergeMode } from 'footprintjs/advanced';
|
|
41
|
-
import { flowChart } from 'footprintjs';
|
|
41
|
+
import { flowChart, select } from 'footprintjs';
|
|
42
42
|
import { STAGE_IDS, SUBFLOW_IDS } from '../../conventions.js';
|
|
43
43
|
import { memoryInjectionKey } from '../../memory/define.types.js';
|
|
44
44
|
import { unwrapMemoryFlowChart } from '../../memory/define.js';
|
|
45
45
|
import { mountMemoryRead, mountMemoryWrite } from '../../memory/wire/mountMemoryPipeline.js';
|
|
46
46
|
import { breakFinalStage } from './stages/breakFinal.js';
|
|
47
47
|
import { prepareFinalStage } from './stages/prepareFinal.js';
|
|
48
|
+
import { buildCacheSubflow } from './buildCacheSubflow.js';
|
|
48
49
|
/**
|
|
49
50
|
* Build the agent's complete FlowChart from the supplied deps.
|
|
50
51
|
*/
|
|
51
52
|
export function buildAgentChart(deps) {
|
|
53
|
+
// ReAct loop semantics. 'classic' caches the static slots (engineer
|
|
54
|
+
// system-prompt + tools only on the first turn); 'dynamic' (default)
|
|
55
|
+
// re-engineers all 3 slots every turn. Drives the Context selector below.
|
|
56
|
+
const reactMode = deps.reactMode ?? 'dynamic';
|
|
52
57
|
// ── Final-branch subflow ─────────────────────────────────────
|
|
53
58
|
// Split so memory-write subflows can mount BETWEEN setting
|
|
54
59
|
// finalContent and breaking the ReAct loop. PrepareFinal captures
|
|
55
60
|
// the turn payload; BreakFinal terminates the loop.
|
|
56
|
-
let finalBranchBuilder = flowChart('PrepareFinal', prepareFinalStage, 'prepare-final',
|
|
61
|
+
let finalBranchBuilder = flowChart('PrepareFinal', prepareFinalStage, 'prepare-final', {
|
|
62
|
+
...(deps.structureRecorders !== undefined && {
|
|
63
|
+
structureRecorders: [...deps.structureRecorders],
|
|
64
|
+
}),
|
|
65
|
+
description: 'Capture turn payload (finalContent + newMessages)',
|
|
66
|
+
});
|
|
57
67
|
for (const m of deps.memories) {
|
|
58
68
|
if (m.write) {
|
|
59
69
|
finalBranchBuilder = mountMemoryWrite(finalBranchBuilder, {
|
|
@@ -77,8 +87,16 @@ export function buildAgentChart(deps) {
|
|
|
77
87
|
// (Lens + FlowchartRecorder) detect Agent-primitive subflows via
|
|
78
88
|
// this prefix and flag them as true agent boundaries (separate
|
|
79
89
|
// from LLMCall subflows which use `LLMCall:` prefix).
|
|
80
|
-
let builder = flowChart('
|
|
81
|
-
|
|
90
|
+
let builder = flowChart('Initialize', deps.seed, STAGE_IDS.SEED, {
|
|
91
|
+
...(deps.structureRecorders !== undefined && {
|
|
92
|
+
structureRecorders: [...deps.structureRecorders],
|
|
93
|
+
}),
|
|
94
|
+
// Tag the mode so the Lens can label the run. Keep the `Agent:` taxonomy
|
|
95
|
+
// prefix (consumers detect Agent boundaries by it). Dynamic keeps the
|
|
96
|
+
// historical 'Agent: ReAct loop' string for byte-stability.
|
|
97
|
+
description: reactMode === 'classic' ? 'Agent: Classic ReAct loop' : 'Agent: ReAct loop',
|
|
98
|
+
});
|
|
99
|
+
// Memory READ subflows — mounted between Initialize and InjectionEngine
|
|
82
100
|
// for TURN_START timing (default). Each memory writes to its own
|
|
83
101
|
// scope key (`memoryInjection_${id}`) so multiple `.memory()`
|
|
84
102
|
// registrations layer without colliding.
|
|
@@ -118,7 +136,48 @@ export function buildAgentChart(deps) {
|
|
|
118
136
|
// 8 → 16 → 24 → 32 cumulative injections per turn.
|
|
119
137
|
arrayMerge: ArrayMergeMode.Replace,
|
|
120
138
|
})
|
|
121
|
-
|
|
139
|
+
// ── Context assembly: the 3 slots run in PARALLEL (selector fan-out) ──
|
|
140
|
+
// The slots are genuinely INDEPENDENT — each reads ONLY InjectionEngine's
|
|
141
|
+
// activeInjections + seed state, and each writes a DISJOINT output key
|
|
142
|
+
// (systemPromptInjections / messagesInjections / toolsInjections +
|
|
143
|
+
// dynamicToolSchemas). None reads another slot's output. Running them
|
|
144
|
+
// sequentially was an accident of chaining; the fork makes the execution
|
|
145
|
+
// tree tell the truth (and the Lens merge-tree renders the real shape).
|
|
146
|
+
// The selector picks ALL 3 every iteration (unconditional fan-out).
|
|
147
|
+
// failFast: true — a REQUIRED slot that throws aborts the whole turn,
|
|
148
|
+
// matching the old sequential-throw behavior. WITHOUT it the default
|
|
149
|
+
// Promise.allSettled would SWALLOW a failing slot and call the LLM with a
|
|
150
|
+
// half-built request (the documented request-assembly footgun).
|
|
151
|
+
// ── Context selector — THE one place Classic and Dynamic differ ──────
|
|
152
|
+
// The 3 slots are always selector BRANCHES (so they stay drawn in the
|
|
153
|
+
// chart in both modes); WHICH ones get selected per turn is the whole
|
|
154
|
+
// Classic-vs-Dynamic difference:
|
|
155
|
+
// • dynamic — pick all 3 EVERY turn (activations can change per turn:
|
|
156
|
+
// a skill fires, a rule matches, a tool-return steers the next turn).
|
|
157
|
+
// • classic — pick all 3 on the FIRST turn, then ONLY messages. The
|
|
158
|
+
// static slots aren't re-selected, so their turn-1 outputs persist in
|
|
159
|
+
// scope (that IS the cache — the flat builder has no per-turn reset),
|
|
160
|
+
// and only the message list rebuilds each iteration. The Lens shows
|
|
161
|
+
// this directly: after turn 1 only the Messages branch lights up.
|
|
162
|
+
.addSelectorFunction('Context', ((scope) => {
|
|
163
|
+
const firstTurn = (scope.iteration ?? 1) <= 1;
|
|
164
|
+
const includeStatic = reactMode === 'dynamic' || firstTurn;
|
|
165
|
+
return select(scope, [
|
|
166
|
+
{
|
|
167
|
+
when: () => includeStatic,
|
|
168
|
+
then: SUBFLOW_IDS.SYSTEM_PROMPT,
|
|
169
|
+
label: 'engineer system-prompt',
|
|
170
|
+
},
|
|
171
|
+
{ when: () => true, then: SUBFLOW_IDS.MESSAGES, label: 'engineer messages' },
|
|
172
|
+
{ when: () => includeStatic, then: SUBFLOW_IDS.TOOLS, label: 'engineer tools' },
|
|
173
|
+
]);
|
|
174
|
+
}), STAGE_IDS.CONTEXT, reactMode === 'classic'
|
|
175
|
+
? 'Assemble request context: messages every turn; system-prompt + tools cached after turn 1'
|
|
176
|
+
: 'Assemble request context: system-prompt + messages + tools (parallel)', { failFast: true })
|
|
177
|
+
// Each branch keeps its inputMapper + outputMapper + arrayMerge:Replace
|
|
178
|
+
// VERBATIM from the former sequential mounts. Replace (not concat) is
|
|
179
|
+
// load-bearing: the loopTo would otherwise accumulate injections/tools.
|
|
180
|
+
.addSubFlowChartBranch(SUBFLOW_IDS.SYSTEM_PROMPT, deps.systemPromptSubflow, 'System Prompt', {
|
|
122
181
|
inputMapper: (parent) => ({
|
|
123
182
|
userMessage: parent.userMessage,
|
|
124
183
|
iteration: parent.iteration,
|
|
@@ -127,7 +186,7 @@ export function buildAgentChart(deps) {
|
|
|
127
186
|
outputMapper: (sf) => ({ systemPromptInjections: sf.systemPromptInjections }),
|
|
128
187
|
arrayMerge: ArrayMergeMode.Replace,
|
|
129
188
|
})
|
|
130
|
-
.
|
|
189
|
+
.addSubFlowChartBranch(SUBFLOW_IDS.MESSAGES, deps.messagesSubflow, 'Messages', {
|
|
131
190
|
inputMapper: (parent) => ({
|
|
132
191
|
messages: parent.history,
|
|
133
192
|
iteration: parent.iteration,
|
|
@@ -136,7 +195,7 @@ export function buildAgentChart(deps) {
|
|
|
136
195
|
outputMapper: (sf) => ({ messagesInjections: sf.messagesInjections }),
|
|
137
196
|
arrayMerge: ArrayMergeMode.Replace,
|
|
138
197
|
})
|
|
139
|
-
.
|
|
198
|
+
.addSubFlowChartBranch(SUBFLOW_IDS.TOOLS, deps.toolsSubflow, 'Tools', {
|
|
140
199
|
inputMapper: (parent) => ({
|
|
141
200
|
iteration: parent.iteration,
|
|
142
201
|
activeInjections: parent.activeInjections,
|
|
@@ -158,9 +217,30 @@ export function buildAgentChart(deps) {
|
|
|
158
217
|
// duplicates that providers reject.
|
|
159
218
|
arrayMerge: ArrayMergeMode.Replace,
|
|
160
219
|
})
|
|
161
|
-
|
|
162
|
-
|
|
220
|
+
.end();
|
|
221
|
+
// ── Skill-churn window (cache concern) ──────────────────────────
|
|
222
|
+
// UpdateSkillHistory stays in the MAIN loop (NOT inside sf-cache): the
|
|
223
|
+
// skillHistory rolling window must persist across iterations, so keeping
|
|
224
|
+
// it here lets it live in parent scope without round-tripping through the
|
|
225
|
+
// subflow. It feeds sf-cache's CacheGate churn check, and sits right where
|
|
226
|
+
// the tool-driven skill activation flows into it.
|
|
227
|
+
//
|
|
228
|
+
// CONDITIONAL MOUNT: only when skills are registered. With no skills the
|
|
229
|
+
// window records "no skill" every iteration and CacheGate's churn rule can
|
|
230
|
+
// never fire — so the stage is omitted entirely (no dead weight, no
|
|
231
|
+
// misleading box). Mirrors the read_skill auto-attach + NormalizeThinking.
|
|
232
|
+
if (deps.hasSkills) {
|
|
233
|
+
builder = builder.addFunction('UpdateSkillHistory', deps.updateSkillHistoryStage, STAGE_IDS.UPDATE_SKILL_HISTORY, 'Update skill-history rolling window for CacheGate churn detection');
|
|
234
|
+
}
|
|
235
|
+
builder = builder
|
|
236
|
+
// sf-cache: decideCacheMarkers → CacheGate → apply/skip, collapsed into
|
|
237
|
+
// ONE box. Pure provider-agnostic DECISION layer — reads the turn's state,
|
|
238
|
+
// outputs only the gated cacheMarkers (Replace, not concat, across the
|
|
239
|
+
// loop). The attached provider's CacheStrategy turns markers into wire
|
|
240
|
+
// format later. See buildCacheSubflow.ts.
|
|
241
|
+
.addSubFlowChartNext(SUBFLOW_IDS.CACHE, buildCacheSubflow(), 'Cache', {
|
|
163
242
|
inputMapper: (parent) => ({
|
|
243
|
+
// decideCacheMarkers inputs
|
|
164
244
|
activeInjections: parent.activeInjections ?? [],
|
|
165
245
|
iteration: parent.iteration ?? 1,
|
|
166
246
|
maxIterations: parent.maxIterations ?? deps.maxIterations,
|
|
@@ -171,24 +251,16 @@ export function buildAgentChart(deps) {
|
|
|
171
251
|
cumulativeInputTokens: parent.totalInputTokens ?? 0,
|
|
172
252
|
systemPromptCachePolicy: deps.systemPromptCachePolicy,
|
|
173
253
|
cachingDisabled: parent.cachingDisabled ?? false,
|
|
254
|
+
// CacheGate inputs (read-only: skillHistory is updated in the main
|
|
255
|
+
// loop above, so it is NOT mapped back out)
|
|
256
|
+
recentHitRate: parent.recentHitRate,
|
|
257
|
+
skillHistory: parent.skillHistory ?? [],
|
|
174
258
|
}),
|
|
175
259
|
outputMapper: (sf) => ({ cacheMarkers: sf.cacheMarkers }),
|
|
176
260
|
arrayMerge: ArrayMergeMode.Replace,
|
|
177
261
|
})
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
.addFunctionBranch(STAGE_IDS.APPLY_MARKERS, 'ApplyMarkers',
|
|
181
|
-
// Pass-through stage — markers stay in scope as-is.
|
|
182
|
-
// BuildLLMRequest (Phase 7+) reads them on the next stage.
|
|
183
|
-
() => undefined, 'Proceed with cache markers from CacheDecision')
|
|
184
|
-
.addFunctionBranch(STAGE_IDS.SKIP_CACHING, 'SkipCaching',
|
|
185
|
-
// Clear markers so BuildLLMRequest sees an empty list and
|
|
186
|
-
// makes the request unmodified.
|
|
187
|
-
(scope) => {
|
|
188
|
-
scope.cacheMarkers = [];
|
|
189
|
-
}, 'Skip caching this iteration')
|
|
190
|
-
.end()
|
|
191
|
-
.addFunction('IterationStart', deps.iterationStart, 'iteration-start', 'Iteration begin marker')
|
|
262
|
+
// CallLLM emits the per-iteration `iteration_start` marker itself (no
|
|
263
|
+
// dedicated IterationStart stage — emitting is passive observability).
|
|
192
264
|
.addFunction('CallLLM', deps.callLLM, STAGE_IDS.CALL_LLM, 'LLM invocation');
|
|
193
265
|
// v2.14 — conditional NormalizeThinking sub-subflow. Mounted ONLY
|
|
194
266
|
// when a ThinkingHandler resolved (auto-wired by provider.name OR
|
|
@@ -210,7 +282,15 @@ export function buildAgentChart(deps) {
|
|
|
210
282
|
}
|
|
211
283
|
builder = builder
|
|
212
284
|
.addDeciderFunction('Route', deps.routeDecider, SUBFLOW_IDS.ROUTE, 'ReAct routing')
|
|
213
|
-
.addPausableFunctionBranch('tool-calls', 'ToolCalls', deps.toolCallsHandler, 'Tool execution (pausable via pauseHere)'
|
|
285
|
+
.addPausableFunctionBranch('tool-calls', 'ToolCalls', deps.toolCallsHandler, 'Tool execution (pausable via pauseHere)',
|
|
286
|
+
// Branch-sourced loop: tool-calls loops back to the InjectionEngine so
|
|
287
|
+
// EVERY iteration re-evaluates triggers against the freshest context (the
|
|
288
|
+
// just-appended tool result). Sourced from the BRANCH (not the decider) so
|
|
289
|
+
// the chart reads honestly — `ToolCalls → InjectionEngine` loops, `Final`
|
|
290
|
+
// terminates. Survives pause/resume (human-in-the-loop tool approval): the
|
|
291
|
+
// engine resolves the subflow loop target on resume — footprintjs
|
|
292
|
+
// FlowChartExecutor.resume + test/lib/pause/resume-branch-loop-subflow.
|
|
293
|
+
{ loopTo: SUBFLOW_IDS.INJECTION_ENGINE })
|
|
214
294
|
.addSubFlowChartBranch(SUBFLOW_IDS.FINAL, finalBranchChart, 'Final', {
|
|
215
295
|
// Pass through the read-only state the sub-chart needs;
|
|
216
296
|
// OMIT keys the sub-chart writes (finalContent, newMessages)
|
|
@@ -224,19 +304,18 @@ export function buildAgentChart(deps) {
|
|
|
224
304
|
outputMapper: (sf) => ({
|
|
225
305
|
finalContent: sf.finalContent,
|
|
226
306
|
}),
|
|
227
|
-
//
|
|
228
|
-
//
|
|
229
|
-
//
|
|
307
|
+
// With the branch-sourced loop, `final` is a terminal LEAF — it ends the
|
|
308
|
+
// run on its own (no decider `next` to suppress). propagateBreak is kept
|
|
309
|
+
// so BreakFinal's $break() still surfaces a terminal onBreak signal to the
|
|
310
|
+
// parent (observability) and stays correct if a decider-level `next` is
|
|
311
|
+
// ever reintroduced.
|
|
230
312
|
propagateBreak: true,
|
|
231
313
|
})
|
|
232
314
|
.setDefault(SUBFLOW_IDS.FINAL)
|
|
233
|
-
.end()
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
// tool result). Without this, the InjectionEngine runs ONCE per
|
|
238
|
-
// turn — quietly breaking the framework's "Dynamic ReAct" claim.
|
|
239
|
-
.loopTo(SUBFLOW_IDS.INJECTION_ENGINE);
|
|
315
|
+
.end();
|
|
316
|
+
// The ReAct loop is now sourced from the `tool-calls` branch (the
|
|
317
|
+
// `{ loopTo }` above), not the decider — so `Final` is a plain terminal leaf
|
|
318
|
+
// and the chart draws `ToolCalls → InjectionEngine` for the loop edge.
|
|
240
319
|
return builder.build();
|
|
241
320
|
}
|
|
242
321
|
//# sourceMappingURL=buildAgentChart.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildAgentChart.js","sourceRoot":"","sources":["../../../../src/core/agent/buildAgentChart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"buildAgentChart.js","sourceRoot":"","sources":["../../../../src/core/agent/buildAgentChart.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buildAgentMessageApiChart — the Agent (ReAct) form of the messageAPI
|
|
3
|
+
* merge-tree, as ONE FLAT main chart (no inner LLM-call sub-box).
|
|
4
|
+
*
|
|
5
|
+
* The whole ReAct cycle lives directly in the single Agent chart:
|
|
6
|
+
*
|
|
7
|
+
* Context (ROOT selector — inits + picks which context slots to engineer)
|
|
8
|
+
* ├─ system-prompt ┐
|
|
9
|
+
* ├─ messages ─────┼─→ messageAPI → Call-LLM
|
|
10
|
+
* └─ tools ────────┘
|
|
11
|
+
* → Route (decider) → [ ToolCalls (execute) → loop ] / Final (response)
|
|
12
|
+
* loopTo(Context)
|
|
13
|
+
*
|
|
14
|
+
* WHY flat (the user's call): the entire agent — context engineering, the LLM
|
|
15
|
+
* call, routing, tool execution, the loop, and the final response — is ONE
|
|
16
|
+
* visible flowchart in ONE Agent box. No nested LLM-call box: Lens wraps the
|
|
17
|
+
* whole chart in the Agent main-box and renders the slots as pills. This is
|
|
18
|
+
* simpler than the composed (sf-llm-call subflow) shape and avoids box-in-box
|
|
19
|
+
* nesting entirely.
|
|
20
|
+
*
|
|
21
|
+
* The three context slots are DIRECT children of Context; all converge at
|
|
22
|
+
* messageAPI (which assembles system-prompt + messages); Call-LLM then sends
|
|
23
|
+
* the assembled payload plus the tool schemas. Route decides tool-calls (loop)
|
|
24
|
+
* vs final (terminate). The same chart serves Static and Dynamic agents — only
|
|
25
|
+
* which slots the Context selector lights per iteration differs.
|
|
26
|
+
*/
|
|
27
|
+
import { flowChartSelector, select } from 'footprintjs';
|
|
28
|
+
import { SUBFLOW_IDS } from '../../conventions.js';
|
|
29
|
+
import { typedEmit } from '../../recorders/core/typedEmit.js';
|
|
30
|
+
import { buildSystemPromptSlot } from '../slots/buildSystemPromptSlot.js';
|
|
31
|
+
import { buildMessagesSlot } from '../slots/buildMessagesSlot.js';
|
|
32
|
+
import { buildToolsSlot } from '../slots/buildToolsSlot.js';
|
|
33
|
+
/** Route branch ids. */
|
|
34
|
+
const ROUTE_TOOL_CALLS = 'tool-calls';
|
|
35
|
+
const ROUTE_FINAL = SUBFLOW_IDS.FINAL;
|
|
36
|
+
/**
|
|
37
|
+
* Build the Agent merge-tree chart as one flat ReAct flowchart.
|
|
38
|
+
*/
|
|
39
|
+
export function buildAgentMessageApiChart(deps) {
|
|
40
|
+
const { provider, model, systemPrompt, tools } = deps;
|
|
41
|
+
const maxIterations = deps.maxIterations ?? 5;
|
|
42
|
+
// ── Context: ROOT selector. Inits per-call state on the first turn (the
|
|
43
|
+
// folded-in seed — Context is the chart's first node); on ReAct loop re-entry
|
|
44
|
+
// it leaves state intact (the iteration was bumped by ToolCalls). Returns the
|
|
45
|
+
// three context slots to engineer. ──
|
|
46
|
+
const contextSelector = (scope) => {
|
|
47
|
+
if (scope.iteration === undefined) {
|
|
48
|
+
const args = scope.$getArgs();
|
|
49
|
+
scope.userMessage = args.message;
|
|
50
|
+
scope.history = [{ role: 'user', content: args.message }];
|
|
51
|
+
scope.iteration = 1;
|
|
52
|
+
scope.systemPromptInjections = [];
|
|
53
|
+
scope.messagesInjections = [];
|
|
54
|
+
scope.toolSchemas = [];
|
|
55
|
+
scope.assembledSystem = '';
|
|
56
|
+
scope.assembledMessages = [];
|
|
57
|
+
scope.answer = '';
|
|
58
|
+
scope.toolCalls = [];
|
|
59
|
+
scope.finalContent = '';
|
|
60
|
+
}
|
|
61
|
+
return select(scope, [
|
|
62
|
+
{ when: () => true, then: SUBFLOW_IDS.SYSTEM_PROMPT, label: 'engineer system-prompt' },
|
|
63
|
+
{ when: () => true, then: SUBFLOW_IDS.MESSAGES, label: 'engineer messages' },
|
|
64
|
+
{ when: () => true, then: SUBFLOW_IDS.TOOLS, label: 'engineer tools' },
|
|
65
|
+
]);
|
|
66
|
+
};
|
|
67
|
+
// ── messageAPI: assemble system-prompt + messages (the join after the slots
|
|
68
|
+
// converge). tools is a separate field Call-LLM reads directly. ──
|
|
69
|
+
const messageApiStage = (scope) => {
|
|
70
|
+
const sysInjections = (scope.systemPromptInjections ?? []);
|
|
71
|
+
scope.assembledSystem = sysInjections
|
|
72
|
+
.map((r) => r.rawContent ?? '')
|
|
73
|
+
.filter((s) => s.length > 0)
|
|
74
|
+
.join('\n\n');
|
|
75
|
+
scope.assembledMessages = [...(scope.history ?? [])];
|
|
76
|
+
};
|
|
77
|
+
// ── Call-LLM: send the assembled payload + the tool schemas. ──
|
|
78
|
+
const callLLM = async (scope) => {
|
|
79
|
+
const system = scope.assembledSystem;
|
|
80
|
+
const messages = (scope.assembledMessages ?? []);
|
|
81
|
+
const toolSchemas = (scope.toolSchemas ?? []);
|
|
82
|
+
typedEmit(scope, 'agentfootprint.stream.llm_start', {
|
|
83
|
+
iteration: scope.iteration,
|
|
84
|
+
provider: provider.name,
|
|
85
|
+
model,
|
|
86
|
+
systemPromptChars: system.length,
|
|
87
|
+
messagesCount: messages.length,
|
|
88
|
+
toolsCount: toolSchemas.length,
|
|
89
|
+
});
|
|
90
|
+
const startMs = Date.now();
|
|
91
|
+
const response = await provider.complete({
|
|
92
|
+
...(system.length > 0 && { systemPrompt: system }),
|
|
93
|
+
messages,
|
|
94
|
+
...(toolSchemas.length > 0 && { tools: toolSchemas }),
|
|
95
|
+
model,
|
|
96
|
+
});
|
|
97
|
+
scope.answer = response.content;
|
|
98
|
+
scope.toolCalls = response.toolCalls;
|
|
99
|
+
typedEmit(scope, 'agentfootprint.stream.llm_end', {
|
|
100
|
+
iteration: scope.iteration,
|
|
101
|
+
content: response.content,
|
|
102
|
+
toolCallCount: response.toolCalls.length,
|
|
103
|
+
usage: response.usage,
|
|
104
|
+
stopReason: response.stopReason,
|
|
105
|
+
durationMs: Date.now() - startMs,
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
// ── Route: ReAct decider — tool-calls (loop) vs final (terminate). ──
|
|
109
|
+
const routeDecider = (scope) => {
|
|
110
|
+
const calls = (scope.toolCalls ?? []);
|
|
111
|
+
if (calls.length > 0 && scope.iteration < maxIterations)
|
|
112
|
+
return ROUTE_TOOL_CALLS;
|
|
113
|
+
return ROUTE_FINAL;
|
|
114
|
+
};
|
|
115
|
+
// ── ToolCalls: execute the LLM's requested tools, append results, bump the
|
|
116
|
+
// iteration, loop. ──
|
|
117
|
+
const toolExec = async (scope) => {
|
|
118
|
+
const calls = (scope.toolCalls ?? []);
|
|
119
|
+
const newHistory = [...(scope.history ?? [])];
|
|
120
|
+
for (const call of calls) {
|
|
121
|
+
typedEmit(scope, 'agentfootprint.stream.tool_start', {
|
|
122
|
+
toolCallId: call.id,
|
|
123
|
+
toolName: call.name,
|
|
124
|
+
args: call.args,
|
|
125
|
+
});
|
|
126
|
+
const result = `[${call.name} result]`; // demo executor — real agents wire a registry
|
|
127
|
+
newHistory.push({ role: 'tool', content: result, toolCallId: call.id });
|
|
128
|
+
typedEmit(scope, 'agentfootprint.stream.tool_end', {
|
|
129
|
+
toolCallId: call.id,
|
|
130
|
+
result,
|
|
131
|
+
durationMs: 0,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
scope.history = newHistory;
|
|
135
|
+
scope.toolCalls = [];
|
|
136
|
+
scope.iteration = scope.iteration + 1;
|
|
137
|
+
};
|
|
138
|
+
// ── Final: the agent's response — terminate the loop, capture the answer. ──
|
|
139
|
+
const finalStage = (scope) => {
|
|
140
|
+
scope.finalContent = scope.answer;
|
|
141
|
+
scope.$break('agent reached final answer');
|
|
142
|
+
};
|
|
143
|
+
// ── Build ONE flat chart: Context(root) → 3 slots → messageAPI → Call-LLM
|
|
144
|
+
// → Route → [ToolCalls → loop] / Final. ──
|
|
145
|
+
return (flowChartSelector('Context', contextSelector, 'context', {
|
|
146
|
+
...(deps.structureRecorders !== undefined && {
|
|
147
|
+
structureRecorders: [...deps.structureRecorders],
|
|
148
|
+
}),
|
|
149
|
+
// 'Agent:' taxonomy marker → Lens renders this as an Agent group.
|
|
150
|
+
description: 'Agent: ReAct loop',
|
|
151
|
+
})
|
|
152
|
+
// Three DIRECT context slots — all converge at messageAPI.
|
|
153
|
+
.addSubFlowChartBranch(SUBFLOW_IDS.SYSTEM_PROMPT, buildSystemPromptSlot({ prompt: systemPrompt, reason: 'agent messageAPI' }), 'System Prompt', {
|
|
154
|
+
inputMapper: (parent) => ({
|
|
155
|
+
userMessage: parent.userMessage,
|
|
156
|
+
iteration: parent.iteration,
|
|
157
|
+
}),
|
|
158
|
+
outputMapper: (sf) => ({
|
|
159
|
+
systemPromptInjections: sf.systemPromptInjections,
|
|
160
|
+
}),
|
|
161
|
+
})
|
|
162
|
+
.addSubFlowChartBranch(SUBFLOW_IDS.MESSAGES, buildMessagesSlot(), 'Messages', {
|
|
163
|
+
inputMapper: (parent) => ({
|
|
164
|
+
messages: parent.history,
|
|
165
|
+
iteration: parent.iteration,
|
|
166
|
+
}),
|
|
167
|
+
outputMapper: (sf) => ({ messagesInjections: sf.messagesInjections }),
|
|
168
|
+
})
|
|
169
|
+
.addSubFlowChartBranch(SUBFLOW_IDS.TOOLS, buildToolsSlot({ tools }), 'Tools', {
|
|
170
|
+
inputMapper: (parent) => ({ iteration: parent.iteration }),
|
|
171
|
+
outputMapper: (sf) => ({ toolSchemas: sf.toolSchemas }),
|
|
172
|
+
// tools is a SEPARATE Anthropic wire field — it BYPASSES messageAPI
|
|
173
|
+
// (which assembles only system+messages) and pairs with its output at
|
|
174
|
+
// Call-LLM. `convergeAt` makes the structure edge `sf-tools → call-llm`
|
|
175
|
+
// instead of the default `sf-tools → message-api`, so Call-LLM reads as a
|
|
176
|
+
// true 2-parent merge {messageAPI, tools}. (toolSchemas already rides
|
|
177
|
+
// shared scope; this only makes the diagram faithful.)
|
|
178
|
+
convergeAt: 'call-llm',
|
|
179
|
+
})
|
|
180
|
+
.end()
|
|
181
|
+
// messageAPI assembles ONLY system+messages; Call-LLM then sends that
|
|
182
|
+
// payload + the tool schemas (the 2-parent merge above).
|
|
183
|
+
.addFunction('messageAPI', messageApiStage, 'message-api', 'Assemble system + messages into the LLM request')
|
|
184
|
+
.addFunction('CallLLM', callLLM, 'call-llm', 'Send the assembled request + tools to the LLM')
|
|
185
|
+
// Route → [ToolCalls → loop back to Context] / [Final → terminate].
|
|
186
|
+
.addDeciderFunction('Route', routeDecider, SUBFLOW_IDS.ROUTE, 'ReAct routing')
|
|
187
|
+
.addFunctionBranch(ROUTE_TOOL_CALLS, 'ToolCalls', toolExec, 'Execute tool calls')
|
|
188
|
+
// ReAct: the loop is sourced from the TOOL-CALLS branch (after executing
|
|
189
|
+
// tools, re-engineer context next turn) — NOT from the Route decider. Final
|
|
190
|
+
// terminates as a leaf (its $break is the terminal boundary signal).
|
|
191
|
+
.loopTo('context')
|
|
192
|
+
.addFunctionBranch(ROUTE_FINAL, 'Final', finalStage, 'Terminate the ReAct loop (response)')
|
|
193
|
+
.setDefault(ROUTE_FINAL)
|
|
194
|
+
.end()
|
|
195
|
+
.build());
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=buildAgentMessageApiChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildAgentMessageApiChart.js","sourceRoot":"","sources":["../../../../src/core/agent/buildAgentMessageApiChart.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buildCacheSubflow — the per-turn prompt-cache decision, as ONE subflow.
|
|
3
|
+
*
|
|
4
|
+
* Collapses the cache machinery into a single `sf-cache` boundary so the
|
|
5
|
+
* agent chart reads cleanly (one "Cache" box you can drill into) while the
|
|
6
|
+
* execution tree stays honest:
|
|
7
|
+
*
|
|
8
|
+
* decideCacheMarkers → CacheGate (decider) → ApplyMarkers / SkipCaching
|
|
9
|
+
*
|
|
10
|
+
* Layering (see src/cache/types.ts):
|
|
11
|
+
* - This subflow is the provider-AGNOSTIC DECISION layer — it only computes
|
|
12
|
+
* and gates provider-neutral `CacheMarker[]`. It knows nothing about any
|
|
13
|
+
* provider.
|
|
14
|
+
* - The provider-SPECIFIC MECHANISM (Anthropic `cache_control`, OpenAI
|
|
15
|
+
* automatic, …) is the attached provider's `CacheStrategy`, selected by
|
|
16
|
+
* `provider.name`, applied later when the request is built.
|
|
17
|
+
*
|
|
18
|
+
* Why `UpdateSkillHistory` is NOT in here: the `skillHistory` rolling window
|
|
19
|
+
* must persist across loop iterations. Keeping `UpdateSkillHistory` in the
|
|
20
|
+
* main loop (just before this subflow) lets `skillHistory` live in the parent
|
|
21
|
+
* scope without round-tripping through this subflow's in/out mappers — the
|
|
22
|
+
* subflow stays pure (reads the turn's state, writes only `cacheMarkers`).
|
|
23
|
+
*
|
|
24
|
+
* Deps-free: every input (`activeInjections`, `iteration`, `skillHistory`,
|
|
25
|
+
* `recentHitRate`, `systemPromptCachePolicy`, …) is supplied by the PARENT's
|
|
26
|
+
* `inputMapper` at the mount site; the output is just `cacheMarkers`.
|
|
27
|
+
*/
|
|
28
|
+
import { flowChart } from 'footprintjs';
|
|
29
|
+
import { decideCacheMarkers } from '../../cache/CacheDecisionSubflow.js';
|
|
30
|
+
import { cacheGateDecide } from '../../cache/CacheGateDecider.js';
|
|
31
|
+
import { STAGE_IDS } from '../../conventions.js';
|
|
32
|
+
/**
|
|
33
|
+
* Build the `sf-cache` subflow chart. Called by `buildAgentChart` and
|
|
34
|
+
* `buildDynamicAgentChart` and mounted via `addSubFlowChartNext(
|
|
35
|
+
* SUBFLOW_IDS.CACHE, buildCacheSubflow(), 'Cache', { inputMapper,
|
|
36
|
+
* outputMapper, arrayMerge: Replace })`.
|
|
37
|
+
*/
|
|
38
|
+
export function buildCacheSubflow() {
|
|
39
|
+
return flowChart('CacheDecision',
|
|
40
|
+
// Root stage = the cache-decision function (a chart cannot start with a
|
|
41
|
+
// nested subflow). Exported from CacheDecisionSubflow.ts and reused here —
|
|
42
|
+
// the cache decision is the root of sf-cache, no logic duplication.
|
|
43
|
+
decideCacheMarkers, 'decide-cache-markers', {
|
|
44
|
+
description: 'CacheDecision: walk activeInjections, evaluate cache directives, emit CacheMarker[]',
|
|
45
|
+
})
|
|
46
|
+
.addDeciderFunction('CacheGate', cacheGateDecide, STAGE_IDS.CACHE_GATE, 'Gate cache-marker application: kill switch / hit-rate / skill-churn')
|
|
47
|
+
.addFunctionBranch(STAGE_IDS.APPLY_MARKERS, 'ApplyMarkers',
|
|
48
|
+
// Pass-through — markers stay in scope; the request build reads them.
|
|
49
|
+
() => undefined, 'Proceed with cache markers from CacheDecision')
|
|
50
|
+
.addFunctionBranch(STAGE_IDS.SKIP_CACHING, 'SkipCaching',
|
|
51
|
+
// Clear markers so the request is built unmodified this iteration.
|
|
52
|
+
(scope) => {
|
|
53
|
+
scope.cacheMarkers = [];
|
|
54
|
+
}, 'Skip caching this iteration')
|
|
55
|
+
.end()
|
|
56
|
+
.build();
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=buildCacheSubflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildCacheSubflow.js","sourceRoot":"","sources":["../../../../src/core/agent/buildCacheSubflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,SAAS,CACd,eAAe;IACf,wEAAwE;IACxE,2EAA2E;IAC3E,oEAAoE;IACpE,kBAA2B,EAC3B,sBAAsB,EACtB;QACE,WAAW,EACT,qFAAqF;KACxF,CACF;SACE,kBAAkB,CACjB,WAAW,EACX,eAAwB,EACxB,SAAS,CAAC,UAAU,EACpB,qEAAqE,CACtE;SACA,iBAAiB,CAChB,SAAS,CAAC,aAAa,EACvB,cAAc;IACd,sEAAsE;IACtE,GAAG,EAAE,CAAC,SAAS,EACf,+CAA+C,CAChD;SACA,iBAAiB,CAChB,SAAS,CAAC,YAAY,EACtB,aAAa;IACb,mEAAmE;IACnE,CAAC,KAAK,EAAE,EAAE;QACP,KAA8C,CAAC,YAAY,GAAG,EAAE,CAAC;IACpE,CAAC,EACD,6BAA6B,CAC9B;SACA,GAAG,EAAE;SACL,KAAK,EAAE,CAAC;AACb,CAAC"}
|