{"version":3,"file":"index.cjs","names":["BaseClient","ProtocolWebSocketTransportAdapter","ProtocolSseTransportAdapter","ThreadStream"],"sources":["../../../src/client/threads/index.ts"],"sourcesContent":["import { v7 as uuidv7 } from \"uuid\";\n\nimport {\n  Checkpoint,\n  Config,\n  DefaultValues,\n  Metadata,\n  SortOrder,\n  Thread,\n  ThreadSelectField,\n  ThreadSortBy,\n  ThreadState,\n  ThreadStatus,\n  ThreadValuesFilter,\n} from \"../../schema.js\";\nimport type { Command, OnConflictBehavior, StreamEvent } from \"../../types.js\";\nimport type { ThreadStreamMode } from \"../../types.stream.js\";\nimport { BaseClient } from \"../base.js\";\nimport { ThreadStream } from \"../stream/index.js\";\nimport type {\n  ThreadStreamOptions,\n  ThreadStreamTransportKind,\n} from \"../stream/types.js\";\nimport { ProtocolSseTransportAdapter } from \"../stream/transport/http.js\";\nimport { ProtocolWebSocketTransportAdapter } from \"../stream/transport/websocket.js\";\nimport type { TransportAdapter } from \"../stream/transport.js\";\n\nexport class ThreadsClient<\n  TStateType = DefaultValues,\n  TUpdateType = TStateType,\n> extends BaseClient {\n  /**\n   * Get a thread by ID.\n   *\n   * @param threadId ID of the thread.\n   * @returns The thread.\n   */\n  async get<ValuesType = TStateType>(\n    threadId: string,\n    options?: { signal?: AbortSignal; include?: string[] }\n  ): Promise<Thread<ValuesType>> {\n    return this.fetch<Thread<ValuesType>>(`/threads/${threadId}`, {\n      params: {\n        include: options?.include ?? undefined,\n      },\n      signal: options?.signal,\n    });\n  }\n\n  /**\n   * Create a new thread.\n   *\n   * @param payload Payload for creating a thread.\n   * @returns The created thread.\n   */\n  async create(payload?: {\n    metadata?: Metadata;\n    threadId?: string;\n    ifExists?: OnConflictBehavior;\n    graphId?: string;\n    supersteps?: Array<{\n      updates: Array<{ values: unknown; command?: Command; asNode: string }>;\n    }>;\n    ttl?: number | { ttl: number; strategy?: \"delete\" };\n    signal?: AbortSignal;\n  }): Promise<Thread<TStateType>> {\n    const ttlPayload =\n      typeof payload?.ttl === \"number\"\n        ? { ttl: payload.ttl, strategy: \"delete\" as const }\n        : payload?.ttl;\n\n    return this.fetch<Thread<TStateType>>(`/threads`, {\n      method: \"POST\",\n      json: {\n        metadata: {\n          ...payload?.metadata,\n          graph_id: payload?.graphId,\n        },\n        thread_id: payload?.threadId,\n        if_exists: payload?.ifExists,\n        supersteps: payload?.supersteps?.map((s) => ({\n          updates: s.updates.map((u) => ({\n            values: u.values,\n            command: u.command,\n            as_node: u.asNode,\n          })),\n        })),\n        ttl: ttlPayload,\n      },\n      signal: payload?.signal,\n    });\n  }\n\n  /**\n   * Copy an existing thread\n   * @param threadId ID of the thread to be copied\n   * @returns Newly copied thread\n   */\n  async copy(\n    threadId: string,\n    options?: { signal?: AbortSignal }\n  ): Promise<Thread<TStateType>> {\n    return this.fetch<Thread<TStateType>>(`/threads/${threadId}/copy`, {\n      method: \"POST\",\n      signal: options?.signal,\n    });\n  }\n\n  /**\n   * Update a thread.\n   *\n   * @param threadId ID of the thread.\n   * @param payload Payload for updating the thread.\n   * @returns The updated thread.\n   */\n  async update(\n    threadId: string,\n    payload?: {\n      metadata?: Metadata;\n      ttl?: number | { ttl: number; strategy?: \"delete\" };\n      returnMinimal?: false;\n      signal?: AbortSignal;\n    }\n  ): Promise<Thread>;\n  async update(\n    threadId: string,\n    payload: {\n      metadata?: Metadata;\n      ttl?: number | { ttl: number; strategy?: \"delete\" };\n      returnMinimal: true;\n      signal?: AbortSignal;\n    }\n  ): Promise<void>;\n  async update(\n    threadId: string,\n    payload: {\n      metadata?: Metadata;\n      ttl?: number | { ttl: number; strategy?: \"delete\" };\n      returnMinimal: boolean;\n      signal?: AbortSignal;\n    }\n  ): Promise<Thread | void>;\n  async update(\n    threadId: string,\n    payload?: {\n      metadata?: Metadata;\n      ttl?: number | { ttl: number; strategy?: \"delete\" };\n      returnMinimal?: boolean;\n      signal?: AbortSignal;\n    }\n  ): Promise<Thread | void> {\n    const ttlPayload =\n      typeof payload?.ttl === \"number\"\n        ? { ttl: payload.ttl, strategy: \"delete\" as const }\n        : payload?.ttl;\n\n    return this.fetch<Thread | void>(`/threads/${threadId}`, {\n      method: \"PATCH\",\n      headers: payload?.returnMinimal\n        ? { Prefer: \"return=minimal\" }\n        : undefined,\n      json: { metadata: payload?.metadata, ttl: ttlPayload },\n      signal: payload?.signal,\n    });\n  }\n\n  /**\n   * Delete a thread.\n   *\n   * @param threadId ID of the thread.\n   */\n  async delete(\n    threadId: string,\n    options?: { signal?: AbortSignal }\n  ): Promise<void> {\n    return this.fetch<void>(`/threads/${threadId}`, {\n      method: \"DELETE\",\n      signal: options?.signal,\n    });\n  }\n\n  /**\n   * Prune threads by ID. The 'delete' strategy removes threads entirely.\n   * The 'keep_latest' strategy prunes old checkpoints but keeps threads\n   * and their latest state.\n   *\n   * @param threadIds List of thread IDs to prune.\n   * @param options Additional options for pruning.\n   * @param options.strategy The prune strategy. Defaults to 'delete'.\n   * @param options.signal Signal to abort the request.\n   * @returns An object containing `pruned_count`.\n   */\n  async prune(\n    threadIds: string[],\n    options?: {\n      strategy?: \"delete\" | \"keep_latest\";\n      signal?: AbortSignal;\n    }\n  ): Promise<{ pruned_count: number }> {\n    return this.fetch<{ pruned_count: number }>(\"/threads/prune\", {\n      method: \"POST\",\n      json: {\n        thread_ids: threadIds,\n        strategy: options?.strategy ?? \"delete\",\n      },\n      signal: options?.signal,\n    });\n  }\n\n  /**\n   * List threads\n   *\n   * @param query Query options\n   * @returns List of threads\n   */\n  async search<ValuesType = TStateType>(query?: {\n    metadata?: Metadata;\n    ids?: string[];\n    limit?: number;\n    offset?: number;\n    status?: ThreadStatus;\n    sortBy?: ThreadSortBy;\n    sortOrder?: SortOrder;\n    select?: ThreadSelectField[];\n    values?: ThreadValuesFilter;\n    extract?: Record<string, string>;\n    signal?: AbortSignal;\n  }): Promise<Thread<ValuesType>[]> {\n    return this.fetch<Thread<ValuesType>[]>(\"/threads/search\", {\n      method: \"POST\",\n      json: {\n        metadata: query?.metadata ?? undefined,\n        ids: query?.ids ?? undefined,\n        limit: query?.limit ?? 10,\n        offset: query?.offset ?? 0,\n        status: query?.status,\n        sort_by: query?.sortBy,\n        sort_order: query?.sortOrder,\n        select: query?.select ?? undefined,\n        values: query?.values ?? undefined,\n        extract: query?.extract ?? undefined,\n      },\n      signal: query?.signal,\n    });\n  }\n\n  /**\n   * Count threads matching filters.\n   *\n   * @param query.metadata Thread metadata to filter on.\n   * @param query.values State values to filter on.\n   * @param query.status Thread status to filter on.\n   * @returns Number of threads matching the criteria.\n   */\n  async count<ValuesType = TStateType>(query?: {\n    metadata?: Metadata;\n    values?: ValuesType;\n    status?: ThreadStatus;\n    signal?: AbortSignal;\n  }): Promise<number> {\n    return this.fetch<number>(`/threads/count`, {\n      method: \"POST\",\n      json: {\n        metadata: query?.metadata ?? undefined,\n        values: query?.values ?? undefined,\n        status: query?.status ?? undefined,\n      },\n      signal: query?.signal,\n    });\n  }\n\n  /**\n   * Get state for a thread.\n   *\n   * @param threadId ID of the thread.\n   * @returns Thread state.\n   */\n  async getState<ValuesType = TStateType>(\n    threadId: string,\n    checkpoint?: Checkpoint | string,\n    options?: { subgraphs?: boolean; signal?: AbortSignal }\n  ): Promise<ThreadState<ValuesType>> {\n    if (checkpoint != null) {\n      if (typeof checkpoint !== \"string\") {\n        return this.fetch<ThreadState<ValuesType>>(\n          `/threads/${threadId}/state/checkpoint`,\n          {\n            method: \"POST\",\n            json: { checkpoint, subgraphs: options?.subgraphs },\n            signal: options?.signal,\n          }\n        );\n      }\n\n      // deprecated\n      return this.fetch<ThreadState<ValuesType>>(\n        `/threads/${threadId}/state/${checkpoint}`,\n        { params: { subgraphs: options?.subgraphs }, signal: options?.signal }\n      );\n    }\n\n    return this.fetch<ThreadState<ValuesType>>(`/threads/${threadId}/state`, {\n      params: { subgraphs: options?.subgraphs },\n      signal: options?.signal,\n    });\n  }\n\n  /**\n   * Add state to a thread.\n   *\n   * @param threadId The ID of the thread.\n   * @returns\n   */\n  async updateState<ValuesType = TUpdateType>(\n    threadId: string,\n    options: {\n      values: ValuesType;\n      checkpoint?: Checkpoint;\n      checkpointId?: string;\n      asNode?: string;\n      signal?: AbortSignal;\n    }\n  ): Promise<Pick<Config, \"configurable\">> {\n    return this.fetch<Pick<Config, \"configurable\">>(\n      `/threads/${threadId}/state`,\n      {\n        method: \"POST\",\n        json: {\n          values: options.values,\n          checkpoint: options.checkpoint,\n          checkpoint_id: options.checkpointId,\n          as_node: options?.asNode,\n        },\n        signal: options?.signal,\n      }\n    );\n  }\n\n  /**\n   * Patch the metadata of a thread.\n   *\n   * @param threadIdOrConfig Thread ID or config to patch the state of.\n   * @param metadata Metadata to patch the state with.\n   */\n  async patchState(\n    threadIdOrConfig: string | Config,\n    metadata: Metadata,\n    options?: { signal?: AbortSignal }\n  ): Promise<void> {\n    let threadId: string;\n\n    if (typeof threadIdOrConfig !== \"string\") {\n      if (typeof threadIdOrConfig.configurable?.thread_id !== \"string\") {\n        throw new Error(\n          \"Thread ID is required when updating state with a config.\"\n        );\n      }\n      threadId = threadIdOrConfig.configurable.thread_id;\n    } else {\n      threadId = threadIdOrConfig;\n    }\n\n    return this.fetch<void>(`/threads/${threadId}/state`, {\n      method: \"PATCH\",\n      json: { metadata },\n      signal: options?.signal,\n    });\n  }\n\n  /**\n   * Get all past states for a thread.\n   *\n   * @param threadId ID of the thread.\n   * @param options Additional options.\n   * @returns List of thread states.\n   */\n  async getHistory<ValuesType = TStateType>(\n    threadId: string,\n    options?: {\n      limit?: number;\n      before?: Config;\n      checkpoint?: Partial<Omit<Checkpoint, \"thread_id\">>;\n      metadata?: Metadata;\n      signal?: AbortSignal;\n    }\n  ): Promise<ThreadState<ValuesType>[]> {\n    return this.fetch<ThreadState<ValuesType>[]>(\n      `/threads/${threadId}/history`,\n      {\n        method: \"POST\",\n        json: {\n          limit: options?.limit ?? 10,\n          before: options?.before,\n          metadata: options?.metadata,\n          checkpoint: options?.checkpoint,\n        },\n        signal: options?.signal,\n      }\n    );\n  }\n\n  async *joinStream(\n    threadId: string,\n    options?: {\n      lastEventId?: string;\n      streamMode?: ThreadStreamMode | ThreadStreamMode[];\n      signal?: AbortSignal;\n    }\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  ): AsyncGenerator<{ id?: string; event: StreamEvent; data: any }> {\n    yield* this.streamWithRetry({\n      endpoint: `/threads/${threadId}/stream`,\n      method: \"GET\",\n      signal: options?.signal,\n      headers: options?.lastEventId\n        ? { \"Last-Event-ID\": options.lastEventId }\n        : undefined,\n      params: options?.streamMode\n        ? { stream_mode: options.streamMode }\n        : undefined,\n    });\n  }\n\n  /**\n   * Open a protocol stream over the thread-centric v2 protocol.\n   *\n   * Returns a {@link ThreadStream} with lazy getters\n   * (`.messages`, `.values`, `.toolCalls`, `.subgraphs`, `.subagents`,\n   * `.output`) and `thread.run.start({ input, ... })` for starting runs.\n   * Mirrors the in-process `graph.streamEvents(..., { version: \"v3\" })` API.\n   *\n   * The thread is bound to `options.assistantId` for its lifetime.\n   * The wire transport defaults to SSE; pass `transport: \"websocket\"`\n   * in options (or configure `streamProtocol: \"v2-websocket\"` on the\n   * client) to use a WebSocket instead.\n   *\n   * @example New thread (UUID generated client-side)\n   * ```ts\n   * const thread = client.threads.stream({ assistantId: \"my-agent\" });\n   * ```\n   *\n   * @example Attach to an existing thread\n   * ```ts\n   * const thread = client.threads.stream(threadId, { assistantId: \"my-agent\" });\n   * ```\n   *\n   * @example WebSocket transport\n   * ```ts\n   * const thread = client.threads.stream({\n   *   assistantId: \"my-agent\",\n   *   transport: \"websocket\",\n   * });\n   * ```\n   */\n  stream<TExtensions extends Record<string, unknown> = Record<string, unknown>>(\n    options: ThreadStreamOptions\n  ): ThreadStream<TExtensions>;\n  stream<TExtensions extends Record<string, unknown> = Record<string, unknown>>(\n    threadId: string,\n    options: ThreadStreamOptions\n  ): ThreadStream<TExtensions>;\n  stream<TExtensions extends Record<string, unknown> = Record<string, unknown>>(\n    threadIdOrOptions: string | ThreadStreamOptions,\n    maybeOptions?: ThreadStreamOptions\n  ): ThreadStream<TExtensions> {\n    const { threadId, options } =\n      typeof threadIdOrOptions === \"string\"\n        ? {\n            threadId: threadIdOrOptions,\n            options: maybeOptions as ThreadStreamOptions,\n          }\n        : { threadId: uuidv7(), options: threadIdOrOptions };\n\n    // `transport` accepts either a preset string (`\"sse\"` / `\"websocket\"`)\n    // or a custom {@link AgentServerAdapter}. A custom adapter replaces\n    // the built-in factories entirely — this is the seam that lets users\n    // point `useStream` at any agent server (including the thin wrappers\n    // produced by `HttpAgentServerAdapter`).\n    let transport: TransportAdapter;\n    if (options.transport != null && typeof options.transport !== \"string\") {\n      transport = options.transport;\n    } else {\n      const transportKind: ThreadStreamTransportKind =\n        options.transport ??\n        (this.streamProtocol === \"v2-websocket\" ? \"websocket\" : \"sse\");\n      transport =\n        transportKind === \"websocket\"\n          ? new ProtocolWebSocketTransportAdapter({\n              apiUrl: this.apiUrl,\n              threadId,\n              defaultHeaders: this.defaultHeaders,\n              onRequest: this.onRequest,\n              webSocketFactory: options.webSocketFactory,\n            })\n          : new ProtocolSseTransportAdapter({\n              apiUrl: this.apiUrl,\n              threadId,\n              defaultHeaders: this.defaultHeaders,\n              onRequest: this.onRequest,\n              fetch: options.fetch,\n            });\n    }\n\n    return new ThreadStream<TExtensions>(transport, options);\n  }\n}\n"],"mappings":";;;;;;;AA2BA,IAAa,gBAAb,cAGUA,aAAAA,WAAW;;;;;;;CAOnB,MAAM,IACJ,UACA,SAC6B;AAC7B,SAAO,KAAK,MAA0B,YAAY,YAAY;GAC5D,QAAQ,EACN,SAAS,SAAS,WAAW,KAAA,GAC9B;GACD,QAAQ,SAAS;GAClB,CAAC;;;;;;;;CASJ,MAAM,OAAO,SAUmB;EAC9B,MAAM,aACJ,OAAO,SAAS,QAAQ,WACpB;GAAE,KAAK,QAAQ;GAAK,UAAU;GAAmB,GACjD,SAAS;AAEf,SAAO,KAAK,MAA0B,YAAY;GAChD,QAAQ;GACR,MAAM;IACJ,UAAU;KACR,GAAG,SAAS;KACZ,UAAU,SAAS;KACpB;IACD,WAAW,SAAS;IACpB,WAAW,SAAS;IACpB,YAAY,SAAS,YAAY,KAAK,OAAO,EAC3C,SAAS,EAAE,QAAQ,KAAK,OAAO;KAC7B,QAAQ,EAAE;KACV,SAAS,EAAE;KACX,SAAS,EAAE;KACZ,EAAE,EACJ,EAAE;IACH,KAAK;IACN;GACD,QAAQ,SAAS;GAClB,CAAC;;;;;;;CAQJ,MAAM,KACJ,UACA,SAC6B;AAC7B,SAAO,KAAK,MAA0B,YAAY,SAAS,QAAQ;GACjE,QAAQ;GACR,QAAQ,SAAS;GAClB,CAAC;;CAqCJ,MAAM,OACJ,UACA,SAMwB;EACxB,MAAM,aACJ,OAAO,SAAS,QAAQ,WACpB;GAAE,KAAK,QAAQ;GAAK,UAAU;GAAmB,GACjD,SAAS;AAEf,SAAO,KAAK,MAAqB,YAAY,YAAY;GACvD,QAAQ;GACR,SAAS,SAAS,gBACd,EAAE,QAAQ,kBAAkB,GAC5B,KAAA;GACJ,MAAM;IAAE,UAAU,SAAS;IAAU,KAAK;IAAY;GACtD,QAAQ,SAAS;GAClB,CAAC;;;;;;;CAQJ,MAAM,OACJ,UACA,SACe;AACf,SAAO,KAAK,MAAY,YAAY,YAAY;GAC9C,QAAQ;GACR,QAAQ,SAAS;GAClB,CAAC;;;;;;;;;;;;;CAcJ,MAAM,MACJ,WACA,SAImC;AACnC,SAAO,KAAK,MAAgC,kBAAkB;GAC5D,QAAQ;GACR,MAAM;IACJ,YAAY;IACZ,UAAU,SAAS,YAAY;IAChC;GACD,QAAQ,SAAS;GAClB,CAAC;;;;;;;;CASJ,MAAM,OAAgC,OAYJ;AAChC,SAAO,KAAK,MAA4B,mBAAmB;GACzD,QAAQ;GACR,MAAM;IACJ,UAAU,OAAO,YAAY,KAAA;IAC7B,KAAK,OAAO,OAAO,KAAA;IACnB,OAAO,OAAO,SAAS;IACvB,QAAQ,OAAO,UAAU;IACzB,QAAQ,OAAO;IACf,SAAS,OAAO;IAChB,YAAY,OAAO;IACnB,QAAQ,OAAO,UAAU,KAAA;IACzB,QAAQ,OAAO,UAAU,KAAA;IACzB,SAAS,OAAO,WAAW,KAAA;IAC5B;GACD,QAAQ,OAAO;GAChB,CAAC;;;;;;;;;;CAWJ,MAAM,MAA+B,OAKjB;AAClB,SAAO,KAAK,MAAc,kBAAkB;GAC1C,QAAQ;GACR,MAAM;IACJ,UAAU,OAAO,YAAY,KAAA;IAC7B,QAAQ,OAAO,UAAU,KAAA;IACzB,QAAQ,OAAO,UAAU,KAAA;IAC1B;GACD,QAAQ,OAAO;GAChB,CAAC;;;;;;;;CASJ,MAAM,SACJ,UACA,YACA,SACkC;AAClC,MAAI,cAAc,MAAM;AACtB,OAAI,OAAO,eAAe,SACxB,QAAO,KAAK,MACV,YAAY,SAAS,oBACrB;IACE,QAAQ;IACR,MAAM;KAAE;KAAY,WAAW,SAAS;KAAW;IACnD,QAAQ,SAAS;IAClB,CACF;AAIH,UAAO,KAAK,MACV,YAAY,SAAS,SAAS,cAC9B;IAAE,QAAQ,EAAE,WAAW,SAAS,WAAW;IAAE,QAAQ,SAAS;IAAQ,CACvE;;AAGH,SAAO,KAAK,MAA+B,YAAY,SAAS,SAAS;GACvE,QAAQ,EAAE,WAAW,SAAS,WAAW;GACzC,QAAQ,SAAS;GAClB,CAAC;;;;;;;;CASJ,MAAM,YACJ,UACA,SAOuC;AACvC,SAAO,KAAK,MACV,YAAY,SAAS,SACrB;GACE,QAAQ;GACR,MAAM;IACJ,QAAQ,QAAQ;IAChB,YAAY,QAAQ;IACpB,eAAe,QAAQ;IACvB,SAAS,SAAS;IACnB;GACD,QAAQ,SAAS;GAClB,CACF;;;;;;;;CASH,MAAM,WACJ,kBACA,UACA,SACe;EACf,IAAI;AAEJ,MAAI,OAAO,qBAAqB,UAAU;AACxC,OAAI,OAAO,iBAAiB,cAAc,cAAc,SACtD,OAAM,IAAI,MACR,2DACD;AAEH,cAAW,iBAAiB,aAAa;QAEzC,YAAW;AAGb,SAAO,KAAK,MAAY,YAAY,SAAS,SAAS;GACpD,QAAQ;GACR,MAAM,EAAE,UAAU;GAClB,QAAQ,SAAS;GAClB,CAAC;;;;;;;;;CAUJ,MAAM,WACJ,UACA,SAOoC;AACpC,SAAO,KAAK,MACV,YAAY,SAAS,WACrB;GACE,QAAQ;GACR,MAAM;IACJ,OAAO,SAAS,SAAS;IACzB,QAAQ,SAAS;IACjB,UAAU,SAAS;IACnB,YAAY,SAAS;IACtB;GACD,QAAQ,SAAS;GAClB,CACF;;CAGH,OAAO,WACL,UACA,SAMgE;AAChE,SAAO,KAAK,gBAAgB;GAC1B,UAAU,YAAY,SAAS;GAC/B,QAAQ;GACR,QAAQ,SAAS;GACjB,SAAS,SAAS,cACd,EAAE,iBAAiB,QAAQ,aAAa,GACxC,KAAA;GACJ,QAAQ,SAAS,aACb,EAAE,aAAa,QAAQ,YAAY,GACnC,KAAA;GACL,CAAC;;CAyCJ,OACE,mBACA,cAC2B;EAC3B,MAAM,EAAE,UAAU,YAChB,OAAO,sBAAsB,WACzB;GACE,UAAU;GACV,SAAS;GACV,GACD;GAAE,WAAA,GAAA,KAAA,KAAkB;GAAE,SAAS;GAAmB;EAOxD,IAAI;AACJ,MAAI,QAAQ,aAAa,QAAQ,OAAO,QAAQ,cAAc,SAC5D,aAAY,QAAQ;MAKpB,cAFE,QAAQ,cACP,KAAK,mBAAmB,iBAAiB,cAAc,YAEtC,cACd,IAAIC,kBAAAA,kCAAkC;GACpC,QAAQ,KAAK;GACb;GACA,gBAAgB,KAAK;GACrB,WAAW,KAAK;GAChB,kBAAkB,QAAQ;GAC3B,CAAC,GACF,IAAIC,aAAAA,4BAA4B;GAC9B,QAAQ,KAAK;GACb;GACA,gBAAgB,KAAK;GACrB,WAAW,KAAK;GAChB,OAAO,QAAQ;GAChB,CAAC;AAGV,SAAO,IAAIC,cAAAA,aAA0B,WAAW,QAAQ"}