/** * buildAgentMessageApiChart — the Agent (ReAct) form of the messageAPI * merge-tree, as ONE FLAT main chart (no inner LLM-call sub-box). * * The whole ReAct cycle lives directly in the single Agent chart: * * Context (ROOT selector — inits + picks which context slots to engineer) * ├─ system-prompt ┐ * ├─ messages ─────┼─→ messageAPI → Call-LLM * └─ tools ────────┘ * → Route (decider) → [ ToolCalls (execute) → loop ] / Final (response) * loopTo(Context) * * WHY flat (the user's call): the entire agent — context engineering, the LLM * call, routing, tool execution, the loop, and the final response — is ONE * visible flowchart in ONE Agent box. No nested LLM-call box: Lens wraps the * whole chart in the Agent main-box and renders the slots as pills. This is * simpler than the composed (sf-llm-call subflow) shape and avoids box-in-box * nesting entirely. * * The three context slots are DIRECT children of Context; all converge at * messageAPI (which assembles system-prompt + messages); Call-LLM then sends * the assembled payload plus the tool schemas. Route decides tool-calls (loop) * vs final (terminate). The same chart serves Static and Dynamic agents — only * which slots the Context selector lights per iteration differs. */ import type { FlowChart } from 'footprintjs'; import type { LLMProvider, LLMToolSchema } from '../../adapters/types.js'; export interface AgentMessageApiChartDeps { readonly provider: LLMProvider; readonly model: string; readonly systemPrompt: string; readonly tools: readonly LLMToolSchema[]; readonly maxIterations?: number; readonly structureRecorders?: readonly import('footprintjs').StructureRecorder[]; /** * The id of the run this chart is about to make (9.91.0) — supply it and * Call-LLM mints a receipt on every turn of the loop, the fingerprint of * what the model was handed, committed at each call for `receiptAt` and * `servedAt` to read. The twin of `MessageApiChartDeps.getRunId`, and for * the same reason: this is a chart BUILDER handed to an executor the caller * owns, so the salt has to come from whoever starts the run. * * OMIT IT AND NO RECEIPT IS MINTED — never an unsalted one. The rule and its * reason live in `messageApiReceipt.ts`; `servedAt` declares the absence and * rebuilds the view as it always did. * * @example (internal — `buildAgentMessageApiChart` is not on the package's * public surface; the type is, so a caller composing this chart inside the * library reads the contract here) * ```ts * const runId = `run-${Date.now()}`; * const chart = buildAgentMessageApiChart({ ...deps, getRunId: () => runId }); * await new FlowChartExecutor(chart).run({ input: { message: 'hi' } }); * ``` */ readonly getRunId?: () => string | undefined; } /** * Build the Agent merge-tree chart as one flat ReAct flowchart. */ export declare function buildAgentMessageApiChart(deps: AgentMessageApiChartDeps): FlowChart;