{"version":3,"file":"remote.cjs","names":["BaseMessage","Runnable","Client","propagateConfigurableToMetadata","isCommand","RemoteGraphRunStream","IterableReadableStreamWithAbortSignal","#prepareRunRequest","CONFIG_KEY_STREAM","GraphInterrupt","INTERRUPT","RemoteException","DrawableGraph"],"sources":["../../src/pregel/remote.ts"],"sourcesContent":["import {\n  Client,\n  type Checkpoint,\n  type ThreadState,\n} from \"@langchain/langgraph-sdk\";\nimport {\n  Graph as DrawableGraph,\n  Node as DrawableNode,\n} from \"@langchain/core/runnables/graph\";\nimport {\n  mergeConfigs,\n  Runnable,\n  RunnableConfig,\n} from \"@langchain/core/runnables\";\nimport {\n  All,\n  CheckpointListOptions,\n  CheckpointMetadata,\n} from \"@langchain/langgraph-checkpoint\";\nimport { StreamEvent } from \"@langchain/core/tracers/log_stream\";\nimport { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport { BaseMessage } from \"@langchain/core/messages\";\n\nimport {\n  BaseChannel,\n  GraphInterrupt,\n  LangGraphRunnableConfig,\n  RemoteException,\n} from \"../web.js\";\nimport { StrRecord } from \"./algo.js\";\nimport { PregelInputType, PregelOptions, PregelOutputType } from \"./index.js\";\nimport { PregelNode } from \"./read.js\";\nimport { RemoteGraphRunStream } from \"./remote-run-stream.js\";\nimport { IterableReadableStreamWithAbortSignal } from \"./stream.js\";\nimport {\n  PregelParams,\n  PregelInterface,\n  PregelTaskDescription,\n  StateSnapshot,\n  StreamMode,\n} from \"./types.js\";\nimport {\n  CHECKPOINT_NAMESPACE_SEPARATOR,\n  CONFIG_KEY_STREAM,\n  INTERRUPT,\n  isCommand,\n} from \"../constants.js\";\nimport { propagateConfigurableToMetadata } from \"./utils/config.js\";\nimport type { ProtocolEvent } from \"../stream/types.js\";\n\nexport type RemoteGraphParams = Omit<\n  PregelParams<StrRecord<string, PregelNode>, StrRecord<string, BaseChannel>>,\n  \"channels\" | \"nodes\" | \"inputChannels\" | \"outputChannels\"\n> & {\n  graphId: string;\n  client?: Client;\n  url?: string;\n  apiKey?: string;\n  headers?: Record<string, string>;\n  streamResumable?: boolean;\n};\n\ntype StreamEventsOptions = Parameters<Runnable[\"streamEvents\"]>[2];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _serializeInputs = (obj: any): any => {\n  if (obj === null || typeof obj !== \"object\") {\n    return obj;\n  }\n\n  if (Array.isArray(obj)) {\n    return obj.map(_serializeInputs);\n  }\n\n  // Handle BaseMessage instances by converting them to a serializable format\n  if (BaseMessage.isInstance(obj)) {\n    const dict = obj.toDict();\n    return {\n      ...dict.data,\n      role: obj.getType(),\n    };\n  }\n\n  return Object.fromEntries(\n    Object.entries(obj).map(([key, value]) => [key, _serializeInputs(value)])\n  );\n};\n\n/**\n * Return a tuple of the final list of stream modes sent to the\n * remote graph and a boolean flag indicating if only one stream mode was\n * originally requested and whether stream mode 'updates'\n * was present in the original list of stream modes.\n *\n * 'updates' mode is always added to the list of stream modes so that interrupts\n * can be detected in the remote graph.\n */\nconst getStreamModes = (\n  streamMode?: StreamMode | StreamMode[],\n  defaultStreamMode: StreamMode = \"updates\"\n) => {\n  const updatedStreamModes: StreamMode[] = [];\n  let reqUpdates = false;\n  let reqSingle = true;\n\n  if (\n    streamMode !== undefined &&\n    (typeof streamMode === \"string\" ||\n      (Array.isArray(streamMode) && streamMode.length > 0))\n  ) {\n    reqSingle = typeof streamMode === \"string\";\n    const mapped = Array.isArray(streamMode) ? streamMode : [streamMode];\n    updatedStreamModes.push(...mapped);\n  } else {\n    updatedStreamModes.push(defaultStreamMode);\n  }\n  if (updatedStreamModes.includes(\"updates\")) {\n    reqUpdates = true;\n  } else {\n    updatedStreamModes.push(\"updates\");\n  }\n  return {\n    updatedStreamModes,\n    reqUpdates,\n    reqSingle,\n  };\n};\n\nfunction protocolEventsToEventStream(run: AsyncIterable<ProtocolEvent>) {\n  const encoder = new TextEncoder();\n\n  return new ReadableStream<Uint8Array>({\n    async start(controller) {\n      try {\n        for await (const event of run) {\n          const namespace = event.params.namespace;\n          const eventName = namespace.length\n            ? `${event.method}|${namespace.join(\"|\")}`\n            : event.method;\n          controller.enqueue(\n            encoder.encode(\n              `event: ${eventName}\\ndata: ${JSON.stringify(event.params.data ?? {})}\\n\\n`\n            )\n          );\n        }\n      } catch (error) {\n        controller.enqueue(\n          encoder.encode(\n            `event: error\\ndata: ${JSON.stringify({ message: String(error) })}\\n\\n`\n          )\n        );\n      } finally {\n        controller.close();\n      }\n    },\n  });\n}\n\n/**\n * The `RemoteGraph` class is a client implementation for calling remote\n * APIs that implement the LangGraph Server API specification.\n *\n * For example, the `RemoteGraph` class can be used to call APIs from deployments\n * on LangSmith Deployment.\n *\n * `RemoteGraph` behaves the same way as a `StateGraph` and can be used directly as\n * a node in another `StateGraph`.\n *\n * @example\n * ```ts\n * import { RemoteGraph } from \"@langchain/langgraph/remote\";\n *\n * // Can also pass a LangGraph SDK client instance directly\n * const remoteGraph = new RemoteGraph({\n *   graphId: process.env.LANGGRAPH_REMOTE_GRAPH_ID!,\n *   apiKey: process.env.LANGGRAPH_REMOTE_GRAPH_API_KEY,\n *   url: process.env.LANGGRAPH_REMOTE_GRAPH_API_URL,\n * });\n *\n * const input = {\n *   messages: [\n *     {\n *       role: \"human\",\n *       content: \"Hello world!\",\n *     },\n *   ],\n * };\n *\n * const config = {\n *   configurable: { thread_id: \"threadId1\" },\n * };\n *\n * await remoteGraph.invoke(input, config);\n * ```\n */\nexport class RemoteGraph<\n  Nn extends StrRecord<string, PregelNode> = StrRecord<string, PregelNode>,\n  Cc extends StrRecord<string, BaseChannel> = StrRecord<string, BaseChannel>,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  ContextType extends Record<string, any> = StrRecord<string, any>,\n>\n  extends Runnable<\n    PregelInputType,\n    PregelOutputType,\n    PregelOptions<Nn, Cc, ContextType>\n  >\n  implements PregelInterface<Nn, Cc, ContextType>\n{\n  static lc_name() {\n    return \"RemoteGraph\";\n  }\n\n  lc_namespace = [\"langgraph\", \"pregel\"];\n\n  lg_is_pregel = true;\n\n  config?: RunnableConfig;\n\n  graphId: string;\n\n  protected client: Client;\n\n  protected interruptBefore?: Array<keyof Nn> | All;\n\n  protected interruptAfter?: Array<keyof Nn> | All;\n\n  protected streamResumable?: boolean;\n\n  constructor(params: RemoteGraphParams) {\n    super(params);\n\n    this.graphId = params.graphId;\n    this.client =\n      params.client ??\n      new Client({\n        apiUrl: params.url,\n        apiKey: params.apiKey,\n        defaultHeaders: params.headers,\n      });\n    this.config = params.config;\n    this.interruptBefore = params.interruptBefore;\n    this.interruptAfter = params.interruptAfter;\n    this.streamResumable = params.streamResumable;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore Remove ignore when we remove support for 0.2 versions of core\n  override withConfig(config: RunnableConfig): typeof this {\n    const mergedConfig = mergeConfigs(this.config, config);\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return new (this.constructor as any)({ ...this, config: mergedConfig });\n  }\n\n  protected _sanitizeConfig(config: RunnableConfig) {\n    const reservedConfigurableKeys = new Set([\n      \"callbacks\",\n      \"checkpoint_map\",\n      \"checkpoint_id\",\n      \"checkpoint_ns\",\n    ]);\n\n    const sanitizeObj = <T>(obj: T): T => {\n      try {\n        // This will only throw if we're trying to serialize a circular reference\n        // or trying to serialize a BigInt...\n        JSON.stringify(obj);\n        return obj;\n      } catch {\n        const seen = new WeakSet();\n        return JSON.parse(\n          JSON.stringify(obj, (_, value) => {\n            if (typeof value === \"object\" && value != null) {\n              if (seen.has(value)) return \"[Circular]\";\n              seen.add(value);\n            }\n\n            if (typeof value === \"bigint\") return value.toString();\n            return value;\n          })\n        );\n      }\n    };\n\n    const propagateMetadataDefaults = (obj: unknown) => {\n      const seen = new WeakSet<object>();\n      const visit = (value: unknown) => {\n        if (typeof value !== \"object\" || value == null) {\n          return;\n        }\n        if (seen.has(value)) {\n          return;\n        }\n        seen.add(value);\n        const record = value as Record<string, unknown>;\n        const configurable = record.configurable;\n        if (\n          typeof configurable === \"object\" &&\n          configurable != null &&\n          !Array.isArray(configurable)\n        ) {\n          const metadata =\n            typeof record.metadata === \"object\" &&\n            record.metadata != null &&\n            !Array.isArray(record.metadata)\n              ? (record.metadata as Record<string, unknown>)\n              : undefined;\n          record.metadata =\n            propagateConfigurableToMetadata(\n              configurable as Record<string, unknown>,\n              metadata\n            ) ?? record.metadata;\n        }\n        for (const nestedValue of Object.values(record)) {\n          visit(nestedValue);\n        }\n      };\n      visit(obj);\n    };\n\n    propagateMetadataDefaults(config);\n\n    // Remove non-JSON serializable fields from the config\n    const sanitizedConfig = sanitizeObj(config);\n\n    // Only include configurable keys that are not reserved and\n    // not starting with \"__pregel_\" prefix\n    const newConfigurable = Object.fromEntries(\n      Object.entries(sanitizedConfig.configurable ?? {}).filter(\n        ([k]) => !reservedConfigurableKeys.has(k) && !k.startsWith(\"__pregel_\")\n      )\n    );\n\n    return {\n      tags: sanitizedConfig.tags ?? [],\n      metadata: sanitizedConfig.metadata ?? {},\n      configurable: newConfigurable,\n      recursion_limit: sanitizedConfig.recursionLimit,\n    };\n  }\n\n  /**\n   * Prepare config and thread ID for remote run API calls.\n   *\n   * `thread_id` is passed via the URL path, not in `config.configurable`, so the\n   * server can accept a separate `context` payload for stateful runs.\n   */\n  #prepareRunRequest(mergedConfig: LangGraphRunnableConfig): {\n    threadId: string | undefined;\n    context: unknown;\n    config: ReturnType<RemoteGraph[\"_sanitizeConfig\"]>;\n  } {\n    const context = mergedConfig.context;\n    const sanitizedConfig = this._sanitizeConfig(mergedConfig);\n    const configurable = { ...sanitizedConfig.configurable };\n    const threadId = configurable.thread_id as string | undefined;\n    delete configurable.thread_id;\n\n    return {\n      threadId,\n      context,\n      config: {\n        ...sanitizedConfig,\n        configurable,\n      },\n    };\n  }\n\n  protected _getConfig(checkpoint: Record<string, unknown>): RunnableConfig {\n    return {\n      configurable: {\n        thread_id: checkpoint.thread_id,\n        checkpoint_ns: checkpoint.checkpoint_ns,\n        checkpoint_id: checkpoint.checkpoint_id,\n        checkpoint_map: checkpoint.checkpoint_map ?? {},\n      },\n    };\n  }\n\n  protected _checkpointToConfig(\n    checkpoint?: Partial<Checkpoint> | null,\n    fallbackConfig?: RunnableConfig\n  ): RunnableConfig {\n    const resolvedCheckpoint =\n      checkpoint ?? this._getCheckpoint(fallbackConfig);\n    if (resolvedCheckpoint == null) {\n      return { configurable: {} };\n    }\n\n    const configurable: Record<string, unknown> = {};\n    if (resolvedCheckpoint.thread_id !== undefined) {\n      configurable.thread_id = resolvedCheckpoint.thread_id;\n    }\n    if (resolvedCheckpoint.checkpoint_ns !== undefined) {\n      configurable.checkpoint_ns = resolvedCheckpoint.checkpoint_ns;\n    }\n    if (resolvedCheckpoint.checkpoint_id !== undefined) {\n      configurable.checkpoint_id = resolvedCheckpoint.checkpoint_id;\n    }\n\n    const hasCheckpointFields =\n      resolvedCheckpoint.checkpoint_ns !== undefined ||\n      resolvedCheckpoint.checkpoint_id !== undefined ||\n      resolvedCheckpoint.checkpoint_map !== undefined;\n    if (hasCheckpointFields) {\n      configurable.checkpoint_map = resolvedCheckpoint.checkpoint_map ?? {};\n    }\n\n    return { configurable };\n  }\n\n  protected _getCheckpoint(config?: RunnableConfig): Checkpoint | undefined {\n    if (config?.configurable === undefined) {\n      return undefined;\n    }\n\n    const checkpointKeys = [\n      \"thread_id\",\n      \"checkpoint_ns\",\n      \"checkpoint_id\",\n      \"checkpoint_map\",\n    ] as const;\n\n    const checkpoint = Object.fromEntries(\n      checkpointKeys\n        .map((key) => [key, config.configurable![key]])\n        .filter(([_, value]) => value !== undefined)\n    );\n\n    return Object.keys(checkpoint).length > 0 ? checkpoint : undefined;\n  }\n\n  protected _createStateSnapshot(\n    state: ThreadState,\n    fallbackConfig?: RunnableConfig\n  ): StateSnapshot {\n    const tasks: PregelTaskDescription[] = state.tasks.map((task) => {\n      return {\n        id: task.id,\n        name: task.name,\n        error: task.error ? { message: task.error } : undefined,\n        // TODO: remove in LangGraph.js 0.4\n        interrupts: task.interrupts.map(({ id, ...rest }) => ({\n          interrupt_id: id,\n          ...rest,\n        })),\n        // eslint-disable-next-line no-nested-ternary\n        state: task.state\n          ? this._createStateSnapshot(\n              task.state,\n              task.checkpoint\n                ? this._checkpointToConfig(task.checkpoint)\n                : fallbackConfig\n            )\n          : task.checkpoint\n            ? { configurable: task.checkpoint }\n            : undefined,\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        result: (task as any).result,\n      };\n    });\n\n    return {\n      values: state.values,\n      next: state.next ? [...state.next] : [],\n      // TODO: Fix SDK typing. `ThreadState.checkpoint` is typed as non-null,\n      // but deployments can return `null` (e.g. a thread that exists but has\n      // not produced a checkpoint yet). See #2328.\n      config: this._checkpointToConfig(\n        state.checkpoint as Checkpoint | null,\n        fallbackConfig\n      ),\n      metadata: state.metadata\n        ? (state.metadata as CheckpointMetadata)\n        : undefined,\n      createdAt: state.created_at ?? undefined,\n      parentConfig: state.parent_checkpoint\n        ? this._checkpointToConfig(state.parent_checkpoint)\n        : undefined,\n      tasks,\n    };\n  }\n\n  override async invoke(\n    input: PregelInputType,\n    options?: Partial<PregelOptions<Nn, Cc, ContextType>>\n  ): Promise<PregelOutputType> {\n    let lastValue;\n    const stream = await this.stream(input, {\n      ...options,\n      streamMode: \"values\",\n    });\n    for await (const chunk of stream) {\n      lastValue = chunk;\n    }\n    return lastValue;\n  }\n\n  override streamEvents(\n    input: PregelInputType,\n    options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n      version: \"v3\";\n      encoding: \"text/event-stream\";\n    }\n  ): Promise<IterableReadableStream<Uint8Array>>;\n\n  override streamEvents(\n    input: PregelInputType,\n    options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n      version: \"v3\";\n      encoding?: undefined;\n    }\n  ): Promise<RemoteGraphRunStream<PregelOutputType>>;\n\n  override streamEvents(\n    input: PregelInputType,\n    options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n      version: \"v1\" | \"v2\";\n    },\n    streamOptions?: StreamEventsOptions\n  ): IterableReadableStream<StreamEvent>;\n\n  override streamEvents(\n    input: PregelInputType,\n    options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n      version: \"v1\" | \"v2\";\n      encoding: \"text/event-stream\";\n    },\n    streamOptions?: StreamEventsOptions\n  ): IterableReadableStream<Uint8Array>;\n\n  override streamEvents(\n    input: PregelInputType,\n    options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n      version: \"v1\" | \"v2\" | \"v3\";\n      encoding?: \"text/event-stream\";\n    },\n    _streamOptions?: StreamEventsOptions\n  ):\n    | IterableReadableStream<StreamEvent | Uint8Array>\n    | Promise<RemoteGraphRunStream<PregelOutputType>>\n    | Promise<IterableReadableStream<Uint8Array>>\n    | Promise<\n        | RemoteGraphRunStream<PregelOutputType>\n        | IterableReadableStream<Uint8Array>\n      > {\n    if (options.version === \"v3\") {\n      return this._streamEventsV3(\n        input,\n        options as Partial<PregelOptions<Nn, Cc, ContextType>> & {\n          version: \"v3\";\n          encoding?: \"text/event-stream\";\n        }\n      );\n    }\n    throw new Error(\"Not implemented.\");\n  }\n\n  protected _rejectV3Unsupported(\n    options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      transformers?: any;\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      control?: any;\n    }\n  ) {\n    if (options.transformers !== undefined) {\n      throw new Error(\n        'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `transformers`.'\n      );\n    }\n    if (options.control !== undefined) {\n      throw new Error(\n        'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `control`.'\n      );\n    }\n    if (\n      options.interruptBefore !== undefined ||\n      this.interruptBefore !== undefined\n    ) {\n      throw new Error(\n        'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `interruptBefore`.'\n      );\n    }\n    if (\n      options.interruptAfter !== undefined ||\n      this.interruptAfter !== undefined\n    ) {\n      throw new Error(\n        'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `interruptAfter`.'\n      );\n    }\n  }\n\n  protected async _streamEventsV3(\n    input: PregelInputType,\n    options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n      version: \"v3\";\n      encoding?: \"text/event-stream\";\n    }\n  ): Promise<\n    RemoteGraphRunStream<PregelOutputType> | IterableReadableStream<Uint8Array>\n  > {\n    this._rejectV3Unsupported(options);\n\n    const abortController = new AbortController();\n    const mergedConfig = mergeConfigs(this.config, options);\n    const sanitizedConfig = this._sanitizeConfig(mergedConfig);\n    const configurable = { ...sanitizedConfig.configurable };\n    const threadId = configurable.thread_id;\n    delete configurable.thread_id;\n\n    const runConfig = {\n      ...sanitizedConfig,\n      configurable,\n    };\n\n    const thread =\n      typeof threadId === \"string\"\n        ? this.client.threads.stream(threadId, { assistantId: this.graphId })\n        : this.client.threads.stream({ assistantId: this.graphId });\n\n    let serializedInput;\n    if (isCommand(input)) {\n      serializedInput = input.toJSON() as Record<string, unknown>;\n    } else {\n      serializedInput = _serializeInputs(input);\n    }\n\n    const run = await thread.run.start({\n      input: serializedInput,\n      config: runConfig,\n    });\n\n    const graphRun = new RemoteGraphRunStream<PregelOutputType>({\n      client: this.client,\n      thread,\n      runId: run.run_id,\n      abortController,\n    });\n\n    if (mergedConfig.signal != null) {\n      if (mergedConfig.signal.aborted) {\n        graphRun.abort(mergedConfig.signal.reason);\n      } else {\n        mergedConfig.signal.addEventListener(\n          \"abort\",\n          () => graphRun.abort(mergedConfig.signal?.reason),\n          { once: true }\n        );\n      }\n    }\n\n    if (options.encoding === \"text/event-stream\") {\n      const encodingAbortController = new AbortController();\n      encodingAbortController.signal.addEventListener(\n        \"abort\",\n        () => graphRun.abort(encodingAbortController.signal.reason),\n        { once: true }\n      );\n      return new IterableReadableStreamWithAbortSignal(\n        protocolEventsToEventStream(graphRun),\n        encodingAbortController\n      );\n    }\n\n    return graphRun;\n  }\n\n  override async *_streamIterator(\n    input: PregelInputType,\n    options?: Partial<PregelOptions<Nn, Cc, ContextType>>\n  ): AsyncGenerator<PregelOutputType> {\n    const mergedConfig = mergeConfigs(\n      this.config,\n      options\n    ) as LangGraphRunnableConfig;\n    const {\n      threadId,\n      context,\n      config: sanitizedConfig,\n    } = this.#prepareRunRequest(mergedConfig);\n\n    const streamProtocolInstance = options?.configurable?.[CONFIG_KEY_STREAM];\n\n    const streamSubgraphs =\n      options?.subgraphs ?? streamProtocolInstance !== undefined;\n\n    const interruptBefore = options?.interruptBefore ?? this.interruptBefore;\n    const interruptAfter = options?.interruptAfter ?? this.interruptAfter;\n\n    const { updatedStreamModes, reqSingle, reqUpdates } = getStreamModes(\n      options?.streamMode\n    );\n\n    const extendedStreamModes = [\n      ...new Set([\n        ...updatedStreamModes,\n        ...(streamProtocolInstance?.modes ?? new Set()),\n      ]),\n    ].map((mode) => {\n      if (mode === \"messages\") return \"messages-tuple\";\n      return mode;\n    });\n\n    let command;\n    let serializedInput;\n    if (isCommand(input)) {\n      // TODO: Remove cast when SDK type fix gets merged\n      command = input.toJSON() as Record<string, unknown>;\n      serializedInput = undefined;\n    } else {\n      serializedInput = _serializeInputs(input);\n    }\n\n    const streamPayload = {\n      command,\n      input: serializedInput,\n      config: sanitizedConfig,\n      context,\n      streamMode: extendedStreamModes,\n      interruptBefore: interruptBefore as string[],\n      interruptAfter: interruptAfter as string[],\n      streamSubgraphs,\n      ifNotExists: \"create\" as const,\n      signal: mergedConfig.signal,\n      streamResumable: this.streamResumable,\n    };\n\n    const runStream =\n      threadId != null\n        ? this.client.runs.stream(threadId, this.graphId, streamPayload)\n        : this.client.runs.stream(null, this.graphId, streamPayload);\n\n    for await (const chunk of runStream) {\n      let mode;\n      let namespace: string[];\n      if (chunk.event.includes(CHECKPOINT_NAMESPACE_SEPARATOR)) {\n        const eventComponents = chunk.event.split(\n          CHECKPOINT_NAMESPACE_SEPARATOR\n        );\n        // eslint-disable-next-line prefer-destructuring\n        mode = eventComponents[0];\n        namespace = eventComponents.slice(1);\n      } else {\n        mode = chunk.event;\n        namespace = [];\n      }\n      const callerNamespace = options?.configurable?.checkpoint_ns;\n      if (typeof callerNamespace === \"string\") {\n        namespace = callerNamespace\n          .split(CHECKPOINT_NAMESPACE_SEPARATOR)\n          .concat(namespace);\n      }\n      if (\n        streamProtocolInstance !== undefined &&\n        streamProtocolInstance.modes?.has(chunk.event)\n      ) {\n        streamProtocolInstance.push([namespace, mode, chunk.data]);\n      }\n      if (chunk.event.startsWith(\"updates\")) {\n        if (\n          typeof chunk.data === \"object\" &&\n          chunk.data?.[INTERRUPT] !== undefined\n        ) {\n          throw new GraphInterrupt(chunk.data[INTERRUPT]);\n        }\n        if (!reqUpdates) {\n          continue;\n        }\n      } else if (chunk.event?.startsWith(\"error\")) {\n        throw new RemoteException(\n          typeof chunk.data === \"string\"\n            ? chunk.data\n            : JSON.stringify(chunk.data)\n        );\n      }\n      if (\n        !updatedStreamModes.includes(\n          chunk.event.split(CHECKPOINT_NAMESPACE_SEPARATOR)[0] as StreamMode\n        )\n      ) {\n        continue;\n      }\n      if (options?.subgraphs) {\n        if (reqSingle) {\n          yield [namespace, chunk.data];\n        } else {\n          yield [namespace, mode, chunk.data];\n        }\n      } else if (reqSingle) {\n        yield chunk.data;\n      } else {\n        yield [mode, chunk.data];\n      }\n    }\n  }\n\n  async updateState(\n    inputConfig: LangGraphRunnableConfig,\n    values: Record<string, unknown>,\n    asNode?: string\n  ): Promise<RunnableConfig> {\n    const mergedConfig = mergeConfigs(this.config, inputConfig);\n    const response = await this.client.threads.updateState(\n      mergedConfig.configurable?.thread_id,\n      { values, asNode, checkpoint: this._getCheckpoint(mergedConfig) }\n    );\n    // TODO: Fix SDK typing\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return this._getConfig((response as any).checkpoint);\n  }\n\n  async *getStateHistory(\n    config: RunnableConfig,\n    options?: CheckpointListOptions\n  ): AsyncIterableIterator<StateSnapshot> {\n    const mergedConfig = mergeConfigs(this.config, config);\n    const states = await this.client.threads.getHistory(\n      mergedConfig.configurable?.thread_id,\n      {\n        limit: options?.limit ?? 10,\n        // TODO: Fix type\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        before: this._getCheckpoint(options?.before) as any,\n        metadata: options?.filter,\n        checkpoint: this._getCheckpoint(mergedConfig),\n      }\n    );\n    for (const state of states) {\n      yield this._createStateSnapshot(state, mergedConfig);\n    }\n  }\n\n  protected _getDrawableNodes(\n    nodes: Array<{\n      id: string | number;\n      name?: string;\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      data?: Record<string, any> | string;\n      metadata?: unknown;\n    }>\n  ): Record<string, DrawableNode> {\n    const nodesMap: Record<string, DrawableNode> = {};\n    for (const node of nodes) {\n      const nodeId = node.id;\n      nodesMap[nodeId] = {\n        id: nodeId.toString(),\n        name:\n          typeof node.data === \"string\" ? node.data : (node.data?.name ?? \"\"),\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        data: (node.data as any) ?? {},\n        metadata:\n          typeof node.data !== \"string\" ? (node.data?.metadata ?? {}) : {},\n      };\n    }\n    return nodesMap;\n  }\n\n  async getState(\n    config: RunnableConfig,\n    options?: { subgraphs?: boolean }\n  ): Promise<StateSnapshot> {\n    const mergedConfig = mergeConfigs(this.config, config);\n\n    const state = await this.client.threads.getState(\n      mergedConfig.configurable?.thread_id,\n      this._getCheckpoint(mergedConfig),\n      options\n    );\n    return this._createStateSnapshot(state, mergedConfig);\n  }\n\n  /** @deprecated Use getGraphAsync instead. The async method will become the default in the next minor release. */\n  override getGraph(\n    _?: RunnableConfig & { xray?: boolean | number }\n  ): DrawableGraph {\n    throw new Error(\n      `The synchronous \"getGraph\" is not supported for this graph. Call \"getGraphAsync\" instead.`\n    );\n  }\n\n  /**\n   * Returns a drawable representation of the computation graph.\n   */\n  async getGraphAsync(config?: RunnableConfig & { xray?: boolean | number }) {\n    const graph = await this.client.assistants.getGraph(this.graphId, {\n      xray: config?.xray,\n    });\n    return new DrawableGraph({\n      nodes: this._getDrawableNodes(graph.nodes),\n      edges: graph.edges,\n    });\n  }\n\n  /** @deprecated Use getSubgraphsAsync instead. The async method will become the default in the next minor release. */\n  getSubgraphs(): Generator<[string, PregelInterface<Nn, Cc, ContextType>]> {\n    throw new Error(\n      `The synchronous \"getSubgraphs\" method is not supported for this graph. Call \"getSubgraphsAsync\" instead.`\n    );\n  }\n\n  async *getSubgraphsAsync(\n    namespace?: string,\n    recurse = false\n  ): AsyncGenerator<[string, PregelInterface<Nn, Cc, ContextType>]> {\n    const subgraphs = await this.client.assistants.getSubgraphs(this.graphId, {\n      namespace,\n      recurse,\n    });\n\n    for (const [ns, graphSchema] of Object.entries(subgraphs)) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const remoteSubgraph = new (this.constructor as any)({\n        ...this,\n        graphId: graphSchema.graph_id,\n      });\n      yield [ns, remoteSubgraph];\n    }\n  }\n}\n"],"mappings":"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"}