langchain
Version:
Typescript bindings for langchain
1 lines • 71.9 kB
Source Map (JSON)
{"version":3,"file":"ReactAgent.cjs","names":["mergeConfigs","isClientTool","createAgentState","StateGraph","AgentNode","normalizeSystemPrompt","BeforeAgentNode","getHookConstraint","BeforeModelNode","AfterModelNode","AfterAgentNode","AGENT_NODE_NAME","ToolNode","wrapToolCall","TOOLS_NODE_NAME","END","START","parseJumpToTarget","createToolCallTransformer","createSubagentTransformer","toGraphDefaultConfig","builtInState","ToolMessage","AIMessage","Send","isCommand","initializeMiddlewareStates","agentConfig"],"sources":["../../src/agents/ReactAgent.ts"],"sourcesContent":["/* 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 isCommand,\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 if (\n this.#toolBehaviorVersion === \"v1\" &&\n middleware.some(\n (m) => m.name === \"HumanInTheLoopMiddleware\" && m.wrapToolCall\n )\n ) {\n throw new Error(\n 'humanInTheLoopMiddleware({ interruptMode: \"per_call\" }) requires createAgent version \"v2\" (the default). Version \"v1\" runs every tool call in one task, so per-call interrupts would share an ID.'\n );\n }\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 stateKeys: Object.keys(workflow.channels).filter(\n (key) => key !== \"jumpTo\"\n ),\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 #getGraphConfig(config?: RunnableConfig) {\n return mergeConfigs(\n { ...this.#defaultConfig, callbacks: undefined },\n 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 successfully. A failed\n // call goes back to the model so it can correct itself and retry.\n if (\n ToolMessage.isInstance(lastMessage) &&\n lastMessage.name &&\n lastMessage.status !== \"error\" &&\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) => new Send(TOOLS_NODE_NAME, { 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) => new Send(TOOLS_NODE_NAME, { 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) => new Send(TOOLS_NODE_NAME, { 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 isCommand(state) ||\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 = this.#getGraphConfig(config);\n const initializedState = await this.#initializeMiddlewareStates(\n state,\n mergedConfig as RunnableConfig\n );\n\n return this.#graph.invoke(\n initializedState,\n mergedConfig\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 = this.#getGraphConfig(config);\n const initializedState = await this.#initializeMiddlewareStates(\n state,\n mergedConfig as RunnableConfig\n );\n return this.#graph.stream(initializedState, mergedConfig) 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 = this.#getGraphConfig(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 = this.#getGraphConfig(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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmKA,IAAa,aAAb,MAAa,WASX;CAiBS;CATT;CAEA,uBAAoC;CAEpC;CAEA;CAEA,YACE,SAKA,eACA;EANO,KAAA,UAAA;EAOP,KAAK,kBAAA,GAAiBA,0BAAAA,aAAAA,CAAa,iBAAiB,CAAC,GAAG;GACtD,UAAU,EAAE,gBAAgB,yBAAyB;GACrD,cAAc,EAAE,eAAe,OAAO;EACxC,CAAC;EACD,IAAI,QAAQ,MACV,KAAK,kBAAA,GAAiBA,0BAAAA,aAAAA,CAAa,KAAK,gBAAgB,EACtD,UAAU,EAAE,eAAe,QAAQ,KAAK,EAC1C,CAAC;EAEH,KAAK,uBAAuB,QAAQ,WAAW,KAAK;;;;EAKpD,IAAI,CAAC,QAAQ,OACX,MAAM,IAAI,MAAM,gDAAgD;;;;EAMlE,IAAI,OAAO,QAAQ,UAAU,UAC3B,cAAA,2BAA2B,QAAQ,KAAK;;;;EAM1C,MAAM,kBAAmB,KAAK,QAAQ,YAClC,QAAQ,MAAM,EAAE,KAAK,CAAC,CACvB,SAAS,MAAM,EAAE,KAAK,KAAK,CAAC;EAC/B,MAAM,cAAc,CAAC,GAAI,QAAQ,SAAS,CAAC,GAAI,GAAG,eAAe;;;;;EAMjE,MAAM,qBAAqB,IAAI,IAC7B,YACG,OAAOC,cAAAA,YAAY,CAAC,CACpB,QAAQ,SAAS,kBAAkB,QAAQ,KAAK,YAAY,CAAC,CAC7D,KAAK,SAAS,KAAK,IAAI,CAC5B;;;;;EAMA,MAAM,+BAA+B,QACnC,KAAK,QAAQ,YAAY,MAAM,eAAe,WAAW,aAAa,CACxE;EACA,MAAM,EAAE,OAAO,OAAO,WAAWC,mBAAAA,iBAI/B,KAAK,QAAQ,mBAAmB,KAAA,KAAa,8BAC7C,KAAK,QAAQ,aACb,KAAK,QAAQ,UACf;EAEA,MAAM,WAAW,IAAIC,qBAAAA,WAAW,OAAO;GACrC;GACA;GACA,SAAS,KAAK,QAAQ;EACxB,CAAC;EAED,MAAM,mBAAmB;EAMzB,MAAM,mBAIA,CAAC;EACP,MAAM,mBAIA,CAAC;EACP,MAAM,kBAIA,CAAC;EACP,MAAM,kBAIA,CAAC;EACP,MAAM,8BAAiD,CAAC;EAExD,KAAK,aAAa,IAAIC,kBAAAA,UAAU;GAC9B,OAAO,KAAK,QAAQ;GACpB,eAAeC,cAAAA,sBAAsB,KAAK,QAAQ,YAAY;GAC9D,kBAAkB,KAAK,QAAQ;GAC/B,MAAM,KAAK,QAAQ;GACnB,gBAAgB,KAAK,QAAQ;GAC7B,YAAY,KAAK,QAAQ;GACzB;GACA;GACA,QAAQ,KAAK,QAAQ;GACrB;EACF,CAAC;EAED,MAAM,kCAAkB,IAAI,IAAY;EACxC,MAAM,aAAa,KAAK,QAAQ,cAAc,CAAC;EAC/C,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;GAC1C,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,MAAM,IAAI,WAAW;GACrB,IAAI,gBAAgB,IAAI,EAAE,IAAI,GAC5B,MAAM,IAAI,MAAM,cAAc,EAAE,KAAK,2BAA2B;GAGlE,gBAAgB,IAAI,EAAE,IAAI;GAC1B,IAAI,EAAE,aAAa;IACjB,kBAAkB,IAAIC,wBAAAA,gBAAgB,CAAC;IACvC,MAAM,OAAO,GAAG,EAAE,KAAK;IACvB,iBAAiB,KAAK;KACpB,OAAO;KACP;KACA,SAASC,gBAAAA,kBAAkB,EAAE,WAAW;IAC1C,CAAC;IACD,iBAAiB,QACf,MACA,iBACA,gBAAgB,WAClB;GACF;GACA,IAAI,EAAE,aAAa;IACjB,kBAAkB,IAAIC,wBAAAA,gBAAgB,CAAC;IACvC,MAAM,OAAO,GAAG,EAAE,KAAK;IACvB,iBAAiB,KAAK;KACpB,OAAO;KACP;KACA,SAASD,gBAAAA,kBAAkB,EAAE,WAAW;IAC1C,CAAC;IACD,iBAAiB,QACf,MACA,iBACA,gBAAgB,WAClB;GACF;GACA,IAAI,EAAE,YAAY;IAChB,iBAAiB,IAAIE,uBAAAA,eAAe,CAAC;IACrC,MAAM,OAAO,GAAG,EAAE,KAAK;IACvB,gBAAgB,KAAK;KACnB,OAAO;KACP;KACA,SAASF,gBAAAA,kBAAkB,EAAE,UAAU;IACzC,CAAC;IACD,iBAAiB,QACf,MACA,gBACA,eAAe,WACjB;GACF;GACA,IAAI,EAAE,YAAY;IAChB,iBAAiB,IAAIG,uBAAAA,eAAe,CAAC;IACrC,MAAM,OAAO,GAAG,EAAE,KAAK;IACvB,gBAAgB,KAAK;KACnB,OAAO;KACP;KACA,SAASH,gBAAAA,kBAAkB,EAAE,UAAU;IACzC,CAAC;IACD,iBAAiB,QACf,MACA,gBACA,eAAe,WACjB;GACF;GAEA,IAAI,EAAE,eACJ,4BAA4B,KAAK,CAAC;EAEtC;;;;EAKA,iBAAiB,QAAQI,kBAAAA,iBAAiB,KAAK,UAAU;;;;;;EAOzD,MAAM,4BAA4B,WAAW,MAAM,MAAM,EAAE,YAAY;EACvE,IACE,KAAK,yBAAyB,QAC9B,WAAW,MACR,MAAM,EAAE,SAAS,8BAA8B,EAAE,YACpD,GAEA,MAAM,IAAI,MACR,yMACF;EAEF,MAAM,cAAc,YAAY,OAAOV,cAAAA,YAAY;;;;;EAMnD,IAAI,YAAY,SAAS,KAAK,2BAA2B;GACvD,MAAM,WAAW,IAAIW,iBAAAA,SAAS,aAAa;IACzC,QAAQ,KAAK,QAAQ;IACrB,cAAcC,cAAAA,aAAa,UAAU;IACrC,WAAW,OAAO,KAAK,SAAS,QAAQ,CAAC,CAAC,QACvC,QAAQ,QAAQ,QACnB;GACF,CAAC;GACD,iBAAiB,QAAQC,iBAAAA,iBAAiB,QAAQ;EACpD;;;;EAMA,IAAI;EACJ,IAAI,iBAAiB,SAAS,GAC5B,YAAY,iBAAiB,EAAE,CAAC;OAC3B,IAAI,iBAAiB,SAAS,GACnC,YAAY,iBAAiB,EAAE,CAAC;OAEhC,YAAYH,kBAAAA;EAKd,MAAM,gBACJ,iBAAiB,SAAS,IAAI,iBAAiB,EAAE,CAAC,OAAOA,kBAAAA;EAG3D,MAAM,WACJ,gBAAgB,SAAS,IACrB,gBAAgB,gBAAgB,SAAS,EAAE,CAAC,OAC5CI,qBAAAA;EAEN,iBAAiB,QAAQC,qBAAAA,OAAO,SAAS;;;;;EAMzC,MAAM,oBACJ,YAAY,SAAS,KAAK;EAG5B,KAAK,IAAI,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK;GAChD,MAAM,OAAO,iBAAiB;GAC9B,MAAM,UAAU,KAAK;GAErB,MAAM,cADS,MAAM,iBAAiB,SAAS,IAClB,gBAAgB,iBAAiB,IAAI,EAAE,CAAC;GAErE,IAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;IAC3C,MAAM,gBAAgB,KAAK,QACxB,KAAK,MAAMC,gBAAAA,kBAAkB,CAAC,CAAC,CAAC,CAChC,QAAQ,SAAS,SAAA,WAA4B,iBAAiB;IAEjE,MAAM,eAAe,MAAM,qBACzB,IAAI,IAAI,CACN,aACA,GAAG,cAAc,KAAK,SAAU,SAASF,qBAAAA,MAAM,WAAW,IAAK,CACjE,CAAC,CACH;IAEA,iBAAiB,oBACf,SACA,KAAK,yBACH,aACA,aACA,UACA,iBACF,GACA,YACF;GACF,OACE,iBAAiB,QAAQ,SAAS,WAAW;EAEjD;EAGA,KAAK,IAAI,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK;GAChD,MAAM,OAAO,iBAAiB;GAC9B,MAAM,UAAU,KAAK;GAErB,MAAM,cADS,MAAM,iBAAiB,SAAS,IAE3CJ,kBAAAA,kBACA,iBAAiB,IAAI,EAAE,CAAC;GAE5B,IAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;IAC3C,MAAM,gBAAgB,KAAK,QACxB,KAAK,MAAMM,gBAAAA,kBAAkB,CAAC,CAAC,CAAC,CAChC,QAAQ,SAAS,SAAA,WAA4B,iBAAiB;IACjE,MAAM,eAAe,MAAM,qBACzB,IAAI,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,CACzC;IAEA,iBAAiB,oBACf,SACA,KAAK,yBACH,aACA,aACA,iBACF,GACA,YACF;GACF,OACE,iBAAiB,QAAQ,SAAS,WAAW;EAEjD;EAGA,MAAM,qBAAqB,gBAAgB,GAAG,EAAE;EAChD,IAAI,gBAAgB,SAAS,KAAK,oBAChC,iBAAiB,QAAQN,kBAAAA,iBAAiB,mBAAmB,IAAI;OAC5D;GAQL,MAAM,eANa,KAAK,eACtB,aACA,OACA,iBAG4B,CAAC,CAAC,KAAK,MACnC,MAAMI,qBAAAA,MAAM,WAAW,CACzB;GACA,IAAI,aAAa,WAAW,GAC1B,iBAAiB,QAAQJ,kBAAAA,iBAAiB,aAAa,EAAE;QAEzD,iBAAiB,oBACfA,kBAAAA,iBACA,KAAK,mBAAmB,QAAQ,GAChC,YACF;EAEJ;EAGA,KAAK,IAAI,IAAI,gBAAgB,SAAS,GAAG,IAAI,GAAG,KAAK;GACnD,MAAM,OAAO,gBAAgB;GAC7B,MAAM,UAAU,KAAK;GACrB,MAAM,cAAc,gBAAgB,IAAI,EAAE,CAAC;GAE3C,IAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;IAC3C,MAAM,gBAAgB,KAAK,QACxB,KAAK,MAAMM,gBAAAA,kBAAkB,CAAC,CAAC,CAAC,CAChC,QAAQ,SAAS,SAAA,WAA4B,iBAAiB;IACjE,MAAM,eAAe,MAAM,qBACzB,IAAI,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,CACzC;IAEA,iBAAiB,oBACf,SACA,KAAK,gCACH,aACA,KAAK,SACL,aACA,iBACF,GACA,YACF;GACF,OACE,iBAAiB,QAAQ,SAAS,WAAW;EAEjD;EAGA,IAAI,gBAAgB,SAAS,GAAG;GAC9B,MAAM,kBAAkB,gBAAgB;GACxC,MAAM,sBAAsB,gBAAgB;GAG5C,MAAM,aAAa,KAAK,eACtB,aACA,MACA,iBACF,CAAC,CAAC,QAAQ,MAAM,MAAA,WAAyB,iBAAiB;GAE1D,MAAM,YAAY,QAChB,gBAAgB,WAAW,gBAAgB,QAAQ,SAAS,CAC9D;GAGA,MAAM,eAAe,WAAW,KAAK,MACnC,MAAMF,qBAAAA,MAAM,WAAW,CACzB;GAEA,iBAAiB,oBACf,qBACA,KAAK,wBACH,aACA,WACA,UACA,iBACF,GACA,YACF;EACF;EAGA,KAAK,IAAI,IAAI,gBAAgB,SAAS,GAAG,IAAI,GAAG,KAAK;GACnD,MAAM,OAAO,gBAAgB;GAC7B,MAAM,UAAU,KAAK;GACrB,MAAM,cAAc,gBAAgB,IAAI,EAAE,CAAC;GAE3C,IAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;IAC3C,MAAM,gBAAgB,KAAK,QACxB,KAAK,MAAME,gBAAAA,kBAAkB,CAAC,CAAC,CAAC,CAChC,QAAQ,SAAS,SAAA,WAA4B,iBAAiB;IACjE,MAAM,eAAe,MAAM,qBACzB,IAAI,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,CACzC;IAEA,iBAAiB,oBACf,SACA,KAAK,gCACH,aACA,KAAK,SACL,aACA,iBACF,GACA,YACF;GACF,OACE,iBAAiB,QAAQ,SAAS,WAAW;EAEjD;EAGA,IAAI,gBAAgB,SAAS,GAAG;GAC9B,MAAM,kBAAkB,gBAAgB;GACxC,MAAM,sBAAsB,gBAAgB;GAE5C,IAAI,gBAAgB,WAAW,gBAAgB,QAAQ,SAAS,GAAG;IACjE,MAAM,gBAAgB,gBAAgB,QACnC,KAAK,MAAMA,gBAAAA,kBAAkB,CAAC,CAAC,CAAC,CAChC,QAAQ,SAAS,SAAA,WAA4B,iBAAiB;;;;;IAMjE,MAAM,eAAe,MAAM,qBACzB,IAAI,IAAI,CAACF,qBAAAA,KAAK,GAAG,aAAa,CAAC,CACjC;IAEA,iBAAiB,oBACf,qBACA,KAAK,gCACH,aACA,gBAAgB,SAChBA,qBAAAA,KACA,iBACF,GACA,YACF;GACF,OACE,iBAAiB,QAAQ,qBAAqBA,qBAAAA,GAAG;EAErD;;;;EAKA,IAAI,mBAAmB;GAErB,MAAM,mBAAmB;GAEzB,IAAI,mBAAmB,OAAO,GAC5B,iBAAiB,oBACfD,iBAAAA,iBACA,KAAK,mBACH,oBACA,UACA,gBACF,GACA,CAAC,kBAAkB,QAAkB,CACvC;QAEA,iBAAiB,QAAQA,iBAAAA,iBAAiB,gBAAgB;EAE9D;;;;EAKA,MAAM,gCACJ,KAAK,QAAQ,cAAc,CAAC,EAAA,CAC5B,SAAS,MAAM,EAAE,sBAAsB,CAAC,CAAC;EAC3C,MAAM,sBAAsB;GAE1BI,kBAAAA,0BAA0B,CAAC,CAAC;GAC5BC,iBAAAA,0BAA0B,CAAC,CAAC;GAE5B,GAAG;GAEH,GAAI,KAAK,QAAQ,sBAAsB,CAAC;EAC1C;EAEA,KAAK,SAAS,iBAAiB,QAAQ;GACrC,cAAc,KAAK,QAAQ;GAC3B,OAAO,KAAK,QAAQ;GACpB,MAAM,KAAK,QAAQ;GACnB,aAAa,KAAK,QAAQ;GAC1B,cAAc;EAChB,CAAC;;;;;;;;EASD,MAAM,qBAAqBC,cAAAA,qBAAqB,KAAK,cAAc;EACnE,IAAI,OAAO,KAAK,kBAAkB,CAAC,CAAC,SAAS,GAC3C,KAAK,SAAS,KAAK,OAAO,WAAW,kBAAkB;CAE3D;;;;CAKA,IAAI,QAA2B;EAC7B,OAAO,KAAK;CACd;CAEA,IAAI,eAA0D;EAC5D,OAAO,KAAK,OAAO;CACrB;CAEA,IAAI,aAAa,OAAkD;EACjE,KAAK,OAAO,eAAe;CAC7B;CAEA,IAAI,QAA+B;EACjC,OAAO,KAAK,OAAO;CACrB;CAEA,IAAI,MAAM,OAA8B;EACtC,KAAK,OAAO,QAAQ;CACtB;;;;;;;;;;;;;;;;;;;;;;;;CAyBA,WACE,QACmB;EACnB,OAAO,IAAI,WACT,KAAK,UAAA,GACLpB,0BAAAA,aAAAA,CAAa,KAAK,gBAAgB,MAAM,CAC1C;CACF;CAEA,gBAAgB,QAAyB;EACvC,QAAA,GAAOA,0BAAAA,aAAAA,CACL;GAAE,GAAG,KAAK;GAAgB,WAAW,KAAA;EAAU,GAC/C,MACF;CACF;;;;;;;;CASA,eACE,aACA,sBAA+B,OAC/B,oBAA6B,YAAY,SAAS,GAC1B;EACxB,MAAM,QAAgC,CAAC;EACvC,IAAI,mBACF,MAAM,KAAKc,iBAAAA,eAAe;EAG5B,IAAI,qBACF,MAAM,KAAKH,kBAAAA,eAAe;EAG5B,MAAM,KAAKI,qBAAAA,GAAG;EAEd,OAAO;CACT;;;;CAKA,mBACE,oBACA,UACA,kBACA;EACA,QAAQ,UAAmC;GAEzC,MAAM,WAAWM,MAAa;GAC9B,MAAM,cAAc,SAAS,SAAS,SAAS;GAI/C,IACEC,yBAAAA,YAAY,WAAW,WAAW,KAClC,YAAY,QACZ,YAAY,WAAW,WACvB,mBAAmB,IAAI,YAAY,IAAI,GAIvC,OAAO,KAAK,QAAQ,iBAAiB,mBAAmB;GAI1D,OAAO;EACT;CACF;;;;;CAMA,mBAAmB,WAAgCP,qBAAAA,KAAK;;;;EAItD,QAAQ,UAAmC;GAGzC,MAAM,cADWM,MAAa,SACD,GAAG,EAAE;GAElC,IACE,CAACE,yBAAAA,UAAU,WAAW,WAAW,KACjC,CAAC,YAAY,cACb,YAAY,WAAW,WAAW,GAElC,OAAO;GAQT,IAJuC,YAAY,WAAW,OAC3D,aAAa,SAAS,KAAK,WAAW,UAAU,CAGlB,GAG/B,OAAO;;;;GAMT,IAAI,KAAK,yBAAyB,MAChC,OAAOT,iBAAAA;;;;GAMT,MAAM,mBAAmB,YAAY,WAAW,QAC7C,aAAa,CAAC,SAAS,KAAK,WAAW,UAAU,CACpD;GAEA,IAAI,iBAAiB,WAAW,GAC9B,OAAO;GAGT,OAAO,iBAAiB,KACrB,aAAa,IAAIU,qBAAAA,KAAKV,iBAAAA,iBAAiB,EAAE,cAAc,SAAS,CAAC,CACpE;EACF;CACF;;;;;;;;;;;;;;;;CAiBA,wBACE,aACA,WACA,UACA,oBAA6B,YAAY,SAAS,GAClD;EACA,MAAM,wBAAwB,QAAQ,KAAK,QAAQ,cAAc;EAEjE,QAAQ,UAAmC;GACzC,MAAM,eAAe;GAKrB,MAAM,WAAW,aAAa;GAC9B,MAAM,cAAc,SAAS,GAAG,EAAE;GAClC,IACES,yBAAAA,UAAU,WAAW,WAAW,MAC/B,CAAC,YAAY,cAAc,YAAY,WAAW,WAAW,IAE9D,OAAO;GAIT,IAAI,aAAa,aAAa,QAAQ;IACpC,MAAM,cAAcN,gBAAAA,kBAAkB,aAAa,MAAM;IACzD,IAAI,gBAAgBF,qBAAAA,KAClB,OAAO;IAET,IAAI,gBAAA,SAAiC;KAEnC,IAAI,CAAC,mBACH,OAAO;KAET,OAAO,IAAIS,qBAAAA,KAAKV,iBAAAA,iBAAiB;MAAE,GAAG;MAAO,QAAQ,KAAA;KAAU,CAAC;IAClE;IAEA,OAAO,IAAIU,qBAAAA,KAAKb,kBAAAA,iBAAiB;KAAE,GAAG;KAAO,QAAQ,KAAA;IAAU,CAAC;GAClE;GAGA,MAAM,eAAe,SAAS,OAAOW,yBAAAA,YAAY,UAAU;GAC3D,MAAM,gBAAgB,SAAS,OAAOC,yBAAAA,UAAU,UAAU,CAAC,CAAC,GAAG,EAAE;GACjE,MAAM,mBAAmB,eAAe,YAAY,QACjD,SAAS,CAAC,aAAa,MAAM,MAAM,EAAE,iBAAiB,KAAK,EAAE,CAChE;GACA,IAAI,oBAAoB,iBAAiB,SAAS,GAAG;;;;;;IAMnD,IAAI,KAAK,yBAAyB,MAChC,OAAOT,iBAAAA;IAET,OAAO,iBAAiB,KACrB,aAAa,IAAIU,qBAAAA,KAAKV,iBAAAA,iBAAiB,EAAE,cAAc,SAAS,CAAC,CACpE;GACF;GAIA,MAAM,6BAA6B,eAAe,YAAY,MAC3D,aAAa,SAAS,KAAK,WAAW,UAAU,CACnD;GAEA,IACE,oBACA,iBAAiB,WAAW,KAC5B,CAAC,8BACD,uBAEA,OAAOH,kBAAAA;GAGT,IACE,CAACY,yBAAAA,UAAU,WAAW,WAAW,KACjC,CAAC,YAAY,cACb,YAAY,WAAW,WAAW,GAElC,OAAO;GAIT,MAAM,iCAAiC,YAAY,WAAW,OAC3D,aAAa,SAAS,KAAK,WAAW,UAAU,CACnD;GAGA,MAAM,sBAAsB,YAAY,WAAW,MAChD,aAAa,CAAC,SAAS,KAAK,WAAW,UAAU,CACpD;GAEA,IAAI,kCAAkC,CAAC,qBACrC,OAAO;;;;;;;;;GAWT,IAAI,KAAK,yBAAyB,MAChC,OAAOT,iBAAAA;GAGT,MAAM,mBAAoB,YAA0B,WAAY,QAC7D,aAAa,CAAC,SAAS,KAAK,WAAW,UAAU,CACpD;GAEA,IAAI,iBAAiB,WAAW,GAC9B,OAAO;GAGT,OAAO,iBAAiB,KACrB,aAAa,IAAIU,qBAAAA,KAAKV,iBAAAA,iBAAiB,EAAE,cAAc,SAAS,CAAC,CACpE;EACF;CACF;;;;;;;;;CAUA,gCACE,aACA,SACA,aACA,oBAA6B,YAAY,SAAS,GAClD;EACA,MAAM,aAAa,IAAI,IAAI,QAAQ,KAAK,MAAMG,gBAAAA,kBAAkB,CAAC,CAAC,CAAC;EACnE,QAAQ,UAAmC;GACzC,MAAM,eAAe;GACrB,IAAI,aAAa,QAAQ;IACvB,MAAM,OAAOA,gBAAAA,kBAAkB,aAAa,MAAM;IAClD,IAAI,SAASF,qBAAAA,OAAO,WAAW,IAAIA,qBAAAA,GAAG,GACpC,OAAOA,qBAAAA;IAET,IAAI,SAAA,WAA4B,WAAW,IAAA,OAAmB,GAAG;KAC/D,IAAI,CAAC,mBAAmB,OAAOA,qBAAAA;KAC/B,OAAO,IAAIS,qBAAAA,KAAKV,iBAAAA,iBAAiB;MAAE,GAAG;MAAO,QAAQ,KAAA;KAAU,CAAC;IAClE;IACA,IAAI,SAAA,mBAA4B,WAAW,IAAA,eAAmB,GAC5D,OAAO,IAAIU,qBAAAA,KAAKb,kBAAAA,iBAAiB;KAAE,GAAG;KAAO,QAAQ,KAAA;IAAU,CAAC;GAEpE;GACA,OAAO;EACT;CACF;;;;;;;;;;CAWA,yBACE,aACA,aACA,UACA,oBAA6B,YAAY,SAAS,GAClD;EACA,QAAQ,UAAmC;GACzC,MAAM,eAAe;GACrB,IAAI,CAAC,aAAa,QAChB,OAAO;GAET,MAAM,cAAcM,gBAAAA,kBAAkB,aAAa,MAAM;GACzD,IAAI,gBAAgBF,qBAAAA;;;;GAIlB,OAAO;GAET,IAAI,gBAAA,SAAiC;IACnC,IAAI,CAAC,mBACH,OAAO;IAET,OAAO,IAAIS,qBAAAA,KAAKV,iBAAAA,iBAAiB;KAAE,GAAG;KAAO,QAAQ,KAAA;IAAU,CAAC;GAClE;GACA,OAAO,IAAIU,qBAAAA,KAAKb,kBAAAA,iBAAiB;IAAE,GAAG;IAAO,QAAQ,KAAA;GAAU,CAAC;EAClE;CACF;;;;;;;;CASA,yBACE,aACA,aACA,oBAA6B,YAAY,SAAS,GAClD;EACA,QAAQ,UAAmC;GACzC,MAAM,eAAe;GACrB,IAAI,CAAC,aAAa,QAChB,OAAO;GAET,MAAM,cAAcM,gBAAAA,kBAAkB,aAAa,MAAM;GACzD,IAAI,gBAAgBF,qBAAAA,KAClB,OAAOA,qBAAAA;GAET,IAAI,gBAAA,SAAiC;IACnC,IAAI,CAAC,mBACH,OAAOA,qBAAAA;IAET,OAAO,IAAIS,qBAAAA,KAAKV,iBAAAA,iBAAiB;KAAE,GAAG;KAAO,QAAQ,KAAA;IAAU,CAAC;GAClE;GACA,OAAO,IAAIU,qBAAAA,KAAKb,kBAAAA,iBAAiB;IAAE,GAAG;IAAO,QAAQ,KAAA;GAAU,CAAC;EAClE;CACF;;;;CAKA,MAAM,4BACJ,OACA,QACsC;EACtC,IACE,CAAC,KAAK,QAAQ,cACd,KAAK,QAAQ,WAAW,WAAW,MAAA,GACnCc,qBAAAA,UAAAA,CAAU,KAAK,KACf,CAAC,OAED,OAAO;EAGT,MAAM,gBAAgB,MAAMC,gBAAAA,2BAC1B,KAAK,QAAQ,YACb,KACF;EAIA,MAAM,eAAe;GACnB,IAAG,MAJqB,KAAK,OAC5B,SAAS,MAAM,CAAC,CAChB,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAA,CAEd;GACf,GAAG;EACL;EACA,IAAI,CAAC,cACH,OAAO;EAIT,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,aAAa,GACrD,IAAI,EAAE,OAAO,eACX,aAAa,OAAoC;EAIrD,OAAO;CACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CA,MAAM,OACJ,OACA,QAQA;EAEA,MAAM,eAAe,KAAK,gBAAgB,MAAM;EAChD,MAAM,mBAAmB,MAAM,KAAK,4BAClC,OACA,YACF;EAEA,OAAO,KAAK,OAAO,OACjB,kBACA,YACF;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CA,MAAM,OAKJ,OACA,QAWA;EACA,MAAM,eAAe,KAAK,gBAAgB,MAAM;EAChD,MAAM,mBAAmB,MAAM,KAAK,4BAClC,OACA,YACF;EACA,OAAO,KAAK,OAAO,OAAO,kBAAkB,YAAY;CAc1D;CA0HA,aACE,OACA,QAuBA,eASsC;EACtC,IAAI,QAAQ,YAAY,QAAQ,iBAAiB,MAAM;GACrD,MAAM,eAAe,KAAK,gBAAgB,MAAM;GAChD,MAAM,UACJ,QAAQ,YAAY,QAAQ,QAAQ,YAAY,OAC5C,OAAO,UACP;GACN,OAAO,KAAK,OAAO,aACjB,OACA;IACE,GAAI;IAUJ;GACF,GACA,aACF;EACF;EAEA,QAAQ,YAAY;GAclB,MAAM,EACJ,cAAc,sBACd,SAAS,UACT,GAAG,eACDC,UAAe,CAAC;GACpB,MAAM,eAAe,KAAK,gBAAgB,UAAU;GACpD,MAAM,mBAAmB,MAAM,KAAK,4BAClC,OACA,YACF;GAEA,OAAQ,MAAM,KAAK,OAAO,aAAa,kBAAkB;IACvD,GAAI;IACJ,SAAS;IACT,cAAc;GAChB,CAAC;EAKH,EAAA,CAAG;CACL;;;;;;;;;;;CAYA,MAAM,eAAe,QAMlB;EAGD,MAAM,cAAc,OAAM,OADN,MADS,KAAK,OAAO,cAAc,EAAA,CACpB,eAAe,MAAM,EAAA,CACxB,YAAY;EAE5C,OAAO,IADY,WAAW,WAClB;CACd;;;;;;;;;;;CAYA,MAAM,YAAY,QAMf;EAED,QAAO,MADsB,KAAK,OAAO,cAAc,EAAA,CACjC,YAAY,MAAM;CAC1C;;;;;;;;;;CAWA,cAAc,QAAyB;EACrC,OAAO,KAAK,OAAO,cAAc,MAAM;CACzC;;;;CAIA,SAAS,QAAwB,SAA2B;EAC1D,OAAO,KAAK,OAAO,SAAS,QAAQ,OAAO;CAC7C;;;;CAIA,gBAAgB,QAAwB,SAAiC;EACvE,OAAO,KAAK,OAAO,gBAAgB,QAAQ,OAAO;CACpD;;;;CAIA,aAAa,WAAoB,SAAmB;EAClD,OAAO,KAAK,OAAO,aAAa,WAAW,OAAO;CACpD;;;;CAIA,kBAAkB,WAAoB,SAAmB;EACvD,OAAO,KAAK,OAAO,kBAAkB,WAAW,OAAO;CACzD;;;;CAIA,YACE,aACA,QACA,QACA;EACA,OAAO,KAAK,OAAO,YAAY,aAAa,QAAQ,MAAM;CAC5D;;;;CAKA,IAAI,UAAU;EACZ,OAAO,KAAK,OAAO;CACrB;AACF"}