{"version":3,"file":"ReactAgent.cjs","names":["#defaultConfig","#toolBehaviorVersion","isClientTool","createAgentState","StateGraph","#agentNode","AgentNode","normalizeSystemPrompt","BeforeAgentNode","getHookConstraint","BeforeModelNode","AfterModelNode","AfterAgentNode","AGENT_NODE_NAME","ToolNode","wrapToolCall","TOOLS_NODE_NAME","END","START","parseJumpToTarget","#createBeforeAgentRouter","#createBeforeModelRouter","#getModelPaths","#createModelRouter","#createAfterModelSequenceRouter","#createAfterModelRouter","#createToolsRouter","createToolCallTransformer","createSubagentTransformer","#graph","toGraphDefaultConfig","builtInState","ToolMessage","AIMessage","Send","#initializeMiddlewareStates","Command","initializeMiddlewareStates","agentConfig"],"sources":["../../src/agents/ReactAgent.ts"],"sourcesContent":["/* oxlint-disable no-instanceof/no-instanceof */\n/* oxlint-disable @typescript-eslint/no-explicit-any */\nimport { InteropZodObject } from \"@langchain/core/utils/types\";\n\nimport {\n  StateGraph,\n  END,\n  START,\n  Send,\n  Command,\n  CompiledStateGraph,\n  type GetStateOptions,\n  type LangGraphRunnableConfig,\n  type StreamMode,\n  type StreamOutputMap,\n  type PregelOptions,\n  type StreamTransformer,\n} from \"@langchain/langgraph\";\nimport type {\n  BaseCheckpointSaver,\n  BaseStore,\n  CheckpointListOptions,\n} from \"@langchain/langgraph-checkpoint\";\nimport {\n  ToolMessage,\n  AIMessage,\n  MessageStructure,\n} from \"@langchain/core/messages\";\nimport { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport {\n  mergeConfigs,\n  type Runnable,\n  type RunnableConfig,\n} from \"@langchain/core/runnables\";\nimport type { StreamEvent } from \"@langchain/core/tracers/log_stream\";\nimport type { ClientTool, ServerTool } from \"@langchain/core/tools\";\nimport { createAgentState } from \"./annotation.js\";\nimport {\n  isClientTool,\n  validateLLMHasNoBoundTools,\n  wrapToolCall,\n  normalizeSystemPrompt,\n} from \"./utils.js\";\n\nimport { AgentNode, AGENT_NODE_NAME } from \"./nodes/AgentNode.js\";\nimport { ToolNode, TOOLS_NODE_NAME } from \"./nodes/ToolNode.js\";\nimport { BeforeAgentNode } from \"./nodes/BeforeAgentNode.js\";\nimport { BeforeModelNode } from \"./nodes/BeforeModelNode.js\";\nimport { AfterModelNode } from \"./nodes/AfterModelNode.js\";\nimport { AfterAgentNode } from \"./nodes/AfterAgentNode.js\";\nimport {\n  initializeMiddlewareStates,\n  parseJumpToTarget,\n} from \"./nodes/utils.js\";\nimport {\n  createToolCallTransformer,\n  createSubagentTransformer,\n  type AgentRunStream,\n  type InferStreamExtensions,\n} from \"./transformers/index.js\";\n\nimport type {\n  WithStateGraphNodes,\n  AgentTypeConfig,\n  CreateAgentParams,\n  ToolsToMessageToolSet,\n} from \"./types.js\";\n\nimport type { BuiltInState, JumpTo, UserInput } from \"./types.js\";\nimport type { InvokeConfiguration, StreamConfiguration } from \"./runtime.js\";\nimport type {\n  AgentMiddleware,\n  AnyAgentMiddleware,\n  InferMiddlewareContextInputs,\n  InferMiddlewareStates,\n  InferMiddlewareInputStates,\n  InferContextInput,\n  AnyAnnotationRoot,\n  InferSchemaValue,\n  ToAnnotationRoot,\n} from \"./middleware/types.js\";\nimport { type ResponseFormatUndefined } from \"./responses.js\";\nimport { getHookConstraint } from \"./middleware/utils.js\";\nimport { toGraphDefaultConfig } from \"./utils.js\";\n\n/**\n * In the ReAct pattern we have three main nodes:\n * - model_request: The node that makes the model call.\n * - tools: The node that calls the tools.\n * - END: The end of the graph.\n *\n * These are the only nodes that can be jumped to from other nodes.\n */\ntype BaseGraphDestination =\n  | typeof TOOLS_NODE_NAME\n  | typeof AGENT_NODE_NAME\n  | typeof END;\n\n// Helper type to get the state definition with middleware states\ntype MergedAgentState<Types extends AgentTypeConfig> = InferSchemaValue<\n  Types[\"State\"]\n> &\n  (Types[\"Response\"] extends ResponseFormatUndefined\n    ? Omit<\n        BuiltInState<MessageStructure<ToolsToMessageToolSet<Types[\"Tools\"]>>>,\n        \"jumpTo\"\n      >\n    : Omit<\n        BuiltInState<MessageStructure<ToolsToMessageToolSet<Types[\"Tools\"]>>>,\n        \"jumpTo\"\n      > & {\n        structuredResponse: Types[\"Response\"];\n      }) &\n  InferMiddlewareStates<Types[\"Middleware\"]>;\n\ntype InvokeStateParameter<Types extends AgentTypeConfig> =\n  | (UserInput<Types[\"State\"]> &\n      InferMiddlewareInputStates<Types[\"Middleware\"]>)\n  | Command<any, any, any>\n  | null;\n\ntype AgentGraph<Types extends AgentTypeConfig> = CompiledStateGraph<\n  any,\n  any,\n  any,\n  any,\n  MergedAgentState<Types>,\n  ToAnnotationRoot<\n    Types[\"Context\"] extends AnyAnnotationRoot | InteropZodObject\n      ? Types[\"Context\"]\n      : AnyAnnotationRoot\n  >[\"spec\"],\n  unknown\n>;\n\n/**\n * ReactAgent is a production-ready ReAct (Reasoning + Acting) agent that combines\n * language models with tools and middleware.\n *\n * The agent is parameterized by a single type bag `Types` that encapsulates all\n * type information:\n *\n * @typeParam Types - An {@link AgentTypeConfig} that bundles:\n *   - `Response`: The structured response type\n *   - `State`: The custom state schema type\n *   - `Context`: The context schema type\n *   - `Middleware`: The middleware array type\n *   - `Tools`: The combined tools type from agent and middleware\n *\n * @example\n * ```typescript\n * // Using the type bag pattern\n * type MyTypes = AgentTypeConfig<\n *   { name: string },  // Response\n *   typeof myState,    // State\n *   typeof myContext,  // Context\n *   typeof middleware, // Middleware\n *   typeof tools       // Tools\n * >;\n *\n * const agent: ReactAgent<MyTypes> = createAgent({ ... });\n * ```\n */\nexport class ReactAgent<\n  Types extends AgentTypeConfig = AgentTypeConfig<\n    Record<string, any>,\n    undefined,\n    AnyAnnotationRoot,\n    readonly AnyAgentMiddleware[],\n    readonly (ClientTool | ServerTool)[],\n    ReadonlyArray<() => StreamTransformer<any>>\n  >,\n> {\n  /**\n   * Type marker for extracting the AgentTypeConfig from a ReactAgent instance.\n   * This is a phantom property used only for type inference.\n   * @internal\n   */\n  declare readonly \"~agentTypes\": Types;\n\n  #graph: CompiledStateGraph<any, any, any, any, any, any, unknown>;\n\n  #toolBehaviorVersion: \"v1\" | \"v2\" = \"v2\";\n\n  #agentNode: AgentNode<any, AnyAnnotationRoot>;\n\n  #defaultConfig: RunnableConfig;\n\n  constructor(\n    public options: CreateAgentParams<\n      Types[\"Response\"],\n      Types[\"State\"],\n      Types[\"Context\"]\n    >,\n    defaultConfig?: RunnableConfig\n  ) {\n    this.#defaultConfig = mergeConfigs(defaultConfig ?? {}, {\n      metadata: { ls_integration: \"langchain_create_agent\" },\n      configurable: { ls_agent_type: \"root\" },\n    });\n    if (options.name) {\n      this.#defaultConfig = mergeConfigs(this.#defaultConfig, {\n        metadata: { lc_agent_name: options.name },\n      });\n    }\n    this.#toolBehaviorVersion = options.version ?? this.#toolBehaviorVersion;\n\n    /**\n     * validate that model option is provided\n     */\n    if (!options.model) {\n      throw new Error(\"`model` option is required to create an agent.\");\n    }\n\n    /**\n     * Check if the LLM already has bound tools and throw if it does.\n     */\n    if (typeof options.model !== \"string\") {\n      validateLLMHasNoBoundTools(options.model);\n    }\n\n    /**\n     * define complete list of tools based on options and middleware\n     */\n    const middlewareTools = (this.options.middleware\n      ?.filter((m) => m.tools)\n      .flatMap((m) => m.tools) ?? []) as (ClientTool | ServerTool)[];\n    const toolClasses = [...(options.tools ?? []), ...middlewareTools];\n\n    /**\n     * If any of the tools are configured to return_directly after running,\n     * our graph needs to check if these were called\n     */\n    const shouldReturnDirect = new Set(\n      toolClasses\n        .filter(isClientTool)\n        .filter((tool) => \"returnDirect\" in tool && tool.returnDirect)\n        .map((tool) => tool.name)\n    );\n\n    /**\n     * Create a schema that merges agent base schema with middleware state schemas\n     * Using Zod with withLangGraph ensures LangGraph Studio gets proper metadata\n     */\n    const hasDynamicStructuredResponse = Boolean(\n      this.options.middleware?.some((middleware) => middleware.wrapModelCall)\n    );\n    const { state, input, output } = createAgentState<\n      Types[\"State\"],\n      Types[\"Middleware\"]\n    >(\n      this.options.responseFormat !== undefined || hasDynamicStructuredResponse,\n      this.options.stateSchema as Types[\"State\"],\n      this.options.middleware as Types[\"Middleware\"]\n    );\n\n    const workflow = new StateGraph(state, {\n      input,\n      output,\n      context: this.options.contextSchema,\n    });\n\n    const allNodeWorkflows = workflow as WithStateGraphNodes<\n      typeof TOOLS_NODE_NAME | typeof AGENT_NODE_NAME | string,\n      typeof workflow\n    >;\n\n    // Generate node names for middleware nodes that have hooks\n    const beforeAgentNodes: {\n      index: number;\n      name: string;\n      allowed?: string[];\n    }[] = [];\n    const beforeModelNodes: {\n      index: number;\n      name: string;\n      allowed?: string[];\n    }[] = [];\n    const afterModelNodes: {\n      index: number;\n      name: string;\n      allowed?: string[];\n    }[] = [];\n    const afterAgentNodes: {\n      index: number;\n      name: string;\n      allowed?: string[];\n    }[] = [];\n    const wrapModelCallHookMiddleware: AgentMiddleware[] = [];\n\n    this.#agentNode = new AgentNode({\n      model: this.options.model,\n      systemMessage: normalizeSystemPrompt(this.options.systemPrompt),\n      includeAgentName: this.options.includeAgentName,\n      name: this.options.name,\n      responseFormat: this.options.responseFormat,\n      middleware: this.options.middleware,\n      toolClasses,\n      shouldReturnDirect,\n      signal: this.options.signal,\n      wrapModelCallHookMiddleware,\n    });\n\n    const middlewareNames = new Set<string>();\n    const middleware = this.options.middleware ?? [];\n    for (let i = 0; i < middleware.length; i++) {\n      let beforeAgentNode: BeforeAgentNode | undefined;\n      let beforeModelNode: BeforeModelNode | undefined;\n      let afterModelNode: AfterModelNode | undefined;\n      let afterAgentNode: AfterAgentNode | undefined;\n      const m = middleware[i];\n      if (middlewareNames.has(m.name)) {\n        throw new Error(`Middleware ${m.name} is defined multiple times`);\n      }\n\n      middlewareNames.add(m.name);\n      if (m.beforeAgent) {\n        beforeAgentNode = new BeforeAgentNode(m);\n        const name = `${m.name}.before_agent`;\n        beforeAgentNodes.push({\n          index: i,\n          name,\n          allowed: getHookConstraint(m.beforeAgent),\n        });\n        allNodeWorkflows.addNode(\n          name,\n          beforeAgentNode,\n          beforeAgentNode.nodeOptions\n        );\n      }\n      if (m.beforeModel) {\n        beforeModelNode = new BeforeModelNode(m);\n        const name = `${m.name}.before_model`;\n        beforeModelNodes.push({\n          index: i,\n          name,\n          allowed: getHookConstraint(m.beforeModel),\n        });\n        allNodeWorkflows.addNode(\n          name,\n          beforeModelNode,\n          beforeModelNode.nodeOptions\n        );\n      }\n      if (m.afterModel) {\n        afterModelNode = new AfterModelNode(m);\n        const name = `${m.name}.after_model`;\n        afterModelNodes.push({\n          index: i,\n          name,\n          allowed: getHookConstraint(m.afterModel),\n        });\n        allNodeWorkflows.addNode(\n          name,\n          afterModelNode,\n          afterModelNode.nodeOptions\n        );\n      }\n      if (m.afterAgent) {\n        afterAgentNode = new AfterAgentNode(m);\n        const name = `${m.name}.after_agent`;\n        afterAgentNodes.push({\n          index: i,\n          name,\n          allowed: getHookConstraint(m.afterAgent),\n        });\n        allNodeWorkflows.addNode(\n          name,\n          afterAgentNode,\n          afterAgentNode.nodeOptions\n        );\n      }\n\n      if (m.wrapModelCall) {\n        wrapModelCallHookMiddleware.push(m);\n      }\n    }\n\n    /**\n     * Add Nodes\n     */\n    allNodeWorkflows.addNode(AGENT_NODE_NAME, this.#agentNode);\n\n    /**\n     * Check if any middleware has wrapToolCall defined.\n     * If so, we need to create a ToolNode even without pre-registered tools\n     * to allow middleware to handle dynamically registered tools.\n     */\n    const hasWrapToolCallMiddleware = middleware.some((m) => m.wrapToolCall);\n    const clientTools = toolClasses.filter(isClientTool);\n\n    /**\n     * Create ToolNode if we have client-side tools OR if middleware defines wrapToolCall\n     * (which may handle dynamically registered tools)\n     */\n    if (clientTools.length > 0 || hasWrapToolCallMiddleware) {\n      const toolNode = new ToolNode(clientTools, {\n        signal: this.options.signal,\n        wrapToolCall: wrapToolCall(middleware),\n      });\n      allNodeWorkflows.addNode(TOOLS_NODE_NAME, toolNode);\n    }\n\n    /**\n     * Add Edges\n     */\n    // Determine the entry node (runs once at start): before_agent -> before_model -> model_request\n    let entryNode: string;\n    if (beforeAgentNodes.length > 0) {\n      entryNode = beforeAgentNodes[0].name;\n    } else if (beforeModelNodes.length > 0) {\n      entryNode = beforeModelNodes[0].name;\n    } else {\n      entryNode = AGENT_NODE_NAME;\n    }\n\n    // Determine the loop entry node (beginning of agent loop, excludes before_agent)\n    // This is where tools will loop back to for the next iteration\n    const loopEntryNode =\n      beforeModelNodes.length > 0 ? beforeModelNodes[0].name : AGENT_NODE_NAME;\n\n    // Determine the exit node (runs once at end): after_agent or END\n    const exitNode =\n      afterAgentNodes.length > 0\n        ? afterAgentNodes[afterAgentNodes.length - 1].name\n        : END;\n\n    allNodeWorkflows.addEdge(START, entryNode);\n\n    /**\n     * Determine if we have tools available for routing.\n     * This includes both registered client tools AND dynamic tools via middleware.\n     */\n    const hasToolsAvailable =\n      clientTools.length > 0 || hasWrapToolCallMiddleware;\n\n    // Connect beforeAgent nodes (run once at start)\n    for (let i = 0; i < beforeAgentNodes.length; i++) {\n      const node = beforeAgentNodes[i];\n      const current = node.name;\n      const isLast = i === beforeAgentNodes.length - 1;\n      const nextDefault = isLast ? loopEntryNode : beforeAgentNodes[i + 1].name;\n\n      if (node.allowed && node.allowed.length > 0) {\n        const allowedMapped = node.allowed\n          .map((t) => parseJumpToTarget(t))\n          .filter((dest) => dest !== TOOLS_NODE_NAME || hasToolsAvailable);\n        // Replace END with exitNode (which could be an afterAgent node)\n        const destinations = Array.from(\n          new Set([\n            nextDefault,\n            ...allowedMapped.map((dest) => (dest === END ? exitNode : dest)),\n          ])\n        ) as BaseGraphDestination[];\n\n        allNodeWorkflows.addConditionalEdges(\n          current,\n          this.#createBeforeAgentRouter(\n            clientTools,\n            nextDefault,\n            exitNode,\n            hasToolsAvailable\n          ),\n          destinations\n        );\n      } else {\n        allNodeWorkflows.addEdge(current, nextDefault);\n      }\n    }\n\n    // Connect beforeModel nodes; add conditional routing ONLY if allowed jumps are specified\n    for (let i = 0; i < beforeModelNodes.length; i++) {\n      const node = beforeModelNodes[i];\n      const current = node.name;\n      const isLast = i === beforeModelNodes.length - 1;\n      const nextDefault = isLast\n        ? AGENT_NODE_NAME\n        : beforeModelNodes[i + 1].name;\n\n      if (node.allowed && node.allowed.length > 0) {\n        const allowedMapped = node.allowed\n          .map((t) => parseJumpToTarget(t))\n          .filter((dest) => dest !== TOOLS_NODE_NAME || hasToolsAvailable);\n        const destinations = Array.from(\n          new Set([nextDefault, ...allowedMapped])\n        ) as BaseGraphDestination[];\n\n        allNodeWorkflows.addConditionalEdges(\n          current,\n          this.#createBeforeModelRouter(\n            clientTools,\n            nextDefault,\n            hasToolsAvailable\n          ),\n          destinations\n        );\n      } else {\n        allNodeWorkflows.addEdge(current, nextDefault);\n      }\n    }\n\n    // Connect agent to last afterModel node (for reverse order execution)\n    const lastAfterModelNode = afterModelNodes.at(-1);\n    if (afterModelNodes.length > 0 && lastAfterModelNode) {\n      allNodeWorkflows.addEdge(AGENT_NODE_NAME, lastAfterModelNode.name);\n    } else {\n      // If no afterModel nodes, connect model_request directly to model paths\n      const modelPaths = this.#getModelPaths(\n        clientTools,\n        false,\n        hasToolsAvailable\n      );\n      // Replace END with exitNode in destinations, since exitNode might be an afterAgent node\n      const destinations = modelPaths.map((p) =>\n        p === END ? exitNode : p\n      ) as BaseGraphDestination[];\n      if (destinations.length === 1) {\n        allNodeWorkflows.addEdge(AGENT_NODE_NAME, destinations[0]);\n      } else {\n        allNodeWorkflows.addConditionalEdges(\n          AGENT_NODE_NAME,\n          this.#createModelRouter(exitNode),\n          destinations\n        );\n      }\n    }\n\n    // Connect afterModel nodes in reverse sequence; add conditional routing ONLY if allowed jumps are specified per node\n    for (let i = afterModelNodes.length - 1; i > 0; i--) {\n      const node = afterModelNodes[i];\n      const current = node.name;\n      const nextDefault = afterModelNodes[i - 1].name;\n\n      if (node.allowed && node.allowed.length > 0) {\n        const allowedMapped = node.allowed\n          .map((t) => parseJumpToTarget(t))\n          .filter((dest) => dest !== TOOLS_NODE_NAME || hasToolsAvailable);\n        const destinations = Array.from(\n          new Set([nextDefault, ...allowedMapped])\n        ) as BaseGraphDestination[];\n\n        allNodeWorkflows.addConditionalEdges(\n          current,\n          this.#createAfterModelSequenceRouter(\n            clientTools,\n            node.allowed,\n            nextDefault,\n            hasToolsAvailable\n          ),\n          destinations\n        );\n      } else {\n        allNodeWorkflows.addEdge(current, nextDefault);\n      }\n    }\n\n    // Connect first afterModel node (last to execute) to model paths with jumpTo support\n    if (afterModelNodes.length > 0) {\n      const firstAfterModel = afterModelNodes[0];\n      const firstAfterModelNode = firstAfterModel.name;\n\n      // Include exitNode in the paths since afterModel should be able to route to after_agent or END\n      const modelPaths = this.#getModelPaths(\n        clientTools,\n        true,\n        hasToolsAvailable\n      ).filter((p) => p !== TOOLS_NODE_NAME || hasToolsAvailable);\n\n      const allowJump = Boolean(\n        firstAfterModel.allowed && firstAfterModel.allowed.length > 0\n      );\n\n      // Replace END with exitNode in destinations, since exitNode might be an afterAgent node\n      const destinations = modelPaths.map((p) =>\n        p === END ? exitNode : p\n      ) as BaseGraphDestination[];\n\n      allNodeWorkflows.addConditionalEdges(\n        firstAfterModelNode,\n        this.#createAfterModelRouter(\n          clientTools,\n          allowJump,\n          exitNode,\n          hasToolsAvailable\n        ),\n        destinations\n      );\n    }\n\n    // Connect afterAgent nodes (run once at end, in reverse order like afterModel)\n    for (let i = afterAgentNodes.length - 1; i > 0; i--) {\n      const node = afterAgentNodes[i];\n      const current = node.name;\n      const nextDefault = afterAgentNodes[i - 1].name;\n\n      if (node.allowed && node.allowed.length > 0) {\n        const allowedMapped = node.allowed\n          .map((t) => parseJumpToTarget(t))\n          .filter((dest) => dest !== TOOLS_NODE_NAME || hasToolsAvailable);\n        const destinations = Array.from(\n          new Set([nextDefault, ...allowedMapped])\n        ) as BaseGraphDestination[];\n\n        allNodeWorkflows.addConditionalEdges(\n          current,\n          this.#createAfterModelSequenceRouter(\n            clientTools,\n            node.allowed,\n            nextDefault,\n            hasToolsAvailable\n          ),\n          destinations\n        );\n      } else {\n        allNodeWorkflows.addEdge(current, nextDefault);\n      }\n    }\n\n    // Connect the first afterAgent node (last to execute) to END\n    if (afterAgentNodes.length > 0) {\n      const firstAfterAgent = afterAgentNodes[0];\n      const firstAfterAgentNode = firstAfterAgent.name;\n\n      if (firstAfterAgent.allowed && firstAfterAgent.allowed.length > 0) {\n        const allowedMapped = firstAfterAgent.allowed\n          .map((t) => parseJumpToTarget(t))\n          .filter((dest) => dest !== TOOLS_NODE_NAME || hasToolsAvailable);\n\n        /**\n         * For after_agent, only use explicitly allowed destinations (don't add loopEntryNode)\n         * The default destination (when no jump occurs) should be END\n         */\n        const destinations = Array.from(\n          new Set([END, ...allowedMapped])\n        ) as BaseGraphDestination[];\n\n        allNodeWorkflows.addConditionalEdges(\n          firstAfterAgentNode,\n          this.#createAfterModelSequenceRouter(\n            clientTools,\n            firstAfterAgent.allowed,\n            END as string,\n            hasToolsAvailable\n          ),\n          destinations\n        );\n      } else {\n        allNodeWorkflows.addEdge(firstAfterAgentNode, END);\n      }\n    }\n\n    /**\n     * add edges for tools node (includes both registered tools and dynamic tools via middleware)\n     */\n    if (hasToolsAvailable) {\n      // Tools should return to loop entry node (not including before_agent)\n      const toolReturnTarget = loopEntryNode;\n\n      if (shouldReturnDirect.size > 0) {\n        allNodeWorkflows.addConditionalEdges(\n          TOOLS_NODE_NAME,\n          this.#createToolsRouter(\n            shouldReturnDirect,\n            exitNode,\n            toolReturnTarget\n          ),\n          [toolReturnTarget, exitNode as string]\n        );\n      } else {\n        allNodeWorkflows.addEdge(TOOLS_NODE_NAME, toolReturnTarget);\n      }\n    }\n\n    /**\n     * compile the graph with native + user-defined stream transformers\n     */\n    const middlewareStreamTransformers = (\n      this.options.middleware ?? []\n    ).flatMap((m) => m.streamTransformers ?? []);\n    const compileTransformers = [\n      /* built-in stream transformers */\n      createToolCallTransformer([]),\n      createSubagentTransformer([]),\n      /* middleware stream transformers */\n      ...middlewareStreamTransformers,\n      /* user-defined stream transformers */\n      ...(this.options.streamTransformers ?? []),\n    ];\n\n    this.#graph = allNodeWorkflows.compile({\n      checkpointer: this.options.checkpointer,\n      store: this.options.store,\n      name: this.options.name,\n      description: this.options.description,\n      transformers: compileTransformers,\n    }) as unknown as AgentGraph<Types>;\n\n    /**\n     * LangGraph API resolves exported agents by unwrapping ReactAgent to the\n     * inner compiled graph (see langgraph-api load.utils `afterResolve`) and\n     * calls streamEvents on that pregel directly. That path only sees config\n     * baked into the graph via `.withConfig()`, not ReactAgent's #defaultConfig\n     * merged at invoke/stream time — so propagate static defaults here.\n     */\n    const graphDefaultConfig = toGraphDefaultConfig(this.#defaultConfig);\n    if (Object.keys(graphDefaultConfig).length > 0) {\n      this.#graph = this.#graph.withConfig(graphDefaultConfig);\n    }\n  }\n\n  /**\n   * Get the compiled {@link https://docs.langchain.com/oss/javascript/langgraph/use-graph-api | StateGraph}.\n   */\n  get graph(): AgentGraph<Types> {\n    return this.#graph;\n  }\n\n  get checkpointer(): BaseCheckpointSaver | boolean | undefined {\n    return this.#graph.checkpointer;\n  }\n\n  set checkpointer(value: BaseCheckpointSaver | boolean | undefined) {\n    this.#graph.checkpointer = value;\n  }\n\n  get store(): BaseStore | undefined {\n    return this.#graph.store;\n  }\n\n  set store(value: BaseStore | undefined) {\n    this.#graph.store = value;\n  }\n\n  /**\n   * Creates a new ReactAgent with the given config merged into the existing config.\n   * Follows the same pattern as LangGraph's Pregel.withConfig().\n   *\n   * The merged config is applied as a default that gets merged with any config\n   * passed at invocation time (invoke/stream). Invocation-time config takes precedence.\n   *\n   * @param config - Configuration to merge with existing config\n   * @returns A new ReactAgent instance with the merged configuration\n   *\n   * @example\n   * ```typescript\n   * const agent = createAgent({ model: \"gpt-4o\", tools: [...] });\n   *\n   * // Set a default recursion limit\n   * const configuredAgent = agent.withConfig({ recursionLimit: 1000 });\n   *\n   * // Chain multiple configs\n   * const debugAgent = agent\n   *   .withConfig({ recursionLimit: 1000 })\n   *   .withConfig({ tags: [\"debug\"] });\n   * ```\n   */\n  withConfig(\n    config: Omit<RunnableConfig, \"store\" | \"writer\" | \"interrupt\">\n  ): ReactAgent<Types> {\n    return new ReactAgent(\n      this.options,\n      mergeConfigs(this.#defaultConfig, config)\n    );\n  }\n\n  /**\n   * Get possible edge destinations from model node.\n   * @param toolClasses names of tools to call\n   * @param includeModelRequest whether to include \"model_request\" as a valid path (for jumpTo routing)\n   * @param hasToolsAvailable whether tools are available (includes dynamic tools via middleware)\n   * @returns list of possible edge destinations\n   */\n  #getModelPaths(\n    toolClasses: (ClientTool | ServerTool)[],\n    includeModelRequest: boolean = false,\n    hasToolsAvailable: boolean = toolClasses.length > 0\n  ): BaseGraphDestination[] {\n    const paths: BaseGraphDestination[] = [];\n    if (hasToolsAvailable) {\n      paths.push(TOOLS_NODE_NAME);\n    }\n\n    if (includeModelRequest) {\n      paths.push(AGENT_NODE_NAME);\n    }\n\n    paths.push(END);\n\n    return paths;\n  }\n\n  /**\n   * Create routing function for tools node conditional edges.\n   */\n  #createToolsRouter(\n    shouldReturnDirect: Set<string>,\n    exitNode: string | typeof END,\n    toolReturnTarget: string\n  ) {\n    return (state: Record<string, unknown>) => {\n      const builtInState = state as unknown as BuiltInState;\n      const messages = builtInState.messages;\n      const lastMessage = messages[messages.length - 1];\n\n      // Check if we just executed a returnDirect tool\n      if (\n        ToolMessage.isInstance(lastMessage) &&\n        lastMessage.name &&\n        shouldReturnDirect.has(lastMessage.name)\n      ) {\n        // If we have a response format, route to agent to generate structured response\n        // Otherwise, return directly to exit node (could be after_agent or END)\n        return this.options.responseFormat ? toolReturnTarget : exitNode;\n      }\n\n      // For non-returnDirect tools, route back to loop entry node (could be middleware or agent)\n      return toolReturnTarget;\n    };\n  }\n\n  /**\n   * Create routing function for model node conditional edges.\n   * @param exitNode - The exit node to route to (could be after_agent or END)\n   */\n  #createModelRouter(exitNode: string | typeof END = END) {\n    /**\n     * determine if the agent should continue or not\n     */\n    return (state: Record<string, unknown>) => {\n      const builtInState = state as unknown as BuiltInState;\n      const messages = builtInState.messages;\n      const lastMessage = messages.at(-1);\n\n      if (\n        !AIMessage.isInstance(lastMessage) ||\n        !lastMessage.tool_calls ||\n        lastMessage.tool_calls.length === 0\n      ) {\n        return exitNode;\n      }\n\n      // Check if all tool calls are for structured response extraction\n      const hasOnlyStructuredResponseCalls = lastMessage.tool_calls.every(\n        (toolCall) => toolCall.name.startsWith(\"extract-\")\n      );\n\n      if (hasOnlyStructuredResponseCalls) {\n        // If all tool calls are for structured response extraction, go to exit node\n        // The AgentNode will handle these internally and return the structured response\n        return exitNode;\n      }\n\n      /**\n       * The tool node processes a single message.\n       */\n      if (this.#toolBehaviorVersion === \"v1\") {\n        return TOOLS_NODE_NAME;\n      }\n\n      /**\n       * Route to tools node (filter out any structured response tool calls)\n       */\n      const regularToolCalls = lastMessage.tool_calls.filter(\n        (toolCall) => !toolCall.name.startsWith(\"extract-\")\n      );\n\n      if (regularToolCalls.length === 0) {\n        return exitNode;\n      }\n\n      return regularToolCalls.map(\n        (toolCall) =>\n          new Send(TOOLS_NODE_NAME, { ...state, lg_tool_call: toolCall })\n      );\n    };\n  }\n\n  /**\n   * Create routing function for jumpTo functionality after afterModel hooks.\n   *\n   * This router checks if the `jumpTo` property is set in the state after afterModel middleware\n   * execution. If set, it routes to the specified target (\"model_request\" or \"tools\").\n   * If not set, it falls back to the normal model routing logic for afterModel context.\n   *\n   * The jumpTo property is automatically cleared after use to prevent infinite loops.\n   *\n   * @param toolClasses - Available tool classes for validation\n   * @param allowJump - Whether jumping is allowed\n   * @param exitNode - The exit node to route to (could be after_agent or END)\n   * @param hasToolsAvailable - Whether tools are available (includes dynamic tools via middleware)\n   * @returns Router function that handles jumpTo logic and normal routing\n   */\n  #createAfterModelRouter(\n    toolClasses: (ClientTool | ServerTool)[],\n    allowJump: boolean,\n    exitNode: string | typeof END,\n    hasToolsAvailable: boolean = toolClasses.length > 0\n  ) {\n    const hasStructuredResponse = Boolean(this.options.responseFormat);\n\n    return (state: Record<string, unknown>) => {\n      const builtInState = state as unknown as Omit<BuiltInState, \"jumpTo\"> & {\n        jumpTo?: JumpTo;\n      };\n      // First, check if we just processed a structured response\n      // If so, ignore any existing jumpTo and go to exitNode\n      const messages = builtInState.messages;\n      const lastMessage = messages.at(-1);\n      if (\n        AIMessage.isInstance(lastMessage) &&\n        (!lastMessage.tool_calls || lastMessage.tool_calls.length === 0)\n      ) {\n        return exitNode;\n      }\n\n      // Check if jumpTo is set in the state and allowed\n      if (allowJump && builtInState.jumpTo) {\n        const destination = parseJumpToTarget(builtInState.jumpTo);\n        if (destination === END) {\n          return exitNode;\n        }\n        if (destination === TOOLS_NODE_NAME) {\n          // If trying to jump to tools but no tools are available, go to exitNode\n          if (!hasToolsAvailable) {\n            return exitNode;\n          }\n          return new Send(TOOLS_NODE_NAME, { ...state, jumpTo: undefined });\n        }\n        // destination === \"model_request\"\n        return new Send(AGENT_NODE_NAME, { ...state, jumpTo: undefined });\n      }\n\n      // check if there are pending tool calls\n      const toolMessages = messages.filter(ToolMessage.isInstance);\n      const lastAiMessage = messages.filter(AIMessage.isInstance).at(-1);\n      const pendingToolCalls = lastAiMessage?.tool_calls?.filter(\n        (call) => !toolMessages.some((m) => m.tool_call_id === call.id)\n      );\n      if (pendingToolCalls && pendingToolCalls.length > 0) {\n        /**\n         * v1: route the full message to the ToolNode; it filters already-processed\n         * calls internally and runs the remaining ones via Promise.all.\n         * v2: dispatch each pending call as a separate Send task.\n         */\n        if (this.#toolBehaviorVersion === \"v1\") {\n          return TOOLS_NODE_NAME;\n        }\n        return pendingToolCalls.map(\n          (toolCall) =>\n            new Send(TOOLS_NODE_NAME, { ...state, lg_tool_call: toolCall })\n        );\n      }\n\n      // if we exhausted all tool calls, but still have no structured response tool calls,\n      // go back to model_request\n      const hasStructuredResponseCalls = lastAiMessage?.tool_calls?.some(\n        (toolCall) => toolCall.name.startsWith(\"extract-\")\n      );\n\n      if (\n        pendingToolCalls &&\n        pendingToolCalls.length === 0 &&\n        !hasStructuredResponseCalls &&\n        hasStructuredResponse\n      ) {\n        return AGENT_NODE_NAME;\n      }\n\n      if (\n        !AIMessage.isInstance(lastMessage) ||\n        !lastMessage.tool_calls ||\n        lastMessage.tool_calls.length === 0\n      ) {\n        return exitNode;\n      }\n\n      // Check if all tool calls are for structured response extraction\n      const hasOnlyStructuredResponseCalls = lastMessage.tool_calls.every(\n        (toolCall) => toolCall.name.startsWith(\"extract-\")\n      );\n\n      // Check if there are any regular tool calls (non-structured response)\n      const hasRegularToolCalls = lastMessage.tool_calls.some(\n        (toolCall) => !toolCall.name.startsWith(\"extract-\")\n      );\n\n      if (hasOnlyStructuredResponseCalls || !hasRegularToolCalls) {\n        return exitNode;\n      }\n\n      /**\n       * v1: route the full AIMessage to a single ToolNode invocation so all\n       * tool calls run concurrently via Promise.all.\n       *\n       * v2: dispatch each regular tool call as a separate Send task, matching\n       * the behaviour of #createModelRouter when no afterModel middleware is\n       * present.\n       */\n      if (this.#toolBehaviorVersion === \"v1\") {\n        return TOOLS_NODE_NAME;\n      }\n\n      const regularToolCalls = (lastMessage as AIMessage).tool_calls!.filter(\n        (toolCall) => !toolCall.name.startsWith(\"extract-\")\n      );\n\n      if (regularToolCalls.length === 0) {\n        return exitNode;\n      }\n\n      return regularToolCalls.map(\n        (toolCall) =>\n          new Send(TOOLS_NODE_NAME, { ...state, lg_tool_call: toolCall })\n      );\n    };\n  }\n\n  /**\n   * Router for afterModel sequence nodes (connecting later middlewares to earlier ones),\n   * honoring allowed jump targets and defaulting to the next node.\n   * @param toolClasses - Available tool classes for validation\n   * @param allowed - List of allowed jump targets\n   * @param nextDefault - Default node to route to\n   * @param hasToolsAvailable - Whether tools are available (includes dynamic tools via middleware)\n   */\n  #createAfterModelSequenceRouter(\n    toolClasses: (ClientTool | ServerTool)[],\n    allowed: string[],\n    nextDefault: string,\n    hasToolsAvailable: boolean = toolClasses.length > 0\n  ) {\n    const allowedSet = new Set(allowed.map((t) => parseJumpToTarget(t)));\n    return (state: Record<string, unknown>) => {\n      const builtInState = state as unknown as BuiltInState;\n      if (builtInState.jumpTo) {\n        const dest = parseJumpToTarget(builtInState.jumpTo);\n        if (dest === END && allowedSet.has(END)) {\n          return END;\n        }\n        if (dest === TOOLS_NODE_NAME && allowedSet.has(TOOLS_NODE_NAME)) {\n          if (!hasToolsAvailable) return END;\n          return new Send(TOOLS_NODE_NAME, { ...state, jumpTo: undefined });\n        }\n        if (dest === AGENT_NODE_NAME && allowedSet.has(AGENT_NODE_NAME)) {\n          return new Send(AGENT_NODE_NAME, { ...state, jumpTo: undefined });\n        }\n      }\n      return nextDefault;\n    };\n  }\n\n  /**\n   * Create routing function for jumpTo functionality after beforeAgent hooks.\n   * Falls back to the default next node if no jumpTo is present.\n   * When jumping to END, routes to exitNode (which could be an afterAgent node).\n   * @param toolClasses - Available tool classes for validation\n   * @param nextDefault - Default node to route to\n   * @param exitNode - Exit node to route to (could be after_agent or END)\n   * @param hasToolsAvailable - Whether tools are available (includes dynamic tools via middleware)\n   */\n  #createBeforeAgentRouter(\n    toolClasses: (ClientTool | ServerTool)[],\n    nextDefault: string,\n    exitNode: string | typeof END,\n    hasToolsAvailable: boolean = toolClasses.length > 0\n  ) {\n    return (state: Record<string, unknown>) => {\n      const builtInState = state as unknown as BuiltInState;\n      if (!builtInState.jumpTo) {\n        return nextDefault;\n      }\n      const destination = parseJumpToTarget(builtInState.jumpTo);\n      if (destination === END) {\n        /**\n         * When beforeAgent jumps to END, route to exitNode (first afterAgent node)\n         */\n        return exitNode;\n      }\n      if (destination === TOOLS_NODE_NAME) {\n        if (!hasToolsAvailable) {\n          return exitNode;\n        }\n        return new Send(TOOLS_NODE_NAME, { ...state, jumpTo: undefined });\n      }\n      return new Send(AGENT_NODE_NAME, { ...state, jumpTo: undefined });\n    };\n  }\n\n  /**\n   * Create routing function for jumpTo functionality after beforeModel hooks.\n   * Falls back to the default next node if no jumpTo is present.\n   * @param toolClasses - Available tool classes for validation\n   * @param nextDefault - Default node to route to\n   * @param hasToolsAvailable - Whether tools are available (includes dynamic tools via middleware)\n   */\n  #createBeforeModelRouter(\n    toolClasses: (ClientTool | ServerTool)[],\n    nextDefault: string,\n    hasToolsAvailable: boolean = toolClasses.length > 0\n  ) {\n    return (state: Record<string, unknown>) => {\n      const builtInState = state as unknown as BuiltInState;\n      if (!builtInState.jumpTo) {\n        return nextDefault;\n      }\n      const destination = parseJumpToTarget(builtInState.jumpTo);\n      if (destination === END) {\n        return END;\n      }\n      if (destination === TOOLS_NODE_NAME) {\n        if (!hasToolsAvailable) {\n          return END;\n        }\n        return new Send(TOOLS_NODE_NAME, { ...state, jumpTo: undefined });\n      }\n      return new Send(AGENT_NODE_NAME, { ...state, jumpTo: undefined });\n    };\n  }\n\n  /**\n   * Initialize middleware states if not already present in the input state.\n   */\n  async #initializeMiddlewareStates(\n    state: InvokeStateParameter<Types>,\n    config: RunnableConfig\n  ): Promise<InvokeStateParameter<Types>> {\n    if (\n      !this.options.middleware ||\n      this.options.middleware.length === 0 ||\n      state instanceof Command ||\n      !state\n    ) {\n      return state;\n    }\n\n    const defaultStates = await initializeMiddlewareStates(\n      this.options.middleware,\n      state\n    );\n    const threadState = await this.#graph\n      .getState(config)\n      .catch(() => ({ values: {} }));\n    const updatedState = {\n      ...threadState.values,\n      ...state,\n    } as InvokeStateParameter<Types>;\n    if (!updatedState) {\n      return updatedState;\n    }\n\n    // Only add defaults for keys that don't exist in current state\n    for (const [key, value] of Object.entries(defaultStates)) {\n      if (!(key in updatedState)) {\n        updatedState[key as keyof typeof updatedState] = value;\n      }\n    }\n\n    return updatedState;\n  }\n\n  /**\n   * Executes the agent with the given state and returns the final state after all processing.\n   *\n   * This method runs the agent's entire workflow synchronously, including:\n   * - Processing the input messages through any configured middleware\n   * - Calling the language model to generate responses\n   * - Executing any tool calls made by the model\n   * - Running all middleware hooks (beforeModel, afterModel, etc.)\n   *\n   * @param state - The initial state for the agent execution. Can be:\n   *   - An object containing `messages` array and any middleware-specific state properties\n   *   - A Command object for more advanced control flow\n   *\n   * @param config - Optional runtime configuration including:\n   * @param config.context - The context for the agent execution.\n   * @param config.configurable - LangGraph configuration options like `thread_id`, `run_id`, etc.\n   * @param config.store - The store for the agent execution for persisting state, see more in {@link https://docs.langchain.com/oss/javascript/langgraph/memory#memory-storage | Memory storage}.\n   * @param config.signal - An optional {@link https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal | `AbortSignal`} for the agent execution.\n   * @param config.recursionLimit - The recursion limit for the agent execution.\n   *\n   * @returns A Promise that resolves to the final agent state after execution completes.\n   *          The returned state includes:\n   *          - a `messages` property containing an array with all messages (input, AI responses, tool calls/results)\n   *          - a `structuredResponse` property containing the structured response (if configured)\n   *          - all state values defined in the middleware\n   *\n   * @example\n   * ```typescript\n   * const agent = new ReactAgent({\n   *   llm: myModel,\n   *   tools: [calculator, webSearch],\n   *   responseFormat: z.object({\n   *     weather: z.string(),\n   *   }),\n   * });\n   *\n   * const result = await agent.invoke({\n   *   messages: [{ role: \"human\", content: \"What's the weather in Paris?\" }]\n   * });\n   *\n   * console.log(result.structuredResponse.weather); // outputs: \"It's sunny and 75°F.\"\n   * ```\n   */\n  async invoke(\n    state: InvokeStateParameter<Types>,\n    config?: InvokeConfiguration<\n      InferContextInput<\n        Types[\"Context\"] extends AnyAnnotationRoot | InteropZodObject\n          ? Types[\"Context\"]\n          : AnyAnnotationRoot\n      > &\n        InferMiddlewareContextInputs<Types[\"Middleware\"]>\n    >\n  ) {\n    type FullState = MergedAgentState<Types>;\n    const mergedConfig = mergeConfigs(this.#defaultConfig, config);\n    const initializedState = await this.#initializeMiddlewareStates(\n      state,\n      mergedConfig as RunnableConfig\n    );\n\n    return this.#graph.invoke(\n      initializedState,\n      mergedConfig as unknown as InferContextInput<\n        Types[\"Context\"] extends AnyAnnotationRoot | InteropZodObject\n          ? Types[\"Context\"]\n          : AnyAnnotationRoot\n      > &\n        InferMiddlewareContextInputs<Types[\"Middleware\"]>\n    ) as Promise<FullState>;\n  }\n\n  /**\n   * Executes the agent with streaming, returning an async iterable of state updates as they occur.\n   *\n   * This method runs the agent's workflow similar to `invoke`, but instead of waiting for\n   * completion, it streams high-level state updates in real-time. This allows you to:\n   * - Display intermediate results to users as they're generated\n   * - Monitor the agent's progress through each step\n   * - React to state changes as nodes complete\n   *\n   * For more granular event-level streaming (like individual LLM tokens), use `streamEvents` instead.\n   *\n   * @param state - The initial state for the agent execution. Can be:\n   *   - An object containing `messages` array and any middleware-specific state properties\n   *   - A Command object for more advanced control flow\n   *\n   * @param config - Optional runtime configuration including:\n   * @param config.context - The context for the agent execution.\n   * @param config.configurable - LangGraph configuration options like `thread_id`, `run_id`, etc.\n   * @param config.store - The store for the agent execution for persisting state, see more in {@link https://docs.langchain.com/oss/javascript/langgraph/memory#memory-storage | Memory storage}.\n   * @param config.signal - An optional {@link https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal | `AbortSignal`} for the agent execution.\n   * @param config.streamMode - The streaming mode for the agent execution, see more in {@link https://docs.langchain.com/oss/javascript/langgraph/streaming#supported-stream-modes | Supported stream modes}.\n   * @param config.recursionLimit - The recursion limit for the agent execution.\n   *\n   * @returns A Promise that resolves to an IterableReadableStream of state updates.\n   *          Each update contains the current state after a node completes.\n   *\n   * @example\n   * ```typescript\n   * const agent = new ReactAgent({\n   *   llm: myModel,\n   *   tools: [calculator, webSearch]\n   * });\n   *\n   * const stream = await agent.stream({\n   *   messages: [{ role: \"human\", content: \"What's 2+2 and the weather in NYC?\" }]\n   * });\n   *\n   * for await (const chunk of stream) {\n   *   console.log(chunk); // State update from each node\n   * }\n   * ```\n   */\n  async stream<\n    TStreamMode extends StreamMode | StreamMode[] | undefined,\n    TSubgraphs extends boolean,\n    TEncoding extends \"text/event-stream\" | undefined,\n  >(\n    state: InvokeStateParameter<Types>,\n    config?: StreamConfiguration<\n      InferContextInput<\n        Types[\"Context\"] extends AnyAnnotationRoot | InteropZodObject\n          ? Types[\"Context\"]\n          : AnyAnnotationRoot\n      > &\n        InferMiddlewareContextInputs<Types[\"Middleware\"]>,\n      TStreamMode,\n      TSubgraphs,\n      TEncoding\n    >\n  ) {\n    const mergedConfig = mergeConfigs(this.#defaultConfig, config);\n    const initializedState = await this.#initializeMiddlewareStates(\n      state,\n      mergedConfig as RunnableConfig\n    );\n    return this.#graph.stream(\n      initializedState,\n      mergedConfig as Record<string, any>\n    ) as Promise<\n      IterableReadableStream<\n        StreamOutputMap<\n          TStreamMode,\n          TSubgraphs,\n          MergedAgentState<Types>,\n          MergedAgentState<Types>,\n          string,\n          unknown,\n          unknown,\n          TEncoding\n        >\n      >\n    >;\n  }\n\n  /**\n   * Executes the agent with the v3 streaming interface, returning an\n   * {@link AgentRunStream} that provides ergonomic, typed projections for\n   * messages, tool calls, and middleware events — without requiring knowledge\n   * of Pregel channels, stream modes, or namespace routing.\n   *\n   * Pass `version: \"v3\"` to opt into this projection-oriented stream. Omitting\n   * `version` preserves the legacy internal LangGraph event-stream behavior\n   * for compatibility with LangGraph Platform integrations.\n   *\n   * This v3 stream is experimental and its API may change in future releases.\n   * It will become the default in a future major release.\n   *\n   * @param state - The initial state for the agent execution. Can be:\n   *   - An object containing `messages` array and any middleware-specific state properties\n   *   - A Command object for more advanced control flow\n   *\n   * @param config - Runtime configuration including:\n   * @param config.version - Must be `\"v3\"` to use the {@link AgentRunStream}\n   *   interface. The default legacy event stream is maintained for internal\n   *   integrations and should not be used for new user-facing agent streaming.\n   * @param config.context - The context for the agent execution.\n   * @param config.configurable - LangGraph configuration options like `thread_id`, `run_id`, etc.\n   * @param config.store - The store for the agent execution for persisting state.\n   * @param config.signal - An optional AbortSignal for the agent execution.\n   * @param config.recursionLimit - The recursion limit for the agent execution.\n   * @param config.transformers - Additional call-site stream transformers. These\n   *   run after the built-in agent transformers and any transformers registered\n   *   at creation time via `createAgent({ streamTransformers })`.\n   *\n   * @returns A Promise that resolves to an {@link AgentRunStream} providing:\n   *   - `run.messages` — all AI message lifecycles with streaming `.text` and `.reasoning`\n   *   - `run.toolCalls` — individual tool call streams with `.input`, `.output`, `.status`\n   *   - `run.middleware` — middleware lifecycle events (before/after agent/model)\n   *   - `run.values` — state snapshots (async iterable + promise-like)\n   *   - `run.output` — final agent state when the run completes\n   *   - `run.subgraphs` — child subgraph run streams\n   *   - `run.extensions` — merged projections from user-supplied transformers\n   *\n   * @example\n   * ```typescript\n   * const run = await agent.streamEvents(\n   *   {\n   *     messages: [{ role: \"user\", content: \"What's the weather in Paris?\" }],\n   *   },\n   *   { version: \"v3\" }\n   * );\n   *\n   * // Stream all messages\n   * for await (const msg of run.messages) {\n   *   for await (const token of msg.text) {\n   *     process.stdout.write(token);\n   *   }\n   * }\n   *\n   * // Observe tool calls\n   * for await (const call of run.toolCalls) {\n   *   console.log(`Tool: ${call.name}`, call.input);\n   *   console.log(`Result:`, await call.output);\n   * }\n   *\n   * // Get final state\n   * const state = await run.output;\n   * ```\n   */\n  streamEvents(\n    state: InvokeStateParameter<Types>,\n    config: InvokeConfiguration<\n      InferContextInput<\n        Types[\"Context\"] extends AnyAnnotationRoot | InteropZodObject\n          ? Types[\"Context\"]\n          : AnyAnnotationRoot\n      > &\n        InferMiddlewareContextInputs<Types[\"Middleware\"]>\n    > & {\n      version: \"v3\";\n      transformers?: ReadonlyArray<() => StreamTransformer<any>>;\n    }\n  ): Promise<\n    AgentRunStream<\n      MergedAgentState<Types>,\n      Types[\"Tools\"],\n      InferStreamExtensions<Types[\"StreamTransformers\"]>\n    >\n  >;\n\n  streamEvents(\n    state: InvokeStateParameter<Types>,\n    config?: StreamConfiguration<\n      InferContextInput<\n        Types[\"Context\"] extends AnyAnnotationRoot | InteropZodObject\n          ? Types[\"Context\"]\n          : AnyAnnotationRoot\n      > &\n        InferMiddlewareContextInputs<Types[\"Middleware\"]>,\n      StreamMode | StreamMode[] | undefined,\n      boolean,\n      \"text/event-stream\" | undefined\n    > & { version?: \"v1\" | \"v2\" },\n    streamOptions?: Parameters<Runnable[\"streamEvents\"]>[2]\n  ): IterableReadableStream<StreamEvent>;\n\n  streamEvents(\n    state: InvokeStateParameter<Types>,\n    config:\n      | (StreamConfiguration<\n          InferContextInput<\n            Types[\"Context\"] extends AnyAnnotationRoot | InteropZodObject\n              ? Types[\"Context\"]\n              : AnyAnnotationRoot\n          > &\n            InferMiddlewareContextInputs<Types[\"Middleware\"]>,\n          StreamMode | StreamMode[] | undefined,\n          boolean,\n          \"text/event-stream\" | undefined\n        > & { version?: \"v1\" | \"v2\" })\n      | undefined,\n    streamOptions: Parameters<Runnable[\"streamEvents\"]>[2]\n  ): IterableReadableStream<StreamEvent>;\n\n  streamEvents(\n    state: InvokeStateParameter<Types>,\n    config?:\n      | (InvokeConfiguration<\n          InferContextInput<\n            Types[\"Context\"] extends AnyAnnotationRoot | InteropZodObject\n              ? Types[\"Context\"]\n              : AnyAnnotationRoot\n          > &\n            InferMiddlewareContextInputs<Types[\"Middleware\"]>\n        > & {\n          version: \"v3\";\n          transformers?: ReadonlyArray<() => StreamTransformer<any>>;\n        })\n      | (StreamConfiguration<\n          InferContextInput<\n            Types[\"Context\"] extends AnyAnnotationRoot | InteropZodObject\n              ? Types[\"Context\"]\n              : AnyAnnotationRoot\n          > &\n            InferMiddlewareContextInputs<Types[\"Middleware\"]>,\n          StreamMode | StreamMode[] | undefined,\n          boolean,\n          \"text/event-stream\" | undefined\n        > & { version?: \"v1\" | \"v2\" }),\n    streamOptions?: Parameters<Runnable[\"streamEvents\"]>[2]\n  ):\n    | Promise<\n        AgentRunStream<\n          MergedAgentState<Types>,\n          Types[\"Tools\"],\n          InferStreamExtensions<Types[\"StreamTransformers\"]>\n        >\n      >\n    | IterableReadableStream<StreamEvent> {\n    if (config?.version !== \"v3\" || streamOptions != null) {\n      const mergedConfig = mergeConfigs(this.#defaultConfig, config);\n      const version =\n        config?.version === \"v1\" || config?.version === \"v2\"\n          ? config.version\n          : \"v2\";\n      return this.#graph.streamEvents(\n        state,\n        {\n          ...(mergedConfig as Partial<\n            PregelOptions<\n              any,\n              any,\n              any,\n              StreamMode | StreamMode[] | undefined,\n              boolean,\n              \"text/event-stream\"\n            >\n          >),\n          version,\n        },\n        streamOptions\n      );\n    }\n\n    return (async () => {\n      type FullState = MergedAgentState<Types>;\n      const agentConfig = config as InvokeConfiguration<\n        InferContextInput<\n          Types[\"Context\"] extends AnyAnnotationRoot | InteropZodObject\n            ? Types[\"Context\"]\n            : AnyAnnotationRoot\n        > &\n          InferMiddlewareContextInputs<Types[\"Middleware\"]>\n      > & {\n        version: \"v3\";\n        transformers?: ReadonlyArray<() => StreamTransformer<any>>;\n      };\n\n      const {\n        transformers: callSiteTransformers,\n        version: _version,\n        ...restConfig\n      } = agentConfig ?? {};\n      const mergedConfig = mergeConfigs(this.#defaultConfig, restConfig);\n      const initializedState = await this.#initializeMiddlewareStates(\n        state,\n        mergedConfig as RunnableConfig\n      );\n\n      return (await this.#graph.streamEvents(initializedState, {\n        ...(mergedConfig as Record<string, any>),\n        version: \"v3\",\n        transformers: callSiteTransformers,\n      })) as unknown as AgentRunStream<\n        FullState,\n        Types[\"Tools\"],\n        InferStreamExtensions<Types[\"StreamTransformers\"]>\n      >;\n    })();\n  }\n\n  /**\n   * Visualize the graph as a PNG image.\n   * @param params - Parameters for the drawMermaidPng method.\n   * @param params.withStyles - Whether to include styles in the graph.\n   * @param params.curveStyle - The style of the graph's curves.\n   * @param params.nodeColors - The colors of the graph's nodes.\n   * @param params.wrapLabelNWords - The maximum number of words to wrap in a node's label.\n   * @param params.backgroundColor - The background color of the graph.\n   * @returns PNG image as a buffer\n   */\n  async drawMermaidPng(params?: {\n    withStyles?: boolean;\n    curveStyle?: string;\n    nodeColors?: Record<string, string>;\n    wrapLabelNWords?: number;\n    backgroundColor?: string;\n  }) {\n    const representation = await this.#graph.getGraphAsync();\n    const image = await representation.drawMermaidPng(params);\n    const arrayBuffer = await image.arrayBuffer();\n    const buffer = new Uint8Array(arrayBuffer);\n    return buffer;\n  }\n\n  /**\n   * Draw the graph as a Mermaid string.\n   * @param params - Parameters for the drawMermaid method.\n   * @param params.withStyles - Whether to include styles in the graph.\n   * @param params.curveStyle - The style of the graph's curves.\n   * @param params.nodeColors - The colors of the graph's nodes.\n   * @param params.wrapLabelNWords - The maximum number of words to wrap in a node's label.\n   * @param params.backgroundColor - The background color of the graph.\n   * @returns Mermaid string\n   */\n  async drawMermaid(params?: {\n    withStyles?: boolean;\n    curveStyle?: string;\n    nodeColors?: Record<string, string>;\n    wrapLabelNWords?: number;\n    backgroundColor?: string;\n  }) {\n    const representation = await this.#graph.getGraphAsync();\n    return representation.drawMermaid(params);\n  }\n\n  /**\n   * The following are internal methods to enable support for LangGraph Platform.\n   * They are not part of the createAgent public API.\n   *\n   * Note: we intentionally return as `never` to avoid type errors due to type inference.\n   */\n  /**\n   * @internal\n   */\n  getGraphAsync(config?: RunnableConfig) {\n    return this.#graph.getGraphAsync(config) as never;\n  }\n  /**\n   * @internal\n   */\n  getState(config: RunnableConfig, options?: GetStateOptions) {\n    return this.#graph.getState(config, options) as never;\n  }\n  /**\n   * @internal\n   */\n  getStateHistory(config: RunnableConfig, options?: CheckpointListOptions) {\n    return this.#graph.getStateHistory(config, options) as never;\n  }\n  /**\n   * @internal\n   */\n  getSubgraphs(namespace?: string, recurse?: boolean) {\n    return this.#graph.getSubgraphs(namespace, recurse) as never;\n  }\n  /**\n   * @internal\n   */\n  getSubgraphsAsync(namespace?: string, recurse?: boolean) {\n    return this.#graph.getSubgraphsAsync(namespace, recurse) as never;\n  }\n  /**\n   * @internal\n   */\n  updateState(\n    inputConfig: LangGraphRunnableConfig,\n    values: Record<string, unknown> | unknown,\n    asNode?: string\n  ) {\n    return this.#graph.updateState(inputConfig, values, asNode) as never;\n  }\n\n  /**\n   * @internal\n   */\n  get builder() {\n    return this.#graph.builder;\n  }\n}\n"],"mappings":"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"}