require("../../_virtual/_rolldown/runtime.cjs");
const require_base = require("../base.cjs");
const require_index = require("../stream/index.cjs");
const require_http = require("../stream/transport/http.cjs");
const require_websocket = require("../stream/transport/websocket.cjs");
let _langchain_core_utils_uuid = require("@langchain/core/utils/uuid");
//#region src/client/threads/index.ts
var ThreadsClient = class extends require_base.BaseClient {
	/**
	* Get a thread by ID.
	*
	* @param threadId ID of the thread.
	* @returns The thread.
	*/
	async get(threadId, options) {
		return this.fetch(`/threads/${threadId}`, {
			params: { include: options?.include ?? void 0 },
			signal: options?.signal
		});
	}
	/**
	* Create a new thread.
	*
	* @param payload Payload for creating a thread.
	* @returns The created thread.
	*/
	async create(payload) {
		const ttlPayload = typeof payload?.ttl === "number" ? {
			ttl: payload.ttl,
			strategy: "delete"
		} : payload?.ttl;
		return this.fetch(`/threads`, {
			method: "POST",
			json: {
				metadata: {
					...payload?.metadata,
					graph_id: payload?.graphId
				},
				thread_id: payload?.threadId,
				if_exists: payload?.ifExists,
				supersteps: payload?.supersteps?.map((s) => ({ updates: s.updates.map((u) => ({
					values: u.values,
					command: u.command,
					as_node: u.asNode
				})) })),
				ttl: ttlPayload
			},
			signal: payload?.signal
		});
	}
	/**
	* Copy an existing thread
	* @param threadId ID of the thread to be copied
	* @returns Newly copied thread
	*/
	async copy(threadId, options) {
		return this.fetch(`/threads/${threadId}/copy`, {
			method: "POST",
			signal: options?.signal
		});
	}
	async update(threadId, payload) {
		const ttlPayload = typeof payload?.ttl === "number" ? {
			ttl: payload.ttl,
			strategy: "delete"
		} : payload?.ttl;
		return this.fetch(`/threads/${threadId}`, {
			method: "PATCH",
			headers: payload?.returnMinimal ? { Prefer: "return=minimal" } : void 0,
			json: {
				metadata: payload?.metadata,
				ttl: ttlPayload
			},
			signal: payload?.signal
		});
	}
	/**
	* Delete a thread.
	*
	* @param threadId ID of the thread.
	*/
	async delete(threadId, options) {
		return this.fetch(`/threads/${threadId}`, {
			method: "DELETE",
			signal: options?.signal
		});
	}
	/**
	* Prune threads by ID. The 'delete' strategy removes threads entirely.
	* The 'keep_latest' strategy prunes old checkpoints but keeps threads
	* and their latest state.
	*
	* @param threadIds List of thread IDs to prune.
	* @param options Additional options for pruning.
	* @param options.strategy The prune strategy. Defaults to 'delete'.
	* @param options.signal Signal to abort the request.
	* @returns An object containing `pruned_count`.
	*/
	async prune(threadIds, options) {
		return this.fetch("/threads/prune", {
			method: "POST",
			json: {
				thread_ids: threadIds,
				strategy: options?.strategy ?? "delete"
			},
			signal: options?.signal
		});
	}
	/**
	* List threads
	*
	* @param query Query options
	* @returns List of threads
	*/
	async search(query) {
		return this.fetch("/threads/search", {
			method: "POST",
			json: {
				metadata: query?.metadata ?? void 0,
				ids: query?.ids ?? void 0,
				limit: query?.limit ?? 10,
				offset: query?.offset ?? 0,
				status: query?.status,
				sort_by: query?.sortBy,
				sort_order: query?.sortOrder,
				select: query?.select ?? void 0,
				values: query?.values ?? void 0,
				extract: query?.extract ?? void 0
			},
			signal: query?.signal
		});
	}
	/**
	* Count threads matching filters.
	*
	* @param query.metadata Thread metadata to filter on.
	* @param query.values State values to filter on.
	* @param query.status Thread status to filter on.
	* @returns Number of threads matching the criteria.
	*/
	async count(query) {
		return this.fetch(`/threads/count`, {
			method: "POST",
			json: {
				metadata: query?.metadata ?? void 0,
				values: query?.values ?? void 0,
				status: query?.status ?? void 0
			},
			signal: query?.signal
		});
	}
	/**
	* Get state for a thread.
	*
	* @param threadId ID of the thread.
	* @returns Thread state.
	*/
	async getState(threadId, checkpoint, options) {
		if (checkpoint != null) {
			if (typeof checkpoint !== "string") return this.fetch(`/threads/${threadId}/state/checkpoint`, {
				method: "POST",
				json: {
					checkpoint,
					subgraphs: options?.subgraphs
				},
				signal: options?.signal
			});
			return this.fetch(`/threads/${threadId}/state/${checkpoint}`, {
				params: { subgraphs: options?.subgraphs },
				signal: options?.signal
			});
		}
		return this.fetch(`/threads/${threadId}/state`, {
			params: { subgraphs: options?.subgraphs },
			signal: options?.signal,
			dedupe: true
		});
	}
	/**
	* Add state to a thread.
	*
	* @param threadId The ID of the thread.
	* @returns
	*/
	async updateState(threadId, options) {
		return this.fetch(`/threads/${threadId}/state`, {
			method: "POST",
			json: {
				values: options.values,
				checkpoint: options.checkpoint,
				checkpoint_id: options.checkpointId,
				as_node: options?.asNode
			},
			signal: options?.signal
		});
	}
	/**
	* Patch the metadata of a thread.
	*
	* @param threadIdOrConfig Thread ID or config to patch the state of.
	* @param metadata Metadata to patch the state with.
	*/
	async patchState(threadIdOrConfig, metadata, options) {
		let threadId;
		if (typeof threadIdOrConfig !== "string") {
			if (typeof threadIdOrConfig.configurable?.thread_id !== "string") throw new Error("Thread ID is required when updating state with a config.");
			threadId = threadIdOrConfig.configurable.thread_id;
		} else threadId = threadIdOrConfig;
		return this.fetch(`/threads/${threadId}/state`, {
			method: "PATCH",
			json: { metadata },
			signal: options?.signal
		});
	}
	/**
	* Get all past states for a thread.
	*
	* @param threadId ID of the thread.
	* @param options Additional options.
	* @returns List of thread states.
	*/
	async getHistory(threadId, options) {
		return this.fetch(`/threads/${threadId}/history`, {
			method: "POST",
			json: {
				limit: options?.limit ?? 10,
				before: options?.before,
				metadata: options?.metadata,
				checkpoint: options?.checkpoint
			},
			signal: options?.signal,
			dedupe: true
		});
	}
	async *joinStream(threadId, options) {
		yield* this.streamWithRetry({
			endpoint: `/threads/${threadId}/stream`,
			method: "GET",
			signal: options?.signal,
			headers: options?.lastEventId ? { "Last-Event-ID": options.lastEventId } : void 0,
			params: options?.streamMode ? { stream_mode: options.streamMode } : void 0
		});
	}
	stream(threadIdOrOptions, maybeOptions) {
		const { threadId, options } = typeof threadIdOrOptions === "string" ? {
			threadId: threadIdOrOptions,
			options: maybeOptions
		} : {
			threadId: (0, _langchain_core_utils_uuid.v7)(),
			options: threadIdOrOptions
		};
		const userFetch = options.fetch;
		const protocolFetch = userFetch ?? this.asyncCaller.fetch.bind(this.asyncCaller);
		let transport;
		if (options.transport != null && typeof options.transport !== "string") {
			transport = options.transport;
			transport.setThreadId?.(threadId);
		} else {
			const transportKind = options.transport ?? (this.streamProtocol === "v2-websocket" ? "websocket" : "sse");
			const maxReconnectAttempts = options.maxReconnectAttempts ?? 5;
			/**
			* Common options for both transports.
			*/
			const commonOpts = {
				apiUrl: this.apiUrl,
				threadId,
				defaultHeaders: this.defaultHeaders,
				onRequest: this.onRequest,
				maxReconnectAttempts,
				reconnectDelayMs: options.reconnectDelayMs,
				onReconnect: options.onReconnect
			};
			transport = transportKind === "websocket" ? new require_websocket.ProtocolWebSocketTransportAdapter({
				...commonOpts,
				webSocketFactory: options.webSocketFactory
			}) : new require_http.ProtocolSseTransportAdapter({
				...commonOpts,
				idleReconnect: options.streamIdleReconnect,
				fetch: userFetch,
				asyncCaller: userFetch ? void 0 : this.asyncCaller
			});
		}
		return new require_index.ThreadStream(transport, {
			...options,
			fetch: protocolFetch
		});
	}
};
//#endregion
exports.ThreadsClient = ThreadsClient;

//# sourceMappingURL=index.cjs.map