@savantoai/ai-sdk 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/README.md +7 -2
- package/dist/index.cjs +4 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1266 -12
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1266 -12
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +4 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/generated/core/bodySerializer.gen.ts","../src/generated/core/serverSentEvents.gen.ts","../src/generated/core/pathSerializer.gen.ts","../src/generated/core/utils.gen.ts","../src/generated/core/auth.gen.ts","../src/generated/client/utils.gen.ts","../src/generated/client/client.gen.ts","../src/generated/client.gen.ts","../src/generated/sdk.gen.ts","../src/util.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ArrayStyle, ObjectStyle, SerializerOptions } from './pathSerializer.gen';\n\nexport type QuerySerializer = (query: Record<string, unknown>) => string;\n\nexport type BodySerializer = (body: unknown) => unknown;\n\ntype QuerySerializerOptionsObject = {\n allowReserved?: boolean;\n array?: Partial<SerializerOptions<ArrayStyle>>;\n object?: Partial<SerializerOptions<ObjectStyle>>;\n};\n\nexport type QuerySerializerOptions = QuerySerializerOptionsObject & {\n /**\n * Per-parameter serialization overrides. When provided, these settings\n * override the global array/object settings for specific parameter names.\n */\n parameters?: Record<string, QuerySerializerOptionsObject>;\n};\n\nconst serializeFormDataPair = (data: FormData, key: string, value: unknown): void => {\n if (typeof value === 'string' || value instanceof Blob) {\n data.append(key, value);\n } else if (value instanceof Date) {\n data.append(key, value.toISOString());\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nconst serializeUrlSearchParamsPair = (data: URLSearchParams, key: string, value: unknown): void => {\n if (typeof value === 'string') {\n data.append(key, value);\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nexport const formDataBodySerializer = {\n bodySerializer: (body: unknown): FormData => {\n const data = new FormData();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n } else {\n serializeFormDataPair(data, key, value);\n }\n });\n\n return data;\n },\n};\n\nexport const jsonBodySerializer = {\n bodySerializer: (body: unknown): string =>\n JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)),\n};\n\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: (body: unknown): string => {\n const data = new URLSearchParams();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n } else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from './types.gen';\n\nexport type ServerSentEventsOptions<TData = unknown> = Omit<RequestInit, 'method'> &\n Pick<Config, 'method' | 'responseTransformer' | 'responseValidator'> & {\n /**\n * Fetch API implementation. You can use this option to provide a custom\n * fetch instance.\n *\n * @default globalThis.fetch\n */\n fetch?: typeof fetch;\n /**\n * Implementing clients can call request interceptors inside this hook.\n */\n onRequest?: (url: string, init: RequestInit) => Promise<Request>;\n /**\n * Callback invoked when a network or parsing error occurs during streaming.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param error The error that occurred.\n */\n onSseError?: (error: unknown) => void;\n /**\n * Callback invoked when an event is streamed from the server.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param event Event streamed from the server.\n * @returns Nothing (void).\n */\n onSseEvent?: (event: StreamEvent<TData>) => void;\n serializedBody?: RequestInit['body'];\n /**\n * Default retry delay in milliseconds.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 3000\n */\n sseDefaultRetryDelay?: number;\n /**\n * Maximum number of retry attempts before giving up.\n */\n sseMaxRetryAttempts?: number;\n /**\n * Maximum retry delay in milliseconds.\n *\n * Applies only when exponential backoff is used.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 30000\n */\n sseMaxRetryDelay?: number;\n /**\n * Optional sleep function for retry backoff.\n *\n * Defaults to using `setTimeout`.\n */\n sseSleepFn?: (ms: number) => Promise<void>;\n url: string;\n };\n\nexport interface StreamEvent<TData = unknown> {\n data: TData;\n event?: string;\n id?: string;\n retry?: number;\n}\n\nexport type ServerSentEventsResult<TData = unknown, TReturn = void, TNext = unknown> = {\n stream: AsyncGenerator<\n TData extends Record<string, unknown> ? TData[keyof TData] : TData,\n TReturn,\n TNext\n >;\n};\n\nexport function createSseClient<TData = unknown>({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}: ServerSentEventsOptions): ServerSentEventsResult<TData> {\n let lastEventId: string | undefined;\n\n const sleep = sseSleepFn ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n const createStream = async function* () {\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n\n while (true) {\n if (signal.aborted) break;\n\n attempt++;\n\n const headers =\n options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers as Record<string, string> | undefined);\n\n if (lastEventId !== undefined) {\n headers.set('Last-Event-ID', lastEventId);\n }\n\n try {\n const requestInit: RequestInit = {\n redirect: 'follow',\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n\n if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`);\n\n if (!response.body) throw new Error('No body in SSE response');\n\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();\n\n let buffer = '';\n\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n // noop\n }\n };\n\n signal.addEventListener('abort', abortHandler);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n buffer = buffer.replace(/\\r\\n?/g, '\\n'); // normalize line endings\n\n const chunks = buffer.split('\\n\\n');\n buffer = chunks.pop() ?? '';\n\n for (const chunk of chunks) {\n const lines = chunk.split('\\n');\n const dataLines: Array<string> = [];\n let eventName: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n dataLines.push(line.replace(/^data:\\s*/, ''));\n } else if (line.startsWith('event:')) {\n eventName = line.replace(/^event:\\s*/, '');\n } else if (line.startsWith('id:')) {\n lastEventId = line.replace(/^id:\\s*/, '');\n } else if (line.startsWith('retry:')) {\n const parsed = Number.parseInt(line.replace(/^retry:\\s*/, ''), 10);\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n\n let data: unknown;\n let parsedJson = false;\n\n if (dataLines.length) {\n const rawData = dataLines.join('\\n');\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n\n if (dataLines.length) {\n yield data as any;\n }\n }\n }\n } finally {\n signal.removeEventListener('abort', abortHandler);\n reader.releaseLock();\n }\n\n break; // exit loop on normal completion\n } catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n\n if (sseMaxRetryAttempts !== undefined && attempt >= sseMaxRetryAttempts) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 30000);\n await sleep(backoff);\n }\n }\n };\n\n const stream = createStream();\n\n return { stream };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions<T> extends SerializePrimitiveOptions, SerializerOptions<T> {}\n\ninterface SerializePrimitiveOptions {\n allowReserved?: boolean;\n name: string;\n}\n\nexport interface SerializerOptions<T> {\n /**\n * @default true\n */\n explode: boolean;\n style: T;\n}\n\nexport type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited';\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = 'label' | 'matrix' | 'simple';\nexport type ObjectStyle = 'form' | 'deepObject';\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n value: string;\n}\n\nexport const separatorArrayExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'form':\n return ',';\n case 'pipeDelimited':\n return '|';\n case 'spaceDelimited':\n return '%20';\n default:\n return ',';\n }\n};\n\nexport const separatorObjectExplode = (style: ObjectSeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n}: SerializeOptions<ArraySeparatorStyle> & {\n value: unknown[];\n}) => {\n if (!explode) {\n const joinedValues = (\n allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n ).join(separatorArrayNoExplode(style));\n switch (style) {\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n case 'simple':\n return joinedValues;\n default:\n return `${name}=${joinedValues}`;\n }\n }\n\n const separator = separatorArrayExplode(style);\n const joinedValues = value\n .map((v) => {\n if (style === 'label' || style === 'simple') {\n return allowReserved ? v : encodeURIComponent(v as string);\n }\n\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v as string,\n });\n })\n .join(separator);\n return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam) => {\n if (value === undefined || value === null) {\n return '';\n }\n\n if (typeof value === 'object') {\n throw new Error(\n 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.',\n );\n }\n\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n valueOnly,\n}: SerializeOptions<ObjectSeparatorStyle> & {\n value: Record<string, unknown> | Date;\n valueOnly?: boolean;\n}) => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n\n if (style !== 'deepObject' && !explode) {\n let values: string[] = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)];\n });\n const joinedValues = values.join(',');\n switch (style) {\n case 'form':\n return `${name}=${joinedValues}`;\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) =>\n serializePrimitiveParam({\n allowReserved,\n name: style === 'deepObject' ? `${name}[${key}]` : key,\n value: v as string,\n }),\n )\n .join(separator);\n return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from './bodySerializer.gen';\nimport {\n type ArraySeparatorStyle,\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from './pathSerializer.gen';\n\nexport interface PathSerializer {\n path: Record<string, unknown>;\n url: string;\n}\n\nexport const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style: ArraySeparatorStyle = 'simple';\n\n if (name.endsWith('*')) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n\n if (name.startsWith('.')) {\n name = name.substring(1);\n style = 'label';\n } else if (name.startsWith(';')) {\n name = name.substring(1);\n style = 'matrix';\n }\n\n const value = path[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n url = url.replace(match, serializeArrayParam({ explode, name, style, value }));\n continue;\n }\n\n if (typeof value === 'object') {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value: value as Record<string, unknown>,\n valueOnly: true,\n }),\n );\n continue;\n }\n\n if (style === 'matrix') {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value: value as string,\n })}`,\n );\n continue;\n }\n\n const replaceValue = encodeURIComponent(\n style === 'label' ? `.${value as string}` : (value as string),\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\n\nexport const getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url,\n}: {\n baseUrl?: string;\n path?: Record<string, unknown>;\n query?: Record<string, unknown>;\n querySerializer: QuerySerializer;\n url: string;\n}) => {\n const pathUrl = _url.startsWith('/') ? _url : `/${_url}`;\n let url = (baseUrl ?? '') + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : '';\n if (search.startsWith('?')) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\n\nexport function getValidRequestBody(options: {\n body?: unknown;\n bodySerializer?: BodySerializer | null;\n serializedBody?: unknown;\n}) {\n const hasBody = options.body !== undefined;\n const isSerializedBody = hasBody && options.bodySerializer;\n\n if (isSerializedBody) {\n if ('serializedBody' in options) {\n const hasSerializedBody =\n options.serializedBody !== undefined && options.serializedBody !== '';\n\n return hasSerializedBody ? options.serializedBody : null;\n }\n\n // not all clients implement a serializedBody property (i.e., client-axios)\n return options.body !== '' ? options.body : null;\n }\n\n // plain/text body\n if (hasBody) {\n return options.body;\n }\n\n // no body was provided\n return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n /**\n * Which part of the request do we use to send the auth?\n *\n * @default 'header'\n */\n in?: 'header' | 'query' | 'cookie';\n /**\n * Header or query parameter name.\n *\n * @default 'Authorization'\n */\n name?: string;\n scheme?: 'basic' | 'bearer';\n type: 'apiKey' | 'http';\n}\n\nexport const getAuthToken = async (\n auth: Auth,\n callback: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken,\n): Promise<string | undefined> => {\n const token = typeof callback === 'function' ? await callback(auth) : callback;\n\n if (!token) {\n return;\n }\n\n if (auth.scheme === 'bearer') {\n return `Bearer ${token}`;\n }\n\n if (auth.scheme === 'basic') {\n return `Basic ${btoa(token)}`;\n }\n\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from '../core/auth.gen';\nimport type { QuerySerializerOptions } from '../core/bodySerializer.gen';\nimport { jsonBodySerializer } from '../core/bodySerializer.gen';\nimport {\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from '../core/pathSerializer.gen';\nimport { getUrl } from '../core/utils.gen';\nimport type { Client, ClientOptions, Config, RequestOptions } from './types.gen';\n\nexport const createQuerySerializer = <T = unknown>({\n parameters = {},\n ...args\n}: QuerySerializerOptions = {}) => {\n const querySerializer = (queryParams: T) => {\n const search: string[] = [];\n if (queryParams && typeof queryParams === 'object') {\n for (const name in queryParams) {\n const value = queryParams[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n const options = parameters[name] || args;\n\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: 'form',\n value,\n ...options.array,\n });\n if (serializedArray) search.push(serializedArray);\n } else if (typeof value === 'object') {\n const serializedObject = serializeObjectParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: 'deepObject',\n value: value as Record<string, unknown>,\n ...options.object,\n });\n if (serializedObject) search.push(serializedObject);\n } else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved: options.allowReserved,\n name,\n value: value as string,\n });\n if (serializedPrimitive) search.push(serializedPrimitive);\n }\n }\n }\n return search.join('&');\n };\n return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (contentType: string | null): Exclude<Config['parseAs'], 'auto'> => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return 'stream';\n }\n\n const cleanContent = contentType.split(';')[0]?.trim();\n\n if (!cleanContent) {\n return;\n }\n\n if (cleanContent.startsWith('application/json') || cleanContent.endsWith('+json')) {\n return 'json';\n }\n\n if (cleanContent === 'multipart/form-data') {\n return 'formData';\n }\n\n if (\n ['application/', 'audio/', 'image/', 'video/'].some((type) => cleanContent.startsWith(type))\n ) {\n return 'blob';\n }\n\n if (cleanContent.startsWith('text/')) {\n return 'text';\n }\n\n return;\n};\n\nconst checkForExistence = (\n options: Pick<RequestOptions, 'auth' | 'query'> & {\n headers: Headers;\n },\n name?: string,\n): boolean => {\n if (!name) {\n return false;\n }\n if (\n options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get('Cookie')?.includes(`${name}=`)\n ) {\n return true;\n }\n return false;\n};\n\nexport const setAuthParams = async ({\n security,\n ...options\n}: Pick<Required<RequestOptions>, 'security'> &\n Pick<RequestOptions, 'auth' | 'query'> & {\n headers: Headers;\n }) => {\n for (const auth of security) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n\n const token = await getAuthToken(auth, options.auth);\n\n if (!token) {\n continue;\n }\n\n const name = auth.name ?? 'Authorization';\n\n switch (auth.in) {\n case 'query':\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case 'cookie':\n options.headers.append('Cookie', `${name}=${token}`);\n break;\n case 'header':\n default:\n options.headers.set(name, token);\n break;\n }\n }\n};\n\nexport const buildUrl: Client['buildUrl'] = (options) =>\n getUrl({\n baseUrl: options.baseUrl as string,\n path: options.path,\n query: options.query,\n querySerializer:\n typeof options.querySerializer === 'function'\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith('/')) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\n\nexport const mergeHeaders = (\n ...headers: Array<Required<Config>['headers'] | undefined>\n): Headers => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n\n const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header);\n\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v as string);\n }\n } else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e., their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(\n key,\n typeof value === 'object' ? JSON.stringify(value) : (value as string),\n );\n }\n }\n }\n return mergedHeaders;\n};\n\ntype ErrInterceptor<Err, Res, Req, Options> = (\n error: Err,\n /** response may be undefined due to a network error where no response object is produced */\n response: Res | undefined,\n /** request may be undefined, because error may be from building the request object itself */\n request: Req | undefined,\n options: Options,\n) => Err | Promise<Err>;\n\ntype ReqInterceptor<Req, Options> = (request: Req, options: Options) => Req | Promise<Req>;\n\ntype ResInterceptor<Res, Req, Options> = (\n response: Res,\n request: Req,\n options: Options,\n) => Res | Promise<Res>;\n\nclass Interceptors<Interceptor> {\n fns: Array<Interceptor | null> = [];\n\n clear(): void {\n this.fns = [];\n }\n\n eject(id: number | Interceptor): void {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n\n exists(id: number | Interceptor): boolean {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n\n getInterceptorIndex(id: number | Interceptor): number {\n if (typeof id === 'number') {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n\n update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n\n use(fn: Interceptor): number {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\n\nexport interface Middleware<Req, Res, Err, Options> {\n error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;\n request: Interceptors<ReqInterceptor<Req, Options>>;\n response: Interceptors<ResInterceptor<Res, Req, Options>>;\n}\n\nexport const createInterceptors = <Req, Res, Err, Options>(): Middleware<\n Req,\n Res,\n Err,\n Options\n> => ({\n error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(),\n request: new Interceptors<ReqInterceptor<Req, Options>>(),\n response: new Interceptors<ResInterceptor<Res, Req, Options>>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: 'form',\n },\n object: {\n explode: true,\n style: 'deepObject',\n },\n});\n\nconst defaultHeaders = {\n 'Content-Type': 'application/json',\n};\n\nexport const createConfig = <T extends ClientOptions = ClientOptions>(\n override: Config<Omit<ClientOptions, keyof T> & T> = {},\n): Config<Omit<ClientOptions, keyof T> & T> => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: 'auto',\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from '../core/serverSentEvents.gen';\nimport type { HttpMethod } from '../core/types.gen';\nimport { getValidRequestBody } from '../core/utils.gen';\nimport type { Client, Config, RequestOptions, ResolvedRequestOptions } from './types.gen';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils.gen';\n\ntype ReqInit = Omit<RequestInit, 'body' | 'headers'> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<Request, Response, unknown, ResolvedRequestOptions>();\n\n const beforeRequest = async <\n TData = unknown,\n TResponseStyle extends 'data' | 'fields' = 'fields',\n ThrowOnError extends boolean = boolean,\n Url extends string = string,\n >(\n options: RequestOptions<TData, TResponseStyle, ThrowOnError, Url>,\n ) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined as string | undefined,\n };\n\n if (opts.security) {\n await setAuthParams({\n ...opts,\n security: opts.security,\n });\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body) as string | undefined;\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n\n const resolvedOpts = opts as typeof opts &\n ResolvedRequestOptions<TResponseStyle, ThrowOnError, Url>;\n const url = buildUrl(resolvedOpts);\n\n return { opts: resolvedOpts, url };\n };\n\n const request: Client['request'] = async (options) => {\n const throwOnError = options.throwOnError ?? _config.throwOnError;\n const responseStyle = options.responseStyle ?? _config.responseStyle;\n\n let request: Request | undefined;\n let response: Response | undefined;\n\n try {\n const { opts, url } = await beforeRequest(options);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n body: getValidRequestBody(opts),\n };\n\n request = new Request(url, requestInit);\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n\n response = await _fetch(request);\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n if (response.status === 204 || response.headers.get('Content-Length') === '0') {\n let emptyData: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'json': {\n // Some servers return 200 with no Content-Length and empty body.\n // response.json() would throw; read as text and parse if non-empty.\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n throw jsonError ?? textError;\n } catch (error) {\n let finalError = error;\n\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = await fn(finalError, response, request, options as ResolvedRequestOptions);\n }\n }\n\n finalError = finalError || {};\n\n if (throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n request,\n response,\n };\n }\n };\n\n const makeMethodFn = (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn = (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n serializedBody: getValidRequestBody(opts) as BodyInit | null | undefined,\n url,\n });\n };\n\n const _buildUrl: Client['buildUrl'] = (options) => buildUrl({ ..._config, ...options });\n\n return {\n buildUrl: _buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n } as Client;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { type ClientOptions, type Config, createClient, createConfig } from './client';\nimport type { ClientOptions as ClientOptions2 } from './types.gen';\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;\n\nexport const client = createClient(createConfig<ClientOptions2>({ baseUrl: 'https://api.savanto.ai' }));\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Client, Options as Options2, TDataShape } from './client';\nimport { client } from './client.gen';\nimport type { AdminClaimTenantData, AdminClaimTenantErrors, AdminClaimTenantResponses, AdminDeleteTenantData, AdminDeleteTenantErrors, AdminDeleteTenantResponses, AdminFindByEmailData, AdminFindByEmailErrors, AdminFindByEmailResponses, AdminFindByOwnerData, AdminFindByOwnerErrors, AdminFindByOwnerResponses, AdminGetTenantData, AdminGetTenantErrors, AdminGetTenantResponses, AdminGetUsageData, AdminGetUsageErrors, AdminGetUsageResponses, AdminReactivateTenantData, AdminReactivateTenantErrors, AdminReactivateTenantResponses, AdminResetCrawlsData, AdminResetCrawlsErrors, AdminResetCrawlsResponses, AdminUpdateOwnerEmailData, AdminUpdateOwnerEmailErrors, AdminUpdateOwnerEmailResponses, AdminUpdateSubscriptionData, AdminUpdateSubscriptionErrors, AdminUpdateSubscriptionResponses, AdminUpdateTierData, AdminUpdateTierErrors, AdminUpdateTierResponses, AdminUpdateUsageData, AdminUpdateUsageErrors, AdminUpdateUsageResponses, BulkDeletePostsData, BulkDeletePostsErrors, BulkDeletePostsResponses, BulkDeleteProductsData, BulkDeleteProductsErrors, BulkDeleteProductsResponses, BulkDeletePromptsData, BulkDeletePromptsErrors, BulkDeletePromptsResponses, BulkDeleteTaxonomiesData, BulkDeleteTaxonomiesErrors, BulkDeleteTaxonomiesResponses, BulkDeleteThreadsData, BulkDeleteThreadsErrors, BulkDeleteThreadsResponses, BulkUpdateWebhookStatusData, BulkUpdateWebhookStatusErrors, BulkUpdateWebhookStatusResponses, BulkUpsertPostsData, BulkUpsertPostsErrors, BulkUpsertPostsResponses, BulkUpsertProductsData, BulkUpsertProductsErrors, BulkUpsertProductsResponses, BulkUpsertPromptsData, BulkUpsertPromptsErrors, BulkUpsertPromptsResponses, BulkUpsertTaxonomiesData, BulkUpsertTaxonomiesErrors, BulkUpsertTaxonomiesResponses, CancelCrawlData, CancelCrawlErrors, CancelCrawlResponses, ChatData, ChatErrors, ChatResponses, ClearDomainErrorsData, ClearDomainErrorsErrors, ClearDomainErrorsResponses, CommitSearchData, CommitSearchErrors, CommitSearchResponses, ComplianceCustomerDataRequestData, ComplianceCustomerDataRequestErrors, ComplianceCustomerDataRequestResponses, ComplianceCustomerRedactData, ComplianceCustomerRedactErrors, ComplianceCustomerRedactResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponses, CreateTenantWorkspaceData, CreateTenantWorkspaceErrors, CreateTenantWorkspaceResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookResponses, DeleteCredentialsData, DeleteCredentialsErrors, DeleteCredentialsResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponses, DeleteFeedbackData, DeleteFeedbackErrors, DeleteFeedbackResponses, DeleteLiveAgentScheduleData, DeleteLiveAgentScheduleErrors, DeleteLiveAgentScheduleResponses, DeleteMcpConfigData, DeleteMcpConfigErrors, DeleteMcpConfigResponses, DeletePostData, DeletePostErrors, DeletePostResponses, DeletePostsByQueryData, DeletePostsByQueryErrors, DeletePostsByQueryResponses, DeleteProductData, DeleteProductErrors, DeleteProductResponses, DeleteProductsByQueryData, DeleteProductsByQueryErrors, DeleteProductsByQueryResponses, DeletePromptData, DeletePromptErrors, DeletePromptResponses, DeleteTaxonomiesByQueryData, DeleteTaxonomiesByQueryErrors, DeleteTaxonomiesByQueryResponses, DeleteTaxonomyData, DeleteTaxonomyErrors, DeleteTaxonomyResponses, DeleteTenantData, DeleteTenantErrors, DeleteTenantResponses, DeleteThreadData, DeleteThreadErrors, DeleteThreadResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponses, DeleteWorkspaceData, DeleteWorkspaceErrors, DeleteWorkspaceResponses, DeprovisionData, DeprovisionErrors, DeprovisionResponses, DiscoverToolsData, DiscoverToolsErrors, DiscoverToolsResponses, EndHandoffData, EndHandoffErrors, EndHandoffResponses, EnrollCrawlNotificationData, EnrollCrawlNotificationErrors, EnrollCrawlNotificationResponses, ExportThreadsData, ExportThreadsErrors, ExportThreadsResponses, GenerateDomainConfigData, GenerateDomainConfigErrors, GenerateDomainConfigResponses, GetAnalyticsFeedbackData, GetAnalyticsFeedbackErrors, GetAnalyticsFeedbackResponses, GetChatAnalyticsData, GetChatAnalyticsErrors, GetChatAnalyticsResponses, GetChatWidgetConfigData, GetChatWidgetConfigErrors, GetChatWidgetConfigResponses, GetCrawlConfigData, GetCrawlConfigErrors, GetCrawlConfigResponses, GetCrawlHistoryData, GetCrawlHistoryErrors, GetCrawlHistoryResponses, GetCrawlStatusData, GetCrawlStatusErrors, GetCrawlStatusResponses, GetCredentialStatusData, GetCredentialStatusErrors, GetCredentialStatusResponses, GetDomainErrorsData, GetDomainErrorsErrors, GetDomainErrorsResponses, GetDomainErrorSummaryData, GetDomainErrorSummaryErrors, GetDomainErrorSummaryResponses, GetDomainTemplatesData, GetDomainTemplatesErrors, GetDomainTemplatesResponses, GetFeedbackAnalyticsData, GetFeedbackAnalyticsErrors, GetFeedbackAnalyticsResponses, GetKnowledgeData, GetKnowledgeErrors, GetKnowledgeResponses, GetLiveAgentScheduleData, GetLiveAgentScheduleErrors, GetLiveAgentScheduleResponses, GetLiveAgentStatusData, GetLiveAgentStatusErrors, GetLiveAgentStatusResponses, GetMcpConfigData, GetMcpConfigErrors, GetMcpConfigResponses, GetPostData, GetPostErrors, GetPostResponses, GetProductData, GetProductErrors, GetProductRecommendationsData, GetProductRecommendationsErrors, GetProductRecommendationsResponses, GetProductResponses, GetPromptData, GetPromptErrors, GetPromptResponses, GetSearchAnalyticsData, GetSearchAnalyticsErrors, GetSearchAnalyticsResponses, GetSearchWidgetConfigData, GetSearchWidgetConfigErrors, GetSearchWidgetConfigResponses, GetTaxonomyData, GetTaxonomyErrors, GetTaxonomyResponses, GetTenantStatusData, GetTenantStatusErrors, GetTenantStatusResponses, GetTenantUsageData, GetTenantUsageErrors, GetTenantUsageHistoryData, GetTenantUsageHistoryErrors, GetTenantUsageHistoryResponses, GetTenantUsageResponses, GetTenantWhoamiData, GetTenantWhoamiErrors, GetTenantWhoamiResponses, GetThreadAnalyticsData, GetThreadAnalyticsErrors, GetThreadAnalyticsResponses, GetThreadData, GetThreadErrors, GetThreadFeedbackData, GetThreadFeedbackErrors, GetThreadFeedbackResponses, GetThreadMessagesData, GetThreadMessagesErrors, GetThreadMessagesResponses, GetThreadResponses, GetUploadUrlData, GetUploadUrlErrors, GetUploadUrlResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponses, GetWebhookStatsData, GetWebhookStatsErrors, GetWebhookStatsResponses, GetWorkspaceDetailsData, GetWorkspaceDetailsErrors, GetWorkspaceDetailsResponses, GetWorkspaceSettingsData, GetWorkspaceSettingsErrors, GetWorkspaceSettingsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysResponses, ListCustomDomainsData, ListCustomDomainsErrors, ListCustomDomainsResponses, ListFeedbackData, ListFeedbackErrors, ListFeedbackResponses, ListPostIdsData, ListPostIdsErrors, ListPostIdsResponses, ListProductIdsData, ListProductIdsErrors, ListProductIdsResponses, ListProductsData, ListProductsErrors, ListProductsResponses, ListPromptsData, ListPromptsErrors, ListPromptsResponses, ListSlackChannelsData, ListSlackChannelsErrors, ListSlackChannelsResponses, ListTaxonomiesData, ListTaxonomiesErrors, ListTaxonomiesResponses, ListTaxonomyIdsData, ListTaxonomyIdsErrors, ListTaxonomyIdsResponses, ListTenantWorkspacesData, ListTenantWorkspacesErrors, ListTenantWorkspacesResponses, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponses, PatchPostData, PatchPostErrors, PatchPostResponses, PatchProductData, PatchProductErrors, PatchProductResponses, ProvisionShopifyData, ProvisionShopifyErrors, ProvisionShopifyResponses, RevokeApiKeyData, RevokeApiKeyErrors, RevokeApiKeyResponses, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponses, ScrapePageData, ScrapePageErrors, ScrapePageResponses, ScrapeSinglePageData, ScrapeSinglePageErrors, ScrapeSinglePageResponses, SearchKnowledgeData, SearchKnowledgeErrors, SearchKnowledgeResponses, SearchPostsData, SearchPostsErrors, SearchPostsResponses, SearchProductsData, SearchProductsErrors, SearchProductsResponses, SearchPromptsData, SearchPromptsErrors, SearchPromptsResponses, SearchSearchesData, SearchSearchesErrors, SearchSearchesResponses, SearchThreadsData, SearchThreadsErrors, SearchThreadsResponses, StartCrawlData, StartCrawlErrors, StartCrawlResponses, StoreCredentialsData, StoreCredentialsErrors, StoreCredentialsResponses, SubmitFeedbackData, SubmitFeedbackErrors, SubmitFeedbackResponses, TestDomainConnectionData, TestDomainConnectionErrors, TestDomainConnectionResponses, TestWebhookData, TestWebhookErrors, TestWebhookResponses, UpdateChatWidgetConfigData, UpdateChatWidgetConfigErrors, UpdateChatWidgetConfigResponses, UpdateCrawlConfigData, UpdateCrawlConfigErrors, UpdateCrawlConfigResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainResponses, UpdateLiveAgentScheduleData, UpdateLiveAgentScheduleErrors, UpdateLiveAgentScheduleResponses, UpdateMcpConfigData, UpdateMcpConfigErrors, UpdateMcpConfigResponses, UpdateSearchWidgetConfigData, UpdateSearchWidgetConfigErrors, UpdateSearchWidgetConfigResponses, UpdateTenantFeaturesData, UpdateTenantFeaturesErrors, UpdateTenantFeaturesResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookResponses, UpdateWorkspaceData, UpdateWorkspaceErrors, UpdateWorkspaceResponses, UpdateWorkspaceSettingsData, UpdateWorkspaceSettingsErrors, UpdateWorkspaceSettingsResponses, UpsertPostData, UpsertPostErrors, UpsertPostResponses, UpsertProductData, UpsertProductErrors, UpsertProductResponses, UpsertPromptData, UpsertPromptErrors, UpsertPromptResponses, UpsertTaxonomyData, UpsertTaxonomyErrors, UpsertTaxonomyResponses, ValidateCustomDomainData, ValidateCustomDomainErrors, ValidateCustomDomainResponses } from './types.gen';\n\nexport type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown> = Options2<TData, ThrowOnError, TResponse> & {\n /**\n * You can provide a client instance returned by `createClient()` instead of\n * individual options. This might be also useful if you want to implement a\n * custom client.\n */\n client?: Client;\n /**\n * You can pass arbitrary values through the `meta` object. This can be\n * used to access values that aren't defined as part of the SDK function.\n */\n meta?: Record<string, unknown>;\n};\n\n/**\n * Send a chat message\n *\n * Send a visitor message through the full multi-agent pipeline: triage classifies intent, query agents retrieve grounded context from the product / post indexes (plus any custom domain agents), and response agents synthesise a grounded answer with product cards or cited content. The response is streamed as NDJSON when `stream: true` (each line is one of `{ type: \"token\", ... }`, `{ type: \"product\", ... }`, `{ type: \"done\" }`), or returned as a single JSON object when `stream: false`. Pass `threadId` to continue a conversation (memories and prior turns are loaded); omit it for a fresh one. Respects the workspace's active persona / system-prompt configuration.\n */\nexport const chat = <ThrowOnError extends boolean = false>(options?: Options<ChatData, ThrowOnError>) => (options?.client ?? client).post<ChatResponses, ChatErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/chat',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Start a website crawl\n *\n * Enqueue a crawl of the given root URL for the workspace in `X-Workspace-ID`. The crawler discovers pages via sitemap + link graph, classifies each page (product, product listing, or general content), and indexes products into `savanto-products` and content into `savanto-posts`. This call is asynchronous and returns immediately with a `crawlId`; poll `GET /crawl/{crawlId}/status` to track progress or subscribe to the email notification endpoint to be pinged when it completes. Starting a new crawl while one is already running for the same workspace will be rejected with 409 — cancel the running one first.\n */\nexport const startCrawl = <ThrowOnError extends boolean = false>(options?: Options<StartCrawlData, ThrowOnError>) => (options?.client ?? client).post<StartCrawlResponses, StartCrawlErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Scrape a single page\n *\n * Scrape and index a single page via the crawl queue.\n */\nexport const scrapeSinglePage = <ThrowOnError extends boolean = false>(options?: Options<ScrapeSinglePageData, ThrowOnError>) => (options?.client ?? client).post<ScrapeSinglePageResponses, ScrapeSinglePageErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/scrape',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get crawl configuration\n *\n * Return the persisted crawl configuration for the workspace (strategy, schedule, include / exclude URL patterns, max-pages budget, user-agent override). Use before a crawl to verify the active rules, or before an `update_crawl_config` call to preserve fields you are not changing.\n */\nexport const getCrawlConfig = <ThrowOnError extends boolean = false>(options?: Options<GetCrawlConfigData, ThrowOnError>) => (options?.client ?? client).get<GetCrawlConfigResponses, GetCrawlConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/config',\n ...options\n});\n\n/**\n * Update crawl configuration\n *\n * Replace the crawl configuration for the workspace. Common fields: `strategy` (`full` reindexes everything, `smart` skips pages whose content hash matches the previous crawl), `schedule` (cron-like), `includePatterns` / `excludePatterns` (glob URL filters), `maxPages` (safety cap). Omitted fields are set to their defaults — if you only want to tweak one setting, `GET /crawl/config` first and merge. Changes take effect on the next crawl run.\n */\nexport const updateCrawlConfig = <ThrowOnError extends boolean = false>(options?: Options<UpdateCrawlConfigData, ThrowOnError>) => (options?.client ?? client).put<UpdateCrawlConfigResponses, UpdateCrawlConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/config',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get crawl history\n *\n * Return a list of recent crawls for the tenant (or the workspace when `X-Workspace-ID` is set), newest first. Each entry has its final status (`completed`, `failed`, `cancelled`), page counts, duration, and any error summary — useful for diagnosing why a site's content is stale.\n */\nexport const getCrawlHistory = <ThrowOnError extends boolean = false>(options?: Options<GetCrawlHistoryData, ThrowOnError>) => (options?.client ?? client).get<GetCrawlHistoryResponses, GetCrawlHistoryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/history',\n ...options\n});\n\n/**\n * Get crawl status\n *\n * Return live status for a specific crawl id: `status` (`running`, `completed`, `failed`, `cancelled`), pages discovered / indexed / skipped / failed, elapsed time, and the current URL being processed. Poll every 3–10 seconds while `running`; stop polling once status is terminal. Returns 404 if the crawl id does not belong to the caller's tenant.\n */\nexport const getCrawlStatus = <ThrowOnError extends boolean = false>(options: Options<GetCrawlStatusData, ThrowOnError>) => (options.client ?? client).get<GetCrawlStatusResponses, GetCrawlStatusErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/{id}/status',\n ...options\n});\n\n/**\n * Cancel a running crawl\n *\n * Cancel a crawl that is currently in progress.\n */\nexport const cancelCrawl = <ThrowOnError extends boolean = false>(options: Options<CancelCrawlData, ThrowOnError>) => (options.client ?? client).post<CancelCrawlResponses, CancelCrawlErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/{id}/cancel',\n ...options\n});\n\n/**\n * Enroll for a crawl-complete email\n *\n * Requests an email notification when this crawl reaches a terminal state (completed or failed). Intended for the dashboard \"continue onboarding, email me when done\" CTA. Rejects crawls that have already finished. **Admin-only endpoint.** The `email` in the body is treated as opaque and persisted verbatim; the cloud API does NOT authenticate ownership of that address. Callers holding the admin bearer are trusted to have derived the recipient from an authoritative source (e.g. the signed-in user session on the Next.js proxy). Do NOT expose this route via license-key / public scopes.\n */\nexport const enrollCrawlNotification = <ThrowOnError extends boolean = false>(options: Options<EnrollCrawlNotificationData, ThrowOnError>) => (options.client ?? client).post<EnrollCrawlNotificationResponses, EnrollCrawlNotificationErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/{id}/notifications',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Scrape or delete a single page\n *\n * Scrape a URL and index it into the knowledge base, or delete a previously scraped page.\n */\nexport const scrapePage = <ThrowOnError extends boolean = false>(options?: Options<ScrapePageData, ThrowOnError>) => (options?.client ?? client).post<ScrapePageResponses, ScrapePageErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/scrape',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List products\n *\n * List products with optional filters. Supports pagination, category/tag/status filters, and metadata queries.\n */\nexport const listProducts = <ThrowOnError extends boolean = false>(options?: Options<ListProductsData, ThrowOnError>) => (options?.client ?? client).get<ListProductsResponses, ListProductsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products',\n ...options\n});\n\n/**\n * Upsert a product\n *\n * Create a new product or update the existing one whose `externalId` matches the body. Embeddings for the product's searchable text are generated and persisted as part of the call, so the product becomes searchable immediately after a successful response. Required fields: `externalId`, `name`. Optional: `description`, `price` (in cents), `priceMin` / `priceMax`, `stockStatus` (`in_stock` | `out_of_stock` | `limited`), `images` (array of URLs), `brand`, `category`, `attributes` (key/value). Workspaces with native Shopify / WooCommerce sync should normally rely on the plugin rather than calling this endpoint directly. Idempotent on `externalId`.\n */\nexport const upsertProduct = <ThrowOnError extends boolean = false>(options?: Options<UpsertProductData, ThrowOnError>) => (options?.client ?? client).post<UpsertProductResponses, UpsertProductErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk delete products\n *\n * Delete multiple products by their external IDs.\n */\nexport const bulkDeleteProducts = <ThrowOnError extends boolean = false>(options?: Options<BulkDeleteProductsData, ThrowOnError>) => (options?.client ?? client).delete<BulkDeleteProductsResponses, BulkDeleteProductsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk upsert products\n *\n * Create or update up to 100 products in a single request.\n */\nexport const bulkUpsertProducts = <ThrowOnError extends boolean = false>(options?: Options<BulkUpsertProductsData, ThrowOnError>) => (options?.client ?? client).post<BulkUpsertProductsResponses, BulkUpsertProductsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Search products\n *\n * Hybrid (BM25 + k-NN vector) search across the workspace's product catalog. Pass a natural-language `query` — the backend expands and filters it with an agent when that improves recall. Optional `filters` support `priceMin` / `priceMax`, `stockStatus`, `brand`, `category`, and arbitrary `attributes` equality. Optional `facets` returns aggregate counts for the requested fields. Use for \"find X\" style requests; use the chat endpoint instead if you want a conversational answer that cites the products.\n */\nexport const searchProducts = <ThrowOnError extends boolean = false>(options?: Options<SearchProductsData, ThrowOnError>) => (options?.client ?? client).post<SearchProductsResponses, SearchProductsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete products by query\n *\n * Delete all products matching the given filter criteria.\n */\nexport const deleteProductsByQuery = <ThrowOnError extends boolean = false>(options?: Options<DeleteProductsByQueryData, ThrowOnError>) => (options?.client ?? client).post<DeleteProductsByQueryResponses, DeleteProductsByQueryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/delete-by-query',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List product IDs\n *\n * Retrieve external IDs of indexed products with optional filters. Supports large offsets for sync.\n */\nexport const listProductIds = <ThrowOnError extends boolean = false>(options?: Options<ListProductIdsData, ThrowOnError>) => (options?.client ?? client).get<ListProductIdsResponses, ListProductIdsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/ids',\n ...options\n});\n\n/**\n * Delete a product\n *\n * Delete a single product by external ID.\n */\nexport const deleteProduct = <ThrowOnError extends boolean = false>(options: Options<DeleteProductData, ThrowOnError>) => (options.client ?? client).delete<DeleteProductResponses, DeleteProductErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/{id}',\n ...options\n});\n\n/**\n * Get a product\n *\n * Retrieve a single product by external ID.\n */\nexport const getProduct = <ThrowOnError extends boolean = false>(options: Options<GetProductData, ThrowOnError>) => (options.client ?? client).get<GetProductResponses, GetProductErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/{id}',\n ...options\n});\n\n/**\n * Patch a product\n *\n * Partially update a product (e.g. change indexStatus).\n */\nexport const patchProduct = <ThrowOnError extends boolean = false>(options: Options<PatchProductData, ThrowOnError>) => (options.client ?? client).patch<PatchProductResponses, PatchProductErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Upsert a post\n *\n * Create a new post / knowledge article or update the existing one whose `externalId` matches the body. Embeddings are generated synchronously so the post is immediately retrievable by chat and search. Required: `externalId`, `title`, `content` (markdown or plain text). Optional: `author`, `publishedAt` (ISO 8601), `url`, `tags`, `category`. Use this for help-center articles, FAQ entries, or arbitrary brand content that should be answerable via chat. For bulk backfills prefer `POST /posts/bulk`. Idempotent on `externalId`.\n */\nexport const upsertPost = <ThrowOnError extends boolean = false>(options?: Options<UpsertPostData, ThrowOnError>) => (options?.client ?? client).post<UpsertPostResponses, UpsertPostErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk delete posts\n *\n * Delete multiple posts by their external IDs.\n */\nexport const bulkDeletePosts = <ThrowOnError extends boolean = false>(options?: Options<BulkDeletePostsData, ThrowOnError>) => (options?.client ?? client).delete<BulkDeletePostsResponses, BulkDeletePostsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk upsert posts\n *\n * Create or update up to 100 posts in a single request.\n */\nexport const bulkUpsertPosts = <ThrowOnError extends boolean = false>(options?: Options<BulkUpsertPostsData, ThrowOnError>) => (options?.client ?? client).post<BulkUpsertPostsResponses, BulkUpsertPostsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Search posts\n *\n * Hybrid semantic + lexical search across the workspace's indexed posts / knowledge articles. Pass a natural-language `query`; the response returns the top-matching posts with excerpts, scores, and URLs. Use when you need raw passages to feed another agent; use the chat endpoint when you want a cited, synthesised answer rather than a list of hits.\n */\nexport const searchPosts = <ThrowOnError extends boolean = false>(options?: Options<SearchPostsData, ThrowOnError>) => (options?.client ?? client).post<SearchPostsResponses, SearchPostsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete posts by query\n *\n * Delete all posts matching the given filter criteria.\n */\nexport const deletePostsByQuery = <ThrowOnError extends boolean = false>(options?: Options<DeletePostsByQueryData, ThrowOnError>) => (options?.client ?? client).post<DeletePostsByQueryResponses, DeletePostsByQueryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/delete-by-query',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List post IDs\n *\n * Retrieve external IDs of indexed posts with optional filters. Supports large offsets for sync.\n */\nexport const listPostIds = <ThrowOnError extends boolean = false>(options?: Options<ListPostIdsData, ThrowOnError>) => (options?.client ?? client).get<ListPostIdsResponses, ListPostIdsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/ids',\n ...options\n});\n\n/**\n * Delete a post\n *\n * Delete a single post by external ID.\n */\nexport const deletePost = <ThrowOnError extends boolean = false>(options: Options<DeletePostData, ThrowOnError>) => (options.client ?? client).delete<DeletePostResponses, DeletePostErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/{id}',\n ...options\n});\n\n/**\n * Get a post\n *\n * Retrieve a single post by external ID.\n */\nexport const getPost = <ThrowOnError extends boolean = false>(options: Options<GetPostData, ThrowOnError>) => (options.client ?? client).get<GetPostResponses, GetPostErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/{id}',\n ...options\n});\n\n/**\n * Patch a post\n *\n * Partially update a post (e.g. change indexStatus).\n */\nexport const patchPost = <ThrowOnError extends boolean = false>(options: Options<PatchPostData, ThrowOnError>) => (options.client ?? client).patch<PatchPostResponses, PatchPostErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Search threads\n *\n * Search and filter conversation threads with pagination, date ranges, and sorting.\n */\nexport const searchThreads = <ThrowOnError extends boolean = false>(options?: Options<SearchThreadsData, ThrowOnError>) => (options?.client ?? client).post<SearchThreadsResponses, SearchThreadsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Export threads\n *\n * Export conversation threads in JSON or CSV format with optional date and user filtering.\n */\nexport const exportThreads = <ThrowOnError extends boolean = false>(options?: Options<ExportThreadsData, ThrowOnError>) => (options?.client ?? client).post<ExportThreadsResponses, ExportThreadsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/export',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get thread analytics\n *\n * Retrieve aggregate analytics and statistics about conversation threads.\n */\nexport const getThreadAnalytics = <ThrowOnError extends boolean = false>(options?: Options<GetThreadAnalyticsData, ThrowOnError>) => (options?.client ?? client).get<GetThreadAnalyticsResponses, GetThreadAnalyticsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/analytics',\n ...options\n});\n\n/**\n * Get thread messages\n *\n * Retrieve all messages for a specific conversation thread. Requires admin:threads or chat scope.\n */\nexport const getThreadMessages = <ThrowOnError extends boolean = false>(options: Options<GetThreadMessagesData, ThrowOnError>) => (options.client ?? client).get<GetThreadMessagesResponses, GetThreadMessagesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}/messages',\n ...options\n});\n\n/**\n * End live agent handoff\n *\n * End a live agent handoff session for a thread. Requires admin:threads or chat scope.\n */\nexport const endHandoff = <ThrowOnError extends boolean = false>(options: Options<EndHandoffData, ThrowOnError>) => (options.client ?? client).post<EndHandoffResponses, EndHandoffErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}/handoff/end',\n ...options\n});\n\n/**\n * Delete a thread\n *\n * Permanently delete a conversation thread by its ID.\n */\nexport const deleteThread = <ThrowOnError extends boolean = false>(options: Options<DeleteThreadData, ThrowOnError>) => (options.client ?? client).delete<DeleteThreadResponses, DeleteThreadErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}',\n ...options\n});\n\n/**\n * Get thread by ID\n *\n * Retrieve a single conversation thread by its ID, optionally including feedback data.\n */\nexport const getThread = <ThrowOnError extends boolean = false>(options: Options<GetThreadData, ThrowOnError>) => (options.client ?? client).get<GetThreadResponses, GetThreadErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}',\n ...options\n});\n\n/**\n * Bulk delete threads\n *\n * Delete multiple conversation threads by their IDs in a single request.\n */\nexport const bulkDeleteThreads = <ThrowOnError extends boolean = false>(options?: Options<BulkDeleteThreadsData, ThrowOnError>) => (options?.client ?? client).delete<BulkDeleteThreadsResponses, BulkDeleteThreadsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Search feedback\n *\n * Search and filter feedback entries with pagination.\n */\nexport const listFeedback = <ThrowOnError extends boolean = false>(options?: Options<ListFeedbackData, ThrowOnError>) => (options?.client ?? client).get<ListFeedbackResponses, ListFeedbackErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/feedback',\n ...options\n});\n\n/**\n * Submit feedback\n *\n * Submit user feedback for a piece of content or chat message.\n */\nexport const submitFeedback = <ThrowOnError extends boolean = false>(options?: Options<SubmitFeedbackData, ThrowOnError>) => (options?.client ?? client).post<SubmitFeedbackResponses, SubmitFeedbackErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/feedback',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get feedback analytics\n *\n * Retrieve aggregated feedback analytics for a date range.\n */\nexport const getFeedbackAnalytics = <ThrowOnError extends boolean = false>(options?: Options<GetFeedbackAnalyticsData, ThrowOnError>) => (options?.client ?? client).get<GetFeedbackAnalyticsResponses, GetFeedbackAnalyticsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/feedback/analytics',\n ...options\n});\n\n/**\n * Get feedback for a thread\n *\n * Retrieve all feedback entries associated with a specific thread.\n */\nexport const getThreadFeedback = <ThrowOnError extends boolean = false>(options: Options<GetThreadFeedbackData, ThrowOnError>) => (options.client ?? client).get<GetThreadFeedbackResponses, GetThreadFeedbackErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/feedback/thread/{threadId}',\n ...options\n});\n\n/**\n * Delete feedback\n *\n * Delete a feedback entry by ID.\n */\nexport const deleteFeedback = <ThrowOnError extends boolean = false>(options: Options<DeleteFeedbackData, ThrowOnError>) => (options.client ?? client).delete<DeleteFeedbackResponses, DeleteFeedbackErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/feedback/{id}',\n ...options\n});\n\n/**\n * List prompts\n *\n * List prompts with optional pagination and metadata filters.\n */\nexport const listPrompts = <ThrowOnError extends boolean = false>(options?: Options<ListPromptsData, ThrowOnError>) => (options?.client ?? client).get<ListPromptsResponses, ListPromptsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts',\n ...options\n});\n\n/**\n * Upsert a prompt\n *\n * Create or update a prompt by external ID.\n */\nexport const upsertPrompt = <ThrowOnError extends boolean = false>(options?: Options<UpsertPromptData, ThrowOnError>) => (options?.client ?? client).post<UpsertPromptResponses, UpsertPromptErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Search prompts\n *\n * Semantic search across prompts with optional filters.\n */\nexport const searchPrompts = <ThrowOnError extends boolean = false>(options?: Options<SearchPromptsData, ThrowOnError>) => (options?.client ?? client).post<SearchPromptsResponses, SearchPromptsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk delete prompts\n *\n * Delete multiple prompts by their external IDs.\n */\nexport const bulkDeletePrompts = <ThrowOnError extends boolean = false>(options?: Options<BulkDeletePromptsData, ThrowOnError>) => (options?.client ?? client).delete<BulkDeletePromptsResponses, BulkDeletePromptsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk upsert prompts\n *\n * Create or update up to 100 prompts in a single request.\n */\nexport const bulkUpsertPrompts = <ThrowOnError extends boolean = false>(options?: Options<BulkUpsertPromptsData, ThrowOnError>) => (options?.client ?? client).post<BulkUpsertPromptsResponses, BulkUpsertPromptsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete a prompt\n *\n * Delete a single prompt by external ID.\n */\nexport const deletePrompt = <ThrowOnError extends boolean = false>(options: Options<DeletePromptData, ThrowOnError>) => (options.client ?? client).delete<DeletePromptResponses, DeletePromptErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts/{id}',\n ...options\n});\n\n/**\n * Get a prompt\n *\n * Retrieve a single prompt by external ID.\n */\nexport const getPrompt = <ThrowOnError extends boolean = false>(options: Options<GetPromptData, ThrowOnError>) => (options.client ?? client).get<GetPromptResponses, GetPromptErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts/{id}',\n ...options\n});\n\n/**\n * Bulk update webhook status\n *\n * Update the status of multiple webhooks at once.\n */\nexport const bulkUpdateWebhookStatus = <ThrowOnError extends boolean = false>(options?: Options<BulkUpdateWebhookStatusData, ThrowOnError>) => (options?.client ?? client).post<BulkUpdateWebhookStatusResponses, BulkUpdateWebhookStatusErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/bulk-status',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List webhooks\n *\n * List all webhooks with optional filters, pagination, and sorting.\n */\nexport const listWebhooks = <ThrowOnError extends boolean = false>(options?: Options<ListWebhooksData, ThrowOnError>) => (options?.client ?? client).get<ListWebhooksResponses, ListWebhooksErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks',\n ...options\n});\n\n/**\n * Create a webhook\n *\n * Register a new webhook endpoint to receive event notifications.\n */\nexport const createWebhook = <ThrowOnError extends boolean = false>(options?: Options<CreateWebhookData, ThrowOnError>) => (options?.client ?? client).post<CreateWebhookResponses, CreateWebhookErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Test a webhook\n *\n * Send a test event to a webhook endpoint to verify connectivity.\n */\nexport const testWebhook = <ThrowOnError extends boolean = false>(options: Options<TestWebhookData, ThrowOnError>) => (options.client ?? client).post<TestWebhookResponses, TestWebhookErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}/test',\n ...options\n});\n\n/**\n * Get webhook stats\n *\n * Retrieve delivery statistics for a specific webhook.\n */\nexport const getWebhookStats = <ThrowOnError extends boolean = false>(options: Options<GetWebhookStatsData, ThrowOnError>) => (options.client ?? client).get<GetWebhookStatsResponses, GetWebhookStatsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}/stats',\n ...options\n});\n\n/**\n * Delete a webhook\n *\n * Permanently delete a webhook by ID.\n */\nexport const deleteWebhook = <ThrowOnError extends boolean = false>(options: Options<DeleteWebhookData, ThrowOnError>) => (options.client ?? client).delete<DeleteWebhookResponses, DeleteWebhookErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}',\n ...options\n});\n\n/**\n * Get a webhook\n *\n * Retrieve a single webhook by ID. Sensitive fields are redacted.\n */\nexport const getWebhook = <ThrowOnError extends boolean = false>(options: Options<GetWebhookData, ThrowOnError>) => (options.client ?? client).get<GetWebhookResponses, GetWebhookErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}',\n ...options\n});\n\n/**\n * Update a webhook\n *\n * Update an existing webhook configuration.\n */\nexport const updateWebhook = <ThrowOnError extends boolean = false>(options: Options<UpdateWebhookData, ThrowOnError>) => (options.client ?? client).put<UpdateWebhookResponses, UpdateWebhookErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List taxonomy terms\n *\n * List taxonomy terms with optional filters and pagination.\n */\nexport const listTaxonomies = <ThrowOnError extends boolean = false>(options?: Options<ListTaxonomiesData, ThrowOnError>) => (options?.client ?? client).get<ListTaxonomiesResponses, ListTaxonomiesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies',\n ...options\n});\n\n/**\n * Upsert a taxonomy term\n *\n * Create or update a taxonomy term by external ID.\n */\nexport const upsertTaxonomy = <ThrowOnError extends boolean = false>(options?: Options<UpsertTaxonomyData, ThrowOnError>) => (options?.client ?? client).post<UpsertTaxonomyResponses, UpsertTaxonomyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk delete taxonomy terms\n *\n * Delete multiple taxonomy terms by their external IDs.\n */\nexport const bulkDeleteTaxonomies = <ThrowOnError extends boolean = false>(options?: Options<BulkDeleteTaxonomiesData, ThrowOnError>) => (options?.client ?? client).delete<BulkDeleteTaxonomiesResponses, BulkDeleteTaxonomiesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk upsert taxonomy terms\n *\n * Create or update up to 100 taxonomy terms in a single request.\n */\nexport const bulkUpsertTaxonomies = <ThrowOnError extends boolean = false>(options?: Options<BulkUpsertTaxonomiesData, ThrowOnError>) => (options?.client ?? client).post<BulkUpsertTaxonomiesResponses, BulkUpsertTaxonomiesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete taxonomy terms by query\n *\n * Delete all taxonomy terms matching the given filter criteria.\n */\nexport const deleteTaxonomiesByQuery = <ThrowOnError extends boolean = false>(options?: Options<DeleteTaxonomiesByQueryData, ThrowOnError>) => (options?.client ?? client).post<DeleteTaxonomiesByQueryResponses, DeleteTaxonomiesByQueryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/delete-by-query',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List taxonomy term IDs\n *\n * Retrieve external IDs of indexed taxonomy terms with optional filters.\n */\nexport const listTaxonomyIds = <ThrowOnError extends boolean = false>(options?: Options<ListTaxonomyIdsData, ThrowOnError>) => (options?.client ?? client).get<ListTaxonomyIdsResponses, ListTaxonomyIdsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/ids',\n ...options\n});\n\n/**\n * Delete a taxonomy term\n *\n * Delete a single taxonomy term by external ID.\n */\nexport const deleteTaxonomy = <ThrowOnError extends boolean = false>(options: Options<DeleteTaxonomyData, ThrowOnError>) => (options.client ?? client).delete<DeleteTaxonomyResponses, DeleteTaxonomyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/{id}',\n ...options\n});\n\n/**\n * Get a taxonomy term\n *\n * Retrieve a single taxonomy term by external ID.\n */\nexport const getTaxonomy = <ThrowOnError extends boolean = false>(options: Options<GetTaxonomyData, ThrowOnError>) => (options.client ?? client).get<GetTaxonomyResponses, GetTaxonomyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/{id}',\n ...options\n});\n\n/**\n * Get search analytics\n *\n * Retrieve search analytics data including top queries, zero-result queries, and volume over time.\n */\nexport const getSearchAnalytics = <ThrowOnError extends boolean = false>(options?: Options<GetSearchAnalyticsData, ThrowOnError>) => (options?.client ?? client).get<GetSearchAnalyticsResponses, GetSearchAnalyticsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/analytics/search',\n ...options\n});\n\n/**\n * Search through search logs\n *\n * Query and filter recorded search logs with pagination and sorting.\n */\nexport const searchSearches = <ThrowOnError extends boolean = false>(options?: Options<SearchSearchesData, ThrowOnError>) => (options?.client ?? client).post<SearchSearchesResponses, SearchSearchesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/analytics/searches/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Commit a search event\n *\n * Record a search event for analytics tracking. Requires search scope.\n */\nexport const commitSearch = <ThrowOnError extends boolean = false>(options?: Options<CommitSearchData, ThrowOnError>) => (options?.client ?? client).post<CommitSearchResponses, CommitSearchErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/analytics/searches/commit',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get chat analytics\n *\n * Retrieve chat/thread analytics data over a configurable time window.\n */\nexport const getChatAnalytics = <ThrowOnError extends boolean = false>(options?: Options<GetChatAnalyticsData, ThrowOnError>) => (options?.client ?? client).get<GetChatAnalyticsResponses, GetChatAnalyticsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/analytics/chat',\n ...options\n});\n\n/**\n * Get feedback analytics\n *\n * Retrieve feedback analytics data with optional date range filtering.\n */\nexport const getAnalyticsFeedback = <ThrowOnError extends boolean = false>(options?: Options<GetAnalyticsFeedbackData, ThrowOnError>) => (options?.client ?? client).get<GetAnalyticsFeedbackResponses, GetAnalyticsFeedbackErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/analytics/feedback',\n ...options\n});\n\n/**\n * Get product recommendations\n *\n * Retrieve AI-powered product recommendations based on a source product, basket affinity, and optional filters.\n */\nexport const getProductRecommendations = <ThrowOnError extends boolean = false>(options?: Options<GetProductRecommendationsData, ThrowOnError>) => (options?.client ?? client).post<GetProductRecommendationsResponses, GetProductRecommendationsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/recommendations/products',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Self-delete tenant\n */\nexport const deleteTenant = <ThrowOnError extends boolean = false>(options: Options<DeleteTenantData, ThrowOnError>) => (options.client ?? client).delete<DeleteTenantResponses, DeleteTenantErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/{tenantId}',\n ...options\n});\n\n/**\n * Get tenant status\n *\n * Validate API key and retrieve tenant account information including tier, publishable key, and JWT secret.\n */\nexport const getTenantStatus = <ThrowOnError extends boolean = false>(options?: Options<GetTenantStatusData, ThrowOnError>) => (options?.client ?? client).get<GetTenantStatusResponses, GetTenantStatusErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/status',\n ...options\n});\n\n/**\n * Identity probe (tenant, scopes, key type)\n *\n * Return the tenant ID, tier, API key ID, key type, and scope list for the current caller. Designed for agent / MCP bootstrapping so clients can decide which operations are available before issuing them. Does NOT return any secret material.\n */\nexport const getTenantWhoami = <ThrowOnError extends boolean = false>(options?: Options<GetTenantWhoamiData, ThrowOnError>) => (options?.client ?? client).get<GetTenantWhoamiResponses, GetTenantWhoamiErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/whoami',\n ...options\n});\n\n/**\n * Update tenant feature flags\n */\nexport const updateTenantFeatures = <ThrowOnError extends boolean = false>(options?: Options<UpdateTenantFeaturesData, ThrowOnError>) => (options?.client ?? client).patch<UpdateTenantFeaturesResponses, UpdateTenantFeaturesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/features',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get usage summary\n *\n * Return the authenticated tenant's current-period usage against plan limits: chat messages sent, products indexed, posts indexed, crawl pages processed, and the dates of the billing window. Use for quota-aware UX or to warn a user that the next operation would trip an overage.\n */\nexport const getTenantUsage = <ThrowOnError extends boolean = false>(options?: Options<GetTenantUsageData, ThrowOnError>) => (options?.client ?? client).get<GetTenantUsageResponses, GetTenantUsageErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/usage',\n ...options\n});\n\n/**\n * Get daily usage history\n */\nexport const getTenantUsageHistory = <ThrowOnError extends boolean = false>(options?: Options<GetTenantUsageHistoryData, ThrowOnError>) => (options?.client ?? client).get<GetTenantUsageHistoryResponses, GetTenantUsageHistoryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/usage/history',\n ...options\n});\n\n/**\n * List workspaces\n *\n * Return every workspace owned by the authenticated tenant, with each workspace's id, name, platform (wordpress | shopify | custom | none), and domain. Use this before calling any workspace-scoped endpoint (crawl, products, posts, chat) to discover the correct `workspaceId` to pass via the `X-Workspace-ID` header. Always cheap and safe to call repeatedly.\n */\nexport const listTenantWorkspaces = <ThrowOnError extends boolean = false>(options?: Options<ListTenantWorkspacesData, ThrowOnError>) => (options?.client ?? client).get<ListTenantWorkspacesResponses, ListTenantWorkspacesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/workspaces',\n ...options\n});\n\n/**\n * Create a workspace\n *\n * Create a new workspace (a distinct site / storefront) under the authenticated tenant. Returns the workspace id you will pass as `X-Workspace-ID` on every subsequent content, crawl, and chat request. Typical onboarding flow: create → (optionally set platform) → start crawl → ingest products/posts. Creation does NOT enqueue a crawl — call `POST /crawl` separately.\n */\nexport const createTenantWorkspace = <ThrowOnError extends boolean = false>(options?: Options<CreateTenantWorkspaceData, ThrowOnError>) => (options?.client ?? client).post<CreateTenantWorkspaceResponses, CreateTenantWorkspaceErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/workspaces',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete a workspace\n *\n * Permanently delete a workspace and every document indexed under it (products, posts, taxonomies, chat threads, crawl history). This is NOT recoverable — prefer `POST /workspaces` to create a new one rather than delete + recreate for routine cleanup. Returns 404 if the id does not belong to the caller's tenant.\n */\nexport const deleteWorkspace = <ThrowOnError extends boolean = false>(options: Options<DeleteWorkspaceData, ThrowOnError>) => (options.client ?? client).delete<DeleteWorkspaceResponses, DeleteWorkspaceErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/workspaces/{workspaceId}',\n ...options\n});\n\n/**\n * Update a workspace\n *\n * Patch name, platform, or metadata on an existing workspace. Accepts a partial body; omitted fields are left untouched. Changing `platform` from `none` to `wordpress` / `shopify` signals the ingestion pipeline to prefer native sync over crawl-derived content on subsequent operations.\n */\nexport const updateWorkspace = <ThrowOnError extends boolean = false>(options: Options<UpdateWorkspaceData, ThrowOnError>) => (options.client ?? client).put<UpdateWorkspaceResponses, UpdateWorkspaceErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/workspaces/{workspaceId}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get document statistics\n *\n * Retrieve document counts and breakdown by type from the knowledge base.\n */\nexport const getKnowledge = <ThrowOnError extends boolean = false>(options?: Options<GetKnowledgeData, ThrowOnError>) => (options?.client ?? client).get<GetKnowledgeResponses, GetKnowledgeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/knowledge',\n ...options\n});\n\n/**\n * Search knowledge base documents\n */\nexport const searchKnowledge = <ThrowOnError extends boolean = false>(options?: Options<SearchKnowledgeData, ThrowOnError>) => (options?.client ?? client).get<SearchKnowledgeResponses, SearchKnowledgeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/knowledge/search',\n ...options\n});\n\n/**\n * Get presigned upload URL\n */\nexport const getUploadUrl = <ThrowOnError extends boolean = false>(options?: Options<GetUploadUrlData, ThrowOnError>) => (options?.client ?? client).post<GetUploadUrlResponses, GetUploadUrlErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/upload-url',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete MCP configuration\n */\nexport const deleteMcpConfig = <ThrowOnError extends boolean = false>(options?: Options<DeleteMcpConfigData, ThrowOnError>) => (options?.client ?? client).delete<DeleteMcpConfigResponses, DeleteMcpConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/mcp',\n ...options\n});\n\n/**\n * Get MCP configuration\n */\nexport const getMcpConfig = <ThrowOnError extends boolean = false>(options?: Options<GetMcpConfigData, ThrowOnError>) => (options?.client ?? client).get<GetMcpConfigResponses, GetMcpConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/mcp',\n ...options\n});\n\n/**\n * Update MCP configuration\n */\nexport const updateMcpConfig = <ThrowOnError extends boolean = false>(options?: Options<UpdateMcpConfigData, ThrowOnError>) => (options?.client ?? client).put<UpdateMcpConfigResponses, UpdateMcpConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/mcp',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Check live agent credential status\n */\nexport const getCredentialStatus = <ThrowOnError extends boolean = false>(options?: Options<GetCredentialStatusData, ThrowOnError>) => (options?.client ?? client).get<GetCredentialStatusResponses, GetCredentialStatusErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/credentials/status',\n ...options\n});\n\n/**\n * Delete live agent credentials\n */\nexport const deleteCredentials = <ThrowOnError extends boolean = false>(options?: Options<DeleteCredentialsData, ThrowOnError>) => (options?.client ?? client).delete<DeleteCredentialsResponses, DeleteCredentialsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/credentials',\n ...options\n});\n\n/**\n * Store live agent credentials\n */\nexport const storeCredentials = <ThrowOnError extends boolean = false>(options?: Options<StoreCredentialsData, ThrowOnError>) => (options?.client ?? client).post<StoreCredentialsResponses, StoreCredentialsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/credentials',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete live agent schedule\n */\nexport const deleteLiveAgentSchedule = <ThrowOnError extends boolean = false>(options?: Options<DeleteLiveAgentScheduleData, ThrowOnError>) => (options?.client ?? client).delete<DeleteLiveAgentScheduleResponses, DeleteLiveAgentScheduleErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/schedule',\n ...options\n});\n\n/**\n * Get live agent schedule\n */\nexport const getLiveAgentSchedule = <ThrowOnError extends boolean = false>(options?: Options<GetLiveAgentScheduleData, ThrowOnError>) => (options?.client ?? client).get<GetLiveAgentScheduleResponses, GetLiveAgentScheduleErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/schedule',\n ...options\n});\n\n/**\n * Update live agent schedule\n */\nexport const updateLiveAgentSchedule = <ThrowOnError extends boolean = false>(options?: Options<UpdateLiveAgentScheduleData, ThrowOnError>) => (options?.client ?? client).put<UpdateLiveAgentScheduleResponses, UpdateLiveAgentScheduleErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/schedule',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get workspace settings\n *\n * Retrieve settings for a workspace including live agent configuration and special instructions.\n */\nexport const getWorkspaceSettings = <ThrowOnError extends boolean = false>(options: Options<GetWorkspaceSettingsData, ThrowOnError>) => (options.client ?? client).get<GetWorkspaceSettingsResponses, GetWorkspaceSettingsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/settings',\n ...options\n});\n\n/**\n * Update workspace settings\n *\n * Update workspace settings such as live agent configuration, description, and special instructions.\n */\nexport const updateWorkspaceSettings = <ThrowOnError extends boolean = false>(options: Options<UpdateWorkspaceSettingsData, ThrowOnError>) => (options.client ?? client).patch<UpdateWorkspaceSettingsResponses, UpdateWorkspaceSettingsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/settings',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get live agent connection status\n */\nexport const getLiveAgentStatus = <ThrowOnError extends boolean = false>(options: Options<GetLiveAgentStatusData, ThrowOnError>) => (options.client ?? client).get<GetLiveAgentStatusResponses, GetLiveAgentStatusErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/live-agent/status',\n ...options\n});\n\n/**\n * List Slack channels for live agent\n */\nexport const listSlackChannels = <ThrowOnError extends boolean = false>(options: Options<ListSlackChannelsData, ThrowOnError>) => (options.client ?? client).get<ListSlackChannelsResponses, ListSlackChannelsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/live-agent/slack/channels',\n ...options\n});\n\n/**\n * Get chat widget configuration\n */\nexport const getChatWidgetConfig = <ThrowOnError extends boolean = false>(options: Options<GetChatWidgetConfigData, ThrowOnError>) => (options.client ?? client).get<GetChatWidgetConfigResponses, GetChatWidgetConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/chat',\n ...options\n});\n\n/**\n * Update chat widget configuration\n */\nexport const updateChatWidgetConfig = <ThrowOnError extends boolean = false>(options: Options<UpdateChatWidgetConfigData, ThrowOnError>) => (options.client ?? client).post<UpdateChatWidgetConfigResponses, UpdateChatWidgetConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/chat',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get search widget configuration\n */\nexport const getSearchWidgetConfig = <ThrowOnError extends boolean = false>(options: Options<GetSearchWidgetConfigData, ThrowOnError>) => (options.client ?? client).get<GetSearchWidgetConfigResponses, GetSearchWidgetConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/search',\n ...options\n});\n\n/**\n * Update search widget configuration\n */\nexport const updateSearchWidgetConfig = <ThrowOnError extends boolean = false>(options: Options<UpdateSearchWidgetConfigData, ThrowOnError>) => (options.client ?? client).post<UpdateSearchWidgetConfigResponses, UpdateSearchWidgetConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List custom domains\n */\nexport const listCustomDomains = <ThrowOnError extends boolean = false>(options: Options<ListCustomDomainsData, ThrowOnError>) => (options.client ?? client).get<ListCustomDomainsResponses, ListCustomDomainsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain',\n ...options\n});\n\n/**\n * Create a custom domain\n *\n * Register a custom domain (MCP server, API endpoints) for AI chat integration.\n */\nexport const createCustomDomain = <ThrowOnError extends boolean = false>(options: Options<CreateCustomDomainData, ThrowOnError>) => (options.client ?? client).post<CreateCustomDomainResponses, CreateCustomDomainErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Delete a custom domain\n *\n * Remove a custom domain configuration from the workspace.\n */\nexport const deleteCustomDomain = <ThrowOnError extends boolean = false>(options: Options<DeleteCustomDomainData, ThrowOnError>) => (options.client ?? client).delete<DeleteCustomDomainResponses, DeleteCustomDomainErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/{domainId}',\n ...options\n});\n\n/**\n * Update a custom domain\n */\nexport const updateCustomDomain = <ThrowOnError extends boolean = false>(options: Options<UpdateCustomDomainData, ThrowOnError>) => (options.client ?? client).put<UpdateCustomDomainResponses, UpdateCustomDomainErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/{domainId}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get error counts across all domains\n */\nexport const getDomainErrorSummary = <ThrowOnError extends boolean = false>(options: Options<GetDomainErrorSummaryData, ThrowOnError>) => (options.client ?? client).get<GetDomainErrorSummaryResponses, GetDomainErrorSummaryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/error-summary',\n ...options\n});\n\n/**\n * Clear error logs for a domain\n */\nexport const clearDomainErrors = <ThrowOnError extends boolean = false>(options: Options<ClearDomainErrorsData, ThrowOnError>) => (options.client ?? client).delete<ClearDomainErrorsResponses, ClearDomainErrorsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/{domainId}/errors',\n ...options\n});\n\n/**\n * Get error logs for a domain\n */\nexport const getDomainErrors = <ThrowOnError extends boolean = false>(options: Options<GetDomainErrorsData, ThrowOnError>) => (options.client ?? client).get<GetDomainErrorsResponses, GetDomainErrorsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/{domainId}/errors',\n ...options\n});\n\n/**\n * Validate a custom domain configuration\n */\nexport const validateCustomDomain = <ThrowOnError extends boolean = false>(options: Options<ValidateCustomDomainData, ThrowOnError>) => (options.client ?? client).post<ValidateCustomDomainResponses, ValidateCustomDomainErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/validate',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Test domain classification with sample queries\n */\nexport const testDomainConnection = <ThrowOnError extends boolean = false>(options: Options<TestDomainConnectionData, ThrowOnError>) => (options.client ?? client).post<TestDomainConnectionResponses, TestDomainConnectionErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/test-connection',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get workspace details\n *\n * Return the full configuration for a workspace: platform, domain, crawl config, widget settings, chat persona, live-agent handoff, custom domains, and document counts. Preferred read for agent bootstrap because it returns every knob in one call.\n */\nexport const getWorkspaceDetails = <ThrowOnError extends boolean = false>(options: Options<GetWorkspaceDetailsData, ThrowOnError>) => (options.client ?? client).get<GetWorkspaceDetailsResponses, GetWorkspaceDetailsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/details',\n ...options\n});\n\n/**\n * Discover available tools from MCP servers\n */\nexport const discoverTools = <ThrowOnError extends boolean = false>(options: Options<DiscoverToolsData, ThrowOnError>) => (options.client ?? client).post<DiscoverToolsResponses, DiscoverToolsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/discover-tools',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * AI-generate a custom domain configuration\n */\nexport const generateDomainConfig = <ThrowOnError extends boolean = false>(options: Options<GenerateDomainConfigData, ThrowOnError>) => (options.client ?? client).post<GenerateDomainConfigResponses, GenerateDomainConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/generate',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get available domain templates\n */\nexport const getDomainTemplates = <ThrowOnError extends boolean = false>(options: Options<GetDomainTemplatesData, ThrowOnError>) => (options.client ?? client).get<GetDomainTemplatesResponses, GetDomainTemplatesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/templates',\n ...options\n});\n\n/**\n * Deprovision a tenant or workspace\n *\n * Tear down a tenant or single workspace. Supports two auth modes: admin (set tenantId in the body to deprovision any tenant) or tenant self-deprovision (authenticate with the tenant API key; tenantId is derived from the auth context). Used by the Shopify app on app uninstall.\n */\nexport const deprovision = <ThrowOnError extends boolean = false>(options?: Options<DeprovisionData, ThrowOnError>) => (options?.client ?? client).post<DeprovisionResponses, DeprovisionErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/deprovision',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List API keys\n *\n * List all API keys for the authenticated tenant.\n */\nexport const listApiKeys = <ThrowOnError extends boolean = false>(options?: Options<ListApiKeysData, ThrowOnError>) => (options?.client ?? client).get<ListApiKeysResponses, ListApiKeysErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/keys',\n ...options\n});\n\n/**\n * Create an API key\n *\n * Create a new API key for the authenticated tenant.\n */\nexport const createApiKey = <ThrowOnError extends boolean = false>(options?: Options<CreateApiKeyData, ThrowOnError>) => (options?.client ?? client).post<CreateApiKeyResponses, CreateApiKeyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/keys',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Revoke an API key\n *\n * Revoke an API key by ID.\n */\nexport const revokeApiKey = <ThrowOnError extends boolean = false>(options: Options<RevokeApiKeyData, ThrowOnError>) => (options.client ?? client).post<RevokeApiKeyResponses, RevokeApiKeyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/keys/{keyId}/revoke',\n ...options\n});\n\n/**\n * Rotate an API key\n *\n * Rotate an API key, generating a new key and revoking the old one.\n */\nexport const rotateApiKey = <ThrowOnError extends boolean = false>(options: Options<RotateApiKeyData, ThrowOnError>) => (options.client ?? client).post<RotateApiKeyResponses, RotateApiKeyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/keys/{keyId}/rotate',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Provision a Shopify tenant\n *\n * Called by the Savanto Shopify app after a merchant completes OAuth. Creates a new tenant + workspace, or reactivates and reissues keys if the shop was previously installed.\n */\nexport const provisionShopify = <ThrowOnError extends boolean = false>(options?: Options<ProvisionShopifyData, ThrowOnError>) => (options?.client ?? client).post<ProvisionShopifyResponses, ProvisionShopifyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/shopify',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete a tenant and all associated data\n */\nexport const adminDeleteTenant = <ThrowOnError extends boolean = false>(options: Options<AdminDeleteTenantData, ThrowOnError>) => (options.client ?? client).delete<AdminDeleteTenantResponses, AdminDeleteTenantErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}',\n ...options\n});\n\n/**\n * Get tenant details\n */\nexport const adminGetTenant = <ThrowOnError extends boolean = false>(options: Options<AdminGetTenantData, ThrowOnError>) => (options.client ?? client).get<AdminGetTenantResponses, AdminGetTenantErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}',\n ...options\n});\n\n/**\n * Find unclaimed tenants by email\n */\nexport const adminFindByEmail = <ThrowOnError extends boolean = false>(options: Options<AdminFindByEmailData, ThrowOnError>) => (options.client ?? client).get<AdminFindByEmailResponses, AdminFindByEmailErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/by-email/{email}',\n ...options\n});\n\n/**\n * Find tenants by owner ID\n */\nexport const adminFindByOwner = <ThrowOnError extends boolean = false>(options: Options<AdminFindByOwnerData, ThrowOnError>) => (options.client ?? client).get<AdminFindByOwnerResponses, AdminFindByOwnerErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/by-owner/{ownerId}',\n ...options\n});\n\n/**\n * Claim an unclaimed tenant\n */\nexport const adminClaimTenant = <ThrowOnError extends boolean = false>(options: Options<AdminClaimTenantData, ThrowOnError>) => (options.client ?? client).post<AdminClaimTenantResponses, AdminClaimTenantErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/claim',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Update a tenant's owner email\n */\nexport const adminUpdateOwnerEmail = <ThrowOnError extends boolean = false>(options: Options<AdminUpdateOwnerEmailData, ThrowOnError>) => (options.client ?? client).patch<AdminUpdateOwnerEmailResponses, AdminUpdateOwnerEmailErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/owner-email',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Update a tenant's subscription\n */\nexport const adminUpdateSubscription = <ThrowOnError extends boolean = false>(options: Options<AdminUpdateSubscriptionData, ThrowOnError>) => (options.client ?? client).patch<AdminUpdateSubscriptionResponses, AdminUpdateSubscriptionErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/subscription',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Reactivate a soft-deleted tenant\n */\nexport const adminReactivateTenant = <ThrowOnError extends boolean = false>(options: Options<AdminReactivateTenantData, ThrowOnError>) => (options.client ?? client).post<AdminReactivateTenantResponses, AdminReactivateTenantErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/reactivate',\n ...options\n});\n\n/**\n * Get detailed usage for a tenant\n */\nexport const adminGetUsage = <ThrowOnError extends boolean = false>(options: Options<AdminGetUsageData, ThrowOnError>) => (options.client ?? client).get<AdminGetUsageResponses, AdminGetUsageErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/usage',\n ...options\n});\n\n/**\n * Set usage metric values\n */\nexport const adminUpdateUsage = <ThrowOnError extends boolean = false>(options: Options<AdminUpdateUsageData, ThrowOnError>) => (options.client ?? client).patch<AdminUpdateUsageResponses, AdminUpdateUsageErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/usage',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Update a tenant's tier\n */\nexport const adminUpdateTier = <ThrowOnError extends boolean = false>(options: Options<AdminUpdateTierData, ThrowOnError>) => (options.client ?? client).patch<AdminUpdateTierResponses, AdminUpdateTierErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/tier',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Reset a tenant's crawl records for the current month\n */\nexport const adminResetCrawls = <ThrowOnError extends boolean = false>(options: Options<AdminResetCrawlsData, ThrowOnError>) => (options.client ?? client).post<AdminResetCrawlsResponses, AdminResetCrawlsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/crawls/reset',\n ...options\n});\n\n/**\n * Redact a customer across all stored PII\n *\n * Hard-deletes every thread document and memory document within the caller tenant that matches the supplied customer identifiers. Runs as async OpenSearch tasks; the response contains task IDs for reconciliation. Idempotent when `caller.externalId` is supplied.\n */\nexport const complianceCustomerRedact = <ThrowOnError extends boolean = false>(options?: Options<ComplianceCustomerRedactData, ThrowOnError>) => (options?.client ?? client).post<ComplianceCustomerRedactResponses, ComplianceCustomerRedactErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/compliance/customer-redact',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Record a customer data-export request\n *\n * Queues a customer data-export request and notifies ops to fulfill it within Shopify's 30-day SLA. Idempotent when `caller.externalId` is supplied.\n */\nexport const complianceCustomerDataRequest = <ThrowOnError extends boolean = false>(options?: Options<ComplianceCustomerDataRequestData, ThrowOnError>) => (options?.client ?? client).post<ComplianceCustomerDataRequestResponses, ComplianceCustomerDataRequestErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/compliance/customer-data-request',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n","/**\n * Convert a URL or domain to a normalized workspace ID.\n *\n * @example\n * workspaceIdFromUrl('https://mystore.com') // 'mystore-com'\n * workspaceIdFromUrl('my-store.myshopify.com') // 'my-store-myshopify-com'\n * workspaceIdFromUrl('example.com/path') // 'example-com'\n */\nexport function workspaceIdFromUrl(url: string): string {\n if (!url) return '';\n\n try {\n const parsed = new URL(url.startsWith('http') ? url : `https://${url}`);\n return parsed.hostname.replace(/\\./g, '-').toLowerCase();\n } catch {\n return url\n .replace(/^https?:\\/\\//, '')\n .replace(/\\/.*$/, '')\n .replace(/[^a-z0-9-]/gi, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/generated/core/bodySerializer.gen.ts","../src/generated/core/serverSentEvents.gen.ts","../src/generated/core/pathSerializer.gen.ts","../src/generated/core/utils.gen.ts","../src/generated/core/auth.gen.ts","../src/generated/client/utils.gen.ts","../src/generated/client/client.gen.ts","../src/generated/client.gen.ts","../src/generated/sdk.gen.ts","../src/util.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ArrayStyle, ObjectStyle, SerializerOptions } from './pathSerializer.gen';\n\nexport type QuerySerializer = (query: Record<string, unknown>) => string;\n\nexport type BodySerializer = (body: unknown) => unknown;\n\ntype QuerySerializerOptionsObject = {\n allowReserved?: boolean;\n array?: Partial<SerializerOptions<ArrayStyle>>;\n object?: Partial<SerializerOptions<ObjectStyle>>;\n};\n\nexport type QuerySerializerOptions = QuerySerializerOptionsObject & {\n /**\n * Per-parameter serialization overrides. When provided, these settings\n * override the global array/object settings for specific parameter names.\n */\n parameters?: Record<string, QuerySerializerOptionsObject>;\n};\n\nconst serializeFormDataPair = (data: FormData, key: string, value: unknown): void => {\n if (typeof value === 'string' || value instanceof Blob) {\n data.append(key, value);\n } else if (value instanceof Date) {\n data.append(key, value.toISOString());\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nconst serializeUrlSearchParamsPair = (data: URLSearchParams, key: string, value: unknown): void => {\n if (typeof value === 'string') {\n data.append(key, value);\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nexport const formDataBodySerializer = {\n bodySerializer: (body: unknown): FormData => {\n const data = new FormData();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n } else {\n serializeFormDataPair(data, key, value);\n }\n });\n\n return data;\n },\n};\n\nexport const jsonBodySerializer = {\n bodySerializer: (body: unknown): string =>\n JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)),\n};\n\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: (body: unknown): string => {\n const data = new URLSearchParams();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n } else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from './types.gen';\n\nexport type ServerSentEventsOptions<TData = unknown> = Omit<RequestInit, 'method'> &\n Pick<Config, 'method' | 'responseTransformer' | 'responseValidator'> & {\n /**\n * Fetch API implementation. You can use this option to provide a custom\n * fetch instance.\n *\n * @default globalThis.fetch\n */\n fetch?: typeof fetch;\n /**\n * Implementing clients can call request interceptors inside this hook.\n */\n onRequest?: (url: string, init: RequestInit) => Promise<Request>;\n /**\n * Callback invoked when a network or parsing error occurs during streaming.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param error The error that occurred.\n */\n onSseError?: (error: unknown) => void;\n /**\n * Callback invoked when an event is streamed from the server.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param event Event streamed from the server.\n * @returns Nothing (void).\n */\n onSseEvent?: (event: StreamEvent<TData>) => void;\n serializedBody?: RequestInit['body'];\n /**\n * Default retry delay in milliseconds.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 3000\n */\n sseDefaultRetryDelay?: number;\n /**\n * Maximum number of retry attempts before giving up.\n */\n sseMaxRetryAttempts?: number;\n /**\n * Maximum retry delay in milliseconds.\n *\n * Applies only when exponential backoff is used.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 30000\n */\n sseMaxRetryDelay?: number;\n /**\n * Optional sleep function for retry backoff.\n *\n * Defaults to using `setTimeout`.\n */\n sseSleepFn?: (ms: number) => Promise<void>;\n url: string;\n };\n\nexport interface StreamEvent<TData = unknown> {\n data: TData;\n event?: string;\n id?: string;\n retry?: number;\n}\n\nexport type ServerSentEventsResult<TData = unknown, TReturn = void, TNext = unknown> = {\n stream: AsyncGenerator<\n TData extends Record<string, unknown> ? TData[keyof TData] : TData,\n TReturn,\n TNext\n >;\n};\n\nexport function createSseClient<TData = unknown>({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}: ServerSentEventsOptions): ServerSentEventsResult<TData> {\n let lastEventId: string | undefined;\n\n const sleep = sseSleepFn ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n const createStream = async function* () {\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n\n while (true) {\n if (signal.aborted) break;\n\n attempt++;\n\n const headers =\n options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers as Record<string, string> | undefined);\n\n if (lastEventId !== undefined) {\n headers.set('Last-Event-ID', lastEventId);\n }\n\n try {\n const requestInit: RequestInit = {\n redirect: 'follow',\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n\n if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`);\n\n if (!response.body) throw new Error('No body in SSE response');\n\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();\n\n let buffer = '';\n\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n // noop\n }\n };\n\n signal.addEventListener('abort', abortHandler);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n buffer = buffer.replace(/\\r\\n?/g, '\\n'); // normalize line endings\n\n const chunks = buffer.split('\\n\\n');\n buffer = chunks.pop() ?? '';\n\n for (const chunk of chunks) {\n const lines = chunk.split('\\n');\n const dataLines: Array<string> = [];\n let eventName: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n dataLines.push(line.replace(/^data:\\s*/, ''));\n } else if (line.startsWith('event:')) {\n eventName = line.replace(/^event:\\s*/, '');\n } else if (line.startsWith('id:')) {\n lastEventId = line.replace(/^id:\\s*/, '');\n } else if (line.startsWith('retry:')) {\n const parsed = Number.parseInt(line.replace(/^retry:\\s*/, ''), 10);\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n\n let data: unknown;\n let parsedJson = false;\n\n if (dataLines.length) {\n const rawData = dataLines.join('\\n');\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n\n if (dataLines.length) {\n yield data as any;\n }\n }\n }\n } finally {\n signal.removeEventListener('abort', abortHandler);\n reader.releaseLock();\n }\n\n break; // exit loop on normal completion\n } catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n\n if (sseMaxRetryAttempts !== undefined && attempt >= sseMaxRetryAttempts) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 30000);\n await sleep(backoff);\n }\n }\n };\n\n const stream = createStream();\n\n return { stream };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions<T> extends SerializePrimitiveOptions, SerializerOptions<T> {}\n\ninterface SerializePrimitiveOptions {\n allowReserved?: boolean;\n name: string;\n}\n\nexport interface SerializerOptions<T> {\n /**\n * @default true\n */\n explode: boolean;\n style: T;\n}\n\nexport type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited';\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = 'label' | 'matrix' | 'simple';\nexport type ObjectStyle = 'form' | 'deepObject';\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n value: string;\n}\n\nexport const separatorArrayExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'form':\n return ',';\n case 'pipeDelimited':\n return '|';\n case 'spaceDelimited':\n return '%20';\n default:\n return ',';\n }\n};\n\nexport const separatorObjectExplode = (style: ObjectSeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n}: SerializeOptions<ArraySeparatorStyle> & {\n value: unknown[];\n}) => {\n if (!explode) {\n const joinedValues = (\n allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n ).join(separatorArrayNoExplode(style));\n switch (style) {\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n case 'simple':\n return joinedValues;\n default:\n return `${name}=${joinedValues}`;\n }\n }\n\n const separator = separatorArrayExplode(style);\n const joinedValues = value\n .map((v) => {\n if (style === 'label' || style === 'simple') {\n return allowReserved ? v : encodeURIComponent(v as string);\n }\n\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v as string,\n });\n })\n .join(separator);\n return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam) => {\n if (value === undefined || value === null) {\n return '';\n }\n\n if (typeof value === 'object') {\n throw new Error(\n 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.',\n );\n }\n\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n valueOnly,\n}: SerializeOptions<ObjectSeparatorStyle> & {\n value: Record<string, unknown> | Date;\n valueOnly?: boolean;\n}) => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n\n if (style !== 'deepObject' && !explode) {\n let values: string[] = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)];\n });\n const joinedValues = values.join(',');\n switch (style) {\n case 'form':\n return `${name}=${joinedValues}`;\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) =>\n serializePrimitiveParam({\n allowReserved,\n name: style === 'deepObject' ? `${name}[${key}]` : key,\n value: v as string,\n }),\n )\n .join(separator);\n return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from './bodySerializer.gen';\nimport {\n type ArraySeparatorStyle,\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from './pathSerializer.gen';\n\nexport interface PathSerializer {\n path: Record<string, unknown>;\n url: string;\n}\n\nexport const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style: ArraySeparatorStyle = 'simple';\n\n if (name.endsWith('*')) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n\n if (name.startsWith('.')) {\n name = name.substring(1);\n style = 'label';\n } else if (name.startsWith(';')) {\n name = name.substring(1);\n style = 'matrix';\n }\n\n const value = path[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n url = url.replace(match, serializeArrayParam({ explode, name, style, value }));\n continue;\n }\n\n if (typeof value === 'object') {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value: value as Record<string, unknown>,\n valueOnly: true,\n }),\n );\n continue;\n }\n\n if (style === 'matrix') {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value: value as string,\n })}`,\n );\n continue;\n }\n\n const replaceValue = encodeURIComponent(\n style === 'label' ? `.${value as string}` : (value as string),\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\n\nexport const getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url,\n}: {\n baseUrl?: string;\n path?: Record<string, unknown>;\n query?: Record<string, unknown>;\n querySerializer: QuerySerializer;\n url: string;\n}) => {\n const pathUrl = _url.startsWith('/') ? _url : `/${_url}`;\n let url = (baseUrl ?? '') + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : '';\n if (search.startsWith('?')) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\n\nexport function getValidRequestBody(options: {\n body?: unknown;\n bodySerializer?: BodySerializer | null;\n serializedBody?: unknown;\n}) {\n const hasBody = options.body !== undefined;\n const isSerializedBody = hasBody && options.bodySerializer;\n\n if (isSerializedBody) {\n if ('serializedBody' in options) {\n const hasSerializedBody =\n options.serializedBody !== undefined && options.serializedBody !== '';\n\n return hasSerializedBody ? options.serializedBody : null;\n }\n\n // not all clients implement a serializedBody property (i.e., client-axios)\n return options.body !== '' ? options.body : null;\n }\n\n // plain/text body\n if (hasBody) {\n return options.body;\n }\n\n // no body was provided\n return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n /**\n * Which part of the request do we use to send the auth?\n *\n * @default 'header'\n */\n in?: 'header' | 'query' | 'cookie';\n /**\n * Header or query parameter name.\n *\n * @default 'Authorization'\n */\n name?: string;\n scheme?: 'basic' | 'bearer';\n type: 'apiKey' | 'http';\n}\n\nexport const getAuthToken = async (\n auth: Auth,\n callback: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken,\n): Promise<string | undefined> => {\n const token = typeof callback === 'function' ? await callback(auth) : callback;\n\n if (!token) {\n return;\n }\n\n if (auth.scheme === 'bearer') {\n return `Bearer ${token}`;\n }\n\n if (auth.scheme === 'basic') {\n return `Basic ${btoa(token)}`;\n }\n\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from '../core/auth.gen';\nimport type { QuerySerializerOptions } from '../core/bodySerializer.gen';\nimport { jsonBodySerializer } from '../core/bodySerializer.gen';\nimport {\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from '../core/pathSerializer.gen';\nimport { getUrl } from '../core/utils.gen';\nimport type { Client, ClientOptions, Config, RequestOptions } from './types.gen';\n\nexport const createQuerySerializer = <T = unknown>({\n parameters = {},\n ...args\n}: QuerySerializerOptions = {}) => {\n const querySerializer = (queryParams: T) => {\n const search: string[] = [];\n if (queryParams && typeof queryParams === 'object') {\n for (const name in queryParams) {\n const value = queryParams[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n const options = parameters[name] || args;\n\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: 'form',\n value,\n ...options.array,\n });\n if (serializedArray) search.push(serializedArray);\n } else if (typeof value === 'object') {\n const serializedObject = serializeObjectParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: 'deepObject',\n value: value as Record<string, unknown>,\n ...options.object,\n });\n if (serializedObject) search.push(serializedObject);\n } else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved: options.allowReserved,\n name,\n value: value as string,\n });\n if (serializedPrimitive) search.push(serializedPrimitive);\n }\n }\n }\n return search.join('&');\n };\n return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (contentType: string | null): Exclude<Config['parseAs'], 'auto'> => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return 'stream';\n }\n\n const cleanContent = contentType.split(';')[0]?.trim();\n\n if (!cleanContent) {\n return;\n }\n\n if (cleanContent.startsWith('application/json') || cleanContent.endsWith('+json')) {\n return 'json';\n }\n\n if (cleanContent === 'multipart/form-data') {\n return 'formData';\n }\n\n if (\n ['application/', 'audio/', 'image/', 'video/'].some((type) => cleanContent.startsWith(type))\n ) {\n return 'blob';\n }\n\n if (cleanContent.startsWith('text/')) {\n return 'text';\n }\n\n return;\n};\n\nconst checkForExistence = (\n options: Pick<RequestOptions, 'auth' | 'query'> & {\n headers: Headers;\n },\n name?: string,\n): boolean => {\n if (!name) {\n return false;\n }\n if (\n options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get('Cookie')?.includes(`${name}=`)\n ) {\n return true;\n }\n return false;\n};\n\nexport async function setAuthParams(\n options: Pick<RequestOptions, 'auth' | 'query' | 'security'> & {\n headers: Headers;\n },\n): Promise<void> {\n for (const auth of options.security ?? []) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n\n const token = await getAuthToken(auth, options.auth);\n\n if (!token) {\n continue;\n }\n\n const name = auth.name ?? 'Authorization';\n\n switch (auth.in) {\n case 'query':\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case 'cookie':\n options.headers.append('Cookie', `${name}=${token}`);\n break;\n case 'header':\n default:\n options.headers.set(name, token);\n break;\n }\n }\n}\n\nexport const buildUrl: Client['buildUrl'] = (options) =>\n getUrl({\n baseUrl: options.baseUrl as string,\n path: options.path,\n query: options.query,\n querySerializer:\n typeof options.querySerializer === 'function'\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith('/')) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\n\nexport const mergeHeaders = (\n ...headers: Array<Required<Config>['headers'] | undefined>\n): Headers => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n\n const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header);\n\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v as string);\n }\n } else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e., their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(\n key,\n typeof value === 'object' ? JSON.stringify(value) : (value as string),\n );\n }\n }\n }\n return mergedHeaders;\n};\n\ntype ErrInterceptor<Err, Res, Req, Options> = (\n error: Err,\n /** response may be undefined due to a network error where no response object is produced */\n response: Res | undefined,\n /** request may be undefined, because error may be from building the request object itself */\n request: Req | undefined,\n options: Options,\n) => Err | Promise<Err>;\n\ntype ReqInterceptor<Req, Options> = (request: Req, options: Options) => Req | Promise<Req>;\n\ntype ResInterceptor<Res, Req, Options> = (\n response: Res,\n request: Req,\n options: Options,\n) => Res | Promise<Res>;\n\nclass Interceptors<Interceptor> {\n fns: Array<Interceptor | null> = [];\n\n clear(): void {\n this.fns = [];\n }\n\n eject(id: number | Interceptor): void {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n\n exists(id: number | Interceptor): boolean {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n\n getInterceptorIndex(id: number | Interceptor): number {\n if (typeof id === 'number') {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n\n update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n\n use(fn: Interceptor): number {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\n\nexport interface Middleware<Req, Res, Err, Options> {\n error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;\n request: Interceptors<ReqInterceptor<Req, Options>>;\n response: Interceptors<ResInterceptor<Res, Req, Options>>;\n}\n\nexport const createInterceptors = <Req, Res, Err, Options>(): Middleware<\n Req,\n Res,\n Err,\n Options\n> => ({\n error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(),\n request: new Interceptors<ReqInterceptor<Req, Options>>(),\n response: new Interceptors<ResInterceptor<Res, Req, Options>>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: 'form',\n },\n object: {\n explode: true,\n style: 'deepObject',\n },\n});\n\nconst defaultHeaders = {\n 'Content-Type': 'application/json',\n};\n\nexport const createConfig = <T extends ClientOptions = ClientOptions>(\n override: Config<Omit<ClientOptions, keyof T> & T> = {},\n): Config<Omit<ClientOptions, keyof T> & T> => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: 'auto',\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from '../core/serverSentEvents.gen';\nimport type { HttpMethod } from '../core/types.gen';\nimport { getValidRequestBody } from '../core/utils.gen';\nimport type { Client, Config, RequestOptions, ResolvedRequestOptions } from './types.gen';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils.gen';\n\ntype ReqInit = Omit<RequestInit, 'body' | 'headers'> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<Request, Response, unknown, ResolvedRequestOptions>();\n\n const beforeRequest = async <\n TData = unknown,\n TResponseStyle extends 'data' | 'fields' = 'fields',\n ThrowOnError extends boolean = boolean,\n Url extends string = string,\n >(\n options: RequestOptions<TData, TResponseStyle, ThrowOnError, Url>,\n ) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined as string | undefined,\n };\n\n if (opts.security) {\n await setAuthParams(opts);\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body) as string | undefined;\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n\n const resolvedOpts = opts as typeof opts &\n ResolvedRequestOptions<TResponseStyle, ThrowOnError, Url>;\n const url = buildUrl(resolvedOpts);\n\n return { opts: resolvedOpts, url };\n };\n\n const request: Client['request'] = async (options) => {\n const throwOnError = options.throwOnError ?? _config.throwOnError;\n const responseStyle = options.responseStyle ?? _config.responseStyle;\n\n let request: Request | undefined;\n let response: Response | undefined;\n\n try {\n const { opts, url } = await beforeRequest(options);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n body: getValidRequestBody(opts),\n };\n\n request = new Request(url, requestInit);\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n\n response = await _fetch(request);\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n if (response.status === 204 || response.headers.get('Content-Length') === '0') {\n let emptyData: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'json': {\n // Some servers return 200 with no Content-Length and empty body.\n // response.json() would throw; read as text and parse if non-empty.\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n throw jsonError ?? textError;\n } catch (error) {\n let finalError = error;\n\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = await fn(finalError, response, request, options as ResolvedRequestOptions);\n }\n }\n\n finalError = finalError || {};\n\n if (throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n request,\n response,\n };\n }\n };\n\n const makeMethodFn = (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn = (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n serializedBody: getValidRequestBody(opts) as BodyInit | null | undefined,\n url,\n });\n };\n\n const _buildUrl: Client['buildUrl'] = (options) => buildUrl({ ..._config, ...options });\n\n return {\n buildUrl: _buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n } as Client;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { type ClientOptions, type Config, createClient, createConfig } from './client';\nimport type { ClientOptions as ClientOptions2 } from './types.gen';\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;\n\nexport const client = createClient(createConfig<ClientOptions2>({ baseUrl: 'https://api.savanto.ai' }));\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Client, Options as Options2, TDataShape } from './client';\nimport { client } from './client.gen';\nimport type { AdminClaimTenantData, AdminClaimTenantErrors, AdminClaimTenantResponses, AdminDeleteTenantData, AdminDeleteTenantErrors, AdminDeleteTenantResponses, AdminFindByEmailData, AdminFindByEmailErrors, AdminFindByEmailResponses, AdminFindByOwnerData, AdminFindByOwnerErrors, AdminFindByOwnerResponses, AdminGetTenantData, AdminGetTenantErrors, AdminGetTenantResponses, AdminGetUsageData, AdminGetUsageErrors, AdminGetUsageResponses, AdminReactivateTenantData, AdminReactivateTenantErrors, AdminReactivateTenantResponses, AdminResetCrawlsData, AdminResetCrawlsErrors, AdminResetCrawlsResponses, AdminUpdateOwnerEmailData, AdminUpdateOwnerEmailErrors, AdminUpdateOwnerEmailResponses, AdminUpdateSubscriptionData, AdminUpdateSubscriptionErrors, AdminUpdateSubscriptionResponses, AdminUpdateTierData, AdminUpdateTierErrors, AdminUpdateTierResponses, AdminUpdateUsageData, AdminUpdateUsageErrors, AdminUpdateUsageResponses, BulkDeletePostsData, BulkDeletePostsErrors, BulkDeletePostsResponses, BulkDeleteProductsData, BulkDeleteProductsErrors, BulkDeleteProductsResponses, BulkDeletePromptsData, BulkDeletePromptsErrors, BulkDeletePromptsResponses, BulkDeleteTaxonomiesData, BulkDeleteTaxonomiesErrors, BulkDeleteTaxonomiesResponses, BulkDeleteThreadsData, BulkDeleteThreadsErrors, BulkDeleteThreadsResponses, BulkUpdateWebhookStatusData, BulkUpdateWebhookStatusErrors, BulkUpdateWebhookStatusResponses, BulkUpsertPostsData, BulkUpsertPostsErrors, BulkUpsertPostsResponses, BulkUpsertProductsData, BulkUpsertProductsErrors, BulkUpsertProductsResponses, BulkUpsertPromptsData, BulkUpsertPromptsErrors, BulkUpsertPromptsResponses, BulkUpsertTaxonomiesData, BulkUpsertTaxonomiesErrors, BulkUpsertTaxonomiesResponses, CancelCrawlData, CancelCrawlErrors, CancelCrawlResponses, ChatData, ChatErrors, ChatResponses, ClearDomainErrorsData, ClearDomainErrorsErrors, ClearDomainErrorsResponses, CommitSearchData, CommitSearchErrors, CommitSearchResponses, ComplianceCustomerDataRequestData, ComplianceCustomerDataRequestErrors, ComplianceCustomerDataRequestResponses, ComplianceCustomerRedactData, ComplianceCustomerRedactErrors, ComplianceCustomerRedactResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponses, CreateTenantWorkspaceData, CreateTenantWorkspaceErrors, CreateTenantWorkspaceResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookResponses, DeleteCredentialsData, DeleteCredentialsErrors, DeleteCredentialsResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponses, DeleteFeedbackData, DeleteFeedbackErrors, DeleteFeedbackResponses, DeleteLiveAgentScheduleData, DeleteLiveAgentScheduleErrors, DeleteLiveAgentScheduleResponses, DeleteMcpConfigData, DeleteMcpConfigErrors, DeleteMcpConfigResponses, DeletePostData, DeletePostErrors, DeletePostResponses, DeletePostsByQueryData, DeletePostsByQueryErrors, DeletePostsByQueryResponses, DeleteProductData, DeleteProductErrors, DeleteProductResponses, DeleteProductsByQueryData, DeleteProductsByQueryErrors, DeleteProductsByQueryResponses, DeletePromptData, DeletePromptErrors, DeletePromptResponses, DeleteTaxonomiesByQueryData, DeleteTaxonomiesByQueryErrors, DeleteTaxonomiesByQueryResponses, DeleteTaxonomyData, DeleteTaxonomyErrors, DeleteTaxonomyResponses, DeleteTenantData, DeleteTenantErrors, DeleteTenantResponses, DeleteThreadData, DeleteThreadErrors, DeleteThreadResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponses, DeleteWorkspaceData, DeleteWorkspaceErrors, DeleteWorkspaceResponses, DeprovisionData, DeprovisionErrors, DeprovisionResponses, DiscoverToolsData, DiscoverToolsErrors, DiscoverToolsResponses, EndHandoffData, EndHandoffErrors, EndHandoffResponses, EnrollCrawlNotificationData, EnrollCrawlNotificationErrors, EnrollCrawlNotificationResponses, ExportThreadsData, ExportThreadsErrors, ExportThreadsResponses, GenerateDomainConfigData, GenerateDomainConfigErrors, GenerateDomainConfigResponses, GetAnalyticsFeedbackData, GetAnalyticsFeedbackErrors, GetAnalyticsFeedbackResponses, GetChatAnalyticsData, GetChatAnalyticsErrors, GetChatAnalyticsResponses, GetChatWidgetConfigData, GetChatWidgetConfigErrors, GetChatWidgetConfigResponses, GetCrawlConfigData, GetCrawlConfigErrors, GetCrawlConfigResponses, GetCrawlHistoryData, GetCrawlHistoryErrors, GetCrawlHistoryResponses, GetCrawlStatusData, GetCrawlStatusErrors, GetCrawlStatusResponses, GetCredentialStatusData, GetCredentialStatusErrors, GetCredentialStatusResponses, GetDomainErrorsData, GetDomainErrorsErrors, GetDomainErrorsResponses, GetDomainErrorSummaryData, GetDomainErrorSummaryErrors, GetDomainErrorSummaryResponses, GetDomainTemplatesData, GetDomainTemplatesErrors, GetDomainTemplatesResponses, GetFeedbackAnalyticsData, GetFeedbackAnalyticsErrors, GetFeedbackAnalyticsResponses, GetKnowledgeData, GetKnowledgeErrors, GetKnowledgeResponses, GetLiveAgentScheduleData, GetLiveAgentScheduleErrors, GetLiveAgentScheduleResponses, GetLiveAgentStatusData, GetLiveAgentStatusErrors, GetLiveAgentStatusResponses, GetMcpConfigData, GetMcpConfigErrors, GetMcpConfigResponses, GetPostData, GetPostErrors, GetPostResponses, GetProductData, GetProductErrors, GetProductRecommendationsData, GetProductRecommendationsErrors, GetProductRecommendationsResponses, GetProductResponses, GetPromptData, GetPromptErrors, GetPromptResponses, GetSearchAnalyticsData, GetSearchAnalyticsErrors, GetSearchAnalyticsResponses, GetSearchWidgetConfigData, GetSearchWidgetConfigErrors, GetSearchWidgetConfigResponses, GetTaxonomyData, GetTaxonomyErrors, GetTaxonomyResponses, GetTenantStatusData, GetTenantStatusErrors, GetTenantStatusResponses, GetTenantUsageData, GetTenantUsageErrors, GetTenantUsageHistoryData, GetTenantUsageHistoryErrors, GetTenantUsageHistoryResponses, GetTenantUsageResponses, GetTenantWhoamiData, GetTenantWhoamiErrors, GetTenantWhoamiResponses, GetThreadAnalyticsData, GetThreadAnalyticsErrors, GetThreadAnalyticsResponses, GetThreadData, GetThreadErrors, GetThreadFeedbackData, GetThreadFeedbackErrors, GetThreadFeedbackResponses, GetThreadMessagesData, GetThreadMessagesErrors, GetThreadMessagesResponses, GetThreadResponses, GetUploadUrlData, GetUploadUrlErrors, GetUploadUrlResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponses, GetWebhookStatsData, GetWebhookStatsErrors, GetWebhookStatsResponses, GetWorkspaceDetailsData, GetWorkspaceDetailsErrors, GetWorkspaceDetailsResponses, GetWorkspaceSettingsData, GetWorkspaceSettingsErrors, GetWorkspaceSettingsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysResponses, ListCustomDomainsData, ListCustomDomainsErrors, ListCustomDomainsResponses, ListFeedbackData, ListFeedbackErrors, ListFeedbackResponses, ListPostIdsData, ListPostIdsErrors, ListPostIdsResponses, ListProductIdsData, ListProductIdsErrors, ListProductIdsResponses, ListProductsData, ListProductsErrors, ListProductsResponses, ListPromptsData, ListPromptsErrors, ListPromptsResponses, ListSlackChannelsData, ListSlackChannelsErrors, ListSlackChannelsResponses, ListTaxonomiesData, ListTaxonomiesErrors, ListTaxonomiesResponses, ListTaxonomyIdsData, ListTaxonomyIdsErrors, ListTaxonomyIdsResponses, ListTenantWorkspacesData, ListTenantWorkspacesErrors, ListTenantWorkspacesResponses, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponses, PatchPostData, PatchPostErrors, PatchPostResponses, PatchProductData, PatchProductErrors, PatchProductResponses, ProvisionShopifyData, ProvisionShopifyErrors, ProvisionShopifyResponses, RevokeApiKeyData, RevokeApiKeyErrors, RevokeApiKeyResponses, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponses, ScrapePageData, ScrapePageErrors, ScrapePageResponses, ScrapeSinglePageData, ScrapeSinglePageErrors, ScrapeSinglePageResponses, SearchKnowledgeData, SearchKnowledgeErrors, SearchKnowledgeResponses, SearchPostsData, SearchPostsErrors, SearchPostsResponses, SearchProductsData, SearchProductsErrors, SearchProductsResponses, SearchPromptsData, SearchPromptsErrors, SearchPromptsResponses, SearchSearchesData, SearchSearchesErrors, SearchSearchesResponses, SearchThreadsData, SearchThreadsErrors, SearchThreadsResponses, StartCrawlData, StartCrawlErrors, StartCrawlResponses, StoreCredentialsData, StoreCredentialsErrors, StoreCredentialsResponses, SubmitFeedbackData, SubmitFeedbackErrors, SubmitFeedbackResponses, TestDomainConnectionData, TestDomainConnectionErrors, TestDomainConnectionResponses, TestWebhookData, TestWebhookErrors, TestWebhookResponses, UpdateChatWidgetConfigData, UpdateChatWidgetConfigErrors, UpdateChatWidgetConfigResponses, UpdateCrawlConfigData, UpdateCrawlConfigErrors, UpdateCrawlConfigResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainResponses, UpdateLiveAgentScheduleData, UpdateLiveAgentScheduleErrors, UpdateLiveAgentScheduleResponses, UpdateMcpConfigData, UpdateMcpConfigErrors, UpdateMcpConfigResponses, UpdateSearchWidgetConfigData, UpdateSearchWidgetConfigErrors, UpdateSearchWidgetConfigResponses, UpdateTenantFeaturesData, UpdateTenantFeaturesErrors, UpdateTenantFeaturesResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookResponses, UpdateWorkspaceData, UpdateWorkspaceErrors, UpdateWorkspaceResponses, UpdateWorkspaceSettingsData, UpdateWorkspaceSettingsErrors, UpdateWorkspaceSettingsResponses, UpsertPostData, UpsertPostErrors, UpsertPostResponses, UpsertProductData, UpsertProductErrors, UpsertProductResponses, UpsertPromptData, UpsertPromptErrors, UpsertPromptResponses, UpsertTaxonomyData, UpsertTaxonomyErrors, UpsertTaxonomyResponses, ValidateCustomDomainData, ValidateCustomDomainErrors, ValidateCustomDomainResponses } from './types.gen';\n\nexport type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown> = Options2<TData, ThrowOnError, TResponse> & {\n /**\n * You can provide a client instance returned by `createClient()` instead of\n * individual options. This might be also useful if you want to implement a\n * custom client.\n */\n client?: Client;\n /**\n * You can pass arbitrary values through the `meta` object. This can be\n * used to access values that aren't defined as part of the SDK function.\n */\n meta?: Record<string, unknown>;\n};\n\n/**\n * Send a chat message\n *\n * Send a visitor message through the full multi-agent pipeline: triage classifies intent, query agents retrieve grounded context from the product / post indexes (plus any custom domain agents), and response agents synthesise a grounded answer with product cards or cited content. The response is streamed as NDJSON when `stream: true` (each line is one of `{ type: \"token\", ... }`, `{ type: \"product\", ... }`, `{ type: \"done\" }`), or returned as a single JSON object when `stream: false`. Pass `threadId` to continue a conversation (memories and prior turns are loaded); omit it for a fresh one. Respects the workspace's active persona / system-prompt configuration.\n */\nexport const chat = <ThrowOnError extends boolean = false>(options?: Options<ChatData, ThrowOnError>) => (options?.client ?? client).post<ChatResponses, ChatErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/chat',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Start a website crawl\n *\n * Enqueue a crawl of the given root URL for the workspace in `X-Workspace-ID`. The crawler discovers pages via sitemap + link graph, classifies each page (product, product listing, or general content), and indexes products into `savanto-products` and content into `savanto-posts`. This call is asynchronous and returns immediately with a `crawlId`; poll `GET /crawl/{crawlId}/status` to track progress or subscribe to the email notification endpoint to be pinged when it completes. Starting a new crawl while one is already running for the same workspace will be rejected with 409 — cancel the running one first.\n */\nexport const startCrawl = <ThrowOnError extends boolean = false>(options?: Options<StartCrawlData, ThrowOnError>) => (options?.client ?? client).post<StartCrawlResponses, StartCrawlErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Scrape a single page\n *\n * Scrape and index a single page via the crawl queue.\n */\nexport const scrapeSinglePage = <ThrowOnError extends boolean = false>(options?: Options<ScrapeSinglePageData, ThrowOnError>) => (options?.client ?? client).post<ScrapeSinglePageResponses, ScrapeSinglePageErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/scrape',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get crawl configuration\n *\n * Return the persisted crawl configuration for the workspace (strategy, schedule, include / exclude URL patterns, max-pages budget, user-agent override). Use before a crawl to verify the active rules, or before an `update_crawl_config` call to preserve fields you are not changing.\n */\nexport const getCrawlConfig = <ThrowOnError extends boolean = false>(options?: Options<GetCrawlConfigData, ThrowOnError>) => (options?.client ?? client).get<GetCrawlConfigResponses, GetCrawlConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/config',\n ...options\n});\n\n/**\n * Update crawl configuration\n *\n * Replace the crawl configuration for the workspace. Common fields: `strategy` (`full` reindexes everything, `smart` skips pages whose content hash matches the previous crawl), `schedule` (cron-like), `includePatterns` / `excludePatterns` (glob URL filters), `maxPages` (safety cap). Omitted fields are set to their defaults — if you only want to tweak one setting, `GET /crawl/config` first and merge. Changes take effect on the next crawl run.\n */\nexport const updateCrawlConfig = <ThrowOnError extends boolean = false>(options?: Options<UpdateCrawlConfigData, ThrowOnError>) => (options?.client ?? client).put<UpdateCrawlConfigResponses, UpdateCrawlConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/config',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get crawl history\n *\n * Return a list of recent crawls for the tenant (or the workspace when `X-Workspace-ID` is set), newest first. Each entry has its final status (`completed`, `failed`, `cancelled`), page counts, duration, and any error summary — useful for diagnosing why a site's content is stale.\n */\nexport const getCrawlHistory = <ThrowOnError extends boolean = false>(options?: Options<GetCrawlHistoryData, ThrowOnError>) => (options?.client ?? client).get<GetCrawlHistoryResponses, GetCrawlHistoryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/history',\n ...options\n});\n\n/**\n * Get crawl status\n *\n * Return live status for a specific crawl id: `status` (`running`, `completed`, `failed`, `cancelled`), pages discovered / indexed / skipped / failed, elapsed time, and the current URL being processed. Poll every 3–10 seconds while `running`; stop polling once status is terminal. Returns 404 if the crawl id does not belong to the caller's tenant.\n */\nexport const getCrawlStatus = <ThrowOnError extends boolean = false>(options: Options<GetCrawlStatusData, ThrowOnError>) => (options.client ?? client).get<GetCrawlStatusResponses, GetCrawlStatusErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/{id}/status',\n ...options\n});\n\n/**\n * Cancel a running crawl\n *\n * Cancel a crawl that is currently in progress.\n */\nexport const cancelCrawl = <ThrowOnError extends boolean = false>(options: Options<CancelCrawlData, ThrowOnError>) => (options.client ?? client).post<CancelCrawlResponses, CancelCrawlErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/{id}/cancel',\n ...options\n});\n\n/**\n * Enroll for a crawl-complete email\n *\n * Requests an email notification when this crawl reaches a terminal state (completed or failed). Intended for the dashboard \"continue onboarding, email me when done\" CTA. Rejects crawls that have already finished. **Admin-only endpoint.** The `email` in the body is treated as opaque and persisted verbatim; the cloud API does NOT authenticate ownership of that address. Callers holding the admin bearer are trusted to have derived the recipient from an authoritative source (e.g. the signed-in user session on the Next.js proxy). Do NOT expose this route via license-key / public scopes.\n */\nexport const enrollCrawlNotification = <ThrowOnError extends boolean = false>(options: Options<EnrollCrawlNotificationData, ThrowOnError>) => (options.client ?? client).post<EnrollCrawlNotificationResponses, EnrollCrawlNotificationErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/crawl/{id}/notifications',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Scrape or delete a single page\n *\n * Scrape a URL and index it into the knowledge base, or delete a previously scraped page.\n */\nexport const scrapePage = <ThrowOnError extends boolean = false>(options?: Options<ScrapePageData, ThrowOnError>) => (options?.client ?? client).post<ScrapePageResponses, ScrapePageErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/scrape',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List products\n *\n * List products with optional filters. Supports pagination, category/tag/status filters, and metadata queries.\n */\nexport const listProducts = <ThrowOnError extends boolean = false>(options?: Options<ListProductsData, ThrowOnError>) => (options?.client ?? client).get<ListProductsResponses, ListProductsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products',\n ...options\n});\n\n/**\n * Upsert a product\n *\n * Create a new product or update the existing one whose `externalId` matches the body. Embeddings for the product's searchable text are generated and persisted as part of the call, so the product becomes searchable immediately after a successful response. Required fields: `externalId`, `name`. Optional: `description`, `price` (in cents), `priceMin` / `priceMax`, `stockStatus` (`in_stock` | `out_of_stock` | `limited`), `images` (array of URLs), `brand`, `category`, `attributes` (key/value). Workspaces with native Shopify / WooCommerce sync should normally rely on the plugin rather than calling this endpoint directly. Idempotent on `externalId`.\n */\nexport const upsertProduct = <ThrowOnError extends boolean = false>(options?: Options<UpsertProductData, ThrowOnError>) => (options?.client ?? client).post<UpsertProductResponses, UpsertProductErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk delete products\n *\n * Delete multiple products by their external IDs.\n */\nexport const bulkDeleteProducts = <ThrowOnError extends boolean = false>(options?: Options<BulkDeleteProductsData, ThrowOnError>) => (options?.client ?? client).delete<BulkDeleteProductsResponses, BulkDeleteProductsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk upsert products\n *\n * Create or update up to 100 products in a single request.\n */\nexport const bulkUpsertProducts = <ThrowOnError extends boolean = false>(options?: Options<BulkUpsertProductsData, ThrowOnError>) => (options?.client ?? client).post<BulkUpsertProductsResponses, BulkUpsertProductsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Search products\n *\n * Hybrid (BM25 + k-NN vector) search across the workspace's product catalog. Pass a natural-language `query` — the backend expands and filters it with an agent when that improves recall. Optional `filters` support `priceMin` / `priceMax`, `stockStatus`, `brand`, `category`, and arbitrary `attributes` equality. Optional `facets` returns aggregate counts for the requested fields. Use for \"find X\" style requests; use the chat endpoint instead if you want a conversational answer that cites the products.\n */\nexport const searchProducts = <ThrowOnError extends boolean = false>(options?: Options<SearchProductsData, ThrowOnError>) => (options?.client ?? client).post<SearchProductsResponses, SearchProductsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete products by query\n *\n * Delete all products matching the given filter criteria.\n */\nexport const deleteProductsByQuery = <ThrowOnError extends boolean = false>(options?: Options<DeleteProductsByQueryData, ThrowOnError>) => (options?.client ?? client).post<DeleteProductsByQueryResponses, DeleteProductsByQueryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/delete-by-query',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List product IDs\n *\n * Retrieve external IDs of indexed products with optional filters. Supports large offsets for sync.\n */\nexport const listProductIds = <ThrowOnError extends boolean = false>(options?: Options<ListProductIdsData, ThrowOnError>) => (options?.client ?? client).get<ListProductIdsResponses, ListProductIdsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/ids',\n ...options\n});\n\n/**\n * Delete a product\n *\n * Delete a single product by external ID.\n */\nexport const deleteProduct = <ThrowOnError extends boolean = false>(options: Options<DeleteProductData, ThrowOnError>) => (options.client ?? client).delete<DeleteProductResponses, DeleteProductErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/{id}',\n ...options\n});\n\n/**\n * Get a product\n *\n * Retrieve a single product by external ID.\n */\nexport const getProduct = <ThrowOnError extends boolean = false>(options: Options<GetProductData, ThrowOnError>) => (options.client ?? client).get<GetProductResponses, GetProductErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/{id}',\n ...options\n});\n\n/**\n * Patch a product\n *\n * Partially update a product (e.g. change indexStatus).\n */\nexport const patchProduct = <ThrowOnError extends boolean = false>(options: Options<PatchProductData, ThrowOnError>) => (options.client ?? client).patch<PatchProductResponses, PatchProductErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/products/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Upsert a post\n *\n * Create a new post / knowledge article or update the existing one whose `externalId` matches the body. Embeddings are generated synchronously so the post is immediately retrievable by chat and search. Required: `externalId`, `title`, `content` (markdown or plain text). Optional: `author`, `publishedAt` (ISO 8601), `url`, `tags`, `category`. Use this for help-center articles, FAQ entries, or arbitrary brand content that should be answerable via chat. For bulk backfills prefer `POST /posts/bulk`. Idempotent on `externalId`.\n */\nexport const upsertPost = <ThrowOnError extends boolean = false>(options?: Options<UpsertPostData, ThrowOnError>) => (options?.client ?? client).post<UpsertPostResponses, UpsertPostErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk delete posts\n *\n * Delete multiple posts by their external IDs.\n */\nexport const bulkDeletePosts = <ThrowOnError extends boolean = false>(options?: Options<BulkDeletePostsData, ThrowOnError>) => (options?.client ?? client).delete<BulkDeletePostsResponses, BulkDeletePostsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk upsert posts\n *\n * Create or update up to 100 posts in a single request.\n */\nexport const bulkUpsertPosts = <ThrowOnError extends boolean = false>(options?: Options<BulkUpsertPostsData, ThrowOnError>) => (options?.client ?? client).post<BulkUpsertPostsResponses, BulkUpsertPostsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Search posts\n *\n * Hybrid semantic + lexical search across the workspace's indexed posts / knowledge articles. Pass a natural-language `query`; the response returns the top-matching posts with excerpts, scores, and URLs. Use when you need raw passages to feed another agent; use the chat endpoint when you want a cited, synthesised answer rather than a list of hits.\n */\nexport const searchPosts = <ThrowOnError extends boolean = false>(options?: Options<SearchPostsData, ThrowOnError>) => (options?.client ?? client).post<SearchPostsResponses, SearchPostsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete posts by query\n *\n * Delete all posts matching the given filter criteria.\n */\nexport const deletePostsByQuery = <ThrowOnError extends boolean = false>(options?: Options<DeletePostsByQueryData, ThrowOnError>) => (options?.client ?? client).post<DeletePostsByQueryResponses, DeletePostsByQueryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/delete-by-query',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List post IDs\n *\n * Retrieve external IDs of indexed posts with optional filters. Supports large offsets for sync.\n */\nexport const listPostIds = <ThrowOnError extends boolean = false>(options?: Options<ListPostIdsData, ThrowOnError>) => (options?.client ?? client).get<ListPostIdsResponses, ListPostIdsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/ids',\n ...options\n});\n\n/**\n * Delete a post\n *\n * Delete a single post by external ID.\n */\nexport const deletePost = <ThrowOnError extends boolean = false>(options: Options<DeletePostData, ThrowOnError>) => (options.client ?? client).delete<DeletePostResponses, DeletePostErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/{id}',\n ...options\n});\n\n/**\n * Get a post\n *\n * Retrieve a single post by external ID.\n */\nexport const getPost = <ThrowOnError extends boolean = false>(options: Options<GetPostData, ThrowOnError>) => (options.client ?? client).get<GetPostResponses, GetPostErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/{id}',\n ...options\n});\n\n/**\n * Patch a post\n *\n * Partially update a post (e.g. change indexStatus).\n */\nexport const patchPost = <ThrowOnError extends boolean = false>(options: Options<PatchPostData, ThrowOnError>) => (options.client ?? client).patch<PatchPostResponses, PatchPostErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/posts/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Search threads\n *\n * Search and filter conversation threads with pagination, date ranges, and sorting.\n */\nexport const searchThreads = <ThrowOnError extends boolean = false>(options?: Options<SearchThreadsData, ThrowOnError>) => (options?.client ?? client).post<SearchThreadsResponses, SearchThreadsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Export threads\n *\n * Export conversation threads in JSON or CSV format with optional date and user filtering.\n */\nexport const exportThreads = <ThrowOnError extends boolean = false>(options?: Options<ExportThreadsData, ThrowOnError>) => (options?.client ?? client).post<ExportThreadsResponses, ExportThreadsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/export',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get thread analytics\n *\n * Retrieve aggregate analytics and statistics about conversation threads.\n */\nexport const getThreadAnalytics = <ThrowOnError extends boolean = false>(options?: Options<GetThreadAnalyticsData, ThrowOnError>) => (options?.client ?? client).get<GetThreadAnalyticsResponses, GetThreadAnalyticsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/analytics',\n ...options\n});\n\n/**\n * Get thread messages\n *\n * Retrieve all messages for a specific conversation thread. Requires admin:threads or chat scope.\n */\nexport const getThreadMessages = <ThrowOnError extends boolean = false>(options: Options<GetThreadMessagesData, ThrowOnError>) => (options.client ?? client).get<GetThreadMessagesResponses, GetThreadMessagesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}/messages',\n ...options\n});\n\n/**\n * End live agent handoff\n *\n * End a live agent handoff session for a thread. Requires admin:threads or chat scope.\n */\nexport const endHandoff = <ThrowOnError extends boolean = false>(options: Options<EndHandoffData, ThrowOnError>) => (options.client ?? client).post<EndHandoffResponses, EndHandoffErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}/handoff/end',\n ...options\n});\n\n/**\n * Delete a thread\n *\n * Permanently delete a conversation thread by its ID.\n */\nexport const deleteThread = <ThrowOnError extends boolean = false>(options: Options<DeleteThreadData, ThrowOnError>) => (options.client ?? client).delete<DeleteThreadResponses, DeleteThreadErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}',\n ...options\n});\n\n/**\n * Get thread by ID\n *\n * Retrieve a single conversation thread by its ID, optionally including feedback data.\n */\nexport const getThread = <ThrowOnError extends boolean = false>(options: Options<GetThreadData, ThrowOnError>) => (options.client ?? client).get<GetThreadResponses, GetThreadErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}',\n ...options\n});\n\n/**\n * Bulk delete threads\n *\n * Delete multiple conversation threads by their IDs in a single request.\n */\nexport const bulkDeleteThreads = <ThrowOnError extends boolean = false>(options?: Options<BulkDeleteThreadsData, ThrowOnError>) => (options?.client ?? client).delete<BulkDeleteThreadsResponses, BulkDeleteThreadsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Search feedback\n *\n * Search and filter feedback entries with pagination.\n */\nexport const listFeedback = <ThrowOnError extends boolean = false>(options?: Options<ListFeedbackData, ThrowOnError>) => (options?.client ?? client).get<ListFeedbackResponses, ListFeedbackErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/feedback',\n ...options\n});\n\n/**\n * Submit feedback\n *\n * Submit user feedback for a piece of content or chat message.\n */\nexport const submitFeedback = <ThrowOnError extends boolean = false>(options?: Options<SubmitFeedbackData, ThrowOnError>) => (options?.client ?? client).post<SubmitFeedbackResponses, SubmitFeedbackErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/feedback',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get feedback analytics\n *\n * Retrieve aggregated feedback analytics for a date range.\n */\nexport const getFeedbackAnalytics = <ThrowOnError extends boolean = false>(options?: Options<GetFeedbackAnalyticsData, ThrowOnError>) => (options?.client ?? client).get<GetFeedbackAnalyticsResponses, GetFeedbackAnalyticsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/feedback/analytics',\n ...options\n});\n\n/**\n * Get feedback for a thread\n *\n * Retrieve all feedback entries associated with a specific thread.\n */\nexport const getThreadFeedback = <ThrowOnError extends boolean = false>(options: Options<GetThreadFeedbackData, ThrowOnError>) => (options.client ?? client).get<GetThreadFeedbackResponses, GetThreadFeedbackErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/feedback/thread/{threadId}',\n ...options\n});\n\n/**\n * Delete feedback\n *\n * Delete a feedback entry by ID.\n */\nexport const deleteFeedback = <ThrowOnError extends boolean = false>(options: Options<DeleteFeedbackData, ThrowOnError>) => (options.client ?? client).delete<DeleteFeedbackResponses, DeleteFeedbackErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/feedback/{id}',\n ...options\n});\n\n/**\n * List prompts\n *\n * List prompts with optional pagination and metadata filters.\n */\nexport const listPrompts = <ThrowOnError extends boolean = false>(options?: Options<ListPromptsData, ThrowOnError>) => (options?.client ?? client).get<ListPromptsResponses, ListPromptsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts',\n ...options\n});\n\n/**\n * Upsert a prompt\n *\n * Create or update a prompt by external ID.\n */\nexport const upsertPrompt = <ThrowOnError extends boolean = false>(options?: Options<UpsertPromptData, ThrowOnError>) => (options?.client ?? client).post<UpsertPromptResponses, UpsertPromptErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Search prompts\n *\n * Semantic search across prompts with optional filters.\n */\nexport const searchPrompts = <ThrowOnError extends boolean = false>(options?: Options<SearchPromptsData, ThrowOnError>) => (options?.client ?? client).post<SearchPromptsResponses, SearchPromptsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk delete prompts\n *\n * Delete multiple prompts by their external IDs.\n */\nexport const bulkDeletePrompts = <ThrowOnError extends boolean = false>(options?: Options<BulkDeletePromptsData, ThrowOnError>) => (options?.client ?? client).delete<BulkDeletePromptsResponses, BulkDeletePromptsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk upsert prompts\n *\n * Create or update up to 100 prompts in a single request.\n */\nexport const bulkUpsertPrompts = <ThrowOnError extends boolean = false>(options?: Options<BulkUpsertPromptsData, ThrowOnError>) => (options?.client ?? client).post<BulkUpsertPromptsResponses, BulkUpsertPromptsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete a prompt\n *\n * Delete a single prompt by external ID.\n */\nexport const deletePrompt = <ThrowOnError extends boolean = false>(options: Options<DeletePromptData, ThrowOnError>) => (options.client ?? client).delete<DeletePromptResponses, DeletePromptErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts/{id}',\n ...options\n});\n\n/**\n * Get a prompt\n *\n * Retrieve a single prompt by external ID.\n */\nexport const getPrompt = <ThrowOnError extends boolean = false>(options: Options<GetPromptData, ThrowOnError>) => (options.client ?? client).get<GetPromptResponses, GetPromptErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/prompts/{id}',\n ...options\n});\n\n/**\n * Bulk update webhook status\n *\n * Update the status of multiple webhooks at once.\n */\nexport const bulkUpdateWebhookStatus = <ThrowOnError extends boolean = false>(options?: Options<BulkUpdateWebhookStatusData, ThrowOnError>) => (options?.client ?? client).post<BulkUpdateWebhookStatusResponses, BulkUpdateWebhookStatusErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/bulk-status',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List webhooks\n *\n * List all webhooks with optional filters, pagination, and sorting.\n */\nexport const listWebhooks = <ThrowOnError extends boolean = false>(options?: Options<ListWebhooksData, ThrowOnError>) => (options?.client ?? client).get<ListWebhooksResponses, ListWebhooksErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks',\n ...options\n});\n\n/**\n * Create a webhook\n *\n * Register a new webhook endpoint to receive event notifications.\n */\nexport const createWebhook = <ThrowOnError extends boolean = false>(options?: Options<CreateWebhookData, ThrowOnError>) => (options?.client ?? client).post<CreateWebhookResponses, CreateWebhookErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Test a webhook\n *\n * Send a test event to a webhook endpoint to verify connectivity.\n */\nexport const testWebhook = <ThrowOnError extends boolean = false>(options: Options<TestWebhookData, ThrowOnError>) => (options.client ?? client).post<TestWebhookResponses, TestWebhookErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}/test',\n ...options\n});\n\n/**\n * Get webhook stats\n *\n * Retrieve delivery statistics for a specific webhook.\n */\nexport const getWebhookStats = <ThrowOnError extends boolean = false>(options: Options<GetWebhookStatsData, ThrowOnError>) => (options.client ?? client).get<GetWebhookStatsResponses, GetWebhookStatsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}/stats',\n ...options\n});\n\n/**\n * Delete a webhook\n *\n * Permanently delete a webhook by ID.\n */\nexport const deleteWebhook = <ThrowOnError extends boolean = false>(options: Options<DeleteWebhookData, ThrowOnError>) => (options.client ?? client).delete<DeleteWebhookResponses, DeleteWebhookErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}',\n ...options\n});\n\n/**\n * Get a webhook\n *\n * Retrieve a single webhook by ID. Sensitive fields are redacted.\n */\nexport const getWebhook = <ThrowOnError extends boolean = false>(options: Options<GetWebhookData, ThrowOnError>) => (options.client ?? client).get<GetWebhookResponses, GetWebhookErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}',\n ...options\n});\n\n/**\n * Update a webhook\n *\n * Update an existing webhook configuration.\n */\nexport const updateWebhook = <ThrowOnError extends boolean = false>(options: Options<UpdateWebhookData, ThrowOnError>) => (options.client ?? client).put<UpdateWebhookResponses, UpdateWebhookErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List taxonomy terms\n *\n * List taxonomy terms with optional filters and pagination.\n */\nexport const listTaxonomies = <ThrowOnError extends boolean = false>(options?: Options<ListTaxonomiesData, ThrowOnError>) => (options?.client ?? client).get<ListTaxonomiesResponses, ListTaxonomiesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies',\n ...options\n});\n\n/**\n * Upsert a taxonomy term\n *\n * Create or update a taxonomy term by external ID.\n */\nexport const upsertTaxonomy = <ThrowOnError extends boolean = false>(options?: Options<UpsertTaxonomyData, ThrowOnError>) => (options?.client ?? client).post<UpsertTaxonomyResponses, UpsertTaxonomyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk delete taxonomy terms\n *\n * Delete multiple taxonomy terms by their external IDs.\n */\nexport const bulkDeleteTaxonomies = <ThrowOnError extends boolean = false>(options?: Options<BulkDeleteTaxonomiesData, ThrowOnError>) => (options?.client ?? client).delete<BulkDeleteTaxonomiesResponses, BulkDeleteTaxonomiesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Bulk upsert taxonomy terms\n *\n * Create or update up to 100 taxonomy terms in a single request.\n */\nexport const bulkUpsertTaxonomies = <ThrowOnError extends boolean = false>(options?: Options<BulkUpsertTaxonomiesData, ThrowOnError>) => (options?.client ?? client).post<BulkUpsertTaxonomiesResponses, BulkUpsertTaxonomiesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/bulk',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete taxonomy terms by query\n *\n * Delete all taxonomy terms matching the given filter criteria.\n */\nexport const deleteTaxonomiesByQuery = <ThrowOnError extends boolean = false>(options?: Options<DeleteTaxonomiesByQueryData, ThrowOnError>) => (options?.client ?? client).post<DeleteTaxonomiesByQueryResponses, DeleteTaxonomiesByQueryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/delete-by-query',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List taxonomy term IDs\n *\n * Retrieve external IDs of indexed taxonomy terms with optional filters.\n */\nexport const listTaxonomyIds = <ThrowOnError extends boolean = false>(options?: Options<ListTaxonomyIdsData, ThrowOnError>) => (options?.client ?? client).get<ListTaxonomyIdsResponses, ListTaxonomyIdsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/ids',\n ...options\n});\n\n/**\n * Delete a taxonomy term\n *\n * Delete a single taxonomy term by external ID.\n */\nexport const deleteTaxonomy = <ThrowOnError extends boolean = false>(options: Options<DeleteTaxonomyData, ThrowOnError>) => (options.client ?? client).delete<DeleteTaxonomyResponses, DeleteTaxonomyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/{id}',\n ...options\n});\n\n/**\n * Get a taxonomy term\n *\n * Retrieve a single taxonomy term by external ID.\n */\nexport const getTaxonomy = <ThrowOnError extends boolean = false>(options: Options<GetTaxonomyData, ThrowOnError>) => (options.client ?? client).get<GetTaxonomyResponses, GetTaxonomyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/taxonomies/{id}',\n ...options\n});\n\n/**\n * Get search analytics\n *\n * Retrieve search analytics data including top queries, zero-result queries, and volume over time.\n */\nexport const getSearchAnalytics = <ThrowOnError extends boolean = false>(options?: Options<GetSearchAnalyticsData, ThrowOnError>) => (options?.client ?? client).get<GetSearchAnalyticsResponses, GetSearchAnalyticsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/analytics/search',\n ...options\n});\n\n/**\n * Search through search logs\n *\n * Query and filter recorded search logs with pagination and sorting.\n */\nexport const searchSearches = <ThrowOnError extends boolean = false>(options?: Options<SearchSearchesData, ThrowOnError>) => (options?.client ?? client).post<SearchSearchesResponses, SearchSearchesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/analytics/searches/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Commit a search event\n *\n * Record a search event for analytics tracking. Requires search scope.\n */\nexport const commitSearch = <ThrowOnError extends boolean = false>(options?: Options<CommitSearchData, ThrowOnError>) => (options?.client ?? client).post<CommitSearchResponses, CommitSearchErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/analytics/searches/commit',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get chat analytics\n *\n * Retrieve chat/thread analytics data over a configurable time window.\n */\nexport const getChatAnalytics = <ThrowOnError extends boolean = false>(options?: Options<GetChatAnalyticsData, ThrowOnError>) => (options?.client ?? client).get<GetChatAnalyticsResponses, GetChatAnalyticsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/analytics/chat',\n ...options\n});\n\n/**\n * Get feedback analytics\n *\n * Retrieve feedback analytics data with optional date range filtering.\n */\nexport const getAnalyticsFeedback = <ThrowOnError extends boolean = false>(options?: Options<GetAnalyticsFeedbackData, ThrowOnError>) => (options?.client ?? client).get<GetAnalyticsFeedbackResponses, GetAnalyticsFeedbackErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/analytics/feedback',\n ...options\n});\n\n/**\n * Get product recommendations\n *\n * Retrieve AI-powered product recommendations based on a source product, basket affinity, and optional filters.\n */\nexport const getProductRecommendations = <ThrowOnError extends boolean = false>(options?: Options<GetProductRecommendationsData, ThrowOnError>) => (options?.client ?? client).post<GetProductRecommendationsResponses, GetProductRecommendationsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/recommendations/products',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Self-delete tenant\n */\nexport const deleteTenant = <ThrowOnError extends boolean = false>(options: Options<DeleteTenantData, ThrowOnError>) => (options.client ?? client).delete<DeleteTenantResponses, DeleteTenantErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/{tenantId}',\n ...options\n});\n\n/**\n * Get tenant status\n *\n * Validate API key and retrieve tenant account information including tier, publishable key, and JWT secret.\n */\nexport const getTenantStatus = <ThrowOnError extends boolean = false>(options?: Options<GetTenantStatusData, ThrowOnError>) => (options?.client ?? client).get<GetTenantStatusResponses, GetTenantStatusErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/status',\n ...options\n});\n\n/**\n * Identity probe (tenant, scopes, key type)\n *\n * Return the tenant ID, tier, API key ID, key type, and scope list for the current caller. Designed for agent / MCP bootstrapping so clients can decide which operations are available before issuing them. Does NOT return any secret material.\n */\nexport const getTenantWhoami = <ThrowOnError extends boolean = false>(options?: Options<GetTenantWhoamiData, ThrowOnError>) => (options?.client ?? client).get<GetTenantWhoamiResponses, GetTenantWhoamiErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/whoami',\n ...options\n});\n\n/**\n * Update tenant feature flags\n */\nexport const updateTenantFeatures = <ThrowOnError extends boolean = false>(options?: Options<UpdateTenantFeaturesData, ThrowOnError>) => (options?.client ?? client).patch<UpdateTenantFeaturesResponses, UpdateTenantFeaturesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/features',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get usage summary\n *\n * Return the authenticated tenant's current-period usage against plan limits: chat messages sent, products indexed, posts indexed, crawl pages processed, and the dates of the billing window. Use for quota-aware UX or to warn a user that the next operation would trip an overage.\n */\nexport const getTenantUsage = <ThrowOnError extends boolean = false>(options?: Options<GetTenantUsageData, ThrowOnError>) => (options?.client ?? client).get<GetTenantUsageResponses, GetTenantUsageErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/usage',\n ...options\n});\n\n/**\n * Get daily usage history\n */\nexport const getTenantUsageHistory = <ThrowOnError extends boolean = false>(options?: Options<GetTenantUsageHistoryData, ThrowOnError>) => (options?.client ?? client).get<GetTenantUsageHistoryResponses, GetTenantUsageHistoryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/usage/history',\n ...options\n});\n\n/**\n * List workspaces\n *\n * Return every workspace owned by the authenticated tenant, with each workspace's id, name, platform (wordpress | shopify | custom | none), and domain. Use this before calling any workspace-scoped endpoint (crawl, products, posts, chat) to discover the correct `workspaceId` to pass via the `X-Workspace-ID` header. Always cheap and safe to call repeatedly.\n */\nexport const listTenantWorkspaces = <ThrowOnError extends boolean = false>(options?: Options<ListTenantWorkspacesData, ThrowOnError>) => (options?.client ?? client).get<ListTenantWorkspacesResponses, ListTenantWorkspacesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/workspaces',\n ...options\n});\n\n/**\n * Create a workspace\n *\n * Create a new workspace (a distinct site / storefront) under the authenticated tenant. Returns the workspace id you will pass as `X-Workspace-ID` on every subsequent content, crawl, and chat request. Typical onboarding flow: create → (optionally set platform) → start crawl → ingest products/posts. Creation does NOT enqueue a crawl — call `POST /crawl` separately.\n */\nexport const createTenantWorkspace = <ThrowOnError extends boolean = false>(options?: Options<CreateTenantWorkspaceData, ThrowOnError>) => (options?.client ?? client).post<CreateTenantWorkspaceResponses, CreateTenantWorkspaceErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/workspaces',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete a workspace\n *\n * Permanently delete a workspace and every document indexed under it (products, posts, taxonomies, chat threads, crawl history). This is NOT recoverable — prefer `POST /workspaces` to create a new one rather than delete + recreate for routine cleanup. Returns 404 if the id does not belong to the caller's tenant.\n */\nexport const deleteWorkspace = <ThrowOnError extends boolean = false>(options: Options<DeleteWorkspaceData, ThrowOnError>) => (options.client ?? client).delete<DeleteWorkspaceResponses, DeleteWorkspaceErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/workspaces/{workspaceId}',\n ...options\n});\n\n/**\n * Update a workspace\n *\n * Patch name, platform, or metadata on an existing workspace. Accepts a partial body; omitted fields are left untouched. Changing `platform` from `none` to `wordpress` / `shopify` signals the ingestion pipeline to prefer native sync over crawl-derived content on subsequent operations.\n */\nexport const updateWorkspace = <ThrowOnError extends boolean = false>(options: Options<UpdateWorkspaceData, ThrowOnError>) => (options.client ?? client).put<UpdateWorkspaceResponses, UpdateWorkspaceErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/workspaces/{workspaceId}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get document statistics\n *\n * Retrieve document counts and breakdown by type from the knowledge base.\n */\nexport const getKnowledge = <ThrowOnError extends boolean = false>(options?: Options<GetKnowledgeData, ThrowOnError>) => (options?.client ?? client).get<GetKnowledgeResponses, GetKnowledgeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/knowledge',\n ...options\n});\n\n/**\n * Search knowledge base documents\n */\nexport const searchKnowledge = <ThrowOnError extends boolean = false>(options?: Options<SearchKnowledgeData, ThrowOnError>) => (options?.client ?? client).get<SearchKnowledgeResponses, SearchKnowledgeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/knowledge/search',\n ...options\n});\n\n/**\n * Get presigned upload URL\n */\nexport const getUploadUrl = <ThrowOnError extends boolean = false>(options?: Options<GetUploadUrlData, ThrowOnError>) => (options?.client ?? client).post<GetUploadUrlResponses, GetUploadUrlErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/upload-url',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete MCP configuration\n */\nexport const deleteMcpConfig = <ThrowOnError extends boolean = false>(options?: Options<DeleteMcpConfigData, ThrowOnError>) => (options?.client ?? client).delete<DeleteMcpConfigResponses, DeleteMcpConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/mcp',\n ...options\n});\n\n/**\n * Get MCP configuration\n */\nexport const getMcpConfig = <ThrowOnError extends boolean = false>(options?: Options<GetMcpConfigData, ThrowOnError>) => (options?.client ?? client).get<GetMcpConfigResponses, GetMcpConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/mcp',\n ...options\n});\n\n/**\n * Update MCP configuration\n */\nexport const updateMcpConfig = <ThrowOnError extends boolean = false>(options?: Options<UpdateMcpConfigData, ThrowOnError>) => (options?.client ?? client).put<UpdateMcpConfigResponses, UpdateMcpConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/mcp',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Check live agent credential status\n */\nexport const getCredentialStatus = <ThrowOnError extends boolean = false>(options?: Options<GetCredentialStatusData, ThrowOnError>) => (options?.client ?? client).get<GetCredentialStatusResponses, GetCredentialStatusErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/credentials/status',\n ...options\n});\n\n/**\n * Delete live agent credentials\n */\nexport const deleteCredentials = <ThrowOnError extends boolean = false>(options?: Options<DeleteCredentialsData, ThrowOnError>) => (options?.client ?? client).delete<DeleteCredentialsResponses, DeleteCredentialsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/credentials',\n ...options\n});\n\n/**\n * Store live agent credentials\n */\nexport const storeCredentials = <ThrowOnError extends boolean = false>(options?: Options<StoreCredentialsData, ThrowOnError>) => (options?.client ?? client).post<StoreCredentialsResponses, StoreCredentialsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/credentials',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete live agent schedule\n */\nexport const deleteLiveAgentSchedule = <ThrowOnError extends boolean = false>(options?: Options<DeleteLiveAgentScheduleData, ThrowOnError>) => (options?.client ?? client).delete<DeleteLiveAgentScheduleResponses, DeleteLiveAgentScheduleErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/schedule',\n ...options\n});\n\n/**\n * Get live agent schedule\n */\nexport const getLiveAgentSchedule = <ThrowOnError extends boolean = false>(options?: Options<GetLiveAgentScheduleData, ThrowOnError>) => (options?.client ?? client).get<GetLiveAgentScheduleResponses, GetLiveAgentScheduleErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/schedule',\n ...options\n});\n\n/**\n * Update live agent schedule\n */\nexport const updateLiveAgentSchedule = <ThrowOnError extends boolean = false>(options?: Options<UpdateLiveAgentScheduleData, ThrowOnError>) => (options?.client ?? client).put<UpdateLiveAgentScheduleResponses, UpdateLiveAgentScheduleErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenant/live-agent/schedule',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get workspace settings\n *\n * Retrieve settings for a workspace including live agent configuration and special instructions.\n */\nexport const getWorkspaceSettings = <ThrowOnError extends boolean = false>(options: Options<GetWorkspaceSettingsData, ThrowOnError>) => (options.client ?? client).get<GetWorkspaceSettingsResponses, GetWorkspaceSettingsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/settings',\n ...options\n});\n\n/**\n * Update workspace settings\n *\n * Update workspace settings such as live agent configuration, description, and special instructions.\n */\nexport const updateWorkspaceSettings = <ThrowOnError extends boolean = false>(options: Options<UpdateWorkspaceSettingsData, ThrowOnError>) => (options.client ?? client).patch<UpdateWorkspaceSettingsResponses, UpdateWorkspaceSettingsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/settings',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get live agent connection status\n */\nexport const getLiveAgentStatus = <ThrowOnError extends boolean = false>(options: Options<GetLiveAgentStatusData, ThrowOnError>) => (options.client ?? client).get<GetLiveAgentStatusResponses, GetLiveAgentStatusErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/live-agent/status',\n ...options\n});\n\n/**\n * List Slack channels for live agent\n */\nexport const listSlackChannels = <ThrowOnError extends boolean = false>(options: Options<ListSlackChannelsData, ThrowOnError>) => (options.client ?? client).get<ListSlackChannelsResponses, ListSlackChannelsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/live-agent/slack/channels',\n ...options\n});\n\n/**\n * Get chat widget configuration\n */\nexport const getChatWidgetConfig = <ThrowOnError extends boolean = false>(options: Options<GetChatWidgetConfigData, ThrowOnError>) => (options.client ?? client).get<GetChatWidgetConfigResponses, GetChatWidgetConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/chat',\n ...options\n});\n\n/**\n * Update chat widget configuration\n */\nexport const updateChatWidgetConfig = <ThrowOnError extends boolean = false>(options: Options<UpdateChatWidgetConfigData, ThrowOnError>) => (options.client ?? client).post<UpdateChatWidgetConfigResponses, UpdateChatWidgetConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/chat',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get search widget configuration\n */\nexport const getSearchWidgetConfig = <ThrowOnError extends boolean = false>(options: Options<GetSearchWidgetConfigData, ThrowOnError>) => (options.client ?? client).get<GetSearchWidgetConfigResponses, GetSearchWidgetConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/search',\n ...options\n});\n\n/**\n * Update search widget configuration\n */\nexport const updateSearchWidgetConfig = <ThrowOnError extends boolean = false>(options: Options<UpdateSearchWidgetConfigData, ThrowOnError>) => (options.client ?? client).post<UpdateSearchWidgetConfigResponses, UpdateSearchWidgetConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/search',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List custom domains\n */\nexport const listCustomDomains = <ThrowOnError extends boolean = false>(options: Options<ListCustomDomainsData, ThrowOnError>) => (options.client ?? client).get<ListCustomDomainsResponses, ListCustomDomainsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain',\n ...options\n});\n\n/**\n * Create a custom domain\n *\n * Register a custom domain (MCP server, API endpoints) for AI chat integration.\n */\nexport const createCustomDomain = <ThrowOnError extends boolean = false>(options: Options<CreateCustomDomainData, ThrowOnError>) => (options.client ?? client).post<CreateCustomDomainResponses, CreateCustomDomainErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Delete a custom domain\n *\n * Remove a custom domain configuration from the workspace.\n */\nexport const deleteCustomDomain = <ThrowOnError extends boolean = false>(options: Options<DeleteCustomDomainData, ThrowOnError>) => (options.client ?? client).delete<DeleteCustomDomainResponses, DeleteCustomDomainErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/{domainId}',\n ...options\n});\n\n/**\n * Update a custom domain\n */\nexport const updateCustomDomain = <ThrowOnError extends boolean = false>(options: Options<UpdateCustomDomainData, ThrowOnError>) => (options.client ?? client).put<UpdateCustomDomainResponses, UpdateCustomDomainErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/{domainId}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get error counts across all domains\n */\nexport const getDomainErrorSummary = <ThrowOnError extends boolean = false>(options: Options<GetDomainErrorSummaryData, ThrowOnError>) => (options.client ?? client).get<GetDomainErrorSummaryResponses, GetDomainErrorSummaryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/error-summary',\n ...options\n});\n\n/**\n * Clear error logs for a domain\n */\nexport const clearDomainErrors = <ThrowOnError extends boolean = false>(options: Options<ClearDomainErrorsData, ThrowOnError>) => (options.client ?? client).delete<ClearDomainErrorsResponses, ClearDomainErrorsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/{domainId}/errors',\n ...options\n});\n\n/**\n * Get error logs for a domain\n */\nexport const getDomainErrors = <ThrowOnError extends boolean = false>(options: Options<GetDomainErrorsData, ThrowOnError>) => (options.client ?? client).get<GetDomainErrorsResponses, GetDomainErrorsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/{domainId}/errors',\n ...options\n});\n\n/**\n * Validate a custom domain configuration\n */\nexport const validateCustomDomain = <ThrowOnError extends boolean = false>(options: Options<ValidateCustomDomainData, ThrowOnError>) => (options.client ?? client).post<ValidateCustomDomainResponses, ValidateCustomDomainErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/validate',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Test domain classification with sample queries\n */\nexport const testDomainConnection = <ThrowOnError extends boolean = false>(options: Options<TestDomainConnectionData, ThrowOnError>) => (options.client ?? client).post<TestDomainConnectionResponses, TestDomainConnectionErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/test-connection',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get workspace details\n *\n * Return the full configuration for a workspace: platform, domain, crawl config, widget settings, chat persona, live-agent handoff, custom domains, and document counts. Preferred read for agent bootstrap because it returns every knob in one call.\n */\nexport const getWorkspaceDetails = <ThrowOnError extends boolean = false>(options: Options<GetWorkspaceDetailsData, ThrowOnError>) => (options.client ?? client).get<GetWorkspaceDetailsResponses, GetWorkspaceDetailsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/details',\n ...options\n});\n\n/**\n * Discover available tools from MCP servers\n */\nexport const discoverTools = <ThrowOnError extends boolean = false>(options: Options<DiscoverToolsData, ThrowOnError>) => (options.client ?? client).post<DiscoverToolsResponses, DiscoverToolsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/discover-tools',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * AI-generate a custom domain configuration\n */\nexport const generateDomainConfig = <ThrowOnError extends boolean = false>(options: Options<GenerateDomainConfigData, ThrowOnError>) => (options.client ?? client).post<GenerateDomainConfigResponses, GenerateDomainConfigErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/custom-domain/generate',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get available domain templates\n */\nexport const getDomainTemplates = <ThrowOnError extends boolean = false>(options: Options<GetDomainTemplatesData, ThrowOnError>) => (options.client ?? client).get<GetDomainTemplatesResponses, GetDomainTemplatesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/{workspaceId}/templates',\n ...options\n});\n\n/**\n * Deprovision a tenant or workspace\n *\n * Tear down a tenant or single workspace. Supports two auth modes: admin (set tenantId in the body to deprovision any tenant) or tenant self-deprovision (authenticate with the tenant API key; tenantId is derived from the auth context). Used by the Shopify app on app uninstall.\n */\nexport const deprovision = <ThrowOnError extends boolean = false>(options?: Options<DeprovisionData, ThrowOnError>) => (options?.client ?? client).post<DeprovisionResponses, DeprovisionErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/deprovision',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List API keys\n *\n * List all API keys for the authenticated tenant.\n */\nexport const listApiKeys = <ThrowOnError extends boolean = false>(options?: Options<ListApiKeysData, ThrowOnError>) => (options?.client ?? client).get<ListApiKeysResponses, ListApiKeysErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/keys',\n ...options\n});\n\n/**\n * Create an API key\n *\n * Create a new API key for the authenticated tenant.\n */\nexport const createApiKey = <ThrowOnError extends boolean = false>(options?: Options<CreateApiKeyData, ThrowOnError>) => (options?.client ?? client).post<CreateApiKeyResponses, CreateApiKeyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/keys',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Revoke an API key\n *\n * Revoke an API key by ID.\n */\nexport const revokeApiKey = <ThrowOnError extends boolean = false>(options: Options<RevokeApiKeyData, ThrowOnError>) => (options.client ?? client).post<RevokeApiKeyResponses, RevokeApiKeyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/keys/{keyId}/revoke',\n ...options\n});\n\n/**\n * Rotate an API key\n *\n * Rotate an API key, generating a new key and revoking the old one.\n */\nexport const rotateApiKey = <ThrowOnError extends boolean = false>(options: Options<RotateApiKeyData, ThrowOnError>) => (options.client ?? client).post<RotateApiKeyResponses, RotateApiKeyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/keys/{keyId}/rotate',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Provision a Shopify tenant\n *\n * Called by the Savanto Shopify app after a merchant completes OAuth. Creates a new tenant + workspace, or reactivates and reissues keys if the shop was previously installed.\n */\nexport const provisionShopify = <ThrowOnError extends boolean = false>(options?: Options<ProvisionShopifyData, ThrowOnError>) => (options?.client ?? client).post<ProvisionShopifyResponses, ProvisionShopifyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/provision/shopify',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Delete a tenant and all associated data\n */\nexport const adminDeleteTenant = <ThrowOnError extends boolean = false>(options: Options<AdminDeleteTenantData, ThrowOnError>) => (options.client ?? client).delete<AdminDeleteTenantResponses, AdminDeleteTenantErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}',\n ...options\n});\n\n/**\n * Get tenant details\n */\nexport const adminGetTenant = <ThrowOnError extends boolean = false>(options: Options<AdminGetTenantData, ThrowOnError>) => (options.client ?? client).get<AdminGetTenantResponses, AdminGetTenantErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}',\n ...options\n});\n\n/**\n * Find unclaimed tenants by email\n */\nexport const adminFindByEmail = <ThrowOnError extends boolean = false>(options: Options<AdminFindByEmailData, ThrowOnError>) => (options.client ?? client).get<AdminFindByEmailResponses, AdminFindByEmailErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/by-email/{email}',\n ...options\n});\n\n/**\n * Find tenants by owner ID\n */\nexport const adminFindByOwner = <ThrowOnError extends boolean = false>(options: Options<AdminFindByOwnerData, ThrowOnError>) => (options.client ?? client).get<AdminFindByOwnerResponses, AdminFindByOwnerErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/by-owner/{ownerId}',\n ...options\n});\n\n/**\n * Claim an unclaimed tenant\n */\nexport const adminClaimTenant = <ThrowOnError extends boolean = false>(options: Options<AdminClaimTenantData, ThrowOnError>) => (options.client ?? client).post<AdminClaimTenantResponses, AdminClaimTenantErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/claim',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Update a tenant's owner email\n */\nexport const adminUpdateOwnerEmail = <ThrowOnError extends boolean = false>(options: Options<AdminUpdateOwnerEmailData, ThrowOnError>) => (options.client ?? client).patch<AdminUpdateOwnerEmailResponses, AdminUpdateOwnerEmailErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/owner-email',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Update a tenant's subscription\n */\nexport const adminUpdateSubscription = <ThrowOnError extends boolean = false>(options: Options<AdminUpdateSubscriptionData, ThrowOnError>) => (options.client ?? client).patch<AdminUpdateSubscriptionResponses, AdminUpdateSubscriptionErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/subscription',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Reactivate a soft-deleted tenant\n */\nexport const adminReactivateTenant = <ThrowOnError extends boolean = false>(options: Options<AdminReactivateTenantData, ThrowOnError>) => (options.client ?? client).post<AdminReactivateTenantResponses, AdminReactivateTenantErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/reactivate',\n ...options\n});\n\n/**\n * Get detailed usage for a tenant\n */\nexport const adminGetUsage = <ThrowOnError extends boolean = false>(options: Options<AdminGetUsageData, ThrowOnError>) => (options.client ?? client).get<AdminGetUsageResponses, AdminGetUsageErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/usage',\n ...options\n});\n\n/**\n * Set usage metric values\n */\nexport const adminUpdateUsage = <ThrowOnError extends boolean = false>(options: Options<AdminUpdateUsageData, ThrowOnError>) => (options.client ?? client).patch<AdminUpdateUsageResponses, AdminUpdateUsageErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/usage',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Update a tenant's tier\n */\nexport const adminUpdateTier = <ThrowOnError extends boolean = false>(options: Options<AdminUpdateTierData, ThrowOnError>) => (options.client ?? client).patch<AdminUpdateTierResponses, AdminUpdateTierErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/tier',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Reset a tenant's crawl records for the current month\n */\nexport const adminResetCrawls = <ThrowOnError extends boolean = false>(options: Options<AdminResetCrawlsData, ThrowOnError>) => (options.client ?? client).post<AdminResetCrawlsResponses, AdminResetCrawlsErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/admin/tenant/{tenantId}/crawls/reset',\n ...options\n});\n\n/**\n * Redact a customer across all stored PII\n *\n * Hard-deletes every thread document and memory document within the caller tenant that matches the supplied customer identifiers. Runs as async OpenSearch tasks; the response contains task IDs for reconciliation. Idempotent when `caller.externalId` is supplied.\n */\nexport const complianceCustomerRedact = <ThrowOnError extends boolean = false>(options?: Options<ComplianceCustomerRedactData, ThrowOnError>) => (options?.client ?? client).post<ComplianceCustomerRedactResponses, ComplianceCustomerRedactErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/compliance/customer-redact',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Record a customer data-export request\n *\n * Queues a customer data-export request and notifies ops to fulfill it within Shopify's 30-day SLA. Idempotent when `caller.externalId` is supplied.\n */\nexport const complianceCustomerDataRequest = <ThrowOnError extends boolean = false>(options?: Options<ComplianceCustomerDataRequestData, ThrowOnError>) => (options?.client ?? client).post<ComplianceCustomerDataRequestResponses, ComplianceCustomerDataRequestErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/compliance/customer-data-request',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n","/**\n * Convert a URL or domain to a normalized workspace ID.\n *\n * @example\n * workspaceIdFromUrl('https://mystore.com') // 'mystore-com'\n * workspaceIdFromUrl('my-store.myshopify.com') // 'my-store-myshopify-com'\n * workspaceIdFromUrl('example.com/path') // 'example-com'\n */\nexport function workspaceIdFromUrl(url: string): string {\n if (!url) return '';\n\n try {\n const parsed = new URL(url.startsWith('http') ? url : `https://${url}`);\n return parsed.hostname.replace(/\\./g, '-').toLowerCase();\n } catch {\n return url\n .replace(/^https?:\\/\\//, '')\n .replace(/\\/.*$/, '')\n .replace(/[^a-z0-9-]/gi, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase();\n }\n}\n"],"mappings":"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"}
|