{"version":3,"file":"graph.cjs","names":["Runnable","ChannelWrite","RunnableCallable","e: any","NodeInterrupt","destinations: (string | Send)[]","_isSend","END","InvalidUpdateError","args","CHECKPOINT_NAMESPACE_SEPARATOR","CHECKPOINT_NAMESPACE_END","isPregelLike","START","options: BranchOptions<\n      RunInput,\n      N,\n      LangGraphRunnableConfig<StateType<C>>\n    >","EphemeralValue","name","UnreachableNodeError","Pregel","PregelNode","PASSTHROUGH","TAG_HIDDEN","Channel","DrawableGraph","startNodes: Record<string, DrawableGraphNode>","z","endNodes: Record<string, DrawableGraphNode>","subgraphs: Record<string, CompiledGraph<any>>","gatherIterator","defaultEnds: Record<string, string>","gatherIteratorSync"],"sources":["../../src/graph/graph.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n  _coerceToRunnable,\n  Runnable,\n  RunnableConfig,\n  RunnableInterface,\n  RunnableIOSchema,\n  type RunnableLike as LangChainRunnableLike,\n} from \"@langchain/core/runnables\";\nimport {\n  Node as DrawableGraphNode,\n  Graph as DrawableGraph,\n} from \"@langchain/core/runnables/graph\";\nimport { All, BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport { z } from \"zod/v4\";\nimport { validate as isUuid } from \"uuid\";\nimport type {\n  RunnableLike,\n  LangGraphRunnableConfig,\n} from \"../pregel/runnable_types.js\";\nimport { PregelNode } from \"../pregel/read.js\";\nimport { Channel, Pregel } from \"../pregel/index.js\";\nimport type { PregelParams } from \"../pregel/types.js\";\nimport { BaseChannel } from \"../channels/base.js\";\nimport { EphemeralValue } from \"../channels/ephemeral_value.js\";\nimport { ChannelWrite, PASSTHROUGH } from \"../pregel/write.js\";\nimport {\n  _isSend,\n  CHECKPOINT_NAMESPACE_END,\n  CHECKPOINT_NAMESPACE_SEPARATOR,\n  END,\n  Send,\n  START,\n  TAG_HIDDEN,\n} from \"../constants.js\";\nimport {\n  gatherIterator,\n  gatherIteratorSync,\n  RunnableCallable,\n} from \"../utils.js\";\nimport {\n  InvalidUpdateError,\n  NodeInterrupt,\n  UnreachableNodeError,\n} from \"../errors.js\";\nimport { StateDefinition, StateType } from \"./annotation.js\";\nimport { isPregelLike } from \"../pregel/utils/subgraph.js\";\n\nexport interface BranchOptions<\n  IO,\n  N extends string,\n  CallOptions extends LangGraphRunnableConfig = LangGraphRunnableConfig\n> {\n  source: N;\n  path: RunnableLike<IO, BranchPathReturnValue, CallOptions>;\n  pathMap?: Record<string, N | typeof END> | (N | typeof END)[];\n}\n\nexport type BranchPathReturnValue =\n  | string\n  | Send\n  | (string | Send)[]\n  | Promise<string | Send | (string | Send)[]>;\n\ntype NodeAction<S, U, C extends StateDefinition> = RunnableLike<\n  S,\n  U extends object ? U & Record<string, any> : U, // eslint-disable-line @typescript-eslint/no-explicit-any\n  LangGraphRunnableConfig<StateType<C>>\n>;\n\nexport class Branch<\n  IO,\n  N extends string,\n  CallOptions extends LangGraphRunnableConfig = LangGraphRunnableConfig\n> {\n  path: Runnable<IO, BranchPathReturnValue, CallOptions>;\n\n  ends?: Record<string, N | typeof END>;\n\n  constructor(options: Omit<BranchOptions<IO, N, CallOptions>, \"source\">) {\n    if (Runnable.isRunnable(options.path)) {\n      this.path = options.path as Runnable<\n        IO,\n        BranchPathReturnValue,\n        CallOptions\n      >;\n    } else {\n      this.path = _coerceToRunnable(\n        options.path as LangChainRunnableLike<\n          IO,\n          BranchPathReturnValue,\n          CallOptions\n        >\n      ).withConfig({ runName: `Branch` } as CallOptions);\n    }\n    this.ends = Array.isArray(options.pathMap)\n      ? options.pathMap.reduce((acc, n) => {\n          acc[n] = n;\n          return acc;\n        }, {} as Record<string, N | typeof END>)\n      : options.pathMap;\n  }\n\n  run(\n    writer: (\n      dests: (string | Send)[],\n      config: LangGraphRunnableConfig\n    ) => Runnable | void | Promise<void>,\n    reader?: (config: CallOptions) => IO\n  ) {\n    return ChannelWrite.registerWriter(\n      new RunnableCallable({\n        name: \"<branch_run>\",\n        trace: false,\n        func: async (input: IO, config: CallOptions) => {\n          try {\n            return await this._route(input, config, writer, reader);\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          } catch (e: any) {\n            // Detect & warn if NodeInterrupt is thrown in a conditional edge\n            if (e.name === NodeInterrupt.unminifiable_name) {\n              console.warn(\n                \"[WARN]: 'NodeInterrupt' thrown in conditional edge. This is likely a bug in your graph implementation.\\n\" +\n                  \"NodeInterrupt should only be thrown inside a node, not in edge conditions.\"\n              );\n            }\n            throw e;\n          }\n        },\n      })\n    );\n  }\n\n  async _route(\n    input: IO,\n    config: CallOptions,\n    writer: (\n      dests: (string | Send)[],\n      config: LangGraphRunnableConfig\n    ) => Runnable | void | Promise<void>,\n    reader?: (config: CallOptions) => IO\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  ): Promise<Runnable | any> {\n    let result = await this.path.invoke(\n      reader ? reader(config) : input,\n      config\n    );\n    if (!Array.isArray(result)) {\n      result = [result];\n    }\n\n    let destinations: (string | Send)[];\n    if (this.ends) {\n      destinations = result.map((r) => (_isSend(r) ? r : this.ends![r]));\n    } else {\n      destinations = result;\n    }\n    if (destinations.some((dest) => !dest)) {\n      throw new Error(\"Branch condition returned unknown or null destination\");\n    }\n    if (destinations.filter(_isSend).some((packet) => packet.node === END)) {\n      throw new InvalidUpdateError(\"Cannot send a packet to the END node\");\n    }\n    const writeResult = await writer(destinations, config);\n    return writeResult ?? input;\n  }\n}\n\nexport type NodeSpec<RunInput, RunOutput> = {\n  runnable: Runnable<RunInput, RunOutput>;\n  metadata?: Record<string, unknown>;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  subgraphs?: Pregel<any, any>[];\n  ends?: string[];\n  defer?: boolean;\n};\n\nexport type AddNodeOptions<Nodes extends string = string> = {\n  metadata?: Record<string, unknown>;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  subgraphs?: Pregel<any, any>[];\n  ends?: Nodes[];\n  defer?: boolean;\n};\n\nexport class Graph<\n  N extends string = typeof START | typeof END,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  RunInput = any,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  RunOutput = any,\n  NodeSpecType extends NodeSpec<RunInput, RunOutput> = NodeSpec<\n    RunInput,\n    RunOutput\n  >,\n  C extends StateDefinition = StateDefinition\n> {\n  nodes: Record<N, NodeSpecType>;\n\n  edges: Set<[N | typeof START, N | typeof END]>;\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  branches: Record<string, Record<string, Branch<RunInput, N, any>>>;\n\n  entryPoint?: string;\n\n  compiled = false;\n\n  constructor() {\n    this.nodes = {} as Record<N, NodeSpecType>;\n    this.edges = new Set();\n    this.branches = {};\n  }\n\n  protected warnIfCompiled(message: string): void {\n    if (this.compiled) {\n      console.warn(message);\n    }\n  }\n\n  get allEdges(): Set<[string, string]> {\n    return this.edges;\n  }\n\n  addNode<K extends string, NodeInput = RunInput, NodeOutput = RunOutput>(\n    nodes:\n      | Record<K, NodeAction<NodeInput, NodeOutput, C>>\n      | [\n          key: K,\n          action: NodeAction<NodeInput, NodeOutput, C>,\n          options?: AddNodeOptions\n        ][]\n  ): Graph<N | K, RunInput, RunOutput>;\n\n  addNode<K extends string, NodeInput = RunInput, NodeOutput = RunOutput>(\n    key: K,\n    action: NodeAction<NodeInput, NodeOutput, C>,\n    options?: AddNodeOptions\n  ): Graph<N | K, RunInput, RunOutput>;\n\n  addNode<K extends string, NodeInput = RunInput, NodeOutput = RunOutput>(\n    ...args:\n      | [\n          key: K,\n          action: NodeAction<NodeInput, NodeOutput, C>,\n          options?: AddNodeOptions\n        ]\n      | [\n          nodes:\n            | Record<K, NodeAction<NodeInput, NodeOutput, C>>\n            | [\n                key: K,\n                action: NodeAction<NodeInput, NodeOutput, C>,\n                options?: AddNodeOptions\n              ][]\n        ]\n  ): Graph<N | K, RunInput, RunOutput> {\n    function isMutlipleNodes(\n      args: unknown[]\n    ): args is [\n      nodes:\n        | Record<K, NodeAction<NodeInput, RunOutput, C>>\n        | [\n            key: K,\n            action: NodeAction<NodeInput, RunOutput, C>,\n            options?: AddNodeOptions\n          ][],\n      options?: AddNodeOptions\n    ] {\n      return args.length >= 1 && typeof args[0] !== \"string\";\n    }\n\n    const nodes = (\n      isMutlipleNodes(args) // eslint-disable-line no-nested-ternary\n        ? Array.isArray(args[0])\n          ? args[0]\n          : Object.entries(args[0])\n        : [[args[0], args[1], args[2]]]\n    ) as [K, NodeAction<NodeInput, RunOutput, C>, AddNodeOptions][];\n\n    if (nodes.length === 0) {\n      throw new Error(\"No nodes provided in `addNode`\");\n    }\n\n    for (const [key, action, options] of nodes) {\n      for (const reservedChar of [\n        CHECKPOINT_NAMESPACE_SEPARATOR,\n        CHECKPOINT_NAMESPACE_END,\n      ]) {\n        if (key.includes(reservedChar)) {\n          throw new Error(\n            `\"${reservedChar}\" is a reserved character and is not allowed in node names.`\n          );\n        }\n      }\n      this.warnIfCompiled(\n        `Adding a node to a graph that has already been compiled. This will not be reflected in the compiled graph.`\n      );\n\n      if (key in this.nodes) {\n        throw new Error(`Node \\`${key}\\` already present.`);\n      }\n      if (key === END) {\n        throw new Error(`Node \\`${key}\\` is reserved.`);\n      }\n\n      const runnable = _coerceToRunnable<RunInput, RunOutput>(\n        // Account for arbitrary state due to Send API\n        action as RunnableLike<RunInput, RunOutput>\n      );\n\n      this.nodes[key as unknown as N] = {\n        runnable,\n        metadata: options?.metadata,\n        subgraphs: isPregelLike(runnable) ? [runnable] : options?.subgraphs,\n        ends: options?.ends,\n      } as NodeSpecType;\n    }\n\n    return this as Graph<N | K, RunInput, RunOutput, NodeSpecType>;\n  }\n\n  addEdge(startKey: N | typeof START, endKey: N | typeof END): this {\n    this.warnIfCompiled(\n      `Adding an edge to a graph that has already been compiled. This will not be reflected in the compiled graph.`\n    );\n\n    if (startKey === END) {\n      throw new Error(\"END cannot be a start node\");\n    }\n    if (endKey === START) {\n      throw new Error(\"START cannot be an end node\");\n    }\n    if (\n      Array.from(this.edges).some(([start]) => start === startKey) &&\n      !(\"channels\" in this)\n    ) {\n      throw new Error(\n        `Already found path for ${startKey}. For multiple edges, use StateGraph.`\n      );\n    }\n\n    this.edges.add([startKey, endKey]);\n\n    return this;\n  }\n\n  addConditionalEdges(\n    source: BranchOptions<RunInput, N, LangGraphRunnableConfig<StateType<C>>>\n  ): this;\n\n  addConditionalEdges(\n    source: N,\n    path: RunnableLike<\n      RunInput,\n      BranchPathReturnValue,\n      LangGraphRunnableConfig<StateType<C>>\n    >,\n    pathMap?: BranchOptions<\n      RunInput,\n      N,\n      LangGraphRunnableConfig<StateType<C>>\n    >[\"pathMap\"]\n  ): this;\n\n  addConditionalEdges(\n    source:\n      | N\n      | BranchOptions<RunInput, N, LangGraphRunnableConfig<StateType<C>>>,\n    path?: RunnableLike<\n      RunInput,\n      BranchPathReturnValue,\n      LangGraphRunnableConfig<StateType<C>>\n    >,\n    pathMap?: BranchOptions<\n      RunInput,\n      N,\n      LangGraphRunnableConfig<StateType<C>>\n    >[\"pathMap\"]\n  ): this {\n    const options: BranchOptions<\n      RunInput,\n      N,\n      LangGraphRunnableConfig<StateType<C>>\n    > = typeof source === \"object\" ? source : { source, path: path!, pathMap };\n\n    this.warnIfCompiled(\n      \"Adding an edge to a graph that has already been compiled. This will not be reflected in the compiled graph.\"\n    );\n    if (!Runnable.isRunnable(options.path)) {\n      const pathDisplayValues = Array.isArray(options.pathMap)\n        ? options.pathMap.join(\",\")\n        : Object.keys(options.pathMap ?? {}).join(\",\");\n      options.path = _coerceToRunnable(\n        options.path as LangChainRunnableLike<\n          RunInput,\n          BranchPathReturnValue,\n          LangGraphRunnableConfig<StateType<C>>\n        >\n      ).withConfig({\n        runName: `Branch<${options.source}${\n          pathDisplayValues !== \"\" ? `,${pathDisplayValues}` : \"\"\n        }>`.slice(0, 63),\n      });\n    }\n    // find a name for condition\n    const name =\n      options.path.getName() === \"RunnableLambda\"\n        ? \"condition\"\n        : options.path.getName();\n    // validate condition\n    if (this.branches[options.source] && this.branches[options.source][name]) {\n      throw new Error(\n        `Condition \\`${name}\\` already present for node \\`${source}\\``\n      );\n    }\n    // save it\n    this.branches[options.source] ??= {};\n    this.branches[options.source][name] = new Branch(options);\n    return this;\n  }\n\n  /**\n   * @deprecated use `addEdge(START, key)` instead\n   */\n  setEntryPoint(key: N): this {\n    this.warnIfCompiled(\n      \"Setting the entry point of a graph that has already been compiled. This will not be reflected in the compiled graph.\"\n    );\n\n    return this.addEdge(START, key);\n  }\n\n  /**\n   * @deprecated use `addEdge(key, END)` instead\n   */\n  setFinishPoint(key: N): this {\n    this.warnIfCompiled(\n      \"Setting a finish point of a graph that has already been compiled. This will not be reflected in the compiled graph.\"\n    );\n\n    return this.addEdge(key, END);\n  }\n\n  compile({\n    checkpointer,\n    interruptBefore,\n    interruptAfter,\n    name,\n  }: {\n    checkpointer?: BaseCheckpointSaver | false;\n    interruptBefore?: N[] | All;\n    interruptAfter?: N[] | All;\n    name?: string;\n  } = {}): CompiledGraph<N> {\n    // validate the graph\n    this.validate([\n      ...(Array.isArray(interruptBefore) ? interruptBefore : []),\n      ...(Array.isArray(interruptAfter) ? interruptAfter : []),\n    ]);\n\n    // create empty compiled graph\n    const compiled = new CompiledGraph({\n      builder: this,\n      checkpointer,\n      interruptAfter,\n      interruptBefore,\n      autoValidate: false,\n      nodes: {} as Record<N | typeof START, PregelNode<RunInput, RunOutput>>,\n      channels: {\n        [START]: new EphemeralValue(),\n        [END]: new EphemeralValue(),\n      } as Record<N | typeof START | typeof END | string, BaseChannel>,\n      inputChannels: START,\n      outputChannels: END,\n      streamChannels: [] as N[],\n      streamMode: \"values\",\n      name,\n    });\n\n    // attach nodes, edges and branches\n    for (const [key, node] of Object.entries<NodeSpec<RunInput, RunOutput>>(\n      this.nodes\n    )) {\n      compiled.attachNode(key as N, node);\n    }\n    for (const [start, end] of this.edges) {\n      compiled.attachEdge(start, end);\n    }\n    for (const [start, branches] of Object.entries(this.branches)) {\n      for (const [name, branch] of Object.entries(branches)) {\n        compiled.attachBranch(start as N, name, branch);\n      }\n    }\n\n    return compiled.validate();\n  }\n\n  validate(interrupt?: string[]): void {\n    // assemble sources\n    const allSources = new Set([...this.allEdges].map(([src, _]) => src));\n    for (const [start] of Object.entries(this.branches)) {\n      allSources.add(start);\n    }\n\n    // validate sources\n    for (const source of allSources) {\n      if (source !== START && !(source in this.nodes)) {\n        throw new Error(`Found edge starting at unknown node \\`${source}\\``);\n      }\n    }\n\n    // assemble targets\n    const allTargets = new Set([...this.allEdges].map(([_, target]) => target));\n    for (const [start, branches] of Object.entries(this.branches)) {\n      for (const branch of Object.values(branches)) {\n        if (branch.ends != null) {\n          for (const end of Object.values(branch.ends)) {\n            allTargets.add(end);\n          }\n        } else {\n          allTargets.add(END);\n          for (const node of Object.keys(this.nodes)) {\n            if (node !== start) {\n              allTargets.add(node);\n            }\n          }\n        }\n      }\n    }\n    for (const node of Object.values<NodeSpecType>(this.nodes)) {\n      for (const target of node.ends ?? []) {\n        allTargets.add(target);\n      }\n    }\n    // validate targets\n    for (const node of Object.keys(this.nodes)) {\n      if (!allTargets.has(node)) {\n        throw new UnreachableNodeError(\n          [\n            `Node \\`${node}\\` is not reachable.`,\n            \"\",\n            \"If you are returning Command objects from your node,\",\n            'make sure you are passing names of potential destination nodes as an \"ends\" array',\n            'into \".addNode(..., { ends: [\"node1\", \"node2\"] })\".',\n          ].join(\"\\n\"),\n          {\n            lc_error_code: \"UNREACHABLE_NODE\",\n          }\n        );\n      }\n    }\n    for (const target of allTargets) {\n      if (target !== END && !(target in this.nodes)) {\n        throw new Error(`Found edge ending at unknown node \\`${target}\\``);\n      }\n    }\n\n    // validate interrupts\n    if (interrupt) {\n      for (const node of interrupt) {\n        if (!(node in this.nodes)) {\n          throw new Error(`Interrupt node \\`${node}\\` is not present`);\n        }\n      }\n    }\n\n    this.compiled = true;\n  }\n}\n\nexport class CompiledGraph<\n  N extends string,\n  State = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n  Update = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n  ContextType extends Record<string, any> = Record<string, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n  InputType = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n  OutputType = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n  NodeReturnType = unknown,\n  CommandType = unknown,\n  StreamCustomType = any // eslint-disable-line @typescript-eslint/no-explicit-any\n> extends Pregel<\n  Record<N | typeof START, PregelNode<State, Update>>,\n  Record<N | typeof START | typeof END | string, BaseChannel>,\n  ContextType & Record<string, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n  InputType,\n  OutputType,\n  InputType,\n  OutputType,\n  NodeReturnType,\n  CommandType,\n  StreamCustomType\n> {\n  declare \"~NodeType\": N;\n\n  declare \"~NodeReturnType\": NodeReturnType;\n\n  declare \"~RunInput\": Update;\n\n  declare \"~RunOutput\": State;\n\n  builder: Graph<N, State, Update>;\n\n  constructor({\n    builder,\n    ...rest\n  }: { builder: Graph<N, State, Update> } & PregelParams<\n    Record<N | typeof START, PregelNode<State, Update>>,\n    Record<N | typeof START | typeof END | string, BaseChannel>\n  >) {\n    super(rest);\n    this.builder = builder;\n  }\n\n  attachNode(key: N, node: NodeSpec<State, Update>): void {\n    this.channels[key] = new EphemeralValue();\n    this.nodes[key] = new PregelNode({\n      channels: [],\n      triggers: [],\n      metadata: node.metadata,\n      subgraphs: node.subgraphs,\n      ends: node.ends,\n    })\n      .pipe(node.runnable)\n      .pipe(\n        new ChannelWrite([{ channel: key, value: PASSTHROUGH }], [TAG_HIDDEN])\n      );\n    (this.streamChannels as N[]).push(key);\n  }\n\n  attachEdge(start: N | typeof START, end: N | typeof END): void {\n    if (end === END) {\n      if (start === START) {\n        throw new Error(\"Cannot have an edge from START to END\");\n      }\n      this.nodes[start].writers.push(\n        new ChannelWrite([{ channel: END, value: PASSTHROUGH }], [TAG_HIDDEN])\n      );\n    } else {\n      this.nodes[end].triggers.push(start);\n      (this.nodes[end].channels as string[]).push(start);\n    }\n  }\n\n  attachBranch(\n    start: N | typeof START,\n    name: string,\n    branch: Branch<State, N>\n  ) {\n    // add hidden start node\n    if (start === START && !this.nodes[START]) {\n      this.nodes[START] = Channel.subscribeTo(START, { tags: [TAG_HIDDEN] });\n    }\n\n    // attach branch writer\n    this.nodes[start].pipe(\n      branch.run((dests) => {\n        const writes = dests.map((dest) => {\n          if (_isSend(dest)) {\n            return dest;\n          }\n          return {\n            channel: dest === END ? END : `branch:${start}:${name}:${dest}`,\n            value: PASSTHROUGH,\n          };\n        });\n        return new ChannelWrite(writes, [TAG_HIDDEN]);\n      })\n    );\n\n    // attach branch readers\n    const ends = branch.ends\n      ? Object.values(branch.ends)\n      : (Object.keys(this.nodes) as N[]);\n    for (const end of ends) {\n      if (end !== END) {\n        const channelName = `branch:${start}:${name}:${end}`;\n        (this.channels as Record<string, BaseChannel>)[channelName] =\n          new EphemeralValue();\n        this.nodes[end].triggers.push(channelName);\n        (this.nodes[end].channels as string[]).push(channelName);\n      }\n    }\n  }\n\n  /**\n   * Returns a drawable representation of the computation graph.\n   */\n  override async getGraphAsync(\n    config?: RunnableConfig & { xray?: boolean | number }\n  ): Promise<DrawableGraph> {\n    const xray = config?.xray;\n    const graph = new DrawableGraph();\n    const startNodes: Record<string, DrawableGraphNode> = {\n      [START]: graph.addNode({ schema: z.any() }, START),\n    };\n    const endNodes: Record<string, DrawableGraphNode> = {};\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let subgraphs: Record<string, CompiledGraph<any>> = {};\n    if (xray) {\n      subgraphs = Object.fromEntries(\n        (await gatherIterator(this.getSubgraphsAsync())).filter(\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          (x): x is [string, CompiledGraph<any>] => isCompiledGraph(x[1])\n        )\n      );\n    }\n\n    function addEdge(\n      start: string,\n      end: string,\n      label?: string,\n      conditional = false\n    ) {\n      if (end === END && endNodes[END] === undefined) {\n        endNodes[END] = graph.addNode({ schema: z.any() }, END);\n      }\n      if (startNodes[start] === undefined) {\n        return;\n      }\n      if (endNodes[end] === undefined) {\n        throw new Error(`End node ${end} not found!`);\n      }\n      return graph.addEdge(\n        startNodes[start],\n        endNodes[end],\n        label !== end ? label : undefined,\n        conditional\n      );\n    }\n\n    for (const [key, nodeSpec] of Object.entries(this.builder.nodes) as [\n      N,\n      NodeSpec<State, Update>\n    ][]) {\n      const displayKey = _escapeMermaidKeywords(key);\n      const node = nodeSpec.runnable;\n      const metadata = nodeSpec.metadata ?? {};\n      if (\n        this.interruptBefore?.includes(key) &&\n        this.interruptAfter?.includes(key)\n      ) {\n        metadata.__interrupt = \"before,after\";\n      } else if (this.interruptBefore?.includes(key)) {\n        metadata.__interrupt = \"before\";\n      } else if (this.interruptAfter?.includes(key)) {\n        metadata.__interrupt = \"after\";\n      }\n      if (xray) {\n        const newXrayValue = typeof xray === \"number\" ? xray - 1 : xray;\n        const drawableSubgraph =\n          subgraphs[key] !== undefined\n            ? await subgraphs[key].getGraphAsync({\n                ...config,\n                xray: newXrayValue,\n              })\n            : node.getGraph(config);\n\n        drawableSubgraph.trimFirstNode();\n        drawableSubgraph.trimLastNode();\n\n        if (Object.keys(drawableSubgraph.nodes).length > 1) {\n          const [e, s] = graph.extend(drawableSubgraph, displayKey);\n          if (e === undefined) {\n            throw new Error(\n              `Could not extend subgraph \"${key}\" due to missing entrypoint.`\n            );\n          }\n\n          // TODO: Remove default name once we stop supporting core 0.2.0\n          // eslint-disable-next-line no-inner-declarations\n          function _isRunnableInterface(\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            thing: any\n          ): thing is RunnableInterface {\n            return thing ? thing.lc_runnable : false;\n          }\n          // eslint-disable-next-line no-inner-declarations\n          function _nodeDataStr(\n            id: string | undefined,\n            data: RunnableInterface | RunnableIOSchema\n          ): string {\n            if (id !== undefined && !isUuid(id)) {\n              return id;\n            } else if (_isRunnableInterface(data)) {\n              try {\n                let dataStr = data.getName();\n                dataStr = dataStr.startsWith(\"Runnable\")\n                  ? dataStr.slice(\"Runnable\".length)\n                  : dataStr;\n                return dataStr;\n              } catch (error) {\n                return data.getName();\n              }\n            } else {\n              return data.name ?? \"UnknownSchema\";\n            }\n          }\n          // TODO: Remove casts when we stop supporting core 0.2.0\n          if (s !== undefined) {\n            startNodes[displayKey] = {\n              name: _nodeDataStr(s.id, s.data),\n              ...s,\n            } as DrawableGraphNode;\n          }\n          endNodes[displayKey] = {\n            name: _nodeDataStr(e.id, e.data),\n            ...e,\n          } as DrawableGraphNode;\n        } else {\n          // TODO: Remove when we stop supporting core 0.2.0\n          // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n          // @ts-ignore\n          const newNode = graph.addNode(node, displayKey, metadata);\n          startNodes[displayKey] = newNode;\n          endNodes[displayKey] = newNode;\n        }\n      } else {\n        // TODO: Remove when we stop supporting core 0.2.0\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        const newNode = graph.addNode(node, displayKey, metadata);\n        startNodes[displayKey] = newNode;\n        endNodes[displayKey] = newNode;\n      }\n    }\n    const sortedEdges = [...this.builder.allEdges].sort(([a], [b]) => {\n      if (a < b) {\n        return -1;\n      } else if (b > a) {\n        return 1;\n      } else {\n        return 0;\n      }\n    });\n    for (const [start, end] of sortedEdges) {\n      addEdge(_escapeMermaidKeywords(start), _escapeMermaidKeywords(end));\n    }\n    for (const [start, branches] of Object.entries(this.builder.branches)) {\n      const defaultEnds: Record<string, string> = {\n        ...Object.fromEntries(\n          Object.keys(this.builder.nodes)\n            .filter((k) => k !== start)\n            .map((k) => [_escapeMermaidKeywords(k), _escapeMermaidKeywords(k)])\n        ),\n        [END]: END,\n      };\n      for (const branch of Object.values(branches)) {\n        let ends;\n        if (branch.ends !== undefined) {\n          ends = branch.ends;\n        } else {\n          ends = defaultEnds;\n        }\n        for (const [label, end] of Object.entries(ends)) {\n          addEdge(\n            _escapeMermaidKeywords(start),\n            _escapeMermaidKeywords(end),\n            label,\n            true\n          );\n        }\n      }\n    }\n    for (const [key, node] of Object.entries(this.builder.nodes) as [\n      N,\n      NodeSpec<State, Update>\n    ][]) {\n      if (node.ends !== undefined) {\n        for (const end of node.ends) {\n          addEdge(\n            _escapeMermaidKeywords(key),\n            _escapeMermaidKeywords(end),\n            undefined,\n            true\n          );\n        }\n      }\n    }\n    return graph;\n  }\n\n  /**\n   * Returns a drawable representation of the computation graph.\n   *\n   * @deprecated Use getGraphAsync instead. The async method will be the default in the next minor core release.\n   */\n  override getGraph(\n    config?: RunnableConfig & { xray?: boolean | number }\n  ): DrawableGraph {\n    const xray = config?.xray;\n    const graph = new DrawableGraph();\n    const startNodes: Record<string, DrawableGraphNode> = {\n      [START]: graph.addNode(\n        {\n          schema: z.any(),\n        },\n        START\n      ),\n    };\n    const endNodes: Record<string, DrawableGraphNode> = {};\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let subgraphs: Record<string, CompiledGraph<any>> = {};\n    if (xray) {\n      subgraphs = Object.fromEntries(\n        gatherIteratorSync(this.getSubgraphs()).filter(\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          (x): x is [string, CompiledGraph<any>] => isCompiledGraph(x[1])\n        )\n      );\n    }\n\n    function addEdge(\n      start: string,\n      end: string,\n      label?: string,\n      conditional = false\n    ) {\n      if (end === END && endNodes[END] === undefined) {\n        endNodes[END] = graph.addNode({ schema: z.any() }, END);\n      }\n      return graph.addEdge(\n        startNodes[start],\n        endNodes[end],\n        label !== end ? label : undefined,\n        conditional\n      );\n    }\n\n    for (const [key, nodeSpec] of Object.entries(this.builder.nodes) as [\n      N,\n      NodeSpec<State, Update>\n    ][]) {\n      const displayKey = _escapeMermaidKeywords(key);\n      const node = nodeSpec.runnable;\n      const metadata = nodeSpec.metadata ?? {};\n      if (\n        this.interruptBefore?.includes(key) &&\n        this.interruptAfter?.includes(key)\n      ) {\n        metadata.__interrupt = \"before,after\";\n      } else if (this.interruptBefore?.includes(key)) {\n        metadata.__interrupt = \"before\";\n      } else if (this.interruptAfter?.includes(key)) {\n        metadata.__interrupt = \"after\";\n      }\n      if (xray) {\n        const newXrayValue = typeof xray === \"number\" ? xray - 1 : xray;\n        const drawableSubgraph =\n          subgraphs[key] !== undefined\n            ? subgraphs[key].getGraph({\n                ...config,\n                xray: newXrayValue,\n              })\n            : node.getGraph(config);\n        drawableSubgraph.trimFirstNode();\n        drawableSubgraph.trimLastNode();\n        if (Object.keys(drawableSubgraph.nodes).length > 1) {\n          const [e, s] = graph.extend(drawableSubgraph, displayKey);\n          if (e === undefined) {\n            throw new Error(\n              `Could not extend subgraph \"${key}\" due to missing entrypoint.`\n            );\n          }\n\n          // TODO: Remove default name once we stop supporting core 0.2.0\n          // eslint-disable-next-line no-inner-declarations\n          function _isRunnableInterface(\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            thing: any\n          ): thing is RunnableInterface {\n            return thing ? thing.lc_runnable : false;\n          }\n          // eslint-disable-next-line no-inner-declarations\n          function _nodeDataStr(\n            id: string | undefined,\n            data: RunnableInterface | RunnableIOSchema\n          ): string {\n            if (id !== undefined && !isUuid(id)) {\n              return id;\n            } else if (_isRunnableInterface(data)) {\n              try {\n                let dataStr = data.getName();\n                dataStr = dataStr.startsWith(\"Runnable\")\n                  ? dataStr.slice(\"Runnable\".length)\n                  : dataStr;\n                return dataStr;\n              } catch (error) {\n                return data.getName();\n              }\n            } else {\n              return data.name ?? \"UnknownSchema\";\n            }\n          }\n          // TODO: Remove casts when we stop supporting core 0.2.0\n          if (s !== undefined) {\n            startNodes[displayKey] = {\n              name: _nodeDataStr(s.id, s.data),\n              ...s,\n            } as DrawableGraphNode;\n          }\n          endNodes[displayKey] = {\n            name: _nodeDataStr(e.id, e.data),\n            ...e,\n          } as DrawableGraphNode;\n        } else {\n          // TODO: Remove when we stop supporting core 0.2.0\n          // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n          // @ts-ignore\n          const newNode = graph.addNode(node, displayKey, metadata);\n          startNodes[displayKey] = newNode;\n          endNodes[displayKey] = newNode;\n        }\n      } else {\n        // TODO: Remove when we stop supporting core 0.2.0\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        const newNode = graph.addNode(node, displayKey, metadata);\n        startNodes[displayKey] = newNode;\n        endNodes[displayKey] = newNode;\n      }\n    }\n    const sortedEdges = [...this.builder.allEdges].sort(([a], [b]) => {\n      if (a < b) {\n        return -1;\n      } else if (b > a) {\n        return 1;\n      } else {\n        return 0;\n      }\n    });\n    for (const [start, end] of sortedEdges) {\n      addEdge(_escapeMermaidKeywords(start), _escapeMermaidKeywords(end));\n    }\n    for (const [start, branches] of Object.entries(this.builder.branches)) {\n      const defaultEnds: Record<string, string> = {\n        ...Object.fromEntries(\n          Object.keys(this.builder.nodes)\n            .filter((k) => k !== start)\n            .map((k) => [_escapeMermaidKeywords(k), _escapeMermaidKeywords(k)])\n        ),\n        [END]: END,\n      };\n      for (const branch of Object.values(branches)) {\n        let ends;\n        if (branch.ends !== undefined) {\n          ends = branch.ends;\n        } else {\n          ends = defaultEnds;\n        }\n        for (const [label, end] of Object.entries(ends)) {\n          addEdge(\n            _escapeMermaidKeywords(start),\n            _escapeMermaidKeywords(end),\n            label,\n            true\n          );\n        }\n      }\n    }\n    return graph;\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isCompiledGraph(x: unknown): x is CompiledGraph<any> {\n  return (\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    typeof (x as CompiledGraph<any>).attachNode === \"function\" &&\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    typeof (x as CompiledGraph<any>).attachEdge === \"function\"\n  );\n}\n\nfunction _escapeMermaidKeywords(key: string) {\n  if (key === \"subgraph\") {\n    return `\"${key}\"`;\n  }\n  return key;\n}\n"],"mappings":"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"}