/** * buildDynamicAgentChart — the Dynamic-ReAct agent chart, where the * whole LLM turn (context engineering + the call) is ONE `sf-llm-call` * subflow, exactly like the `LLMCall` primitive produces. * * WHY a second builder (vs `buildAgentChart`) * ─────────────────────────────────────────── * `buildAgentChart` mounts the LLM as a flat `call-llm` STAGE with the * slot subflows as its siblings. That renders as nothing in Lens — a * bare stage is dropped by the subflow-level collapser, so the slots * have no LLM card to fold into and the chart comes up empty. * * This builder wraps that same region in an `sf-llm-call` SUBFLOW. The * payoff is purely structural — Lens already maps `sf-llm-call → LLM * group` (same boundary `LLMCall` produces), so the Dynamic agent * renders as an LLM group with its slots inside, a peer Tool node, and * the loop arc, with ZERO Lens-specific special-casing. * * The data flow is IDENTICAL to `buildAgentChart` — every stage handler * + slot subflow is reused verbatim from the same `AgentChartDeps`. The * ONLY new thing is the subflow boundary, which means: * * • A small inner seed (`dynamicTurnSeed`) initialises the per-turn * working keys the OUTER seed used to set, since the inner subflow * gets a fresh scope each loop re-entry. * • Cross-iteration accumulators (token totals, cost counters, * skill-history) round-trip out→in: the boundary `outputMapper` * bubbles them to the outer scope, and the next iteration's * `inputMapper` feeds them back under `prior*` aliases (because * keys passed via `inputMapper` are FROZEN inside the subflow — * `ScopeFacade.setValue` throws on them — so the writable working * key must have a different name from the read-only input). * * Chart shape (mirrors the diagram the team locked): * * Initialize * → [memory READ subflows] * → sf-llm-call (SUBFLOW — same boundary LLMCall produces) * dynamicTurnSeed → InjectionEngine * → Context (selector, PARALLEL fan-out, failFast) * ⇉ {System Prompt ‖ Messages ‖ Tools} → converge * → UpdateSkillHistory → Cache (sf-cache subflow) * → CallLLM (emits iteration_start) → [NormalizeThinking] * → Route (decider) * ├─ tool-calls (pausable) → loopTo(sf-llm-call) ← branch-sourced loop * └─ sf-final (the answer) → terminal leaf * * Classic ReAct keeps using `buildAgentChart` until its own shape is * designed — this builder is Dynamic-only. */ import type { FlowChart } from 'footprintjs'; import type { AgentChartDeps } from './buildAgentChart.js'; /** * Build the Dynamic-ReAct agent chart from the shared `AgentChartDeps`. */ export declare function buildDynamicAgentChart(deps: AgentChartDeps): FlowChart;